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

Diff of /ambar/sala.py

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

revision 2.16 by amoyav, Sat Aug 30 13:31:25 2003 UTC revision 2.17 by amoyav, Sun Aug 31 20:43:27 2003 UTC
# Line 55  class Sala(object): Line 55  class Sala(object):
55    
56      # Version del sistema de salas (se incrementa cada vez que varian los atributos      # Version del sistema de salas (se incrementa cada vez que varian los atributos
57      # de la clase Sala)      # de la clase Sala)
58      VERSION_SALA = '1.2.2'      VERSION_SALA = '1.2.3'
59    
60      DIR_DESC_SALAS = 'desc_salas'      DIR_DESC_SALAS = 'desc_salas'
61      EXT_DESC_SALAS = '.xml'      EXT_DESC_SALAS = '.xml'
# Line 255  class Sala(object): Line 255  class Sala(object):
255                                                         el item (0 = automatico,                                                         el item (0 = automatico,
256                                                         100 = imposible)                                                         100 = imposible)
257                                   - "texto" (string): el texto del item                                   - "texto" (string): el texto del item
258                                     - "personaje_mira" (guion): el guion que se ejecuta cuando
259                                                                 un personaje mira el item
260    
261                                 Invariantes:                                 Invariantes:
262                                     descripcion != None                                     descripcion != None
# Line 285  class Sala(object): Line 287  class Sala(object):
287                                  * magia: id de hechizo (sin implementar)                                  * magia: id de hechizo (sin implementar)
288                               - "mensaje_cerrado" (string): mensaje que sale si se intenta salir                               - "mensaje_cerrado" (string): mensaje que sale si se intenta salir
289                                                             estando cerrada.                                                             estando cerrada.
290                                 - "personaje_mira" (guion): el guion que se ejecuta cuando un personaje
291                                                             mira la salida
292                                 - "personaje_cruza" (guion): el guion que se ejecuta cuando un personaje
293                                                              intenta atravesar la salida
294    
295                              Invariantes:                              Invariantes:
296                                  salidas != None                                  salidas != None
# Line 318  class Sala(object): Line 324  class Sala(object):
324                                                         objeto real (puede estar vacía si                                                         objeto real (puede estar vacía si
325                                                         probabilidad > 0, porque es posible                                                         probabilidad > 0, porque es posible
326                                                         que reaparezcan objetos más tarde)                                                         que reaparezcan objetos más tarde)
327                                - "personaje_mira" (Guion): guion que se ejecuta cuando un personaje
328                                                            mira la sala
329    
330                              Invariantes:                              Invariantes:
331                                objetos != None                                objetos != None
# Line 568  class Sala(object): Line 576  class Sala(object):
576                          ". La dificultad de la descripción tiene que ser de 0 a 100.")                          ". La dificultad de la descripción tiene que ser de 0 a 100.")
577              else:              else:
578                  dif_item = 0                      dif_item = 0    
579              self.__descripcion.append({"dificultad": dif_item, "texto": texto_item})  
580                guion = None
581                for elem_suceso in elem_item.childNodes:
582                    suceso = extraer_nombre_xml(elem_suceso)
583                    if suceso == "personaje_mira":
584                        guion = Guion(elem_suceso,
585                                      macros_tipos = [ ("$observador", "Personaje"),
586                                                       ("$sala", "Sala") ])
587    
588                self.__descripcion.append({"dificultad": dif_item, "texto": texto_item,
589                                           "personaje_mira": guion})
590    
591    
592            
# Line 608  class Sala(object): Line 626  class Sala(object):
626              id_salida = extraer_atributo_xml(nodo_salida,'id')              id_salida = extraer_atributo_xml(nodo_salida,'id')
627              desc_salida = extraer_contenido_xml(nodo_salida)              desc_salida = extraer_contenido_xml(nodo_salida)
628    
629                guion_mira = None
630                guion_cruza = None
631                for elem_suceso in elem_item.childNodes:
632                    suceso = extraer_nombre_xml(elem_suceso)
633                    if suceso == "personaje_mira":
634                        guion_mira = Guion(elem_suceso,
635                                           macros_tipos = [ ("$observador", "Personaje"),
636                                                            ("$sala", "Sala") ])
637                    elif suceso == "personaje_cruza":
638                        guion_cruza = Guion(elem_suceso,
639                                            macros_tipos = [ ("$viajero", "Personaje"),
640                                                             ("$sala_origen", "Sala"),
641                                                             ("$sala_destino", "Sala") ])
642    
643              self.__salidas.append({"direccion": direccion_salida,              self.__salidas.append({"direccion": direccion_salida,
644                                     "dificultad": dif_salida,                                     "dificultad": dif_salida,
645                                     "id": id_salida,                                     "id": id_salida,
646                                     "descripcion": desc_salida,                                     "descripcion": desc_salida,
647                                     "tipo_cierre": tipo_cierre_salida,                                     "tipo_cierre": tipo_cierre_salida,
648                                     "datos_cierre": datos_cierre_salida,                                     "datos_cierre": datos_cierre_salida,
649                                     "mensaje_cerrado": mensaje_cerrado_salida})                                     "mensaje_cerrado": mensaje_cerrado_salida,
650                                       "personaje_mira": guion_mira,
651                                       "personaje_cruza": guion_cruza})
652    
653    
654      def __parsear_objetos(self, elem_objetos, crear_contenidos):      def __parsear_objetos(self, elem_objetos, crear_contenidos):
# Line 678  class Sala(object): Line 712  class Sala(object):
712              else:              else:
713                  dif_objeto = 0                    dif_objeto = 0  
714    
715                guion = None
716                for elem_suceso in elem_item.childNodes:
717                    suceso = extraer_nombre_xml(elem_suceso)
718                    if suceso == "personaje_mira":
719                        guion = Guion(elem_suceso,
720                                      macros_tipos = [ ("$observador", "Personaje"),
721                                                       ("$sala", "Sala") ])
722    
723              instancias = []              instancias = []
724    
725              if crear_contenidos:                              if crear_contenidos:                
# Line 692  class Sala(object): Line 734  class Sala(object):
734                                     "dificultad": dif_objeto,                                     "dificultad": dif_objeto,
735                                     "cantidad": cantidad_objeto,                                     "cantidad": cantidad_objeto,
736                                     "descripcion": desc_objeto,                                     "descripcion": desc_objeto,
737                                     "instancias": instancias})                                     "instancias": instancias,
738                                       "personaje_mira": guion})
739                    
740    
741      def __parsear_encuentros(self, elem_encuentros, crear_contenidos):      def __parsear_encuentros(self, elem_encuentros, crear_contenidos):
# Line 873  class Sala(object): Line 916  class Sala(object):
916              self.__n_jugadores -= 1              self.__n_jugadores -= 1
917    
918    
919        def personaje_mira(self, observador):
920            """Responde al suceso de que un personaje mira la descripción de esta sala.
921    
922            Por cada item de descripcion de la sala, chequea los requisitos y realiza las acciones
923            correspondientes. Luego realiza la misma operación con las salidas y los objetos.
924            Al final devuelve tres listas, con todos los items de descripción, salidas y objetos
925            cuyo guion de respuesta ha devuelto un resultado de éxito.
926    
927            Requiere:
928                observador != None
929            """
930            items_devueltos = []
931            salidas_devueltas = []
932            objetos_devueltos = []
933    
934            for item in self.__descripcion:
935                if item["personaje_mira"] == None:
936                    items_devueltos.append(item)
937                else:
938                    respuesta = item["personaje_mira"]
939                    result =  respuesta.ejecutar(macros_valores = {"$observador": observador,
940                                                                   "$sala": self})
941    
942                    if result == None:  # Si ninguna acción acepta o cancela explícitamente el
943                        result = 1      # suceso, se asume que se acepta
944    
945                    if result:
946                        items_devueltos.append(item)
947    
948            for salida in self.__salidas:
949                if salida["personaje_mira"] == None:
950                    salidas_devueltas.append(salida)
951                else:
952                    respuesta = salida["personaje_mira"]
953                    result =  respuesta.ejecutar(macros_valores = {"$observador": observador,
954                                                                   "$sala": self})
955    
956                    if result == None:  # Si ninguna acción acepta o cancela explícitamente el
957                        result = 1      # suceso, se asume que se acepta
958    
959                    if result:
960                        items_devueltos.append(salida)
961    
962            for objeto in self.__objetos:
963                if len(objeto["instancias"]) > 0:
964                    if objeto["personaje_mira"] == None:
965                        objetos_devueltos.append(objeto)
966                    else:
967                        respuesta = objeto["personaje_mira"]
968                        result =  respuesta.ejecutar(macros_valores = {"$observador": observador,
969                                                                       "$sala": self,
970                                                                       "$objeto": objeto["instancias"][0]})
971    
972                        if result == None:  # Si ninguna acción acepta o cancela explícitamente el
973                            result = 1      # suceso, se asume que se acepta
974    
975                        if result:
976                            objetos_devueltos.append(objeto)
977    
978            return (items_devueltos, salidas_devueltas, objetos_devueltos)
979    
980    
981      def volumen_ocupado(self):      def volumen_ocupado(self):
982          """El total de volumen que ocupa toda la gente y objetos que hay dentro.          """El total de volumen que ocupa toda la gente y objetos que hay dentro.
983          Asegura:          Asegura:
# Line 1041  class Sala(object): Line 1146  class Sala(object):
1146                  objeto["instancias"].extend(objetos)                  objeto["instancias"].extend(objetos)
1147                  break                  break
1148          else:          else:
1149              self.__objetos.append({"id":objetos[0].id,              self.__objetos.append({"id": objetos[0].id,
1150                                     "probabilidad":0,                                     "probabilidad": 0,
1151                                     "maximo":0,                                     "maximo": 0,
1152                                     "dificultad":dificultad,                                     "dificultad": dificultad,
1153                                     "cantidad":len(objetos),                                     "cantidad": len(objetos),
1154                                     "descripcion": objetos[0].nombre,                                     "descripcion": objetos[0].nombre,
1155                                     "instancias":objetos})                                     "instancias": objetos,
1156                                       "personaje_mira": None})
1157    
1158    
1159      def objeto_desaparece(self, objeto):      def objeto_desaparece(self, objeto):
# Line 1080  class Sala(object): Line 1186  class Sala(object):
1186                  objeto["instancias"].append(objeto)                  objeto["instancias"].append(objeto)
1187                  break                  break
1188          else:          else:
1189              self.__objetos.append({"id":instancia.id,              self.__objetos.append({"id": instancia.id,
1190                                     "probabilidad":0,                                     "probabilidad": 0,
1191                                     "maximo":0,                                     "maximo": 0,
1192                                     "dificultad":dificultad,                                     "dificultad": dificultad,
1193                                     "cantidad":1,                                     "cantidad": 1,
1194                                     "descripcion":objeto.nombre,                                     "descripcion": objeto.nombre,
1195                                     "instancias":[objeto]})                                     "instancias": [objeto],
1196                                       "personaje_mira": None})
1197    
1198    
1199      def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo):      def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo):
# Line 1221  class Sala(object): Line 1328  class Sala(object):
1328              raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" +              raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" +
1329                               " cuando se esperaba " + Sala.VERSION_SALA)                               " cuando se esperaba " + Sala.VERSION_SALA)
1330    
1331          assert(Sala.VERSION_SALA == "1.2.2")          assert(Sala.VERSION_SALA == "1.2.3")
1332          while self.__version != "1.2.2":          while self.__version != "1.2.3":
1333    
1334              # La versión 1.2.1 produce una ruptura con las anteriores ya que se migra al formato              # La versión 1.2.1 produce una ruptura con las anteriores ya que se migra al formato
1335              # de clases de Python 2.2, y no es compatible con el anterior. Hay que borrar todas              # de clases de Python 2.2, y no es compatible con el anterior. Hay que borrar todas
# Line 1242  class Sala(object): Line 1349  class Sala(object):
1349                      encuentro["cantidad"] = 1                      encuentro["cantidad"] = 1
1350                  self.__version = "1.2.2"                  self.__version = "1.2.2"
1351                  escribir("Convertida sala " + self.__id + " a versión 1.2.2")                  escribir("Convertida sala " + self.__id + " a versión 1.2.2")
1352                elif self.__version == "1.2.2":
1353                    # Versión 1.2.2 -> 1.2.3: añadir suceso personaje_mira a los items de descripción,
1354                    # a las salidas y a los objetos, y personaje_cruza a las salidas.
1355                    for item in self.__descripcion:
1356                        item["personaje_mira"] = None
1357                    for objeto in self.__objetos:
1358                        objeto["personaje_mira"] = None
1359                    for salida in self.__salidas:
1360                        salida["personaje_mira"] = None
1361                        salida["personaje_cruza"] = None
1362                    self.__version = "1.2.3"
1363                    escribir("Convertida sala " + self.__id + " a versión 1.2.3")
1364              else:              else:
1365                  raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " +                  raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " +
1366                                   self.__version + " cuando se esperaba " + Sala.VERSION_SALA)                                   self.__version + " cuando se esperaba " + Sala.VERSION_SALA)

Legend:
Removed from v.2.16  
changed lines
  Added in v.2.17

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