/[ambar]/ambar/mundo.py
ViewVC logotype

Diff of /ambar/mundo.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.2 by pabloruiz, Tue Nov 5 22:58:22 2002 UTC revision 2.3 by amoyav, Sat Dec 7 23:09:36 2002 UTC
# Line 26  from sala import * Line 26  from sala import *
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
# Line 89  class Mundo: Line 89  class Mundo:
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    

Legend:
Removed from v.2.2  
changed lines
  Added in v.2.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26