def test_health_pack_in_backpack_does_not_prevent_equip(self) -> None: dng_ctrl = make_dungeon_controller() fake_player_data = HumanoidData(Status(100), Inventory()) dng_ctrl.set_player_data(fake_player_data) inventory = fake_player_data.inventory pos = Vector2(0, 0) pistol = build_map_object('pistol', pos) shotgun = build_map_object('shotgun', pos) inventory.attempt_pickup(pistol) inventory.attempt_pickup( shotgun) # shotgun mod goes to slot 0 in backpack inventory.attempt_pickup( build_map_object('healthpack', pos)) inventory.attempt_pickup( build_map_object('healthpack', pos)) mock_view = Mock(spec=DungeonView) mock_view.selected_item = lambda: 0 dng_ctrl._view = mock_view pistol_mod = pistol.mod shotgun_mod = shotgun.mod weapon_loc = pistol_mod.loc self.assertEqual(inventory.active_mods[weapon_loc], pistol_mod) dng_ctrl._equip_mod_in_backpack() self.assertEqual(inventory.active_mods[weapon_loc], shotgun_mod)
def test_pickup_stackable_adds_to_active_mods(self) -> None: player = make_player() player.inventory.attempt_pickup(build_map_object('rock', player.pos)) self.assertFalse(player.inventory.backpack.slot_occupied(0)) player.inventory.attempt_pickup(build_map_object('rock', player.pos)) self.assertFalse(player.inventory.backpack.slot_occupied(0))
def test_set_player_data(self) -> None: ctrl = make_dungeon_controller() player = make_player() pos = Vector2(0, 0) pistol = build_map_object('pistol', pos) shotgun = build_map_object('shotgun', pos) player.inventory.attempt_pickup(pistol) player.inventory.attempt_pickup( shotgun) # shotgun mod goes to slot 0 in backpack player.status.increment_health(-10) ctrl.set_player_data(player.data) self.assertEqual(ctrl._dungeon.player.data, player.data)
def make_zombie( player: Union[creatures.players.Player, None] = None ) -> creatures.enemies.Enemy: if player is None: player = make_player() pos = player.pos + pygame.math.Vector2(100, 0) return build_map_object('zombie', pos, player)
def test_unequip(self) -> None: dng_ctrl = make_dungeon_controller() fake_player_data = HumanoidData(Status(100), Inventory()) dng_ctrl.set_player_data(fake_player_data) inventory = fake_player_data.inventory pos = Vector2(0, 0) pistol = build_map_object('pistol', pos) inventory.attempt_pickup(pistol) # ensure nothing in backpack self.assertEqual(inventory.backpack._slots_filled, 0) # ensure one mod equiped arm_mod = inventory.active_mods[mods.ModLocation.ARMS] self.assertTrue(arm_mod is not None) # unequip inventory.unequip(mods.ModLocation.ARMS) # ensure something now in backpack self.assertEqual(inventory.backpack._slots_filled, 1) # ensure nothing on the arms self.assertNotIn(mods.ModLocation.ARMS, inventory.active_mods)
def test_items_do_not_move_in_backpack_after_equip(self) -> None: player = make_player() pos = Vector2(0, 0) shotgun = build_map_object('shotgun', pos) inventory = player.inventory inventory.attempt_pickup(build_map_object('pistol', pos)) inventory.attempt_pickup( shotgun) # shotgun mod goes to slot 0 in backpack inventory.attempt_pickup(build_map_object('healthpack', pos)) shotgun_2 = build_map_object('shotgun', pos) inventory.attempt_pickup(shotgun_2) self.assertIs(inventory.backpack[1], shotgun_2.mod) inventory.equip(shotgun.mod) self.assertIs(inventory.backpack[1], shotgun_2.mod)
def make_controller_and_resolutions(self) -> ControllerAndResolutions: continue_decision = MakeDecision('continue') if self._gained_item_label is not None: gained_item = constructors.build_map_object( self._gained_item_label) else: gained_item = None ctrl = TransitionController(self._description, continue_decision, gained_item) return ctrl, [continue_decision]
def test_mod_stacking_in_active_mods(self) -> None: player = make_player() pos = Vector2(0, 0) hp = build_map_object('healthpack', pos) self.assertNotIn(hp.mod.loc, player.inventory.active_mods) player.inventory.attempt_pickup(hp) player_mod = player.inventory.active_mods[hp.mod.loc] self.assertIs(player_mod, hp.mod) self.assertEqual(player_mod.ability.uses_left, 1) player.inventory.attempt_pickup(build_map_object('healthpack', pos)) player_mod = player.inventory.active_mods[hp.mod.loc] self.assertEqual(player_mod.ability.uses_left, 2) player.inventory.attempt_pickup(build_map_object('healthpack', pos)) player_mod = player.inventory.active_mods[hp.mod.loc] self.assertEqual(player_mod.ability.uses_left, 3)
def test_set_player_gained_item_removed_from_groups_even_if_not_picked_up( self) -> None: transition = TransitionScene('description', 'shotgun') player = make_player() while not player.inventory.backpack.is_full: pistol = constructors.build_map_object('pistol') player.inventory.attempt_pickup(pistol) num_items = len(self.groups.items) ctrl, _ = transition.make_controller_and_resolutions() self.assertEqual(len(self.groups.items), num_items + 1) ctrl.set_player_data(player.data) self.assertEqual(len(self.groups.items), num_items) shotgun = constructors.build_map_object('shotgun') self.assertNotIn(shotgun.mod, player.inventory.backpack) active_mod = player.inventory.active_mods[shotgun.mod.loc] self.assertNotEqual(shotgun.mod, active_mod)
def test_mod_stacking_in_backpack(self) -> None: player = make_player() pos = Vector2(0, 0) player.inventory.attempt_pickup(build_map_object('pistol', pos)) self.assertFalse(player.inventory.backpack.slot_occupied(0)) player.inventory.attempt_pickup(build_map_object('rock', pos)) self.assertTrue(player.inventory.backpack.slot_occupied(0)) self.assertEqual(player.inventory.backpack[0].ability.uses_left, 1) player.inventory.attempt_pickup(build_map_object('rock', pos)) self.assertEqual(player.inventory.backpack[0].ability.uses_left, 2) player.inventory.attempt_pickup(build_map_object('rock', pos)) self.assertEqual(player.inventory.backpack[0].ability.uses_left, 3) player.inventory.attempt_pickup(build_map_object('rock', pos)) self.assertEqual(player.inventory.backpack[0].ability.uses_left, 4)
def test_pickup_several_items(self) -> None: player = make_player() pos = Vector2(0, 0) laser_gun = build_map_object('laser', pos) battery = build_map_object('battery', pos) pistol = build_map_object('pistol', pos) medpack = build_map_object('healthpack', pos) player.inventory.attempt_pickup(laser_gun) self.assertIs(laser_gun.mod, player.inventory.active_mods[mods.ModLocation.ARMS]) player.inventory.attempt_pickup(battery) self.assertIs(battery.mod, player.inventory.active_mods[mods.ModLocation.CHEST]) player.inventory.attempt_pickup(pistol) self.assertIn(pistol.mod, player.inventory.backpack) self.assertTrue(player.inventory.backpack.slot_occupied(0)) player.inventory.attempt_pickup(medpack) self.assertIn(medpack.mod, player.inventory.backpack) self.assertTrue(player.inventory.backpack.slot_occupied(1))
def test_set_player_adds_gained_item(self) -> None: description = 'description' decision = MakeDecision('decision') rock: ItemObject = constructors.build_map_object('rock') player = make_player() self.assertNotIn(rock.mod.loc, player.inventory.active_mods) ctrl = TransitionController(description, decision, rock) self.assertNotIn(rock.mod.loc, player.inventory.active_mods) ctrl.set_player_data(player.data) self.assertIn(rock.mod.loc, player.inventory.active_mods)
def test_item_object_bob_motion(self) -> None: pistol_item = build_map_object('pistol', Vector2(0, 0)) time_for_sweep = int(pistol_item._bob_period * 10) center = pistol_item.rect.center original_center_y = center[1] original_center_x = center[0] min_center_y = center[1] max_center_y = center[1] for _ in range(time_for_sweep): min_center_y = min(min_center_y, center[1]) max_center_y = max(max_center_y, center[1]) self.assertEqual(center[1], original_center_x) self.assertEqual(original_center_y, min_center_y) self.assertEqual(-original_center_y, max_center_y)
def test_build_zone(self) -> None: self.assertEqual(len(self.groups.zones), 0) build_map_object(ObjectType.ZONE, Vector2(0, 0), None, (30, 30)) self.assertEqual(len(self.groups.zones), 1)
def test_build_obstacle(self) -> None: self.assertEqual(len(self.groups.walls), 0) build_map_object(ObjectType.WALL, Vector2(0, 0), None, (30, 30)) self.assertEqual(len(self.groups.walls), 1)
def activate(self, humanoid: Any) -> None: # TODO(dvirk): I need to import locally to avoid circular import # errors. Is this bad? from data.constructors import build_map_object build_map_object(self.item_label, humanoid.pos)
def kill(self) -> None: super().kill() if self._data.drops_on_kill is not None: from data.constructors import build_map_object build_map_object(self._data.drops_on_kill, self.pos)
def make_item(label: str) -> items.ItemObject: pos = Vector2(0, 0) return build_map_object(label, pos)