41 |
Una vez inicializada, crea un dialogo con el jugador y le pasa el control. |
Una vez inicializada, crea un dialogo con el jugador y le pasa el control. |
42 |
Todos los eventos recibidos se los pasa al dialogo actual, y éste responde a |
Todos los eventos recibidos se los pasa al dialogo actual, y éste responde a |
43 |
los mismos. La respuesta puede incluir cambiar a otro dialogo distinto. |
los mismos. La respuesta puede incluir cambiar a otro dialogo distinto. |
44 |
|
|
45 |
|
También se encarga de recibir los ticks del reloj global de Mundo, y pasárselos |
46 |
|
al diálogo si éste los acepta. |
47 |
|
|
48 |
Contiene los siguientes atributos: |
Contiene los siguientes atributos: |
49 |
|
|
69 |
self.__personaje = None |
self.__personaje = None |
70 |
self.__dialogo = DialogoInicial(self, self.__conn) |
self.__dialogo = DialogoInicial(self, self.__conn) |
71 |
|
|
72 |
|
Mundo_suscribirse_al_tick(self.tick_recibido) |
73 |
|
|
74 |
|
|
75 |
def __del__(self): |
def __del__(self): |
76 |
"""Realiza ajustes automáticos al ser destruido.""" |
"""Realiza ajustes automáticos al ser destruido.""" |
77 |
self.desconectar() |
self.desconectar() |
78 |
|
Mundo_borrarse_del_tick(self.tick_recibido) |
79 |
|
|
80 |
|
|
81 |
def conn(self): |
def conn(self): |
187 |
|
|
188 |
def movimiento_automatico(self): |
def movimiento_automatico(self): |
189 |
self.__dialogo.movimiento_automatico() |
self.__dialogo.movimiento_automatico() |
190 |
|
|
191 |
|
|
192 |
|
# ------------------------------ |
193 |
|
# Tick del reloj global de Mundo |
194 |
|
# ------------------------------ |
195 |
|
|
196 |
|
def tick_recibido(self, tick_ahora, tick_anterior): |
197 |
|
"""Responde al tick llamando al diálogo si éste implementa la función.""" |
198 |
|
|
199 |
|
try: |
200 |
|
|
201 |
|
# Luego llamamos a la funcion correspondiente segun estado |
202 |
|
nombre_func = "tick_" + str(self.__dialogo.estado()) |
203 |
|
func = getattr(self.__dialogo, nombre_func, None) |
204 |
|
if func != None: |
205 |
|
nuevo_dialogo = func(tick_ahora, tick_anterior) |
206 |
|
|
207 |
|
# Si hay que cambiar de dialogo, hacerlo |
208 |
|
if nuevo_dialogo != None: |
209 |
|
self.__dialogo = nuevo_dialogo |
210 |
|
|
211 |
|
except: |
212 |
|
|
213 |
|
# No deben ocurrir excepciones no tratadas salvo por un bug del |
214 |
|
# programa. Aquí se interceptan para que un bug afecte, si es posible, |
215 |
|
# sólo a la conexión que lo ha hecho saltar, pero no se caiga el |
216 |
|
# servidor entero. |
217 |
|
# |
218 |
|
# Si ocurre esto, desconectamos al jugador de su personaje, pero |
219 |
|
# mantenemos la conexión abierta por si quiere volverlo a intentar. |
220 |
|
|
221 |
|
escribir("Excepción imprevista durante el tick del reloj global.") |
222 |
|
escribir(" -> conexión desde " + self.__conn.ip) |
223 |
|
escribir(" -> tick ahora " + str(tick_ahora)) |
224 |
|
escribir(" -> tick anterior " + str(tick_anterior)) |
225 |
|
escribir(" -> dialogo " + str(self.__dialogo.__class__)) |
226 |
|
if self.__personaje != None: |
227 |
|
escribir(" -> personaje " + self.__personaje.id) |
228 |
|
escribir_excepcion() |
229 |
|
|
230 |
|
try: |
231 |
|
|
232 |
|
self.__conn.send("\n\nHa ocurrido un error imprevisto en Mine, probablemente se trate") |
233 |
|
self.__conn.send("de un fallo en el programa. Por favor, ponte en contacto con los") |
234 |
|
self.__conn.send("administadores del juego y explicales, si es posible, toda la") |
235 |
|
self.__conn.send("información que tengas sobre lo que estabas haciendo en el momento") |
236 |
|
self.__conn.send("del error. Gracias, y disculpa por las molestias.") |
237 |
|
|
238 |
|
self.terminar() |
239 |
|
|
240 |
|
except: |
241 |
|
|
242 |
|
# Si no se puede salir del personaje normalmente, tiramos la |
243 |
|
# conexión del todo. |
244 |
|
escribir("Problema gordo: no se puede mantener la conexión. La tiramos...") |
245 |
|
self.desconectar() |
246 |
|
|
247 |
|
|
248 |
# ------------------ |
# ------------------ |
249 |
# Eventos del socket |
# Eventos del socket |