Commit
·
5da83f5
1
Parent(s):
4a8d953
New scenario
Browse files- app.py +2 -1
- config.ini +1 -1
- example_worlds.py +106 -9
- prompts.py +34 -11
- world.py +5 -3
app.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1 |
import gradio as gr
|
2 |
from gradio import ChatMessage
|
3 |
import re
|
4 |
-
import sys
|
5 |
import time
|
6 |
import json
|
7 |
import os
|
@@ -125,6 +124,8 @@ world = example_worlds.get_world(world_id, language=language)
|
|
125 |
last_player_position = world.player.location
|
126 |
number_of_turns = 0
|
127 |
game_log_dictionary = {}
|
|
|
|
|
128 |
game_log_dictionary["narrative_model_name"] = narrative_model_name
|
129 |
game_log_dictionary["reasoning_model_name"] = reasoning_model_name
|
130 |
|
|
|
1 |
import gradio as gr
|
2 |
from gradio import ChatMessage
|
3 |
import re
|
|
|
4 |
import time
|
5 |
import json
|
6 |
import os
|
|
|
124 |
last_player_position = world.player.location
|
125 |
number_of_turns = 0
|
126 |
game_log_dictionary = {}
|
127 |
+
game_log_dictionary["nickname"] = "anonymous"
|
128 |
+
game_log_dictionary["world_id"] = world_id
|
129 |
game_log_dictionary["narrative_model_name"] = narrative_model_name
|
130 |
game_log_dictionary["reasoning_model_name"] = reasoning_model_name
|
131 |
|
config.ini
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
[Options]
|
2 |
Language = es
|
3 |
-
WorldID =
|
4 |
|
5 |
[Models]
|
6 |
NarrativeModel = gemini-1.0-pro
|
|
|
1 |
[Options]
|
2 |
Language = es
|
3 |
+
WorldID = 2
|
4 |
|
5 |
[Models]
|
6 |
NarrativeModel = gemini-1.0-pro
|
example_worlds.py
CHANGED
@@ -5,19 +5,23 @@ from world import Character, Item, Location, Puzzle, World
|
|
5 |
|
6 |
|
7 |
def get_world(arg: str, language='en') -> World:
|
8 |
-
if arg=='
|
|
|
|
|
|
|
|
|
|
|
9 |
if language == 'es':
|
10 |
return get_world_2_spanish()
|
11 |
else:
|
12 |
return get_world_2_english()
|
13 |
else:
|
14 |
if language == 'es':
|
15 |
-
return
|
16 |
else:
|
17 |
-
return
|
18 |
|
19 |
-
def
|
20 |
-
"""A simple fictional world, used as an example in Figure 3 of the paper."""
|
21 |
item_1 = Item("Apple",
|
22 |
["A fruit that can be eaten", "It is round-shaped and green"])
|
23 |
item_2 = Item("Toy car",
|
@@ -60,7 +64,7 @@ def get_world_1_english() -> World:
|
|
60 |
|
61 |
return the_world
|
62 |
|
63 |
-
def
|
64 |
item_1 = Item("Manzana",
|
65 |
["Una fruta que puede ser comida", "Es redonda y verde"])
|
66 |
item_2 = Item("Auto de juguete",
|
@@ -104,11 +108,9 @@ def get_world_1_spanish() -> World:
|
|
104 |
the_world.add_character(npc)
|
105 |
the_world.set_objective(item_2,place_3)
|
106 |
|
107 |
-
|
108 |
return the_world
|
109 |
|
110 |
-
def
|
111 |
-
"""Use this world to test more complex cases, like blocked passages between locations."""
|
112 |
item_1 = Item("Apple",
|
113 |
["A fruit that can be eaten", "It is round-shaped and red"])
|
114 |
item_2 = Item("Key",
|
@@ -160,3 +162,98 @@ def get_world_2_english() -> World:
|
|
160 |
the_world.add_character(npc)
|
161 |
|
162 |
return the_world
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
|
7 |
def get_world(arg: str, language='en') -> World:
|
8 |
+
if arg=='1':
|
9 |
+
if language == 'es':
|
10 |
+
return get_world_1_spanish()
|
11 |
+
else:
|
12 |
+
return get_world_1_english()
|
13 |
+
elif arg=='2':
|
14 |
if language == 'es':
|
15 |
return get_world_2_spanish()
|
16 |
else:
|
17 |
return get_world_2_english()
|
18 |
else:
|
19 |
if language == 'es':
|
20 |
+
return get_world_0_spanish()
|
21 |
else:
|
22 |
+
return get_world_0_english()
|
23 |
|
24 |
+
def get_world_0_english() -> World:
|
|
|
25 |
item_1 = Item("Apple",
|
26 |
["A fruit that can be eaten", "It is round-shaped and green"])
|
27 |
item_2 = Item("Toy car",
|
|
|
64 |
|
65 |
return the_world
|
66 |
|
67 |
+
def get_world_0_spanish() -> World:
|
68 |
item_1 = Item("Manzana",
|
69 |
["Una fruta que puede ser comida", "Es redonda y verde"])
|
70 |
item_2 = Item("Auto de juguete",
|
|
|
108 |
the_world.add_character(npc)
|
109 |
the_world.set_objective(item_2,place_3)
|
110 |
|
|
|
111 |
return the_world
|
112 |
|
113 |
+
def get_world_1_english() -> World:
|
|
|
114 |
item_1 = Item("Apple",
|
115 |
["A fruit that can be eaten", "It is round-shaped and red"])
|
116 |
item_2 = Item("Key",
|
|
|
162 |
the_world.add_character(npc)
|
163 |
|
164 |
return the_world
|
165 |
+
|
166 |
+
def get_world_1_spanish() -> World:
|
167 |
+
|
168 |
+
item_1 = Item("Tortuga",["La mascota de Emma", "Emma la llama 'Hojita'"])
|
169 |
+
item_2 = Item("Llave",
|
170 |
+
["Una llave para abrir un candado", "Es dorada", "Tiene grabada la imagen de un extraño escudo de armas"])
|
171 |
+
item_3 = Item("Un martillo gris",
|
172 |
+
["Un martillo gris grande que puede ser usado para romper cosas", "Es muy pesado"])
|
173 |
+
item_4 = Item("Candado",
|
174 |
+
["Un candado fuerte que tiene grabado un escudo de armas", "Parece que no puede ser abierto con las manos"])
|
175 |
+
item_5 = Item("Un martillo verde",
|
176 |
+
["Un pequeño martillo verde", "Es solamente un juguete y no se puede romper nada con él"])
|
177 |
+
|
178 |
+
place_3 = Location ("Jardín",
|
179 |
+
["El jardín de la casa", "Es relativamente chico, de unos 5 metros cuadrados"],
|
180 |
+
items = [item_1])
|
181 |
+
place_2 = Location("Cocina",
|
182 |
+
["Es la cocina de la casa", "No es enorme, pero tampoco es la cocina más chiquita del mundo", "Por las ventanas entra mucha luz"])
|
183 |
+
place_2.connecting_locations = [place_3]
|
184 |
+
place_2.block_passage(place_3, item_4)
|
185 |
+
place_3.connecting_locations = [place_2]
|
186 |
+
|
187 |
+
place_1 = Location("Taller de pintura",
|
188 |
+
["Es el taller de pintura que la madre de Emma tiene en su casa", "Hay una puerta de metal trancada por un candado"],
|
189 |
+
items = [item_3, item_5])
|
190 |
+
place_1.connecting_locations = [place_2]
|
191 |
+
place_2.connecting_locations = [place_1]
|
192 |
+
|
193 |
+
player = Character("Emma",
|
194 |
+
["Una adolescente de estatura promedio", "Está buscando a su mascota 'Hojita'"],
|
195 |
+
inventory = [],
|
196 |
+
location = place_1)
|
197 |
+
npc = Character("Laura",
|
198 |
+
["Una mujer de unos 45 años de edad", "Es la madre de Emma", "Es una artista que pinta al óleo"],
|
199 |
+
inventory = [item_2],
|
200 |
+
location= place_1)
|
201 |
+
|
202 |
+
the_world = World(player)
|
203 |
+
the_world.add_locations([place_1,place_2,place_3])
|
204 |
+
the_world.add_items([item_1,item_2,item_3,item_4,item_5])
|
205 |
+
the_world.add_character(npc)
|
206 |
+
the_world.set_objective(item_1,place_2)
|
207 |
+
|
208 |
+
return the_world
|
209 |
+
|
210 |
+
def get_world_2_spanish() -> World:
|
211 |
+
|
212 |
+
item_1 = Item("Pinturas",
|
213 |
+
["Hay algo escrito en los muros con una pintura hecha con barro", "Dice 'Hay que confiar en los poderes que se nos han otorgado"],
|
214 |
+
gettable=False)
|
215 |
+
item_2 = Item("Placa",
|
216 |
+
["Una placa de metal con una inscripción", "Dice 'Un río muy grande'"],
|
217 |
+
gettable=False)
|
218 |
+
item_3 = Item("Estanque",
|
219 |
+
["Un estanque de agua cristalina", "El agua es tan clara que funciona como un espejo"],
|
220 |
+
gettable=False)
|
221 |
+
item_4 = Item("Un muro de llamas",
|
222 |
+
["Las llamas son fuertes y dan mucho calor", "Tiene una altura de 3 metros"],
|
223 |
+
gettable=False)
|
224 |
+
puzzle_1 = Puzzle("Puzzle",
|
225 |
+
["Un encanto mágico que genera un muro intraspasable", "Mágicamente, al acercarse aparecen unas letras azules que explican cuál es el acertijo a resolver"],
|
226 |
+
"Hay que susurrar el nombre del río que baña la costa sur de la Banda Oriental", "Rio de la Plata")
|
227 |
+
|
228 |
+
place_1 = Location ("Claro en el monte",
|
229 |
+
["Un claro en un monte de eucaliptus cerca del Río Uruguay", "Se puede escuchar el sonido de los animales que viven en los árboles de este monte"],
|
230 |
+
items = [item_1, item_3])
|
231 |
+
place_2 = Location("Monte silencioso",
|
232 |
+
["El monte continúa en esta parte", "A diferencia de la parte anterior, esta zona está insonorizada y no se escucha ni siquiera un mínimo sonido"],
|
233 |
+
items=[item_2])
|
234 |
+
place_2.connecting_locations = [place_1]
|
235 |
+
place_1.connecting_locations = [place_2]
|
236 |
+
place_1.block_passage(place_2, item_4)
|
237 |
+
|
238 |
+
place_3 = Location("Celda",
|
239 |
+
["Una celda cuadrada de dos metros cuadrados", "Las vegetación del monte ya ha ingresado al interior"])
|
240 |
+
place_3.connecting_locations = [place_2]
|
241 |
+
place_2.connecting_locations = [place_3]
|
242 |
+
place_2.block_passage(place_3,puzzle_1)
|
243 |
+
|
244 |
+
npc = Character("José Artigas",
|
245 |
+
["El héroe nacional de Uruguay", "Está cansado, de estar tanto tiempo encerrado"],
|
246 |
+
inventory = [],
|
247 |
+
location = place_3)
|
248 |
+
player = Character("Venancio",
|
249 |
+
["Un gaucho uruguayo de 40 años de edad", "Pertenece a los soldados de Artigas", "Tiene el poder mágico de invocar una ola gigante de agua con la que puede apagar fuegos o humedecer la tierra"],
|
250 |
+
inventory = [],
|
251 |
+
location= place_1)
|
252 |
+
|
253 |
+
the_world = World(player)
|
254 |
+
the_world.add_locations([place_1,place_2,place_3])
|
255 |
+
the_world.add_items([item_1,item_2,item_3,item_4])
|
256 |
+
the_world.add_character(npc)
|
257 |
+
the_world.set_objective(player,npc)
|
258 |
+
|
259 |
+
return the_world
|
prompts.py
CHANGED
@@ -37,6 +37,8 @@ def prompt_describe_objective_spanish (objective) -> str:
|
|
37 |
prompt+= f'"<{objective[0].name}> tiene que conseguir el objeto <{objective[1].name}>."'
|
38 |
elif first_component_class == "Item" and second_component_class == "Location":
|
39 |
prompt+= f'"Tienes que dejar el objeto <{objective[0].name}> en el lugar <{objective[1].name}>."'
|
|
|
|
|
40 |
|
41 |
prompt+="\nPon tu narración generada entre caracteres #. Por ejemplo: # Tienes que conseguir la <llave> # o # Tienes que llegaral <Castillo> #"
|
42 |
|
@@ -79,9 +81,9 @@ def prompt_narrate_current_scene_spanish (world_state: str, previous_narrations:
|
|
79 |
prompt = f"""Eres un narrador. Toma el siguiente estado del mundo y nárralo en unas pocas oraciones. Ten cuidado de no incluir detalles que contradigan el estado del mundo actual, o que hagan avanzar la historia. Además, intenta usar oraciones simples, sin abusar del lenguaje poético."""
|
80 |
|
81 |
if starting_scene:
|
82 |
-
prompt += "\nTen en cuenta que esta es la primera escena en la historia
|
83 |
elif len(previous_narrations)==0:
|
84 |
-
prompt += "Ten en cuenta que el jugador ya conoce a su personaje, y cómo se ve, así que no menciones nada sobre esto. Sin embargo, es la primera vez que el jugador visita este lugar, así que describelo
|
85 |
else:
|
86 |
prompt += "Ten en cuenta que el jugador ya conoce a s upersonaje, y cómo se ve, así que no menciones nada sobre esto. Además, no es la primera vez que el jugador visita este lugar. A continuación te daré algunas narraciones previas de este mismo lugar (de la más antigua a la más nueva), así te puedes asegurar de no repetir los mismos detalles de nuevo:\n"
|
87 |
for narration in previous_narrations:
|
@@ -119,45 +121,66 @@ def prompt_world_update_spanish (world_state: str, input: str) -> str:
|
|
119 |
- Moved object: <object> now is in <new_location>
|
120 |
- Blocked passages now available: <now_reachable_location>
|
121 |
- Your location changed: <new_location>
|
|
|
|
|
|
|
|
|
122 |
|
123 |
-
Aquí hay algunos ejemplos sobre el formato, descrito en el anterior punto (D).
|
124 |
Ejemplo 1
|
125 |
- Moved object: <hacha> now is in <Inventory>
|
126 |
- Blocked passages now available: None
|
127 |
- Your location changed: None
|
|
|
128 |
|
129 |
Ejemplo 2
|
130 |
- Moved object: None
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
- Blocked passages now available: None
|
132 |
- Your location changed: <Jardín>
|
|
|
133 |
|
134 |
-
Ejemplo
|
135 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
136 |
- Blocked passages now available: None
|
137 |
- Your location changed: None
|
|
|
138 |
|
139 |
-
Ejemplo
|
140 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
141 |
- Blocked passages now available: <Pequeña habitación>
|
142 |
- Your location changed: None
|
|
|
143 |
|
144 |
-
Ejemplo
|
145 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
146 |
- Blocked passages now available: <Pequeña habitación>
|
147 |
- Your location changed: <Pequeña habitación>
|
|
|
148 |
|
149 |
-
Ejemplo
|
150 |
- Moved object: <libro> now is in <John>, <lápiz> now is in <Inventory>
|
151 |
- Blocked passages now available: None
|
152 |
- Your location changed: None
|
|
|
153 |
|
154 |
-
Ejemplo
|
155 |
- Moved object: <computadora> now is in <Susan>
|
156 |
- Blocked passages now available: None
|
157 |
- Your location changed: None
|
158 |
-
|
159 |
-
|
160 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
|
162 |
return prompt
|
163 |
|
|
|
37 |
prompt+= f'"<{objective[0].name}> tiene que conseguir el objeto <{objective[1].name}>."'
|
38 |
elif first_component_class == "Item" and second_component_class == "Location":
|
39 |
prompt+= f'"Tienes que dejar el objeto <{objective[0].name}> en el lugar <{objective[1].name}>."'
|
40 |
+
elif first_component_class == "Character" and second_component_class == "Character":
|
41 |
+
prompt+= f'"<{objective[0].name}> tiene que encontrar a <{objective[1].name}>."'
|
42 |
|
43 |
prompt+="\nPon tu narración generada entre caracteres #. Por ejemplo: # Tienes que conseguir la <llave> # o # Tienes que llegaral <Castillo> #"
|
44 |
|
|
|
81 |
prompt = f"""Eres un narrador. Toma el siguiente estado del mundo y nárralo en unas pocas oraciones. Ten cuidado de no incluir detalles que contradigan el estado del mundo actual, o que hagan avanzar la historia. Además, intenta usar oraciones simples, sin abusar del lenguaje poético."""
|
82 |
|
83 |
if starting_scene:
|
84 |
+
prompt += "\nTen en cuenta que esta es la primera escena en la historia narrada: presenta al personaje del jugador, creando un pequeño trasfondo y por qué este personaje está en ese lugar específicamente. Puede usar las pequeñas descripciones presentes en el estado del mundo. Es importante que menciones todos los componentes que hay en este lugar. Sin embargo, es mejor si no describes cada componente: basta con que los menciones con una mínima descripción poco específica. Es muy importante que nombres los lugares a los que puede acceder el jugador desde esta posición. \n"
|
85 |
elif len(previous_narrations)==0:
|
86 |
+
prompt += "Ten en cuenta que el jugador ya conoce a su personaje, y cómo se ve, así que no menciones nada sobre esto. Sin embargo, es la primera vez que el jugador visita este lugar, así que describelo. Es importante que menciones todos los componentes que hay en este lugar. Sin embargo, es mejor si no describes cada componente: basta con que los menciones con una mínima descripción poco específica. Es muy importante que nombres los lugares a los que puede acceder el jugador desde esta posición. \n"
|
87 |
else:
|
88 |
prompt += "Ten en cuenta que el jugador ya conoce a s upersonaje, y cómo se ve, así que no menciones nada sobre esto. Además, no es la primera vez que el jugador visita este lugar. A continuación te daré algunas narraciones previas de este mismo lugar (de la más antigua a la más nueva), así te puedes asegurar de no repetir los mismos detalles de nuevo:\n"
|
89 |
for narration in previous_narrations:
|
|
|
121 |
- Moved object: <object> now is in <new_location>
|
122 |
- Blocked passages now available: <now_reachable_location>
|
123 |
- Your location changed: <new_location>
|
124 |
+
(E) Por último, puedes agregar una narración de los cambios detecados en el estado del mundo (¡sin hacer avanzar la historia y sin crear detalles no incluidos en el estado del mundo!) usando el formato: #<tu mensaje final>#
|
125 |
+
(F) Dentro de la sección de narración que agregues al final, entre símbolos #, también puedes responder preguntas que haga el jugador en su entrada, sobre los objetos o personajes que puede ver, o el lugar en el que se encuentra.
|
126 |
+
|
127 |
+
Aquí hay algunos ejemplos sobre el formato, descritos en los puntos (D) y (E):
|
128 |
|
|
|
129 |
Ejemplo 1
|
130 |
- Moved object: <hacha> now is in <Inventory>
|
131 |
- Blocked passages now available: None
|
132 |
- Your location changed: None
|
133 |
+
# Guardaste el hacha en tu bolso. Sientes la diferencia de peso luego de haberla guardado #
|
134 |
|
135 |
Ejemplo 2
|
136 |
- Moved object: None
|
137 |
+
- Blocked passages now available: <Sótano>
|
138 |
+
- Your location changed: None
|
139 |
+
# El sótano, que estaba bloqueado, ahora está accesible #
|
140 |
+
|
141 |
+
Ejemplo 3
|
142 |
+
- Moved object: None
|
143 |
- Blocked passages now available: None
|
144 |
- Your location changed: <Jardín>
|
145 |
+
# Entras al Jardín #
|
146 |
|
147 |
+
Ejemplo 4
|
148 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
149 |
- Blocked passages now available: None
|
150 |
- Your location changed: None
|
151 |
+
# Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal #
|
152 |
|
153 |
+
Ejemplo 5
|
154 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
155 |
- Blocked passages now available: <Pequeña habitación>
|
156 |
- Your location changed: None
|
157 |
+
# Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal. Además, la pequeña habitación ahora está accesible. #
|
158 |
|
159 |
+
Ejemplo 6
|
160 |
- Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
|
161 |
- Blocked passages now available: <Pequeña habitación>
|
162 |
- Your location changed: <Pequeña habitación>
|
163 |
+
# Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal. Además, la pequeña habitación ahora está accesible e ingresaste a ella #
|
164 |
|
165 |
+
Ejemplo 7
|
166 |
- Moved object: <libro> now is in <John>, <lápiz> now is in <Inventory>
|
167 |
- Blocked passages now available: None
|
168 |
- Your location changed: None
|
169 |
+
# John ahora tiene el libro. Tú guardaste el lápiz en tu bolso #
|
170 |
|
171 |
+
Ejemplo 8
|
172 |
- Moved object: <computadora> now is in <Susan>
|
173 |
- Blocked passages now available: None
|
174 |
- Your location changed: None
|
175 |
+
# Susan guardó la computadora en su bolso #
|
176 |
+
|
177 |
+
Ejemplo 9
|
178 |
+
- Moved object: None
|
179 |
+
- Blocked passages now available: None
|
180 |
+
- Your location changed: None
|
181 |
+
# No pasa nada... #
|
182 |
+
|
183 |
+
"""
|
184 |
|
185 |
return prompt
|
186 |
|
world.py
CHANGED
@@ -166,8 +166,8 @@ class World:
|
|
166 |
first_component_class = first_component.__class__.__name__
|
167 |
second_component_class = second_component.__class__.__name__
|
168 |
|
169 |
-
if
|
170 |
-
|
171 |
elif (first_component_class == "Character" and second_component_class in ["Location", "Item"]) or (second_component_class == "Character" and first_component_class in ["Location", "Item"]):
|
172 |
self.objective = (first_component, second_component)
|
173 |
elif (first_component_class == "Item" and second_component_class == "Location") or (second_component_class == "Item" and first_component_class == "Location"):
|
@@ -181,7 +181,9 @@ class World:
|
|
181 |
first_component_class = self.objective[0].__class__.__name__
|
182 |
second_component_class = self.objective[1].__class__.__name__
|
183 |
|
184 |
-
if first_component_class == "Character" and second_component_class == "
|
|
|
|
|
185 |
if self.objective[0].location == self.objective[1]: done = True
|
186 |
elif first_component_class == "Character" and second_component_class == "Item":
|
187 |
if self.objective[1] in self.objective[0].inventory: done = True
|
|
|
166 |
first_component_class = first_component.__class__.__name__
|
167 |
second_component_class = second_component.__class__.__name__
|
168 |
|
169 |
+
if first_component_class == "Character" and second_component_class == "Character":
|
170 |
+
self.objective = (first_component, second_component)
|
171 |
elif (first_component_class == "Character" and second_component_class in ["Location", "Item"]) or (second_component_class == "Character" and first_component_class in ["Location", "Item"]):
|
172 |
self.objective = (first_component, second_component)
|
173 |
elif (first_component_class == "Item" and second_component_class == "Location") or (second_component_class == "Item" and first_component_class == "Location"):
|
|
|
181 |
first_component_class = self.objective[0].__class__.__name__
|
182 |
second_component_class = self.objective[1].__class__.__name__
|
183 |
|
184 |
+
if first_component_class == "Character" and second_component_class == "Character":
|
185 |
+
if self.objective[0].location == self.objective[1].location: done = True
|
186 |
+
elif first_component_class == "Character" and second_component_class == "Location":
|
187 |
if self.objective[0].location == self.objective[1]: done = True
|
188 |
elif first_component_class == "Character" and second_component_class == "Item":
|
189 |
if self.objective[1] in self.objective[0].inventory: done = True
|