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" |