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

Diff of /ambar/personaje.py

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

revision 2.13 by amoyav, Wed Apr 23 08:03:29 2003 UTC revision 2.14 by amoyav, Sat May 31 21:24:44 2003 UTC
# Line 65  class Personaje(object): Line 65  class Personaje(object):
65      ATAQUE_CRITICO = 3      ATAQUE_CRITICO = 3
66      ATAQUE_PIFIA   = 4      ATAQUE_PIFIA   = 4
67    
68        # Posiciones del cuerpo donde se pueden poner objetos
69        POSICIONES = [ 'cabeza', 'cuello', 'tronco', 'brazo-izq', 'brazo-der', 'mano-izq',
70                       'mano-der', 'dos-manos', 'piernas', 'tobillo-izq', 'tobillo-der',
71                       'pie-izq', 'pie-der' ]
72    
73      # Atributos públicos de la clase      # Atributos públicos de la clase
74    
# Line 296  class Personaje(object): Line 300  class Personaje(object):
300                                    
301                            Invariantes:                            Invariantes:
302                                cuerpo != None                                cuerpo != None
303                                len(cuerpo) == len(Objeto.POSICIONES)                                len(cuerpo) == len(Personaje.POSICIONES)
304                            """)                            """)
305    
306      def __leer_ids_amigos(self): return self.__ids_amigos      def __leer_ids_amigos(self): return self.__ids_amigos
# Line 366  class Personaje(object): Line 370  class Personaje(object):
370    
371          self.__mochila = []          self.__mochila = []
372          self.__cuerpo = {}          self.__cuerpo = {}
373          for posicion in Objeto.POSICIONES:          for posicion in Personaje.POSICIONES:
374              self.__cuerpo[posicion] = None              self.__cuerpo[posicion] = None
375    
376          self.__ids_amigos = {}          self.__ids_amigos = {}
# Line 426  class Personaje(object): Line 430  class Personaje(object):
430          assert(Personaje.VERSION == "1.5.2")          assert(Personaje.VERSION == "1.5.2")
431          while self.__version != "1.5.2":          while self.__version != "1.5.2":
432    
433          # La versión 1.5.1 produce una ruptura con las anteriores ya que se migra al formato              # La versión 1.5.1 produce una ruptura con las anteriores ya que se migra al formato
434          # 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
435          # las salas, personajes y objetos.              # las salas, personajes y objetos.
436          #  
437          #    if self.__version == "1.0":              if self.__version == "1.5.1":
438          #        # Versión 1.0 -> 1.1: añadir anterior y siguiente                  # Versión 1.5.1 -> 1.5.2: añadir __max_vida
439          #        self.__anterior = None                  self.__max_vida = self.__vida
440          #        self.__siguiente = None                  self.__version = "1.5.2"
441          #        self.__version = "1.1"                  escribir("Convertido personaje " + self.__id + " a versión 1.5.2")
         #        escribir("Convertido personaje " + self.__id + " a versión 1.1")  
         #    elif self.__version == "1.1":  
         #        (...etc...)  
   
         # La versión 1.5.2 está en desarrollo...  
         # De momento, ha cambiado:  
         #  - nuevo atributo privado __max_vida  
