19/04/02
- Bueno, actualizo para comentaros un poco como ha sido esta semana en la
construcción del motor. Actualmente, ya tengo todos eventos funcionando salvo los
idle (los eventos idle son aquellos que se ejecutan de forma automática cada
cierto tiempo) de las entidades y del universo de juego. Todo lo que he probado funciona correctamente salvo un pequeño
bug que aún no he solucionado y que como parece que no me va a molestar mucho,
dejaré para un poco más adelante. Lo que sí es cierto, es que he tenido que realizar
unos cuantos ajustes sobre el diseño original de algunos eventos script (que ya comentaré
en otra actualización).
- Para que os hagáis una idea de lo que ya se puede hacer, si habéis probado
la última beta de Crisol, ya es posible hacer cosas como que cuando el jugador
manipule la estátua con luz, ésta se apague si está encendida y se encienda si está
apagada. ¿Cómo se haría esto?. Muy sencillo, en primer lugar asociariamos un script
al evento OnManipulate de ese objeto de escenario. Para asociar los scripts a los eventos, se deberá
de acudir al perfil donde definimos la estatua (en la actual versión de CrisolBuilder
esto no es posible pues dicha versión aún no está preparada para trabajar con scripts) e
indicar que para ese evento queremos asociar un archivo script (en el ejemplo lo hemos
llamado "Script_OnManipulate_Statue.cst").
Al asociar el script al evento de manipular permitiremos tal acción cuando
se quiera interactuar con la estatua. Dentro del juego, si el
motor detecta que el jugador (o cualquier npc) desea manipular la estatua lanzará el script que
asociamos a tal evento.
A continuación os muestro un posible código fuente que haría falta
programar para hacer que la estatua se apague si está encendida o se encienda si está
apagada cuando el jugador manipule sobre ella (lo mejor de todo es que esto ya es posible,
está probado y... ¡funciona! :):
////////////////////////////////////////////////////////////////////////////
// Fichero:
// Script_OnManipulate_Statue.cst
//
// Notas:
// - Script asociado al evento OnManipulate para la estatua de luz. Cuando
// se produzca el evento de manipular, este script sera llamado pasandose
// en el argumento TheEntity la entidad manipulada (la estatua) y en
// TheCriature la criatura que la manipula (el jugador o cualquier otro
// npc al que se le ordene que realice esa accion).
////////////////////////////////////////////////////////////////////////////
script OnManipulateEntity(entity TheEntity,
entity TheCriature)
begin
// ¿La estatua tiene luz asociada?
if (TheEntity.GetLight() != 0) then begin
// Si, se quita
TheEntity.SetLight(0);
end else begin
// No, se establece luz maxima
TheEntity.SetLight(255);
end
end
- Lo que haré a partir de mañana y la siguiente semana, será terminar de
codificar todas las instrucciones de código intermedio. Actualmente están las
que podríamos considerar como las simples, esto es, aquellas que se procesan
y ejecutan directamente. Las complicadas son aquellas que cuando se procesen
deberán de detener el script en ejecución, esperar que se ejecute la instrucción
que representa y regresar al script. Tengo la forma de resolver estos problemas
ya escrito en borrador, pero mañana tendre que repasar todo.
13/04/02
- Ya tengo la base de la máquina virtual programada y fucionando, de hecho ¡ya he hecho funcionar un script!. Para ir haciendo pruebas
estoy asociando al evento de la pulsación del panel horario un script, de tal forma que rápidamente pueda comprobar cómo de bien analiza
el código intermedio (generado en el compilador) la máquina virtual. Las buenas noticias es que después de corregir múltiples errores en
el compilador (la versión 0.6, que es la que se halla en web, tiene bastantes problemas internos ya corregidos) y en el primer diseño de la
máquina virtual, he hecho funcionar un script con uso de funciones, llamadas al API del motor, llamadas recursivas, bucles y paso de variables por referencia. En definitiva,
que he estado mostrando texto a la consola de juego pero usando las técnicas anteriores. Aunque esto pueda parecer una tonteria es realmente genial ver como habiendo programado
un archivo script y habiendo asociado a un evento... ¡pasa algo! :).
En fin, ahora sí que aparece la sensación de estar en la recta final,
aún así queda un camino nada trivial hasta el final, pues está pendiente diseñar unas cuantas interfaces para hacer que haya una buena y elegante
comunicación entre los scripts y el resto del código, hacer que los scripts esperen desde una porción de código hasta que se complete
una acción, etc. Todos estos problemas ya los tengo "resueltos" sobre papel y será en lo que a partir de mañana mismo ocupe mi tiempo.
- Aprovecho para colgar una nueva captura. Gracias a Manuel Moreno "Dracke" y Marcelo Galán "Sbe-Caos" estoy pudiendo trabajar con bastante
motivación desde el punto de vista gráfico, ya que ellos están realizando un trabajo genial y altruista realizando los gráficos de apoyo para Crisol. En la última semana Marcelo ha realizado
dos renders excelentes para el fondo de la creación de personaje y para la pantalla de inventario del jugador. Hoy por la tarde he
aprovechado para "relajar" y he integrado uno de esos renders, en concreto el relativo a la creación del personaje, cambiando el
diseño de esa pantalla (esto lo podéis hacer vosotros con sólo consultar la documentación de CrisolBuilder). Además le he
añadido las animaciones estáticas que ya he utilizado para los créditos. ¡Mil gracias Marcelo, Manu :)!.
 |
