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

Diff of /ambar/objeto.py

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

revision 2.0 by pabloruiz, Sat Aug 17 21:11:09 2002 UTC revision 2.1 by pabloruiz, Tue Nov 5 22:58:22 2002 UTC
# Line 1  Line 1 
1  #!/usr/bin/env python  #!/usr/bin/env python
2  #  #
3  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
4  #Copyright (C) 2002  Pablo Ruiz Múzquiz  #Copyright (C) 2002  Pablo Ruiz Múzquiz
5  #  #
6  #  #
7  #This program is free software; you can redistribute it and/or modify  #This program is free software; you can redistribute it and/or modify
8  #it under the terms of the GNU General Public License as published by  #it under the terms of the GNU General Public License as published by
9  #the Free Software Foundation; either version 2 of the License, or  #the Free Software Foundation; either version 2 of the License, or
10  #(at your option) any later version.  #(at your option) any later version.
11  #  #
12  #This program is distributed in the hope that it will be useful,  #This program is distributed in the hope that it will be useful,
13  #but WITHOUT ANY WARRANTY; without even the implied warranty of  #but WITHOUT ANY WARRANTY; without even the implied warranty of
14  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  #GNU General Public License for more details.  #GNU General Public License for more details.
16  #  #
17  #You should have received a copy of the GNU General Public License  #You should have received a copy of the GNU General Public License
18  #along with this program; if not, write to the Free Software  #along with this program; if not, write to the Free Software
19  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  #  #
21  #  #
22  #Fichero: objeto.py  #Fichero: objeto.py
23    
24  """Clase Objeto."""  """Clase Objeto."""
25    
26    
27  from xml.dom import minidom  from xml.dom import minidom
28  import random  import random
29  import sys  import sys
30  import string  import string
31  import os  import os
32  import cPickle  import cPickle
33    
34  from personaje import *  from personaje import *
35  from personajejugador import *  from personajejugador import *
36  from personajenojugador import *  from personajenojugador import *
37  from interfazpnj import *  from interfazpnj import *
38    
39    
40    
41  class Objeto:  class Objeto:
42      """Un objeto dentro del juego.      """Un objeto dentro del juego.
43            
44      Contiene los siguientes atributos:      Contiene los siguientes atributos:
45       - __id (string): identifica univocamente al objeto. No puede contener espacios.       - __id (string): identifica univocamente al objeto. No puede contener espacios.
46       - __version (int): la versión del sistema de objetos.       - __version (int): la versión del sistema de objetos.
47       - __autor (string): identifica al autor del objeto.       - __autor (string): identifica al autor del objeto.
48       - __comentario (string): un metacomentario acerca del objeto.       - __comentario (string): un metacomentario acerca del objeto.
49       - __area (string): el area a la que pertenece el objeto, si es que lo necesita.       - __area (string): el area a la que pertenece el objeto, si es que lo necesita.
50       - __nombre (string): Una breve frase informando de qué es el objeto.       - __nombre (string): Una breve frase informando de qué es el objeto.
51       - __descripcion ({String:any}[]): una lista de diccionarios que contiene cada uno:       - __descripcion ({String:any}[]): una lista de diccionarios que contiene cada uno:
52           - "dificultad" (int): de 1 a 100           - "dificultad" (int): de 1 a 100
53           - "texto" (string): el contenido del item de descripcion           - "texto" (string): el contenido del item de descripcion
54       - __tipo (string): el tipo de material del objeto.       - __tipo (string): el tipo de material del objeto.
55       - __categoria (string): el tipo de uso generico del objeto.       - __categoria (string): el tipo de uso generico del objeto.
56       - __peso (float): en kilos       - __peso (float): en kilos
57       - __volumen (float): en relación a 1 unidad de persona.       - __volumen (float): en relación a 1 unidad de persona.
58       - __cargas (int): el número de veces que puede ser usado antes de destruirse o       - __cargas (int): el número de veces que puede ser usado antes de destruirse o
59                       volverse inservible. El valor 0 indica que no tiene limite.                       volverse inservible. El valor 0 indica que no tiene limite.
60       - __valor (int): en monedas de estaño.       - __valor (int): en monedas de estaño.
61       - __estado (int): de 0 a 100.       - __estado (int): de 0 a 100.
62       - __aura (int): de 0 a 100       - __aura (int): de 0 a 100
63       - __usos ({string:any}[]): lista de usos del objeto, siendo cada uso un diccionario:       - __usos ({string:any}[]): lista de usos del objeto, siendo cada uso un diccionario:
64           - "tipo" (string): el tipo de uso ("comer", "poner", "lanzar", etc.)           - "tipo" (string): el tipo de uso ("comer", "poner", "lanzar", etc.)
65           - "posicion" (string): si el uso es "poner", en que parte del cuerpo se pone           - "posicion" (string): si el uso es "poner", en que parte del cuerpo se pone
66           - "gasto" (int): el numero de cargas que consume cada uso           - "gasto" (int): el numero de cargas que consume cada uso
67           - "msg" (string): el mensaje que aparece cuando se usa           - "msg" (string): el mensaje que aparece cuando se usa
68           - "duracion" (int): el numero de segundos que dura el efecto (0 = indeterminado)           - "duracion" (int): el numero de segundos que dura el efecto (0 = indeterminado)
69           - "requisitos" ({string:any}[]): lista de requisitos del uso, siendo cada requisito           - "requisitos" ({string:any}[]): lista de requisitos del uso, siendo cada requisito
70                                            un diccionario:                                            un diccionario:
71                - "atributo" (string): el atributo a comprobar                - "atributo" (string): el atributo a comprobar
72                - "valor" (int): el valor mínimo que deberá tener el atributo                - "valor" (int): el valor mínimo que deberá tener el atributo
73                - "msg" (string): el mensaje que sale si el atributo no llega al mínimo                - "msg" (string): el mensaje que sale si el atributo no llega al mínimo
74           - "efectos" ({string:any}[]): lista de efectos que produce el uso, siendo cada           - "efectos" ({string:any}[]): lista de efectos que produce el uso, siendo cada
75                                         efecto un diccionario:                                         efecto un diccionario:
76                - "atributo" (string): el atributo a modificar                - "atributo" (string): el atributo a modificar
77                - "valor" (int): el número de puntos que sube o baja (si es negativo)                - "valor" (int): el número de puntos que sube o baja (si es negativo)
78                - "duracion" (int): duración del efecto en segundos (0 = ilimitado)                - "duracion" (int): duración del efecto en segundos (0 = ilimitado)
79                - "msg" (string): el mensaje que sale cuando ocurre el efecto                - "msg" (string): el mensaje que sale cuando ocurre el efecto
80       - __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripcion       - __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripcion
81    
82      Al instanciar un objeto, se crea nuevo y se lee desde el fichero de descripcion de objeto,      Al instanciar un objeto, se crea nuevo y se lee desde el fichero de descripcion de objeto,
83      poniendolo en su estado inicial. Esta instancia podrá pasar a manos de pjs y pnjs, y se      poniendolo en su estado inicial. Esta instancia podrá pasar a manos de pjs y pnjs, y se
84      puede salvar a disco junto con la sala o el personaje que lo contiene.      puede salvar a disco junto con la sala o el personaje que lo contiene.
85    
86    
87      Invariantes:      Invariantes:
88        __id != None        __id != None
89        __version != None        __version != None
90        __autor != None        __autor != None
91        __comentario != None        __comentario != None
92        __area != None        __area != None
93        __nombre != None        __nombre != None
94        __tipo != None        __tipo != None
95        __categoria != None        __categoria != None
96        __peso > 0        __peso > 0
97        __volumen > 0        __volumen > 0
98        __cargas >= 0        __cargas >= 0
99        __valor > 0        __valor > 0
100        __estado in range(0,100)        __estado in range(0,100)
101        __aura in range(0,100)        __aura in range(0,100)
102        
103        __tipo in TIPOS_DE_MATERIAL        __tipo in TIPOS_DE_MATERIAL
104        __categoria in CATEGORIAS        __categoria in CATEGORIAS
105                
106        __descripcion != None        __descripcion != None
107        len(__descripcion) >= 0        len(__descripcion) >= 0
108        __descripcion[i]["dificultad"] in range(0,100)        __descripcion[i]["dificultad"] in range(0,100)
109        __descripcion[i]["texto"] != None        __descripcion[i]["texto"] != None
110                
111        __usos != None        __usos != None
112        len(__usos) >= 0        len(__usos) >= 0
113        __usos[i]["tipo"] in USOS        __usos[i]["tipo"] in USOS
114        __usos[i]["posicion"] in POSICIONES        __usos[i]["posicion"] in POSICIONES
115        __usos[i]["gasto"] >= 0        __usos[i]["gasto"] >= 0
116        __usos[i]["msg"] != None        __usos[i]["msg"] != None
117        __usos[i]["duracion"] >= 0        __usos[i]["duracion"] >= 0
118        __usos[i]["requisitos"] != None        __usos[i]["requisitos"] != None
119        __usos[i]["requisitos"][j]["atributo"] != None        __usos[i]["requisitos"][j]["atributo"] != None
120        __usos[i]["requisitos"][j]["valor"] in range(0,100)        __usos[i]["requisitos"][j]["valor"] in range(0,100)
121        __usos[i]["requisitos"][j]["msg"] != None        __usos[i]["requisitos"][j]["msg"] != None
122        __usos[i]["efectos"] != None        __usos[i]["efectos"] != None
123        __usos[i]["efectos"][k]["atributo"] != None        __usos[i]["efectos"][k]["atributo"] != None
124        __usos[i]["efectos"][k]["duracion"] >= 0        __usos[i]["efectos"][k]["duracion"] >= 0
125        __usos[i]["efectos"][k]["msg"] != None        __usos[i]["efectos"][k]["msg"] != None
126            
127        __fecha_fichero >= 0        __fecha_fichero >= 0
128      """      """
129    
130      # Version del sistema de descripciones de objeto (se incrementa cada vez que cambia      # Version del sistema de descripciones de objeto (se incrementa cada vez que cambia
131      # el formato de los ficheros de desc_objetos)      # el formato de los ficheros de desc_objetos)
132      VERSION_DESC_OBJETO = '1.0'      VERSION_DESC_OBJETO = '1.0'
133    
134      # Version del sistema de objetos (se incrementa cada vez que varian los atributos      # Version del sistema de objetos (se incrementa cada vez que varian los atributos
135      # de la clase Objeto)      # de la clase Objeto)
136      VERSION_OBJETO = '1.0'      VERSION_OBJETO = '1.0'
137    
138      DIR_DESC_OBJETOS = 'desc_objetos'      DIR_DESC_OBJETOS = 'desc_objetos'
139      EXT_DESC_OBJETOS = '.xml'      EXT_DESC_OBJETOS = '.xml'
140    
141      TIPOS_DE_MATERIAL = [ 'madera', 'metal', 'cristal', 'piel', 'tejido', 'piedra',      TIPOS_DE_MATERIAL = [ 'madera', 'metal', 'cristal', 'piel', 'tejido', 'piedra',
142                            'organico', 'cera', 'liquido', 'barro' ]                            'organico', 'cera', 'liquido', 'barro' ]
143    
144      CATEGORIAS = [ 'mobiliario', 'arma', 'recipiente', 'joya', 'armadura', 'herramienta',      CATEGORIAS = [ 'mobiliario', 'arma', 'recipiente', 'joya', 'armadura', 'herramienta',
145                     'vestimenta', 'escritura', 'recipìente', 'comestible', 'accesorio' ]                     'vestimenta', 'escritura', 'recipìente', 'comestible', 'accesorio' ]
146    
147      USOS = [ 'comer', 'beber', 'poner', 'lanzar', 'usar' ]      USOS = [ 'comer', 'beber', 'poner', 'lanzar', 'usar' ]
148    
149      POSICIONES = [ 'cabeza', 'cuello', 'tronco', 'brazo-izq', 'brazo-der', 'mano-izq',      POSICIONES = [ 'cabeza', 'cuello', 'tronco', 'brazo-izq', 'brazo-der', 'mano-izq',
150                     'mano-der', 'dos-manos', 'piernas', 'tobillo-izq', 'tobillo-der',                     'mano-der', 'dos-manos', 'piernas', 'tobillo-izq', 'tobillo-der',
151                     'pie-izq', 'pie-der' ]                     'pie-izq', 'pie-der' ]
152    
153    
154      def __init__(self, id):      def __init__(self, id):
155          """Crea un objeto nuevo a partir de un fichero de descripcion de objeto.          """Crea un objeto nuevo a partir de un fichero de descripcion de objeto.
156    
157          Requiere:          Requiere:
158              id != None              id != None
159              id corresponde con un fichero existente              id corresponde con un fichero existente
160          """          """
161    
162          self.__id = id            self.__id = id  
163          self.__inicializar_objeto()          self.__inicializar_objeto()
164                    
165    
166      def id(self):           return self.__id      def id(self):           return self.__id
167      def version(self):      return self.__version      def version(self):      return self.__version
168      def autor(self):        return self.__autor      def autor(self):        return self.__autor
169      def comentario(self):   return self.__comentario      def comentario(self):   return self.__comentario
170      def area(self):         return self.__area      def area(self):         return self.__area
171      def nombre(self):       return self.__nombre      def nombre(self):       return self.__nombre
172      def descripcion(self):  return self.__descripcion      def descripcion(self):  return self.__descripcion
173      def tipo(self):         return self.__tipo      def tipo(self):         return self.__tipo
174      def categoria(self):    return self.__categoria      def categoria(self):    return self.__categoria
175      def peso(self):         return self.__peso      def peso(self):         return self.__peso
176      def volumen(self):      return self.__volumen      def volumen(self):      return self.__volumen
177      def cargas(self):       return self.__cargas      def cargas(self):       return self.__cargas
178      def valor(self):        return self.__valor      def valor(self):        return self.__valor
179      def estado(self):       return self.__estado      def estado(self):       return self.__estado
180      def aura(self):         return self.__aura      def aura(self):         return self.__aura
181      def usos(self):         return self.__usos      def usos(self):         return self.__usos
182    
183    
184      def __inicializar_objeto(self):      def __inicializar_objeto(self):
185          """Rellena todos los datos del objeto a partir de su fichero de descripcion."""          """Rellena todos los datos del objeto a partir de su fichero de descripcion."""
186                    
187          archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS)          archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS)
188          stream = open(archivo)          stream = open(archivo)
189          doc_xml = minidom.parse(stream).documentElement          doc_xml = minidom.parse(stream).documentElement
190          stream.close()          stream.close()
191    
192          self.__fecha_fichero = os.path.getmtime(archivo)          self.__fecha_fichero = os.path.getmtime(archivo)
193                    
194          self.__iniciar_parseador(doc_xml)          self.__iniciar_parseador(doc_xml)
195    
196          self.__parsear_objeto(doc_xml)          self.__parsear_objeto(doc_xml)
197          self.__parsear_id(doc_xml)                self.__parsear_id(doc_xml)      
198          self.__parsear_nombre(doc_xml)            self.__parsear_nombre(doc_xml)  
199          self.__parsear_descripcion(doc_xml)          self.__parsear_descripcion(doc_xml)
200          self.__parsear_propiedades(doc_xml)          self.__parsear_propiedades(doc_xml)
201          self.__parsear_usos(doc_xml)          self.__parsear_usos(doc_xml)
202    
203            
204      def __iniciar_parseador(self, doc_xml):      def __iniciar_parseador(self, doc_xml):
205          """Esta función borra todos los nodos de tipo Text de un          """Esta función borra todos los nodos de tipo Text de un
206          elemento DOM"""          elemento DOM"""
207                    
208          for nodo in doc_xml.childNodes[:]:          for nodo in doc_xml.childNodes[:]:
209              if not 'Element:' in str(nodo).split():              if not 'Element:' in str(nodo).split():
210                  doc_xml.childNodes.remove(nodo)                  doc_xml.childNodes.remove(nodo)
211                    
212    
213      def __parsear_objeto(self, doc_xml):      def __parsear_objeto(self, doc_xml):
214          """Extrae la información del elemento objeto: autor, version, comentario, area."""          """Extrae la información del elemento objeto: autor, version, comentario, area."""
215    
216          version_desc_objeto = doc_xml.attributes["version"].value.encode('ISO-8859-1')          version_desc_objeto = doc_xml.attributes["version"].value.encode('ISO-8859-1')
217    
218          if version_desc_objeto != Objeto.VERSION_DESC_OBJETO:          if version_desc_objeto != Objeto.VERSION_DESC_OBJETO:
219              raise ValueError("Version incorrecta del fichero descriptor de objeto " +              raise ValueError("Version incorrecta del fichero descriptor de objeto " +
220                               self.__id + ": " + version_desc_objeto + " cuando se esperaba " +                               self.__id + ": " + version_desc_objeto + " cuando se esperaba " +
221                               Objeto.VERSION_DESC_OBJETO)                               Objeto.VERSION_DESC_OBJETO)
222    
223          self.__version = Objeto.VERSION_OBJETO          self.__version = Objeto.VERSION_OBJETO
224    
225          self.__autor = doc_xml.attributes["autor"].value.encode('ISO-8859-1')          self.__autor = doc_xml.attributes["autor"].value.encode('ISO-8859-1')
226          try:          try:
227              self.__comentario = doc_xml.attributes["comentario"].value.encode('ISO-8859-1')              self.__comentario = doc_xml.attributes["comentario"].value.encode('ISO-8859-1')
228          except:          except:
229              self.__comentario = ""              self.__comentario = ""
230          try:          try:
231              self.__area = doc_xml.attributes["area"].value.encode('ISO-8859-1')              self.__area = doc_xml.attributes["area"].value.encode('ISO-8859-1')
232          except:          except:
233              self.__area = ""              self.__area = ""
234    
235                    
236      def __parsear_id(self, doc_xml):      def __parsear_id(self, doc_xml):
237          """Extrae el id del objeto"""          """Extrae el id del objeto"""
238          id_fichero = doc_xml.childNodes[0].childNodes[0].data.encode('ISO-8859-1')          id_fichero = doc_xml.childNodes[0].childNodes[0].data.encode('ISO-8859-1')
239          if id_fichero != self.__id:          if id_fichero != self.__id:
240              raise ValueError("El id no coincide con el nombre del fichero")              raise ValueError("El id no coincide con el nombre del fichero")
241                    
242    
243      def __parsear_nombre(self, doc_xml):      def __parsear_nombre(self, doc_xml):
244          """Extrae el nombre del objeto"""          """Extrae el nombre del objeto"""
245          self.__nombre=doc_xml.childNodes[1].childNodes[0].data.encode('ISO-8859-1')          self.__nombre=doc_xml.childNodes[1].childNodes[0].data.encode('ISO-8859-1')
246    
247                    
248      def __parsear_descripcion(self, doc_xml):      def __parsear_descripcion(self, doc_xml):
249          """Extrae el texto y la dificultad asociada de los items          """Extrae el texto y la dificultad asociada de los items
250          de descripcion del objeto"""          de descripcion del objeto"""
251    
252          nodo_descripcion = doc_xml.childNodes[2]          nodo_descripcion = doc_xml.childNodes[2]
253                    
254          # Limpiamos todos los subnodos de tipo Text, al igual          # Limpiamos todos los subnodos de tipo Text, al igual
255          # que hacíamos en la función __iniciar_parseador()          # que hacíamos en la función __iniciar_parseador()
256          for nodo in nodo_descripcion.childNodes[:]:          for nodo in nodo_descripcion.childNodes[:]:
257              if not 'Element:' in str(nodo).split():              if not 'Element:' in str(nodo).split():
258                  doc_xml.childNodes[2].childNodes.remove(nodo)                  doc_xml.childNodes[2].childNodes.remove(nodo)
259                                            
260          self.__descripcion = []          self.__descripcion = []
261    
262          for nodo_item in nodo_descripcion.childNodes[:]:          for nodo_item in nodo_descripcion.childNodes[:]:
263    
264              texto_item=""              texto_item=""
265              for nodo_parrafo in nodo_item.childNodes[:]:              for nodo_parrafo in nodo_item.childNodes[:]:
266                  texto_item += nodo_parrafo.data.encode('ISO-8859-1')                  texto_item += nodo_parrafo.data.encode('ISO-8859-1')
267    
268              texto_item = " ".join(texto_item.split())              texto_item = " ".join(texto_item.split())
269                            
270              if len(nodo_item._attrs) == 0:              if len(nodo_item._attrs) == 0:
271                  dif_item = 0                  dif_item = 0
272              else:              else:
273                  dif_item = int(nodo_item._attrs.get('dificultad').value)                  dif_item = int(nodo_item._attrs.get('dificultad').value)
274                                    
275              self.__descripcion.append({"dificultad":dif_item, "texto":texto_item})              self.__descripcion.append({"dificultad":dif_item, "texto":texto_item})
276    
277                            
278      def __parsear_propiedades(self, doc_xml):        def __parsear_propiedades(self, doc_xml):  
279          """Extrae la información de las propiedades generales: tipo, categoria, peso,          """Extrae la información de las propiedades generales: tipo, categoria, peso,
280          volumen, cargas, valor, estado, aura."""          volumen, cargas, valor, estado, aura."""
281                                    
282          self.__tipo = doc_xml.childNodes[3].attributes["tipo"].value.encode('ISO-8859-1')          self.__tipo = doc_xml.childNodes[3].attributes["tipo"].value.encode('ISO-8859-1')
283          self.__categoria = doc_xml.childNodes[3].attributes["categoria"].value.encode('ISO-8859-1')          self.__categoria = doc_xml.childNodes[3].attributes["categoria"].value.encode('ISO-8859-1')
284          self.__peso = float(doc_xml.childNodes[3].attributes["peso"].value)          self.__peso = float(doc_xml.childNodes[3].attributes["peso"].value)
285          self.__volumen = float(doc_xml.childNodes[3].attributes["volumen"].value)          self.__volumen = float(doc_xml.childNodes[3].attributes["volumen"].value)
286          try:          try:
287              self.__cargas = int(doc_xml.childNodes[3].attributes["cargas"].value)              self.__cargas = int(doc_xml.childNodes[3].attributes["cargas"].value)
288          except:          except:
289              self.__cargas = 1              self.__cargas = 1
290          self.__valor = int(doc_xml.childNodes[3].attributes["valor"].value)          self.__valor = int(doc_xml.childNodes[3].attributes["valor"].value)
291          self.__estado = int(doc_xml.childNodes[3].attributes["estado"].value)          self.__estado = int(doc_xml.childNodes[3].attributes["estado"].value)
292          self.__aura = int(doc_xml.childNodes[3].attributes["aura"].value)          self.__aura = int(doc_xml.childNodes[3].attributes["aura"].value)
293        
294    
295      def __parsear_usos(self, doc_xml):      def __parsear_usos(self, doc_xml):
296          """Extrae toda la información de los usos del objeto."""          """Extrae toda la información de los usos del objeto."""
297                    
298          nodo_usos = doc_xml.childNodes[4]          nodo_usos = doc_xml.childNodes[4]
299                    
300          # Limpiamos todos los subnodos de tipo Text, al igual          # Limpiamos todos los subnodos de tipo Text, al igual
301          # que hacíamos en la función __iniciar_parseador()          # que hacíamos en la función __iniciar_parseador()
302          for nodo in nodo_usos.childNodes[:]:          for nodo in nodo_usos.childNodes[:]:
303              if not 'Element:' in str(nodo).split():              if not 'Element:' in str(nodo).split():
304                  nodo_usos.childNodes.remove(nodo)                  nodo_usos.childNodes.remove(nodo)
305    
306          self.__usos = []          self.__usos = []
307    
308          for nodo_uso in nodo_usos.childNodes[:]:          for nodo_uso in nodo_usos.childNodes[:]:
309    
310              uso_tipo = nodo_uso._attrs.get('tipo').value.encode('ISO-8859-1')              uso_tipo = nodo_uso._attrs.get('tipo').value.encode('ISO-8859-1')
311              try:              try:
312                  uso_posicion = nodo_uso._attrs.get('posicion').value.encode('ISO-8859-1')                  uso_posicion = nodo_uso._attrs.get('posicion').value.encode('ISO-8859-1')
313              except:              except:
314                  uso_posicion = ''                  uso_posicion = ''
315              try:              try:
316                  uso_gasto = int(nodo_uso._attrs.get('gasto').value.encode('ISO-8859-1'))                  uso_gasto = int(nodo_uso._attrs.get('gasto').value.encode('ISO-8859-1'))
317              except:              except:
318                  uso_gasto = 0                  uso_gasto = 0
319              try:              try:
320                  uso_msg = nodo_uso._attrs.get('msg').value.encode('ISO-8859-1')                  uso_msg = nodo_uso._attrs.get('msg').value.encode('ISO-8859-1')
321              except:              except:
322                  if uso_tipo == 'comer':                  if uso_tipo == 'comer':
323                      uso_msg = 'Te comes ' + self.__nombre                      uso_msg = 'Te comes ' + self.__nombre
324                  elif uso_tipo == 'beber':                  elif uso_tipo == 'beber':
325                      uso_msg = 'Bebes ' + self.__nombre                      uso_msg = 'Bebes ' + self.__nombre
326                  elif uso_tipo == 'poner':                  elif uso_tipo == 'poner':
327                      uso_msg = 'Te pones ' + self.__nombre + ' en ' + uso_posicion                      uso_msg = 'Te pones ' + self.__nombre + ' en ' + uso_posicion
328                  elif uso_tipo == 'lanzar':                  elif uso_tipo == 'lanzar':
329                      uso_msg = 'Arrojas ' + self.__nombre                      uso_msg = 'Arrojas ' + self.__nombre
330                  else:                  else:
331                      uso_msg = 'Usas ' + self.__nombre                      uso_msg = 'Usas ' + self.__nombre
332              try:              try:
333                  uso_duracion = int(nodo_uso._attrs.get('duracion').value.encode('ISO-8859-1'))                  uso_duracion = int(nodo_uso._attrs.get('duracion').value.encode('ISO-8859-1'))
334              except:              except:
335                  uso_duracion = 0                  uso_duracion = 0
336                    
337              # Limpiamos todos los subnodos de tipo Text del siguiente              # Limpiamos todos los subnodos de tipo Text del siguiente
338              # nivel del arbol xml              # nivel del arbol xml
339              for nodo in nodo_uso.childNodes[:]:              for nodo in nodo_uso.childNodes[:]:
340                  if not 'Element:' in str(nodo).split():                  if not 'Element:' in str(nodo).split():
341                      nodo_uso.childNodes.remove(nodo)                      nodo_uso.childNodes.remove(nodo)
342    
343              uso_requisitos = []              uso_requisitos = []
344              uso_efectos = []              uso_efectos = []
345    
346              for nodo_requi_efe in nodo_uso.childNodes[:]:              for nodo_requi_efe in nodo_uso.childNodes[:]:
347    
348                  if nodo_requi_efe.nodeName.encode('ISO-8859-1') == 'requisito':                  if nodo_requi_efe.nodeName.encode('ISO-8859-1') == 'requisito':
349    
350                      requisito_atrib = nodo_requi_efe._attrs.get('atributo').value.encode('ISO-8859-1')                      requisito_atrib = nodo_requi_efe._attrs.get('atributo').value.encode('ISO-8859-1')
351                      requisito_valor = int(nodo_requi_efe._attrs.get('valor').value.encode('ISO-8859-1'))                      requisito_valor = int(nodo_requi_efe._attrs.get('valor').value.encode('ISO-8859-1'))
352                      try:                      try:
353                          requisito_msg = nodo_requi_efe._attrs.get('msg').value.encode('ISO-8859-1')                          requisito_msg = nodo_requi_efe._attrs.get('msg').value.encode('ISO-8859-1')
354                      except:                      except:
355                          requisito_msg = 'No tienes suficiente ' + requisito_atrib                          requisito_msg = 'No tienes suficiente ' + requisito_atrib
356                      uso_requisitos.append( {"atributo":requisito_atrib,                      uso_requisitos.append( {"atributo":requisito_atrib,
357                                              "valor":requisito_valor,                                              "valor":requisito_valor,
358                                              "msg":requisito_msg} )                                              "msg":requisito_msg} )
359    
360                  else:                  else:
361    
362                      efecto_atrib = nodo_requi_efe._attrs.get('atributo').value.encode('ISO-8859-1')                      efecto_atrib = nodo_requi_efe._attrs.get('atributo').value.encode('ISO-8859-1')
363                      efecto_valor = int(nodo_requi_efe._attrs.get('valor').value.encode('ISO-8859-1'))                      efecto_valor = int(nodo_requi_efe._attrs.get('valor').value.encode('ISO-8859-1'))
364                      try:                      try:
365                          efecto_msg = nodo_requi_efe._attrs.get('msg').value.encode('ISO-8859-1')                          efecto_msg = nodo_requi_efe._attrs.get('msg').value.encode('ISO-8859-1')
366                      except:                      except:
367                          efecto_msg = ""                          efecto_msg = ""
368                      uso_efectos.append( {"atributo":efecto_atrib,                      uso_efectos.append( {"atributo":efecto_atrib,
369                                           "valor":efecto_valor,                                           "valor":efecto_valor,
370                                           "msg":efecto_msg} )                                           "msg":efecto_msg} )
371    
372              self.__usos.append( {"tipo":uso_tipo,              self.__usos.append( {"tipo":uso_tipo,
373                                   "posicion":uso_posicion,                                   "posicion":uso_posicion,
374                                   "gasto":uso_gasto,                                   "gasto":uso_gasto,
375                                   "msg":uso_msg,                                   "msg":uso_msg,
376                                   "duracion":uso_duracion,                                   "duracion":uso_duracion,
377                                   "requisitos":uso_requisitos,                                   "requisitos":uso_requisitos,
378                                   "efectos":uso_efectos} )                                   "efectos":uso_efectos} )
379    
380    
381      def activar(self):      def activar(self):
382          """Realiza algunos chequeos periodicos de integridad del objeto.          """Realiza algunos chequeos periodicos de integridad del objeto.
383          Los chequeos se pueden hacer, por ejemplo, al coger el objeto.          Los chequeos se pueden hacer, por ejemplo, al coger el objeto.
384          """          """
385          archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS)          archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS)
386          if self.__fecha_fichero < os.path.getmtime(archivo):          if self.__fecha_fichero < os.path.getmtime(archivo):
387              # Si se modifica el fichero descriptor, recargarlo de nuevo              # Si se modifica el fichero descriptor, recargarlo de nuevo
388              # reseteando completamente el objeto              # reseteando completamente el objeto
389              escribir("Recargando objeto " + self.__id + " desde el fichero de descripcion")              escribir("Recargando objeto " + self.__id + " desde el fichero de descripcion")
390              self.__inicializar_objeto()              self.__inicializar_objeto()
391    
392    
393      def __setstate__(self, atributos):      def __setstate__(self, atributos):
394          """Método llamado para restaurar los atributos provinientes de un pickle."""          """Método llamado para restaurar los atributos provinientes de un pickle."""
395    
396          self.__dict__ = atributos          self.__dict__ = atributos
397    
398          # Verificar la versión.          # Verificar la versión.
399          if not self.__dict__.has_key("_Objeto__version"):          if not self.__dict__.has_key("_Objeto__version"):
400              escribir("Cargado objeto " + self.id + " obsoleto: sin versión," +              escribir("Cargado objeto " + self.id + " obsoleto: sin versión," +
401                       " cuando se esperaba " + Objeto.VERSION_OBJETO + ". Reseteando objeto.")                       " cuando se esperaba " + Objeto.VERSION_OBJETO + ". Reseteando objeto.")
402              if atributos.has_key('id'):              if atributos.has_key('id'):
403                  self.__dict__ = {'_Objeto__id':atributos['id']}                  self.__dict__ = {'_Objeto__id':atributos['id']}
404              else:              else:
405                  self.__dict__ = {'_Objeto__id':atributos['_Objeto__id']}                  self.__dict__ = {'_Objeto__id':atributos['_Objeto__id']}
406              self.__inicializar_objeto()              self.__inicializar_objeto()
407    
408          assert(Objeto.VERSION_OBJETO == "1.0")          assert(Objeto.VERSION_OBJETO == "1.0")
409                    
410          if self.__version != "1.0":          if self.__version != "1.0":
411              escribir("Cargado objeto " + self.__id + " con versión desconocida: " +              escribir("Cargado objeto " + self.__id + " con versión desconocida: " +
412                       self.__version + ", cuando se esperaba " + Objeto.VERSION_OBJETO +                       self.__version + ", cuando se esperaba " + Objeto.VERSION_OBJETO +
413                       ". Reseteando objeto.")                       ". Reseteando objeto.")
414              if atributos.has_key('id'):              if atributos.has_key('id'):
415                  self.__dict__ = {'_Objeto__id':atributos['id']}                  self.__dict__ = {'_Objeto__id':atributos['id']}
416              else:              else:
417                  self.__dict__ = {'_Objeto__id':atributos['_Objeto__id']}                  self.__dict__ = {'_Objeto__id':atributos['_Objeto__id']}
418              self.__inicializar_objeto()              self.__inicializar_objeto()
419    
420                            
421                    
422  # Código para pruebas unitarias del módulo.  # Código para pruebas unitarias del módulo.
423    
424  if (__name__ == '__main__'):  if (__name__ == '__main__'):
425      print "No hay prueba unitaria de módulo. prueba con objetotester.py"      print "No hay prueba unitaria de módulo. prueba con objetotester.py"

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

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