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

Diff of /ambar/personaje.py

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

revision 1.20 by amoyav, Thu Aug 15 13:09:07 2002 UTC revision 1.21 by amoyav, Fri Aug 16 08:41:13 2002 UTC
# Line 64  class Personaje: Line 64  class Personaje:
64                                ninguna compañia o va el último)                                ninguna compañia o va el último)
65       - anterior (Personaje): el personaje que va delante de el en la compañia (None si no está en       - anterior (Personaje): el personaje que va delante de el en la compañia (None si no está en
66                               ninguna compañía o va el primero)                               ninguna compañía o va el primero)
67       - mochila (Objeto[][]): lista de todos los objetos que va cargando el personaje. Es lista       - __mochila (Objeto[][]): lista de todos los objetos que va cargando el personaje. Es lista
68                               doble porque si hay varios objetos con el mismo id, van agrupados.                                 doble porque si hay varios objetos con el mismo id, van agrupados.
69       - cuerpo ({String:Objeto}): mapa con las partes del cuerpo del PJ, indicando el objeto que       - __cuerpo ({String:Objeto}): mapa con las partes del cuerpo del PJ, indicando el objeto que
70                                   lleva puesto en cada parte, o None si no lleva nada. Las partes                                     lleva puesto en cada parte, o None si no lleva nada. Las partes
71                                   o posiciones son: cabeza, cuello, tronco, brazo-izq, brazo-der,                                     o posiciones son: cabeza, cuello, tronco, brazo-izq, brazo-der,
72                                   mano-izq, mano-der, dos-manos, piernas, tobillo-izq, tobillo-der,                                     mano-izq, mano-der, dos-manos, piernas, tobillo-izq, tobillo-der,
73                                   pie-izq y pie-der.                                     pie-izq y pie-der.
74    
75      Un personaje puede ser controlado por cualquier clase, siempre y cuando ésta implemente      Un personaje puede ser controlado por cualquier clase, siempre y cuando ésta implemente
76      el interfaz Controlador, para que pueda responder a los eventos que genera un personaje.      el interfaz Controlador, para que pueda responder a los eventos que genera un personaje.
# Line 115  class Personaje: Line 115  class Personaje:
115        anterior != None -> anterior.siguiente == self        anterior != None -> anterior.siguiente == self
116        controlador == None -> ( siguiente == None and anterior == None )        controlador == None -> ( siguiente == None and anterior == None )
117    
118        mochila != None        __mochila != None
119        mochila[i] != None        __mochila[i] != None
120        len(mochila[i] > 0)        len(__mochila[i] > 0)
121        mochila[i][j] != None        __mochila[i][j] != None
122    
123        cuerpo != None        __cuerpo != None
124        len(cuerpo) == 13        len(__cuerpo) == 13
125      """      """
126    
127      # Versión del sistema de personajes (se incrementa al cambiar cualquiera      # Versión del sistema de personajes (se incrementa al cambiar cualquiera
128      # de Personaje, PersonajeJugador o PersonajeNoJugador)      # de Personaje, PersonajeJugador o PersonajeNoJugador)
129      VERSION = '1.1'      VERSION = '1.2'
130    
131      # Resultados de comparar otro personaje con este      # Resultados de comparar otro personaje con este
132      COMP_INF_MAS_FUERTE   = 9      COMP_INF_MAS_FUERTE   = 9
# Line 175  class Personaje: Line 175  class Personaje:
175    
176          self.siguiente = None          self.siguiente = None
177          self.anterior = None          self.anterior = None
         self.inventario = []  
         self.equipo = []  
