Saltar al contenido
Callandor

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:

  1. El tipo, que dice qué lo dispara. Por ejemplo greet_prog salta cuando alguien entra en la habitación del mob, y speech_prog, cuando alguien dice algo.
  2. 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...
  3. 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».

  1. Crea el prog. Escribe mpedit crear 26400. Si el mob ya tiene progs, el mud avisa de que ya tiene: entonces usa mpedit 26400 y, dentro del editor, añadir. Para editar un prog en concreto, mpedit 26400 <número>.

  2. Elige el tipo. Dentro del editor, escribe el nombre del tipo tal cual: speech_prog. Con ? mobprogs salen todos.

  3. Pon el argumento. trigger hola fija las palabras que lo disparan.

  4. Escribe el código. program abre el editor de texto. Escribe las órdenes, una por línea, y termina con /g:

    decir Buenas, viajero.
    emo hace una pequeña reverencia.
    
  5. Sal con hecho y guarda el área con asave 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 un mpwait.
  • Ver a quien lo dispara, con algunas excepciones. all_greet_prog y speech_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:

  • 100 no es del todo seguro: salta el 99 % de las veces. Es el valor más usado en las áreas.
  • 0 no 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, exit y mpsleep.

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 +mobprogs y 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_prog y un all_greet_prog a la vez.
  • El prog no hace nada tras un if. Falta un endif, o hay más else de 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.