2 Objetivos del sistema: - separar-centralizar en un módulo la responsabilidad del mecanismo de cambios en el mundo (y de sus requisitos), de modo que sea accesible desde todos los otros sistemas con una interfaz homogénea. - definir un mini-lenguaje de script que permita acceder a ese mecanismo desde los ficheros XML de definición del mundo. [Tipos de requisitos:] Cada requisito es un predicado booleano: se cumple o no. Clase "Requisito": - método: satisfecho() -> [si, no, indeterminado] - método: asumible() -> [si, no] (igual que satisfecho(), a menos que valga indeterminado. Entonces, toma el valor por defecto definido para esa instancia del requisito) El método "asumible" da siempre una respuesta booleana, a pesar de que el requisito pregunte por un atributo que no existe en el objeto. Subclases de requisito: PERSONAJE --------- - atributo cumple (expresión) [o: cumple (atributo, expresión)] - posee (objeto) - lleva puesto / usa (objeto) SALA ---- - cumple (atributo, expresión) - contiene (personaje) - contiene (objeto) OBJETO ------ - cumple (atributo, expresión) DIALOGO ------- - cumple (atributo, expresión) - participa (personaje) - alcanzado (hito) - estado cumple (offtopic | agotado | inexistente) [Tipos de sucesos:] Clase suceso: Produce una alteración en el objeto al que está asignado. - método: init(objeto de la clase para la que está preparado) - método: aplicar() Subclases de suceso: PERSONAJE --------- - atributo cambia (expresión) [o: cambia (atributo, expresión)] - recibe (objeto) - pierde (objeto) - movimiento/teletransporte (sala) - actúa (texto) - dice (texto[,idioma]) - oye (texto) SALA ---- - atributo cambia (expresión) - recibe (objeto) - pierde (objeto) - recibe (salida) - pierde (salida) - entorno (texto) OBJETO ------ - atributo cambia (expresión) - teletransporte (sala) - actúa (texto) DIALOGO ------- - atributo cambia (expresión) - activa (tema) - activa (hito) (?es lo mismo que crear un atributo?) - borra (hito) EVENTO ------ - crea evento (descripción) - activa (evento) [Lenguaje de scripting] Para especificar requisitos, hacer un tag que contenga una expresión cuasi-Python para acceder a los atributos. Es decir, se podrá acceder a los objetos Python mediante una expresión de la forma "objeto.atributo" y utilizar operadores con salida booleana para evaluar el requisito. El módulo de requisitos parseará y evaluará la expresión cuando haya que decidir si el requisito se cumple. El problema de este enfoque es decidir qué objetos son accesibles. Para eso se pueden hacer 2 cosas (no excluyentes): 1- El contexto del requisito (es decir en qué parte de qué fichero de descripción está) determina qué objeto es accedido por cada nombre de objeto. Por ejemplo, en una conversación "pj" se evalúa como el objeto Personaje del hablante, "pnj" como el objeto PersonajeNoJugador que contiene la conversación, "sala" como el objeto sala que contiene a los personajes. 2- Tener un pool de objetos-minë globales (tiempo, clima...), accesibles al scripting. Se puede incluso crear una interfaz para que cualquier objeto se pueda exportar a sí mismo y sea accesible desde el lenguaje.