From 4daece4178907289685c56fea63c94c80cbca473 Mon Sep 17 00:00:00 2001 From: Thivan W Date: Sat, 9 Sep 2023 22:13:22 +1000 Subject: [PATCH] Ranged attacks are only made when there is a tower ahead --- .../tasks/RangeBossMovementTask.java | 21 ++++++++++++++----- .../tasks/RangeBossMovementTaskTest.java | 6 +++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/components/tasks/RangeBossMovementTask.java b/source/core/src/main/com/csse3200/game/components/tasks/RangeBossMovementTask.java index 87f51b1a3..b90b26e0e 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/RangeBossMovementTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/RangeBossMovementTask.java @@ -6,6 +6,8 @@ import com.csse3200.game.ai.tasks.Task; import com.csse3200.game.entities.Entity; import com.csse3200.game.entities.factories.ProjectileFactory; +import com.csse3200.game.physics.PhysicsEngine; +import com.csse3200.game.physics.raycast.RaycastHit; import com.csse3200.game.services.ServiceLocator; import com.csse3200.game.physics.PhysicsLayer; import org.slf4j.Logger; @@ -23,6 +25,9 @@ public class RangeBossMovementTask extends DefaultTask implements PriorityTask { private MovementTask movementTask; private WaitTask waitTask; private Task currentTask; + private PhysicsEngine physics; + private static final short TARGET = PhysicsLayer.TOWER; + private final RaycastHit hit = new RaycastHit(); /** * @param waitTime How long in seconds to wait between wandering. @@ -30,6 +35,7 @@ public class RangeBossMovementTask extends DefaultTask implements PriorityTask { public RangeBossMovementTask(float waitTime) { this.waitTime = waitTime; + physics = ServiceLocator.getPhysicsService().getPhysics(); } @Override @@ -58,11 +64,12 @@ public void start() { public void update() { if (currentTask.getStatus() != Status.ACTIVE) { if (currentTask == movementTask) { - Entity newProjectile = ProjectileFactory.createFireBall(PhysicsLayer.OBSTACLE, new Vector2(0, currentPos.y + 0.75f), new Vector2(2f,2f)); - - newProjectile.scaleHeight(-0.4f); - newProjectile.setPosition((float) (currentPos.x), (float) (currentPos.y+0.75f)); - ServiceLocator.getEntityService().register(newProjectile); + if (towerAhead()) { + Entity newProjectile = ProjectileFactory.createFireBall(TARGET, new Vector2(0, currentPos.y + 0.75f), new Vector2(2f,2f)); + newProjectile.scaleHeight(-0.4f); + newProjectile.setPosition((float) (currentPos.x), (float) (currentPos.y+0.75f)); + ServiceLocator.getEntityService().register(newProjectile); + } startWaiting(); } else { startMoving(); @@ -90,4 +97,8 @@ private void swapTask(Task newTask) { currentTask.start(); } + private boolean towerAhead() { + return physics.raycast(currentPos, new Vector2(0, currentPos.y), TARGET, hit); + } + } diff --git a/source/core/src/test/com/csse3200/game/components/tasks/RangeBossMovementTaskTest.java b/source/core/src/test/com/csse3200/game/components/tasks/RangeBossMovementTaskTest.java index 3c06051e0..1e0de6f48 100644 --- a/source/core/src/test/com/csse3200/game/components/tasks/RangeBossMovementTaskTest.java +++ b/source/core/src/test/com/csse3200/game/components/tasks/RangeBossMovementTaskTest.java @@ -7,6 +7,7 @@ import com.csse3200.game.entities.Entity; import com.csse3200.game.events.listeners.EventListener0; import com.csse3200.game.extensions.GameExtension; +import com.csse3200.game.physics.PhysicsService; import com.csse3200.game.utils.math.Vector2Utils; import com.csse3200.game.physics.components.PhysicsMovementComponent; import com.csse3200.game.services.GameTime; @@ -26,6 +27,7 @@ class RangeBossMovementTaskTest { @BeforeEach void beforeEach() { ServiceLocator.registerTimeSource(gameTime); + ServiceLocator.registerPhysicsService(new PhysicsService()); } @Test @@ -33,7 +35,9 @@ void shouldTriggerEvent() { RangeBossMovementTask RBMTask = new RangeBossMovementTask(1f); AITaskComponent aiTaskComponent = new AITaskComponent().addTask(RBMTask); - Entity entity = new Entity().addComponent(aiTaskComponent).addComponent(new PhysicsMovementComponent()); + Entity entity = new Entity() + .addComponent(aiTaskComponent) + .addComponent(new PhysicsMovementComponent()); entity.create(); // Register callbacks