Estado de LumiMUD

0 comentarios

Actualmente LumiMUD tiene implementados en su código:

Servidor de Telnet: acepta múltiples conexiones simultáneas, colores, y caracteres españoles como la ñ y las tildes (incluso los signos ¿ e ¡, casi nunca usados antes en MUDs, creo).

Módulo de gestión de conexiones: fusionado con el anterior módulo recepcionista, inicia el registro o la recepción de los clientes, atiende los comandos entrantes y expulsa a los jugadores inactivos.

Base de datos: al final después de probar varias, me he quedado con SQLite por razones prácticas. He usado una base de datos en vez de almacenamiento directo porque, aunque es mas lento, facilita tareas como la de exponer datos en la web y actualizar en tiempo real las entidades del MUD (rooms, jugadores, movs...todo lo que no es código, vamos)

Módulo adaptador para la base de datos: Gestiona el almacenamiento en la base de datos y hace de intermediario para las consultas SQL que sean necesarias desde el código (no era obligatorio, pero necesario para simplificar al máximo los futuros cambios).

Módulo reload: Permite recargar el código de manera automática y sin tener que desconectar a nadie (hasta la fecha sin problemas).

Módulo logger: en vez de imprimir por terminal las advertencias y errores, este módulo registra el nivel (debug, información, advertencia, error o error crítico) y el módulo donde se produce y lo imprime por pantalla. Además si es un error, añade a un archivo log con la fecha actual y los últimos mensajes para poder seguir el rastro a los posibles bugs que sucedan en el futuro.

Módulo comandos: con submódulos para cada categoría de comandos (generales, salidas, ayuda, de administrador...) y un analizador que recibe un string y extrapola el comando y los argumentos e intenta ejecutar el apropiado.

Novedades LumiMUD

0 comentarios

Un nuevo cambio, he añadido un módulo logger que se encarga de llevar cuenta de los avisos según niveles.

En vez de imprimir por terminal las advertencias y errores, este módulo registra el nivel (debug, informacion, advertencia,error o error crítico) y el módulo donde se produce y lo imprime por pantalla. además si es un error, añade a un archivo log con la fecha actual y los últimos mensajes para poder seguir el rastro a los posibles bugs que sucedan en el futuro.

Así puedes configurar que nivel de advertencias se muestran por pantalla al arrancar el MUD (los print siempre aparecían) con cambiar una simple variable. Poner el modo debug para tener toda la información rastreando un error, poner el modo info para tener solo notificaciones o errores, o incluso poner el modo en errores con lo que no se imprime nada por pantalla que no sea un error.

Mucho mejor que llenar el código con prints, y el volcado de un buffer en un archivo vendrá de perlas en el futuro.

Novedades LumiMUD

0 comentarios

Lo prometido es deuda, aquí tenéis la primera entrada sobre los avances en el LumiMUD.

He rehecho la mitad del código, pero por motivos prácticos. La parte mala de tener tanta creatividad aparece cuando has programado bastante y, de repente, se te ocurre una manera mejor. Sé que la norma es "no optimices el código hasta que lo hayas terminado, a veces, ni siquiera entonces", pero en un MUD creo que los cambios y añadidos son parte de la vida útil del código y cualquier cosa que los simplifique en un futuro debe estar en las bases del código.

El código sigue basándose en entidades, pero ahora se gestionan con clases. Lo que hace mucho mas sencillo su uso en otras partes del código como en los comandos.
El acceso a la base de datos ahora es mixto, lo que me permite cambiar varios parámetros en una sola instrucción y consulta.

En vez de establecer la fuerza y la destreza de un personaje a 10 (pongamos a zaroos como ejemplo) con:

Personaje('zaroos').fuerza = 10
Personaje('zaroos').destreza = 10

Ahora se puede hacer:

Personaje('zaroos'). Establecer({fuerza : 10, destreza : 10})
o
Personaje('zaroos'). Establecer(todos_los_nuevos_valores_que_quieras)

Esto que parece una trivialidad, permite cargar diccionarios enteros de modificaciones en una sola línea de código, o utilizar un diccionario de un solo elemento para hacer lo mismo que con los comandos anteriores.

Ademas, ahora el código carga los cambios de la base de datos al arrancar el MUD, así que si el día de mañana se añade o cambia una habilidad o atributo a la base de datos, el MUD la carga sin cambiar código y puedes usarla directamente en los comandos sin problema.

Con esto doy por finalizado por el momento los módulos de la Base de datos y del servidor de Telnet.

Actualización

0 comentarios

Comencé este blog como alternativa mas accesible que el foro anterior. Nunca he sido blogger, y no he actualizado este tanto como debería.

Intentaré escribir más a menudo para aquellos interesados, aunque no seáis muchos.

