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

Diff of /ambar/dialogonormal.py

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

revision 2.14 by amoyav, Tue Nov 5 11:54:43 2002 UTC revision 2.15 by pabloruiz, Tue Nov 5 22:58:22 2002 UTC
# Line 1  Line 1 
1  #!/usr/bin/env python  #!/usr/bin/env python
2  #  #
3  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
4  #Copyright (C) 2002  Pablo Ruiz Múzquiz  #Copyright (C) 2002  Pablo Ruiz Múzquiz
5  #  #
6  #  #
7  #This program is free software; you can redistribute it and/or modify  #This program is free software; you can redistribute it and/or modify
8  #it under the terms of the GNU General Public License as published by  #it under the terms of the GNU General Public License as published by
9  #the Free Software Foundation; either version 2 of the License, or  #the Free Software Foundation; either version 2 of the License, or
10  #(at your option) any later version.  #(at your option) any later version.
11  #  #
12  #This program is distributed in the hope that it will be useful,  #This program is distributed in the hope that it will be useful,
13  #but WITHOUT ANY WARRANTY; without even the implied warranty of  #but WITHOUT ANY WARRANTY; without even the implied warranty of
14  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  #GNU General Public License for more details.  #GNU General Public License for more details.
16  #  #
17  #You should have received a copy of the GNU General Public License  #You should have received a copy of the GNU General Public License
18  #along with this program; if not, write to the Free Software  #along with this program; if not, write to the Free Software
19  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  #  #
21  #  #
22  #Fichero: dialogonormal.py  #Fichero: dialogonormal.py
23    
24  """Clase DialogoNormal."""  """Clase DialogoNormal."""
25    
26  from dialogo import *  from dialogo import *
27  from mundo import *  from mundo import *
28  from sala import *  from sala import *
29  from logo import *  from logo import *
30  from utils import *  from utils import *
31  from idioma import *  from idioma import *
32  from personajejugador import *  from personajejugador import *
33  from fechahoramine import *  from fechahoramine import *
34  import ayuda  import ayuda
35    
36  class DialogoNormal(Dialogo):  class DialogoNormal(Dialogo):
37      """Dialogo principal del jugador, con la mayoría de los comandos.      """Dialogo principal del jugador, con la mayoría de los comandos.
38            
39      Contiene los siguientes atributos:      Contiene los siguientes atributos:
40       - __personaje (PersonajeJugador): copia del pesonaje controlado.       - __personaje (PersonajeJugador): copia del pesonaje controlado.
41       - __tirada_percep_sala (int): resultado de una tirada de inteligencia que se       - __tirada_percep_sala (int): resultado de una tirada de inteligencia que se
42                                     hace cada vez que se entra en una sala, para ver                                     hace cada vez que se entra en una sala, para ver
43                                     si se perciben los items con dificultad > 0                                     si se perciben los items con dificultad > 0
44    
45      Invariantes:      Invariantes:
46        __personaje != None        __personaje != None
47      """      """
48    
49      COMANDOS_POSIBLES = ['+salir','+doc','+ip','+seguir','+noseguir','+hablar','+hablarq','+hablaro','+hablare',\      COMANDOS_POSIBLES = ['+salir','+doc','+ip','+seguir','+noseguir','+hablar','+hablarq','+hablaro','+hablare',\
50                           '+susurrar','+susurrarq','+susurrare','+susurraro','+gritar','+gritarq','+gritare','+gritaro',\                           '+susurrar','+susurrarq','+susurrare','+susurraro','+gritar','+gritarq','+gritare','+gritaro',\
51                           '+idioma','+actuar','+decir','+preguntar','+atacar','+coger','+dejar','+esconder','+mochila',\                           '+idioma','+actuar','+decir','+preguntar','+atacar','+coger','+dejar','+esconder','+mochila',\
52                           '+examinar','+usar','+estadisticas','+mirar','+mr','+area','+observar','+silencio','+confiar','+noconfiar',\                           '+examinar','+usar','+estadisticas','+mirar','+mr','+area','+observar','+silencio','+confiar','+noconfiar',\
53                           '+dar','+amigos', '+recapitular', '+reloj']                           '+dar','+amigos', '+recapitular', '+reloj']
54    
55      COMANDOS_MAIAR =  ['+entorno','+ent','+listar','+localizar','+loc']      COMANDOS_MAIAR =  ['+entorno','+ent','+listar','+localizar','+loc']
56    
57      COMANDOS_DIRECCIONES = ['+norte', '+noreste', '+este', '+sureste', '+sur',      COMANDOS_DIRECCIONES = ['+norte', '+noreste', '+este', '+sureste', '+sur',
58                              '+suroeste', '+oeste', '+noroeste', '+arriba', '+abajo']                              '+suroeste', '+oeste', '+noroeste', '+arriba', '+abajo']
59    
60      COMANDOS_ABREV_DIR = {'+n':'+norte',   '+ne':'+noreste',   '+e':'+este',  '+se':'+sureste',      COMANDOS_ABREV_DIR = {'+n':'+norte',   '+ne':'+noreste',   '+e':'+este',  '+se':'+sureste',
61                            '+s':'+sur',     '+so': '+suroeste', '+o':'+oeste', '+no':'+noroeste',                            '+s':'+sur',     '+so': '+suroeste', '+o':'+oeste', '+no':'+noroeste',
62                            '+ar':'+arriba', '+ab':'+abajo'}                            '+ar':'+arriba', '+ab':'+abajo'}
63    
64    
65      def __init__(self, padre, conn, personaje):      def __init__(self, padre, conn, personaje):
66          Dialogo.__init__(self, padre, conn)          Dialogo.__init__(self, padre, conn)
67          self.__personaje = personaje          self.__personaje = personaje
68          self.__tirada_percep_sala = 0          self.__tirada_percep_sala = 0
69    
70          self.lanzar_tirada_percep_sala()          self.lanzar_tirada_percep_sala()
71            
72          self.cmd_estadisticas()          self.cmd_estadisticas()
73    
74          self.conn().send('La apariencia de tu personaje es:')          self.conn().send('La apariencia de tu personaje es:')
75          for item in self.__personaje.descripcion:          for item in self.__personaje.descripcion:
76              self.conn().send(color(31) + item["texto"] + "\n" + finl)              self.conn().send(color(31) + item["texto"] + "\n" + finl)
77    
78          self.cmd_mirar()          self.cmd_mirar()
79    
80          self.conn().send("IMPORTANTE: los comandos se escriben empezando con el carácter +.")          self.conn().send("IMPORTANTE: los comandos se escriben empezando con el carácter +.")
81          self.conn().send("Escribe +? para leer la ayuda.")          self.conn().send("Escribe +? para leer la ayuda.")
82          self.conn().send("Para hablar, simplemente escribe algo sin + delante.")          self.conn().send("Para hablar, simplemente escribe algo sin + delante.")
83          self.conn().send('')          self.conn().send('')
84          if self.__personaje.esMaia(): self.conn().send("Eres un Maia de Minë.")          if self.__personaje.esMaia(): self.conn().send("Eres un Maia de Minë.")
85          self.conn().send('')          self.conn().send('')
86          self.estado_0()          self.estado_0()
87    
88    
89      def lanzar_tirada_percep_sala(self):      def lanzar_tirada_percep_sala(self):
90          """Método llamado cada vez que se entra en una sala nueva,          """Método llamado cada vez que se entra en una sala nueva,
91          para hacer la tirada."""          para hacer la tirada."""
92          self.__tirada_percep_sala = self.__personaje.tirada_atributo("inteligencia", 0)          self.__tirada_percep_sala = self.__personaje.tirada_atributo("inteligencia", 0)
93    
94    
95      # -------------------------------------------      # -------------------------------------------
96      # EVENTOS DE CONTROLADOR (ver controlador.py)      # EVENTOS DE CONTROLADOR (ver controlador.py)
97      # -------------------------------------------      # -------------------------------------------
98    
99      def entra_personaje(self, personaje):      def entra_personaje(self, personaje):
100          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
101              if isinstance(personaje, PersonajeJugador):              if isinstance(personaje, PersonajeJugador):
102                  self.conn().send(color(35) + personaje.id + " ha entrado" + finl)                  self.conn().send(color(35) + personaje.id + " ha entrado" + finl)
103              else:              else:
104                  self.conn().send(color(35) + personaje.nombre + " ha entrado" + finl)                  self.conn().send(color(35) + personaje.nombre + " ha entrado" + finl)
105                                                    
106                                                    
107      def sale_personaje(self, personaje, nombre_sala_destino):      def sale_personaje(self, personaje, nombre_sala_destino):
108          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
109              if isinstance(personaje, PersonajeJugador):              if isinstance(personaje, PersonajeJugador):
110                  self.conn().send(color(35) + personaje.id + " se va hacia " +                  self.conn().send(color(35) + personaje.id + " se va hacia " +
111                                   nombre_sala_destino + finl)                                   nombre_sala_destino + finl)
112              else:              else:
113                  self.conn().send(color(35) + personaje.nombre + " se va hacia " +                  self.conn().send(color(35) + personaje.nombre + " se va hacia " +
114                                   nombre_sala_destino + finl)                                   nombre_sala_destino + finl)
115                                                    
116                                                    
117      def habla_personaje(self, personaje, mensaje):      def habla_personaje(self, personaje, mensaje):
118          if isinstance(personaje, PersonajeJugador):          if isinstance(personaje, PersonajeJugador):
119              self.conn().send("\n"+ personaje.id + " dice: " + personaje.color_texto() + mensaje +'  ' + finl)              self.conn().send("\n"+ personaje.id + " dice: " + personaje.color_texto() + mensaje +'  ' + finl)
120          else:          else:
121              self.conn().send("\n"+ personaje.nombre + " dice: " + personaje.color_texto() + mensaje +'  ' + finl)              self.conn().send("\n"+ personaje.nombre + " dice: " + personaje.color_texto() + mensaje +'  ' + finl)
122    
123                    
124      def susurra_personaje(self, personaje, mensaje):      def susurra_personaje(self, personaje, mensaje):
125          if isinstance(personaje, PersonajeJugador):          if isinstance(personaje, PersonajeJugador):
126              self.conn().send(personaje.id + " susurra: " + personaje.color_texto()  + mensaje + finl)              self.conn().send(personaje.id + " susurra: " + personaje.color_texto()  + mensaje + finl)
127          else:          else:
128              self.conn().send(personaje.nombre + " susurra: " + personaje.color_texto()  + mensaje + finl)              self.conn().send(personaje.nombre + " susurra: " + personaje.color_texto()  + mensaje + finl)
129    
130                    
131      def grita_personaje(self, personaje, mensaje):      def grita_personaje(self, personaje, mensaje):
132          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
133              if isinstance(personaje, PersonajeJugador):              if isinstance(personaje, PersonajeJugador):
134                  self.conn().send("\n" + color(35) + personaje.id + " grita: " + personaje.color_texto()  + mensaje + finl)                  self.conn().send("\n" + color(35) + personaje.id + " grita: " + personaje.color_texto()  + mensaje + finl)
135              else:              else:
136                  self.conn().send("\n" + color(35) + personaje.nombre + " grita: " + personaje.color_texto()  + mensaje + finl)                  self.conn().send("\n" + color(35) + personaje.nombre + " grita: " + personaje.color_texto()  + mensaje + finl)
137    
138    
139      def actua_personaje(self, personaje, accion):      def actua_personaje(self, personaje, accion):
140          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
141              if isinstance(personaje, PersonajeJugador):              if isinstance(personaje, PersonajeJugador):
142                  self.conn().send(personaje.id +  " " + accion)                  self.conn().send(personaje.id +  " " + accion)
143              else:              else:
144                  self.conn().send(personaje.nombre +  " " + accion)                  self.conn().send(personaje.nombre +  " " + accion)
145    
146    
147      def actua_individual_personaje(self, personaje, accion):      def actua_individual_personaje(self, personaje, accion):
148          if isinstance(personaje, PersonajeJugador):          if isinstance(personaje, PersonajeJugador):
149              self.conn().send(personaje.color_texto() + personaje.id + ' ' + accion + finl)              self.conn().send(personaje.color_texto() + personaje.id + ' ' + accion + finl)
150          else:          else:
151              self.conn().send(personaje.color_texto() + personaje.nombre + ' ' + accion + finl)              self.conn().send(personaje.color_texto() + personaje.nombre + ' ' + accion + finl)
152    
153            
154      def actua_uno_mismo(self, accion):      def actua_uno_mismo(self, accion):
155          self.conn().send(accion)          self.conn().send(accion)
156                                                
157                                                    
158      def actua_global_personaje(self, personaje, accion):      def actua_global_personaje(self, personaje, accion):
159          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
160              if isinstance(personaje, PersonajeJugador):              if isinstance(personaje, PersonajeJugador):
161                  self.conn().send(color(35) + personaje.id + " " + accion + finl)                  self.conn().send(color(35) + personaje.id + " " + accion + finl)
162              else:              else:
163                  self.conn().send(color(35) + personaje.nombre + " " + accion + finl)                  self.conn().send(color(35) + personaje.nombre + " " + accion + finl)
164                                                    
165                                                    
166      def suceso_entorno(self, suceso):      def suceso_entorno(self, suceso):
167          if self.__personaje.silencio == "no":          if self.__personaje.silencio == "no":
168              self.conn().send('...'+ suceso + '...')              self.conn().send('...'+ suceso + '...')
169                    
170            
171      def ataca_personaje(self, personaje, result):      def ataca_personaje(self, personaje, result):
172          # Llamar a la función correspondiente según estado          # Llamar a la función correspondiente según estado
173          nombre_func = "ataque_" + self.estado          nombre_func = "ataque_" + self.estado
174          if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)          if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)
175                    
176          func = getattr(self, nombre_func, None)          func = getattr(self, nombre_func, None)
177          if func == None:          if func == None:
178                    ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \                    ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \
179                    ((self.personaje != None and  "(" + self.personaje.id + ")") or "")                    ((self.personaje != None and  "(" + self.personaje.id + ")") or "")
180          else:          else:
181              func(personaje, result)              func(personaje, result)
182    
183    
184      def movimiento_automatico(self):      def movimiento_automatico(self):
185          self.conn().send("Te mueves siguiendo a " + self.__personaje.anterior.id)          self.conn().send("Te mueves siguiendo a " + self.__personaje.anterior.id)
186          self.lanzar_tirada_percep_sala()          self.lanzar_tirada_percep_sala()
187          self.cmd_mirar()          self.cmd_mirar()
188    
189          if self.__personaje.salas_visitadas.get(self.__personaje.sala.id) != 'si':          if self.__personaje.salas_visitadas.get(self.__personaje.sala.id) != 'si':
190              self.conn().send("Es la primera vez que estás aquí...")              self.conn().send("Es la primera vez que estás aquí...")
191              self.__personaje.salas_visitadas.update({self.__personaje.sala.id:'si'})              self.__personaje.salas_visitadas.update({self.__personaje.sala.id:'si'})
192              #Ganamos un punto de experiencia (hay que premiar la exploración)              #Ganamos un punto de experiencia (hay que premiar la exploración)
193              self.__personaje.poner_experiencia(self.__personaje.experiencia + 1)              self.__personaje.poner_experiencia(self.__personaje.experiencia + 1)
194    
195    
196      # -------------------      # -------------------
197      # ESTADOS DEL DIALOGO      # ESTADOS DEL DIALOGO
198      # -------------------      # -------------------
199    
200      def estado_0(self):      def estado_0(self):
201          self.poner_estado(0)          self.poner_estado(0)
202          self.conn().send(color(33)+'? ' + finl, 0)          self.conn().send(color(33)+'? ' + finl, 0)
203                    
204    
205      def comando_0(self, cmd_list):      def comando_0(self, cmd_list):
206          """          """
207          Esta función se encarga de preparar el input introducido          Esta función se encarga de preparar el input introducido
208          en una serie de comandos independientes si procede.          en una serie de comandos independientes si procede.
209          """          """
210          if len(cmd_list) == 0:          if len(cmd_list) == 0:
211              accion = ''              accion = ''
212              args = []              args = []
213              self.ejecutar(accion, args)              self.ejecutar(accion, args)
214          else:          else:
215              acciones_temp = ' '.join(cmd_list)              acciones_temp = ' '.join(cmd_list)
216              acciones = acciones_temp.split('&&')[:]              acciones = acciones_temp.split('&&')[:]
217              for una_accion in acciones:              for una_accion in acciones:
218                  una_accion = una_accion.split()                  una_accion = una_accion.split()
219                  accion = una_accion[0]                  accion = una_accion[0]
220                  try:                  try:
221                      args = una_accion[1:]                      args = una_accion[1:]
222                  except:                  except:
223                      args = []                      args = []
224                                    
225                  self.ejecutar(accion, args)                  self.ejecutar(accion, args)
226    
227    
228      def tick_0(self, tick_ahora, tick_anterior):      def tick_0(self, tick_ahora, tick_anterior):
229          """Durante el dialogo normal, los ticks del reloj se usan para ir 'cantando'          """Durante el dialogo normal, los ticks del reloj se usan para ir 'cantando'
230          el tiempo, como los serenos.          el tiempo, como los serenos.
231          """          """
232          if tick_ahora.hora() != tick_anterior.hora():          if tick_ahora.hora() != tick_anterior.hora():
233              self.conn().send(color(35) + "El tiempo pasa. Son las %d horas (%s)." %              self.conn().send(color(35) + "El tiempo pasa. Son las %d horas (%s)." %
234                                           (tick_ahora.hora(), tick_ahora.desc_seccion()) + finl)                                           (tick_ahora.hora(), tick_ahora.desc_seccion()) + finl)
235                            
236                            
237      def ataque_normal_0(self, personaje, result):      def ataque_normal_0(self, personaje, result):
238          # Al recibir un ataque, pasamos inmediantamente a estado combate.          # Al recibir un ataque, pasamos inmediantamente a estado combate.
239                    
240          self.oponente = personaje          self.oponente = personaje
241          self.cbt_empieza_combate_defiendes()          self.cbt_empieza_combate_defiendes()
242          self.cbt_te_pegan(result)          self.cbt_te_pegan(result)
243                    
244          if (self.__personaje.estado == "muerto") or (self.oponente.estado == "muerto"):          if (self.__personaje.estado == "muerto") or (self.oponente.estado == "muerto"):
245              self.cbt_termina_combate()              self.cbt_termina_combate()
246              self.estado_0()              self.estado_0()
247          else:          else:
248              # Al poner un crono de 3 segundos, el combate funciona como              # Al poner un crono de 3 segundos, el combate funciona como
249              # una sucesion de golpes alternados cada 3 segundos.              # una sucesion de golpes alternados cada 3 segundos.
250              self.lanzar_crono(3)              self.lanzar_crono(3)
251              self.estado_combate_1()              self.estado_combate_1()
252                    
253    
254      def estado_1(self):      def estado_1(self):
255          self.padre().desconectar()          self.padre().desconectar()
256    
257    
258      # --------------------      # --------------------
259      # "PARSER" DE COMANDOS      # "PARSER" DE COMANDOS
260      # --------------------      # --------------------
261    
262      def ejecutar(self, accion, args):      def ejecutar(self, accion, args):
263    
264          #Debido a la necesidad de loggear la actividad          #Debido a la necesidad de loggear la actividad
265          #se escribe tanto en pantalla como en el fichero de log          #se escribe tanto en pantalla como en el fichero de log
266          #la orden dada.          #la orden dada.
267          comando_dado = ' '.join([self.__personaje.nombre+' ejecuta: ',accion,' '.join(args)])          comando_dado = ' '.join([self.__personaje.nombre+' ejecuta: ',accion,' '.join(args)])
268          escribir(comando_dado)          escribir(comando_dado)
269                    
270          es_salida = 0          es_salida = 0
271    
272          # Primero se ve si el comando es en realidad una de las          # Primero se ve si el comando es en realidad una de las
273          # posibles direcciones.  Notar que la direccion "otro" no aparece en          # posibles direcciones.  Notar que la direccion "otro" no aparece en
274          # esta lista (si alguna sala tiene una  salida en esta direccion, hay          # esta lista (si alguna sala tiene una  salida en esta direccion, hay
275          # que usar el id de la salida para moverse a ella).          # que usar el id de la salida para moverse a ella).
276    
277          if accion in DialogoNormal.COMANDOS_DIRECCIONES:          if accion in DialogoNormal.COMANDOS_DIRECCIONES:
278              es_salida = 1              es_salida = 1
279              direccion = accion[1:]              direccion = accion[1:]
280          elif accion in DialogoNormal.COMANDOS_ABREV_DIR.keys():          elif accion in DialogoNormal.COMANDOS_ABREV_DIR.keys():
281              es_salida = 1              es_salida = 1
282              direccion = DialogoNormal.COMANDOS_ABREV_DIR[accion][1:]              direccion = DialogoNormal.COMANDOS_ABREV_DIR[accion][1:]
283    
284          if es_salida == 1:          if es_salida == 1:
285              encontrado = 0              encontrado = 0
286    
287              for salida in self.__personaje.sala.salidas:              for salida in self.__personaje.sala.salidas:
288                  if direccion == salida["direccion"] and \                  if direccion == salida["direccion"] and \
289                     self.__tirada_percep_sala >= salida["dificultad"]:                     self.__tirada_percep_sala >= salida["dificultad"]:
290                      encontrado = 1                      encontrado = 1
291                      self.cmd_mover(salida["id"])                      self.cmd_mover(salida["id"])
292                      #En cuanto hayamos encontrado una sala que esté en esa dirección                      #En cuanto hayamos encontrado una sala que esté en esa dirección
293                      #nos vamos a ella. De otra forma, Minë te presenta todas, una por una                      #nos vamos a ella. De otra forma, Minë te presenta todas, una por una
294                      #y te deja en la última del búcle                      #y te deja en la última del búcle
295                      break                      break
296                                            
297              if encontrado == 0:              if encontrado == 0:
298                  self.conn().send("No puedes ir por ahi.")                  self.conn().send("No puedes ir por ahi.")
299    
300              self.estado_0()              self.estado_0()
301    
302          # Si no, ver si es el id de una de las salidas.          # Si no, ver si es el id de una de las salidas.
303          if es_salida == 0:          if es_salida == 0:
304              for salida in self.__personaje.sala.salidas:              for salida in self.__personaje.sala.salidas:
305                  if normalizar_id(accion[1:]) == extraer_id(salida["descripcion"]) and \                  if normalizar_id(accion[1:]) == extraer_id(salida["descripcion"]) and \
306                     self.__tirada_percep_sala >= salida["dificultad"]:                     self.__tirada_percep_sala >= salida["dificultad"]:
307                      es_salida = 1                      es_salida = 1
308                      self.cmd_mover(salida["id"])                      self.cmd_mover(salida["id"])
309                      self.estado_0()                      self.estado_0()
310    
311          # Si no, ver si es un comando. En ese caso, llamar a la función          # Si no, ver si es un comando. En ese caso, llamar a la función
312          # especializada en ejecutar cada comando.          # especializada en ejecutar cada comando.
313          if es_salida == 0:          if es_salida == 0:
314    
315              #Comprobamos que un jugador normal no intenta ejecutar una acción de Maia              #Comprobamos que un jugador normal no intenta ejecutar una acción de Maia
316              if accion in DialogoNormal.COMANDOS_MAIAR and self.__personaje.esMaia() == 0:              if accion in DialogoNormal.COMANDOS_MAIAR and self.__personaje.esMaia() == 0:
317                  self.conn().send("Error, comando no reconocido. Escribe '+?' y pulsa ENTER")                  self.conn().send("Error, comando no reconocido. Escribe '+?' y pulsa ENTER")
318                  self.conn().send("para una lista de comandos.")                  self.conn().send("para una lista de comandos.")
319                  self.estado_0()                  self.estado_0()
320    
321              #Miramos cada acción por separado.              #Miramos cada acción por separado.
322                            
323              elif accion == "+decir":              elif accion == "+decir":
324                  self.cmd_hablar_pnj("decir", args)                  self.cmd_hablar_pnj("decir", args)
325                  self.estado_0()                  self.estado_0()
326                                    
327              elif accion == "+preguntar" or accion == "+p":              elif accion == "+preguntar" or accion == "+p":
328                  self.cmd_hablar_pnj("preguntar", args)                  self.cmd_hablar_pnj("preguntar", args)
329                  self.estado_0()                  self.estado_0()
330                                    
331              elif accion == "+recapitular" or accion == "+recap":              elif accion == "+recapitular" or accion == "+recap":
332                  self.cmd_recapitular(args)                  self.cmd_recapitular(args)
333                  self.estado_0()                  self.estado_0()
334                                    
335              elif accion == "+creditos":              elif accion == "+creditos":
336                  for linea in creditos.splitlines():                  for linea in creditos.splitlines():
337                      self.conn().send(linea)                      self.conn().send(linea)
338                  self.estado_0()                  self.estado_0()
339    
340              elif accion == "+sus" or accion == "+susurrar":              elif accion == "+sus" or accion == "+susurrar":
341                  try:                  try:
342                      oyente = args[0]                      oyente = args[0]
343                      mensaje = " ".join(args[1:])                      mensaje = " ".join(args[1:])
344                      self.cmd_susurrar(oyente, mensaje, idioma=self.__personaje.idioma_base)                      self.cmd_susurrar(oyente, mensaje, idioma=self.__personaje.idioma_base)
345                  except:                  except:
346                      self.conn().send('Tienes que decir algo a alguien')                      self.conn().send('Tienes que decir algo a alguien')
347                      self.estado_0()                      self.estado_0()
348                  self.estado_0()                  self.estado_0()
349    
350              elif accion == "+susq" or accion == "+susurrarq":              elif accion == "+susq" or accion == "+susurrarq":
351                  try:                  try:
352                      oyente = args[0]                      oyente = args[0]
353                      mensaje = " ".join(args[1:])                      mensaje = " ".join(args[1:])
354                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_quenya)                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_quenya)
355                  except:                  except:
356                      self.conn().send('Tienes que decir algo a alguien')                      self.conn().send('Tienes que decir algo a alguien')
357                      self.estado_0()                      self.estado_0()
358                  self.estado_0()                  self.estado_0()
359    
360              elif accion == "+suse" or accion == "+susurrare":              elif accion == "+suse" or accion == "+susurrare":
361                  try:                  try:
362                      oyente = args[0]                      oyente = args[0]
363                      mensaje = " ".join(args[1:])                      mensaje = " ".join(args[1:])
364                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_enano)                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_enano)
365                  except:                  except:
366                      self.conn().send('Tienes que decir algo a alguien')                      self.conn().send('Tienes que decir algo a alguien')
367                      self.estado_0()                      self.estado_0()
368                  self.estado_0()                  self.estado_0()
369    
370              elif accion == "+suso" or accion == "+susurraro":              elif accion == "+suso" or accion == "+susurraro":
371                  try:                  try:
372                      oyente = args[0]                      oyente = args[0]
373                      mensaje = " ".join(args[1:])                      mensaje = " ".join(args[1:])
374                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_orco)                      self.cmd_susurrar(oyente, mensaje, idioma=Idioma_orco)
375                  except:                  except:
376                      self.conn().send('Tienes que decir algo a alguien')                      self.conn().send('Tienes que decir algo a alguien')
377                      self.estado_0()                      self.estado_0()
378                  self.estado_0()                  self.estado_0()
379    
380              elif accion == "+h" or accion == "+hablar":              elif accion == "+h" or accion == "+hablar":
381                  mensaje = " ".join(args)                  mensaje = " ".join(args)
382                  self.cmd_hablar(mensaje, idioma=Idioma_oestron)                  self.cmd_hablar(mensaje, idioma=Idioma_oestron)
383                  self.estado_0()                  self.estado_0()
384                                    
385              elif accion == "+hq" or accion == "+hablarq":              elif accion == "+hq" or accion == "+hablarq":
386                  mensaje = " ".join(args)                  mensaje = " ".join(args)
387                  self.cmd_hablar(mensaje, idioma=Idioma_quenya)                  self.cmd_hablar(mensaje, idioma=Idioma_quenya)
388                  self.estado_0()                  self.estado_0()
389    
390              elif accion == "+he" or accion == "+hablare":              elif accion == "+he" or accion == "+hablare":
391                  mensaje = " ".join(args)                  mensaje = " ".join(args)
392                  self.cmd_hablar(mensaje, idioma=Idioma_enano)                  self.cmd_hablar(mensaje, idioma=Idioma_enano)
393                  self.estado_0()                  self.estado_0()
394    
395              elif accion == "+ho" or accion == "+hablaro":              elif accion == "+ho" or accion == "+hablaro":
396                  mensaje = " ".join(args)                  mensaje = " ".join(args)
397                  self.cmd_hablar(mensaje, idioma=Idioma_orco)                  self.cmd_hablar(mensaje, idioma=Idioma_orco)
398                  self.estado_0()                  self.estado_0()
399    
400              elif accion == "+g" or accion == "+gritar":              elif accion == "+g" or accion == "+gritar":
401                  mensaje = " ".join(args)                  mensaje = " ".join(args)
402                  self.cmd_gritar(mensaje)                  self.cmd_gritar(mensaje)
403                  self.estado_0()                  self.estado_0()
404                                    
405              elif accion == "+gq" or accion == "+gritarq":              elif accion == "+gq" or accion == "+gritarq":
406                  mensaje = " ".join(args)                  mensaje = " ".join(args)
407                  self.cmd_gritar(mensaje, idioma=Idioma_quenya)                  self.cmd_gritar(mensaje, idioma=Idioma_quenya)
408                  self.estado_0()                  self.estado_0()
409    
410              elif accion == "+ge" or accion == "+gritare":              elif accion == "+ge" or accion == "+gritare":
411                  mensaje = " ".join(args)                  mensaje = " ".join(args)
412                  self.cmd_gritar(mensaje, idioma=Idioma_enano)                  self.cmd_gritar(mensaje, idioma=Idioma_enano)
413                  self.estado_0()                  self.estado_0()
414    
415              elif accion == "+go" or accion == "+gritaro":              elif accion == "+go" or accion == "+gritaro":
416                  mensaje = " ".join(args)                  mensaje = " ".join(args)
417                  self.cmd_gritar(mensaje, idioma=Idioma_orco)                  self.cmd_gritar(mensaje, idioma=Idioma_orco)
418                  self.estado_0()                  self.estado_0()
419    
420              elif accion == "+est" or accion == "+estadisticas":              elif accion == "+est" or accion == "+estadisticas":
421                  self.cmd_estadisticas()                  self.cmd_estadisticas()
422                  self.estado_0()                  self.estado_0()
423    
424              elif accion == "+m" or accion == "+mirar":              elif accion == "+m" or accion == "+mirar":
425                  self.cmd_mirar()                  self.cmd_mirar()
426                  self.estado_0()                  self.estado_0()
427    
428              elif accion == "+mr":              elif accion == "+mr":
429                  self.cmd_mirar(resumen=1)                  self.cmd_mirar(resumen=1)
430                  self.estado_0()                  self.estado_0()
431    
432              elif accion == "+mochila" or accion == "+mo":              elif accion == "+mochila" or accion == "+mo":
433                  self.cmd_mochila()                  self.cmd_mochila()
434                  self.estado_0()                  self.estado_0()
435    
436              elif accion == "+silencio":              elif accion == "+silencio":
437                  self.cmd_silencio()                  self.cmd_silencio()
438                  self.estado_0()                  self.estado_0()
439                                    
440              elif accion == "+idioma":              elif accion == "+idioma":
441                  nombre_idioma_base = (len(args) > 0 and args[0]) or ""                  nombre_idioma_base = (len(args) > 0 and args[0]) or ""
442                  self.cmd_idioma(nombre_idioma_base)                  self.cmd_idioma(nombre_idioma_base)
443                  self.estado_0()                  self.estado_0()
444                                    
445              elif accion == "+c" or accion == "+coger":              elif accion == "+c" or accion == "+coger":
446                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \
447                      self.parsear_ident_objeto(args, "coger")                      self.parsear_ident_objeto(args, "coger")
448                  if ok:                  if ok:
449                      self.cmd_coger(id_objeto, cantidad, n_orden, n_instancia)                      self.cmd_coger(id_objeto, cantidad, n_orden, n_instancia)
450                  self.estado_0()                  self.estado_0()
451                                    
452  #%%                try:  #%%                try:
453  #%%                    nombre_objeto = (len(args) > 0 and args[0]) or ""  #%%                    nombre_objeto = (len(args) > 0 and args[0]) or ""
454  #%%                    cantidad = int((len(args) > 1 and args[1])) or 1  #%%                    cantidad = int((len(args) > 1 and args[1])) or 1
455  #%%                    if cantidad > 50:  #%%                    if cantidad > 50:
456  #%%                        cantidad = 50  #%%                        cantidad = 50
457  #%%                        self.conn().send("No se permite coger más de 50 objetos por vez.")  #%%                        self.conn().send("No se permite coger más de 50 objetos por vez.")
458  #%%                    self.cmd_coger(nombre_objeto,cantidad)  #%%                    self.cmd_coger(nombre_objeto,cantidad)
459  #%%                    self.estado_0()  #%%                    self.estado_0()
460  #%%                except:  #%%                except:
461  #%%                    self.conn().send('Ha ocurrido un error. Consulta la sintaxis del comando en la ayuda con +?')  #%%                    self.conn().send('Ha ocurrido un error. Consulta la sintaxis del comando en la ayuda con +?')
462  #%%                    self.estado_0()  #%%                    self.estado_0()
463    
464              elif accion == "+d" or accion == "+dejar":              elif accion == "+d" or accion == "+dejar":
465                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \
466                      self.parsear_ident_objeto(args, "dejar")                      self.parsear_ident_objeto(args, "dejar")
467                  if ok:                  if ok:
468                      self.cmd_dejar(id_objeto, cantidad, n_orden, n_instancia)                      self.cmd_dejar(id_objeto, cantidad, n_orden, n_instancia)
469    
470                  self.estado_0()                  self.estado_0()
471    
472              elif accion == "+dar":              elif accion == "+dar":
473                  (id_receptor, id_objeto, cantidad, n_orden, n_instancia, ok) = \                  (id_receptor, id_objeto, cantidad, n_orden, n_instancia, ok) = \
474                      self.parsear_ident_objeto(args, "dar")                      self.parsear_ident_objeto(args, "dar")
475                  if ok:                  if ok:
476                      self.cmd_dar(id_receptor, id_objeto, cantidad, n_orden, n_instancia)                      self.cmd_dar(id_receptor, id_objeto, cantidad, n_orden, n_instancia)
477    
478                  self.estado_0()                  self.estado_0()
479    
480              elif accion == "+confiar":              elif accion == "+confiar":
481                  id_personaje_de_confianza = args[0]                  id_personaje_de_confianza = args[0]
482                  self.__personaje.ids_amigos.update({id_personaje_de_confianza:1})                  self.__personaje.ids_amigos.update({id_personaje_de_confianza:1})
483                  self.conn().send("A partir de ahora confías en "+id_personaje_de_confianza)                  self.conn().send("A partir de ahora confías en "+id_personaje_de_confianza)
484    
485                  self.estado_0()                  self.estado_0()
486                                    
487              elif accion == "+noconfiar":              elif accion == "+noconfiar":
488                  id_personaje_de_no_confianza = args[0]                  id_personaje_de_no_confianza = args[0]
489                  self.__personaje.ids_amigos.update({id_personaje_de_no_confianza:0})                  self.__personaje.ids_amigos.update({id_personaje_de_no_confianza:0})
490                  self.conn().send("A partir de ahora no confías en "+id_personaje_de_no_confianza)                  self.conn().send("A partir de ahora no confías en "+id_personaje_de_no_confianza)
491    
492                  self.estado_0()                  self.estado_0()
493    
494              elif accion == "+amigos":              elif accion == "+amigos":
495                  self.cmd_listar_amigos()                  self.cmd_listar_amigos()
496                  self.estado_0()                  self.estado_0()
497    
498                                            
499              elif accion == "+esc" or accion == "+esconder":              elif accion == "+esc" or accion == "+esconder":
500                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \
501                      self.parsear_ident_objeto(args, "esconder")                      self.parsear_ident_objeto(args, "esconder")
502                  if ok:                  if ok:
503                      dificultad = self.__personaje.generar_dificultad("inteligencia", 0)                      dificultad = self.__personaje.generar_dificultad("inteligencia", 0)
504                      self.cmd_dejar(id_objeto, cantidad, n_orden, n_instancia, dificultad)                      self.cmd_dejar(id_objeto, cantidad, n_orden, n_instancia, dificultad)
505    
506                  self.estado_0()                  self.estado_0()
507    
508  #%%                try:  #%%                try:
509  #%%                    nombre_objeto = (len(args) > 0 and args[0]) or ""  #%%                    nombre_objeto = (len(args) > 0 and args[0]) or ""
510  #%%                    cantidad = int((len(args) > 1 and args[1])) or 1  #%%                    cantidad = int((len(args) > 1 and args[1])) or 1
511  #%%                    self.cmd_dejar(nombre_objeto, cantidad, accion = "escondido", dif=self.__personaje.atrib["inteligencia"])  #%%                    self.cmd_dejar(nombre_objeto, cantidad, accion = "escondido", dif=self.__personaje.atrib["inteligencia"])
512  #%%                    self.estado_0()  #%%                    self.estado_0()
513  #%%                except:  #%%                except:
514  #%%                    self.conn().send('Ha ocurrido un error. Consulta la sintaxis del comando en la ayuda con +?')  #%%                    self.conn().send('Ha ocurrido un error. Consulta la sintaxis del comando en la ayuda con +?')
515  #%%                    self.estado_0()                  #%%                    self.estado_0()                
516    
517              elif accion == "+ex" or accion == "+examinar":              elif accion == "+ex" or accion == "+examinar":
518                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \                  (id_objeto, cantidad, n_orden, n_instancia, ok) = \
519                      self.parsear_ident_objeto(args, "examinar")                      self.parsear_ident_objeto(args, "examinar")
520                  if ok:                  if ok:
521                      if cantidad > 1:                      if cantidad > 1:
522                          self.conn().send("El comando no es correcto, consulta la ayuda con +?")                          self.conn().send("El comando no es correcto, consulta la ayuda con +?")
523                      else:                      else:
524                          self.cmd_examinar(id_objeto, n_orden, n_instancia)                          self.cmd_examinar(id_objeto, n_orden, n_instancia)
525    
526                  self.estado_0()                  self.estado_0()
527    
528  #%%                nombre_objeto = (len(args) > 0 and args[0]) or ""  #%%                nombre_objeto = (len(args) > 0 and args[0]) or ""
529  #%%                posicion = int((len(args) > 1 and args[1])) or 1  #%%                posicion = int((len(args) > 1 and args[1])) or 1
530  #%%                if posicion < 1: posicion = 1  #%%                if posicion < 1: posicion = 1
531  #%%                self.cmd_examinar(nombre_objeto,posicion)  #%%                self.cmd_examinar(nombre_objeto,posicion)
532  #%%                self.estado_0()  #%%                self.estado_0()
533                                    
534    
535              elif accion == "+u" or accion == "+usar":              elif accion == "+u" or accion == "+usar":
536                  nombre_objeto = (len(args) > 0 and args[0]) or ""                  nombre_objeto = (len(args) > 0 and args[0]) or ""
537                  self.cmd_usar(nombre_objeto)                  self.cmd_usar(nombre_objeto)
538                  self.estado_0()                  self.estado_0()
539    
540              elif accion == "+ob" or accion == "+observar":              elif accion == "+ob" or accion == "+observar":
541                  nombre_oponente = (len(args) > 0 and args[0]) or ""                  nombre_oponente = (len(args) > 0 and args[0]) or ""
542                  self.cmd_observar(nombre_oponente)                  self.cmd_observar(nombre_oponente)
543                  self.estado_0()                  self.estado_0()
544    
545              elif accion == "+a" or accion == "+atacar":              elif accion == "+a" or accion == "+atacar":
546                  self.conn().send("Comando deshabilitado temporalmente. Lo sentimos.")                  self.conn().send("Comando deshabilitado temporalmente. Lo sentimos.")
547                  self.estado_0()                  self.estado_0()
548    
549              elif accion == "+sal" or accion == "+salir" or accion == "/q" or accion == "+q":              elif accion == "+sal" or accion == "+salir" or accion == "/q" or accion == "+q":
550                  self.estado_1()                  self.estado_1()
551    
552              elif accion == "+":              elif accion == "+":
553                  self.estado_0()                  self.estado_0()
554                                    
555              elif accion == "+help" or accion == "+ayuda" or accion == "+?":              elif accion == "+help" or accion == "+ayuda" or accion == "+?":
556                  self.cmd_ayuda(args)                  self.cmd_ayuda(args)
557                  self.estado_0()                  self.estado_0()
558    
559              elif accion == "+doc":              elif accion == "+doc":
560                  self.cmd_doc(args)                  self.cmd_doc(args)
561                  self.estado_0()                  self.estado_0()
562    
563              elif accion == "+actuar" or accion == "+act":              elif accion == "+actuar" or accion == "+act":
564                  mensaje = " ".join(args)                  mensaje = " ".join(args)
565                  self.cmd_actuar(mensaje)                  self.cmd_actuar(mensaje)
566                  self.estado_0()                  self.estado_0()
567                                    
568              elif accion == "+entorno" or accion == "+ent":              elif accion == "+entorno" or accion == "+ent":
569                  mensaje = " ".join(args)                  mensaje = " ".join(args)
570                  self.cmd_entorno(mensaje)                  self.cmd_entorno(mensaje)
571                  self.estado_0()                  self.estado_0()
572                                    
573              elif accion == "+listar":              elif accion == "+listar":
574                  self.cmd_listar_personajes()                  self.cmd_listar_personajes()
575                  self.estado_0()                  self.estado_0()
576                                    
577              elif accion == "+localizar" or accion == "+loc":              elif accion == "+localizar" or accion == "+loc":
578                  try:                  try:
579                      self.cmd_localizar(args[0])                      self.cmd_localizar(args[0])
580                  except:                  except:
581                      self.conn().send('Tienes que especificar un personaje para localizar')                      self.conn().send('Tienes que especificar un personaje para localizar')
582    
583                  self.estado_0()                  self.estado_0()
584    
585              elif accion == "+seguir" or accion == "+seg":              elif accion == "+seguir" or accion == "+seg":
586                  if len(args) == 0:                  if len(args) == 0:
587                      self.conn().send('Tienes que especificar un personaje para seguir')                      self.conn().send('Tienes que especificar un personaje para seguir')
588                  else:                  else:
589                      self.cmd_seguir(args[0])                      self.cmd_seguir(args[0])
590                  self.estado_0()                  self.estado_0()
591    
592              elif accion == "+noseguir" or accion == "+noseg":              elif accion == "+noseguir" or accion == "+noseg":
593                  self.cmd_noseguir()                  self.cmd_noseguir()
594                  self.estado_0()                  self.estado_0()
595    
596              elif accion == "+ip":              elif accion == "+ip":
597                  self.cmd_ip()                  self.cmd_ip()
598                  self.estado_0()                  self.estado_0()
599    
600              elif accion == "+area":              elif accion == "+area":
601                  self.cmd_area()                  self.cmd_area()
602                  self.estado_0()                  self.estado_0()
603    
604              elif accion == "+reloj":              elif accion == "+reloj":
605                  self.cmd_reloj()                  self.cmd_reloj()
606                  self.estado_0()                  self.estado_0()
607    
608              elif accion == "":              elif accion == "":
609                  self.estado_0()                  self.estado_0()
610    
611              elif accion[0] == "+" or accion == "+":              elif accion[0] == "+" or accion == "+":
612                  self.conn().send("Error, comando no reconocido. Escribe '+?' y pulsa ENTER")                  self.conn().send("Error, comando no reconocido. Escribe '+?' y pulsa ENTER")
613                  self.conn().send("para una lista de comandos.")                  self.conn().send("para una lista de comandos.")
614                  self.estado_0()                  self.estado_0()
615                                    
616              else:              else:
617                  mensaje = accion + ' ' + " ".join(args)                  mensaje = accion + ' ' + " ".join(args)
618                  self.cmd_hablar(mensaje, idioma=self.__personaje.idioma_base)                  self.cmd_hablar(mensaje, idioma=self.__personaje.idioma_base)
619                  self.estado_0()                  self.estado_0()
620    
621    
622      def parsear_ident_objeto(self, args, comando):      def parsear_ident_objeto(self, args, comando):
623          """Pequeña funcion utilitaria para parsear la secuencia          """Pequeña funcion utilitaria para parsear la secuencia
624          [<id_receptor>] [<cantidad>] id_objeto [<n_orden>] [<n_instancia>].          [<id_receptor>] [<cantidad>] id_objeto [<n_orden>] [<n_instancia>].
625    
626          cantidad, n_orden y n_instancia se reconocen porque son sólo dígitos.          cantidad, n_orden y n_instancia se reconocen porque son sólo dígitos.
627          id_objeto puede tener más de una palabra.          id_objeto puede tener más de una palabra.
628          receptor sólo puede tener una palabra.          receptor sólo puede tener una palabra.
629          """          """
630          cantidad = 1          cantidad = 1
631          id_objeto = ""          id_objeto = ""
632          id_receptor = ""          id_receptor = ""
633          n_orden = 1          n_orden = 1
634          n_instancia = 1          n_instancia = 1
635          ok = 0          ok = 0
636    
637          i = 0          i = 0
638    
639          if comando == 'dar' and i < len(args) and not args[i].isdigit():          if comando == 'dar' and i < len(args) and not args[i].isdigit():
640              id_receptor = args[i]              id_receptor = args[i]
641              i = i + 1              i = i + 1
642                    
643          if i < len(args) and args[i].isdigit():          if i < len(args) and args[i].isdigit():
644              cantidad = int(args[i])              cantidad = int(args[i])
645              i = i + 1              i = i + 1
646    
647          while i < len(args) and not args[i].isdigit():          while i < len(args) and not args[i].isdigit():
648              if len(id_objeto) > 0:              if len(id_objeto) > 0:
649                  id_objeto += " "                  id_objeto += " "
650              id_objeto += args[i]              id_objeto += args[i]
651              i = i + 1              i = i + 1
652    
653          if i < len(args):          if i < len(args):
654              n_orden = int(args[i])              n_orden = int(args[i])
655              i = i + 1              i = i + 1
656    
657          if i < len(args):          if i < len(args):
658              n_instancia = int(args[i])              n_instancia = int(args[i])
659              i = i + 1              i = i + 1
660    
661          if id_objeto == "":          if id_objeto == "":
662              self.conn().send("Tienes que indicar qué objeto quieres " + comando + ".")              self.conn().send("Tienes que indicar qué objeto quieres " + comando + ".")
663          elif cantidad < 1:          elif cantidad < 1:
664              self.conn().send("La cantidad tiene que ser igual o mayor que 1.")              self.conn().send("La cantidad tiene que ser igual o mayor que 1.")
665          elif n_orden < 1:          elif n_orden < 1:
666              self.conn().send("El número de orden tiene que ser igual o mayor que 1.")              self.conn().send("El número de orden tiene que ser igual o mayor que 1.")
667          elif n_instancia < 1:          elif n_instancia < 1:
668              self.conn().send("El número de objeto tiene que ser igual o mayor que 1.")              self.conn().send("El número de objeto tiene que ser igual o mayor que 1.")
669          else:          else:
670              ok = 1              ok = 1
671    
672          if comando == 'dar':          if comando == 'dar':
673              return (id_receptor, id_objeto, cantidad, n_orden, n_instancia, ok)              return (id_receptor, id_objeto, cantidad, n_orden, n_instancia, ok)
674          else:          else:
675              return (id_objeto, cantidad, n_orden, n_instancia, ok)              return (id_objeto, cantidad, n_orden, n_instancia, ok)
676    
677    
678      # ---------------------      # ---------------------
679      # EJECUCION DE COMANDOS      # EJECUCION DE COMANDOS
680      # ---------------------      # ---------------------
681    
682      def cmd_doc(self,args):      def cmd_doc(self,args):
683          self.conn().send("\n"+color(32)+"--------- Documentación de Minë ---------\n"+finl)          self.conn().send("\n"+color(32)+"--------- Documentación de Minë ---------\n"+finl)
684          if len(args) > 0:          if len(args) > 0:
685                            
686              if args[0] == "instalacion" or args[0] == "inst":              if args[0] == "instalacion" or args[0] == "inst":
687                                    
688                  self.conn().send(ayuda.como_instalar_mine)                  self.conn().send(ayuda.como_instalar_mine)
689                            
690                                    
691              elif args[0] == "tolkien" or args[0] == "jrrt":              elif args[0] == "tolkien" or args[0] == "jrrt":
692                                    
693                  self.conn().send(ayuda.tolkien)                  self.conn().send(ayuda.tolkien)
694                            
695                                    
696              elif args[0] == "gpl" or args[0] == "gnu":              elif args[0] == "gpl" or args[0] == "gnu":
697                                    
698                  self.conn().send(ayuda.gpl)                  self.conn().send(ayuda.gpl)
699    
700          else:          else:
701              self.conn().send("Los documentos disponibles actualmente son:\n")              self.conn().send("Los documentos disponibles actualmente son:\n")
702              self.conn().send("[ instalacion | tolkien | gpl ]")              self.conn().send("[ instalacion | tolkien | gpl ]")
703    
704                            
705      def cmd_ayuda(self,args):      def cmd_ayuda(self,args):
706    
707        self.conn().send("\n"+color(32)+"------------------------ Ayuda de Minë ------------------------\n"+finl)        self.conn().send("\n"+color(32)+"------------------------ Ayuda de Minë ------------------------\n"+finl)
708        self.conn().send("Las letras en corchete y las letras tras el signo '/' indican")        self.conn().send("Las letras en corchete y las letras tras el signo '/' indican")
709        self.conn().send("una abreviatura alternativa válida para la orden\n")        self.conn().send("una abreviatura alternativa válida para la orden\n")
710        if len(args) > 0:        if len(args) > 0:
711    
712            if args[0] == "movimiento":            if args[0] == "movimiento":
713    
714                self.conn().send(color(33)+" Movimiento\n"+finl)                self.conn().send(color(33)+" Movimiento\n"+finl)
715                self.conn().send("Moverse a otra sala, hay tres posibilidades: ")                self.conn().send("Moverse a otra sala, hay tres posibilidades: ")
716                self.conn().send("- Direccion (" + color(31) + "+norte" + finl + ", " +                self.conn().send("- Direccion (" + color(31) + "+norte" + finl + ", " +
717                                 color(31) + "+sur" + finl + ", " +                                 color(31) + "+sur" + finl + ", " +
718                                 color(31) + "+este" + finl + ", ")                                 color(31) + "+este" + finl + ", ")
719                self.conn().send("             " + color(31) + "+oeste" + finl + ", " +                self.conn().send("             " + color(31) + "+oeste" + finl + ", " +
720                                 color(31) + "+noreste" + finl + ", " +                                 color(31) + "+noreste" + finl + ", " +
721                                 color(31) + "+noroeste" + finl + ", ")                                 color(31) + "+noroeste" + finl + ", ")
722                self.conn().send("             " + color(31) + "+sureste" + finl + ", " +                self.conn().send("             " + color(31) + "+sureste" + finl + ", " +
723                                 color(31) + "+suroeste" + finl + ", ")                                 color(31) + "+suroeste" + finl + ", ")
724                self.conn().send("             " + color(31) + "+arriba" + finl + ", " +                self.conn().send("             " + color(31) + "+arriba" + finl + ", " +
725                                 color(31) + "+abajo" + finl + ")")                                 color(31) + "+abajo" + finl + ")")
726                self.conn().send("- Abreviatura (" + color(31) + "+n" + finl + ", "+                self.conn().send("- Abreviatura (" + color(31) + "+n" + finl + ", "+
727                                 color(31) + "+s" + finl + ", " +                                 color(31) + "+s" + finl + ", " +
728                                 color(31) + "+e" + finl + ", " +                                 color(31) + "+e" + finl + ", " +
729                                 color(31) + "+o" + finl + ", ")                                 color(31) + "+o" + finl + ", ")
730                self.conn().send("               " + color(31) + "+ne" + finl + ", " +                self.conn().send("               " + color(31) + "+ne" + finl + ", " +
731                                 color(31) + "+no" + finl + ", " +                                 color(31) + "+no" + finl + ", " +
732                                 color(31) + "+se" + finl + ", ")                                 color(31) + "+se" + finl + ", ")
733                self.conn().send("               " + color(31) + "+so" + finl + ", " +                self.conn().send("               " + color(31) + "+so" + finl + ", " +
734                                 color(31) + "+ar" + finl + ", " +                                 color(31) + "+ar" + finl + ", " +
735                                 color(31) + "+ab" + finl + ")")                                 color(31) + "+ab" + finl + ")")
736                self.conn().send("- Palabra entre corchetes (" + color(31) + "+casa" + finl + ")")                self.conn().send("- Palabra entre corchetes (" + color(31) + "+casa" + finl + ")")
737                self.conn().send("  'Hacia el sur ves una [casa] vieja'")                self.conn().send("  'Hacia el sur ves una [casa] vieja'")
738                self.conn().send("")                self.conn().send("")
739                self.conn().send("Seguir a otro personaje para moverse con el")                self.conn().send("Seguir a otro personaje para moverse con el")
740                self.conn().send("   " + color(31) + "+[seg]uir <nombre>" + finl)                self.conn().send("   " + color(31) + "+[seg]uir <nombre>" + finl)
741                self.conn().send("Dejar de seguir a otro personaje")                self.conn().send("Dejar de seguir a otro personaje")
742                self.conn().send("   " + color(31) + "+[noseg]uir" + finl)                self.conn().send("   " + color(31) + "+[noseg]uir" + finl)
743                                
744            elif args[0] == "general":            elif args[0] == "general":
745                                
746                self.conn().send(color(33)+" General\n"+finl)                self.conn().send(color(33)+" General\n"+finl)
747                self.conn().send(" +[sal]ir     :Salir del juego")                self.conn().send(" +[sal]ir     :Salir del juego")
748                self.conn().send(" +doc         :Documentos de Minë")                self.conn().send(" +doc         :Documentos de Minë")
749                self.conn().send(" +ip          :Dirección IP del cliente")                self.conn().send(" +ip          :Dirección IP del cliente")
750                self.conn().send('')                self.conn().send('')
751                                
752            elif args[0] == "objetos":            elif args[0] == "objetos":
753                                
754                self.conn().send(color(33)+" Objetos\n"+finl)                                    self.conn().send(color(33)+" Objetos\n"+finl)                    
755                self.conn().send(" Coger un objeto de la sala y meterlo en la mochila:")                self.conn().send(" Coger un objeto de la sala y meterlo en la mochila:")
756                self.conn().send(color(31) + '  +[c]oger [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)                self.conn().send(color(31) + '  +[c]oger [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)
757                self.conn().send(" Dejar un objeto de la mochila en la sala:")                self.conn().send(" Dejar un objeto de la mochila en la sala:")
758                self.conn().send(color(31) + '  +[d]ejar [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)                self.conn().send(color(31) + '  +[d]ejar [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)
759                self.conn().send(" Esconder un objeto de la mochila en la sala:")                self.conn().send(" Esconder un objeto de la mochila en la sala:")
760                self.conn().send(color(31) + '  +[esc]onder [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)                self.conn().send(color(31) + '  +[esc]onder [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)
761                                
762                self.conn().send(" Dar un objeto a alguien en la sala:")                self.conn().send(" Dar un objeto a alguien en la sala:")
763                self.conn().send(color(31) + '  +dar <nombre> [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)                self.conn().send(color(31) + '  +dar <nombre> [<cantidad>] <id_objeto> [ <n_orden> [<n_unidad>] ]' + finl)
764                                
765                self.conn().send(" Mirar el contenido de la mochila:")                self.conn().send(" Mirar el contenido de la mochila:")
766                self.conn().send(color(31) + '  +[mo]chila' + finl)                self.conn().send(color(31) + '  +[mo]chila' + finl)
767                                
768                self.conn().send(" Examinar un objeto de la mochila:")                self.conn().send(" Examinar un objeto de la mochila:")
769                self.conn().send(color(31) + '  +[ex]aminar <nombre> [ <n_orden> [<n_instancia>] ]' + finl)                self.conn().send(color(31) + '  +[ex]aminar <nombre> [ <n_orden> [<n_instancia>] ]' + finl)
770                                
771                self.conn().send(" Usar un objeto que porta el personaje (test):")                self.conn().send(" Usar un objeto que porta el personaje (test):")
772                self.conn().send(color(31) + '  +[u]sar <nombre>' + finl)                self.conn().send(color(31) + '  +[u]sar <nombre>' + finl)
773                                
774                self.conn().send("")                self.conn().send("")
775                                
776                self.conn().send(" -> el identificador del objeto es la primera palabra de su nombre, o la")                self.conn().send(" -> el identificador del objeto es la primera palabra de su nombre, o la")
777                self.conn().send("    palabra que haya entre corchetes.")                self.conn().send("    palabra que haya entre corchetes.")
778                                
779                self.conn().send(" -> si en la sala hay varios objetos DIFERENTES pero con el mismo id,")                self.conn().send(" -> si en la sala hay varios objetos DIFERENTES pero con el mismo id,")
780                self.conn().send("    puedes indicar cual quieres con el parametro n_orden (1 el primero,")                self.conn().send("    puedes indicar cual quieres con el parametro n_orden (1 el primero,")
781                self.conn().send("    2 el segundo...)")                self.conn().send("    2 el segundo...)")
782                                
783                self.conn().send(" -> si en la sala hay varias unidades del MISMO objeto (la cantidad de")                self.conn().send(" -> si en la sala hay varias unidades del MISMO objeto (la cantidad de")
784                self.conn().send("    unidades se indica entre parentesis detras de la descripcion del objeto),")                self.conn().send("    unidades se indica entre parentesis detras de la descripcion del objeto),")
785                self.conn().send("    puedes indicar cual quieres con el parametro n_unidad.")                self.conn().send("    puedes indicar cual quieres con el parametro n_unidad.")
786                                
787                self.conn().send("")                self.conn().send("")
788                self.conn().send("  ej. si en la sala hay")                self.conn().send("  ej. si en la sala hay")
789                self.conn().send("      - una espada")                self.conn().send("      - una espada")
790                self.conn().send("      - una botella de [vino] (3)")                self.conn().send("      - una botella de [vino] (3)")
791                self.conn().send("      - una botella de [cerveza]")                self.conn().send("      - una botella de [cerveza]")
792                self.conn().send("      - una jarra de [cerveza] (5)")                self.conn().send("      - una jarra de [cerveza] (5)")
793                                
794                self.conn().send("")                self.conn().send("")
795                self.conn().send("  +coger espada -> coge una espada")                self.conn().send("  +coger espada -> coge una espada")
796                self.conn().send("  +coger 2 vino -> coge dos botellas de vino")                self.conn().send("  +coger 2 vino -> coge dos botellas de vino")
797                self.conn().send("  +coger cerveza 2 -> coge una jarra de cerveza")                self.conn().send("  +coger cerveza 2 -> coge una jarra de cerveza")
798                self.conn().send("  +coger cerveza 2 3 -> coge la tercera jarra de cerveza")                self.conn().send("  +coger cerveza 2 3 -> coge la tercera jarra de cerveza")
799                                
800                                
801            elif args[0] == "otros":            elif args[0] == "otros":
802                                
803                self.conn().send(color(33)+" Otros\n"+finl)                              self.conn().send(color(33)+" Otros\n"+finl)              
804                self.conn().send("Mostrar estadísticas de un personaje: " +                self.conn().send("Mostrar estadísticas de un personaje: " +
805                                 color(31) + '+[est]adisticas' + finl)                                 color(31) + '+[est]adisticas' + finl)
806                self.conn().send("Actuar en la sala: " +                self.conn().send("Actuar en la sala: " +
807                                 color(31) + '+[act]uar <texto>' + finl)                                 color(31) + '+[act]uar <texto>' + finl)
808                                
809                self.conn().send("Mirar la sala actual: " +                self.conn().send("Mirar la sala actual: " +
810                                 color(31) + '+[m]irar' + finl)                                 color(31) + '+[m]irar' + finl)
811                self.conn().send("Mirar la sala actual de forma resumida: " +                self.conn().send("Mirar la sala actual de forma resumida: " +
812                                 color(31) + '+mr' + finl)                                 color(31) + '+mr' + finl)
813                                
814                self.conn().send("Nombre del área en la que te encuentras: " +                self.conn().send("Nombre del área en la que te encuentras: " +
815                                 color(31) + '+area' + finl)                                 color(31) + '+area' + finl)
816                                
817                self.conn().send("Observar a un personaje: " +                                            self.conn().send("Observar a un personaje: " +                            
818                                 color(31) + '+[ob]servar <personaje>' +finl)                                 color(31) + '+[ob]servar <personaje>' +finl)
819                                
820                self.conn().send("Confiar en un personaje (necesario para recibir objetos): " +                self.conn().send("Confiar en un personaje (necesario para recibir objetos): " +
821                                 color(31) + '+confiar <personaje>' +finl)                                 color(31) + '+confiar <personaje>' +finl)
822                                
823                self.conn().send("Dejar de confiar en un personaje (rechazas propuestas personales): " +                self.conn().send("Dejar de confiar en un personaje (rechazas propuestas personales): " +
824                                 color(31) + '+noconfiar <personaje>' +finl)                                 color(31) + '+noconfiar <personaje>' +finl)
825                                
826                self.conn().send("Listas personas de confianza: " +                                            self.conn().send("Listas personas de confianza: " +                            
827                                 color(31) + '+amigos' +finl)                                 color(31) + '+amigos' +finl)
828                                
829                self.conn().send("Limitar el texto recibido sí/no: " +                self.conn().send("Limitar el texto recibido sí/no: " +
830                                 color(31) + '+silencio' + finl)                                 color(31) + '+silencio' + finl)
831                                
832                self.conn().send("Mostrar la fecha y hora en Minë: " +                self.conn().send("Mostrar la fecha y hora en Minë: " +
833                                 color(31) + '+reloj' + finl)                                 color(31) + '+reloj' + finl)
834                                
835                self.conn().send("Localizar a un personaje (Sólo Maiar): " +                self.conn().send("Localizar a un personaje (Sólo Maiar): " +
836                                 color(31) + '+[loc]alizar <nombre>' + finl)                                 color(31) + '+[loc]alizar <nombre>' + finl)
837    
838                self.conn().send("Lista de jugadores de Minë (Sólo Maiar): " +                self.conn().send("Lista de jugadores de Minë (Sólo Maiar): " +
839                                 color(31) + '+listar' + finl)                                 color(31) + '+listar' + finl)
840                                
841            elif args[0] == "hablar":                        elif args[0] == "hablar":            
842                                
843                self.conn().send(color(33)+" Hablar\n"+finl)                self.conn().send(color(33)+" Hablar\n"+finl)
844                self.conn().send("Hablar en oestron en la sala actual: " +                self.conn().send("Hablar en oestron en la sala actual: " +
845                                 color(31) + '+[h]ablar <texto>' + finl)                                 color(31) + '+[h]ablar <texto>' + finl)
846                self.conn().send("en quenya: " +                self.conn().send("en quenya: " +
847                                 color(31) + '+hablarq/hq <texto>' + finl)                                 color(31) + '+hablarq/hq <texto>' + finl)
848                self.conn().send("en enano: " +                self.conn().send("en enano: " +
849                                 color(31) + '+hablare/he <texto>' + finl)                                 color(31) + '+hablare/he <texto>' + finl)
850                self.conn().send("en orco: " +                self.conn().send("en orco: " +
851                                 color(31) + '+hablaro/ho <texto>' + finl)                                 color(31) + '+hablaro/ho <texto>' + finl)
852                                
853                self.conn().send("Susurrar en oestron a alguien en la sala actual:")                self.conn().send("Susurrar en oestron a alguien en la sala actual:")
854                self.conn().send(color(31) + '  +[sus]urrar <nombre> <texto>' + finl)                self.conn().send(color(31) + '  +[sus]urrar <nombre> <texto>' + finl)
855                self.conn().send("en quenya:")                self.conn().send("en quenya:")
856                self.conn().send(color(31) + '  +susurrarq/susq <nombre> <texto>' + finl)                self.conn().send(color(31) + '  +susurrarq/susq <nombre> <texto>' + finl)
857                self.conn().send("en enano:")                self.conn().send("en enano:")
858                self.conn().send(color(31) + '  +susurrare/suse <nombre> <texto>' + finl)                self.conn().send(color(31) + '  +susurrare/suse <nombre> <texto>' + finl)
859                self.conn().send("en orco:")                self.conn().send("en orco:")
860                self.conn().send(color(31) + '  +susurraro/suso <nombre> <texto>' + finl)                self.conn().send(color(31) + '  +susurraro/suso <nombre> <texto>' + finl)
861                                
862                self.conn().send("Gritar en oestron a todo el mundo: " +                self.conn().send("Gritar en oestron a todo el mundo: " +
863                                 color(31) + '+[g]ritar <texto>' + finl)                                 color(31) + '+[g]ritar <texto>' + finl)
864                self.conn().send("en quenya: " +                self.conn().send("en quenya: " +
865                                 color(31) + '+gritarq/gq <texto>' + finl)                                 color(31) + '+gritarq/gq <texto>' + finl)
866                self.conn().send("en enano: " +                self.conn().send("en enano: " +
867                                 color(31) + '+gritare/ge <texto>' + finl)                                 color(31) + '+gritare/ge <texto>' + finl)
868                self.conn().send("en orco: " +                self.conn().send("en orco: " +
869                                 color(31) + '+gritaro/go <texto>' + finl)                                 color(31) + '+gritaro/go <texto>' + finl)
870                self.conn().send("Elegir idioma por defecto: " +                self.conn().send("Elegir idioma por defecto: " +
871                                 color(31) + "+idioma <idioma>" + finl)                                 color(31) + "+idioma <idioma>" + finl)
872                self.conn().send("Describir sucesos del entorno (Sólo Maiar): " +                self.conn().send("Describir sucesos del entorno (Sólo Maiar): " +
873                                 color(31) + '+[ent]orno <texto>' + finl)                                 color(31) + '+[ent]orno <texto>' + finl)
874    
875                self.conn().send("Entablar una conversación con un PNJ: " +                self.conn().send("Entablar una conversación con un PNJ: " +
876                                 color(31) + '+decir <pnj> <texto>' + finl)                                 color(31) + '+decir <pnj> <texto>' + finl)
877                self.conn().send("Preguntar al PNJ por un tema: " +                self.conn().send("Preguntar al PNJ por un tema: " +
878                                 color(31) + '+[p]reguntar <pnj> <texto>' + finl)                                 color(31) + '+[p]reguntar <pnj> <texto>' + finl)
879                self.conn().send("Recordar los temas hablados con un PNJ: " +                self.conn().send("Recordar los temas hablados con un PNJ: " +
880                                 color(31) + '+[recap]itular <pnj>' + finl)                                 color(31) + '+[recap]itular <pnj>' + finl)
881                            
882            elif args[0] == "ataque":            elif args[0] == "ataque":
883                                
884                self.conn().send(color(33)+" Ataque\n"+finl)                              self.conn().send(color(33)+" Ataque\n"+finl)              
885                self.conn().send("Atacar a un personaje [deshabiltado]: " +                self.conn().send("Atacar a un personaje [deshabiltado]: " +
886                                 color(31) + '+[a]tacar <nombre>' + finl)                                 color(31) + '+[a]tacar <nombre>' + finl)
887                                
888            else:            else:
889                                
890                self.conn().send("Categoría de comandos no reconocida. Escribe '+?'.")                self.conn().send("Categoría de comandos no reconocida. Escribe '+?'.")
891                                
892        else:        else:
893                                
894            self.conn().send("Debido al gran número de acciones que puede realizar un")            self.conn().send("Debido al gran número de acciones que puede realizar un")
895            self.conn().send("personaje, las hemos agrupado en diferentes categorías a las")            self.conn().send("personaje, las hemos agrupado en diferentes categorías a las")
896            self.conn().send("que puedes llamar con '+? [categoria]'.")            self.conn().send("que puedes llamar con '+? [categoria]'.")
897                        
898            self.conn().send(color(31)+"\nCategorías de comandos:\n"+finl)            self.conn().send(color(31)+"\nCategorías de comandos:\n"+finl)
899                        
900            self.conn().send(color(33),0)            self.conn().send(color(33),0)
901            self.conn().send(" general      :%s" % ('Órdenes básicas de Minë'))            self.conn().send(" general      :%s" % ('Órdenes básicas de Minë'))
902            self.conn().send(" movimiento   :%s" % ('Movimiento de PJs'))            self.conn().send(" movimiento   :%s" % ('Movimiento de PJs'))
903            self.conn().send(" hablar       :%s" % ('Comunicación entre PJs y PNJs'))            self.conn().send(" hablar       :%s" % ('Comunicación entre PJs y PNJs'))
904            self.conn().send(" ataque       :%s" % ('Combate y defensa entre PJs y PNJs'))            self.conn().send(" ataque       :%s" % ('Combate y defensa entre PJs y PNJs'))
905            self.conn().send(" objetos      :%s" % ('Manejo de objetos'))            self.conn().send(" objetos      :%s" % ('Manejo de objetos'))
906            self.conn().send(" otros        :%s" % ('Otras órdenes'))            self.conn().send(" otros        :%s" % ('Otras órdenes'))
907            self.conn().send(finl)                                                                    self.conn().send(finl)                                                        
908                        
909            self.conn().send("Si lo que deseas es leer la documentación disponible acerca de Minë,")            self.conn().send("Si lo que deseas es leer la documentación disponible acerca de Minë,")
910            self.conn().send("entonces escribe '+doc' en la línea de comandos.\n")            self.conn().send("entonces escribe '+doc' en la línea de comandos.\n")
911                        
912                            
913      def cmd_recapitular(self, argumentos):      def cmd_recapitular(self, argumentos):
914    
915          if len(argumentos) != 1:          if len(argumentos) != 1:
916              self.conn().send("Debes decir de qué personaje quieres recapitular.")              self.conn().send("Debes decir de qué personaje quieres recapitular.")
917              return              return
918    
919          pnjs = self.__personaje.sala.personajes          pnjs = self.__personaje.sala.personajes
920    
921          encontrado = 0          encontrado = 0
922          for pnj in pnjs.values():          for pnj in pnjs.values():
923              if normalizar_id(argumentos[0]) == extraer_id(pnj.nombre):              if normalizar_id(argumentos[0]) == extraer_id(pnj.nombre):
924                 argumentos = argumentos[1:]                 argumentos = argumentos[1:]
925                 encontrado = 1                 encontrado = 1
926                 break                 break
927    
928          if encontrado == 0:          if encontrado == 0:
929              self.conn().send("No conoces a nadie llamado " + argumentos[0])              self.conn().send("No conoces a nadie llamado " + argumentos[0])
930              return              return
931    
932          from interfazpnjhablante import InterfazPNJHablante          from interfazpnjhablante import InterfazPNJHablante
933          if not isinstance(pnj.controlador, InterfazPNJHablante):          if not isinstance(pnj.controlador, InterfazPNJHablante):
934              self.conn().send(pnj.nombre + " no responde.\n")              self.conn().send(pnj.nombre + " no responde.\n")
935              return              return
936                    
937          try:          try:
938              visita = pnj.controlador._visitas[0]              visita = pnj.controlador._visitas[0]
939              items = visita.items()[:]              items = visita.items()[:]
940              items.reverse()              items.reverse()
941              duplicados = []              duplicados = []
942              for item in items:              for item in items:
943                  if item.tema().agotado_en(visita):                  if item.tema().agotado_en(visita):
944                      disponible = color(31)                      disponible = color(31)
945                  else:                  else:
946                      disponible = color(32)                      disponible = color(32)
947                  duplicados.append(disponible + item.tema().nombre())                  duplicados.append(disponible + item.tema().nombre())
948                  for nombretema in item.relacionados():                  for nombretema in item.relacionados():
949                      dado = self.__personaje.tirada_atributo("inteligencia", 0)                      dado = self.__personaje.tirada_atributo("inteligencia", 0)
950                      if dado > 27:                      if dado > 27:
951                          tema = visita._conversacion.contexto(item.relacionados()[nombretema]).tema(nombretema)                          tema = visita._conversacion.contexto(item.relacionados()[nombretema]).tema(nombretema)
952                          if tema.agotado_en(visita):                          if tema.agotado_en(visita):
953                              disponible = color(31)                              disponible = color(31)
954                          else:                          else:
955                              disponible = color(32)                              disponible = color(32)
956                          duplicados.append(disponible + tema.nombre())                          duplicados.append(disponible + tema.nombre())
957              temas = []              temas = []
958              for tema in duplicados:              for tema in duplicados:
959                  if tema not in temas:                  if tema not in temas:
960                      temas.append(tema)                      temas.append(tema)
961                      self.conn().send(disponible + tema)                      self.conn().send(disponible + tema)
962                                    
963          except Exception:          except Exception:
964              # Conviene protegerse contra errores en carga de salas. No es bueno que por              # Conviene protegerse contra errores en carga de salas. No es bueno que por
965              # un fichero de sala mal escrito pete el servidor entero o te eche de la              # un fichero de sala mal escrito pete el servidor entero o te eche de la
966              # conexión.              # conexión.
967              escribir( "Ha saltado una excepcion al intentar recapitular")              escribir( "Ha saltado una excepcion al intentar recapitular")
968              escribir_excepcion()              escribir_excepcion()
969              if self.conn().is_open:              if self.conn().is_open:
970                  self.conn().send("Ha habido un error interno del programa referente a esta conversación.")                  self.conn().send("Ha habido un error interno del programa referente a esta conversación.")
971                  self.conn().send("No puedes recapitular esta conversación. Por favor, habla con algun administrador de Mine.")                  self.conn().send("No puedes recapitular esta conversación. Por favor, habla con algun administrador de Mine.")
972          return          return
973            
974    
975      def cmd_hablar_pnj(self, comando, argumentos):      def cmd_hablar_pnj(self, comando, argumentos):
976    
977          if len(argumentos) < 2:          if len(argumentos) < 2:
978              self.conn().send("Debes decir o preguntar a alguien por algo.")              self.conn().send("Debes decir o preguntar a alguien por algo.")
979              return              return
980    
981          pnjs = self.__personaje.sala.personajes          pnjs = self.__personaje.sala.personajes
982    
983          encontrado = 0          encontrado = 0
984          for pnj in pnjs.values():          for pnj in pnjs.values():
985              if normalizar_id(argumentos[0]) == extraer_id(pnj.nombre):              if normalizar_id(argumentos[0]) == extraer_id(pnj.nombre):
986                 argumentos = argumentos[1:]                 argumentos = argumentos[1:]
987                 encontrado = 1                 encontrado = 1
988                 break                 break
989    
990          if encontrado == 0:          if encontrado == 0:
991              self.conn().send("No has indicado correctamente con quién deseas hablar\n")              self.conn().send("No has indicado correctamente con quién deseas hablar\n")
992              return              return
993                    
994          from interfazpnjhablante import InterfazPNJHablante          from interfazpnjhablante import InterfazPNJHablante
995          if not isinstance(pnj.controlador, InterfazPNJHablante):          if not isinstance(pnj.controlador, InterfazPNJHablante):
996              self.conn().send(pnj.nombre + " no responde.\n")              self.conn().send(pnj.nombre + " no responde.\n")
997              return                    return      
998                    
999          try:          try:
1000              pnj.controlador.conversa_personaje(self.__personaje, comando,              pnj.controlador.conversa_personaje(self.__personaje, comando,
1001                                                 string.join(argumentos, ' '))                                                 string.join(argumentos, ' '))
1002          except Exception:          except Exception:
1003              # Conviene protegerse contra errores en carga de pnjs. No es bueno que por              # Conviene protegerse contra errores en carga de pnjs. No es bueno que por
1004              # un fichero de pnj mal escrito pete el servidor entero o te eche de la              # un fichero de pnj mal escrito pete el servidor entero o te eche de la
1005              # conexión.              # conexión.
1006              escribir( "Ha saltado una excepcion al intentar " + comando)              escribir( "Ha saltado una excepcion al intentar " + comando)
1007              escribir_excepcion()              escribir_excepcion()
1008              if self.conn().is_open:              if self.conn().is_open:
1009                  self.conn().send("Ha habido un error interno del programa referente a esta conversación.")                  self.conn().send("Ha habido un error interno del programa referente a esta conversación.")
1010                  self.conn().send("No puedes hacer esta pregunta. Por favor, habla con algun administrador de Mine. Puedes escribir a mine_ste@yahoogroups.com.")                  self.conn().send("No puedes hacer esta pregunta. Por favor, habla con algun administrador de Mine. Puedes escribir a mine_ste@yahoogroups.com.")
1011    
1012    
1013      def cmd_mover(self, id_sala_destino):      def cmd_mover(self, id_sala_destino):
1014    
1015          # Comprobar si la puerta está cerrada y si podemos abrirla          # Comprobar si la puerta está cerrada y si podemos abrirla
1016          podemos_pasar = 1          podemos_pasar = 1
1017          cierre = self.__personaje.sala.salida_cerrada(id_sala_destino)          cierre = self.__personaje.sala.salida_cerrada(id_sala_destino)
1018          id_llave = cierre[0]          id_llave = cierre[0]
1019          msg_cerrado = cierre[1]          msg_cerrado = cierre[1]
1020          if id_llave != None:          if id_llave != None:
1021              podemos_pasar = 0              podemos_pasar = 0
1022              for objeto in self.__personaje.mochila():              for objeto in self.__personaje.mochila():
1023                  if objeto[0].id() == id_llave:                  if objeto[0].id() == id_llave:
1024                      self.conn().send(color(35) + "Abres el paso con " + objeto[0].nombre() + finl)                      self.conn().send(color(35) + "Abres el paso con " + objeto[0].nombre() + finl)
1025                      podemos_pasar = 1                      podemos_pasar = 1
1026    
1027          if not podemos_pasar:          if not podemos_pasar:
1028              self.conn().send(msg_cerrado)              self.conn().send(msg_cerrado)
1029          else:          else:
1030              try:              try:
1031                  nueva_sala = Mundo_localizar_sala(id_sala_destino)                  nueva_sala = Mundo_localizar_sala(id_sala_destino)
1032              except Exception:              except Exception:
1033                  # Conviene protegerse contra errores en carga de salas. No es bueno que por                  # Conviene protegerse contra errores en carga de salas. No es bueno que por
1034                  # un fichero de sala mal escrito pete el servidor entero o te eche de la                  # un fichero de sala mal escrito pete el servidor entero o te eche de la
1035                  # conexión.                  # conexión.
1036                  escribir( "Ha saltado una excepcion al intentar entrar en " + id_sala_destino)                  escribir( "Ha saltado una excepcion al intentar entrar en " + id_sala_destino)
1037                  escribir_excepcion()                  escribir_excepcion()
1038                  if self.conn().is_open:                  if self.conn().is_open:
1039                      self.conn().send("Ha habido un error interno del programa referente a esta sala.")                      self.conn().send("Ha habido un error interno del programa referente a esta sala.")
1040                      self.conn().send("No puedes ir ahi. Por favor, habla con algun administrador de Mine.")                      self.conn().send("No puedes ir ahi. Por favor, habla con algun administrador de Mine.")
1041              else:              else:
1042    
1043                  if nueva_sala.volumen_ocupado() + self.__personaje.volumen_total() > nueva_sala.volumen:                  if nueva_sala.volumen_ocupado() + self.__personaje.volumen_total() > nueva_sala.volumen:
1044    
1045                      self.conn().send("Ese lugar está al límite de su capacidad y no cabes. No puedes ir allí.")                      self.conn().send("Ese lugar está al límite de su capacidad y no cabes. No puedes ir allí.")
1046    
1047                  else:                  else:
1048    
1049                      if self.__personaje.anterior != None:                      if self.__personaje.anterior != None:
1050                          id_lider = self.__personaje.anterior.id                          id_lider = self.__personaje.anterior.id
1051                      else:                      else:
1052                          id_lider = None                          id_lider = None
1053                                            
1054                      self.__personaje.mover(nueva_sala)  # aqui se deja de seguir al lider, si lo hay                      self.__personaje.mover(nueva_sala)  # aqui se deja de seguir al lider, si lo hay
1055                      self.lanzar_tirada_percep_sala()                      self.lanzar_tirada_percep_sala()
1056                      self.cmd_mirar()                      self.cmd_mirar()
1057    
1058                      if self.__personaje.salas_visitadas.get(id_sala_destino) != 'si':                      if self.__personaje.salas_visitadas.get(id_sala_destino) != 'si':
1059                          self.conn().send("Es la primera vez que estás aquí...")                          self.conn().send("Es la primera vez que estás aquí...")
1060                          self.__personaje.salas_visitadas.update({id_sala_destino:'si'})                          self.__personaje.salas_visitadas.update({id_sala_destino:'si'})
1061                          #Ganamos un punto de experiencia (hay que premiar la exploración)                          #Ganamos un punto de experiencia (hay que premiar la exploración)
1062                          self.__personaje.poner_experiencia(self.__personaje.experiencia + 1)                          self.__personaje.poner_experiencia(self.__personaje.experiencia + 1)
1063    
1064                      if id_lider != None:                      if id_lider != None:
1065                          self.conn().send('Ya no estas siguiendo a ' + id_lider)                          self.conn().send('Ya no estas siguiendo a ' + id_lider)
1066            
1067    
1068      def cmd_amigos(self, id_amigo):      def cmd_amigos(self, id_amigo):
1069          self.__personaje.ids_amigos.append(id_amigo)          self.__personaje.ids_amigos.append(id_amigo)
1070          self.conn().send("Has añadido a "+id_amigo+" a tu lista de personas de confianza.")          self.conn().send("Has añadido a "+id_amigo+" a tu lista de personas de confianza.")
1071    
1072    
1073      def cmd_listar_amigos(self):      def cmd_listar_amigos(self):
1074          self.conn().send("-> Lista de personas de confianza <-")          self.conn().send("-> Lista de personas de confianza <-")
1075          self.conn().send('')          self.conn().send('')
1076          for key in self.__personaje.ids_amigos.keys():          for key in self.__personaje.ids_amigos.keys():
1077              if self.__personaje.ids_amigos[key] > 0:              if self.__personaje.ids_amigos[key] > 0:
1078                  self.conn().send(self.__personaje.color_texto() + '\t'+ key + finl)                  self.conn().send(self.__personaje.color_texto() + '\t'+ key + finl)
1079            
1080    
1081      def cmd_silencio(self):      def cmd_silencio(self):
1082          if self.__personaje.silencio == 'no':          if self.__personaje.silencio == 'no':
1083              self.__personaje.silencio = 'sí'              self.__personaje.silencio = 'sí'
1084          else:          else:
1085              self.__personaje.silencio = 'no'              self.__personaje.silencio = 'no'
1086                    
1087          self.conn().send("Has elegido que "+self.__personaje.silencio+" haya silencio")          self.conn().send("Has elegido que "+self.__personaje.silencio+" haya silencio")
1088                            
1089    
1090      def cmd_susurrar(self, nombre_oyente, mensaje, idioma=Idioma_oestron):      def cmd_susurrar(self, nombre_oyente, mensaje, idioma=Idioma_oestron):
1091          if len(mensaje) == 0:          if len(mensaje) == 0:
1092              self.conn().send('Tienes que decir algo...')              self.conn().send('Tienes que decir algo...')
1093          elif self.__personaje.id == nombre_oyente:          elif self.__personaje.id == nombre_oyente:
1094              self.conn().send('no tiene sentido que te hables a ti mismo')                  self.conn().send('no tiene sentido que te hables a ti mismo')    
1095          else:          else:
1096              if self.__personaje.sala != None:              if self.__personaje.sala != None:
1097                  encontrado = 0                  encontrado = 0
1098                  for personaje in  self.__personaje.sala.personajes.values():                  for personaje in  self.__personaje.sala.personajes.values():
1099                      if personaje !=self.__personaje and personaje.controlador != None and personaje.id == nombre_oyente:                      if personaje !=self.__personaje and personaje.controlador != None and personaje.id == nombre_oyente:
1100                          encontrado = 1                          encontrado = 1
1101                          self.__personaje.susurrar(personaje,mensaje,idioma)                          self.__personaje.susurrar(personaje,mensaje,idioma)
1102                          self.conn().send("Susurras a "+personaje.id+": "+mensaje)                          self.conn().send("Susurras a "+personaje.id+": "+mensaje)
1103                  if encontrado == 0:                  if encontrado == 0:
1104                      self.conn().send('no hay nadie aquí que se llame '+nombre_oyente)                      self.conn().send('no hay nadie aquí que se llame '+nombre_oyente)
1105                                            
1106    
1107      def cmd_localizar(self, id_personaje):      def cmd_localizar(self, id_personaje):
1108          try:          try:
1109              personaje = Mundo.pjs_activos[id_personaje]              personaje = Mundo.pjs_activos[id_personaje]
1110              self.conn().send(id_personaje +              self.conn().send(id_personaje +
1111                             ' está en ' + personaje.sala.nombre +                             ' está en ' + personaje.sala.nombre +
1112                             ' en el area de ' + personaje.sala.area)                             ' en el area de ' + personaje.sala.area)
1113          except KeyError:          except KeyError:
1114              self.conn().send('No existe ningun personaje con ese nombre jugando en Minë en este momento')              self.conn().send('No existe ningun personaje con ese nombre jugando en Minë en este momento')
1115    
1116    
1117      def cmd_listar_personajes(self):      def cmd_listar_personajes(self):
1118          ids_personajes = [ personaje.id for personaje in Mundo.pjs_activos.values() ]          ids_personajes = [ personaje.id for personaje in Mundo.pjs_activos.values() ]
1119    
1120          self.conn().send('En este momento hay ' + `len(ids_personajes)` +          self.conn().send('En este momento hay ' + `len(ids_personajes)` +
1121                         ' personajes en Mine:\n' +                         ' personajes en Mine:\n' +
1122                         '\n'.join(ids_personajes))                         '\n'.join(ids_personajes))
1123    
1124                            
1125      def cmd_hablar(self, mensaje, idioma=Idioma_oestron):      def cmd_hablar(self, mensaje, idioma=Idioma_oestron):
1126          if len(mensaje) > 0:          if len(mensaje) > 0:
1127              self.__personaje.hablar(mensaje,idioma)              self.__personaje.hablar(mensaje,idioma)
1128              self.conn().send('Dices: '+ self.__personaje.color_texto() + mensaje)              self.conn().send('Dices: '+ self.__personaje.color_texto() + mensaje)
1129          else:          else:
1130              self.conn().send('Tienes que decir algo...')              self.conn().send('Tienes que decir algo...')
1131                            
1132            
1133      def cmd_entorno(self, suceso):      def cmd_entorno(self, suceso):
1134          if len(suceso) > 0:          if len(suceso) > 0:
1135              self.__personaje.describir_entorno(suceso)              self.__personaje.describir_entorno(suceso)
1136          else:          else:
1137              self.conn().send('Tienes que describir algo...')              self.conn().send('Tienes que describir algo...')
1138                            
1139                    
1140      def cmd_actuar(self, mensaje):      def cmd_actuar(self, mensaje):
1141          if len(mensaje) > 0:          if len(mensaje) > 0:
1142              self.__personaje.actuar(mensaje)              self.__personaje.actuar(mensaje)
1143              self.conn().send(self.__personaje.id+' '+mensaje)              self.conn().send(self.__personaje.id+' '+mensaje)
1144          else:          else:
1145              self.conn().send('Tienes que hacer algo...')              self.conn().send('Tienes que hacer algo...')
1146                    
1147                            
1148      def cmd_gritar(self, mensaje, idioma=Idioma_oestron):      def cmd_gritar(self, mensaje, idioma=Idioma_oestron):
1149          if len(mensaje) > 0:          if len(mensaje) > 0:
1150              self.__personaje.gritar(mensaje,idioma)              self.__personaje.gritar(mensaje,idioma)
1151              self.conn().send("Gritas: "+mensaje)              self.conn().send("Gritas: "+mensaje)
1152          else:          else:
1153              self.conn().send('Tienes que decir algo...')              self.conn().send('Tienes que decir algo...')
1154    
1155                    
1156      def cmd_estadisticas(self):      def cmd_estadisticas(self):
1157          self.conn().send(color(31))          self.conn().send(color(31))
1158          self.conn().send("Estadísticas de " + self.__personaje.nombre)          self.conn().send("Estadísticas de " + self.__personaje.nombre)
1159          self.conn().send("-------------------------------------------------------------------")          self.conn().send("-------------------------------------------------------------------")
1160    
1161          self.conn().send(color(32), 0)          self.conn().send(color(32), 0)
1162          self.conn().send("Nombre: %-17s Aura: %-17d Nivel: %10d" %          self.conn().send("Nombre: %-17s Aura: %-17d Nivel: %10d" %
1163                           (self.__personaje.id,                           (self.__personaje.id,
1164                            self.__personaje.aura,                            self.__personaje.aura,
1165                            self.__personaje.nivel))                            self.__personaje.nivel))
1166          self.conn().send("Raza:   %-17s Vida: %-17d Experiencia: %4d" %          self.conn().send("Raza:   %-17s Vida: %-17d Experiencia: %4d" %
1167                           (self.__personaje.raza.nombre,                           (self.__personaje.raza.nombre,
1168                            self.__personaje.vida,                            self.__personaje.vida,
1169                            self.__personaje.experiencia))                            self.__personaje.experiencia))
1170          self.conn().send("Edad:   %-17d Profesion: %-12s Fuerza:       %3d" %          self.conn().send("Edad:   %-17d Profesion: %-12s Fuerza:       %3d" %
1171                           (self.__personaje.edad,                           (self.__personaje.edad,
1172                            self.__personaje.profesion.nombre,                            self.__personaje.profesion.nombre,
1173                            self.__personaje.atrib["fuerza"]))                            self.__personaje.atrib["fuerza"]))
1174          self.conn().send("Sexo:   %-17s Idiomas:                Destreza:     %3d" %          self.conn().send("Sexo:   %-17s Idiomas:                Destreza:     %3d" %
1175                           (self.__personaje.sexo,                           (self.__personaje.sexo,
1176                            self.__personaje.atrib["destreza"]))                            self.__personaje.atrib["destreza"]))
1177          self.conn().send("Altura: %-17.2f   quenya:  %-12s Constitución: %3d" %          self.conn().send("Altura: %-17.2f   quenya:  %-12s Constitución: %3d" %
1178                           (self.__personaje.altura,                           (self.__personaje.altura,
1179                            self.__personaje.idiomas[Idioma_quenya],                            self.__personaje.idiomas[Idioma_quenya],
1180                            self.__personaje.atrib["constitucion"]))                            self.__personaje.atrib["constitucion"]))
1181          self.conn().send("Peso:   %-17d   orco:    %-12s Inteligencia: %3d" %          self.conn().send("Peso:   %-17d   orco:    %-12s Inteligencia: %3d" %
1182                           (self.__personaje.peso,                           (self.__personaje.peso,
1183                            self.__personaje.idiomas[Idioma_orco],                            self.__personaje.idiomas[Idioma_orco],
1184                            self.__personaje.atrib["inteligencia"]))                            self.__personaje.atrib["inteligencia"]))
1185          self.conn().send("Color de ojos: %-11s  enano:   %-12s Sabiduria:    %3d" %          self.conn().send("Color de ojos: %-11s  enano:   %-12s Sabiduria:    %3d" %
1186                           (self.__personaje.color_de_ojos,                           (self.__personaje.color_de_ojos,
1187                            self.__personaje.idiomas[Idioma_enano],                            self.__personaje.idiomas[Idioma_enano],
1188                            self.__personaje.atrib["sabiduria"]))                            self.__personaje.atrib["sabiduria"]))
1189          self.conn().send("Color de pelo: %-11s  oestron: %-12s Carisma:      %3d" %          self.conn().send("Color de pelo: %-11s  oestron: %-12s Carisma:      %3d" %
1190                           (self.__personaje.color_de_pelo,                           (self.__personaje.color_de_pelo,
1191                            self.__personaje.idiomas[Idioma_oestron],                            self.__personaje.idiomas[Idioma_oestron],
1192                            self.__personaje.atrib["carisma"]))                            self.__personaje.atrib["carisma"]))
1193          self.conn().send("El idioma en el que hablas es: %s " % (self.__personaje.idioma_base.nombre))          self.conn().send("El idioma en el que hablas es: %s " % (self.__personaje.idioma_base.nombre))
1194          self.conn().send(color(31) + "-------------------------------------------------------------------" + finl)          self.conn().send(color(31) + "-------------------------------------------------------------------" + finl)
1195                    
1196                    
1197      def cmd_mirar(self, resumen=0):      def cmd_mirar(self, resumen=0):
1198    
1199          sala = self.__personaje.sala          sala = self.__personaje.sala
1200          self.conn().send(color(31) + "\nEstás en " + sala.nombre + finl)          self.conn().send(color(31) + "\nEstás en " + sala.nombre + finl)
1201    
1202          if not resumen:          if not resumen:
1203                            
1204              self.conn().send("\n------- Descripción del lugar -------")              self.conn().send("\n------- Descripción del lugar -------")
1205    
1206              for item in sala.descripcion:              for item in sala.descripcion:
1207                  if self.__tirada_percep_sala >= item["dificultad"]:                  if self.__tirada_percep_sala >= item["dificultad"]:
1208                      self.conn().send("\n" + item["texto"])                      self.conn().send("\n" + item["texto"])
1209    
1210          self.conn().send("\n--------------------------------------\n")          self.conn().send("\n--------------------------------------\n")
1211                    
1212          if len(sala.salidas) == 0:          if len(sala.salidas) == 0:
1213              self.conn().send(color(36) + "No hay ninguna salida. ¡¡Estás atrapado!!" + finl)              self.conn().send(color(36) + "No hay ninguna salida. ¡¡Estás atrapado!!" + finl)
1214          else:          else:
1215              for salida in sala.salidas:              for salida in sala.salidas:
1216                  if self.__tirada_percep_sala >= salida["dificultad"]:                  if self.__tirada_percep_sala >= salida["dificultad"]:
1217                      direccion = salida["direccion"]                      direccion = salida["direccion"]
1218                      if direccion in ["arriba", "abajo"]:                      if direccion in ["arriba", "abajo"]:
1219                          self.conn().send(color(36) + "Hacia " + direccion + " ves ", 0)                          self.conn().send(color(36) + "Hacia " + direccion + " ves ", 0)
1220                          self.conn().send(salida["descripcion"], 0)                          self.conn().send(salida["descripcion"], 0)
1221                          self.conn().send(finl)                          self.conn().send(finl)
1222                      elif direccion == "otro":                      elif direccion == "otro":
1223                          self.conn().send(color(36) + "También puedes ver ", 0)                          self.conn().send(color(36) + "También puedes ver ", 0)
1224                          self.conn().send(salida["descripcion"], 0)                          self.conn().send(salida["descripcion"], 0)
1225                          self.conn().send(finl)                          self.conn().send(finl)
1226                      else:                      else:
1227                          self.conn().send(color(36) + "Hacia el " + direccion + " ves ", 0)                          self.conn().send(color(36) + "Hacia el " + direccion + " ves ", 0)
1228                          self.conn().send(salida["descripcion"], 0)                          self.conn().send(salida["descripcion"], 0)
1229                          self.conn().send(finl)   # hay que hacer tres send, porque a veces sale un                          self.conn().send(finl)   # hay que hacer tres send, porque a veces sale un
1230                                                   # error raro si hago solo uno sumando los tres                                                   # error raro si hago solo uno sumando los tres
1231                                                   # strings (??)                                                   # strings (??)
1232    
1233          if len(sala.personajes) > 1:  # siempre habrá al menos uno: nuestro personaje          if len(sala.personajes) > 1:  # siempre habrá al menos uno: nuestro personaje
1234              self.conn().send(color(35) + '\nAquí se encuentran:' + finl)              self.conn().send(color(35) + '\nAquí se encuentran:' + finl)
1235              for enc in sala.personajes.values():              for enc in sala.personajes.values():
1236                  if isinstance(enc, PersonajeNoJugador):                  if isinstance(enc, PersonajeNoJugador):
1237                      pass                      pass
1238  #                    self.conn().send(color(35) + "Encuentras " + enc.id + finl)  #                    self.conn().send(color(35) + "Encuentras " + enc.id + finl)
1239                  else:                  else:
1240                      if enc != self.__personaje:                      if enc != self.__personaje:
1241                          self.conn().send(color(35) + enc.nombre + finl)                          self.conn().send(color(35) + enc.nombre + finl)
1242              for enc in sala.encuentros:              for enc in sala.encuentros:
1243                  self.conn().send(color(35) + enc.get('descripcion') + finl)                  self.conn().send(color(35) + enc.get('descripcion') + finl)
1244                            
1245          primero = 1          primero = 1
1246          for objeto in sala.objetos:          for objeto in sala.objetos:
1247              if len(objeto["instancias"]) > 0:              if len(objeto["instancias"]) > 0:
1248                  if self.__tirada_percep_sala >= objeto["dificultad"]:                  if self.__tirada_percep_sala >= objeto["dificultad"]:
1249                      if primero:                      if primero:
1250                          self.conn().send(color(32) + "\nAquí hay:" + finl)                                      self.conn().send(color(32) + "\nAquí hay:" + finl)            
1251                          primero = 0                          primero = 0
1252                      self.conn().send(color(32) + objeto["instancias"][0].nombre(), 0)                      self.conn().send(color(32) + objeto["instancias"][0].nombre(), 0)
1253                      if len(objeto["instancias"]) > 1:                      if len(objeto["instancias"]) > 1:
1254                          self.conn().send(" (" + str(len(objeto["instancias"])) + ")", 0)                          self.conn().send(" (" + str(len(objeto["instancias"])) + ")", 0)
1255                      self.conn().send(finl)                      self.conn().send(finl)
1256    
1257          self.conn().send("")          self.conn().send("")
1258    
1259                            
1260      def cmd_mochila(self):      def cmd_mochila(self):
1261          self.conn().send(color(31) + "--------- Contenido de la mochila ---------" + finl)          self.conn().send(color(31) + "--------- Contenido de la mochila ---------" + finl)
1262          if len(self.__personaje.mochila()) == 0:          if len(self.__personaje.mochila()) == 0:
1263              self.conn().send("(la mochila esta vacia)")              self.conn().send("(la mochila esta vacia)")
1264          else:          else:
1265              self.conn().send(color(31) + "%-35s%-8s" % ("Nombre", "Cantidad") + finl)              self.conn().send(color(31) + "%-35s%-8s" % ("Nombre", "Cantidad") + finl)
1266              for objetos in self.__personaje.mochila():              for objetos in self.__personaje.mochila():
1267                  self.conn().send("%-35s%8d" % (objetos[0].nombre(), len(objetos)))                  self.conn().send("%-35s%8d" % (objetos[0].nombre(), len(objetos)))
1268    
1269    
1270      def cmd_idioma(self, nombre_idioma_base):      def cmd_idioma(self, nombre_idioma_base):
1271          if len(nombre_idioma_base) == 0:          if len(nombre_idioma_base) == 0:
1272              self.conn().send("Tu idioma base actual es " + self.__personaje.idioma_base.nombre)              self.conn().send("Tu idioma base actual es " + self.__personaje.idioma_base.nombre)
1273          else:          else:
1274              idioma_base = Idioma_buscar(nombre_idioma_base)              idioma_base = Idioma_buscar(nombre_idioma_base)
1275              if idioma_base != None:              if idioma_base != None:
1276                  self.__personaje.idioma_base = idioma_base                  self.__personaje.idioma_base = idioma_base
1277                  self.conn().send("Tu idioma por defecto es ahora " + idioma_base.nombre)                  self.conn().send("Tu idioma por defecto es ahora " + idioma_base.nombre)
1278              else:              else:
1279                  self.conn().send("Lo siento, has de elegir como idioma base uno " +                  self.conn().send("Lo siento, has de elegir como idioma base uno " +
1280                                   "de los siguientes: " +                                   "de los siguientes: " +
1281                                   ", ".join([ i.nombre for i in Idioma_lista ]))                                   ", ".join([ i.nombre for i in Idioma_lista ]))
1282                    
1283    
1284      def cmd_coger(self, id_objeto, cantidad, n_orden, n_instancia):      def cmd_coger(self, id_objeto, cantidad, n_orden, n_instancia):
1285          encontrados = 0          encontrados = 0
1286          n_objeto = -1          n_objeto = -1
1287    
1288          # Buscar el objeto en la sala. Puede que haya varios con el mismo identificativo,          # Buscar el objeto en la sala. Puede que haya varios con el mismo identificativo,
1289          # discriminamos con el parametro n_orden.          # discriminamos con el parametro n_orden.
1290          for objeto in self.__personaje.sala.objetos:          for objeto in self.__personaje.sala.objetos:
1291              n_objeto = n_objeto + 1              n_objeto = n_objeto + 1
1292              instancias = objeto["instancias"]              instancias = objeto["instancias"]
1293              if len(instancias) > 0:              if len(instancias) > 0:
1294                  if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):                  if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):
1295                      encontrados = encontrados + 1                      encontrados = encontrados + 1
1296                      if encontrados == n_orden:                      if encontrados == n_orden:
1297    
1298                          # Hemos encontrado el objeto, ahora vemos si hay instancias                          # Hemos encontrado el objeto, ahora vemos si hay instancias
1299                          # suficientes.                          # suficientes.
1300                          if (n_instancia + cantidad - 1) > len(instancias):                          if (n_instancia + cantidad - 1) > len(instancias):
1301                              self.conn().send("No hay " + str(n_instancia + cantidad - 1) +                              self.conn().send("No hay " + str(n_instancia + cantidad - 1) +
1302                                               " instancias de ese objeto, solo hay " +                                               " instancias de ese objeto, solo hay " +
1303                                               str(len(instancias)))                                               str(len(instancias)))
1304                          else:                          else:
1305    
1306                              # Todo ok: cogemos las instancias y las metemos en la mochila                              # Todo ok: cogemos las instancias y las metemos en la mochila
1307                              for i in range(0, cantidad):                              for i in range(0, cantidad):
1308                                  instancia = self.__personaje.sala.coger_objeto(n_objeto,                                  instancia = self.__personaje.sala.coger_objeto(n_objeto,
1309                                                                                 n_instancia - 1)                                                                                 n_instancia - 1)
1310                                  self.__personaje.meter_en_mochila(instancia)                                  self.__personaje.meter_en_mochila(instancia)
1311    
1312                              self.__personaje.actuar("ha cogido " + instancia.nombre())                              self.__personaje.actuar("ha cogido " + instancia.nombre())
1313                              self.conn().send("Has cogido " + instancia.nombre(), 0)                              self.conn().send("Has cogido " + instancia.nombre(), 0)
1314                              if cantidad > 1:                              if cantidad > 1:
1315                                  self.conn().send(" (" + str(cantidad) + " unidades)")                                  self.conn().send(" (" + str(cantidad) + " unidades)")
1316                              else:                              else:
1317                                  self.conn().send("")                                  self.conn().send("")
1318    
1319                          break                          break
1320                                            
1321          if encontrados == 0:          if encontrados == 0:
1322              self.conn().send("No hay en la sala ningún objeto con identificativo " + id_objeto)              self.conn().send("No hay en la sala ningún objeto con identificativo " + id_objeto)
1323          elif encontrados < n_orden:          elif encontrados < n_orden:
1324              self.conn().send("No hay en la sala suficientes objetos con identificativo " +              self.conn().send("No hay en la sala suficientes objetos con identificativo " +
1325                               id_objeto + ", solo hay " + str(encontrados))                               id_objeto + ", solo hay " + str(encontrados))
1326    
1327    
1328  #%%    def cmd_coger(self, nombre_objeto, cantidad=1):  #%%    def cmd_coger(self, nombre_objeto, cantidad=1):
1329  #%%  #%%
1330  #%%        adquiridos = 0 #número de fallos  #%%        adquiridos = 0 #número de fallos
1331  #%%        despues = 0  #%%        despues = 0
1332  #%%        antes = 0  #%%        antes = 0
1333  #%%          #%%        
1334  #%%        for objeto_en_equipo in self.__personaje.equipo:  #%%        for objeto_en_equipo in self.__personaje.equipo:
1335  #%%            if objeto_en_equipo["id"] == nombre_objeto:  #%%            if objeto_en_equipo["id"] == nombre_objeto:
1336  #%%                antes = len(objeto_en_equipo["instancias"])  #%%                antes = len(objeto_en_equipo["instancias"])
1337  #%%                  #%%                
1338  #%%        for i in range(cantidad):  #%%        for i in range(cantidad):
1339  #%%            self.__personaje.sala.coger_objeto(self.__personaje, nombre_objeto)  #%%            self.__personaje.sala.coger_objeto(self.__personaje, nombre_objeto)
1340  #%%  #%%
1341  #%%        for objeto_en_equipo in self.__personaje.equipo:  #%%        for objeto_en_equipo in self.__personaje.equipo:
1342  #%%            if objeto_en_equipo["id"] == nombre_objeto:  #%%            if objeto_en_equipo["id"] == nombre_objeto:
1343  #%%                despues = len(objeto_en_equipo["instancias"])  #%%                despues = len(objeto_en_equipo["instancias"])
1344  #%%                  #%%                
1345  #%%        if despues - antes <1:  #%%        if despues - antes <1:
1346  #%%            self.conn().send("No hay en la sala un objeto con identificativo "+nombre_objeto)  #%%            self.conn().send("No hay en la sala un objeto con identificativo "+nombre_objeto)
1347  #%%        else:  #%%        else:
1348  #%%            self.conn().send("Se cogieron "+str(despues-antes) +" "+nombre_objeto+" de "+str(cantidad)+" indicados")  #%%            self.conn().send("Se cogieron "+str(despues-antes) +" "+nombre_objeto+" de "+str(cantidad)+" indicados")
1349    
1350            
1351      def cmd_dejar(self, id_objeto, cantidad, n_orden, n_instancia, dificultad = 0):      def cmd_dejar(self, id_objeto, cantidad, n_orden, n_instancia, dificultad = 0):
1352          encontrados = 0          encontrados = 0
1353          n_objeto = -1          n_objeto = -1
1354    
1355          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,
1356          # discriminamos con el parametro n_orden.          # discriminamos con el parametro n_orden.
1357          for instancias in self.__personaje.mochila():          for instancias in self.__personaje.mochila():
1358              n_objeto = n_objeto + 1              n_objeto = n_objeto + 1
1359              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):
1360                  encontrados = encontrados + 1                  encontrados = encontrados + 1
1361                  if encontrados == n_orden:                  if encontrados == n_orden:
1362    
1363                      # Hemos encontrado el objeto, ahora vemos si hay instancias                      # Hemos encontrado el objeto, ahora vemos si hay instancias
1364                      # suficientes.                      # suficientes.
1365                      if (n_instancia + cantidad - 1) > len(instancias):                      if (n_instancia + cantidad - 1) > len(instancias):
1366                          self.conn().send("No tienes " + str(n_instancia + cantidad - 1) +                          self.conn().send("No tienes " + str(n_instancia + cantidad - 1) +
1367                                           " unidades de ese objeto en la mochila, solo tienes " +                                           " unidades de ese objeto en la mochila, solo tienes " +
1368                                           str(len(instancias)))                                           str(len(instancias)))
1369                      else:                      else:
1370    
1371                          # Todo ok: sacamos las instancias de la mochila y las dejamos                          # Todo ok: sacamos las instancias de la mochila y las dejamos
1372                          # en la sala                          # en la sala
1373                          for i in range(0, cantidad):                          for i in range(0, cantidad):
1374                              instancia = self.__personaje.sacar_de_mochila(n_objeto,                              instancia = self.__personaje.sacar_de_mochila(n_objeto,
1375                                                                            n_instancia - 1)                                                                            n_instancia - 1)
1376                              self.__personaje.sala.dejar_objeto(instancia, dificultad)                                          self.__personaje.sala.dejar_objeto(instancia, dificultad)            
1377    
1378                          if dificultad == 0:                          if dificultad == 0:
1379                              self.__personaje.actuar("ha dejado " + instancia.nombre())                              self.__personaje.actuar("ha dejado " + instancia.nombre())
1380                              self.conn().send("Has dejado " + instancia.nombre(), 0)                              self.conn().send("Has dejado " + instancia.nombre(), 0)
1381                          else:                          else:
1382                              self.__personaje.actuar("ha escondido algo")                              self.__personaje.actuar("ha escondido algo")
1383                              self.conn().send("Has escondido " + instancia.nombre(), 0)                              self.conn().send("Has escondido " + instancia.nombre(), 0)
1384    
1385                          if cantidad > 1:                          if cantidad > 1:
1386                              self.conn().send(" (" + str(cantidad) + " unidades)")                              self.conn().send(" (" + str(cantidad) + " unidades)")
1387                          else:                          else:
1388                              self.conn().send("")                              self.conn().send("")
1389    
1390                      break                      break
1391                                            
1392          if encontrados == 0:          if encontrados == 0:
1393              self.conn().send("No tienes en la mochila ningún objeto con identificativo " +              self.conn().send("No tienes en la mochila ningún objeto con identificativo " +
1394                               id_objeto)                               id_objeto)
1395          elif encontrados < n_orden:          elif encontrados < n_orden:
1396              self.conn().send("No tienes en la mochila suficientes objetos con identificativo " +              self.conn().send("No tienes en la mochila suficientes objetos con identificativo " +
1397                               id_objeto + ", solo tienes " + str(encontrados))                               id_objeto + ", solo tienes " + str(encontrados))
1398    
1399    
1400      def cmd_dar(self, id_receptor, id_objeto, cantidad, n_orden, n_instancia):      def cmd_dar(self, id_receptor, id_objeto, cantidad, n_orden, n_instancia):
1401          encontrados = 0          encontrados = 0
1402          n_objeto = -1          n_objeto = -1
1403    
1404          # Buscar el id_receptor en la sala actual.          # Buscar el id_receptor en la sala actual.
1405          if self.__personaje.sala != None:          if self.__personaje.sala != None:
1406              receptor_encontrado = 0              receptor_encontrado = 0
1407              for personaje in  self.__personaje.sala.personajes.values():              for personaje in  self.__personaje.sala.personajes.values():
1408                  if personaje != self.__personaje and personaje.controlador != None and string.lower(personaje.id) == string.lower(id_receptor):                  if personaje != self.__personaje and personaje.controlador != None and string.lower(personaje.id) == string.lower(id_receptor):
1409                      receptor_encontrado = 1                      receptor_encontrado = 1
1410                      receptor = personaje                      receptor = personaje
1411                      break                      break
1412              if receptor_encontrado == 0:              if receptor_encontrado == 0:
1413                  self.conn().send('No hay nadie aquí que se llame '+id_receptor)                  self.conn().send('No hay nadie aquí que se llame '+id_receptor)
1414                  return                  return
1415                            
1416          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,
1417          # discriminamos con el parametro n_orden.          # discriminamos con el parametro n_orden.
1418          for instancias in self.__personaje.mochila():          for instancias in self.__personaje.mochila():
1419              n_objeto = n_objeto + 1              n_objeto = n_objeto + 1
1420              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):
1421                  encontrados = encontrados + 1                  encontrados = encontrados + 1
1422                  if encontrados == n_orden:                  if encontrados == n_orden:
1423    
1424                      # Hemos encontrado el objeto, ahora vemos si hay instancias                      # Hemos encontrado el objeto, ahora vemos si hay instancias
1425                      # suficientes.                      # suficientes.
1426                      if (n_instancia + cantidad - 1) > len(instancias):                      if (n_instancia + cantidad - 1) > len(instancias):
1427                          self.conn().send("No tienes " + str(n_instancia + cantidad - 1) +                          self.conn().send("No tienes " + str(n_instancia + cantidad - 1) +
1428                                           " unidades de ese objeto en la mochila, solo tienes " +                                           " unidades de ese objeto en la mochila, solo tienes " +
1429                                           str(len(instancias)))                                           str(len(instancias)))
1430                      else:                      else:
1431                          #Comprobar antes de seguir que el personaje que da el objeto se encuentra                          #Comprobar antes de seguir que el personaje que da el objeto se encuentra
1432                          #en la lista de confianza del receptor (salvo que el que da sea un Maia...)                          #en la lista de confianza del receptor (salvo que el que da sea un Maia...)
1433    
1434                          if not self.__personaje.esMaia():                          if not self.__personaje.esMaia():
1435                              try:                              try:
1436                                  confianza = receptor.ids_amigos[self.__personaje.id]                                  confianza = receptor.ids_amigos[self.__personaje.id]
1437                                  if confianza < 1:                                  if confianza < 1:
1438                                      raise KeyError                                      raise KeyError
1439                              except KeyError, e:                              except KeyError, e:
1440                                  self.conn().send(receptor.nombre + " no acepta tu objeto.\n",0)                                  self.conn().send(receptor.nombre + " no acepta tu objeto.\n",0)
1441                                  self.__personaje.actuar_individual(receptor, "te ha intentado dar " + id_objeto + " pero te has negado.")                                  self.__personaje.actuar_individual(receptor, "te ha intentado dar " + id_objeto + " pero te has negado.")
1442                                  break                                  break
1443                                                    
1444                          # Todo ok: sacamos las instancias de la mochila                          # Todo ok: sacamos las instancias de la mochila
1445                          for i in range(0, cantidad):                          for i in range(0, cantidad):
1446                              instancia = self.__personaje.sacar_de_mochila(n_objeto,                              instancia = self.__personaje.sacar_de_mochila(n_objeto,
1447                                                                            n_instancia - 1)                                                                            n_instancia - 1)
1448                              receptor.meter_en_mochila(instancia)                              receptor.meter_en_mochila(instancia)
1449    
1450                          #mensajes                          #mensajes
1451                          self.__personaje.actuar("ha dado " + instancia.nombre() + " a " + receptor.nombre)                          self.__personaje.actuar("ha dado " + instancia.nombre() + " a " + receptor.nombre)
1452                          self.conn().send("Has dado " + instancia.nombre() + " a " + receptor.nombre, 0)                          self.conn().send("Has dado " + instancia.nombre() + " a " + receptor.nombre, 0)
1453                          self.__personaje.actuar_individual(receptor, "te ha dado " + instancia.nombre() +' ('+str(cantidad)+' unidad[es])')                          self.__personaje.actuar_individual(receptor, "te ha dado " + instancia.nombre() +' ('+str(cantidad)+' unidad[es])')
1454                          if cantidad > 1:                          if cantidad > 1:
1455                              self.conn().send(" (" + str(cantidad) + " unidades)")                              self.conn().send(" (" + str(cantidad) + " unidades)")
1456                          else:                          else:
1457                              self.conn().send("")                              self.conn().send("")
1458    
1459                      break                      break
1460                                            
1461          if encontrados == 0:          if encontrados == 0:
1462              self.conn().send("No tienes en la mochila ningún objeto con identificativo " +              self.conn().send("No tienes en la mochila ningún objeto con identificativo " +
1463                               id_objeto)                               id_objeto)
1464          elif encontrados < n_orden:          elif encontrados < n_orden:
1465              self.conn().send("No tienes en la mochila suficientes objetos con identificativo " +              self.conn().send("No tienes en la mochila suficientes objetos con identificativo " +
1466                               id_objeto + ", solo tienes " + str(encontrados))                               id_objeto + ", solo tienes " + str(encontrados))
1467    
1468    
1469  #%%    def cmd_dejar(self, nombre_objeto, cantidad, accion = "dejado",dif=0):  #%%    def cmd_dejar(self, nombre_objeto, cantidad, accion = "dejado",dif=0):
1470  #%%        fallos = 0  #%%        fallos = 0
1471  #%%        for i in range(cantidad):  #%%        for i in range(cantidad):
1472  #%%            encontrar_id = self.__personaje.sala.dejar_objeto(self.__personaje, nombre_objeto, dif)  #%%            encontrar_id = self.__personaje.sala.dejar_objeto(self.__personaje, nombre_objeto, dif)
1473  #%%            if encontrar_id[0] == 0:  #%%            if encontrar_id[0] == 0:
1474  #%%                fallos +=1  #%%                fallos +=1
1475  #%%        if fallos != cantidad:  #%%        if fallos != cantidad:
1476  #%%            self.conn().send("Has "+accion+" en la sala "+str(cantidad - fallos)+" "+encontrar_id[1])  #%%            self.conn().send("Has "+accion+" en la sala "+str(cantidad - fallos)+" "+encontrar_id[1])
1477  #%%            if fallos !=0:  #%%            if fallos !=0:
1478  #%%                self.conn().send("No fue posible dejar "+str(cantidad)+ " "+ encontrar_id[1])  #%%                self.conn().send("No fue posible dejar "+str(cantidad)+ " "+ encontrar_id[1])
1479  #%%            self.cmd_actuar("deja algo.")  #%%            self.cmd_actuar("deja algo.")
1480  #%%        else:  #%%        else:
1481  #%%            self.conn().send("No hay en tu inventario un objeto con identificativo "+encontrar_id[1])  #%%            self.conn().send("No hay en tu inventario un objeto con identificativo "+encontrar_id[1])
1482    
1483                    
1484      def cmd_usar(self, nombre_objeto):      def cmd_usar(self, nombre_objeto):
1485          self.conn().send("Aún no se pueden usar objetos...")          self.conn().send("Aún no se pueden usar objetos...")
1486          #if nombre_objeto == "":          #if nombre_objeto == "":
1487          #    self.conn.send("Debes especificar un objeto")          #    self.conn.send("Debes especificar un objeto")
1488          #else:          #else:
1489          #    resultado =  encontrar_en_equipo(nombre_objeto, self.personaje.equipo)          #    resultado =  encontrar_en_equipo(nombre_objeto, self.personaje.equipo)
1490          #if resultado[1] == 0:          #if resultado[1] == 0:
1491          #    self.conn().send('No tienes un objeto llamado '+nombre_objeto)          #    self.conn().send('No tienes un objeto llamado '+nombre_objeto)
1492          #else:          #else:
1493          #    for efecto in resultado[0][:]:          #    for efecto in resultado[0][:]:
1494          #        pass          #        pass
1495    
1496      def cmd_examinar(self, id_objeto, n_orden, n_instancia):      def cmd_examinar(self, id_objeto, n_orden, n_instancia):
1497          encontrados = 0          encontrados = 0
1498          n_objeto = -1          n_objeto = -1
1499    
1500          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,          # Buscar el objeto en la mochila. Puede que haya varios con el mismo identificativo,
1501          # discriminamos con el parametro n_orden.          # discriminamos con el parametro n_orden.
1502          for instancias in self.__personaje.mochila():          for instancias in self.__personaje.mochila():
1503              n_objeto = n_objeto + 1              n_objeto = n_objeto + 1
1504              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):              if normalizar_id(id_objeto) == extraer_id(instancias[0].nombre()):
1505                  encontrados = encontrados + 1                  encontrados = encontrados + 1
1506                  if encontrados == n_orden:                  if encontrados == n_orden:
1507    
1508                      # Hemos encontrado el objeto, ahora vemos si hay instancias                      # Hemos encontrado el objeto, ahora vemos si hay instancias
1509                      # suficientes.                      # suficientes.
1510                      if (n_instancia) > len(instancias):                      if (n_instancia) > len(instancias):
1511                          self.conn().send("No tienes " + str(n_instancia) +                          self.conn().send("No tienes " + str(n_instancia) +
1512                                           " instancias de ese objeto en la mochila, solo tienes " +                                           " instancias de ese objeto en la mochila, solo tienes " +
1513                                           str(len(instancias)))                                           str(len(instancias)))
1514                      else:                      else:
1515    
1516                          # Todo ok: examinamos la instancia                          # Todo ok: examinamos la instancia
1517                          instancia = instancias[n_instancia - 1]                          instancia = instancias[n_instancia - 1]
1518                          for item in instancia.descripcion():                          for item in instancia.descripcion():
1519                              if self.__personaje.prueba("inteligencia", 0, item["dificultad"], 0) >= 0:                              if self.__personaje.prueba("inteligencia", 0, item["dificultad"], 0) >= 0:
1520                                  self.conn().send(item["texto"])                                  self.conn().send(item["texto"])
1521    
1522                          self.conn().send("Valor (me): " + str(instancia.valor()) + "," \                          self.conn().send("Valor (me): " + str(instancia.valor()) + "," \
1523                                           " Peso (kg): " + str(instancia.peso()) + "," \                                           " Peso (kg): " + str(instancia.peso()) + "," \
1524                                           " Volumen: " + str(instancia.volumen()) + "," \                                           " Volumen: " + str(instancia.volumen()) + "," \
1525                                           " Estado (1-100): " + str(instancia.estado()))                                           " Estado (1-100): " + str(instancia.estado()))
1526    
1527  #%%                     self.conn().send("Usos posibles:")  #%%                     self.conn().send("Usos posibles:")
1528  #%%                     for uso in instancia.usos:  #%%                     for uso in instancia.usos:
1529  #%%                         self.conn().send('Tipo: '+uso['tipo']+'\t Posición: '+uso['posicion'])  #%%                         self.conn().send('Tipo: '+uso['tipo']+'\t Posición: '+uso['posicion'])
1530    
1531    
1532  #%%    def cmd_examinar(self, nombre_objeto,posicion):  #%%    def cmd_examinar(self, nombre_objeto,posicion):
1533  #%%  #%%
1534  #%%        encontrado = 0  #%%        encontrado = 0
1535  #%%  #%%
1536  #%%        self.conn().send("Examinas "+nombre_objeto+" "+"("+str(posicion)+")")  #%%        self.conn().send("Examinas "+nombre_objeto+" "+"("+str(posicion)+")")
1537  #%%          #%%        
1538  #%%        for objeto in self.__personaje.equipo[:]:  #%%        for objeto in self.__personaje.equipo[:]:
1539  #%%            if objeto["id"] == nombre_objeto:  #%%            if objeto["id"] == nombre_objeto:
1540  #%%                if posicion > len(objeto["instancias"]):  #%%                if posicion > len(objeto["instancias"]):
1541  #%%                    self.conn().send("No tienes tanto de eso.")  #%%                    self.conn().send("No tienes tanto de eso.")
1542  #%%                    objeto_examinado = 0  #%%                    objeto_examinado = 0
1543  #%%                else:  #%%                else:
1544  #%%                    objeto_examinado = objeto["instancias"][posicion-1]  #%%                    objeto_examinado = objeto["instancias"][posicion-1]
1545  #%%                encontrado = 1  #%%                encontrado = 1
1546  #%%                break  #%%                break
1547  #%%        if encontrado == 0:  #%%        if encontrado == 0:
1548  #%%            self.conn().send('No tienes un objeto llamado '+nombre_objeto)  #%%            self.conn().send('No tienes un objeto llamado '+nombre_objeto)
1549  #%%        else:  #%%        else:
1550  #%%            if objeto_examinado == 0: pass  #%%            if objeto_examinado == 0: pass
1551  #%%            else:  #%%            else:
1552  #%%                for item in objeto_examinado.items:  #%%                for item in objeto_examinado.items:
1553  #%%                    if self.__personaje.atrib["inteligencia"] >= item["dificultad"]:  #%%                    if self.__personaje.atrib["inteligencia"] >= item["dificultad"]:
1554  #%%                        self.conn().send(item["texto"])  #%%                        self.conn().send(item["texto"])
1555  #%%                    else:  #%%                    else:
1556  #%%                        pass  #%%                        pass
1557  #%%                self.conn().send("Valor (me): "+str(objeto_examinado.valor)+","\  #%%                self.conn().send("Valor (me): "+str(objeto_examinado.valor)+","\
1558  #%%                " Peso (kg): "+str(objeto_examinado.peso)+","\  #%%                " Peso (kg): "+str(objeto_examinado.peso)+","\
1559  #%%                " Volumen: "+str(objeto_examinado.volumen)+","\  #%%                " Volumen: "+str(objeto_examinado.volumen)+","\
1560  #%%                " Estado (1-100): "+str(objeto_examinado.estado))  #%%                " Estado (1-100): "+str(objeto_examinado.estado))
1561  #%%                self.conn().send("Usos posibles:")  #%%                self.conn().send("Usos posibles:")
1562  #%%                for uso in objeto_examinado.usos:  #%%                for uso in objeto_examinado.usos:
1563  #%%                    self.conn().send('Tipo: '+uso['tipo']+'\t Posición: '+uso['posicion'])  #%%                    self.conn().send('Tipo: '+uso['tipo']+'\t Posición: '+uso['posicion'])
1564    
1565    
1566      def cmd_observar(self, nombre_oponente):      def cmd_observar(self, nombre_oponente):
1567    
1568          encontrado = 0          encontrado = 0
1569          for oponente in self.__personaje.sala.personajes.values():          for oponente in self.__personaje.sala.personajes.values():
1570              print oponente.id, oponente.nombre              print oponente.id, oponente.nombre
1571              if isinstance(oponente, PersonajeJugador):              if isinstance(oponente, PersonajeJugador):
1572                  nombre = oponente.id                  nombre = oponente.id
1573              else:              else:
1574                  nombre = oponente.nombre                  nombre = oponente.nombre
1575    
1576              if normalizar_id(nombre_oponente) == extraer_id(nombre):              if normalizar_id(nombre_oponente) == extraer_id(nombre):
1577                 encontrado = 1                 encontrado = 1
1578                 break                 break
1579    
1580          if encontrado == 0:          if encontrado == 0:
1581              self.conn().send("Aquí no hay nadie llamado " + nombre_oponente)              self.conn().send("Aquí no hay nadie llamado " + nombre_oponente)
1582              return              return
1583    
1584          result = self.__personaje.comparar(oponente)          result = self.__personaje.comparar(oponente)
1585    
1586          if result == Personaje.COMP_INF_MAS_FUERTE:          if result == Personaje.COMP_INF_MAS_FUERTE:
1587              adjetivo = "infinitamente más fuerte"              adjetivo = "infinitamente más fuerte"
1588          elif result == Personaje.COMP_MUCHO_MAS_FUERTE:          elif result == Personaje.COMP_MUCHO_MAS_FUERTE:
1589              adjetivo = "mucho más fuerte"              adjetivo = "mucho más fuerte"
1590          elif result == Personaje.COMP_BAST_MAS_FUERTE:          elif result == Personaje.COMP_BAST_MAS_FUERTE:
1591              adjetivo = "bastante más fuerte"              adjetivo = "bastante más fuerte"
1592          elif result == Personaje.COMP_ALGO_MAS_FUERTE:          elif result == Personaje.COMP_ALGO_MAS_FUERTE:
1593              adjetivo = "algo más fuerte"              adjetivo = "algo más fuerte"
1594          elif result == Personaje.COMP_POR_EL_ESTILO:          elif result == Personaje.COMP_POR_EL_ESTILO:
1595              adjetivo = "por el estilo"              adjetivo = "por el estilo"
1596          elif result == Personaje.COMP_ALGO_MAS_DEBIL:          elif result == Personaje.COMP_ALGO_MAS_DEBIL:
1597              adjetivo = "algo más débil"              adjetivo = "algo más débil"
1598          elif result == Personaje.COMP_BAST_MAS_DEBIL:          elif result == Personaje.COMP_BAST_MAS_DEBIL:
1599              adjetivo = "bastante más débil"              adjetivo = "bastante más débil"
1600          elif result == Personaje.COMP_MUCHO_MAS_DEBIL:          elif result == Personaje.COMP_MUCHO_MAS_DEBIL:
1601              adjetivo = "mucho más débil"              adjetivo = "mucho más débil"
1602          elif result == Personaje.COMP_INF_MAS_DEBIL:          elif result == Personaje.COMP_INF_MAS_DEBIL:
1603              adjetivo = "infinitamente más débil"              adjetivo = "infinitamente más débil"
1604                    
1605          self.conn().send(oponente.nombre + " es " + adjetivo + " que tú")          self.conn().send(oponente.nombre + " es " + adjetivo + " que tú")
1606                    
1607          if oponente == self.__personaje:          if oponente == self.__personaje:
1608              self.conn().send('Tu descripción:')              self.conn().send('Tu descripción:')
1609              for key in self.__personaje.descripcion:              for key in self.__personaje.descripcion:
1610                  self.conn().send(color(31)+key["texto"]+finl)                  self.conn().send(color(31)+key["texto"]+finl)
1611          else:          else:
1612              self.conn().send('Descripción:')              self.conn().send('Descripción:')
1613              for key in oponente.descripcion:              for key in oponente.descripcion:
1614                  if self.__personaje.atrib["inteligencia"] + tirar_dados(3) > key["dificultad"]:                  if self.__personaje.atrib["inteligencia"] + tirar_dados(3) > key["dificultad"]:
1615                      self.conn().send(color(31)+key["texto"]+finl)                      self.conn().send(color(31)+key["texto"]+finl)
1616                    
1617    
1618      def cmd_seguir(self, id_lider):      def cmd_seguir(self, id_lider):
1619          if not self.__personaje.sala.personajes.has_key(id_lider):          if not self.__personaje.sala.personajes.has_key(id_lider):
1620              self.conn().send('Aqui no hay nadie llamado ' + id_lider)              self.conn().send('Aqui no hay nadie llamado ' + id_lider)
1621          else:          else:
1622              if self.__personaje.anterior != None:              if self.__personaje.anterior != None:
1623                  self.conn().send('Ya no estas siguiendo a ' + self.__personaje.anterior.id)                  self.conn().send('Ya no estas siguiendo a ' + self.__personaje.anterior.id)
1624                  self.__personaje.noseguir()                  self.__personaje.noseguir()
1625    
1626              lider = self.__personaje.sala.personajes[id_lider]              lider = self.__personaje.sala.personajes[id_lider]
1627              self.__personaje.seguir(lider)              self.__personaje.seguir(lider)
1628              self.conn().send('Ahora estas siguiendo a ' + lider.id)              self.conn().send('Ahora estas siguiendo a ' + lider.id)
1629                                                    
1630    
1631      def cmd_noseguir(self):      def cmd_noseguir(self):
1632          if self.__personaje.anterior == None:          if self.__personaje.anterior == None:
1633              self.conn().send('¡No estabas siguiendo a nadie!')              self.conn().send('¡No estabas siguiendo a nadie!')
1634          else:          else:
1635              self.conn().send('Ya no estas siguiendo a ' + self.__personaje.anterior.id)              self.conn().send('Ya no estas siguiendo a ' + self.__personaje.anterior.id)
1636              self.__personaje.noseguir()              self.__personaje.noseguir()
1637    
1638    
1639      def cmd_ip(self):      def cmd_ip(self):
1640          self.conn().send('Estás conectado desde la dirección ' + self.conn().ip)          self.conn().send('Estás conectado desde la dirección ' + self.conn().ip)
1641    
1642    
1643      def cmd_area(self):      def cmd_area(self):
1644          self.conn().send('Estás en el área ' + self.__personaje.sala.area)          self.conn().send('Estás en el área ' + self.__personaje.sala.area)
1645    
1646                                                    
1647      def cmd_atacar(self, nombre_oponente):      def cmd_atacar(self, nombre_oponente):
1648            
1649          if not self.__personaje.sala.personajes.has_key(nombre_oponente):          if not self.__personaje.sala.personajes.has_key(nombre_oponente):
1650              self.conn().send("Aquí no hay nadie llamado " + nombre_oponente)              self.conn().send("Aquí no hay nadie llamado " + nombre_oponente)
1651              self.estado_0()              self.estado_0()
1652          else:          else:
1653              self.oponente = self.__personaje.sala.personajes[nombre_oponente]              self.oponente = self.__personaje.sala.personajes[nombre_oponente]
1654                            
1655              if self.oponente.estado == "muerto":              if self.oponente.estado == "muerto":
1656                  self.conn().send("¡" + nombre_oponente + " ya está muerto/a!")                  self.conn().send("¡" + nombre_oponente + " ya está muerto/a!")
1657                  self.estado_0()                  self.estado_0()
1658              else:              else:
1659                  if self.__personaje.competicion(self.oponente, "carisma", "sabiduria"):                  if self.__personaje.competicion(self.oponente, "carisma", "sabiduria"):
1660                      self.cmd_observar(nombre_oponente)                      self.cmd_observar(nombre_oponente)
1661                      self.estado_combate_0()                      self.estado_combate_0()
1662                  else:                  else:
1663                      self.cbt_empieza_combate_atacas()                      self.cbt_empieza_combate_atacas()
1664                      self.cbt_pegar()                      self.cbt_pegar()
1665                      if self.oponente.estado == "muerto":                      if self.oponente.estado == "muerto":
1666                          self.cbt_oponente_muerto()                          self.cbt_oponente_muerto()
1667                          self.cbt_termina_combate()                          self.cbt_termina_combate()
1668                          self.estado_0()                          self.estado_0()
1669                      elif self.__personaje.estado == "muerto":                      elif self.__personaje.estado == "muerto":
1670                          self.cbt_personaje_muerto()                          self.cbt_personaje_muerto()
1671                          self.cbt_termina_combate()                          self.cbt_termina_combate()
1672                          self.estado_0()                          self.estado_0()
1673                      else:                      else:
1674                          self.estado_combate_1()                          self.estado_combate_1()
1675    
1676    
1677      def cmd_reloj(self):      def cmd_reloj(self):
1678          ahora = FechaHoraMine_ahora()          ahora = FechaHoraMine_ahora()
1679          self.conn().send("%s (%s)" % (str(ahora), ahora.desc_seccion()))          self.conn().send("%s (%s)" % (str(ahora), ahora.desc_seccion()))
1680    
1681                            
1682  # Código para pruebas unitarias del módulo.  # Código para pruebas unitarias del módulo.
1683    
1684  if (__name__ == '__main__'):  if (__name__ == '__main__'):
1685      print "No hay código para pruebas unitarias del módulo."      print "No hay código para pruebas unitarias del módulo."
1686      print "Para probar, ejecutar mine.py y conectarse via telnet."      print "Para probar, ejecutar mine.py y conectarse via telnet."
1687    

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

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