From 406027b8535664ea4031e626115f7f90b7f45e9e Mon Sep 17 00:00:00 2001 From: MajorDzaster Date: Fri, 8 Sep 2023 13:21:33 +1000 Subject: [PATCH 1/2] Averts divide by zero edge case if a tower's firerate is reduced to 0 shots per second. --- .../game/components/tasks/TowerCombatTask.java | 6 +++++- .../tower/TowerUpgraderComponentTest.java | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/source/core/src/main/com/csse3200/game/components/tasks/TowerCombatTask.java b/source/core/src/main/com/csse3200/game/components/tasks/TowerCombatTask.java index b426f70ae..74614dc98 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/TowerCombatTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/TowerCombatTask.java @@ -203,7 +203,11 @@ private boolean isTargetVisible() { private void changeFireRateInterval(int perMinute) { float oldFireSpeed = 1/fireRateInterval; float newFireSpeed = oldFireSpeed + perMinute/60f; - fireRateInterval = 1/newFireSpeed; + if (newFireSpeed == 0) { + fireRateInterval = 0; + } else { + fireRateInterval = 1 / newFireSpeed; + } } /** diff --git a/source/core/src/test/com/csse3200/game/components/tower/TowerUpgraderComponentTest.java b/source/core/src/test/com/csse3200/game/components/tower/TowerUpgraderComponentTest.java index f9ab79901..2533eb7e1 100644 --- a/source/core/src/test/com/csse3200/game/components/tower/TowerUpgraderComponentTest.java +++ b/source/core/src/test/com/csse3200/game/components/tower/TowerUpgraderComponentTest.java @@ -62,4 +62,20 @@ void increaseFireRate() { verify(towerUpgraderComponent).upgradeTower(TowerUpgraderComponent.UPGRADE.FIRERATE, 60); assertEquals(0.5, towerCombatTask.getFireRateInterval()); } + + @Test + void divideByZeroDefaultToZero() { + entity.addComponent(towerUpgraderComponent); + AITaskComponent aiTaskComponent = new AITaskComponent(); + ServiceLocator.registerPhysicsService(mock(PhysicsService.class)); + ServiceLocator.registerTimeSource(mock(GameTime.class)); + TowerCombatTask towerCombatTask = new TowerCombatTask(10, 10, 1); + aiTaskComponent.addTask(towerCombatTask); + entity.addComponent(aiTaskComponent); + towerCombatTask.start(); + entity.create(); + entity.getEvents().trigger("upgradeTower", TowerUpgraderComponent.UPGRADE.FIRERATE, -60); + verify(towerUpgraderComponent).upgradeTower(TowerUpgraderComponent.UPGRADE.FIRERATE, -60); + assertEquals(0., towerCombatTask.getFireRateInterval()); + } } From bd6a871a625328495f9240df07d3aa48a6036bf4 Mon Sep 17 00:00:00 2001 From: MajorDzaster Date: Fri, 8 Sep 2023 13:37:24 +1000 Subject: [PATCH 2/2] TowerUpgraderComponent is a component of all tower entities, rather than just weapon towers. --- .../com/csse3200/game/entities/factories/TowerFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/entities/factories/TowerFactory.java b/source/core/src/main/com/csse3200/game/entities/factories/TowerFactory.java index 366b0c0f1..f2ce8f2e9 100644 --- a/source/core/src/main/com/csse3200/game/entities/factories/TowerFactory.java +++ b/source/core/src/main/com/csse3200/game/entities/factories/TowerFactory.java @@ -117,8 +117,7 @@ public static Entity createWeaponTower() { .addComponent(new CostComponent(config.cost)) .addComponent(aiTaskComponent) .addComponent(animator) - .addComponent(new TowerAnimationController()) - .addComponent(new TowerUpgraderComponent()); + .addComponent(new TowerAnimationController()); return weapon; @@ -132,7 +131,8 @@ public static Entity createBaseTower() { Entity tower = new Entity() .addComponent(new ColliderComponent()) .addComponent(new HitboxComponent().setLayer(PhysicsLayer.OBSTACLE)) // TODO: we might have to change the names of the layers - .addComponent(new PhysicsComponent().setBodyType(BodyType.StaticBody)); + .addComponent(new PhysicsComponent().setBodyType(BodyType.StaticBody)) + .addComponent(new TowerUpgraderComponent()); return tower; }