134 |
|
|
135 |
# Métodos estáticos de la clase |
# Métodos estáticos de la clase |
136 |
|
|
137 |
def nuevo_xml(elem_requisito, macros): |
def nuevo_xml(elem_requisito, macros_tipos): |
138 |
"""Crea un requisito nuevo a partir de un nodo XML leido de un fichero de descripción. |
"""Crea un requisito nuevo a partir de un nodo XML leido de un fichero de descripción. |
139 |
|
|
140 |
Parámetros: |
Parámetros: |
141 |
elem_requisito: el nodo XML |
elem_requisito: el nodo XML |
142 |
macros ((string, string)[]): lista con los nombres y tipos de los macros permitidos en |
macros_tipos ((string, string)[]): lista con los nombres y tipos de los macros |
143 |
el contexto de este requisito. |
permitidos en el contexto de este requisito. |
144 |
|
|
145 |
Ejemplo -> requisito dentro de la accion "beber" del objeto "pocion01" |
Ejemplo -> requisito dentro de la accion "beber" del objeto "pocion01" |
146 |
|
|
147 |
elem_requisito: <requisito base="Personaje" nombre="atributo" atributo="sabiduria" |
elem_requisito: <requisito base="Personaje" nombre="atributo" atributo="sabiduria" |
148 |
id="$usuario" comparador=">" valor="10"> |
id="$usuario" comparador=">" valor="10"> |
149 |
macros: [("$usuario", "Personaje"), ("$sala", "Sala"), ("$objeto", "Objeto")] |
macros_tipos: [("$usuario", "Personaje"), ("$sala", "Sala"), ("$objeto", "Objeto")] |
150 |
|
|
151 |
Requiere: |
Requiere: |
152 |
elem_requisito != None |
elem_requisito != None |
153 |
macros != None |
macros_tipos != None |
154 |
""" |
""" |
155 |
req = Requisito() |
req = Requisito() |
156 |
req.__parsear_requisito(elem_requisito, macros) |
req.__parsear_requisito(elem_requisito, macros_tipos) |
157 |
return req |
return req |
158 |
|
|
159 |
nuevo_xml = staticmethod(nuevo_xml) |
nuevo_xml = staticmethod(nuevo_xml) |
256 |
|
|
257 |
# Métodos privados |
# Métodos privados |
258 |
|
|
259 |
def __parsear_requisito(self, elem_requisito, macros): |
def __parsear_requisito(self, elem_requisito, macros_tipos): |
260 |
"""Extrae la información del elemento requisito: |
"""Extrae la información del elemento requisito: |
261 |
- base |
- base |
262 |
- nombre |
- nombre |
264 |
|
|
265 |
Requiere: |
Requiere: |
266 |
elem_requisito != None |
elem_requisito != None |
267 |
macros != None |
macros_tipos != None |
268 |
""" |
""" |
269 |
self.__base = extraer_atributo_xml(elem_requisito, 'base') |
self.__base = extraer_atributo_xml(elem_requisito, 'base') |
270 |
self.__nombre = extraer_atributo_xml(elem_requisito, 'nombre') |
self.__nombre = extraer_atributo_xml(elem_requisito, 'nombre') |
291 |
else: |
else: |
292 |
# Si no, inventarse un valor a partir del primer macro que tenga |
# Si no, inventarse un valor a partir del primer macro que tenga |
293 |
# un tipo compatible. |
# un tipo compatible. |
294 |
for macro in macros: |
for macro_tipo in macros_tipos: |
295 |
if macro[1] == tipo: |
if macro_tipo[1] == tipo: |
296 |
valor = macro[0] |
valor = macro_tipo[0] |
297 |
break |
break |
298 |
|
|
299 |
if valor == None: |
if valor == None: |
313 |
|
|
314 |
elems_cumplido = elem_requisito.getElementsByTagName('cumplido') |
elems_cumplido = elem_requisito.getElementsByTagName('cumplido') |
315 |
if len(elems_cumplido) > 0: |
if len(elems_cumplido) > 0: |
316 |
self.__cumplido = Guion(elems_cumplido[0], macros) |
self.__cumplido = Guion(elems_cumplido[0], macros_tipos) |
317 |
else: |
else: |
318 |
self.__cumplido = [] |
self.__cumplido = [] |
319 |
|
|
320 |
elems_no_cumplido = elem_requisito.getElementsByTagName('no_cumplido') |
elems_no_cumplido = elem_requisito.getElementsByTagName('no_cumplido') |
321 |
if len(elems_no_cumplido) > 0: |
if len(elems_no_cumplido) > 0: |
322 |
self.__no_cumplido = Guion(elems_no_cumplido[0], macros) |
self.__no_cumplido = Guion(elems_no_cumplido[0], macros_tipos) |
323 |
else: |
else: |
324 |
self.__no_cumplido = [] |
self.__no_cumplido = [] |
325 |
|
|
326 |
|
|
327 |
# Métodos normales |
# Métodos normales |
328 |
|
|
329 |
def comprobar(self, macros): |
def comprobar(self, macros_valores): |
330 |
"""Realiza la comprobación de la requisito (es decir, comparar la propiedad con el valor, |
"""Realiza la comprobación de la requisito (es decir, comparar la propiedad con el valor, |
331 |
y ejecutar unas acciones u otras según el resultado). |
y ejecutar unas acciones u otras según el resultado). |
332 |
|
|
333 |
Aquí se calculan los valores reales de la ejecución. Los valores pueden incluir macros, |
Aquí se calculan los valores reales de la ejecución. Los valores pueden incluir macros, |
334 |
que se resuelven con el parámetro "macros" de esta función. Dicho parámetro es un |
que se resuelven con el parámetro "macros_valores" de esta función. Dicho parámetro es un |
335 |
diccionario con pares "$nombre_macro": valor. |
diccionario con pares "$nombre_macro": valor. |
336 |
|
|
337 |
Ejemplo -> Hirunatan se bebe la pocion en la posada |
Ejemplo -> Hirunatan se bebe la pocion en la posada |
338 |
|
|
339 |
macros: {"$usuario": <instancia Hirunatan>, |
macros_valores: {"$usuario": <instancia Hirunatan>, |
340 |
"$sala": <instancia posada01>) |
"$sala": <instancia posada01>) |
341 |
"$objeto": <instancia pocion01>} |
"$objeto": <instancia pocion01>} |
342 |
|
|
343 |
Además, devuelve si la acción que originó el suceso dentro del cual está este requisito |
Además, devuelve si la acción que originó el suceso dentro del cual está este requisito |
344 |
debe ser aceptada (1) o cancelada (0), o None si no se especifica. |
debe ser aceptada (1) o cancelada (0), o None si no se especifica. |
345 |
|
|
346 |
Invariantes: |
Invariantes: |
347 |
macros != None |
macros_valores != None |
348 |
""" |
""" |
349 |
# Resolver los parámetros, y colocarlos en un diccionario {nombre: valor}. |
# Resolver los parámetros, y colocarlos en un diccionario {nombre: valor}. |
350 |
# El parámetro llamado "id" no es en realidad un parámetro, sino el objeto |
# El parámetro llamado "id" no es en realidad un parámetro, sino el objeto |
358 |
|
|
359 |
if t == "numero": |
if t == "numero": |
360 |
if v and v[0] == "$": |
if v and v[0] == "$": |
361 |
valor_str = macros[v] |
valor_str = macros_valores[v] |
362 |
else: |
else: |
363 |
valor_str = v |
valor_str = v |
364 |
|
|
371 |
|
|
372 |
elif t == "string": |
elif t == "string": |
373 |
if v and v[0] == "$": |
if v and v[0] == "$": |
374 |
valor = macros[v] |
valor = macros_valores[v] |
375 |
else: |
else: |
376 |
valor = v |
valor = v |
377 |
|
|
378 |
elif t == "si_no": |
elif t == "si_no": |
379 |
if v and v[0] == "$": |
if v and v[0] == "$": |
380 |
valor_str = macros[v].lower() |
valor_str = macros_valores[v].lower() |
381 |
else: |
else: |
382 |
valor_str = v.lower() |
valor_str = v.lower() |
383 |
if valor_str == 's' or valor_str == 'si' or valor_str == 'sí' \ |
if valor_str == 's' or valor_str == 'si' or valor_str == 'sí' \ |
388 |
|
|
389 |
elif t == "Personaje": |
elif t == "Personaje": |
390 |
if v and v[0] == "$": |
if v and v[0] == "$": |
391 |
valor = macros[v] |
valor = macros_valores[v] |
392 |
else: |
else: |
393 |
sala = macros["$sala"] |
sala = macros_valores["$sala"] |
394 |
valor = sala.personajes[v] |
valor = sala.personajes[v] |
395 |
|
|
396 |
elif t == "Sala": |
elif t == "Sala": |
397 |
if v and v[0] == "$": |
if v and v[0] == "$": |
398 |
valor = macros[v] |
valor = macros_valores[v] |
399 |
else: |
else: |
400 |
valor = Mundo.localizar_sala(v) |
valor = Mundo.localizar_sala(v) |
401 |
|
|
402 |
elif t == "Objeto": |
elif t == "Objeto": |
403 |
if v and v[0] == "$": |
if v and v[0] == "$": |
404 |
valor = macros[v] |
valor = macros_valores[v] |
405 |
else: |
else: |
406 |
valor = None # %% La verdad, no sé qué hacer aquí :-? |
valor = None # %% La verdad, no sé qué hacer aquí :-? |
407 |
|
|
408 |
elif t == "Idioma": |
elif t == "Idioma": |
409 |
if v and v[0] == "$": |
if v and v[0] == "$": |
410 |
valor = macros[v] |
valor = macros_valores[v] |
411 |
else: |
else: |
412 |
valor = Idioma_buscar(v) |
valor = Idioma_buscar(v) |
413 |
|
|
458 |
comparacion = 0 |
comparacion = 0 |
459 |
|
|
460 |
if comparacion: |
if comparacion: |
461 |
return self.__cumplido.ejecutar(macros) |
return self.__cumplido.ejecutar(macros_valores) |
462 |
else: |
else: |
463 |
return self.__no_cumplido.ejecutar(macros) |
return self.__no_cumplido.ejecutar(macros_valores) |
464 |
|
|
465 |
|
|
466 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |