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

Diff of /ambar/modulo.py

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

revision 2.1 by TuringTest, Tue Aug 19 22:46:26 2003 UTC revision 2.2 by TuringTest, Sun Aug 24 23:34:41 2003 UTC
# Line 28  import os Line 28  import os
28  from utils import *  from utils import *
29  from requisito import Requisito  from requisito import Requisito
30  from accion import Accion  from accion import Accion
31  from guion import Guion  from guiontemporizado import GuionTemporizado
32    
33  from cronomine import CronoMine  from cronomine import CronoMine
34  from fechahoramine import *  from fechahoramine import *
# Line 81  class Modulo(object): Line 81  class Modulo(object):
81                      no se puede activar de nuevo hasta que los usos se olvidan.                      no se puede activar de nuevo hasta que los usos se olvidan.
82                  Si vale "siempre", siempre se puede activar el guion (no se gasta)                  Si vale "siempre", siempre se puede activar el guion (no se gasta)
83                  Si vale "nunca", el guion es de UN SOLO USO, solo se puede activar una vez y esta activacion nunca se olvida.                  Si vale "nunca", el guion es de UN SOLO USO, solo se puede activar una vez y esta activacion nunca se olvida.
84                    
85                          Requiere:                          Requiere:
86                              guion != None                                                        guion != None                          
87                      """                      """
88                                            
89              self.guion = guion              self.guion = guion
90              self.__repeticiones_iniciales = repeticiones              self.__repeticiones_iniciales = repeticiones
91              self.__repeticiones = repeticiones              self.__repeticiones = repeticiones
92              self.__tiempo = duracion_recuerdo              self.__tiempo = duracion_recuerdo
93              self.__temporizador = None              self.__temporizador = None
94                    
95          def agotado(self):          def agotado(self):
96              if self.__repeticiones == "siempre" or self.__repeticiones == "nunca":              if self.__repeticiones == "siempre" or self.__repeticiones == "nunca":
97                  return 0                  return 0
98                    
99              return (int(self.__repeticiones) == 0)              return (int(self.__repeticiones) == 0)
100                            
101          def ejecutar(self, macros):          def ejecutar(self, macros):
102              """Activa el guion si le quedan usos disponibles, y lleva la cuenta del numero de repeticiones"""              """Activa el guion si le quedan usos disponibles, y lleva la cuenta del numero de repeticiones"""
103              if self.__repeticiones != "siempre":              if self.__repeticiones != "siempre":
# Line 108  class Modulo(object): Line 108  class Modulo(object):
108                      self.__repeticiones = self.__repeticiones - 1                      self.__repeticiones = self.__repeticiones - 1
109                      self.__activar_temporizador()                      self.__activar_temporizador()
110                  else:                  else:
111                      return 0    # Repeticiones agotadas                      return 0    # Repeticiones agotadas
112                            
113              trazar("una repeticion gastada, quedan" + repr(self.__repeticiones), "pnj", 2)              trazar("una repeticion gastada, quedan" + repr(self.__repeticiones), "pnj", 2)
114              return self.guion.ejecutar(macros) # Si el guion cancela, devuelve 0              return self.guion.ejecutar(macros) # Si el guion cancela, devuelve 0
115                    
116          def __activar_temporizador(self):          def __activar_temporizador(self):
117              """Establece el tiempo necesario para "olvidar" los usos del guion"""              """Establece el tiempo necesario para "olvidar" los usos del guion"""
118              from mundo import Mundo                      from mundo import Mundo
119                            
120              if self.__temporizador:              if self.__temporizador:
121                  self.__temporizador.parar()                  try:
122                        self.__temporizador.parar()
123                    except:
124                        pass
125              horas_olvido = FechaHoraMineRel( segundos = (random() + 0.5) * self.__tiempo * FechaHoraMine.SEGUNDOS_POR_HORA )              horas_olvido = FechaHoraMineRel( segundos = (random() + 0.5) * self.__tiempo * FechaHoraMine.SEGUNDOS_POR_HORA )
126              trazar("activado temporizador para dentro de %s horas Mine" % repr(horas_olvido), "pnj")              trazar("activado temporizador para dentro de %s horas Mine" % repr(horas_olvido), "pnj")
127              self.__temporizador = CronoMine(Mundo.cronoMine_control, horas_olvido, lambda x: self.__olvidar_repeticiones())              self.__temporizador = CronoMine(Mundo.cronoMine_control, horas_olvido, lambda x: self.__olvidar_repeticiones())
# Line 136  class Modulo(object): Line 139  class Modulo(object):
139    
140      id = property(__leer_id,      id = property(__leer_id,
141                    doc="""(string): identifica univocamente al modulo, si ha sido leido desde                    doc="""(string): identifica univocamente al modulo, si ha sido leido desde
142                        un fichero. Si el modulo es parte de otro fichero distinto, id = None.                        un fichero. Si el modulo es parte de otro fichero distinto, id = None.
143    
144                        No puede contener espacios.                        No puede contener espacios.
145                        """)                        """)
146    
147      def __leer_version(self): return self.__version      def __leer_version(self): return self.__version
148    
149      version = property(__leer_version,      version = property(__leer_version,
150                         doc="""(int): la versi�n del sistema de modulos.                         doc="""(int): la versi�n del sistema de modulos.
151    
152                             Invariantes:                             Invariantes:
153                                 version != None                                 version != None
154                             """)                             """)
155    
156      def __leer_autor(self): return self.__autor      def __leer_autor(self): return self.__autor
157    
158      autor = property(__leer_autor,      autor = property(__leer_autor,
159                       doc="""autor (string): identifica al autor del modulo.                       doc="""autor (string): identifica al autor del modulo.
160                                            
161                           Invariantes:                           Invariantes:
162                               autor != None                               autor != None
163                           """)                           """)
164    
165      def __leer_comentario(self): return self.__comentario      def __leer_comentario(self): return self.__comentario
166    
167      comentario = property(__leer_comentario,      comentario = property(__leer_comentario,
168                            doc="""(string): un metacomentario acerca del modulo.                            doc="""(string): un metacomentario acerca del modulo.
169                                                        
170                                Invariantes:                                Invariantes:
171                                    comentario != None                                    comentario != None
172                                """)                                """)
173    
174    
175      def __leer_opciones(self): return self.__opciones      def __leer_opciones(self): return self.__opciones
176    
177      opciones = property(__leer_opciones,      opciones = property(__leer_opciones,
178                      doc="""(Requisito|Accion[]): lista de requisitos y acciones, en orden.                      doc="""(Requisito|Accion[]): lista de requisitos y acciones, en orden.
179    
180                      Los requisitos, a su vez, contienen guiones dentro de <cumplido> y <no_cumplido>.                      Los requisitos, a su vez, contienen guiones dentro de <cumplido> y <no_cumplido>.
181    
182                      Invariantes:                      Invariantes:
183                        opciones != None                        opciones != None
184                      """)                      """)
185    
186    
187      # Constructor      # Constructor
188    
189      def __init__(self, elem_modulo, macros, macros_extra = {}):      def __init__(self, elem_modulo, macros, macros_extra = {}):
190          """Parsea un nodo conteniendo una lista de elementos <accion>, <requisito> o <guion>.          """Parsea un nodo conteniendo una lista de elementos <accion>, <requisito> o <guion>.
191    
192          macros ((string, string)[]) es una lista con los nombres y tipos de las          macros ((string, string)[]) es una lista con los nombres y tipos de las
193          macros permitidos en el contexto de este guion.          macros permitidos en el contexto de este guion.
194    
195          macros_extra (string:any) es un diccionario de macros que ser�n pasados          macros_extra (string:any) es un diccionario de macros que ser�n pasados
196          al guion cuando se ejecute, adem�s de los que se pasen al m�todo ejecutar().          al guion cuando se ejecute, adem�s de los que se pasen al m�todo ejecutar().
197    
198          Requiere:          Requiere:
199              elem_guion != None              elem_guion != None
200              macros != None              macros != None
201          """          """
202    
203          # Atributos privados:          # Atributos privados:
204          #          #
205          # __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripci�n.          # __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripci�n.
206          # __macros_extra (string:any): macros que se pasan a la ejecuci�n del guion, desde          # __macros_extra (string:any): macros que se pasan a la ejecuci�n del guion, desde
207          #                              el sitio en el fichero ha sido invocado.          #                              el sitio en el fichero ha sido invocado.
208          #          #
209          #                 Invariantes:          #                 Invariantes:
210          #                     __id == None -> __fecha_fichero = None          #                     __id == None -> __fecha_fichero = None
211          #                     __id != None -> __fecha_fichero >= 0          #                     __id != None -> __fecha_fichero >= 0
212                    
213          trazar("Cargando modulo: " + extraer_atributo_xml(elem_modulo, "id"), "pnj")          trazar("Cargando modulo: " + extraer_atributo_xml(elem_modulo, "id"), "pnj")
214          if extraer_nombre_xml(elem_modulo) == 'desc_modulo':          if extraer_nombre_xml(elem_modulo) == 'desc_modulo':
215    
216              # Estamos leyendo un fichero XML de descripcion de modulo.              # Estamos leyendo un fichero XML de descripcion de modulo.
217              self.__id = extraer_atributo_xml(elem_modulo, 'id')              self.__id = extraer_atributo_xml(elem_modulo, 'id')
218    
219              version_desc_modulo = extraer_atributo_xml(elem_modulo,'version')              version_desc_modulo = extraer_atributo_xml(elem_modulo,'version')
220              if version_desc_modulo != Modulo.VERSION_DESC_MODULO:              if version_desc_modulo != Modulo.VERSION_DESC_MODULO:
221                  raise ValueError("Version incorrecta del fichero descriptor de modulo " +                  raise ValueError("Version incorrecta del fichero descriptor de modulo " +
222                                   self.__id + ": " + version_desc_modulo + " cuando se esperaba " +                                   self.__id + ": " + version_desc_modulo + " cuando se esperaba " +
223                                   Modulo.VERSION_DESC_MODULO)                                   Modulo.VERSION_DESC_MODULO)
224                                                                    
225              self.__version = Modulo.VERSION_MODULO              self.__version = Modulo.VERSION_MODULO
226                            
227              self.__autor = extraer_atributo_xml(elem_modulo,'autor')              self.__autor = extraer_atributo_xml(elem_modulo,'autor')
228                            
229              if elem_modulo.hasAttribute('comentario'):              if elem_modulo.hasAttribute('comentario'):
230                      self.__comentario = extraer_atributo_xml(elem_modulo,'comentario')                      self.__comentario = extraer_atributo_xml(elem_modulo,'comentario')
231              else:              else:
232                      self.__comentario = ""                      self.__comentario = ""
233    
234          else:          else:
235    
236              # Estamos leyendo un modulo incrustado dentro de otro fichero XML              # Estamos leyendo un modulo incrustado dentro de otro fichero XML
237              self.__id = None              self.__id = None
238              self.__version = None              self.__version = None
239              self.__autor = None              self.__autor = None
240              self.__comentario = None              self.__comentario = None
241              self.__fecha_fichero = None              self.__fecha_fichero = None
242    
243          self.__macros_extra = macros_extra          self.__macros_extra = macros_extra
244          self.__opciones = []          self.__opciones = []
245                    
246          limpiar_nodos_text_xml(elem_modulo)          limpiar_nodos_text_xml(elem_modulo)
247          for elem in elem_modulo.childNodes:          for elem in elem_modulo.childNodes:
248              if extraer_nombre_xml(elem) == "modulo":              if extraer_nombre_xml(elem) == "modulo":
249                  trazar("Creando un modulo importado de fichero", "pnj", 2)                  trazar("Creando un modulo importado de fichero", "pnj", 2)
250                  self.__parsear_fichero(elem, macros, macros_extra)                  self.__parsear_fichero(elem, macros, macros_extra)
251              else:              elif extraer_nombre_xml(elem) == "guion":
252                  guion = Guion(elem, macros)                  guion = GuionTemporizado(elem, macros)
253                  self.__opciones.append( Modulo.Repeticion( guion, 1, 0.5 ) )                  self.__opciones.append( Modulo.Repeticion( guion, guion.repeticiones, 0.5 ) )
254    
255      # Mé�todos privados de Modulo      # Mé�todos privados de Modulo
256    
257      def __parsear_fichero(self, elem_modulo, macros, macros_extra):      def __parsear_fichero(self, elem_modulo, macros, macros_extra):
258                  id = extraer_atributo_xml(elem_modulo, 'id')                      id = extraer_atributo_xml(elem_modulo, 'id')    
259                    
260                  for i in range(0, elem_modulo.attributes.length):                  for i in range(0, elem_modulo.attributes.length):
261                      attr = elem_modulo.attributes.item(i)                      attr = elem_modulo.attributes.item(i)
262                      if attr.name != 'id':                      if attr.name != 'id':
263                          macros_extra["$" + attr.name] = extraer_atributo_xml(elem_modulo, attr.name)                          macros_extra["$" + attr.name] = extraer_atributo_xml(elem_modulo, attr.name)
264                    
265                  archivo = os.path.join(Modulo.DIR_DESC_MODULOS, id + Modulo.EXT_DESC_MODULOS)                  archivo = os.path.join(Modulo.DIR_DESC_MODULOS, id + Modulo.EXT_DESC_MODULOS)
266                  self.__fecha_fichero = os.path.getmtime(archivo)                  self.__fecha_fichero = os.path.getmtime(archivo)
267                  arbol_xml = minidom.parse(archivo)                  arbol_xml = minidom.parse(archivo)
268                    
269                  elem_desc_modulo = arbol_xml.documentElement                  elem_desc_modulo = arbol_xml.documentElement
270                    
271                  self.__opciones.append(Modulo(elem_desc_modulo, macros, macros_extra))                  self.__opciones.append(Modulo(elem_desc_modulo, macros, macros_extra))
272                     # Observar que un modulo puede contener recursivamente otros modulos                     # Observar que un modulo puede contener recursivamente otros modulos
273    
274    
275      # M�todos normales      # M�todos normales
276    
277      def mejor_guion(self):      def mejor_guion(self):
278          """Guion mas adecuado en la situacion actual"""          """Guion mas adecuado en la situacion actual"""
279                    
280          for guion in self.__opciones:          for guion in self.__opciones:
281              trazar("Agotado? " + repr(guion.agotado()), "pnj", 2)              trazar("Agotado? " + repr(guion.agotado()), "pnj", 2)
282              if not guion.agotado():              if not guion.agotado():
283                  return guion                  return guion
284          return None          return None
285            
286    
287      def ejecutar(self, macros):      def ejecutar(self, macros):
288          """Ejecuta el guion en cuestion.          """Ejecuta el guion en cuestion.
289    
290          macros({String:any}) es un diccionario de los nombres de las macros a su valor          macros({String:any}) es un diccionario de los nombres de las macros a su valor
291          final.          final.
292    
293          Devuelve el resultado final de "aceptar" (1) o "cancelar" (0), o bien None          Devuelve el resultado final de "aceptar" (1) o "cancelar" (0), o bien None
294          si no se ha especificado (la serie no contiene ninguna de las dos acciones).          si no se ha especificado (la serie no contiene ninguna de las dos acciones).
295    
296          Requiere:          Requiere:
297              macros != None              macros != None
298          """          """
299                    
300          self.__opciones[0].ejecutar(macros)          self.__opciones[0].ejecutar(macros)
301          return          return
302          resultado = None          resultado = None
303    
304          macros_total = macros          macros_total = macros
305          macros_total.update(self.__macros_extra)          macros_total.update(self.__macros_extra)
306    
307          for instancia in self.__opciones:          for instancia in self.__opciones:
308              if instancia.__class__.__name__ == "Accion":              if instancia.__class__.__name__ == "Accion":
309                  if instancia.nombre == "aceptar":                  if instancia.nombre == "aceptar":
310                      resultado = 1                      resultado = 1
311                  elif instancia.nombre == "cancelar":                  elif instancia.nombre == "cancelar":
312                      resultado = 0                      resultado = 0
313                  else:                  else:
314                      instancia.ejecutar(macros_total)                      instancia.ejecutar(macros_total)
315              elif instancia.__class__.__name__ == "Requisito":              elif instancia.__class__.__name__ == "Requisito":
316                  r = instancia.comprobar(macros_total)                  r = instancia.comprobar(macros_total)
317                  if r != None:                  if r != None:
318                      resultado = r                      resultado = r
319              elif instancia.__class__.__name__ == "Modulo":              elif instancia.__class__.__name__ == "Modulo":
320                  instancia.ejecutar(macros_total)                  instancia.ejecutar(macros_total)
321    
322          return resultado          return resultado
323                                    
324    
325    
326      # M�todos especiales      # M�todos especiales
# Line 325  class Modulo(object): Line 328  class Modulo(object):
328      def __setstate__(self, atributos):      def __setstate__(self, atributos):
329          """M�todo llamado para restaurar los atributos provinientes de un pickle."""          """M�todo llamado para restaurar los atributos provinientes de un pickle."""
330    
331          self.__dict__ = atributos          self.__dict__ = atributos
332    
333          if self.__id != None:          if self.__id != None:
334              # Verificar la versi�n (s�lo para modulos le�dos de fichero).              # Verificar la versi�n (s�lo para modulos le�dos de fichero).
335              if not self.__dict__.has_key("_Modulo__version"):              if not self.__dict__.has_key("_Modulo__version"):
336                  raise ValueError("Cargado modulo " + self.id + " obsoleto: sin versi�n," +                  raise ValueError("Cargado modulo " + self.id + " obsoleto: sin versi�n," +
337                                   " cuando se esperaba " + Modulo.VERSION_MODULO)                                   " cuando se esperaba " + Modulo.VERSION_MODULO)
338    
339              assert(Modulo.VERSION_MODULO == "1.0.0")              assert(Modulo.VERSION_MODULO == "1.0.0")
340              while self.__version != "1.0.0":              while self.__version != "1.0.0":
341            
342                  # Aqu� se ir� poniendo el c�digo para convertir autom�ticamente a versiones futuras.                  # Aqu� se ir� poniendo el c�digo para convertir autom�ticamente a versiones futuras.
343    
344                  raise ValueError("Cargado modulo " + self.__id + " con versi�n desconocida: " +                  raise ValueError("Cargado modulo " + self.__id + " con versi�n desconocida: " +
345                                   str(self.__version) + " cuando se esperaba " + Modulo.VERSION_MODULO)                                   str(self.__version) + " cuando se esperaba " + Modulo.VERSION_MODULO)
346    
347    
348  # C�digo para pruebas unitarias del m�dulo.  # C�digo para pruebas unitarias del m�dulo.
349    
350  if (__name__ == '__main__'):  if (__name__ == '__main__'):
351              print "No hay prueba unitaria de módulo. Prueba con objeto.py"              print "No hay prueba unitaria de módulo. Prueba con objeto.py"
352              archivo = os.path.join(Modulo.DIR_DESC_MODULOS, "prueba" + Modulo.EXT_DESC_MODULOS)              archivo = os.path.join(Modulo.DIR_DESC_MODULOS, "prueba" + Modulo.EXT_DESC_MODULOS)
353              arbol_xml = minidom.parse(archivo)              arbol_xml = minidom.parse(archivo)
354              elem_desc_modulo = arbol_xml.documentElement              elem_desc_modulo = arbol_xml.documentElement
355              macros = [ ("$usuario", "Personaje"),  ("$sala", "Sala"), ("$objeto", "Objeto") ]              macros = [ ("$usuario", "Personaje"),  ("$sala", "Sala"), ("$objeto", "Objeto") ]
356              macros_extra = {}              macros_extra = {}
357              m = Modulo (elem_desc_modulo, macros, macros_extra)              m = Modulo (elem_desc_modulo, macros, macros_extra)
358              print m.id              print m.id
359              from mundo import Mundo                      from mundo import Mundo        
360              Mundo.inicializar()                  Mundo.inicializar()    
361              for g in m._Modulo__opciones:              for g in m._Modulo__opciones:
362  #               g.guion_Guion_  #               g.guion_Guion_
363                  print g                  print g
364                  g.ejecutar(macros=None)                  g.ejecutar(macros=None)

Legend:
Removed from v.2.1  
changed lines
  Added in v.2.2

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