Progs
Un prog es un pequeño programa que se ejecuta cuando pasa algo. Es lo que hace hablar a un mob, cerrarle el paso a alguien o abrir una puerta secreta.
Un prog es una lista de órdenes que un mob (o, menos veces, un objeto) ejecuta cuando ocurre algo: alguien entra, alguien habla, le dan un objeto, lo atacan, muere... Las áreas del mud tienen unos 3000. Esta página explica cómo se crean y cómo funcionan. Las listas completas de triggers, variables, condiciones y comandos están en la referencia de progs.
Las tres partes de un prog
Todo prog tiene tres cosas:
- El tipo, que dice qué lo dispara. Por ejemplo
greet_progsalta cuando alguien entra en la habitación del mob, yspeech_prog, cuando alguien dice algo. - El argumento, que afina cuándo salta. Su significado depende del tipo: un porcentaje de probabilidad, unas palabras que tienen que decirse, un vnum, una dirección...
- El código, que es la lista de órdenes que se ejecutan, una por línea.
Un mob puede tener varios progs, y se ven con mpstat <mob>.
Crear un prog paso a paso
Supón que quieres que el mob 26400 conteste cuando alguien diga «hola».
-
Crea el prog. Escribe
mpedit crear 26400. Si el mob ya tiene progs, el mud avisa de que ya tiene: entonces usampedit 26400y, dentro del editor,añadir. Para editar un prog en concreto,mpedit 26400 <número>. -
Elige el tipo. Dentro del editor, escribe el nombre del tipo tal cual:
speech_prog. Con? mobprogssalen todos. -
Pon el argumento.
trigger holafija las palabras que lo disparan. -
Escribe el código.
programabre el editor de texto. Escribe las órdenes, una por línea, y termina con/g:decir Buenas, viajero. emo hace una pequeña reverencia. -
Sal con
hechoy guarda el área conasave area.
Otros comandos del editor: mostrar enseña el prog, añadir crea otro más, borrar <número> o borrar todos los quita, y
copiar <vnum> sustituye todos los progs del mob por los de otro mob.
Probarlo
Los inmortales no activan los progs. Si entras en la habitación de un mob con greet_prog, no pasará nada. Para
probar, escribe config +mobprogs, y config -mobprogs cuando termines. Además, ningún mob ve a un inmortal
wizinvis, así que tienes que estar visible. Si no, sirve switch a un mob o probar con un personaje normal.
Cuándo salta un prog
Para que un mob ejecute un prog tiene que cumplir todo esto:
- Estar despierto, no estar peleando (salvo en los progs de combate) y no estar encantado.
- No ser un mob marcado como
inactivo, ni estar a la espera de unmpwait. - Ver a quien lo dispara, con algunas excepciones.
all_greet_progyspeech_prog, por ejemplo, solo exigen que estén en el mismo plano, es decir, en el mundo despierto o en el Tel'aran'rhiod, aunque no se vean.
Un mob no dispara sus propios progs, y el mud lo anota como error si lo intenta. Hay un tope de 20 progs encadenados
(un prog que provoca otro prog que provoca otro...), y cada prog admite hasta 20 if anidados.
El porcentaje
En los progs de tipo greet, all_greet, exit, all_exit, entry, fight, attack, death, portal y rand
el argumento es una probabilidad. Salta si un número al azar de 1 a 100 es menor que el argumento. Esto tiene dos consecuencias:
100no es del todo seguro: salta el 99 % de las veces. Es el valor más usado en las áreas.0no salta nunca.
Cuando un mob tiene dos progs del mismo tipo con porcentaje, solo se ejecuta el primero que salte. La excepción son los de
entrada y salida de habitación (greet, all_greet, exit y all_exit), donde se ejecutan todos los que salten. Los progs de
palabras (speech_prog y act_prog) se ejecutan todos los que coincidan.
El código de un prog
Cada línea es una orden. Puede ser:
- Cualquier comando que un mob pueda usar:
decir,emo,gritar,dar,matar... Es lo más habitual. - Un comando de prog, los que empiezan por
mp:mpecho,mpechoat,mpoload,mptransfer,mpdamage... Solo los pueden usar los mobs desde un prog. Están en la referencia. - Una estructura de control:
if,ifnot,or,else,endif,exitympsleep.
En el texto de las órdenes se pueden usar variables, que se sustituyen en el momento: $n es quien ha disparado el prog,
$i el propio mob. Por ejemplo, decir Hola, $n. dice «Hola, Aldaer.». La lista de variables está en la
referencia.
Condiciones
if isnpc($n)
mpnothing
exit
endif
if evalúa una condición y ejecuta lo que sigue hasta else o endif si es cierta. ifnot lo contrario. Una
línea or añade otra condición alternativa al if anterior: basta con que se cumpla una de las dos. Las condiciones
tienen la forma nombre(argumento) y, en las numéricas, un operador y un valor: level($n) >= 10. Los operadores son
==, !=, >, <, >= y <=. Se pueden anidar hasta 20 niveles.
La lista de condiciones está en la referencia.
exit
exit (o break) termina el prog en ese punto. Se usa mucho para descartar casos pronto: si quien dispara el prog es un mob,
no hacer nada y salir.
mpsleep: esperas
decir Un momento...
mpsleep 10
decir Ya está.
mpsleep <número> pausa el prog y lo reanuda después. El número son pulsos del mud, y cada pulso dura una quinta parte
de segundo, así que mpsleep 10 espera unos dos segundos. Sin número espera 4 pulsos. Mientras duerme, el prog
recuerda quién lo disparó y en qué if estaba. Si el mob muere, el prog se descarta.
mpwait: pausas largas
mpwait <número> <tiempo> [jugador] hace que, durante el tiempo indicado, no salte ningún otro prog del mob. Al terminar, se
dispara el wait_prog cuyo argumento sea ese número. Sirve para escenas largas con varios pasos. Si se indica un
jugador que siga en la habitación, es el que figura como $n en ese wait_prog.
Ejemplos reales
Sacados de las áreas del mud.
Impedir una salida: leave_prog
En el área islaband, un guardia impide el paso hacia la dirección 1 (este). El argumento es la dirección.
Tipo: leave_prog Argumento: 1
decir A donde te crees que vas?
emote te pone cara de disgusto.
decir Ahi no se puede entrar sin permiso y TU no lo tienes
decir Vuelve por donde has venido si no quieres meterte en problemas
emote taconea impacientemente.
Cuando un leave_prog salta, el personaje no llega a moverse. Si el prog tiene que dejarlo pasar, lo mueve él con
mpforce $n <dirección>, como se ve en el leave_prog 2 de costasom.
Abrir una puerta secreta: speech_prog
En staband, decir «avendesora» abre una puerta. El p del principio significa que se busca la frase entera, no las
palabras sueltas.
Tipo: speech_prog Argumento: p avendesora
mpecho {DLentamente, con un sordo estruendo, se abre una puerta de piedra.{x
mpecho {DTras la nube de polvo levantada, ves una nueva salida al este.{x
desb este
abrir este
Recompensar un objeto: give_prog
En dosrios, el mob agradece un cuadro y paga. El argumento es el nombre del objeto que se le da, escrito igual que en su campo nombre.
Tipo: give_prog Argumento: cuadro dibujo familia thane
Decir Oh! Has recuperado mi cuadro!
Decir Te estoy muy agradecido, toma esto como muestra
Decir de mi gratitud. Que la Luz te bendiga!
Mpset oro 10
Dar 1 penique-plata $n
Dar un objeto con condiciones: speech_prog
En aso_tbl, una asociación entrega un chal a quien lo pide, si es de su asociación y tiene rango suficiente:
Tipo: speech_prog Argumento: p dadme un chal gris
if isnaso($n) == 960
mpnothing
exit
endif
if isrank($n) >= 5
mpoload 1447
dar chal $n
endif
Misiones de mundo: death_prog
En septiar, al morir el mob, si el jugador había empezado cierto encargo, se le avisa y se anota el paso:
Tipo: death_prog Argumento: 100
mpheal $i
if wq_iniciado($n) portal
mpechoat $n {GHas cumplido con el encargo de la Sabia Melaine!{x
mpwquest $n paso1 portal
endif
Reaccionar a un comando: comando_prog
En shayol, quien escribe hundir con este prog a la vista pierde la espada. El argumento es la palabra del comando que se
vigila, y #0 es todo lo que el jugador escribió detrás.
Tipo: comando_prog Argumento: hundir
if sin_texto(#0)
mpechoat $n ¿Hundir qué?
exit
endif
mpechoaround $n $n hunde la espada en las aguas, que tras un siseo la hace desaparecer.
mpechoat $n Hundes la espada en las aguas y la ves desaparecer con un siseo.
mpmangar $n 1712
mpjunk espada
Los comando_prog se ejecutan después de que el personaje haya hecho su comando. Con sub_com_prog el prog
sustituye al comando: el comando normal no se llega a ejecutar. Por eso el siguiente ejemplo, de
terrighealdan, vuelve a lanzar el mirar normal con mpforce cuando no es lo que le interesa:
Tipo: sub_com_prog Argumento: mirar
If sin_texto(#0)
Mpforce $n mirar
Exit
Endif
Ifnot prefijo(#1) CUCHILLO
Mpforce $n mirar #0
Exit
Endif
If comparar(#1) CUCHILLO
Mpechoat $n Puedes ver frente a ti una de tantas armas del campamento.
Exit
Endif
Progs de objetos
Los objetos también tienen progs, y se editan con opedit igual que mpedit. Pero los objetos solo reaccionan a comandos:
funcionan comando_prog y sub_com_prog, tanto si el objeto está en la habitación como si lo lleva el jugador. Cuando salta
uno, el mud crea un mob temporal con la descripción del objeto que ejecuta las órdenes y desaparece al terminar. Dentro del
prog, $I es la descripción corta del objeto.
Errores comunes
- No salta nada. Revisa que estés con
config +mobprogsy visible, que el mob esté despierto, que el tipo sea el que crees y que el porcentaje no sea 0. - Salta dos veces. Hay dos progs del mismo tipo y los dos cumplen la condición, o el mob tiene un
greet_progy unall_greet_proga la vez. - El prog no hace nada tras un
if. Falta unendif, o hay máselsede los que toca. El mud lo avisa en su registro de errores y aborta el prog. - Un mob se dispara a sí mismo. Un prog no puede reaccionar a sus propias órdenes, y el mud lo anota como error.
- Un cambio de prog se pierde. Como todo lo del OLC, vive en memoria hasta que guardas con
asave.