442    
443              raise ValueError("Cargado personaje " + self.__id + " con versión desconocida: " +              raise ValueError("Cargado personaje " + self.__id + " con versión desconocida: " +
444                               self.__version + " cuando se esperaba " + Personaje.VERSION)                                                               self.__version + " cuando se esperaba " + Personaje.VERSION)
445    
446          # Recuperar el controlador          # Recuperar el controlador
447          if isinstance(self, PersonajeNoJugador):          if isinstance(self, PersonajeNoJugador):
# Line 477  class Personaje(object): Line 474  class Personaje(object):
474          El nivel es ajustado correspondientemente.          El nivel es ajustado correspondientemente.
475          """          """
476          self.__experiencia += puntos          self.__experiencia += puntos
477          self.__nivel = experiencia / 1000          self.__nivel = self.__experiencia / 1000
478    
479    
480      def cambiar_nivel(self, nuevo_nivel):      def cambiar_nivel(self, nuevo_nivel):
# Line 505  class Personaje(object): Line 502  class Personaje(object):
502              self.__vida = self.__max_vida              self.__vida = self.__max_vida
503    
504    
505        def atributo(self, atributo):
506            """Devuelve el valor del atributo con el nombre indicado.
507    
508            Es útil para requisitos.
509    
510            Requiere:
511                atributo in self.__atrib.keys()
512            """
513            return self.__atrib[atributo]
514    
515    
516    
517      def cambiar_atributo(self, atributo, niveles):      def cambiar_atributo(self, atributo, niveles):
518          """Modifica el valor del atributo con el nombre indicado.          """Modifica el valor del atributo con el nombre indicado.
519    
# Line 518  class Personaje(object): Line 527  class Personaje(object):
527          #%% OJO, comprobar los máximos...          #%% OJO, comprobar los máximos...
528    
529    
530        def cambiar_idioma(self, idioma, niveles):
531            """Modifica el valor del idioma con el nombre indicado.
532    
533            El valor del parámetro niveles es sumado al del idioma. Puede ser negativo. Si el
534            resultado es menor que 0 o mayor que el máximo, se trunca.
535            """
536            print "[" + str(idioma) + "]"
537            self.__idiomas[idioma] += niveles
538            #%% OJO, comprobar los máximos...
539    
540    
541      def volumen_total(self):      def volumen_total(self):
542          """El total de volumen que ocupa el personaje y todos los objetos que carga.          """El total de volumen que ocupa el personaje y todos los objetos que carga.
543          Asegura:          Asegura:
# Line 1123  class Personaje(object): Line 1143  class Personaje(object):
1143      def dejar(self, id_objeto, n_orden=1, n_instancia=1, cantidad=1, sigilo=0):      def dejar(self, id_objeto, n_orden=1, n_instancia=1, cantidad=1, sigilo=0):
1144          """Saca una o más instancias de un objeto de la mochila y las suelta en la sala.          """Saca una o más instancias de un objeto de la mochila y las suelta en la sala.
1145    
1146          Genera un suceso de actuar, salvo si se indica con sigilo.          Resto de información del método igual que coger().
   
         - id_objeto es el identificador del objeto. Puede haber varios objetos distintos  
           con el mismo id  
         - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id  
         - n_instancia es para elegir una instancia concreta, si hay mas de una  
         - cantidad es el numero de instancias a dejar  
         - sigilo indica si se hace intentando que los otros personajes de la sala no  
           se den cuenta  
   
         Devuelve el nombre completo del objeto dejado.  
   
         Lanza ExcepcionDeJuego si no se puede dejar (el id no existe, se piden mas  
         instancias de las que hay, etc.)  
   
         Requiere:  
             id_objeto != None  
             n_orden >= 1  
             n_instancia >= 1  
             cantidad >= 1  
   
         Asegura:  
             return != None  
1147          """          """
1148          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1149          objetos = self.sacar_de_mochila(n_objeto, n_instancia, cantidad)          objetos = self.sacar_de_mochila(n_objeto, n_instancia, cantidad)
# Line 1163  class Personaje(object): Line 1161  class Personaje(object):
1161          """Saca un objeto de la mochila y lo suelta en la sala, dejándolo escondido.          """Saca un objeto de la mochila y lo suelta en la sala, dejándolo escondido.
1162    
1163          La dificultad para encontrarlo dependerá de la inteligencia del personaje.          La dificultad para encontrarlo dependerá de la inteligencia del personaje.
         Genera un suceso de actuar, salvo si se indica con sigilo.  
   
         - id_objeto es el identificador del objeto. Puede haber varios objetos distintos  
           con el mismo id  
         - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id  
         - n_instancia es para elegir una instancia concreta, si hay mas de una  
         - cantidad es el numero de instancias a esconder  
         - sigilo indica si se hace intentando que los otros personajes de la sala no  
           se den cuenta (en este caso sigilo = 1 por defecto)  
   
         Devuelve el nombre completo del objeto escondido.  
   
         Lanza ExcepcionDeJuego si no se puede esconder (el id no existe, se piden mas  
         instancias de las que hay, etc.)  
   
         Requiere:  
             id_objeto != None  
             n_orden >= 1  
             n_instancia >= 1  
             cantidad >= 1  
1164    
1165          Asegura:          Resto de información del método igual que coger().
             return != None  
