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: interfazpnj.py |
#Fichero: interfazpnj.py |
23 |
|
|
24 |
"""Clase InterfazPNJ.""" |
"""Clase InterfazPNJ.""" |
25 |
|
|
26 |
from controlador import * |
from controlador import * |
27 |
from personaje import * |
from personaje import * |
28 |
from personajejugador import * |
from personajejugador import * |
29 |
from personajenojugador import * |
from personajenojugador import * |
30 |
from sala import * |
from sala import * |
31 |
from utils import * |
from utils import * |
32 |
from cronomine import * |
from cronomine import * |
33 |
|
|
34 |
|
|
35 |
class InterfazPNJ(Controlador): |
class InterfazPNJ(Controlador): |
36 |
"""Interfaz controla directamente a una instancia de clase PersonajeNoJugador. |
"""Interfaz controla directamente a una instancia de clase PersonajeNoJugador. |
37 |
|
|
38 |
El control es automático, no necesita intervención de ningún jugador. De momento |
El control es automático, no necesita intervención de ningún jugador. De momento |
39 |
es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque. |
es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque. |
40 |
|
|
41 |
La clase funciona como una maquina de estados, que acepta los eventos de |
La clase funciona como una maquina de estados, que acepta los eventos de |
42 |
Controlador, y reacciona apropiadamente en cada caso. |
Controlador, y reacciona apropiadamente en cada caso. |
43 |
|
|
44 |
Contiene los siguientes atributos: |
Contiene los siguientes atributos: |
45 |
|
|
46 |
- __personaje (Personaje): el personaje que controlamos |
- __personaje (Personaje): el personaje que controlamos |
47 |
- __estado (string): el estado en el que se encuentra el interfaz |
- __estado (string): el estado en el que se encuentra el interfaz |
48 |
- __sub_estado (int): algunos estados tienen fases intermedias. Si no, None. |
- __sub_estado (int): algunos estados tienen fases intermedias. Si no, None. |
49 |
- __crono (CronoMine): cronometro usado opcionalmente |
- __crono (CronoMine): cronometro usado opcionalmente |
50 |
- __oponente (Personaje): otro personaje con quien el nuestro está combatiendo |
- __oponente (Personaje): otro personaje con quien el nuestro está combatiendo |
51 |
|
|
52 |
Los siguientes atributos provocan ajustes automáticos al ser modificados: |
Los siguientes atributos provocan ajustes automáticos al ser modificados: |
53 |
|
|
54 |
- __personaje: se modifica también al personaje para que tenga a este interfaz como |
- __personaje: se modifica también al personaje para que tenga a este interfaz como |
55 |
controlador |
controlador |
56 |
""" |
""" |
57 |
|
|
58 |
|
|
59 |
def __init__(self): |
def __init__(self): |
60 |
"""Crea un interfaz nuevo para un personaje recien creado o cargado de disco.""" |
"""Crea un interfaz nuevo para un personaje recien creado o cargado de disco.""" |
61 |
self.__personaje = None |
self.__personaje = None |
62 |
self.__estado = "" |
self.__estado = "" |
63 |
self.__sub_estado = None |
self.__sub_estado = None |
64 |
self.__crono = None |
self.__crono = None |
65 |
self.__oponente = None |
self.__oponente = None |
66 |
self.estado_normal() |
self.estado_normal() |
67 |
|
|
68 |
|
|
69 |
def __del__(self): |
def __del__(self): |
70 |
"""Realiza ajustes automáticos al ser destruido""" |
"""Realiza ajustes automáticos al ser destruido""" |
71 |
if self.__personaje != None: |
if self.__personaje != None: |
72 |
self.liberar_personaje() |
self.liberar_personaje() |
73 |
|
|
74 |
|
|
75 |
def personaje(self): |
def personaje(self): |
76 |
return self.__personaje |
return self.__personaje |
77 |
|
|
78 |
|
|
79 |
def controlar_personaje(self, personaje): |
def controlar_personaje(self, personaje): |
80 |
"""Pasar a estar controlando un personaje. |
"""Pasar a estar controlando un personaje. |
81 |
|
|
82 |
Requiere: |
Requiere: |
83 |
self.__personaje == None |
self.__personaje == None |
84 |
personaje != None |
personaje != None |
85 |
""" |
""" |
86 |
self.__personaje = personaje |
self.__personaje = personaje |
87 |
self.__personaje.controlar(self) |
self.__personaje.controlar(self) |
88 |
|
|
89 |
|
|
90 |
def liberar_personaje(self): |
def liberar_personaje(self): |
91 |
"""Soltar al personaje actual y dejarlo libre. |
"""Soltar al personaje actual y dejarlo libre. |
92 |
|
|
93 |
Requiere: |
Requiere: |
94 |
self.__personaje != None |
self.__personaje != None |
95 |
""" |
""" |
96 |
self.__personaje.liberar() |
self.__personaje.liberar() |
97 |
self.__personaje = None |
self.__personaje = None |
98 |
|
|
99 |
|
|
100 |
# ------------------------------------------------- |
# ------------------------------------------------- |
101 |
# Metodos de manejo de eventos (ver controlador.py) |
# Metodos de manejo de eventos (ver controlador.py) |
102 |
# ------------------------------------------------- |
# ------------------------------------------------- |
103 |
|
|
104 |
def entra_personaje(self, personaje): |
def entra_personaje(self, personaje): |
105 |
pass # algún día se puede hacer que el PNJ salude o amenace |
pass # algún día se puede hacer que el PNJ salude o amenace |
106 |
|
|
107 |
|
|
108 |
def sale_personaje(self, personaje, nombre_sala_destino): |
def sale_personaje(self, personaje, nombre_sala_destino): |
109 |
pass # a lo mejor se puede hacer que se despida |
pass # a lo mejor se puede hacer que se despida |
110 |
|
|
111 |
|
|
112 |
def habla_personaje(self, personaje, mensaje): |
def habla_personaje(self, personaje, mensaje): |
113 |
pass # se podría hacer que los PNJ entiendan conversaciones |
pass # se podría hacer que los PNJ entiendan conversaciones |
114 |
|
|
115 |
|
|
116 |
def susurra_personaje(self, personaje, mensaje): |
def susurra_personaje(self, personaje, mensaje): |
117 |
pass # se podría hacer que los PNJ entiendan conversaciones |
pass # se podría hacer que los PNJ entiendan conversaciones |
118 |
|
|
119 |
|
|
120 |
def grita_personaje(self, personaje, mensaje): |
def grita_personaje(self, personaje, mensaje): |
121 |
pass # id |
pass # id |
122 |
|
|
123 |
|
|
124 |
def actua_personaje(self, personaje, accion): |
def actua_personaje(self, personaje, accion): |
125 |
pass # se podría hacer que los PNJ reaccionen a acciones |
pass # se podría hacer que los PNJ reaccionen a acciones |
126 |
|
|
127 |
|
|
128 |
def actua_individual_personaje(self, personaje, accion): |
def actua_individual_personaje(self, personaje, accion): |
129 |
pass # id |
pass # id |
130 |
|
|
131 |
|
|
132 |
def actua_uno_mismo(self, accion): |
def actua_uno_mismo(self, accion): |
133 |
pass # aqui no se me ocurre nada |
pass # aqui no se me ocurre nada |
134 |
|
|
135 |
|
|
136 |
def actua_global_personaje(self, personaje, accion): |
def actua_global_personaje(self, personaje, accion): |
137 |
pass # se podría hacer que los PNJ reaccionen a acciones |
pass # se podría hacer que los PNJ reaccionen a acciones |
138 |
|
|
139 |
|
|
140 |
def suceso_entorno(self, mensaje): |
def suceso_entorno(self, mensaje): |
141 |
pass # aqui tampoco se me ocurre nada, en principio |
pass # aqui tampoco se me ocurre nada, en principio |
142 |
|
|
143 |
|
|
144 |
def ataca_personaje(self, personaje, result): |
def ataca_personaje(self, personaje, result): |
145 |
pass |
pass |
146 |
#%% funciones de combate desactivadas |
#%% funciones de combate desactivadas |
147 |
#%% # Llamar a la función correspondiente según estado |
#%% # Llamar a la función correspondiente según estado |
148 |
#%% nombre_func = "ataque_" + self.estado |
#%% nombre_func = "ataque_" + self.estado |
149 |
#%% if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
#%% if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
150 |
#%% |
#%% |
151 |
#%% func = getattr(self, nombre_func, None) |
#%% func = getattr(self, nombre_func, None) |
152 |
#%% if func == None: |
#%% if func == None: |
153 |
#%% print "ERROR: recibido ataque en estado " + self.estado + \ |
#%% print "ERROR: recibido ataque en estado " + self.estado + \ |
154 |
#%% ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
#%% ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
155 |
#%% ((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
#%% ((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
156 |
#%% else: |
#%% else: |
157 |
#%% func(personaje, result) |
#%% func(personaje, result) |
158 |
|
|
159 |
|
|
160 |
def lanzar_crono(self, segundos_vencimiento): |
def lanzar_crono(self, segundos_vencimiento): |
161 |
"""Lanza un cronometro que vence al cabo del numero de segundos indicado. |
"""Lanza un cronometro que vence al cabo del numero de segundos indicado. |
162 |
|
|
163 |
Se admiten decimales. |
Se admiten decimales. |
164 |
""" |
""" |
165 |
from mundo import Mundo |
from mundo import Mundo |
166 |
if self.crono != None: self.crono.parar() |
if self.crono != None: self.crono.parar() |
167 |
self.crono = CronoMine(Mundo.cronoMine_control, |
self.crono = CronoMine(Mundo.cronoMine_control, |
168 |
FechaHoraMineRel(segundos=segundos_vencimiento), |
FechaHoraMineRel(segundos=segundos_vencimiento), |
169 |
self.vencimiento) |
self.vencimiento) |
170 |
|
|
171 |
|
|
172 |
def vencimiento(self, crono): |
def vencimiento(self, crono): |
173 |
"""Metodo llamado cuando vence el cronometro.""" |
"""Metodo llamado cuando vence el cronometro.""" |
174 |
|
|
175 |
self.crono = None |
self.crono = None |
176 |
|
|
177 |
# Llamar a la función correspondiente según estado |
# Llamar a la función correspondiente según estado |
178 |
nombre_func = "vencimiento_" + self.estado |
nombre_func = "vencimiento_" + self.estado |
179 |
if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
180 |
|
|
181 |
func = getattr(self, nombre_func, None) |
func = getattr(self, nombre_func, None) |
182 |
if func == None: |
if func == None: |
183 |
print "ERROR: recibido vencimiento en estado " + self.estado + \ |
print "ERROR: recibido vencimiento en estado " + self.estado + \ |
184 |
((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
185 |
((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
186 |
else: |
else: |
187 |
func() |
func() |
188 |
|
|
189 |
|
|
190 |
# ------------- |
# ------------- |
191 |
# ESTADO NORMAL |
# ESTADO NORMAL |
192 |
# ------------- |
# ------------- |
193 |
|
|
194 |
|
|
195 |
def estado_normal(self): |
def estado_normal(self): |
196 |
self.estado = "normal" |
self.estado = "normal" |
197 |
self.sub_estado = None |
self.sub_estado = None |
198 |
|
|
199 |
|
|
200 |
#%% funciones de combate desactivadas |
#%% funciones de combate desactivadas |
201 |
#%% def ataque_normal(self, personaje, result): |
#%% def ataque_normal(self, personaje, result): |
202 |
#%% # Al recibir un ataque, pasamos inmediantamente a estado combate |
#%% # Al recibir un ataque, pasamos inmediantamente a estado combate |
203 |
#%% |
#%% |
204 |
#%% self.oponente = personaje |
#%% self.oponente = personaje |
205 |
#%% self.cbt_empieza_combate_defiendes() |
#%% self.cbt_empieza_combate_defiendes() |
206 |
#%% self.cbt_te_pegan(result) |
#%% self.cbt_te_pegan(result) |
207 |
#%% |
#%% |
208 |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
209 |
#%% self.cbt_termina_combate() |
#%% self.cbt_termina_combate() |
210 |
#%% self.estado_normal() |
#%% self.estado_normal() |
211 |
#%% else: |
#%% else: |
212 |
#%% # Al poner un crono de 3 segundos, el combate funciona como |
#%% # Al poner un crono de 3 segundos, el combate funciona como |
213 |
#%% # una sucesion de golpes alternados cada 3 segundos. |
#%% # una sucesion de golpes alternados cada 3 segundos. |
214 |
#%% self.lanzar_crono(3) |
#%% self.lanzar_crono(3) |
215 |
#%% self.estado_combate() |
#%% self.estado_combate() |
216 |
#%% |
#%% |
217 |
#%% |
#%% |
218 |
#%% # -------------- |
#%% # -------------- |
219 |
#%% # ESTADO COMBATE |
#%% # ESTADO COMBATE |
220 |
#%% # -------------- |
#%% # -------------- |
221 |
#%% |
#%% |
222 |
#%% |
#%% |
223 |
#%% def estado_combate(self): |
#%% def estado_combate(self): |
224 |
#%% self.estado = "combate" |
#%% self.estado = "combate" |
225 |
#%% self.sub_estado = None |
#%% self.sub_estado = None |
226 |
#%% |
#%% |
227 |
#%% |
#%% |
228 |
#%% def ataque_combate(self, oponente, result): |
#%% def ataque_combate(self, oponente, result): |
229 |
#%% self.cbt_te_pegan(result) |
#%% self.cbt_te_pegan(result) |
230 |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
231 |
#%% self.cbt_termina_combate() |
#%% self.cbt_termina_combate() |
232 |
#%% self.estado_normal() |
#%% self.estado_normal() |
233 |
#%% else: |
#%% else: |
234 |
#%% self.estado_combate() |
#%% self.estado_combate() |
235 |
#%% |
#%% |
236 |
#%% |
#%% |
237 |
#%% def vencimiento_combate(self): |
#%% def vencimiento_combate(self): |
238 |
#%% self.cbt_pegar() |
#%% self.cbt_pegar() |
239 |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
240 |
#%% self.cbt_termina_combate() |
#%% self.cbt_termina_combate() |
241 |
#%% self.estado_normal() |
#%% self.estado_normal() |
242 |
#%% else: |
#%% else: |
243 |
#%% self.lanzar_crono(6) |
#%% self.lanzar_crono(6) |
244 |
#%% self.estado_combate() |
#%% self.estado_combate() |
245 |
#%% |
#%% |
246 |
#%% |
#%% |
247 |
#%% def cbt_empieza_combate_defiendes(self): |
#%% def cbt_empieza_combate_defiendes(self): |
248 |
#%% pass |
#%% pass |
249 |
#%% |
#%% |
250 |
#%% |
#%% |
251 |
#%% def cbt_pegar(self): |
#%% def cbt_pegar(self): |
252 |
#%% self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre + |
#%% self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre + |
253 |
#%% " ataca a " + self.oponente.nombre + finl) |
#%% " ataca a " + self.oponente.nombre + finl) |
254 |
#%% |
#%% |
255 |
#%% result = self.personaje.ataque_fisico(self.oponente) |
#%% result = self.personaje.ataque_fisico(self.oponente) |
256 |
#%% |
#%% |
257 |
#%% if result == Personaje.ATAQUE_EXITO: |
#%% if result == Personaje.ATAQUE_EXITO: |
258 |
#%% self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear") |
#%% self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear") |
259 |
#%% elif result == Personaje.ATAQUE_FALLADO: |
#%% elif result == Personaje.ATAQUE_FALLADO: |
260 |
#%% self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada") |
#%% self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada") |
261 |
#%% elif result == Personaje.ATAQUE_CRITICO: |
#%% elif result == Personaje.ATAQUE_CRITICO: |
262 |
#%% self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante") |
#%% self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante") |
263 |
#%% elif result == Personaje.ATAQUE_PIFIA: |
#%% elif result == Personaje.ATAQUE_PIFIA: |
264 |
#%% self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!") |
#%% self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!") |
265 |
#%% else: |
#%% else: |
266 |
#%% print "ERROR: recibido resultado de combate " + str(result) + \ |
#%% print "ERROR: recibido resultado de combate " + str(result) + \ |
267 |
#%% " (" + self.personaje.nombre + ")" |
#%% " (" + self.personaje.nombre + ")" |
268 |
#%% |
#%% |
269 |
#%% self.personaje.hablar("A " + self.personaje.nombre + " le quedan " + |
#%% self.personaje.hablar("A " + self.personaje.nombre + " le quedan " + |
270 |
#%% str(self.personaje.vida) + " puntos de vida") |
#%% str(self.personaje.vida) + " puntos de vida") |
271 |
#%% self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " + |
#%% self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " + |
272 |
#%% str(self.oponente.vida) + " puntos de vida") |
#%% str(self.oponente.vida) + " puntos de vida") |
273 |
#%% |
#%% |
274 |
#%% if self.oponente.estado == "muerto": |
#%% if self.oponente.estado == "muerto": |
275 |
#%% self.cbt_oponente_muerto() |
#%% self.cbt_oponente_muerto() |
276 |
#%% elif self.personaje.estado == "muerto": |
#%% elif self.personaje.estado == "muerto": |
277 |
#%% self.cbt_personaje_muerto() |
#%% self.cbt_personaje_muerto() |
278 |
#%% |
#%% |
279 |
#%% |
#%% |
280 |
#%% def cbt_te_pegan(self, result): |
#%% def cbt_te_pegan(self, result): |
281 |
#%% if self.oponente.estado == "muerto": |
#%% if self.oponente.estado == "muerto": |
282 |
#%% self.cbt_oponente_muerto() |
#%% self.cbt_oponente_muerto() |
283 |
#%% elif self.personaje.estado == "muerto": |
#%% elif self.personaje.estado == "muerto": |
284 |
#%% self.cbt_personaje_muerto() |
#%% self.cbt_personaje_muerto() |
285 |
#%% |
#%% |
286 |
#%% |
#%% |
287 |
#%% def cbt_oponente_muerto(self): |
#%% def cbt_oponente_muerto(self): |
288 |
#%% self.personaje.hablar("\n" + color(31) + self.oponente.nombre + |
#%% self.personaje.hablar("\n" + color(31) + self.oponente.nombre + |
289 |
#%% " ha muerto. RIP." + finl) |
#%% " ha muerto. RIP." + finl) |
290 |
#%% # puntos de experiencia, objetos... (aún sin hacer) |
#%% # puntos de experiencia, objetos... (aún sin hacer) |
291 |
#%% |
#%% |
292 |
#%% |
#%% |
293 |
#%% def cbt_personaje_muerto(self): |
#%% def cbt_personaje_muerto(self): |
294 |
#%% # pues no se, habra que ver que hacemos aqui |
#%% # pues no se, habra que ver que hacemos aqui |
295 |
#%% pass |
#%% pass |
296 |
#%% |
#%% |
297 |
#%% |
#%% |
298 |
#%% def cbt_termina_combate(self): |
#%% def cbt_termina_combate(self): |
299 |
#%% self.oponente = None |
#%% self.oponente = None |
300 |
#%% if self.crono != None: |
#%% if self.crono != None: |
301 |
#%% self.crono.parar() |
#%% self.crono.parar() |
302 |
#%% self.crono = None |
#%% self.crono = None |
303 |
|
|
304 |
|
|
305 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |
306 |
|
|
307 |
if (__name__ == '__main__'): |
if (__name__ == '__main__'): |
308 |
print "No hay código para pruebas unitarias del módulo. Para probar, ejecutar ambar.py" |
print "No hay código para pruebas unitarias del módulo. Para probar, ejecutar ambar.py" |
309 |
print "y conectarse via telnet." |
print "y conectarse via telnet." |