Cambiando de tema...he vuelto a CallandorMUD, como muchos de vosotros ya habréis notado. Esta vez soy un bardo, por motivos prácticos -para mapear- aunque, según mis amigos, es la clase que mas me pega en la vida real. Intentaré actualizar el mapa y a Lumi proximamente.

En cuanto al LumiMUD, entre el trabajo, los estudios, la novia y los amigos... no me queda mucho tiempo para programar. Pero sigo dedicándole alguna hora suelta de vez en cuando.

Escribiré entradas sobre el progreso del LumiMUD etiquetadas y con titulo Novedades LumiMUD, para quien pueda interesar.

Servidor listo

3 comentarios

Lo normal al crear un MUD es coger alguno de base y hacerle las modificaciones pertinentes.

Pero como soy de la opinión de que es mejor empezar un lienzo nuevo que retocar la obra de otro, pues decidí escribir de 0 el MUD.
Me llevó un par de tardes tener un servidor de Telnet al que conectarse, y aunque solo valía para charlar, ya era algo.
La pega de escribir el código de 0 es que tienes bastante mas trabajo, la ventaja que puedes diseñar hasta el último detalle. Tengo cientos de ideas (la mayoría disparatadas) que voy implementando a medida que escribo.

Una semana después, ya tenía un pequeño ejemplo. Tiene un recepcionista creador de fichas, un par de rooms para probar el movimiento, se puede decir y charlar (probar canales), e incluso un Mov con sus propios comandos.

Como siempre en la programación, mi mayor problema hasta la fecha son los pequeños errores. Esas tildes y erratas que hacen que el programa no funcione y te quitan mucho tiempo buscando el error en algo que ya funcionaba.

Pero en fin, que voy programando en mis ratos libres -que no son muchos-.

Script para zMUD de tiradas de Callandor 2.0

0 comentarios

Como veo que hay quien tiene problemas con el script, pues saco una versión nueva:

(@Fue=18)AND(@Car>15)OR(@Total>95) serían las condiciones de una ficha buscada, para este ejemplo, Fuerza 18 y Carisma mayor de 15 o que todos los atributos sumen mas de 95.
Si quisierais por ejemplo, podríais poner solo (@Total>100) (@Fue=18)AND(@Des=15), cualquier combinación de las variables @Fue, @Des, @Int, @Sab, @Con, @Car y @Total (que es la suma de las seis anteriores) con los operadores AND (y) y OR (o).
Además, STAT, crea una barra de estado con un resumen de las tiradas. Si no la veis se tiene que activar en Ver -> Preferencias -> General -> ver barra de estado.

Hay dos maneras de poner el generador, una es copiando el texto del final de esta entrada y pegándolo tal cual en el zMud (a veces da problemas si se ponen retornos de carro interrumpiendo las lineas), la otra es bajando este archivo e importándolo desde la ventana de Opciones -> menú de archivo -> importar texto...

IMPORTANTE: Una vez "instalado" el generador, hay que escribir Nombre=elnombrequequieresparaelpersonaje y después Password=lacontraseñaparaelpersonaje en el zMud para que el script sepa que poner en esas preguntas.

Como novedad, he solventado el problema de que el zMud se autoreconecta solo 20 veces. Mucha gente se había quejado de esto. Lo he evitado con los alias atconnect y atdisconnect para que cuando no quiera autoreconectarse espere 10 segundos y siga haciendo su trabajo.

#VAR Nombre sinnombre
#VAR Password sinpassword
#TRIGGER {%sFuerza%s(%d)%sDestreza%s(%d)%sConstitución%s(%d)} {#Var Fue %1;#Var Des %2;#Var Con %3}
#TRIGGER {%sInteligencia%s(%d)%sSabiduría%s(%d)%sCarisma%s(%d)} {#Var Int %1;#Var Sab %2;#Var Car %3;#MATH Total (@Fue+@Des+@Int+@Sab+@Con+@Car);#If ( (@Fue=18)AND(@Car>15)OR(@Total>95)) {N;#Beep} {S};#show Sumaron: @total (El record esta en: @Record);#Co 7;#If @Total>@Record {Record=@Total};#Add intentos 1;#Add sumadetotales @Total;#Math Media (@sumadetotales/@intentos)}
#TRIGGER {Con que nombre vas a ser conocido?} {@Nombre;S} {nocr|prompt}
#TRIGGER {Escribe el password que quieres para %x} {@Password;@Password}
#TRIGGER {Has agotado tus tiradas. Tu personaje se queda con los últimos atributos.} {#Di;#Con;#ADD Reconexiones 1;#SH @Reconexiones}
#TRIGGER {Felicidades! Estas preparado para empezar a jugar en el mundo real} {save}
#ALIAS atconnect {#DELCLASS "Reconectar"}
#ALIAS atdisconnect {#ALARM +10 {#CONNECT} "Reconectar"}
#STAT {Record: @Record (Media: @Media) Fue:@Fue Des:@Des Con:@Con Int:@Int Sab:@Sab Car:@Car}