1166          """          """
1167          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1168          objetos = self.sacar_de_mochila(n_objeto, n_instancia, cantidad)          objetos = self.sacar_de_mochila(n_objeto, n_instancia, cantidad)
# Line 1210  class Personaje(object): Line 1187  class Personaje(object):
1187          individual.          individual.
1188    
1189          - receptor es el personaje que recibe el objeto          - receptor es el personaje que recibe el objeto
         - id_objeto es el identificador del objeto. Puede haber varios objetos distintos  
           con el mismo id  
         - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id  
         - n_instancia es para elegir una instancia concreta, si hay mas de una  
         - cantidad es el numero de instancias a dar  
         - sigilo indica si se hace intentando que los otros personajes de la sala  
           (excepto el receptor) no se den cuenta  
   
         Devuelve el nombre completo del objeto dado.  
   
         Lanza ExcepcionDeJuego si no se puede dar (el id no existe, se piden mas  
         instancias de las que hay, el personaje receptor lo rechaza, etc.)  
   
         Requiere:  
             receptor != None  
             id_objeto != None  
             n_orden >= 1  
             n_instancia >= 1  
             cantidad >= 1  
1190    
1191          Asegura:          Resto de información del método igual que coger().
             return != None  
1192          """          """
1193          # Comprobar que el personaje que da el objeto se encuentra en la lista          # Comprobar que el personaje que da el objeto se encuentra en la lista
1194          # de confianza del receptor (salvo que el que da sea un Maia...), y que          # de confianza del receptor (salvo que el que da sea un Maia...), y que
# Line 1261  class Personaje(object): Line 1218  class Personaje(object):
1218          return objetos[0].nombre          return objetos[0].nombre
1219    
1220    
1221      def usar(self, id_objeto, n_orden=1, n_instancia=1, sigilo=0):      def comer(self, id_objeto, n_orden=1, n_instancia=1, sigilo=0):
1222          """Usa una instancia de un objeto de la mochila.          """Come una instancia de un objeto de la mochila.
1223            
1224          Genera un suceso de actuar, salvo si se indica con sigilo.          Genera un suceso de actuar, salvo si se indica con sigilo, y un suceso personaje_come
1225            en el objeto comido.
1226    
1227          - id_objeto es el identificador del objeto. Puede haber varios objetos distintos          - id_objeto es el identificador del objeto. Puede haber varios objetos distintos
1228            con el mismo id            con el mismo id
1229          - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id          - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id
1230          - n_instancia es para elegir una instancia concreta, si hay mas de una          - n_instancia es para elegir una instancia concreta, si hay mas de una
1231          - sigilo indica si se hace intentando que los otros personajes de la sala          - sigilo indica si se hace intentando que los otros personajes de la sala no
1232            no se den cuenta            se den cuenta
1233    
1234          Devuelve el nombre completo del objeto usado.          Devuelve el nombre completo del objeto cogido.
1235    
1236          Lanza ExcepcionDeJuego si no se puede usar (el id no existe, se piden mas          Lanza ExcepcionDeJuego si no se puede coger (el id no existe, se piden mas
1237          instancias de las que hay, algún requisito lo impide, etc.)          instancias de las que hay, algún requisito lo impide, etc.)
1238    
1239          Requiere:          Requiere:
# Line 1287  class Personaje(object): Line 1245  class Personaje(object):
1245              return != None              return != None
1246          """          """
1247          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1248            objeto = self.acceder_a_mochila(n_objeto, n_instancia)
1249    
1250          instancias = self.__mochila[n_objeto]          result = objeto.personaje_come(self)
1251          if (n_instancia) > len(instancias):          if result == 0:
1252              raise ExcepcionDeJuego("No tienes " + str(n_instancia) +              raise ExcepcionDeJuego("No puedes comer este objeto.")
1253                                     " unidades de ese objeto en la mochila, solo tienes " +          else:
1254                                     str(len(instancias)))              if not sigilo:
1255                    #%% aquí habría que hacer una tirada en algún sitio...
1256                    self.actuar("se come " + objeto.nombre)
1257    
1258          objeto = instancias[n_instancia-1]          return objeto.nombre
1259    
1260    
1261        def beber(self, id_objeto, n_orden=1, n_instancia=1, sigilo=0):
1262            """Bebe una instancia de un objeto de la mochila.
1263    
1264            Resto de información del método igual que comer().
1265            """
1266            n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1267            objeto = self.acceder_a_mochila(n_objeto, n_instancia)
1268    
1269          if objeto.puede_usar(self):          result = objeto.personaje_bebe(self)
1270            if result == 0:
1271                raise ExcepcionDeJuego("No puedes beber este objeto.")
1272            else:
1273              if not sigilo:              if not sigilo:
1274                  #%% aquí habría que hacer una tirada en algún sitio...                  #%% aquí habría que hacer una tirada en algún sitio...
1275                  self.actuar("usa " + objeto.nombre)                  self.actuar("se bebe " + objeto.nombre)
1276    
1277              objeto.usar(self)          return objeto.nombre
1278          else:  
1279    
1280        def usar(self, id_objeto, n_orden=1, n_instancia=1, sigilo=0):
1281            """Usa una instancia de un objeto de la mochila.
1282    
1283            Resto de información del método igual que comer().
1284            """
1285            n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1286            objeto = self.acceder_a_mochila(n_objeto, n_instancia)
1287    
1288            result = objeto.personaje_usa(self)
1289            if result == 0:
1290              raise ExcepcionDeJuego("No puedes usar este objeto.")              raise ExcepcionDeJuego("No puedes usar este objeto.")
1291            else:
1292                if not sigilo:
1293                    #%% aquí habría que hacer una tirada en algún sitio...
1294                    self.actuar("usa " + objeto.nombre)
1295    
1296          return objeto.nombre          return objeto.nombre
1297    
# Line 1364  class Personaje(object): Line 1352  class Personaje(object):
1352              return n_objeto              return n_objeto
1353    
1354    
1355        def acceder_a_mochila(self, n_objeto, n_instancia=1):
1356            """Accede a una instancia de un objeto para trabajar con ella, pero sin sacarla de la mochila.
1357            
1358            - n_objeto es el número de orden del objeto dentro de la mochila
1359            - n_instancia es el número de orden de la instancia a extraer
1360    
1361            Devuelve la instancia extraida.
1362    
1363            Lanza ExcepcionDeJuego si no puede acceder (por ejemplo, se ha pedido un número de instancia
1364            mayor que las que hay).
1365    
1366            Requiere:
1367                n_objeto in range(0, len(self.mochila))
1368                n_instancia >= 1
1369    
1370            Asegura:
1371                return != None
1372            """
1373            instancias = self.__mochila[n_objeto]
1374            if (n_instancia) > len(instancias):
1375                raise ExcepcionDeJuego("No tienes " + str(n_instancia) +
1376                                       " unidades de ese objeto en la mochila, solo tienes " +
1377                                       str(len(instancias)))
1378    
1379            objeto = instancias[n_instancia-1]
1380    
1381            return objeto
1382    
1383    
1384      def sacar_de_mochila(self, n_objeto, n_instancia=1, cantidad=1):      def sacar_de_mochila(self, n_objeto, n_instancia=1, cantidad=1):
1385          """Sacar una o varias instancias de un objeto de la mochila del personaje.          """Sacar una o varias instancias de un objeto de la mochila del personaje.
1386                    
# Line 1437  class Personaje(object): Line 1454  class Personaje(object):
1454          Devuelve una lista con todos los objetos que se haya tenido que quitar.          Devuelve una lista con todos los objetos que se haya tenido que quitar.
1455    
1456          Requiere:          Requiere:
1457              posicion in self.cuerpo.keys()              posicion in Personaje.POSICIONES
1458    
1459          Asegura:          Asegura:
1460              return != None              return != None
# Line 1464  class Personaje(object): Line 1481  class Personaje(object):
1481          return objetos_quitados          return objetos_quitados
1482    
1483    
1484      def ponerse(objeto, posicion):      def ponerse(self, posicion, id_objeto, n_orden=1, n_instancia=1, sigilo=0):
1485          """Ponerse un objeto en una posicion del cuerpo.          """Ponerse un objeto en una posicion del cuerpo.
1486    
1487          En esta funcion ocurren todos los efectos asociados a esta operacion.          Si ya hay algún objeto en esa posición, se lo quita y lo guarda en la mochila.
1488    
1489            Genera un suceso de actuar_uno_mismo, uno de actuar (salvo si se indica sigilo)
1490            y uno de personaje_pone_XXXX en el objeto puesto.
1491    
1492            - posicion es la parte del cuerpo donde se pone
1493            - id_objeto es el identificador del objeto. Puede haber varios objetos distintos
1494              con el mismo id
1495            - n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id
1496            - n_instancia es para elegir una instancia concreta, si hay mas de una
1497            - sigilo indica si se hace intentando que los otros personajes de la sala no
1498              se den cuenta
1499    
1500            Devuelve el nombre completo del objeto puesto.
1501    
1502            Lanza ExcepcionDeJuego si no se puede coger (el id no existe, se piden mas
1503            instancias de las que hay, algún requisito lo impide, etc.)
1504    
1505          Requiere:          Requiere:
1506              objeto != None              posicion in Personaje.POSICIONES
1507              posicion in self.cuerpo.keys()              id_objeto != None
1508              el objeto se puede poner en esa posicion              n_orden >= 1
1509              el personaje cumple los requisitos del uso              n_instancia >= 1
             self.cuerpo[posicion] == None  
