def throw(self, player, item, target_text): with Observer(player) as ob: if not player.is_carrying(item): player.notify_observers_reply('not_carrying', template=ReplyHelpers.TEMPLATE_ACTION, action=Actions.get_action_text(Actions.THROW), item_prefix=item.text_prefix, item_text=item.description) return self.__build_reply(ob) target = None if target_text is None: target = self.get_next_monster() else: for m in self.get_monsters(): if m.is_match(target_text): target = m break #Ok probably room item if not target: target = self.get_room_item_by_text(target_text) if not target: return ReplyHelpers.render_action_template('no_such_target', item_text=item.description) #Either throw at a room item or a monster is_monster = isinstance(target, players.Monster) is_player = isinstance(target, players.Player) and not is_monster is_weapon = isinstance(item, weapons.Weapon) is_item = isinstance(target, items.Item) or isinstance(target, RoomItem) floor_text = self.__get_room_text()[1] with Observer(player) as ob: is_hit = player.throw(item, target) if is_hit and is_item: player.notify_observers_reply('throw_item_hit', template=ReplyHelpers.TEMPLATE_ACTION, item_text=item.description, target_text=target.description, floor_text=floor_text) elif is_item: player.notify_observers_reply('throw_item_miss', template=ReplyHelpers.TEMPLATE_ACTION, item_text=item.description, target_text=target.description, floor_text=floor_text) if is_hit and is_monster and is_weapon: #Hit and lodged in monster if not GameRules.is_thrown_item_lost(): target.pickup(item) elif is_hit and is_player: #Hit and lodged in player pass else: #Miss or hit and on floor if not GameRules.is_thrown_item_lost(): self.add_floor_item(item.one_of()) if is_monster and is_weapon and not target.is_dead: target.strike(player) return self.__build_reply(ob)
def _miss(self, player, defender): Weapon._miss(self, player, defender) #Drop arrow #TODO: Arrow should be left on ground if GameRules.is_thrown_item_lost(): player.inventory.remove(self.__ammo.__class__()) else: player.get_rid_of_one(self.__ammo.__class__())