178          self.salas_visitadas = {}          self.salas_visitadas = {}
179    
180            self.__mochila = []
181            self.__cuerpo = {"cabeza":None,
182                             "cuello":None,
183                             "tronco":None,
184                             "brazo-izq":None,
185                             "brazo-der":None,
186                             "mano-izq":None,
187                             "mano-der":None,
188                             "dos-manos":None,
189                             "piernas":None,
190                             "tobillo-izq":None,
191                             "tobillo-der":None,
192                             "pie-izq":None,
193                             "pie-der":None}
194    
195    
196      def __setattr__(self, name, value):      def __setattr__(self, name, value):
197          """Realiza ajustes automáticos al modificar cualquier parámetro"""          """Realiza ajustes automáticos al modificar cualquier parámetro"""
# Line 256  class Personaje: Line 269  class Personaje:
269          self.__dict__["idiomas"] = idiomas_instancias          self.__dict__["idiomas"] = idiomas_instancias
270    
271          # Verificar la versión.          # Verificar la versión.
272          assert(Personaje.VERSION == "1.1")                  assert(Personaje.VERSION == "1.2")        
273          while self.version != "1.1":          while self.version != "1.2":
274                            
275              if not self.__dict__.has_key("version"):              if not self.__dict__.has_key("version"):
276                  raise ValueError("Cargado personaje " + self.id + " obsoleto: sin versión" +                  raise ValueError("Cargado personaje " + self.id + " obsoleto: sin versión" +
# Line 269  class Personaje: Line 282  class Personaje:
282                  self.siguiente = None                  self.siguiente = None
283                  self.version = "1.1"                  self.version = "1.1"
284                  escribir("Convertido personaje " + self.id + " a versión 1.1")                  escribir("Convertido personaje " + self.id + " a versión 1.1")
285                elif self.version == "1.1":
286                    # Versión 1.1 -> 1.2: quitar inventario y equipo, y añadir __mochila y __cuerpo
287                    del self.inventario
288                    del self.equipo
289                    self.__mochila = []
290                    self.__cuerpo = {"cabeza":None,
291                                     "cuello":None,
292                                     "tronco":None,
293                                     "brazo-izq":None,
294                                     "brazo-der":None,
295                                     "mano-izq":None,
296                                     "mano-der":None,
297                                     "dos-manos":None,
298                                     "piernas":None,
299                                     "tobillo-izq":None,
300                                     "tobillo-der":None,
301                                     "pie-izq":None,
302                                     "pie-der":None}
303                    self.version = "1.2"
304                    escribir("Convertido personaje " + self.id + " a versión 1.2")
305              else:              else:
306                  raise ValueError("Cargado personaje " + self.id + " con versión desconocida: " +                  raise ValueError("Cargado personaje " + self.id + " con versión desconocida: " +
307                                   self.version + " cuando se esperaba " + Personaje.VERSION)                                                                   self.version + " cuando se esperaba " + Personaje.VERSION)                                
308                                
309    
310        def mochila(self):
311            return self.__mochila
312    
313    
314        def cuerpo(self):
315            return self.__cuerpo
316                    
317                                                            
318      def poner_experiencia(self, experiencia):      def poner_experiencia(self, experiencia):
319          """Modifica los puntos de experiencia del personaje.          """Modifica los puntos de experiencia del personaje.
# Line 310  class Personaje: Line 351  class Personaje:
351            return > 0.0            return > 0.0
352          """          """
353          total = self.volumen          total = self.volumen
354          for objeto in self.inventario:          for objeto in self.__mochila:
355              try:              for instancia in objeto:
356                  total += objeto['instancias'][0].volumen                  total += instancia.volumen
357              except:          for objeto in self.__cuerpo.values():
358                  total += 0              if objeto != None:
359          for objeto in self.equipo:                  total += objeto.volumen
             try:  
                 total += objeto['instancias'][0].volumen  
             except:  
                 total += 0  
360          return total          return total
361                    
362    
# Line 698  class Personaje: Line 735  class Personaje:
735          return tirada          return tirada
736    
737    
738        def generar_dificultad(self, atributo, modif_atributo):
739            """Calcula la dificultad de una prueba que el personaje impone a otros,
740            basandose en un atributo (pero que no es una competicion).
741    
742            La dificultad sera tal que otro personaje con un atributo igual que el tendra
743            un 50% de probabilidades de superar la prueba.
744    
745            Ejemplos de prueba: esconder un objeto, atrancar una puerta, etc.
746            """
747    
748            nivel_atrib = self.atrib[atributo] + modif_atributo
749            n_dados = floor(nivel_atrib / 6) + 1
750            rango = rango_dados(n_dados)
751            dificultad = nivel_atrib + rango[(len(rango)-1) / 2]
752    
753            return dificultad
754    
755    
756      def resultado_tirada(self, tirada, dificultad, modif_dificultad):      def resultado_tirada(self, tirada, dificultad, modif_dificultad):
757          """Devuelve el numero de exitos o fallos de una tirada contra una dificultad."""          """Devuelve el numero de exitos o fallos de una tirada contra una dificultad."""
758          diferencia = tirada - (dificultad + modif_dificultad)          diferencia = tirada - (dificultad + modif_dificultad)
759          if diferencia >= 0:  
760              return floor(diferencia / dificultad) + 1          # esto no me convence: la distribucion de las tiradas es muy rara,
761          else:          # y ademas no tiene sentido si la dificultad es cero
762              return floor(diferencia / dificultad) - 1          #if diferencia >= 0:
763            #    return floor(diferencia / dificultad) + 1
764            #else:
765            #    return floor(diferencia / dificultad) - 1
766            return diferencia
767    
768    
769      def prueba(self, atributo, modif_atributo, dificultad, modif_dificultad):      def prueba(self, atributo, modif_atributo, dificultad, modif_dificultad):
# Line 715  class Personaje: Line 774  class Personaje:
774          dificultad -- número que indica la dificultad de la prueba          dificultad -- número que indica la dificultad de la prueba
775          modif_dificultad -- numero que hay que sumar o restar a la dificultad          modif_dificultad -- numero que hay que sumar o restar a la dificultad
776    
777          Devuelve true si la prueba ha sido superada.          Devuelve el nº de exitos (>0) si la prueba ha sido superada o el nº de
778            fallos (<0) si no lo ha sido.
779          """          """
780          return self.resultado_tirada(self.tirada_atributo(atributo, modif_atributo),          return self.resultado_tirada(self.tirada_atributo(atributo, modif_atributo),
781                                       dificultad, modif_dificultad)                                       dificultad, modif_dificultad)
# Line 845  class Personaje: Line 905  class Personaje:
905              objeto != None              objeto != None
906          """          """
907          encontrado = 0          encontrado = 0
908          for lista_instancias in self.mochila:          for lista_instancias in self.__mochila:
909              if lista_instancias[0].id == objeto.id:              if lista_instancias[0].id == objeto.id:
910                  encontrado = 1                  encontrado = 1
911                  lista_instancias.append(objeto)                  lista_instancias.append(objeto)
912                  break                  break
913    
914          if not encontrado:          if not encontrado:
915              self.mochila.append([objeto])              self.__mochila.append([objeto])
916    
917    
918      def sacar_de_mochila(self, id_objeto, n_orden = 1):      def sacar_de_mochila(self, n_objeto, n_instancia):
919          """Sacar un objeto de la mochila del personaje.          """Sacar un objeto de la mochila del personaje.
920    
921          Si hay mas de una instancia con el mismo id, se puede elegir cual de          n_objeto es el numero de orden dentro de la mochila, y n_instancia es el
922          ellas (1 = la primera, 2 = la segunda, etc.)          numero de la instancia, ambos empezando por cero.
923    
924          Requiere:          Requiere:
925              id_objeto pertenece a un objeto existente en la mochila.              n_objeto in range(0, len(self.__mochila)-1)
926              n_orden esta dentro de rango              n_instancia in range(0, len(self.__mochila[n_objeto])-1)
         """  
         objeto = None  
927    
928          for lista_instancias in self.mochila:          Asegura:
929              if lista_instancias[0].id == id_objeto:              return != None
930                  objeto = lista_instancias[n_orden - 1]          """
931                  del lista_instancias[n_orden - 1]          objeto = self.__mochila[n_objeto][n_instancia]
932                  break  
933            del self.__mochila[n_objeto][n_instancia]
934            if len(self.__mochila[n_objeto]) == 0:
935                del self.__mochila[n_objeto]
936    
937          return objeto          return objeto
938    
# Line 885  class Personaje: Line 946  class Personaje:
946          puede haber que quitar mas de uno.          puede haber que quitar mas de uno.
947    
948          Requiere:          Requiere:
949              posicion in self.cuerpo.keys()              posicion in self.__cuerpo.keys()
950    
951          Asegura:          Asegura:
952              return != None              return != None
953          """          """
954          objetos_quitados = []          objetos_quitados = []
955    
956          if self.cuerpo[posicion] != None:          if self.__cuerpo[posicion] != None:
957              objetos_quitados.append(self.cuerpo[posicion])              objetos_quitados.append(self.__cuerpo[posicion])
958              self.quitarse(posicion)              self.quitarse(posicion)
959    
960          if posicion == "dos-manos":          if posicion == "dos-manos":
961              if self.cuerpo["mano-izq"] != None:              if self.__cuerpo["mano-izq"] != None:
962                  objetos_quitados.append(self.cuerpo["mano-izq"])                  objetos_quitados.append(self.__cuerpo["mano-izq"])
963                  self.quitarse("mano-izq")                  self.quitarse("mano-izq")
964              if self.cuerpo["mano-der"] != None:              if self.__cuerpo["mano-der"] != None:
965                  objetos_quitados.append(self.cuerpo["mano-der"])                  objetos_quitados.append(self.__cuerpo["mano-der"])
966                  self.quitarse("mano-der")                  self.quitarse("mano-der")
967    
968          if posicion == "mano-izq" or posicion == "mano-der":          if posicion == "mano-izq" or posicion == "mano-der":
969              if self.cuerpo["dos-manos"] != None:              if self.__cuerpo["dos-manos"] != None:
970                  objetos_quitados.append(self.cuerpo["dos-manos"])                  objetos_quitados.append(self.__cuerpo["dos-manos"])
971                  self.quitarse("dos-manos")                  self.quitarse("dos-manos")
972    
973          return objetos_quitados          return objetos_quitados
# Line 919  class Personaje: Line 980  class Personaje:
980    
981          Requiere:          Requiere:
982              objeto != None              objeto != None
983              posicion in self.cuerpo.keys()              posicion in self.__cuerpo.keys()
984              el objeto se puede poner en esa posicion              el objeto se puede poner en esa posicion
985              el personaje cumple los requisitos del uso              el personaje cumple los requisitos del uso
986              self.cuerpo[posicion] == None              self.__cuerpo[posicion] == None
987    
988          Asegura:          Asegura:
989              self.cuerpo[posicion] == objeto              self.__cuerpo[posicion] == objeto
990          """          """
991          self.cuerpo[posicion] = objeto          self.__cuerpo[posicion] = objeto
992    
993          for uso in objeto.usos:          for uso in objeto.usos:
994              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:
995    
996                  self.cuerpo[posicion] = objeto                  self.__cuerpo[posicion] = objeto
997    
998                  if uso["descripcion"] != None:                  if uso["descripcion"] != None:
999                      self.controlador.habla_unomismo(uso["descripcion"])                      self.controlador.habla_unomismo(uso["descripcion"])
# Line 954  class Personaje: Line 1015  class Personaje:
1015          el objeto. Devuelve el objeto quitado.          el objeto. Devuelve el objeto quitado.
1016    
1017          Requiere:          Requiere:
1018              posicion in self.cuerpo.keys()              posicion in self.__cuerpo.keys()
1019              self.cuerpo[posicion] != None              self.__cuerpo[posicion] != None
1020    
1021          Asegura:          Asegura:
1022              self.cuerpo[posicion] == None              self.__cuerpo[posicion] == None
1023              return != None              return != None
1024          """          """
1025          objeto = self.cuerpo[posicion]          objeto = self.__cuerpo[posicion]
1026          del self.cuerpo[posicion]          del self.__cuerpo[posicion]
1027    
1028          for uso in objeto.usos:          for uso in objeto.usos:
1029              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:              if uso["tipo"] == "ponerse" and uso["posicion"] == posicion:

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.21

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