26 |
from utils import * |
from utils import * |
27 |
from fechahoramine import * |
from fechahoramine import * |
28 |
|
|
29 |
class Mundo: |
class Mundo(object): |
30 |
"""El mundo tal y como lo conocemos. |
"""El mundo tal y como lo conocemos. |
31 |
|
|
32 |
No es instanciable, ya que solo hay un mundo en una ejecucion determinada. Solo |
No es instanciable, ya que solo hay un mundo en una ejecucion determinada. Solo |
89 |
|
|
90 |
# FechaHora del último tick. |
# FechaHora del último tick. |
91 |
tick_anterior = FechaHoraMine(0) |
tick_anterior = FechaHoraMine(0) |
92 |
|
|
93 |
|
# Métodos estáticos |
94 |
|
|
95 |
|
def inicializar(): |
96 |
|
"""Echa el mundo a rodar...""" |
97 |
|
|
98 |
def Mundo_inicializar(): |
# El primer tick tiene que saltar al principio de la próxima hora. |
99 |
"""Echa el mundo a rodar...""" |
ahora = FechaHoraMine_ahora() |
100 |
|
primer_tick = ahora + FechaHoraMineRel(signo=1, horas=1, segundos=-ahora.segundo()) |
101 |
|
CronoMine(Mundo.cronoMine_control, primer_tick - ahora, Mundo.tick) |
102 |
|
|
|
# El primer tick tiene que saltar al principio de la próxima hora. |
|
|
ahora = FechaHoraMine_ahora() |
|
|
primer_tick = ahora + FechaHoraMineRel(signo=1, horas=1, segundos=-ahora.segundo()) |
|
|
CronoMine(Mundo.cronoMine_control, primer_tick - ahora, Mundo_tick) |
|
103 |
|
|
104 |
|
inicializar = staticmethod(inicializar) |
105 |
|
|
|
def Mundo_localizar_sala(id): |
|
|
"""Localiza una sala por el id. |
|
|
|
|
|
Si está en memoria, la devuelve directamente. Si no, la carga de disco. Si no existe, |
|
|
la crea nueva a partir de su descripción. |
|
106 |
|
|
107 |
Requiere: |
def localizar_sala(id): |
108 |
id != None |
"""Localiza una sala por el id. |
109 |
id existe en cache o disco, o existe una descripcion para crearla |
|
110 |
|
Si está en memoria, la devuelve directamente. Si no, la carga de disco. Si no existe, |
111 |
|
la crea nueva a partir de su descripción. |
112 |
|
|
113 |
Asegura: |
Requiere: |
114 |
return != None |
id != None |
115 |
""" |
id existe en cache o disco, o existe una descripcion para crearla |
116 |
|
|
117 |
|
Asegura: |
118 |
|
return != None |
119 |
|
""" |
120 |
|
|
121 |
|
la_sala = None |
122 |
|
|
123 |
|
# Primero se busca en la cache |
124 |
|
for i in range(0, len(Mundo.salas)): |
125 |
|
if Mundo.salas[i].id == id: |
126 |
|
# Si esta en la cache, ya la tenemos. Unicamente, moverla al principio |
127 |
|
# de la cola (algoritmo LRU - Less Recently Used: cuando haya que quitar |
128 |
|
# una sala de la cache, que sea la que lleva más tiempo sin utilizarse). |
129 |
|
la_sala = Mundo.salas[i] |
130 |
|
del Mundo.salas[i] |
131 |
|
Mundo.salas.insert(0, la_sala) |
132 |
|
break |
133 |
|
|
134 |
la_sala = None |
if la_sala == None: |
135 |
|
|
136 |
|
try: |
137 |
|
|
138 |
|
# Si no, ver si se puede cargar de disco. Si es posible, añadirla al |
139 |
|
# principio de la cola. |
140 |
|
la_sala = Sala.cargar(id) |
141 |
|
Mundo.salas.insert(0, la_sala) |
142 |
|
|
143 |
|
except IOError: |
144 |
|
|
145 |
|
# En otro caso, crearla a partir de su descripción, guardarla |
146 |
|
# en disco y añadirla a la cache |
147 |
|
|
148 |
|
la_sala = Sala(id) |
149 |
|
la_sala.salvar() |
150 |
|
Mundo.salas.insert(0, la_sala) |
151 |
|
|
152 |
|
|
153 |
|
# Y si hay demasiadas salas cargadas, descartar una de la cache (salvarla primero) |
154 |
|
# Si todas las salas tienen gente dentro, no se descartará ninguna, pero eso es muy |
155 |
|
# improbable y además se arregla solo en cuanto alguien se salga de una sala. |
156 |
|
if (len(Mundo.salas) > Mundo.TAMANO_CACHE_SALAS): |
157 |
|
for i in range(len(Mundo.salas)-1, -1, -1): |
158 |
|
if Mundo.salas[i].n_jugadores == 0: |
159 |
|
sala_descartada = Mundo.salas[i] |
160 |
|
sala_descartada.salvar() |
161 |
|
del Mundo.salas[i] |
162 |
|
break |
163 |
|
|
164 |
|
|
165 |
|
la_sala.activar() |
166 |
|
|
167 |
|
return la_sala |
168 |
|
|
169 |
|
|
170 |
|
localizar_sala = staticmethod(localizar_sala) |
171 |
|
|
172 |
|
|
173 |
|
def personaje_activado(personaje): |
174 |
|
"""Un PJ informa que se ha activado (pasa a ser controlado por un jugador) |
175 |
|
|
176 |
|
Requiere: |
177 |
|
personaje != None |
178 |
|
|
179 |
|
Asegura: |
180 |
|
personaje in Mundo.pjs_activos.values() |
181 |
|
""" |
182 |
|
Mundo.pjs_activos[personaje.id] = personaje |
183 |
|
|
184 |
|
|
185 |
# Primero se busca en la cache |
personaje_activado = staticmethod(personaje_activado) |
|
for i in range(0, len(Mundo.salas)): |
|
|
if Mundo.salas[i].id == id: |
|
|
# Si esta en la cache, ya la tenemos. Unicamente, moverla al principio |
|
|
# de la cola (algoritmo LRU - Less Recently Used: cuando haya que quitar |
|
|
# una sala de la cache, que sea la que lleva más tiempo sin utilizarse). |
|
|
la_sala = Mundo.salas[i] |
|
|
del Mundo.salas[i] |
|
|
Mundo.salas.insert(0, la_sala) |
|
|
break |
|
186 |
|
|
|
if la_sala == None: |
|
|
|
|
|
try: |
|
|
|
|
|
# Si no, ver si se puede cargar de disco. Si es posible, añadirla al |
|
|
# principio de la cola. |
|
|
la_sala = Sala_cargar(id) |
|
|
Mundo.salas.insert(0, la_sala) |
|
|
|
|
|
except IOError: |
|
|
|
|
|
# En otro caso, crearla a partir de su descripción, guardarla |
|
|
# en disco y añadirla a la cache |
|
|
|
|
|
la_sala = Sala(id) |
|
|
la_sala.salvar() |
|
|
Mundo.salas.insert(0, la_sala) |
|
|
|
|
|
|
|
|
# Y si hay demasiadas salas cargadas, descartar una de la cache (salvarla primero) |
|
|
# Si todas las salas tienen gente dentro, no se descartará ninguna, pero eso es muy |
|
|
# improbable y además se arregla solo en cuanto alguien se salga de una sala. |
|
|
if (len(Mundo.salas) > Mundo.TAMANO_CACHE_SALAS): |
|
|
for i in range(len(Mundo.salas)-1, -1, -1): |
|
|
if Mundo.salas[i].n_jugadores == 0: |
|
|
sala_descartada = Mundo.salas[i] |
|
|
sala_descartada.salvar() |
|
|
del Mundo.salas[i] |
|
|
break |
|
|
|
|
187 |
|
|
188 |
la_sala.activar() |
def personaje_desactivado(personaje): |
189 |
|
"""Un PJ informa que se ha desactivado (su jugador se ha desconectado o el PJ ha muerto). |
190 |
|
|
191 |
return la_sala |
Requiere: |
192 |
|
personaje != None |
193 |
|
|
194 |
|
Asegura: |
195 |
|
personaje not in Mundo.pjs_activos.values() |
196 |
|
""" |
197 |
|
if Mundo.pjs_activos.has_key(personaje.id): |
198 |
|
del Mundo.pjs_activos[personaje.id] |
199 |
|
|
200 |
|
|
201 |
def Mundo_personaje_activado(personaje): |
personaje_desactivado = staticmethod(personaje_desactivado) |
|
"""Un PJ informa que se ha activado (pasa a ser controlado por un jugador) |
|
202 |
|
|
|
Requiere: |
|
|
personaje != None |
|
|
|
|
|
Asegura: |
|
|
personaje in Mundo.pjs_activos.values() |
|
|
""" |
|
|
Mundo.pjs_activos[personaje.id] = personaje |
|
|
|
|
203 |
|
|
204 |
def Mundo_personaje_desactivado(personaje): |
def salvar_todo(): |
205 |
"""Un PJ informa que se ha desactivado (su jugador se ha desconectado o el PJ ha muerto). |
"""Salva todas las salas en memoria, junto con todo su contenido.""" |
206 |
|
for sala in Mundo.salas: |
207 |
|
sala.salvar() |
208 |
|
|
|
Requiere: |
|
|
personaje != None |
|
|
|
|
|
Asegura: |
|
|
personaje not in Mundo.pjs_activos.values() |
|
|
""" |
|
|
if Mundo.pjs_activos.has_key(personaje.id): |
|
|
del Mundo.pjs_activos[personaje.id] |
|
209 |
|
|
210 |
|
salvar_todo = staticmethod(salvar_todo) |
211 |
|
|
|
def Mundo_salvar_todo(): |
|
|
"""Salva todas las salas en memoria, junto con todo su contenido.""" |
|
|
for sala in Mundo.salas: |
|
|
sala.salvar() |
|
212 |
|
|
213 |
|
def suscribirse_al_tick(funcion_tick): |
214 |
|
"""Para añadirse a la lista de funciones llamadas con el "tick" del reloj global. |
215 |
|
|
216 |
def Mundo_suscribirse_al_tick(funcion_tick): |
A esta función se le pasarán dos parámetros: el primero es la FechaHoraMine actual, |
217 |
"""Para añadirse a la lista de funciones llamadas con el "tick" del reloj global. |
y el otro la que era actual en la llamada anterior (sirve para comprobar si ha habido |
218 |
|
cambio de dia, por ejemplo). |
219 |
|
""" |
220 |
|
Mundo.suscritos_al_tick.append(funcion_tick) |
221 |
|
|
|
A esta función se le pasarán dos parámetros: el primero es la FechaHoraMine actual, |
|
|
y el otro la que era actual en la llamada anterior (sirve para comprobar si ha habido |
|
|
cambio de dia, por ejemplo). |
|
|
""" |
|
|
Mundo.suscritos_al_tick.append(funcion_tick) |
|
222 |
|
|
223 |
|
suscribirse_al_tick = staticmethod(suscribirse_al_tick) |
224 |
|
|
|
def Mundo_borrarse_del_tick(funcion_tick): |
|
|
"""Para borrarse de la lista anterior.""" |
|
|
Mundo.suscritos_al_tick.remove(funcion_tick) |
|
225 |
|
|
226 |
|
def borrarse_del_tick(funcion_tick): |
227 |
|
"""Para borrarse de la lista anterior.""" |
228 |
|
Mundo.suscritos_al_tick.remove(funcion_tick) |
229 |
|
|
|
def Mundo_tick(crono): |
|
|
"""Función que es llamada con cada tick del reloj global. |
|
230 |
|
|
231 |
Se encarga de llamar a todos los suscritos. |
borrarse_del_tick = staticmethod(borrarse_del_tick) |
232 |
""" |
|
233 |
ahora = FechaHoraMine_ahora() |
|
234 |
|
def tick(crono): |
235 |
|
"""Función que es llamada con cada tick del reloj global. |
236 |
|
|
237 |
|
Se encarga de llamar a todos los suscritos. |
238 |
|
""" |
239 |
|
ahora = FechaHoraMine_ahora() |
240 |
|
|
241 |
|
for suscrito in Mundo.suscritos_al_tick: |
242 |
|
suscrito(ahora, Mundo.tick_anterior) |
243 |
|
|
244 |
|
Mundo.tick_anterior = ahora |
245 |
|
|
246 |
for suscrito in Mundo.suscritos_al_tick: |
siguiente_tick = ahora + FechaHoraMineRel(signo=1, horas=1, segundos=-ahora.segundo()) |
247 |
suscrito(ahora, Mundo.tick_anterior) |
CronoMine(Mundo.cronoMine_control, siguiente_tick - ahora, Mundo.tick) |
248 |
|
|
|
Mundo.tick_anterior = ahora |
|
249 |
|
|
250 |
siguiente_tick = ahora + FechaHoraMineRel(signo=1, horas=1, segundos=-ahora.segundo()) |
tick = staticmethod(tick) |
|
CronoMine(Mundo.cronoMine_control, siguiente_tick - ahora, Mundo_tick) |
|
251 |
|
|
252 |
|
|
253 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |
254 |
|
|
255 |
if (__name__ == '__main__'): |
if (__name__ == '__main__'): |
256 |
sala = Mundo_localizar_sala(Mundo.ID_SALA_ENTRADA) |
sala = Mundo.localizar_sala(Mundo.ID_SALA_ENTRADA) |
257 |
print 'Cargada sala ' + sala.id + ' con exito.' |
print 'Cargada sala ' + sala.id + ' con exito.' |
258 |
|
|