1510    
1511          Asegura:          Asegura:
1512              self.cuerpo[posicion] == objeto              self.cuerpo[posicion] == objeto
1513                return != None
1514          """          """
1515          self.__cuerpo[posicion] = objeto          objetos_quitados = self.reservar_posicion(posicion)
1516            if len(objetos_quitados) > 0:
1517                self.meter_en_mochila(objetos_quitados)
1518    
1519          for uso in objeto.usos:          n_objeto = self.buscar_en_mochila(id_objeto, n_orden)
1520              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:          objeto = self.acceder_a_mochila(n_objeto, n_instancia)
1521    
1522                  self.__cuerpo[posicion] = objeto          suceso = getattr(objeto, "personaje_pone_" + posicion)
1523            result = suceso(self)
1524            if result == 0:
1525                raise ExcepcionDeJuego("No te puedes poner este objeto en esa posicion.")
1526            else:
1527                objeto = self.sacar_de_mochila(n_objeto, n_instancia, 1)[0]
1528                self.__cuerpo[posicion] = objeto
1529                self.actuar_uno_mismo("Te pones " + objeto.nombre + " en " + posicion)
1530                if not sigilo:
1531                    #%% aquí habría que hacer una tirada en algún sitio...
1532                    self.actuar("se pone " + objeto.nombre + " en " + posicion)
1533    
1534                  if uso["descripcion"] != None:          return objeto.nombre
                     self.actuar_uno_mismo(uso["descripcion"])  
                 else:  
                     self.actuar_uno_mismo("Te pones " + objeto.nombre + " en " + posicion)  
