self.turn = 0
self.things = []
- def get_thing(self, id_, create_unfound=True):
+ def get_thing(self, id_, create_unfound):
+ # No default for create_unfound because every call to get_thing
+ # should be accompanied by serious consideration whether to use it.
for thing in self.things:
if id_ == thing.id_:
return thing
else:
self.io.send('PLAYER_INVENTORY ,')
for id_ in self.player.inventory:
- thing = self.get_thing(id_)
+ thing = self.get_thing(id_, create_unfound=False)
send_thing(thing)
self.io.send('GAME_STATE_COMPLETE')
def task_prefixed(command_name, task_prefix, task_command,
argtypes_prefix=None):
- if command_name[:len(task_prefix)] == task_prefix:
+ if command_name.startswith(task_prefix):
task_name = command_name[len(task_prefix):]
if task_name in self.tasks:
f = partial_with_attrs(task_command, task_name, self)
@property
def player(self):
- return self.get_thing(self.player_id)
+ return self.get_thing(self.player_id, create_unfound=False)
def new_thing_id(self):
if len(self.things) == 0:
return 0
+ # DANGEROUS – if anywhere we append a thing to the list of lower
+ # ID than the highest-value ID, this might lead to re-using an
+ # already active ID. This condition /should/ not be fulfilled
+ # anywhere in the code, but if it does, trouble here is one of
+ # the more obvious indicators that it does – that's why there's
+ # no safeguard here against this.
return self.things[-1].id_ + 1
def get_map(self, map_pos):
# inside are disappeared.
elif m.awake > 0:
m.awake -= 1
- for t in self.things:
+ # We iterate over a list comprehension of self.things,
+ # since we might delete elements of self.things.
+ for t in [t for t in self.things]:
if t.position[0] == map_pos:
if not t.type_ in m.stats:
m.stats[t.type_] = {'population': 0,
if isinstance(t, ThingAnimate):
m.stats[t.type_]['health'] += t.health
if not m.awake:
+ # TODO: Handle inventory.
del self.things[self.things.index(t)]
#if not m.awake:
# print('DEBUG sleep stats', map_pos, m.stats)