@ agnasg

psyblast event system

28-04-2017 11:43 AM

Me he acordado mucho de este artículo sobre un viejo bug en Eve, porque tiene que ver con un bug en el sistema de eventos de Eve. Un evento que se quedaba dormido sin que nadie pudiera descubrir la razón. psyblast tiene un sistema de eventos similar, y casi el 99%  del comportamiento de los npcs está programado utilizando eventos. Casi todos los patterns conocidos están implementado de alguna u otra forma, y ya no puedo decir cómo funcionan muchos de los eventos, si como un observador, un notificador, un tasklet especializado, usando workqueues, etc. No tengo idea.

Básicamente en el caso más genérico el sistema de scripting dispara un evento que es interpretado por el módulo correspondiente. Cada rutina ejecuta su acción y dispara un evento para revisar los resultados o simplemente termina esperando que alguien se encargue de las consecuencias (hay un flag levantado por algún tiempo indicando que algo pasó, si a alguien le concierne deberá encargarse o ignorarlo)

Todo esto es controlado por un sistema de scripting asociado a cada npc, que puede ser modificado on the fly. Hasta ahora no se me ha presentado el caso de dos npcs con el mismo script pero supongo que es posible así que pienso implementar librerías de forma que se puede hacer una llamada a un script desde un script. Sic.

El sistema es realmente complicado y cualquier modificación requiere una o dos horas de estudio para entender cómo funciona y cómo modificarlo. Está bien documentado pero bastan un par de meses de abandono (es decir, si paso dos meses sin ver el código) para que se convierta en una caja negra incomprensible y llena de magia. No tengo idea por qué los npcs se comportan como lo hacen, y examinar el código resulta en más asombro: no entiendo cómo el código en las rutinas generan ese comportamiento. Los eventos son asincrónicos, se ejecutan en algún orden y en algún momento y terminan generando conductas inesperadas. Uno de los npcs tiene en este momento algo demasiado parecido a un tick nervioso cuando alguna combinación de rutinas idle se ejecutan (son las rutinas que se deben ejecutar aleatoriamente cuando el npc está sin hacer nada). No tengo idea de cómo quitarle ese tick, a pesar de que le he dedicado varias horas a lo largo de los últimos 6 meses.