/[ambar]/ambar/requisito.py
ViewVC logotype

Diff of /ambar/requisito.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.4 by amoyav, Wed Jul 30 14:17:58 2003 UTC revision 2.5 by amoyav, Sun Aug 31 12:07:38 2003 UTC
# Line 134  class Requisito(object): Line 134  class Requisito(object):
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)
# Line 256  class Requisito(object): Line 256  class Requisito(object):
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
# Line 264  class Requisito(object): Line 264  class Requisito(object):
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')
# Line 291  class Requisito(object): Line 291  class Requisito(object):
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:
# Line 313  class Requisito(object): Line 313  class Requisito(object):
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
# Line 358  class Requisito(object): Line 358  class Requisito(object):
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    
# Line 371  class Requisito(object): Line 371  class Requisito(object):
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í' \
# Line 388  class Requisito(object): Line 388  class Requisito(object):
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    
# Line 458  class Requisito(object): Line 458  class Requisito(object):
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.

Legend:
Removed from v.2.4  
changed lines
  Added in v.2.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26