Beispiel #1
0
    def test_allies_in_range_melee_weapon(self):
        points_to_elevation = {
            Point(1, 0): -3,
            Point(0, 1): 4,
            Point(1, 1): 0,
            Point(2, 1): -4,
            Point(1, 2): 3
        }
        tiles = [
            Tile(elevation=elevation, point=point)
            for point, elevation in points_to_elevation.items()
        ]
        the_map = Map(3, 3, tiles)

        origin, below, above = self.a_units
        far_below = Soldier()
        far_above = Soldier()
        self.team_a.add_player(far_above)
        self.team_a.add_player(far_below)
        origin.equip_weapon(MeleeWeapon(10, 10, 10, 10))

        the_map.place_unit(origin, Point(1, 1))
        the_map.place_unit(below, Point(1, 0))
        the_map.place_unit(above, Point(1, 2))
        the_map.place_unit(far_above, Point(0, 1))
        the_map.place_unit(far_below, Point(2, 1))

        tf = TargetFinder(the_map, [self.team_a, self.team_b])

        answer = tf.allies_in_range(origin)
        expected = {below: (1, 1), above: (1, -1)}
        self.assertEqual(answer, expected)
Beispiel #2
0
    def test_attack_with_different_weapon(self):
        opponent = Soldier()
        new_weapon = MeleeWeapon(10, 1)
        self.soldier.equip_weapon(new_weapon)
        self.assertEqual(self.soldier.get_weapon().dmg, 10)

        self.soldier.attack(opponent)
        self.assertEqual(opponent.get_health(), 90)

        self.soldier.attack(opponent)
        self.assertEqual(opponent.get_health(), 80)
Beispiel #3
0
    def test_attack_out_of_ammo_reloads_and_uses_action_points(self):
        soldier = Soldier(action_pts=10)
        weapon = MeleeWeapon(5, 1, 1, 2)
        soldier.equip_weapon(weapon)

        for _ in range(2):
            soldier.attack(self.soldier)

        self.assertEqual(weapon.ammo, 0)
        self.assertEqual(self.soldier.get_health(), 90)
        self.assertEqual(soldier.get_action_points(), 8)

        soldier.attack(self.soldier)

        self.assertEqual(weapon.ammo, 2)
        self.assertEqual(self.soldier.get_health(), 90)
        self.assertEqual(soldier.get_action_points(), 7)
Beispiel #4
0
 def test_is_melee_weapon(self):
     melee = MeleeWeapon(1, 2, 3)
     ranged = RangedWeapon(2, 3, 4, 5)
     self.assertTrue(melee.is_melee_weapon())
     self.assertFalse(ranged.is_melee_weapon())
Beispiel #5
0
 def test_equip_weapon(self):
     stick = MeleeWeapon(3, 2)
     self.soldier.equip_weapon(stick)
     self.assertEqual(self.soldier.get_weapon(), stick)
Beispiel #6
0
 def setUp(self):
     self.ranged = RangedWeapon(dmg=3, action_pts=4, range_=5, ammo=5)
     self.melee = MeleeWeapon(dmg=4, action_pts=2)
Beispiel #7
0
 def test_melee_init_no_defaults(self):
     new = MeleeWeapon(2, 3, 4, 5)
     self.assertEqual(new.dmg, 2)
     self.assertEqual(new.action_pts, 3)
     self.assertEqual(new.range, 4)
     self.assertEqual(new.ammo, 5)
Beispiel #8
0
 def test_melee_init_defaults(self):
     new = MeleeWeapon(2, 3)
     self.assertEqual(new.dmg, 2)
     self.assertEqual(new.action_pts, 3)
     self.assertEqual(new.range, 1)
     self.assertEqual(new.ammo, float('inf'))
Beispiel #9
0
class TestWeapon(unittest.TestCase):
    def setUp(self):
        self.ranged = RangedWeapon(dmg=3, action_pts=4, range_=5, ammo=5)
        self.melee = MeleeWeapon(dmg=4, action_pts=2)

    def test_init_and_getters(self):
        new = Weapon(dmg=2, action_pts=3, range_=4, ammo=5)
        self.assertEqual(new.ammo, 5)
        self.assertEqual(new.max_ammo, 5)
        self.assertEqual(new.dmg, 2)
        self.assertEqual(new.action_pts, 3)
        self.assertEqual(new.range, 4)

    def test_use_weapon_inf_ammo(self):
        dmg = self.melee.use_weapon()
        self.assertEqual(dmg, 4)
        self.assertEqual(self.melee.ammo, float('inf'))

    def test_use_weapon_non_inf_ammo(self):
        self.assertEqual(self.ranged.ammo, 5)
        self.assertEqual(self.ranged.use_weapon(), 3)
        self.assertEqual(self.ranged.ammo, 4)

    def test_use_weapon_no_ammo(self):
        for _ in range(5):
            self.ranged.use_weapon()

        self.assertRaises(OutOfAmmo, self.ranged.use_weapon)

    def test_refill_ammo_inf(self):
        self.melee.use_weapon()
        self.melee.refill_ammo()
        self.assertEqual(self.melee.ammo, float('inf'))

    def test_refill_ammo_not_inf(self):
        self.ranged.use_weapon()
        self.ranged.refill_ammo()
        self.assertEqual(self.ranged.ammo, 5)

        for _ in range(5):
            self.ranged.use_weapon()

        self.ranged.refill_ammo()
        self.assertEqual(self.ranged.ammo, 5)

    def test_melee_init_defaults(self):
        new = MeleeWeapon(2, 3)
        self.assertEqual(new.dmg, 2)
        self.assertEqual(new.action_pts, 3)
        self.assertEqual(new.range, 1)
        self.assertEqual(new.ammo, float('inf'))

    def test_melee_init_no_defaults(self):
        new = MeleeWeapon(2, 3, 4, 5)
        self.assertEqual(new.dmg, 2)
        self.assertEqual(new.action_pts, 3)
        self.assertEqual(new.range, 4)
        self.assertEqual(new.ammo, 5)

    def test_ranged_init(self):
        new = RangedWeapon(2, 3, 4, 5)
        self.assertEqual(new.dmg, 2)
        self.assertEqual(new.action_pts, 3)
        self.assertEqual(new.range, 4)
        self.assertEqual(new.ammo, 5)

    def test_is_melee_weapon(self):
        melee = MeleeWeapon(1, 2, 3)
        ranged = RangedWeapon(2, 3, 4, 5)
        self.assertTrue(melee.is_melee_weapon())
        self.assertFalse(ranged.is_melee_weapon())
Beispiel #10
0
from typing import Union

from battle.players.strategy import StupidStrategy
from battle.statstools.stat import PositiveStat
from battle.weapon import MeleeWeapon, RangedWeapon, Weapon, OutOfAmmo

FIST = MeleeWeapon(dmg=1, action_pts=1)
GUN = RangedWeapon(dmg=5, action_pts=2, range_=5, ammo=10)


class Soldier(object):
    def __init__(self,
                 action_pts: int = 3,
                 health: Union[float, int] = 100,
                 heal_pct: float = 5.0):
        self._strategy = StupidStrategy()
        self._action_pts = PositiveStat(action_pts)
        self._health = PositiveStat(health)

        self._healing_pct = heal_pct

        self._weapon = FIST

    @property
    def strategy(self):
        return self._strategy

    def get_perimeter_size(self) -> int:
        return self._weapon.range

    def get_sight_range(self) -> int: