From 46a3c0a662dc9059f9f37d6ab4f777150efde50f Mon Sep 17 00:00:00 2001 From: Nawal Date: Sun, 10 Sep 2023 17:07:17 +1000 Subject: [PATCH 01/16] Added the currency pop up to the currency task, and changed it to appear above the entity --- .../csse3200/game/areas/ForestGameArea.java | 5 ++-- .../components/gamearea/CurrencyDisplay.java | 24 +++++++++++++++---- .../game/components/tasks/CurrencyTask.java | 5 ++++ .../game/entities/factories/TowerFactory.java | 6 ++--- .../game/input/DropInputComponent.java | 5 +++- .../csse3200/game/screens/MainGameScreen.java | 2 ++ 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index 422057ab1..c53e75268 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -162,7 +162,8 @@ public void create() { // Types of projectile spawnEffectProjectile(new Vector2(0, 10), PhysicsLayer.HUMANS, towardsMobs, new Vector2(2f, 2f), ProjectileEffects.BURN, true); spawnXenoGrunts(); - + spawnScrap(); + spawnIncome(); spawnGhosts(); spawnWeaponTower(); spawnEngineer(); @@ -496,7 +497,7 @@ private void spawnIncome() { GridPoint2 minPos = new GridPoint2(0, 0); GridPoint2 maxPos = terrain.getMapBounds(0).sub(2, 2); - for (int i = 0; i < 50; i++) { + for (int i = 0; i < 2; i++) { GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); Entity towerfactory = TowerFactory.createIncomeTower(); spawnEntityAt(towerfactory, randomPos, true, true); diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java index 178cd11ff..cfe5080ab 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java @@ -1,11 +1,13 @@ package com.csse3200.game.components.gamearea; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; @@ -15,6 +17,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Align; +import com.csse3200.game.entities.Entity; import com.csse3200.game.services.ServiceLocator; import com.csse3200.game.ui.UIComponent; import com.badlogic.gdx.scenes.scene2d.actions.Actions; @@ -24,6 +27,7 @@ */ public class CurrencyDisplay extends UIComponent { Table table; + private Camera camera; private TextButton scrapsTb; private TextButton crystalsTb; @@ -108,19 +112,29 @@ public void updateCrystalsStats() { * A label that appears once currency is gained, to give the player visual feedback * @param x Screen x coordinate * @param y Screen y coordinate - * @param amount value to display on the pop up + * @param amount value to display on the pop-up + * @param offset value to offset the height of the label by */ - public void currencyPopUp(float x , float y, int amount) { + public void currencyPopUp(float x , float y, int amount, int offset) { Label label = new Label(String.format("+%d", amount), skin); // remove label after it fades out label.addAction(new SequenceAction(Actions.fadeOut(1.5f), Actions.removeActor())); - Vector3 worldCoordinates = new Vector3(x , y, 0); - stage.getViewport().unproject(worldCoordinates); - label.setPosition(worldCoordinates.x, worldCoordinates.y); + // get stage coordinates from entity coordinates + Vector3 entityCoordinates = new Vector3(x, y, 0); + Vector3 entityScreenCoordinate = this.camera.project(entityCoordinates); + Vector2 stageCoordinates = stage.screenToStageCoordinates( + new Vector2(entityScreenCoordinate.x, entityScreenCoordinate.y)); + stage.getViewport().unproject(stageCoordinates); + + label.setPosition(stageCoordinates.x - label.getWidth()/2, stageCoordinates.y + offset); stage.addActor(label); } + public void setCamera(Camera camera) { + this.camera = camera; + } + @Override public void dispose() { super.dispose(); diff --git a/source/core/src/main/com/csse3200/game/components/tasks/CurrencyTask.java b/source/core/src/main/com/csse3200/game/components/tasks/CurrencyTask.java index 8e4b7581a..f2c8ede84 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/CurrencyTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/CurrencyTask.java @@ -1,5 +1,6 @@ package com.csse3200.game.components.tasks; +import com.badlogic.gdx.math.Vector2; import com.csse3200.game.ai.tasks.DefaultTask; import com.csse3200.game.ai.tasks.PriorityTask; import com.csse3200.game.currency.Scrap; @@ -65,6 +66,10 @@ public void update() { public void updateCurrency() { //logger.info("Updating currency"); ServiceLocator.getCurrencyService().getScrap().modify(currencyAmount/2); + + Vector2 coordinates = this.owner.getEntity().getCenterPosition(); + ServiceLocator.getCurrencyService().getDisplay().currencyPopUp(coordinates.x, coordinates.y, currencyAmount/2, 25); + ServiceLocator.getCurrencyService().getDisplay().updateScrapsStats(); // update currency display } 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 fa71f10b5..8b051c490 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 @@ -97,9 +97,9 @@ public static Entity createIncomeTower() { income .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) .addComponent(new CostComponent(config.cost)) - .addComponent(new TextureRenderComponent(RESOURCE_TOWER)) - .addComponent(aiTaskComponent); - + .addComponent(aiTaskComponent) + .addComponent(animator) + .addComponent(new EconTowerAnimationController()); return income; } diff --git a/source/core/src/main/com/csse3200/game/input/DropInputComponent.java b/source/core/src/main/com/csse3200/game/input/DropInputComponent.java index 92325b727..b923585e3 100644 --- a/source/core/src/main/com/csse3200/game/input/DropInputComponent.java +++ b/source/core/src/main/com/csse3200/game/input/DropInputComponent.java @@ -80,10 +80,13 @@ public boolean touchDown(int screenX, int screenY, int pointer, int button) { ServiceLocator.getCurrencyService().getDisplay().updateCrystalsStats(); } + float X = clickedEntity.getCenterPosition().x; + float Y = clickedEntity.getCenterPosition().y; + // remove the entity from the game EntityService.removeEntity(clickedEntity); // display a visual indication that currency has been picked up - ServiceLocator.getCurrencyService().getDisplay().currencyPopUp(screenX, screenY, value); + ServiceLocator.getCurrencyService().getDisplay().currencyPopUp(X, Y, value, 10); //logger.info("Scrap amount: " + ServiceLocator.getCurrencyService().getScrap().getAmount()); return true; diff --git a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java index cebd5352c..c0f682b60 100644 --- a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java @@ -107,6 +107,8 @@ public MainGameScreen(GdxGame game) { InputComponent inputHandler = new DropInputComponent(renderer.getCamera().getCamera()); ServiceLocator.getInputService().register(inputHandler); + ServiceLocator.getCurrencyService().getDisplay().setCamera(renderer.getCamera().getCamera()); + loadAssets(); createUI(); From 45f0d0565c9ea61440f9607d0cb5e82a0eaea01a Mon Sep 17 00:00:00 2001 From: Nawal Date: Sun, 10 Sep 2023 20:42:08 +1000 Subject: [PATCH 02/16] Created the GameEndService, added it to the Service Locator and initialised it in the Main game --- .../csse3200/game/screens/MainGameScreen.java | 6 ++--- .../game/services/GameEndService.java | 22 +++++++++++++++++++ .../game/services/ServiceLocator.java | 11 ++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 source/core/src/main/com/csse3200/game/services/GameEndService.java diff --git a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java index cebd5352c..64a323050 100644 --- a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java @@ -32,10 +32,7 @@ import com.csse3200.game.physics.PhysicsService; import com.csse3200.game.rendering.RenderService; import com.csse3200.game.rendering.Renderer; -import com.csse3200.game.services.CurrencyService; -import com.csse3200.game.services.GameTime; -import com.csse3200.game.services.ResourceService; -import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.services.*; import com.csse3200.game.ui.terminal.Terminal; import com.csse3200.game.ui.terminal.TerminalDisplay; import com.csse3200.game.components.maingame.MainGameExitDisplay; @@ -100,6 +97,7 @@ public MainGameScreen(GdxGame game) { ServiceLocator.registerEntityService(new EntityService()); ServiceLocator.registerRenderService(new RenderService()); + ServiceLocator.registerGameEndService(new GameEndService()); renderer = RenderFactory.createRenderer(); renderer.getCamera().getEntity().setPosition(CAMERA_POSITION); diff --git a/source/core/src/main/com/csse3200/game/services/GameEndService.java b/source/core/src/main/com/csse3200/game/services/GameEndService.java new file mode 100644 index 000000000..1790dc586 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -0,0 +1,22 @@ +package com.csse3200.game.services; + +public class GameEndService { + + private int engineerCount; + + public GameEndService() { + this.engineerCount = 5; + } + + public int getEngineerCount() { + return engineerCount; + } + + public void updateEngineerCount() { + engineerCount -= 1; + if (engineerCount == 0) { + // loss screen + + } + } +} diff --git a/source/core/src/main/com/csse3200/game/services/ServiceLocator.java b/source/core/src/main/com/csse3200/game/services/ServiceLocator.java index 5bbe956cc..5683715e4 100644 --- a/source/core/src/main/com/csse3200/game/services/ServiceLocator.java +++ b/source/core/src/main/com/csse3200/game/services/ServiceLocator.java @@ -24,6 +24,7 @@ public class ServiceLocator { private static GameTime timeSource; private static InputService inputService; private static ResourceService resourceService; + private static GameEndService gameEndService; public static CurrencyService getCurrencyService() { return currencyService; @@ -53,6 +54,10 @@ public static ResourceService getResourceService() { return resourceService; } + public static GameEndService getGameEndService() { + return gameEndService; + } + public static void registerCurrencyService(CurrencyService service) { logger.debug("Registering currency service {}", service); currencyService = service; @@ -88,6 +93,11 @@ public static void registerResourceService(ResourceService source) { resourceService = source; } + public static void registerGameEndService(GameEndService source) { + logger.debug("Registering game end service service {}", source); + gameEndService = source; + } + public static void clear() { entityService = null; renderService = null; @@ -95,6 +105,7 @@ public static void clear() { timeSource = null; inputService = null; resourceService = null; + gameEndService = null; } private ServiceLocator() { From eb6e284c8d373b1cb0e73c44c42a7a768f2a3df8 Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Sun, 10 Sep 2023 21:02:51 +1000 Subject: [PATCH 03/16] HumanWanderTask updates GameEndService --- .../tasks/human/HumanWanderTask.java | 3 +- .../EngineerFactory Sequence Diagram.png | Bin 36123 -> 0 bytes .../EngineerFactory Sequence Diagram.svg | 210 ------------------ 3 files changed, 2 insertions(+), 211 deletions(-) delete mode 100644 source/wiki/team-2/EngineerFactory Sequence Diagram.png delete mode 100644 source/wiki/team-2/EngineerFactory Sequence Diagram.svg diff --git a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java index b801379ca..0b66a9493 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java @@ -9,6 +9,7 @@ import com.csse3200.game.physics.components.ColliderComponent; import com.csse3200.game.physics.components.HitboxComponent; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.ServiceLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -94,7 +95,7 @@ public void update() { // Check if engineer has finished dying animation else if (isDead && owner.getEntity().getComponent(AnimationRenderComponent.class).isFinished()) { owner.getEntity().setFlagForDelete(true); - // TODO: make the appropriate calls to decrement the human count. + ServiceLocator.getGameEndService().updateEngineerCount(); } // otherwise doing engineer things since engineer is alive diff --git a/source/wiki/team-2/EngineerFactory Sequence Diagram.png b/source/wiki/team-2/EngineerFactory Sequence Diagram.png deleted file mode 100644 index b8ec04420f3d050b3a951522ce3cbc6b0c50dee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36123 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 - - From bdc57f9ef61a9677266cc7dcdebfc4ce739a1e68 Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:16:04 +1000 Subject: [PATCH 04/16] diagrams for documentation added --- ...FactoryGapScannerFactorySequenceDiagram.png} | Bin ...erFactory UML.png => EngineerFactoryUML.png} | Bin .../team-2/GameEndServiceSequenceDiagram.png | Bin 0 -> 17181 bytes source/wiki/team-2/GameEndServiceUML.png | Bin 0 -> 18980 bytes source/wiki/team-2/GapScannerFactory UML.png | Bin 0 -> 42668 bytes ...m.png => HumanWanderTaskSequenceDiagram.png} | Bin 6 files changed, 0 insertions(+), 0 deletions(-) rename source/wiki/team-2/{EngineerFactory and GapScannerFactory Sequence Diagram.png => EngineerFactoryGapScannerFactorySequenceDiagram.png} (100%) rename source/wiki/team-2/{EngineerFactory UML.png => EngineerFactoryUML.png} (100%) create mode 100644 source/wiki/team-2/GameEndServiceSequenceDiagram.png create mode 100644 source/wiki/team-2/GameEndServiceUML.png create mode 100644 source/wiki/team-2/GapScannerFactory UML.png rename source/wiki/team-2/{HumanWanderTask Sequence Diagram.png => HumanWanderTaskSequenceDiagram.png} (100%) diff --git a/source/wiki/team-2/EngineerFactory and GapScannerFactory Sequence Diagram.png b/source/wiki/team-2/EngineerFactoryGapScannerFactorySequenceDiagram.png similarity index 100% rename from source/wiki/team-2/EngineerFactory and GapScannerFactory Sequence Diagram.png rename to source/wiki/team-2/EngineerFactoryGapScannerFactorySequenceDiagram.png diff --git a/source/wiki/team-2/EngineerFactory UML.png b/source/wiki/team-2/EngineerFactoryUML.png similarity index 100% rename from source/wiki/team-2/EngineerFactory UML.png rename to source/wiki/team-2/EngineerFactoryUML.png diff --git a/source/wiki/team-2/GameEndServiceSequenceDiagram.png b/source/wiki/team-2/GameEndServiceSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..55ca66c2eb83ed8e64c6c7b73f6e8f319ae14668 GIT binary patch literal 17181 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 literal 0 HcmV?d00001 diff --git a/source/wiki/team-2/GapScannerFactory UML.png b/source/wiki/team-2/GapScannerFactory UML.png new file mode 100644 index 0000000000000000000000000000000000000000..9230a3e5aec188cc9609fcb487b5f17cd802442d GIT binary patch literal 42668 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 literal 0 HcmV?d00001 diff --git a/source/wiki/team-2/HumanWanderTask Sequence Diagram.png b/source/wiki/team-2/HumanWanderTaskSequenceDiagram.png similarity index 100% rename from source/wiki/team-2/HumanWanderTask Sequence Diagram.png rename to source/wiki/team-2/HumanWanderTaskSequenceDiagram.png From d06551b008e4767da97d8f5e264001b341126b2c Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:31:27 +1000 Subject: [PATCH 05/16] JUnit test for GameEndService --- .../game/services/GameEndService.java | 8 +++- .../game/services/GameEndServiceTest.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java diff --git a/source/core/src/main/com/csse3200/game/services/GameEndService.java b/source/core/src/main/com/csse3200/game/services/GameEndService.java index 1790dc586..fe1ca5337 100644 --- a/source/core/src/main/com/csse3200/game/services/GameEndService.java +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -4,6 +4,8 @@ public class GameEndService { private int engineerCount; + private boolean gameOver = false; + public GameEndService() { this.engineerCount = 5; } @@ -16,7 +18,11 @@ public void updateEngineerCount() { engineerCount -= 1; if (engineerCount == 0) { // loss screen - + gameOver = true; } } + + public boolean hasGameEnded() { + return gameOver; + } } diff --git a/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java new file mode 100644 index 000000000..f2a31f213 --- /dev/null +++ b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java @@ -0,0 +1,40 @@ +package com.csse3200.game.services; + +import com.csse3200.game.extensions.GameExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ExtendWith(GameExtension.class) +class GameEndServiceTest { + + GameEndService endService; + + @BeforeEach + void setUp() { + endService = new GameEndService(); + ServiceLocator.registerGameEndService(endService); + } + + @Test + void shouldReturnCount() { + assertEquals(5, ServiceLocator.getGameEndService().getEngineerCount()); + } + + @Test + void shouldDecrementCount() { + ServiceLocator.getGameEndService().updateEngineerCount(); + assertEquals(4, ServiceLocator.getGameEndService().getEngineerCount()); + } + + @Test + void shouldEndGame() { + for (int i = 0; i < 5; i++) { + ServiceLocator.getGameEndService().updateEngineerCount(); + } + assertTrue(ServiceLocator.getGameEndService().hasGameEnded()); + } +} From 4bb07f4400e4728fe3c1ae5b9c1c53c5eb011baf Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:40:31 +1000 Subject: [PATCH 06/16] removed unused gameTracking function and associated variable --- .../csse3200/game/areas/ForestGameArea.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index b1171d5b7..b67e8de44 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -31,9 +31,6 @@ /** Forest area for the demo game with trees, a player, and some enemies. */ public class ForestGameArea extends GameArea { private static final Logger logger = LoggerFactory.getLogger(ForestGameArea.class); - - // Counts the number of humans left, if this reaches zero, game over. - private int endStateCounter = 2; private static final int NUM_BUILDINGS = 4; private static final int NUM_WALLS = 7; @@ -619,23 +616,4 @@ private void spawnGapScanners() { spawnEntityAt(scanner, new GridPoint2(0, i), true, true); } } - -// private void gameTrackerStart() { -// Entity endGameTracker = new Entity(); -// -// endGameTracker -// .addComponent(new CombatStatsComponent(2, 0)) -// .addComponent(new PlayerStatsDisplay()); -//// .getEvents().addListener("engineerKilled" , this::decrementCounter); -// endGameTracker.create(); -// } -// -// private void decrementCounter() { -// this.endStateCounter -= 1; -// logger.info("Engineer killed"); -// if (endStateCounter <= 0) { -// // we've reached the end, game over -// this.dispose(); -// } -// } } \ No newline at end of file From 4a95dfe4d30f45d073dfe4beebcd2ec04904cc05 Mon Sep 17 00:00:00 2001 From: SonjaMcNeilly Date: Sun, 10 Sep 2023 23:36:05 +1000 Subject: [PATCH 07/16] Added lose button and implemented lose screen Implemented LosingScreen class and a lose button on MainGameScreen for demonstration purposes until lose game state is implemented --- ...d-loop-black-and-white-aesthetic-space.jpg | Bin 0 -> 22836 bytes .../assets/images/lose-screen/lose-bg.jpg | Bin 0 -> 22836 bytes .../src/main/com/csse3200/game/GdxGame.java | 5 +- .../components/maingame/MainGameActions.java | 5 + .../maingame/MainGameLoseDisplay.java | 64 ++++++++++ .../csse3200/game/screens/LosingScreen.java | 109 ++++++++++++++++++ .../csse3200/game/screens/MainGameScreen.java | 5 +- 7 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 source/core/assets/images/lose-screen/desktop-wallpaper-simple-stars-video-background-loop-black-and-white-aesthetic-space.jpg create mode 100644 source/core/assets/images/lose-screen/lose-bg.jpg create mode 100644 source/core/src/main/com/csse3200/game/components/maingame/MainGameLoseDisplay.java create mode 100644 source/core/src/main/com/csse3200/game/screens/LosingScreen.java diff --git a/source/core/assets/images/lose-screen/desktop-wallpaper-simple-stars-video-background-loop-black-and-white-aesthetic-space.jpg b/source/core/assets/images/lose-screen/desktop-wallpaper-simple-stars-video-background-loop-black-and-white-aesthetic-space.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52ca411152c83c4714fb7bd4b4d3f2fe2eaa2911 GIT binary patch literal 22836 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

W94J?#u>T;JxS&|&WjhA9A@k7bDK@h^i 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 l02C1c00000000000000000026|Jncu0RsU6KLARP|Je#!y>kEn literal 0 HcmV?d00001 diff --git a/source/core/assets/images/lose-screen/lose-bg.jpg b/source/core/assets/images/lose-screen/lose-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52ca411152c83c4714fb7bd4b4d3f2fe2eaa2911 GIT binary patch literal 22836 zcmeFYWmp{1vNqZ?xCM82cMa|Vf|KCx?(XhRLU0Kl1}DJ=hXBDHf$NvTPRUq0LnG&Bs{LY(ZJLb76Fvf3KjuCAG& z|F;I7`v7cY&^nwZ9EchKV}szZLC*sK*^8V1YQVo52n+|0fQW?r{1ZU_#~5A)0I&*% zf-LH&*eGQNDN^_Vq?x-`-^)}id=ZzXh5;RCJp`AW9H{ueCjlJ(6L#TAt(ADHRviXQmjN^$Yr! zcfvMQ!X9PApbgR5dcbo}_(IYy)pO5h2Nl*IIHYP0%WA3+!H1CWUIzO0LIv};b>aM? zLIF^@OgDp1)T7O=2O45i-J2XcgmK!EjnO`wPL3`tir;=1uun6mHdJU{V=jR4Do6nk z-cx;`Na6Aie5w=hNpZ=|wjD8FU2>o;$67QzM>2M;*#=%g6K2yaD!7z@lRTQDx!SyQ zaz94W)xC7P%{JE`j|4z$7D zxVqqbC}<yvii(C^29oR{ zL+0svpLAvwBeSeu@ChG9a@O+wOCffy z@Qrj2!-{W1gk*z06If`=?e%xpGbOq59hCq1{VjRtGr&vbLULb-ikeA)hGZ;Rbt$U5 zF@4vj2L<;ao^sUJSgWYHB&NvwdH&M1S89XxT76uJCp8sT?ysZrg6+&DiBZ_CbZ5{i zBv}G{!+KT1il0<{x(j_hCrsX?q`I603WSf>u|{$UN&vl*ERa-i`u`VIP@CvY@Cdrjv; z0rp{|ZIWRJ>XnKQx&T{O3jarhx8z)ztE-t5g}gx?KfLmKt3wy0)cMnUsv!BVqf~GA z2#hXtkAL)e*yn<#5Mg&2Jnm%Fb6mmd6iji6U z=;^AX(!HnTO$CIH+yg{4|BR$w-aW-kF2K$9mwuP-{bp5A$5I67LGo`&du^(dHZWbH zJY>4jFm}2a&@4faf;zsJ7=z+dw zIt&GWkz3ORBR`g)gbN9sv)~YB;A8-RGlCwA87m!6?EQr%IbhE&Zt4bge;hq}`2H$y z+=Wu-7vX$ho1o!f{_Vtr_1NXm{HfnnI;^l{!h0JZ&d6;X0t3X1ZPdP=xuveZN)Eam zWkI~ausj@dK@&NnZ)0(`bf|+{-T^^s?{aeY$Xmnz-kq-f0^sx+{7fG(Wgg32bQ zPs&Th`di35J^EVYl=b*lw6Di=Uu%BXc=eQ`o6T_gGT8TU0FFv6FAV{F~)gPw(6 zJ=(!mD*r6$L~AA*$6fr5pC5SKvaQG|6hKJs*o<*Dx|M7&WkYNv85U28K~fFsg6#`t zHmrQWxZJ9RD%4*Fh&xa0ag=(v;8?EC8Gei&VU7~AoP zx$i*&+cSP}7tHqgeQpES4eoK_Ip(gp2o)pqSV@X8y4#THzYZ3V^2#Fb4tY2c{Lo<9 zRmf))@MLESf}NsaSeKVybO|qDY{H-T{hBMN<6)~us;-N|@P9CB6BBJI(0>{19!}2i zf)OV}V?8LySb9iVF3hZ=WhjACYc~wCTvxoajZczMA*gDKhH`ex%9|%JQV9t5l5(kt5ool_yqXY9fDq{FE*RJG-T2BJK0Fk6%qB~cK4SK7 z9uHjJ?M641%e7P>t=)-|Oq8y-8JYJGkhiI9F1#hbNKAf&W(!|LXdIoBjtQU74>?n< z4!AjzO8SJ1OiUujN z`=o0AD3M#Rno8JRI6s;65h@{f`uYoKmi%GUL?`vdTufa>L^s-{ke~k!zhEfPLgjt9 z=g&VHO8}~#jV^Uq-V(N`;N^q$)c+OdaA13fR+Te1qIv&-vmm)}2fQO0ZXW{$xP=#a z?n5pIymu7*{X8&ak&K@dg4A-;+Tz(9#BLE*3ND2GAAIXcPK4M1G>_RV;3d~EwtGOc z`BCvPs#c-LHm@t12FWR4d>5f}l0avxn7A*-<~srafr_w#apu$%4YY9o6heRP`?bs5 zg?sij;4j2jGQs9E#D!p(^HLzpfn$bOtB&ox(8KH+bMW^@7qr=oa#s4okriSGgs4zm zSkL8M&M<)zhNbro6hSG%m+#WA#Ne0kx##6=gmG=4C7X#&vY4?gs9chCk*ac?pUQ<| z1IqxAn;Ps2N+hkje>@EQx zVEbw1?~bv3HNhb>y+2E>t}hhO@xalt4Yu!%BsO~9+v_AFrk>C#aPPVP#s|LPlOL#2Z6-F9P3M6tSGQ>0b!Vmo!@}o4C3qB0?{Dxc(*^Bg>~b%vN;Ckm zaq$ha*&=Tpy9a<|EM@+=C#Wu7*9aE+4rI}SC0-cu+M%35Y9&_K18#PRoGWZ4?r1AH zZHYx@N};=drr|3r=d2_FB68o^lqrhXCW|GNsl=)cSVtMuW275?qJ z(!a_7A^xAN{qu-_yZZlN1jO_o%70ye{{Q5}|8V+0RPDk@b7;AcZdET{r~TF z|MT#F8N~_x@4NqZ2}SbXb(k;l!~5UD2mCX9aQ{R2{{8&_U;h8%7kCL8I~D)}Bf!DI zgTZj1fBFCdV^ec+OR57nR9I4`G#X}ZaACMS(ynQm|9XT2Nx*d@t-8|xrV40@7sS4? zH$(ZMeYlCEYa3m#n|+#_z}t6_ZtwCYp0~*t`Jo^@sp=WXC>Wu216|6Hj8w=Ga?4ll?X=O&9TrNuTjK`+|)hX7y3y}85mmQF^={vfLi}>gS&Aq4NwoIjbeN0Fva9J77izz znzAb+W_q@#rRj^e(U5*JsiJ7pM_WNZwJ6k;&7q@dW}nz>=*i0RDYNSKDxQ?Yd;^sP z^~dtgbs5)kL#KobeSv1Fn7`=J-#aFMN+K#~05QWj4?!Zbv^~wVF)j)s-MVgrP|%kB zt)zhft=U_Fk9ze7uoU>%B%DY1V!oE<)UQAhhJ*PkH3|$>;lyDDp0pe1@`ELswh%s} z%N^VfdwIm9jF1Ngdzi@ETFT zV$(n35x(Ffy(%_b?9BB=@8Ebg!(ixF5oRs#&G~32r0>9x0esOuuhpcde?dDpf^rcwP$&69kpn@B`(P~@N6j8WLZIo_4B4S1I7mmTKv;WG z#HcZ>KoCv)Pfw7S_o>Eb)VE}AhiE2ip*FG8kn+1DH1AF2fzrwz-BNMH%+QAPi?oN} z8khp#ugcP%7Fy!WXx>o&%cYtXePQbM%*fX=E{?7%gpW3%ft(di z7EFD=Q6Jo~gX9nEU25>xz&w}PqUD>d* zb&1eCwHhb3BtL2}b*y5#{`UpsboWo}%!jby0yBlW8}@v+6&Es=5<~0hW^h(r0X1875F(LGvc{HCwo=L_4B!E)`~v z^ax;1f<9UY zxVNGcY_;Xq(fC&6>0OH~^OdKy;C!kMz08hp#Eoe<4;#u9jqwQI1e^5o_k*R=Xpi;S zP~FN+B}DI|vjI>c3AMu*ry*6AO%^)nDSxQ5Gx zqcDofpyOUs#5u_jo4F9?ebvP_U4~v^C4H;H_u9=NTA)UK|R~%S|+Ek#>uOdzmt0s(0{u z-YE<1)L_fiQ@?uNAs|nm2JN!udweXW)UfxsoY#~WZR({~(&q;~N-xWULBEPGy>!TP z1U9DJDKJ-x?1+fM=mdBc6$%?H=n-~yRbGjd7uJWAGfgjC5`)my*jCh?)L1e7S%c6@Kni{(scP;@NT63UZU|CC#}KqXvPyi9EhgG!!9!AbxW^^V0ER4RFEXv+*?w$ zJr)*IWBUsop2{~JZto44y((|Arm=^^$x%xJsuY;TvTRpL&{N7kmS6N!Mg2*a;!eXu zk5LSl@D9EUX6eyRzn0Lawy_vNk0~jyyx>c}=CMUR$uYweJD>{9G5Uz<$)HrTV>a`d z`?Haa2#-CJI>Q+as?RW1%KDBTO@GAG)84#->%c89YTOVPF!(x5K(tB9S0z zD8raX6T!hWL0ce`zEGswH!I(riasX5{$Sxw=v|CFO%J4mqqENxwM5W1u)8he_MWNj zs&Q-l zn^2g8WIk>9$Y*g7`cqrF3U}wz5}}2X{fR8xC!)haSj>;}6hx@#-ryXS12f8YSiG6H zrVSmAA+7B@LPsG>5%$LJ(a}0K4)I6%^RozPD(EziP7wUKxceEZXT`q#z}h1yj6f2z zmjGbJ%Vl2jTSmRzOagJrzLUgK2yT8WKrCs8T^yRm7D6BmOSo@hDA|-Vi`ue4!()v| z#7*n7rx@wmC1*67v8iQUO4Ve_!4vdFd{5EDc^v8Nl@muTGo`m?KE)AZfh;UcA6F^0 z`kksaTUaoyM_aduW=DTq2@Z5Omx}tDRA}wnFpbQj%dvCQxJME$UD<&P2+LEU6K4`R zQlV~R$P=Mn0GSHhWZKRxjwD7U4G#1B(1l1K#1ch-5@rah0AV&Lh?nq-M0x42Iyc9q znypyM$Aut|YzygptVj7Cs}Gv-`zXDfCFxZ@3x6J;)JukB7Dy|!`hn*F>I$N@oowZ^ z)%4fU3&dCOM5NfO9rncQcpjXqq_$U%BV*ba}bM&D;h5I7&^bfpL% z`?_LbN4AGfTRQyBLQ)CXr5#xT@^3!}O1zY;uDprk>v0^*}UKIdpYyH>}885~U~wmgI&GyD;*ZpCkbo`14V=75G?+ z*aMOl*TYoEeihZ+A84q=w#A ziH4D8ZA8iRM_vV1Jz+XjSa|U%*u%E=Es8A1n`D3sZo;!!?htDlIh@g*Dvokog+}fv zB{^K#Y+o)gBj0k|Ho1kGigMFHy`JZgInUZUz`kbtiEf+c9^!5i4_$aU6e5FOg&3gzq_g_Fo{% zCkd!DciDLpTEYIh1r#bJ_SKJ+4ABH;kf>OiaP@m#!-I{0OU$QEa$o>v=4hY@Xrq%f zriS9wP)Xv+#_r-3TH3ake)t%7R!WyS50)WUJ;S9CD0OQ?&X}7Szv|6?2Jk~@RwSEf z@;|`zWL2PUFGYl*1aF{tS2eWhpb+1Cm8B1}v*nkjWKsq_&HIm|`|l(J&zTYGR+<%P z6oT@^-YtE*tRK0sdQ(9s3qn^ zD?L8B$k#jeyPz^O)#SlNvYsbI0(ENriI&gkgWY=hZazbNSJ$zsJ=q_1jJjTdq_|k? z52-THxzC7#M^vSu)@88;2d}9v<-MF%540jbj&|NDnHxHg$o`JS`ST-oB`5P{hFw@s zHmt?C8;D~}WQa7S-^4}z+t+(t3qw8^KyzHeQ}S{^Yv!__fj9J*uTmlECNKzXEZu*hLB6|w-`g^%75Qh zXTSM^zH!QEReaG9%|0)+l9`*f_n|&`Zaq`aHt92{kDOiQTAxA?j*IgmLG0FTKNJEy`#2#Rv)jY@e*3hp;$g~!w3EXuDr zag|V)>`4KKVP5R@37E21J5j}6QY)z1IxXsOfq8*IT2cI+3Y{ExvngTOfdB09f(`e6 zI8_JlU&y;sm9GkTX8rrx-f6-98!wPNTctz%4^i`XW(yL17>xc$j$^u6PLIdVpq`vh zs>EL26N(f_&;y^a$!^@jp21J_lo;|0)av+gN{TLjnA2{^)3_2Bh>wj6i&Q%s{>GCT zd&R^saL6PqToq^Fm@mAsFsFPfpl#4sfcgVkqY}Om*^Bkav~TW;RzQ+!%J_L&x}GME zR5-YjU!&KYNna{PNyC0=7XcH|jE3pt%66pi=D$3W@>(=)L6pxwu~-sDNk ziK|GaN(>1T48Dks!$ry;&KAHIj#KEb^8Y%ps>K}3jTQwmQltfrX9GO_G}33GF`-h6ZdGe1F+lr~K1B68ds`AviHY~qd| z-e`T5RJ-_Kt1B5ne!r!K1HqPeR$&|Z^5_!&lcM_4h&egMb3e>R7MT~t}ezasOe z0M=D72=d#bWOHTx`Y*9LQj1SdW@NfNMGKr~f@YQB3GLT?(p6-6rR>O0w3D3-6<)EQL5TM!Ay^$}0;THnlu+H=nzIu!53^^Ex4 zf2Hl*;=?qO832tMT0Ver@-n-`4rxq-&rmg%NjbH+DaVZ**MyJ#6O&`yyfwZ0sIdqB zu&#e1I1WpY`bs4>4Kr?zOk@k$%Y_BQ&{V2y0kmSj+ z8xQ0MWT7Fqbc}>6_n*U1bGz!+7|+Oue%`BVBMW|-`SA=eO&-(Vc!Gp6aR<;B>UD4=v(UPpd zGCy5I?&jnd>bHks824*VS>>DA7bP-0puhZ4Spwf1l*$a|7*vUtKuwJKeek)jSF1nS zyi2!Ybsmo!qeG|NOQnHSuM~Y6aGw40+T&q43D-i#F5dIKwUN~!K(~)?{a-(F>0{ertOR#HARV-BpdwUf)f7fwY~RvoausA zf~qYfsjMNmYfiUv|2=D$fW8q$)dI?E-%44I--(WiP8PLN$yL^lHfFein)DIms$sk( zud>2lEyTlc=DTiGn_^d*cvel@%WzBIl0rZpV8A7W;z-zO0n7e zbjhmPhWm|Q#Ide8d zFo08N121v5wYUn`iA|QT^?^W`zeRtO=b|~9$}e^uSLg*8^eL7`;o1yxysRY>htle7Lsqhv8ixv*OGS{Kn{df<$yuT&ZJ%D?U*)-RPeJENtmDzi9?@ zo^Q1M3rWaw!_~7^T|H}#T|#9j z&Z)V#cdElwea281LL~QzyKfQ!=nGb72?X<=k@SOmgCf|B2Fqwy7&}xIzuaKp9lcsS$Z1cs&>gJB!KTx!E zzc#cno_o{s#iIf3<4vjcB}s3=O+L*mKMD4FTDtDK>;^tEFDo;St-AF0ey8zoO5o$s z*QJ)PgUx0)_?$jkx%^n`HJiQ8mv|4xY)m59m!*7-h`l0^l%{1`EU60{65Y;p(QvUJ z^nzrTe12nH3PQWtF_U7iq}-$Sy_ygHMhNNAZImBS^z^~oO{&LHWY{YcmwE;~%Rn-S zBtL41yeIk`yC=A*GH&XV*IKZ(&-#PRM?-EaWv9BxCv1-3QJ#SaxCg$eAEB5*H^FX#dSu5OXzr08@Dca>!W*g|~J4NI-eBxn^CG!=sF z4XI9Iert|$X=C|gX;MXXoXp_#k|}@_g|?#^9qs9G3CkC5Al$-3boiz?La$oFMW^N7 zxSKjArTf=5mGcuIOB&IJE%ao5n(aY(WG11y8IavDkd%8kCWeD08{pRCA?jmi&`;%9 z)X?hA#W8%6L#7iszJbJpGFomdeRTF+^69(@^g6!Sekji4eX5%HcGiPvmEe$cUY2QI zT$yv7Wnyc#l7KP1shKbq8F=?Um2Jt~$H~Cd&*TZ*9|@TF7MHO%vhITd zztQ~>NGpJ;t`t4x5ZNC`Z8UdKyS>~Ju68-?DfhX6weGjM$ZWc)K!##50Taff(LWWf?!&x&GY^@|j^r<>13OMlJ2s+a}JDKj|mUMBg{d6|LC?E8hBU z(soYUEwJ;!_hb6g=x5;0kU9km$@OnGKGX1Bn1r|;c z<#^vHuBo(Esf_^hq*jmbJ(i-uVCi%TKJzrZK?%(E@e<>Cay@CT@z5XFw}gZ)c)GgKR-?M#ud} zjaS`6)*7guliUIRTCq>Pkqz;u6&CKHYO=OblOnu^2)`O-vQ5~Po;wP9#`f(r-}f`# zKKLc+wfmrR4CEb(s&`+iJLr3qLhtng;2R~x?9j|F3iYc|uxSjRft>ck??}Oy;pkSm zzD3!Wwzzz9`wIKMBGl)JTbyAR2JmW@=8>t~zHZ`=?`A=4E0m$QawmJ)ud)JWJnE~X ziBz(e(^aT)iQLt|IU_Rr;q#rQnc#H({F;^zds(~hqJM(MHYWOaxfc;WcNtD@VlTJF zeG^)Mli>ZqMMwBTRe;Bcru%lUmHsrxxNH8nA+mSj6vF%PS(Nr5*y-zM57F{NS(PR= zG=iA7yJv`jFf&;hm-W;fb z;is+omQh+YyUlXb6UhHU7`{Oh>}+AFYx(Ov&4^3mWE(C_*?C-BE^FLsS9XLl+KM-s z*}vRQK{e++@4lrpVLn8k;+sl3rDuGz!+F!tB3Ko3^@t6F9ijTBzM7=(zy@EKWiPUr zyQx-fy?Sab``A4CN=9g&I_A{E!5qzJJ&ld5=2!yQY1nLLDlJ)%IQ$CrCvJ8{Qc%#ygc)a((Z=sROFDQCOWB~ zYymUPZ7(lrHftcV@V#_KrFLk@o0`CQ_mcf~d*1T|O%Y^-*rEHf%)gNRpprGxE2Gc>hcibXBy1In( zj?y;t!S#4sU_FX&3@qwFQ)=+`S|wm6f5ito>w9)QxsytLI=YMIl$tTGx*4MG@p;P` z`K)bxKMv^-7CDdg{xzkn9yWO)0uBTH+XZ{uib!UJPuE+&Nz28~(2a8s#a!87$M4?K zvxOmiCFYE76=SUT3|-9_=LAI16Z9fx=DNw>nZY@GHT zok)|MY`GFmkS{Z>WqcrrgBjgDwo=JU?_dpE5&J?)F-CY4znoE1g#Y~{e$@1;jtUv- zFwHzXVRy<$grF7Kng^{K zPO{2w=G?RP?>sK(vNu>4i$~l`Q?AKX_)E+2+^t_Zw_*)GR*d^i)5xcHlpSR)Gi+

W94J?#u>T;JxS&|&WjhA9A@k7bDK@h^i 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 l02C1c00000000000000000026|Jncu0RsU6KLARP|Je#!y>kEn literal 0 HcmV?d00001 diff --git a/source/core/src/main/com/csse3200/game/GdxGame.java b/source/core/src/main/com/csse3200/game/GdxGame.java index 146fb71c7..42fdb3f7b 100644 --- a/source/core/src/main/com/csse3200/game/GdxGame.java +++ b/source/core/src/main/com/csse3200/game/GdxGame.java @@ -3,6 +3,7 @@ import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; +import com.csse3200.game.components.CombatStatsComponent; import com.csse3200.game.files.UserSettings; import com.csse3200.game.screens.*; import org.slf4j.Logger; @@ -74,13 +75,15 @@ private Screen newScreen(ScreenType screenType) { return new StoryScreen(this); case LEVEL_SELECT: return new LevelSelectScreen(this); + case LOSING_SCREEN: + return new LosingScreen(this); default: return null; } } public enum ScreenType { - MAIN_MENU, MAIN_GAME, SETTINGS, STORY_SCREEN, LEVEL_SELECT + MAIN_MENU, MAIN_GAME, SETTINGS, STORY_SCREEN, LEVEL_SELECT, LOSING_SCREEN } /** diff --git a/source/core/src/main/com/csse3200/game/components/maingame/MainGameActions.java b/source/core/src/main/com/csse3200/game/components/maingame/MainGameActions.java index cebeab67e..37dd07117 100644 --- a/source/core/src/main/com/csse3200/game/components/maingame/MainGameActions.java +++ b/source/core/src/main/com/csse3200/game/components/maingame/MainGameActions.java @@ -20,6 +20,7 @@ public MainGameActions(GdxGame game) { @Override public void create() { entity.getEvents().addListener("exit", this::onExit); + entity.getEvents().addListener("lose", this::onLose); } /** @@ -29,4 +30,8 @@ private void onExit() { logger.info("Exiting main game screen"); game.setScreen(GdxGame.ScreenType.MAIN_MENU); } + + private void onLose() { + game.setScreen(GdxGame.ScreenType.LOSING_SCREEN); + } } diff --git a/source/core/src/main/com/csse3200/game/components/maingame/MainGameLoseDisplay.java b/source/core/src/main/com/csse3200/game/components/maingame/MainGameLoseDisplay.java new file mode 100644 index 000000000..9828ee2a7 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/components/maingame/MainGameLoseDisplay.java @@ -0,0 +1,64 @@ +package com.csse3200.game.components.maingame; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.csse3200.game.ui.UIComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Displays a button to exit the Main Game screen to the Main Menu screen. + */ +public class MainGameLoseDisplay extends UIComponent { + private static final Logger logger = LoggerFactory.getLogger(MainGameExitDisplay.class); + private static final float Z_INDEX = 2f; + private Table table; + + @Override + public void create() { + super.create(); + addActors(); + } + + private void addActors() { + table = new Table(); + table.top().right(); + table.setFillParent(true); + + TextButton mainMenuBtn = new TextButton("Lose", skin); + + // Triggers an event when the button is pressed. + mainMenuBtn.addListener( + new ChangeListener() { + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + logger.debug("Quit button clicked"); + entity.getEvents().trigger("lose"); + } + }); + + table.add(mainMenuBtn).padTop(-100).padBottom(-500); + + stage.addActor(table); + } + + @Override + public void draw(SpriteBatch batch) { + // draw is handled by the stage + } + + @Override + public float getZIndex() { + return Z_INDEX; + } + + @Override + public void dispose() { + table.clear(); + super.dispose(); + } +} + diff --git a/source/core/src/main/com/csse3200/game/screens/LosingScreen.java b/source/core/src/main/com/csse3200/game/screens/LosingScreen.java new file mode 100644 index 000000000..354046edc --- /dev/null +++ b/source/core/src/main/com/csse3200/game/screens/LosingScreen.java @@ -0,0 +1,109 @@ +package com.csse3200.game.screens; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.viewport.ScreenViewport; +import com.csse3200.game.GdxGame; +import com.csse3200.game.screens.text.AnimatedText; +import com.csse3200.game.services.ServiceLocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LosingScreen extends ScreenAdapter { + private final GdxGame game; + private SpriteBatch batch; + private Texture introImage; + private Sprite introSprite; + + private static final String TEXTURE = "planets/background.png"; + private static final String INTRO_TEXT = """ + The aliens gained control. You lose! + """; + + private BitmapFont font; + private AnimatedText text; + private Stage stage; + private TextButton exitButton; + private TextButton mainMenuButton; + private TextButton playAgainButton; + + public LosingScreen(GdxGame game) { + this.game = game; + font = new BitmapFont(); + text = new AnimatedText(INTRO_TEXT, font, 0.05f); + font.getData().setScale(2, 2); + } + + @Override + public void show() { + batch = new SpriteBatch(); + introImage = new Texture(TEXTURE); + introSprite = new Sprite(introImage); + introSprite.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + + stage = new Stage(new ScreenViewport()); + Gdx.input.setInputProcessor(stage); + + Skin skin = new Skin(Gdx.files.internal("flat-earth/skin/flat-earth-ui.json")); + exitButton = new TextButton("Exit Game", skin); + exitButton.addListener(new ClickListener(){ + public void clicked(InputEvent even, float x, float y) { + game.exit(); + } + }); + mainMenuButton = new TextButton("Back to Main Menu", skin); + mainMenuButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + game.setScreen(GdxGame.ScreenType.MAIN_MENU); + } + + }); + + playAgainButton = new TextButton("Play Again", skin); + playAgainButton.addListener(new ClickListener() { + public void clicked(InputEvent even, float x, float y) { + game.setScreen(GdxGame.ScreenType.MAIN_GAME); + } + }); + + Table table = new Table(); + table.setFillParent(true); + table.add(exitButton).padTop(-100).row(); + table.add(mainMenuButton).padTop(-200).row(); + table.add(playAgainButton).padTop(-300).row(); + stage.addActor(table); + } + + @Override + public void render(float delta) { + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + batch.begin(); + introSprite.draw(batch); + text.update(); + text.draw(batch, 730, 800); // Adjust the position + batch.end(); + + stage.draw(); + } + + @Override + public void dispose() { + batch.dispose(); + introImage.dispose(); + stage.dispose(); + } +} diff --git a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java index c0f682b60..704ed65d7 100644 --- a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java @@ -20,6 +20,7 @@ import com.csse3200.game.areas.ForestGameArea; import com.csse3200.game.areas.terrain.TerrainFactory; import com.csse3200.game.components.maingame.MainGameActions; +import com.csse3200.game.components.maingame.MainGameLoseDisplay; import com.csse3200.game.entities.Entity; import com.csse3200.game.entities.EntityService; import com.csse3200.game.entities.factories.PlayerFactory; @@ -67,7 +68,6 @@ public class MainGameScreen extends ScreenAdapter { public static int viewportHeight= screenHeight; - private OrthographicCamera camera; private SpriteBatch batch; @@ -117,7 +117,6 @@ public MainGameScreen(GdxGame game) { ForestGameArea forestGameArea = new ForestGameArea(terrainFactory); forestGameArea.create(); } - @Override public void render(float delta) { physicsEngine.update(); @@ -128,7 +127,6 @@ public void render(float delta) { batch.draw(backgroundTexture, 0, 0, viewportWidth, viewportHeight); batch.end(); - renderer.render(); stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f)); stage.draw(); @@ -196,6 +194,7 @@ private void createUI() { .addComponent(new PerformanceDisplay()) .addComponent(new MainGameActions(this.game)) .addComponent(new MainGameExitDisplay()) + .addComponent(new MainGameLoseDisplay()) .addComponent(new Terminal()) .addComponent(inputComponent) .addComponent(new TerminalDisplay()); From 7f51c44a8f5ce891716d3517e76dc037e893fb3d Mon Sep 17 00:00:00 2001 From: Nawal Date: Mon, 11 Sep 2023 04:40:05 +1000 Subject: [PATCH 08/16] Added a display for the engineer count --- .../images/engineers/engineerBanner.png | Bin 0 -> 12055 bytes .../csse3200/game/areas/ForestGameArea.java | 2 + .../components/gamearea/CurrencyDisplay.java | 2 +- .../gamearea/EngineerCountDisplay.java | 69 ++++++++++++++++++ .../game/services/GameEndService.java | 11 +++ .../game/services/GameEndServiceTest.java | 26 +++---- 6 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 source/core/assets/images/engineers/engineerBanner.png create mode 100644 source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java diff --git a/source/core/assets/images/engineers/engineerBanner.png b/source/core/assets/images/engineers/engineerBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..f689a8fef2bc81c601a2e0b3432a6223afd106f6 GIT binary patch literal 12055 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 literal 0 HcmV?d00001 diff --git a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index b1171d5b7..71f0f9151 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -8,6 +8,7 @@ import com.csse3200.game.components.ProjectileEffects; import com.csse3200.game.areas.terrain.TerrainFactory; import com.csse3200.game.areas.terrain.TerrainFactory.TerrainType; +import com.csse3200.game.components.gamearea.EngineerCountDisplay; import com.csse3200.game.components.player.PlayerStatsDisplay; import com.csse3200.game.entities.Entity; import com.csse3200.game.entities.factories.*; @@ -217,6 +218,7 @@ public void create() { private void displayUI() { Entity ui = new Entity(); ui.addComponent(new GameAreaDisplay("Box Forest")); + ui.addComponent(ServiceLocator.getGameEndService().getDisplay()); ui.addComponent(ServiceLocator.getCurrencyService().getDisplay()); spawnEntity(ui); } diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java index 178cd11ff..fdca3e65b 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java @@ -44,7 +44,7 @@ private void addActors() { table = new Table(); table.top().left(); table.setFillParent(true); - table.padTop(50f).padLeft(20f); + table.padTop(70f).padLeft(20f); // create scraps text button style Drawable scrapDrawable = new TextureRegionDrawable(new TextureRegion(new Texture("images/economy/scrapsUI.png"))); diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java new file mode 100644 index 000000000..a1094f538 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java @@ -0,0 +1,69 @@ +package com.csse3200.game.components.gamearea; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Align; +import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ui.UIComponent; + +public class EngineerCountDisplay extends UIComponent { + private Table table; + private TextButton engineerTb; + + @Override + public void create() { + super.create(); + addActors(); + } + + /** + * Initialises the currency labels + * Positions it on the stage using a table + */ + private void addActors() { + table = new Table(); + table.top().left(); + table.setFillParent(true); + table.padTop(80f).padLeft(20f); + + Drawable drawable = new TextureRegionDrawable(new TextureRegion( + new Texture("images/engineers/engineerBanner.png"))); + TextButton.TextButtonStyle style = new TextButton.TextButtonStyle( + drawable, drawable, drawable, new BitmapFont()); + + String text = String.format("%d", ServiceLocator.getGameEndService().getEngineerCount()); + engineerTb = new TextButton(text, style); + engineerTb.setDisabled(true); + engineerTb.getLabel().setAlignment(Align.right); + + engineerTb.pad(0, 0, 0, 70); + engineerTb.setTransform(true); + + table.add(engineerTb).width(engineerTb.getWidth() * 0.5f).height(engineerTb.getHeight() * 0.5f); + stage.addActor(table); + } + + public void updateCount() { + String text = String.format("%d", ServiceLocator.getGameEndService().getEngineerCount()); + engineerTb.getLabel().setText(text); + } + + @Override + protected void draw(SpriteBatch batch) { + + } + + @Override + public void dispose() { + super.dispose(); + engineerTb.remove(); + } +} diff --git a/source/core/src/main/com/csse3200/game/services/GameEndService.java b/source/core/src/main/com/csse3200/game/services/GameEndService.java index fe1ca5337..82a9143ee 100644 --- a/source/core/src/main/com/csse3200/game/services/GameEndService.java +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -1,13 +1,18 @@ package com.csse3200.game.services; +import com.csse3200.game.components.gamearea.EngineerCountDisplay; + public class GameEndService { private int engineerCount; private boolean gameOver = false; + private EngineerCountDisplay display; + public GameEndService() { this.engineerCount = 5; + this.display = new EngineerCountDisplay(); } public int getEngineerCount() { @@ -16,6 +21,8 @@ public int getEngineerCount() { public void updateEngineerCount() { engineerCount -= 1; + display.updateCount(); + if (engineerCount == 0) { // loss screen gameOver = true; @@ -25,4 +32,8 @@ public void updateEngineerCount() { public boolean hasGameEnded() { return gameOver; } + + public EngineerCountDisplay getDisplay() { + return display; + } } diff --git a/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java index f2a31f213..9a2a64c87 100644 --- a/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java +++ b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java @@ -24,17 +24,17 @@ void shouldReturnCount() { assertEquals(5, ServiceLocator.getGameEndService().getEngineerCount()); } - @Test - void shouldDecrementCount() { - ServiceLocator.getGameEndService().updateEngineerCount(); - assertEquals(4, ServiceLocator.getGameEndService().getEngineerCount()); - } - - @Test - void shouldEndGame() { - for (int i = 0; i < 5; i++) { - ServiceLocator.getGameEndService().updateEngineerCount(); - } - assertTrue(ServiceLocator.getGameEndService().hasGameEnded()); - } +// @Test +// void shouldDecrementCount() { +// ServiceLocator.getGameEndService().updateEngineerCount(); +// assertEquals(4, ServiceLocator.getGameEndService().getEngineerCount()); +// } +// +// @Test +// void shouldEndGame() { +// for (int i = 0; i < 5; i++) { +// ServiceLocator.getGameEndService().updateEngineerCount(); +// } +// assertTrue(ServiceLocator.getGameEndService().hasGameEnded()); +// } } From a67ea573ea434d664aba15bb8fc621a535e2ecf5 Mon Sep 17 00:00:00 2001 From: Nawal Date: Mon, 11 Sep 2023 04:59:09 +1000 Subject: [PATCH 09/16] changed display ui and implemented createButton function to avoid repeating code --- .../assets/images/economy/crystalBanner.png | Bin 0 -> 15525 bytes .../core/assets/images/economy/crystalUI.png | Bin 13584 -> 0 bytes .../assets/images/economy/scrapBanner.png | Bin 0 -> 13627 bytes .../core/assets/images/economy/scrapsUI.png | Bin 7680 -> 0 bytes .../components/gamearea/CurrencyDisplay.java | 50 ++++++++---------- 5 files changed, 21 insertions(+), 29 deletions(-) create mode 100644 source/core/assets/images/economy/crystalBanner.png delete mode 100644 source/core/assets/images/economy/crystalUI.png create mode 100644 source/core/assets/images/economy/scrapBanner.png delete mode 100644 source/core/assets/images/economy/scrapsUI.png diff --git a/source/core/assets/images/economy/crystalBanner.png b/source/core/assets/images/economy/crystalBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bfb26dac3eaad48b703a1c49b9386cce7047a0 GIT binary patch literal 15525 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 Tr9iBof4-FxlNYTKHVphfTiHt3 literal 0 HcmV?d00001 diff --git a/source/core/assets/images/economy/crystalUI.png b/source/core/assets/images/economy/crystalUI.png deleted file mode 100644 index f2c0d4ddf67724a50d510a7794159eb7ddfc7671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13584 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 E4>c*6G5`Po diff --git a/source/core/assets/images/economy/scrapBanner.png b/source/core/assets/images/economy/scrapBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2835190a80750fe51a982aeee0a01f3034a3da GIT binary patch literal 13627 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 Date: Mon, 11 Sep 2023 05:30:17 +1000 Subject: [PATCH 10/16] changed display sizing --- .../game/components/gamearea/CurrencyDisplay.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java index 35a688d60..1071d486c 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java @@ -48,15 +48,15 @@ private void addActors() { table = new Table(); table.top().left(); table.setFillParent(true); - table.padTop(50f).padLeft(20f); + table.padTop(100f).padLeft(20f); scrapsTb = createButton("images/economy/scrapBanner.png", ServiceLocator.getCurrencyService().getScrap().getAmount()); crystalsTb = createButton("images/economy/crystalBanner.png", ServiceLocator.getCurrencyService().getCrystal().getAmount()); - table.add(scrapsTb); - table.add(crystalsTb); + table.add(scrapsTb).width(scrapsTb.getWidth() * 0.5f).height(scrapsTb.getHeight() * 0.5f); + table.add(crystalsTb).width(crystalsTb.getWidth() * 0.5f).height(crystalsTb.getHeight() * 0.5f); stage.addActor(table); } @@ -69,10 +69,9 @@ private TextButton createButton(String imageFilePath, int value) { TextButton tb = new TextButton(String.format("%d", value), style); tb.setDisabled(true); tb.getLabel().setAlignment(Align.right); - tb.getLabel().setFontScale(2, 2); // font size - tb.pad(0, 0, 0, 70); + + tb.pad(0, 0, 0, 50); tb.setTransform(true); - tb.setScale(0.5f); // button size return tb; } From 197e2221b7ab786c9ec1546f9fed129088528f54 Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Mon, 11 Sep 2023 08:39:21 +1000 Subject: [PATCH 11/16] code smell fixes --- .../csse3200/game/areas/ForestGameArea.java | 84 ++----------------- .../game/components/CombatStatsComponent.java | 21 +++-- .../tasks/human/HumanMovementTask.java | 9 -- .../tasks/human/HumanWanderTask.java | 77 ++++++++--------- 4 files changed, 55 insertions(+), 136 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index 83e48a4f8..5d0f0cc79 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -4,24 +4,18 @@ import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; -import com.csse3200.game.components.CombatStatsComponent; import com.csse3200.game.components.ProjectileEffects; import com.csse3200.game.areas.terrain.TerrainFactory; import com.csse3200.game.areas.terrain.TerrainFactory.TerrainType; -import com.csse3200.game.components.gamearea.EngineerCountDisplay; -import com.csse3200.game.components.player.PlayerStatsDisplay; import com.csse3200.game.entities.Entity; import com.csse3200.game.entities.factories.*; import com.csse3200.game.physics.PhysicsLayer; -import com.csse3200.game.utils.math.GridPoint2Utils; import com.csse3200.game.utils.math.RandomUtils; import com.csse3200.game.services.ResourceService; import com.csse3200.game.services.ServiceLocator; import com.csse3200.game.components.gamearea.GameAreaDisplay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import java.util.Random; import java.util.Timer; @@ -33,26 +27,14 @@ public class ForestGameArea extends GameArea { private static final Logger logger = LoggerFactory.getLogger(ForestGameArea.class); private static final int NUM_BUILDINGS = 4; - - private static final int NUM_WALLS = 7; - - private static final int NUM_TREES = 0; private static final int NUM_GHOSTS = 0; private static final int NUM_GRUNTS = 5; - private static final int NUM_BOSS=4; - - - private Timer bossSpawnTimer; - private int bossSpawnInterval = 10000; // 1 minute in milliseconds - private static final int NUM_WEAPON_TOWERS = 3; private static final GridPoint2 PLAYER_SPAWN = new GridPoint2(0, 0); // Temporary spawn point for testing private static final float WALL_WIDTH = 0.1f; - private static final GridPoint2 BOSS_SPAWN = new GridPoint2(5, 5); - // Required to load assets before using them private static final String[] forestTextures = { "images/ingamebg.png", @@ -92,26 +74,19 @@ public class ForestGameArea extends GameArea { "images/towers/wallTower.png", "images/background/building2.png", "images/iso_grass_3.png", - "images/terrain_use.png", "images/Dusty_MoonBG.png", - "images/economy/scrap.png", "images/economy/crystal.png", "images/economy/econ-tower.png", - - "images/towers/mine_tower.png", "images/towers/TNTTower.png", - "images/towers/DroidTower.png", "images/projectiles/basic_projectile.png", "images/projectiles/mobProjectile.png", "images/projectiles/engineer_projectile.png", "images/projectiles/mobKing_projectile.png", "images/projectiles/snow_ball.png" - - }; private static final String[] forestTextureAtlases = { "images/economy/econ-tower.atlas", @@ -131,12 +106,10 @@ public class ForestGameArea extends GameArea { "images/mobs/rangeBossRight.atlas", "images/towers/TNTTower.atlas", "images/projectiles/basic_projectile.atlas", - "images/projectiles/mobProjectile.atlas", "images/projectiles/engineer_projectile.atlas", "images/projectiles/mobKing_projectile.atlas", "images/projectiles/snow_ball.atlas" - }; private static final String[] forestSounds = { "sounds/Impact4.ogg", @@ -158,8 +131,6 @@ public class ForestGameArea extends GameArea { // Variables to be used with spawn projectile methods. This is the variable // that should occupy the direction param. private static final int towardsMobs = 100; - private static final int towardsTowers = 0; - private Entity bossKing1; private Entity bossKing2; @@ -194,8 +165,6 @@ public void create() { spawnRicochetFireball(new Vector2(2, 4), PhysicsLayer.NPC, towardsMobs, new Vector2(2f, 2f)); spawnSplitFireWorksFireBall(new Vector2(2, 5), PhysicsLayer.NPC, towardsMobs, new Vector2(2f, 2f), 12); spawnEffectProjectile(new Vector2(2, 6), PhysicsLayer.NPC, towardsMobs, new Vector2(2f, 2f), ProjectileEffects.SLOW, false); - // spawnProjectileTest(new Vector2(0, 8), PhysicsLayer.NPC, towardsMobs, new Vector2(2f, 2f)); - spawnXenoGrunts(); @@ -205,11 +174,8 @@ public void create() { spawnDroidTower(); spawnGapScanners(); spawnIncome(); -// bossKing1 = spawnBossKing1(); - bossKing2 = spawnBossKing2(); - - + bossKing2 = spawnBossKing2(); } private void displayUI() { @@ -232,8 +198,6 @@ private void spawnTerrain() { // Left // ! THIS ONE DOESNT WORK. GRIDPOINTS2UTIL.ZERO is (0, 4), not (0, 0) - // spawnEntityAt( - // ObstacleFactory.createWall(WALL_WIDTH, worldBounds.y), GridPoint2Utils.ZERO, false, false); spawnEntityAt( ObstacleFactory.createWall(WALL_WIDTH, worldBounds.y), new GridPoint2(1, 0), false, false); // Right @@ -267,17 +231,6 @@ private void spawnBuilding2() { } } - private void spawnMountains() { - ArrayList fixedPositions = new ArrayList<>(); //Generating ArrayList - - - for (GridPoint2 fixedPos : fixedPositions) { - Entity tree = ObstacleFactory.createMountain(); - spawnEntityAt(tree, fixedPos, true, false); - } - } - - private Entity spawnPlayer() { Entity newPlayer = PlayerFactory.createPlayer(); spawnEntityAt(newPlayer, PLAYER_SPAWN, true, true); @@ -359,22 +312,6 @@ private void spawnProjectile(Vector2 position, short targetLayer, int space, in spawnEntity(Projectile); } - // private Entity spawnBossKing() { - // for (int i = 0; i < NUM_BOSS; i++) { - // int fixedX = terrain.getMapBounds(0).x - 1; // Rightmost x-coordinate - // int randomY = MathUtils.random(0, maxPos.y); - // GridPoint2 randomPos = new GridPoint2(fixedX, randomY); - // bossKing1 = BossKingFactory.createBossKing1(player); - // spawnEntityAt(bossKing1, - // randomPos, - // true, - // false); - // } - // return bossKing1; - - // } - - private void spawnXenoGrunts() { GridPoint2 minPos = terrain.getMapBounds(0).sub(1, 5); GridPoint2 maxPos = terrain.getMapBounds(0).sub(1, 25); @@ -387,18 +324,6 @@ private void spawnXenoGrunts() { } } -// private Entity spawnGhostKing() { -// GridPoint2 minPos = new GridPoint2(0, 0); -// GridPoint2 maxPos = terrain.getMapBounds(0).sub(0, 0); -// GridPoint2 randomPos -// = RandomUtils.random(minPos, maxPos); -// // = new GridPoint2(26, 26); -// Entity ghostKing = NPCFactory.createGhostKing(player); -// spawnEntityAt(ghostKing, randomPos, true, true); -// return ghostKing; -// -// } - private Entity spawnBossKing2() { GridPoint2 minPos = new GridPoint2(0, 0); GridPoint2 maxPos = terrain.getMapBounds(0).sub(2, 2); @@ -510,14 +435,11 @@ private void spawnWeaponTower() { for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { GridPoint2 randomPos1 = RandomUtils.random(minPos, maxPos); GridPoint2 randomPos2 = RandomUtils.random(minPos, maxPos); - //Entity weaponTower = TowerFactory.createWeaponTower(); Entity wallTower = TowerFactory.createWallTower(); Entity fireTower = TowerFactory.createFireTower(); Entity stunTower = TowerFactory.createStunTower(); - //spawnEntityAt(weaponTower, randomPos, true, true); spawnEntityAt(fireTower, randomPos1, true, true); spawnEntityAt(stunTower, randomPos2, true, true); - //spawnEntityAt(wallTower, new GridPoint2(randomPos1.x + 3, randomPos1.y), true, true); } } @@ -612,6 +534,10 @@ private void spawnIncome() { } } + /** + * Creates the scanners (one per lane) that detect absence of towers and presence of mobs, + * and trigger engineer spawning + */ private void spawnGapScanners() { for (int i = 0; i < terrain.getMapBounds(0).y; i++) { Entity scanner = GapScannerFactory.createScanner(); diff --git a/source/core/src/main/com/csse3200/game/components/CombatStatsComponent.java b/source/core/src/main/com/csse3200/game/components/CombatStatsComponent.java index 77e5a224c..cdf8bacbe 100644 --- a/source/core/src/main/com/csse3200/game/components/CombatStatsComponent.java +++ b/source/core/src/main/com/csse3200/game/components/CombatStatsComponent.java @@ -29,6 +29,11 @@ public class CombatStatsComponent extends Component { private static final Logger logger = LoggerFactory.getLogger(CombatStatsComponent.class); + private static final String HEALTH_FULL = "fullHealth"; + private static final String HEALTH_MID = "midHealth"; + private static final String HEALTH_LOW = "lowHealth"; + private static final String HIT_EVENT = "hitStart"; + private static final String UPDATE_HEALTH_EVENT = "updateHealth"; private int health; private int baseAttack; private int fullHealth; @@ -41,7 +46,7 @@ public CombatStatsComponent(int health, int baseAttack) { setHealth(health); setBaseAttack(baseAttack); this.fullHealth = health; - this.state = "fullHealth"; + this.state = HEALTH_FULL; } public CombatStatsComponent(int health, int baseAttack, @@ -54,7 +59,7 @@ public CombatStatsComponent(int health, int baseAttack, this.drops = drops; this.closeRangeAbilities = closeRangeAbilities; this.longRangeAbilities = longRangeAbilities; - this.state = "fullHealth"; + this.state = HEALTH_FULL; } /** @@ -88,7 +93,7 @@ public void setHealth(int health) { } if (entity != null) { - entity.getEvents().trigger("updateHealth", this.health); + entity.getEvents().trigger(UPDATE_HEALTH_EVENT, this.health); } } @@ -150,7 +155,7 @@ public void hit(Integer damage) { int newHealth = getHealth() - damage; setHealth(newHealth); if (entity != null && !this.isDead()) { - entity.getEvents().trigger("hitStart"); + entity.getEvents().trigger(HIT_EVENT); } changeState(); } @@ -159,7 +164,7 @@ public void hit(Integer damage) { public void hit(CombatStatsComponent attacker) { int newHealth = getHealth() - attacker.getBaseAttack(); if (entity != null && !this.isDead()) { - entity.getEvents().trigger("hitStart"); + entity.getEvents().trigger(HIT_EVENT); } setHealth(newHealth); changeState(); @@ -226,11 +231,11 @@ public Weapon getWeapon(Entity target) { * */ public void changeState() { if (this.health <= (this.fullHealth * 0.33)) { - this.state = "lowHealth"; + this.state = HEALTH_LOW; } else if (this.health <= (this.fullHealth * 0.66)) { - this.state = "midHealth"; + this.state = HEALTH_MID; } else { - this.state = "fullHealth"; + this.state = HEALTH_FULL; } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanMovementTask.java b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanMovementTask.java index 2f647426d..fa589460f 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanMovementTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanMovementTask.java @@ -2,20 +2,15 @@ import com.badlogic.gdx.math.Vector2; import com.csse3200.game.ai.tasks.DefaultTask; -import com.csse3200.game.entities.Entity; import com.csse3200.game.physics.components.PhysicsMovementComponent; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Move a human entity to a given position, finishing when you get close enough. Requires an entity with a * PhysicsMovementComponent. */ public class HumanMovementTask extends DefaultTask { - private static final Logger logger = LoggerFactory.getLogger(HumanMovementTask.class); - private final GameTime gameTime; private Vector2 target; private float stopDistance = 0.01f; @@ -47,7 +42,6 @@ public void start() { owner.getEntity().getEvents().trigger("walkRightStart"); } - logger.debug("Starting movement towards {}", target); lastTimeMoved = gameTime.getTime(); lastPos = owner.getEntity().getPosition(); } @@ -58,7 +52,6 @@ public void update() { movementComponent.setMoving(false); owner.getEntity().getEvents().trigger("idleStart"); status = Status.FINISHED; - logger.debug("Finished moving to {}", target); } else { checkIfStuck(); } @@ -73,7 +66,6 @@ public void setTarget(Vector2 target) { public void stop() { super.stop(); movementComponent.setMoving(false); - logger.debug("Stopping movement"); } private boolean isAtTarget() { @@ -87,7 +79,6 @@ private void checkIfStuck() { } else if (gameTime.getTimeSince(lastTimeMoved) > 500L) { movementComponent.setMoving(false); status = Status.FAILED; - logger.debug("Got stuck! Failing movement task"); } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java index 0b66a9493..ceed79ea6 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/human/HumanWanderTask.java @@ -10,8 +10,6 @@ import com.csse3200.game.physics.components.HitboxComponent; import com.csse3200.game.rendering.AnimationRenderComponent; import com.csse3200.game.services.ServiceLocator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HumanWanderTask is the entry point for the engineer entity's behaviour. Instantiates subtasks HumanWaitTask, @@ -19,16 +17,14 @@ * handled in this class. */ public class HumanWanderTask extends DefaultTask implements PriorityTask { - private static final Logger logger = LoggerFactory.getLogger(HumanWanderTask.class); private static final int TOLERANCE = 1; private static final float STOP_DISTANCE = 0.5f; private static final int DEFAULT_PRIORITY = 1; private static final String DEATH_EVENT = "deathStart"; private static final String IDLE_EVENT = "idleRight"; - + private AnimationRenderComponent animator; private final float maxRange; private final float waitTime; - private Vector2 startPos; private HumanMovementTask movementTask; private HumanWaitTask waitTask; private EngineerCombatTask combatTask; @@ -62,11 +58,11 @@ public int getPriority() { @Override public void start() { super.start(); - this.startPos = owner.getEntity().getCenterPosition(); + Vector2 startPos = owner.getEntity().getCenterPosition(); waitTask = new HumanWaitTask(waitTime); waitTask.create(owner); - movementTask = new HumanMovementTask(this.startPos, STOP_DISTANCE); + movementTask = new HumanMovementTask(startPos, STOP_DISTANCE); movementTask.create(owner); movementTask.start(); @@ -75,6 +71,8 @@ public void start() { combatTask.start(); currentTask = movementTask; + + animator = owner.getEntity().getComponent(AnimationRenderComponent.class); } /** @@ -87,42 +85,49 @@ public void start() { */ @Override public void update() { + + boolean justDied = owner.getEntity().getComponent(CombatStatsComponent.class).isDead(); // Check if engineer has died since last update - if (!isDead && owner.getEntity().getComponent(CombatStatsComponent.class).isDead()) { + if (!isDead && justDied) { startDying(); - } - - // Check if engineer has finished dying animation - else if (isDead && owner.getEntity().getComponent(AnimationRenderComponent.class).isFinished()) { + } else if (isDead && animator.isFinished()) { owner.getEntity().setFlagForDelete(true); + // Decrement the engineer count ServiceLocator.getGameEndService().updateEngineerCount(); } // otherwise doing engineer things since engineer is alive - else if (!isDead) { - if (currentTask.getStatus() != Status.ACTIVE) { - - // if the engineer is in move state and update has been called, engineer has arrived at destination - if (currentTask == movementTask) { - startWaiting(); - owner.getEntity().getEvents().trigger(IDLE_EVENT); - - } else if (combatTask.isTargetVisible()) { - // if the engineer is positioned within the tolerance range of the mob's y position, enter combat state - if (combatTask.fetchTarget().y < owner.getEntity().getCenterPosition().y + TOLERANCE && - combatTask.fetchTarget().y > owner.getEntity().getCenterPosition().y - TOLERANCE) { - startCombat(); - - // move into position for targeting mob - } else { - startMoving(new Vector2(owner.getEntity().getCenterPosition().x, combatTask.fetchTarget().y)); - } - } - } + else if (!isDead){ + doEngineerThings(); + currentTask.update(); } } + private void doEngineerThings() { + if (currentTask.getStatus() != Status.ACTIVE) { + + // if the engineer is in move state and update has been called, engineer has arrived at destination + if (currentTask == movementTask) { + startWaiting(); + owner.getEntity().getEvents().trigger(IDLE_EVENT); + + } else if (combatTask.isTargetVisible()) { + float engY = owner.getEntity().getCenterPosition().y; + float targetY = combatTask.fetchTarget().y; + // if the engineer is positioned within the tolerance range of the mob's y position, enter combat state + if (engY < targetY + TOLERANCE && + engY > targetY - TOLERANCE) { + startCombat(); + + // move into position for targeting mob + } else { + Vector2 newPos = new Vector2(owner.getEntity().getPosition().x, combatTask.fetchTarget().y); + startMoving(newPos); + } + } + } + } /** * Handle the dying phase of the entity. Triggers an event to play the appropriate media, * sets HitBox and Collider components to ignore contact (stops the body being pushed around) @@ -170,12 +175,4 @@ private void swapTask(Task newTask) { currentTask = newTask; currentTask.start(); } - - /** - * Fetch the start position. - * @return a Vector2 start position - */ - public Vector2 getStartPos() { - return this.startPos; - } } From ff68ecf3833049ecc213b764bd819a31350b78ec Mon Sep 17 00:00:00 2001 From: Nawal Date: Mon, 11 Sep 2023 13:57:11 +1000 Subject: [PATCH 12/16] Changed display positioning to get rid of the overlap --- .../com/csse3200/game/components/gamearea/CurrencyDisplay.java | 2 +- .../csse3200/game/components/gamearea/EngineerCountDisplay.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java index 1071d486c..dbc3042b8 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java @@ -48,7 +48,7 @@ private void addActors() { table = new Table(); table.top().left(); table.setFillParent(true); - table.padTop(100f).padLeft(20f); + table.padTop(140f).padLeft(20f); scrapsTb = createButton("images/economy/scrapBanner.png", ServiceLocator.getCurrencyService().getScrap().getAmount()); diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java index a1094f538..f6a387245 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java @@ -44,7 +44,7 @@ private void addActors() { engineerTb.setDisabled(true); engineerTb.getLabel().setAlignment(Align.right); - engineerTb.pad(0, 0, 0, 70); + engineerTb.pad(0, 0, 0, 50); engineerTb.setTransform(true); table.add(engineerTb).width(engineerTb.getWidth() * 0.5f).height(engineerTb.getHeight() * 0.5f); From 8945c79b98221d4793a68d88edd617fb5bd81c19 Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:00:31 +1000 Subject: [PATCH 13/16] Implemented triggering of lose screen when engineer death limit reached --- .../main/com/csse3200/game/screens/MainGameScreen.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java index 1b7baf36e..e3cb512b0 100644 --- a/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/MainGameScreen.java @@ -34,6 +34,7 @@ import com.csse3200.game.rendering.RenderService; import com.csse3200.game.rendering.Renderer; import com.csse3200.game.services.*; +import com.csse3200.game.ui.UIComponent; import com.csse3200.game.ui.terminal.Terminal; import com.csse3200.game.ui.terminal.TerminalDisplay; import com.csse3200.game.components.maingame.MainGameExitDisplay; @@ -59,6 +60,7 @@ public class MainGameScreen extends ScreenAdapter { static int screenWidth = Gdx.graphics.getWidth(); static int screenHeight = Gdx.graphics.getHeight(); + private Entity ui; public static int viewportWidth = screenWidth; @@ -120,6 +122,11 @@ public void render(float delta) { physicsEngine.update(); ServiceLocator.getEntityService().update(); + // Check if the game has ended + if (ServiceLocator.getGameEndService().hasGameEnded()) { + ui.getEvents().trigger("lose"); + } + batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(backgroundTexture, 0, 0, viewportWidth, viewportHeight); @@ -187,7 +194,7 @@ private void createUI() { InputComponent inputComponent = ServiceLocator.getInputService().getInputFactory().createForTerminal(); - Entity ui = new Entity(); + ui = new Entity(); ui.addComponent(new InputDecorator(stage, 10)) .addComponent(new PerformanceDisplay()) .addComponent(new MainGameActions(this.game)) From 0aa5518dff295c31cb9e2d6efd4da35608de6d22 Mon Sep 17 00:00:00 2001 From: Nawal Date: Mon, 11 Sep 2023 15:48:08 +1000 Subject: [PATCH 14/16] added function comments --- .../gamearea/EngineerCountDisplay.java | 7 +++++-- .../csse3200/game/services/GameEndService.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java index f6a387245..5444a3704 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java @@ -25,7 +25,7 @@ public void create() { } /** - * Initialises the currency labels + * Initialises the engineer count display * Positions it on the stage using a table */ private void addActors() { @@ -51,6 +51,9 @@ private void addActors() { stage.addActor(table); } + /** + * Updates the engineer count on the UI component + */ public void updateCount() { String text = String.format("%d", ServiceLocator.getGameEndService().getEngineerCount()); engineerTb.getLabel().setText(text); @@ -58,7 +61,7 @@ public void updateCount() { @Override protected void draw(SpriteBatch batch) { - + // handled by stage } @Override diff --git a/source/core/src/main/com/csse3200/game/services/GameEndService.java b/source/core/src/main/com/csse3200/game/services/GameEndService.java index 82a9143ee..bc11eec44 100644 --- a/source/core/src/main/com/csse3200/game/services/GameEndService.java +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -10,15 +10,26 @@ public class GameEndService { private EngineerCountDisplay display; + /** + * Constructor for the Game End Service + */ public GameEndService() { this.engineerCount = 5; this.display = new EngineerCountDisplay(); } + /** + * Returns the number of engineers left + * @return (int) engineer count + */ public int getEngineerCount() { return engineerCount; } + /** + * Updates engineer count and the UI display + * If engineer count is 0, the game is over. + */ public void updateEngineerCount() { engineerCount -= 1; display.updateCount(); @@ -29,10 +40,17 @@ public void updateEngineerCount() { } } + /** + * Returns the game over state + * @return (boolean) true if the game is over; false otherwise + */ public boolean hasGameEnded() { return gameOver; } + /** + * Returns the Engineer Count UI component + */ public EngineerCountDisplay getDisplay() { return display; } From 35a5a3e6a7fcbde37ee02a0b1def85c130d30c2e Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Mon, 11 Sep 2023 16:01:23 +1000 Subject: [PATCH 15/16] added setter method for engineer death limit --- .../gamearea/EngineerCountDisplay.java | 2 - .../game/services/GameEndService.java | 9 ++++- .../game/services/GameEndServiceTest.java | 39 ++++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java index f6a387245..b8509b28a 100644 --- a/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java +++ b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java @@ -1,11 +1,9 @@ package com.csse3200.game.components.gamearea; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; diff --git a/source/core/src/main/com/csse3200/game/services/GameEndService.java b/source/core/src/main/com/csse3200/game/services/GameEndService.java index 82a9143ee..74fe23146 100644 --- a/source/core/src/main/com/csse3200/game/services/GameEndService.java +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -15,6 +15,14 @@ public GameEndService() { this.display = new EngineerCountDisplay(); } + /** + * Set the engineer limit. During instantiation, limit defaults to 5. + * @param newLimit as an integer representing the maximum number of engineer deaths + */ + public void setEngineerCount(int newLimit) { + engineerCount = newLimit; + } + public int getEngineerCount() { return engineerCount; } @@ -24,7 +32,6 @@ public void updateEngineerCount() { display.updateCount(); if (engineerCount == 0) { - // loss screen gameOver = true; } } diff --git a/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java index 9a2a64c87..eeb10ed7f 100644 --- a/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java +++ b/source/core/src/test/com/csse3200/game/services/GameEndServiceTest.java @@ -1,22 +1,35 @@ package com.csse3200.game.services; import com.csse3200.game.extensions.GameExtension; +import com.csse3200.game.rendering.RenderService; +import com.csse3200.game.ui.UIComponent; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; @ExtendWith(GameExtension.class) +@ExtendWith(MockitoExtension.class) class GameEndServiceTest { GameEndService endService; + @Mock + RenderService renderService; @BeforeEach void setUp() { endService = new GameEndService(); + renderService = new RenderService(); +// uiComponent = spy(UIComponent.class); + ServiceLocator.registerGameEndService(endService); + ServiceLocator.registerRenderService(renderService); } @Test @@ -24,17 +37,17 @@ void shouldReturnCount() { assertEquals(5, ServiceLocator.getGameEndService().getEngineerCount()); } -// @Test -// void shouldDecrementCount() { -// ServiceLocator.getGameEndService().updateEngineerCount(); -// assertEquals(4, ServiceLocator.getGameEndService().getEngineerCount()); -// } -// -// @Test -// void shouldEndGame() { -// for (int i = 0; i < 5; i++) { -// ServiceLocator.getGameEndService().updateEngineerCount(); -// } -// assertTrue(ServiceLocator.getGameEndService().hasGameEnded()); -// } + @Test + void shouldDecrementCount() { + ServiceLocator.getGameEndService().updateEngineerCount(); + assertEquals(4, ServiceLocator.getGameEndService().getEngineerCount()); + } + + @Test + void shouldEndGame() { + for (int i = 0; i < 5; i++) { + ServiceLocator.getGameEndService().updateEngineerCount(); + } + assertTrue(ServiceLocator.getGameEndService().hasGameEnded()); + } } From 175d74f91453bb62803d5c1abe2e4f1d4512b3e1 Mon Sep 17 00:00:00 2001 From: Ahmad Abu-Aysha <111224176+The-AhmadAA@users.noreply.github.com> Date: Mon, 11 Sep 2023 17:10:20 +1000 Subject: [PATCH 16/16] merging main into Collab-end-game-state --- .../core/src/main/com/csse3200/game/areas/ForestGameArea.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index a0c966948..390516eaa 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -16,6 +16,8 @@ import com.csse3200.game.components.gamearea.GameAreaDisplay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import java.util.Random; import java.util.Timer;