Nuevo diseño para la creación del jugador |
5/04/02
- Al fin subo la versión íntegra del compilador. Ya tengo construidos todos los pasos que llevan hasta la generación del archivo
de código intermedio que será usado en la máquina virtual (pendiente de programar). De todas formas, no estoy seguro de que el compilador
esté libre de bugs, probablemente tenga unos cuantos ya que no he podido probar
todas las situaciones ni todas las llamadas a funciones internas. La versión que ofrezco está creada en modo debug (la versión que ofrezca cuando esté seguro de que no hay errores, ocupará menos tamaño y será más rápida).
La documentación a penas ha sufrido variaciones, simplemente he añadido un pequeño apartado al final sobre el uso del compilador (lo he llamado CSCompiler de CrisolScript Compiler) y
he organizado un poquito el texto que ya había. En la sección de descarga podéis encontrar la última versión, la 0.6, del compilador.
1/04/02
- He decidido ponerme a diseñar por mi cuenta lo que es la última parte del compilador (emisión del código en formato binario) y la
creación de la máquina virtual. Ya tengo el borrador de lo que será todo el modulo CScriptingEngine (la máquina virtual) y
la forma en la que organizaré la ejecución de las instrucciones, los stack frames de cada proceso, etc. En otras palabras, que esta
tarde comenzaré a trastear de nuevo con el compilador. Para guiarme en esta última parte, he estado buscando información general
de cómo funciona la máquina virtual de Java (por cierto, os recomiendo todos
los artículos "Under the Hood" de esa web) y también me ha servido de gran ayuda un pequeño capítulo del libro sobre construcción
de compiladores que compré hace tiempo: "Writing Compilers and Interpreters", en donde explica un modelo de stack frame que yo he
encontrado muy útil y, por lo que he podido averiguar, viene a ser muy parecido al usado en la máquina virtual de Java. Cuando hablo de
stack frame, me refiero a la forma en la que al llamar a una función dentro de lo que es la ejecución de código intermedio, se
prepara una estructura de datos de tipo pila para saber quien ha llamado a esa función, alojar sus variables y constantes locales,
y reservar espacio para las operaciones que se ejecuten a través del código intermedio. Todo esto a grandes rasgos, claro.
Si os estáis preguntando cómo es que teniendo este libro he necesitado acudir al tutorial de pxdscript, os diré que
aunque el libro resulta muy interesante en general, desarrolla código intermedio para ejecutarse en una arquitectura Intel 8086 y eso supone
que en lugar de trabajar con una máquina virtual de pila, lo hace con registros, con la consiguiente complejidad que no me interesa en absoluto para
un proyecto como este. Por otro lado, el libro cojea un poco exponiendo los pasos que se siguen para implementar el compilador pues recurre mucho al viejo truco de listar hojas y hojas
de código fuente en C++ (el cual, por cierto, no me acaba de gustar, pero esto ya son opiniones personales). De todas formas, hay numerosas
partes del libro que son sumamente interesantes y como ya he comentado, una de ellas me ha servido para inspirarme en el modelo de
stack frame que voy a utilizar en la máquina virtual de CrisolScript.
- Hoy mismo he encargado el libro "AI Game Programming Wisdom" sobre temas de inteligencia artificial, scripting (en el índice vienen
articulos bastante prometedores) y demás temas relacionados con lo que es la programacion lógica en un juego. El libro está orientado según
los cánones de los Game Programming Gems (de hecho, esta editado por la misma casa). En fin, tan pronto lo reciba y revise os comentaré qué
tal está. Si hay alguien interesado en adquirirlo, le sugiero que se pase por Barnes & Noble porque sale considerablemente más asequible
en precio que en Amazon.
- El jueves pasado envié un email a Flipcode proponiendo a Crisol participar en la sección "Image of the Day" de esta conocida web de programación.
Supongo que tardará aún unos días (suponiendo que sea seleccionado, que yo espero que sí) porque la cola de proyectos que deben de tener ha
de ser más que considerable. En fin, espero que sirva para popularizar un poco más el motor y haya gente que se decida a darle soporte una
vez que el código fuente sea liberado o bien que se anime a construir herramientas gráficas que lo único que tendrían que hacer sería
ofrecer un interfaz visual, pues el verdadero trabajo de estas ya está programado mediante herramientas que he creado pero que funcionan en línea
de comandos.
- Por último, la página parece que funciona a ratos porque en tripod están de mantenimiento y desconectan los servidores
sin avisar (eso sin contar lo que me hicieron borrando la web entera y deshabilitándome la cuenta). Espero que se solucione pronto o al menos tengan la consideración de avisar porque la verdad es que
fastidia bastante.