37 |
from interfazpnj import * |
from interfazpnj import * |
38 |
|
|
39 |
|
|
|
|
|
40 |
class Objeto(object): |
class Objeto(object): |
41 |
"""Un objeto dentro del juego. |
"""Un objeto dentro del juego. |
|
|
|
|
Contiene los siguientes atributos: |
|
|
- __id (string): identifica univocamente al objeto. No puede contener espacios. |
|
|
- __version (int): la versión del sistema de objetos. |
|
|
- __autor (string): identifica al autor del objeto. |
|
|
- __comentario (string): un metacomentario acerca del objeto. |
|
|
- __area (string): el area a la que pertenece el objeto, si es que lo necesita. |
|
|
- __nombre (string): Una breve frase informando de qué es el objeto. |
|
|
- __descripcion ({String:any}[]): una lista de diccionarios que contiene cada uno: |
|
|
- "dificultad" (int): de 1 a 100 |
|
|
- "texto" (string): el contenido del item de descripcion |
|
|
- __tipo (string): el tipo de material del objeto. |
|
|
- __categoria (string): el tipo de uso generico del objeto. |
|
|
- __peso (float): en kilos |
|
|
- __volumen (float): en relación a 1 unidad de persona. |
|
|
- __cargas (int): el número de veces que puede ser usado antes de destruirse o |
|
|
volverse inservible. El valor 0 indica que no tiene limite. |
|
|
- __valor (int): en monedas de estaño. |
|
|
- __estado (int): de 0 a 100. |
|
|
- __aura (int): de 0 a 100 |
|
|
- __usos ({string:any}[]): lista de usos del objeto, siendo cada uso un diccionario: |
|
|
- "tipo" (string): el tipo de uso ("comer", "poner", "lanzar", etc.) |
|
|
- "posicion" (string): si el uso es "poner", en que parte del cuerpo se pone |
|
|
- "gasto" (int): el numero de cargas que consume cada uso |
|
|
- "msg" (string): el mensaje que aparece cuando se usa |
|
|
- "duracion" (int): el numero de segundos que dura el efecto (0 = indeterminado) |
|
|
- "requisitos" ({string:any}[]): lista de requisitos del uso, siendo cada requisito |
|
|
un diccionario: |
|
|
- "atributo" (string): el atributo a comprobar |
|
|
- "valor" (int): el valor mínimo que deberá tener el atributo |
|
|
- "msg" (string): el mensaje que sale si el atributo no llega al mínimo |
|
|
- "efectos" ({string:any}[]): lista de efectos que produce el uso, siendo cada |
|
|
efecto un diccionario: |
|
|
- "atributo" (string): el atributo a modificar |
|
|
- "valor" (int): el número de puntos que sube o baja (si es negativo) |
|
|
- "duracion" (int): duración del efecto en segundos (0 = ilimitado) |
|
|
- "msg" (string): el mensaje que sale cuando ocurre el efecto |
|
|
- __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripcion |
|
42 |
|
|
43 |
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, |
44 |
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 |
45 |
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. |
|
|
|
|
Invariantes: |
|
|
__id != None |
|
|
__version != None |
|
|
__autor != None |
|
|
__comentario != None |
|
|
__area != None |
|
|
__nombre != None |
|
|
__tipo != None |
|
|
__categoria != None |
|
|
__peso > 0 |
|
|
__volumen > 0 |
|
|
__cargas >= 0 |
|
|
__valor > 0 |
|
|
__estado in range(0,100) |
|
|
__aura in range(0,100) |
|
|
|
|
|
__tipo in TIPOS_DE_MATERIAL |
|
|
__categoria in CATEGORIAS |
|
|
|
|
|
__descripcion != None |
|
|
len(__descripcion) >= 0 |
|
|
__descripcion[i]["dificultad"] in range(0,100) |
|
|
__descripcion[i]["texto"] != None |
|
|
|
|
|
__usos != None |
|
|
len(__usos) >= 0 |
|
|
__usos[i]["tipo"] in USOS |
|
|
__usos[i]["posicion"] in POSICIONES |
|
|
__usos[i]["gasto"] >= 0 |
|
|
__usos[i]["msg"] != None |
|
|
__usos[i]["duracion"] >= 0 |
|
|
__usos[i]["requisitos"] != None |
|
|
__usos[i]["requisitos"][j]["atributo"] != None |
|
|
__usos[i]["requisitos"][j]["valor"] in range(0,100) |
|
|
__usos[i]["requisitos"][j]["msg"] != None |
|
|
__usos[i]["efectos"] != None |
|
|
__usos[i]["efectos"][k]["atributo"] != None |
|
|
__usos[i]["efectos"][k]["duracion"] >= 0 |
|
|
__usos[i]["efectos"][k]["msg"] != None |
|
|
|
|
|
__fecha_fichero >= 0 |
|
46 |
""" |
""" |
47 |
|
|
48 |
# 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 |
69 |
'pie-izq', 'pie-der' ] |
'pie-izq', 'pie-der' ] |
70 |
|
|
71 |
|
|
72 |
|
# Atributos públicos de la clase |
73 |
|
|
74 |
|
def __leer_id(self): return self.__id |
75 |
|
|
76 |
|
id = property(__leer_id, |
77 |
|
doc="""(string): identifica univocamente al objeto. |
78 |
|
|
79 |
|
No puede contener espacios. |
80 |
|
|
81 |
|
Invariantes: |
82 |
|
id != None |
83 |
|
""") |
84 |
|
|
85 |
|
def __leer_version(self): return self.__version |
86 |
|
|
87 |
|
version = property(__leer_version, |
88 |
|
doc="""(int): la versión del sistema de objetos. |
89 |
|
|
90 |
|
Invariantes: |
91 |
|
version != None |
92 |
|
""") |
93 |
|
|
94 |
|
def __leer_autor(self): return self.__autor |
95 |
|
|
96 |
|
autor = property(__leer_autor, |
97 |
|
doc="""autor (string): identifica al autor del objeto. |
98 |
|
|
99 |
|
Invariantes: |
100 |
|
autor != None |
101 |
|
""") |
102 |
|
|
103 |
|
def __leer_comentario(self): return self.__comentario |
104 |
|
|
105 |
|
comentario = property(__leer_comentario, |
106 |
|
doc="""(string): un metacomentario acerca del objeto. |
107 |
|
|
108 |
|
Invariantes: |
109 |
|
comentario != None |
110 |
|
""") |
111 |
|
|
112 |
|
def __leer_area(self): return self.__area |
113 |
|
|
114 |
|
area = property(__leer_area, |
115 |
|
doc="""(string): el area a la que pertenece el objeto, si es que lo necesita. |
116 |
|
|
117 |
|
Invariantes: |
118 |
|
area != None |
119 |
|
""") |
120 |
|
|
121 |
|
def __leer_nombre(self): return self.__nombre |
122 |
|
|
123 |
|
nombre = property(__leer_nombre, |
124 |
|
doc="""(string): Una breve frase informando de qué es el objeto. |
125 |
|
|
126 |
|
Invariantes: |
127 |
|
nombre != None |
128 |
|
""") |
129 |
|
|
130 |
|
def __leer_descripcion(self): return self.__descripcion |
131 |
|
|
132 |
|
descripcion = property(__leer_descripcion, |
133 |
|
doc="""({String:any}[]): descripción del objeto. |
134 |
|
|
135 |
|
Es una lista de diccionarios, conteniendo cada uno: |
136 |
|
- "dificultad" (int): de 1 a 100 |
137 |
|
- "texto" (string): el contenido del item de descripcion |
138 |
|
|
139 |
|
Invariantes: |
140 |
|
descripcion != None |
141 |
|
len(descripcion) >= 0 |
142 |
|
descripcion[i]["dificultad"] in range(0,100) |
143 |
|
descripcion[i]["texto"] != None |
144 |
|
""") |
145 |
|
|
146 |
|
def __leer_tipo(self): return self.__tipo |
147 |
|
|
148 |
|
tipo = property(__leer_tipo, |
149 |
|
doc="""(string): el tipo de material del objeto. |
150 |
|
|
151 |
|
Invariantes: |
152 |
|
tipo != None |
153 |
|
tipo in TIPOS_DE_MATERIAL |
154 |
|
""") |
155 |
|
|
156 |
|
def __leer_categoria(self): return self.__categoria |
157 |
|
|
158 |
|
categoria = property(__leer_categoria, |
159 |
|
doc="""(string): el tipo de uso generico del objeto. |
160 |
|
|
161 |
|
Invariantes: |
162 |
|
categoria != None |
163 |
|
categoria in CATEGORIAS |
164 |
|
""") |
165 |
|
|
166 |
|
def __leer_peso(self): return self.__peso |
167 |
|
|
168 |
|
peso = property(__leer_peso, |
169 |
|
doc="""(float): peso en kilos. |
170 |
|
|
171 |
|
Invariantes: |
172 |
|
peso > 0 |
173 |
|
""") |
174 |
|
|
175 |
|
def __leer_volumen(self): return self.__volumen |
176 |
|
|
177 |
|
volumen = property(__leer_volumen, |
178 |
|
doc="""(float): volumen en relación a 1 unidad de persona. |
179 |
|
|
180 |
|
Invariantes: |
181 |
|
volumen > 0 |
182 |
|
""") |
183 |
|
|
184 |
|
def __leer_cargas(self): return self.__cargas |
185 |
|
|
186 |
|
cargas = property(__leer_cargas, |
187 |
|
doc="""(int): el número de veces que puede ser usado antes de destruirse o |
188 |
|
volverse inservible. El valor 0 indica que no tiene limite. |
189 |
|
|
190 |
|
Invariantes: |
191 |
|
cargas >= 0 |
192 |
|
""") |
193 |
|
|
194 |
|
def __leer_valor(self): return self.__valor |
195 |
|
|
196 |
|
valor = property(__leer_valor, |
197 |
|
doc="""(int): en monedas de estaño. |
198 |
|
|
199 |
|
Invariantes: |
200 |
|
valor > 0 |
201 |
|
""") |
202 |
|
|
203 |
|
def __leer_estado(self): return self.__estado |
204 |
|
|
205 |
|
estado = property(__leer_estado, |
206 |
|
doc="""(int): de 0 a 100. |
207 |
|
|
208 |
|
Invariantes: |
209 |
|
estado in range(0,100) |
210 |
|
""") |
211 |
|
|
212 |
|
def __leer_aura(self): return self.__aura |
213 |
|
|
214 |
|
aura = property(__leer_aura, |
215 |
|
doc="""(int): de 0 a 100. |
216 |
|
|
217 |
|
Invariantes: |
218 |
|
aura in range(0,100) |
219 |
|
""") |
220 |
|
|
221 |
|
def __leer_usos(self): return self.__usos |
222 |
|
|
223 |
|
usos = property(__leer_usos, |
224 |
|
doc="""({string:any}[]): lista de usos del objeto. |
225 |
|
|
226 |
|
Cada uso es un diccionario: |
227 |
|
- "tipo" (string): el tipo de uso ("comer", "poner", "lanzar", etc.) |
228 |
|
- "posicion" (string): si el uso es "poner", en que parte del cuerpo se pone |
229 |
|
- "gasto" (int): el numero de cargas que consume cada uso |
230 |
|
- "msg" (string): el mensaje que aparece cuando se usa |
231 |
|
- "duracion" (int): el numero de segundos que dura el efecto (0 = indeterminado) |
232 |
|
- "requisitos" ({string:any}[]): lista de requisitos del uso, siendo cada requisito |
233 |
|
un diccionario: |
234 |
|
- "atributo" (string): el atributo a comprobar |
235 |
|
- "valor" (int): el valor mínimo que deberá tener el atributo |
236 |
|
- "msg" (string): el mensaje que sale si el atributo no llega al mínimo |
237 |
|
- "efectos" ({string:any}[]): lista de efectos que produce el uso, siendo cada |
238 |
|
efecto un diccionario: |
239 |
|
- "atributo" (string): el atributo a modificar |
240 |
|
- "valor" (int): el número de puntos que sube o baja (si es negativo) |
241 |
|
- "duracion" (int): duración del efecto en segundos (0 = ilimitado) |
242 |
|
- "msg" (string): el mensaje que sale cuando ocurre el efecto |
243 |
|
|
244 |
|
Invariantes: |
245 |
|
usos != None |
246 |
|
len(usos) >= 0 |
247 |
|
usos[i]["tipo"] in USOS |
248 |
|
usos[i]["posicion"] in POSICIONES |
249 |
|
usos[i]["gasto"] >= 0 |
250 |
|
usos[i]["msg"] != None |
251 |
|
usos[i]["duracion"] >= 0 |
252 |
|
usos[i]["requisitos"] != None |
253 |
|
usos[i]["requisitos"][j]["atributo"] != None |
254 |
|
usos[i]["requisitos"][j]["valor"] in range(0,100) |
255 |
|
usos[i]["requisitos"][j]["msg"] != None |
256 |
|
usos[i]["efectos"] != None |
257 |
|
usos[i]["efectos"][k]["atributo"] != None |
258 |
|
usos[i]["efectos"][k]["duracion"] >= 0 |
259 |
|
usos[i]["efectos"][k]["msg"] != None |
260 |
|
""") |
261 |
|
|
262 |
|
# Constructor |
263 |
|
|
264 |
def __init__(self, id): |
def __init__(self, id): |
265 |
"""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. |
266 |
|
|
269 |
id corresponde con un fichero existente |
id corresponde con un fichero existente |
270 |
""" |
""" |
271 |
|
|
272 |
|
# Atributos privados: |
273 |
|
# |
274 |
|
# __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripción |
275 |
|
# |
276 |
|
# Invariantes: |
277 |
|
# __fecha_fichero >= 0 |
278 |
|
|
279 |
self.__id = id |
self.__id = id |
280 |
self.__inicializar_objeto() |
self.__inicializar_objeto() |
281 |
|
|
282 |
|
|
|
def id(self): return self.__id |
|
|
def version(self): return self.__version |
|
|
def autor(self): return self.__autor |
|
|
def comentario(self): return self.__comentario |
|
|
def area(self): return self.__area |
|
|
def nombre(self): return self.__nombre |
|
|
def descripcion(self): return self.__descripcion |
|
|
def tipo(self): return self.__tipo |
|
|
def categoria(self): return self.__categoria |
|
|
def peso(self): return self.__peso |
|
|
def volumen(self): return self.__volumen |
|
|
def cargas(self): return self.__cargas |
|
|
def valor(self): return self.__valor |
|
|
def estado(self): return self.__estado |
|
|
def aura(self): return self.__aura |
|
|
def usos(self): return self.__usos |
|
|
|
|
|
|
|
283 |
def __inicializar_objeto(self): |
def __inicializar_objeto(self): |
284 |
"""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.""" |
285 |
|
|
476 |
"requisitos":uso_requisitos, |
"requisitos":uso_requisitos, |
477 |
"efectos":uso_efectos} ) |
"efectos":uso_efectos} ) |
478 |
|
|
479 |
|
# Métodos especiales |
|
def activar(self): |
|
|
"""Realiza algunos chequeos periodicos de integridad del objeto. |
|
|
Los chequeos se pueden hacer, por ejemplo, al coger el objeto. |
|
|
""" |
|
|
archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS) |
|
|
if self.__fecha_fichero < os.path.getmtime(archivo): |
|
|
# Si se modifica el fichero descriptor, recargarlo de nuevo |
|
|
# reseteando completamente el objeto |
|
|
escribir("Recargando objeto " + self.__id + " desde el fichero de descripcion") |
|
|
self.__inicializar_objeto() |
|
|
|
|
480 |
|
|
481 |
def __setstate__(self, atributos): |
def __setstate__(self, atributos): |
482 |
"""Método llamado para restaurar los atributos provinientes de un pickle.""" |
"""Método llamado para restaurar los atributos provinientes de un pickle.""" |
498 |
|
|
499 |
escribir("Cargado objeto " + self.__id + " con versión desconocida: " + |
escribir("Cargado objeto " + self.__id + " con versión desconocida: " + |
500 |
self.__version + ", cuando se esperaba " + Objeto.VERSION_OBJETO) |
self.__version + ", cuando se esperaba " + Objeto.VERSION_OBJETO) |
501 |
|
|
502 |
|
|
503 |
|
# Métodos normales |
504 |
|
|
505 |
|
def activar(self): |
506 |
|
"""Realiza algunos chequeos periodicos de integridad del objeto. |
507 |
|
Los chequeos se pueden hacer, por ejemplo, al coger el objeto. |
508 |
|
""" |
509 |
|
archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS) |
510 |
|
if self.__fecha_fichero < os.path.getmtime(archivo): |
511 |
|
# Si se modifica el fichero descriptor, recargarlo de nuevo |
512 |
|
# reseteando completamente el objeto |
513 |
|
escribir("Recargando objeto " + self.__id + " desde el fichero de descripcion") |
514 |
|
self.__inicializar_objeto() |
515 |
|
|
516 |
|
|
517 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |
518 |
|
|