1535    
                 for efecto in uso["efectos"]:  
                     #...  
                     pass  
1536    
1537                  break      def quitarse(self, posicion, sigilo=0):
1538            """Quitarse el objeto que esté en una posición del cuerpo y meterlo en la mochila.
1539    
1540            Genera un suceso de actuar_uno_mismo, uno de actuar (salvo si se indica sigilo)
1541            y uno de personaje_quita_XXXX en el objeto quitado.
1542    
1543      def quitarse(posicion):          Devuelve el nombre completo del objeto quitado.
         """Quitarse el objeto que esté en una posición del cuerpo.  
1544    
1545          Aquí desaparecen todos los efectos permanentes asociados a la operación de ponerse          Lanza ExcepcionDeJuego si no hay ningún objeto en la posición indicada o algún
1546          el objeto. Devuelve el objeto quitado.          requisito lo impide.
1547    
1548          Requiere:          Requiere:
1549              posicion in self.cuerpo.keys()              posicion in Personaje.POSICIONES
             self.cuerpo[posicion] != None  
1550    
1551          Asegura:          Asegura:
1552              self.cuerpo[posicion] == None              self.cuerpo[posicion] == None
1553              return != None              return != None
1554          """          """
1555            if self.__cuerpo[posicion] == None:
1556                raise ExcepcionDeJuego("No llevas nada puesto en " + posicion)
1557    
1558          objeto = self.__cuerpo[posicion]          objeto = self.__cuerpo[posicion]
         del self.__cuerpo[posicion]  
1559    
1560          for uso in objeto.usos:          suceso = getattr(objeto, "personaje_quita_" + posicion)
1561              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:          result = suceso(self)
1562                  self.actuar_uno_mismo("Te quitas " + objeto.nombre + " de " + posicion)          if result == 0:
1563                raise ExcepcionDeJuego("No te puedes quitar este objeto de esa posicion.")
1564                  for efecto in uso["efectos"]:          else:
1565                      #...              del self.__cuerpo[posicion]
1566                      pass              self.meter_en_mochila([objeto])
1567                self.actuar_uno_mismo("Te quitas " + objeto.nombre + " de " + posicion)
1568                if not sigilo:
1569                    #%% aquí habría que hacer una tirada en algún sitio...
1570                    self.actuar("se quita " + objeto.nombre + " de " + posicion)
1571    
1572                  break          return objeto.nombre
1573    
1574    
1575  # Código para pruebas unitarias del módulo.  # Código para pruebas unitarias del módulo.

Legend:
Removed from v.2.13  
changed lines
  Added in v.2.14

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