diff --git a/game/common/enums.py b/game/common/enums.py index eeb734c1..b126e18a 100644 --- a/game/common/enums.py +++ b/game/common/enums.py @@ -20,12 +20,19 @@ class Upgrades: map_object = 4 damaging_object = 5 moving_object = 6 - shooter = 7 - item = 8 - gun = 9 - wall = 10 + grenade = 7 + shooter = 8 + item = 9 + gun = 10 + wall = 11 +class DamagingType: + none = 0 + #note that bullet object has not been added yet + bullet = 1 + grenade = 2 + class GunType: none = 0 handgun = 1 diff --git a/game/common/moving/damaging_object.py b/game/common/moving/damaging/damaging_object.py similarity index 95% rename from game/common/moving/damaging_object.py rename to game/common/moving/damaging/damaging_object.py index da702309..00833f04 100644 --- a/game/common/moving/damaging_object.py +++ b/game/common/moving/damaging/damaging_object.py @@ -9,8 +9,8 @@ class DamagingObject(MovingObject): def __init__(self, range=0, damage=0, heading = None, speed = None, health=None, coordinates=None, hitbox=None, collidable=None): super().__init__(heading, speed, health, coordinates, hitbox, collidable) - self.__range = range - self.__damage = damage + self.range = range + self.damage = damage self.object_type = ObjectType.damaging_object @property diff --git a/game/common/moving/damaging/grenade.py b/game/common/moving/damaging/grenade.py new file mode 100644 index 00000000..fc43f492 --- /dev/null +++ b/game/common/moving/damaging/grenade.py @@ -0,0 +1,33 @@ +from game.common.moving.damaging.damaging_object import DamagingObject +from game.common.stats import GameStats +from game.common.enums import * + + +class Grenade(DamagingObject): + def __init__(self, fuse_time = GameStats.grenade_stats['min_fuse_time'], range= None, damage= None, + heading = None, speed = None, health=None, coordinates=None, hitbox=None, collidable=None): + super().__init__(range, damage, heading, speed, health, coordinates, hitbox, collidable) + self.fuse_time = fuse_time + self.object_type = ObjectType.grenade + + @property + def fuse_time(self): + return self.__fuse_time + + @fuse_time.setter + def fuse_time(self, val): + if val >= GameStats.grenade_stats['min_fuse_time'] and val <= GameStats.grenade_stats['max_fuse_time']: + self.__fuse_time = val + else: + raise Exception("fuse time value outside bounds, Not set") + + + def to_json(self): + data = super().to_json() + data['fuse_time'] = self.fuse_time + + return data + + def from_json(self, data): + super().from_json(data) + self.fuse_time = data['fuse_time'] diff --git a/game/common/moving/moving_object.py b/game/common/moving/moving_object.py index e9587757..1a11ca86 100644 --- a/game/common/moving/moving_object.py +++ b/game/common/moving/moving_object.py @@ -9,8 +9,8 @@ class MovingObject(MapObject): def __init__(self, heading=0, speed=0, health=None, coordinates=None, hitbox=None, collidable=None): super().__init__(health, coordinates, hitbox, collidable) # Double underscore 'name mangles' the variable. The closest to private we can get in python - self.__heading = heading - self.__speed = speed + self.heading = heading + self.speed = speed self.object_type = ObjectType.moving_object @property diff --git a/game/common/stats.py b/game/common/stats.py index 99d30b16..8ed75f8a 100644 --- a/game/common/stats.py +++ b/game/common/stats.py @@ -48,6 +48,11 @@ class GameStats: 'fire_rate': 1, 'range': 100, 'mag_size': 1, 'reload_speed': 8, 'cooldown': {'max': 1, 'rate': 1}, 'level_mod': 1.25} } + + grenade_stats = { + 'min_fuse_time': 10, + 'max_fuse_time': 50 + } Upgrades.gun_upgrades = 20 #Could potentially incease bullet speed? Upgrades.movement_upgrades = 20 #May be used to make the player go faster? diff --git a/game/test_suite/tests/__init__.py b/game/test_suite/tests/__init__.py index 5ff200a4..976d0cb7 100644 --- a/game/test_suite/tests/__init__.py +++ b/game/test_suite/tests/__init__.py @@ -4,11 +4,13 @@ from game.test_suite.tests.objects.test_game_board import TestGameBoard from game.test_suite.tests.objects.test_moving_object import TestMovingObject from game.test_suite.tests.objects.test_damaging_object import TestDamagingObject +from game.test_suite.tests.objects.test_grenade import TestGrenade from game.test_suite.tests.objects.test_initialization import TestInit __all__ = [ 'TestGameBoard', 'TestMovingObject', 'TestDamagingObject', + 'TestGrenade', 'TestInit' ] \ No newline at end of file diff --git a/game/test_suite/tests/objects/test_damaging_object.py b/game/test_suite/tests/objects/test_damaging_object.py index 8b274c23..23f7432c 100644 --- a/game/test_suite/tests/objects/test_damaging_object.py +++ b/game/test_suite/tests/objects/test_damaging_object.py @@ -1,6 +1,6 @@ import unittest -from game.common.moving import damaging_object -from game.common.moving.damaging_object import DamagingObject +from game.common.moving.damaging import damaging_object +from game.common.moving.damaging.damaging_object import DamagingObject from game.common.stats import GameStats class TestDamagingObject(unittest.TestCase): diff --git a/game/test_suite/tests/objects/test_grenade.py b/game/test_suite/tests/objects/test_grenade.py new file mode 100644 index 00000000..6b18c0dd --- /dev/null +++ b/game/test_suite/tests/objects/test_grenade.py @@ -0,0 +1,54 @@ +import unittest +from game.common.moving.damaging import grenade +from game.common.moving.damaging.grenade import Grenade +from game.common.stats import GameStats + +class TestGrenade(unittest.TestCase): + + def setUp(self): + self.grnObj = Grenade(10) + + def test_set_get_fuse_time_valid(self): + self.grnObj.fuse_time = 20 + self.assertEqual(self.grnObj.fuse_time, 20) + + + def test_set_get_fuse_time_invalid_low(self): + self.assertRaises(Exception, lambda : self.grnObj.fuse_time(0)) + + def test_set_get_fuse_time_invalid_high(self): + self.assertRaises(Exception, lambda : self.grnObj.fuse_time(100)) + + def test_set_get_fuse_time_boundary_low(self): + self.grnObj.fuse_time = GameStats.grenade_stats['min_fuse_time'] + self.assertEqual(self.grnObj.fuse_time, GameStats.grenade_stats['min_fuse_time']) + + + def test_set_get_fuse_time_boundary_high(self): + self.grnObj.fuse_time = GameStats.grenade_stats['max_fuse_time'] + self.assertEqual(self.grnObj.fuse_time, GameStats.grenade_stats['max_fuse_time']) + + + def test_grenade_obj_parent_params(self): + + testGrn = Grenade(fuse_time = 20, range = 10, damage = 10, heading = 10, speed = 10, health = 1, coordinates=[{'x': 450, 'y': 450}, {'x': 50, 'y': 50}], + hitbox={'width': 10, 'height': 10}, collidable=True) + + self.assertIsNotNone(testGrn.range) + self.assertIsNotNone(testGrn.damage) + self.assertIsNotNone(testGrn.heading) + self.assertIsNotNone(testGrn.speed) + self.assertIsNotNone(testGrn.coordinates) + self.assertIsNotNone(testGrn.hitbox) + self.assertIsNotNone(testGrn.collidable) + + self.assertIsNone(self.grnObj.range) + self.assertIsNone(self.grnObj.damage) + self.assertIsNone(self.grnObj.heading) + self.assertIsNone(self.grnObj.speed) + self.assertIsNone(self.grnObj.coordinates) + self.assertIsNone(self.grnObj.hitbox) + self.assertIsNone(self.grnObj.collidable) + +if __name__ == '__main__': + unittest.main \ No newline at end of file diff --git a/game/test_suite/tests/objects/test_initialization.py b/game/test_suite/tests/objects/test_initialization.py index d0e2522b..be38c117 100644 --- a/game/test_suite/tests/objects/test_initialization.py +++ b/game/test_suite/tests/objects/test_initialization.py @@ -6,9 +6,9 @@ import unittest from game.common.items.gun import Gun from game.common.items.item import Item -from game.common.moving.damaging_object import DamagingObject from game.common.moving.moving_object import MovingObject -from game.common.moving.damaging_object import DamagingObject +from game.common.moving.damaging.damaging_object import DamagingObject +from game.common.moving.damaging.grenade import Grenade from game.common.moving.shooter import Shooter from game.common.action import Action from game.common.game_board import GameBoard @@ -22,9 +22,9 @@ class TestInit(unittest.TestCase): # Your test class is a subclass of unittest.Testcase, this is important def setUp(self): # This method is used to set up anything you wish to test prior to every test method below. - breakpoint() self.gun = Gun() self.item = Item() + self.grnObj = Grenade() self.damaging = DamagingObject() self.movObj = MovingObject(10, 10) self.shooter = Shooter() @@ -37,6 +37,7 @@ def setUp(self): # This method is used to set up anything you wish to test prio self.assertEqual(self.gun.object_type, ObjectType.gun) self.assertEqual(self.item.object_type, ObjectType.item) + self.assertEqual(self.grnObj.object_type, ObjectType.grenade) self.assertEqual(self.damaging.object_type, ObjectType.damaging_object) self.assertEqual(self.movObj.object_type, ObjectType.moving_object) self.assertEqual(self.shooter.object_type, ObjectType.shooter)