From 0d1ac2e9fb68376a2ae704207f161608ee249063 Mon Sep 17 00:00:00 2001 From: Gaganx0 Date: Tue, 10 Oct 2023 03:53:05 +1000 Subject: [PATCH 1/5] Tuturial button added --- .../HelpScreen/GameDescriptionHelpScreen.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java index a06ef6322..11ad372f9 100644 --- a/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java @@ -130,6 +130,17 @@ public void clicked(com.badlogic.gdx.scenes.scene2d.InputEvent event, float x, f } }); + TextButton TutorialButton = new TextButton("Tutorial", skin); + TutorialButton.addListener(new ClickListener() { + @Override + public void clicked(com.badlogic.gdx.scenes.scene2d.InputEvent event, float x, float y) { + game.setScreen(GdxGame.ScreenType.HOW_TO_PLAY); + + } + }); + + + Table buttonTable = new Table(); buttonTable.add(BackButton).padRight(10); Table table1 = new Table(); @@ -157,6 +168,15 @@ public void clicked(com.badlogic.gdx.scenes.scene2d.InputEvent event, float x, f table3.add(buttonTable2).row(); // Add button table and move to the next row stage.addActor(table3); + Table buttonTable3 = new Table(); + buttonTable3.add(TutorialButton).padRight(10); + Table table4 = new Table(); + table4.setFillParent(true); + table4.center().top(); // Align to the middle-right corner + table4.pad(20); // Add padding to the middle-right corner + table4.add(buttonTable3).row(); // Add button table and move to the next row + stage.addActor(table4); + } @Override public void show() { From c60d6aeafc0c061962bfb48d416d052ec6b9357e Mon Sep 17 00:00:00 2001 From: Gaganx0 Date: Tue, 10 Oct 2023 04:01:18 +1000 Subject: [PATCH 2/5] Base code( MainGameScreen) code added to tutorial --- .../src/main/com/csse3200/game/GdxGame.java | 4 +- .../HelpScreen/GameDescriptionHelpScreen.java | 2 +- .../game/screens/HelpScreen/Tutorial.java | 326 ++++++++++++++++++ 3 files changed, 330 insertions(+), 2 deletions(-) create mode 100644 source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java diff --git a/source/core/src/main/com/csse3200/game/GdxGame.java b/source/core/src/main/com/csse3200/game/GdxGame.java index 0ea9b530f..4db810763 100644 --- a/source/core/src/main/com/csse3200/game/GdxGame.java +++ b/source/core/src/main/com/csse3200/game/GdxGame.java @@ -91,6 +91,8 @@ private Screen newScreen(ScreenType screenType) { return new HowToPlay(this); case LOAD_SCREEN: return new LoadingScreen(this); + case TUTORIAL_SCREEN: + return new Tutorial(this); default: return null; } @@ -98,7 +100,7 @@ private Screen newScreen(ScreenType screenType) { public enum ScreenType { MAIN_MENU, MAIN_GAME, SETTINGS, STORY_SCREEN, LEVEL_SELECT, TURRET_SELECTION, LOSING_SCREEN, HELP_SCREEN, LOAD_SCREEN, - HELP_MOBS_SCREEN, HELP_TOWER_SCREEN, HELP_BOSS_SCREEN, HOW_TO_PLAY + HELP_MOBS_SCREEN, HELP_TOWER_SCREEN, HELP_BOSS_SCREEN, HOW_TO_PLAY, TUTORIAL_SCREEN } /** diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java index 11ad372f9..28047dd76 100644 --- a/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/GameDescriptionHelpScreen.java @@ -134,7 +134,7 @@ public void clicked(com.badlogic.gdx.scenes.scene2d.InputEvent event, float x, f TutorialButton.addListener(new ClickListener() { @Override public void clicked(com.badlogic.gdx.scenes.scene2d.InputEvent event, float x, float y) { - game.setScreen(GdxGame.ScreenType.HOW_TO_PLAY); + game.setScreen(GdxGame.ScreenType.TUTORIAL_SCREEN); } }); diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java new file mode 100644 index 000000000..28d088149 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java @@ -0,0 +1,326 @@ +package com.csse3200.game.screens.HelpScreen; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.viewport.ScreenViewport; +import com.csse3200.game.GdxGame; +import com.csse3200.game.areas.ForestGameArea; +import com.csse3200.game.components.gamearea.PerformanceDisplay; +import com.csse3200.game.components.maingame.MainGameActions; +import com.csse3200.game.components.maingame.MainGameLoseDisplay; +import com.csse3200.game.components.maingame.MainGamePauseDisplay; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.EntityService; +import com.csse3200.game.entities.factories.RenderFactory; +import com.csse3200.game.input.*; +import com.csse3200.game.physics.PhysicsEngine; +import com.csse3200.game.physics.PhysicsService; +import com.csse3200.game.rendering.RenderService; +import com.csse3200.game.rendering.Renderer; +import com.csse3200.game.screens.GameLevelData; +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; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The game screen containing the tutorial game. + * + *

Details on libGDX screens: https://happycoding.io/tutorials/libgdx/game-screens + */ +public class Tutorial extends ScreenAdapter { + private static final Logger logger = LoggerFactory.getLogger(Tutorial.class); + private static final String[] mainGameTextures = { + "images/heart.png", + "images/ice_bg.png", + "images/lava_bg.png", + "images/desert_bg.png" + }; + + private static final String ICE_BACKDROP = mainGameTextures[1]; + private static final String LAVA_BACKDROP = mainGameTextures[2]; + private static final String DESERT_BACKDROP = mainGameTextures[3]; + private static final String[] backgroundMusic = { + "sounds/background/ice/ice_bgm.ogg", + "sounds/background/lava/lava_bgm.ogg", + "sounds/background/desert/desert_bgm.ogg" + }; + private static final String[] uiSounds = { + "sounds/ui/Click/NA_SFUI_Vol1_Click_01.ogg", + "sounds/ui/Hover/NA_SFUI_Vol1_hover_01.ogg", + "sounds/ui/Open_Close/NA_SFUI_Vol1_Close_01.ogg", + "sounds/ui/Open_Close/NA_SFUI_Vol1_Open_01.ogg", + "sounds/ui/Switch/NA_SFUI_Vol1_switch_01.ogg" + }; + private static final String[] desertSounds = { + "sounds/background/desert/Elements.ogg", + "sounds/background/desert/Rocks1.ogg", + "sounds/background/desert/Rocks2.ogg" + }; + private static final String[] iceSounds = { + "sounds/background/ice/Sequences1.ogg", + "sounds/background/ice/Sequences2.ogg", + "sounds/background/ice/Sequences3.ogg" + }; + private static final String[] lavaSounds = { + "sounds/background/lava/Burst.ogg", + "sounds/background/lava/Glitch_ripples.ogg", + "sounds/background/lava/Sizzling.ogg", + "sounds/background/lava/Swoosh.ogg" + }; + private static final String ICE_BGM = backgroundMusic[0]; + private static final String LAVA_BGM = backgroundMusic[1]; + private static final String DESERT_BGM = backgroundMusic[2]; + private static final Vector2 CAMERA_POSITION = new Vector2(10f, 5.64f); + + private final GdxGame game; + private final Renderer renderer; + private final PhysicsEngine physicsEngine; + + private InputComponent upgradedInputHandler; + private final Stage stage; + static int screenWidth = Gdx.graphics.getWidth(); + static int screenHeight = Gdx.graphics.getHeight(); + private Entity ui; + private int random = 0; + public static int viewportWidth = screenWidth; + public static int viewportHeight= screenHeight; + int selectedLevel = GameLevelData.getSelectedLevel(); + + private OrthographicCamera camera; + private SpriteBatch batch; + + private Texture backgroundTexture; + private Music music; + private Array ambientSounds = new Array<>(false, 5, String.class); + + public Tutorial(GdxGame game) { + this.game = game; + camera = new OrthographicCamera(); + camera.setToOrtho(false, viewportWidth, viewportHeight); + camera.position.set((float) (viewportWidth) / 2, (float) (viewportHeight) / 2, 0); + + batch = new SpriteBatch(); + + stage = new Stage(new ScreenViewport()); + + + logger.debug("Initialising tutorial game screen services"); + ServiceLocator.registerTimeSource(new GameTime()); + + PhysicsService physicsService = new PhysicsService(); + ServiceLocator.registerPhysicsService(physicsService); + physicsEngine = physicsService.getPhysics(); + + ServiceLocator.registerInputService(new InputService()); + ServiceLocator.registerResourceService(new ResourceService()); + + ServiceLocator.registerCurrencyService(new CurrencyService()); + + ServiceLocator.registerEntityService(new EntityService()); + ServiceLocator.registerRenderService(new RenderService()); + ServiceLocator.registerGameEndService(new GameEndService()); + ServiceLocator.registerWaveService(new WaveService()); + + renderer = RenderFactory.createRenderer(); + renderer.getCamera().getEntity().setPosition(CAMERA_POSITION); + renderer.getDebug().renderPhysicsWorld(physicsEngine.getWorld()); + InputComponent inputHandler = new DropInputComponent(renderer.getCamera().getCamera()); + InputComponent buildHandler = new BuildInputComponent(renderer.getCamera().getCamera()); + upgradedInputHandler = new UpgradeUIComponent(renderer.getCamera().getCamera(), renderer.getStage()); + InputComponent engineerInputHandler = new EngineerInputComponent(game, renderer.getCamera().getCamera()); + ServiceLocator.getInputService().register(inputHandler); + ServiceLocator.getInputService().register(buildHandler); + ServiceLocator.getInputService().register(engineerInputHandler); + ServiceLocator.getInputService().register(upgradedInputHandler); + ServiceLocator.getCurrencyService().getDisplay().setCamera(renderer.getCamera().getCamera()); + + loadAssets(); + createUI(); + ServiceLocator.registerMapService(new MapService(renderer.getCamera())); + logger.debug("Initialising tutorial game screen entities"); + ForestGameArea forestGameArea = new ForestGameArea(); + forestGameArea.create(); + } + + /** + * Retrieves the background texture based on the currently selected game level. + * + *

The method returns different textures for each game level: + *

+ * + * @return The background {@link Texture} corresponding to the selected level. + */ + public Texture getBackgroundTexture() { + Texture background; + switch (selectedLevel) { + // Desert + case 1: // Ice + background = ServiceLocator.getResourceService().getAsset(ICE_BACKDROP, Texture.class); + music = ServiceLocator.getResourceService().getAsset(ICE_BGM, Music.class); + ambientSounds.addAll(iceSounds); + break; + case 2: // Lava + background = ServiceLocator.getResourceService().getAsset(LAVA_BACKDROP, Texture.class); + music = ServiceLocator.getResourceService().getAsset(LAVA_BGM, Music.class); + ambientSounds.addAll(lavaSounds); + break; + default: + // Use a default background for other levels or planets + background = ServiceLocator.getResourceService().getAsset(DESERT_BACKDROP, Texture.class); + music = ServiceLocator.getResourceService().getAsset(DESERT_BGM, Music.class); + ambientSounds.addAll(desertSounds); + break; + } + return background; + } + + @Override + public void render(float delta) { + // Clear the screen + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + // Update the camera and set the batch's projection matrix + camera.update(); + batch.setProjectionMatrix(camera.combined); + + // Begin the batch + batch.begin(); + + // Draw the background texture. + batch.draw(backgroundTexture, 0, 0, viewportWidth, viewportHeight); + + // End the batch + batch.end(); + + // Continue with other rendering logic + physicsEngine.update(); + ServiceLocator.getEntityService().update(); + + // Checks if tower selected is dead + this.getUpgradedInputHandler().checkForDispose(); + + // Check if the game has ended + if (ServiceLocator.getGameEndService().hasGameEnded()) { + ui.getEvents().trigger("lose"); + } + + ServiceLocator.getWaveService().getDisplay().updateTimerButton(); + ServiceLocator.getWaveService().getDisplay().updateMobCount(); + renderer.render(); + } + + @Override + public void resize(int width, int height) { + renderer.resize(width, height); + logger.trace("Resized renderer: ({} x {})", width, height); + } + + @Override + public void pause() { + logger.info("Game paused"); + } + + @Override + public void resume() { + logger.info("Game resumed"); + } + + @Override + public void dispose() { + logger.debug("Disposing tutorial game screen"); + + renderer.dispose(); + unloadAssets(); + + ServiceLocator.getEntityService().dispose(); + ServiceLocator.getRenderService().dispose(); + ServiceLocator.getResourceService().dispose(); + + ServiceLocator.clear(); + } + + private void loadAssets() { + logger.debug("Loading assets"); + ResourceService resourceService = ServiceLocator.getResourceService(); + resourceService.loadTextures(mainGameTextures); + ServiceLocator.getResourceService().loadMusic(backgroundMusic); + ServiceLocator.getResourceService().loadSounds(iceSounds); + ServiceLocator.getResourceService().loadSounds(desertSounds); + ServiceLocator.getResourceService().loadSounds(lavaSounds); + ServiceLocator.getResourceService().loadSounds(uiSounds); + ServiceLocator.getResourceService().loadAll(); + backgroundTexture = getBackgroundTexture(); // Load the background image + } + + private void unloadAssets() { + logger.debug("Unloading assets"); + ResourceService resourceService = ServiceLocator.getResourceService(); + resourceService.unloadAssets(mainGameTextures); + ServiceLocator.getResourceService().unloadAssets(backgroundMusic); + ServiceLocator.getResourceService().unloadAssets(iceSounds); + ServiceLocator.getResourceService().unloadAssets(desertSounds); + ServiceLocator.getResourceService().unloadAssets(lavaSounds); + ServiceLocator.getResourceService().unloadAssets(uiSounds); + } + + /** + * Creates the main game's ui including components for rendering ui elements to the screen and + * capturing and handling ui input. + */ + private void createUI() { + logger.debug("Creating ui"); + Stage stage = ServiceLocator.getRenderService().getStage(); + InputComponent inputComponent = + ServiceLocator.getInputService().getInputFactory().createForTerminal(); + + ui = new Entity(); + ui.addComponent(new InputDecorator(stage, 10)) + + .addComponent(new PerformanceDisplay()) + .addComponent(new MainGameActions(this.game)) + .addComponent(ServiceLocator.getWaveService().getDisplay()) + .addComponent(new MainGameExitDisplay()) + .addComponent(new MainGameLoseDisplay()) + .addComponent(new MainGamePauseDisplay(this.game)) + .addComponent(new Terminal()) + .addComponent(inputComponent) + .addComponent(new TerminalDisplay()); + + + ServiceLocator.getEntityService().register(ui); + + music.setLooping(true); + music.setVolume(0.3f); + music.play(); + playAmbientSound(); + } + + /** + * Plays one of the ambient sounds for the level at random + */ + private void playAmbientSound() { + + ServiceLocator.getResourceService().getAsset(ambientSounds.random(), Sound.class).play(0.2f); + } + + private UpgradeUIComponent getUpgradedInputHandler() { + return (UpgradeUIComponent) upgradedInputHandler; + } +} \ No newline at end of file From 027ef30a5028dc755ac33a60e02124b8fbde2f21 Mon Sep 17 00:00:00 2001 From: Gaganx0 Date: Tue, 10 Oct 2023 04:11:39 +1000 Subject: [PATCH 3/5] Added base ingame code for tutorial( Forestgamearea) --- .../game/screens/HelpScreen/Tutorial.java | 4 +- .../HelpScreen/TutorialForestGameArea.java | 804 ++++++++++++++++++ 2 files changed, 806 insertions(+), 2 deletions(-) create mode 100644 source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java index 28d088149..8c8cbd4eb 100644 --- a/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java @@ -13,7 +13,7 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.ScreenViewport; import com.csse3200.game.GdxGame; -import com.csse3200.game.areas.ForestGameArea; +import com.csse3200.game.screens.HelpScreen.TutorialForestGameArea; import com.csse3200.game.components.gamearea.PerformanceDisplay; import com.csse3200.game.components.maingame.MainGameActions; import com.csse3200.game.components.maingame.MainGameLoseDisplay; @@ -150,7 +150,7 @@ public Tutorial(GdxGame game) { createUI(); ServiceLocator.registerMapService(new MapService(renderer.getCamera())); logger.debug("Initialising tutorial game screen entities"); - ForestGameArea forestGameArea = new ForestGameArea(); + TutorialForestGameArea forestGameArea = new TutorialForestGameArea(); forestGameArea.create(); } diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java new file mode 100644 index 000000000..21a321f54 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java @@ -0,0 +1,804 @@ +package com.csse3200.game.screens.HelpScreen; + +import com.badlogic.gdx.math.GridPoint2; +import com.badlogic.gdx.math.Vector2; +import com.csse3200.game.areas.GameArea; +import com.csse3200.game.areas.terrain.TerrainFactory; +import com.csse3200.game.areas.terrain.TerrainFactory.TerrainType; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.*; +import com.csse3200.game.physics.PhysicsLayer; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.math.GridPoint2; +import com.badlogic.gdx.math.Vector2; + +import com.csse3200.game.areas.terrain.TerrainComponent; +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.ProjectileEffects; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.*; + +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.screens.AssetLoader; + +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.security.SecureRandom; +import java.util.Random; +import java.util.Timer; + +import static com.csse3200.game.entities.factories.NPCFactory.createGhost; +import static com.csse3200.game.screens.AssetLoader.loadAllAssets; +import static com.csse3200.game.screens.AssetLoader.unloadAllAssets; + +import java.util.ArrayList; + +import java.util.TimerTask; + +/** Forest area for the demo game with trees, a player, and some enemies. */ +public class TutorialForestGameArea extends GameArea { + private static final Logger logger = LoggerFactory.getLogger(com.csse3200.game.areas.ForestGameArea.class); + private static final int NUM_BUILDINGS = 4; + private static final int NUM_GHOSTS = 0; + private static final int NUM_GRUNTS = 5; + private static final int NUM_BOSS = 4; + + + private static final int NUM_MOBBOSS2=3; + private static final int NUM_MOBBOSS1=1; + + private SecureRandom rand = new SecureRandom(); + + private int wave = 0; + private Timer waveTimer; + + private static final int NUM_WEAPON_TOWERS = 3; + private static final GridPoint2 PLAYER_SPAWN = new GridPoint2(2, 4); + // Temporary spawn point for testing + private static final float WALL_WIDTH = 0.1f; + + // Required to load assets before using them + private static final String backgroundMusic = "sounds/background/Sci-Fi1.ogg"; + + private static final String[] forestMusic = {backgroundMusic}; + private Entity player; + private Entity waves; + + // 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 Entity mobBoss2; + private Entity mobBoss1; + + /** + * Initialise this ForestGameArea to use the provided TerrainFactory. + * + * @requires terrainFactory != null + */ + public TutorialForestGameArea() { + super(); + } + + /** + * Add this method to start the wave spawning timer when the game starts. + */ +// private void startWaveTimer() { +// waveTimer = new Timer(); +// waveTimer.scheduleAtFixedRate(new TimerTask() { +// @Override +// public void run() { +// spawnWave(); +// } +// }, 0, 10000); // 10000 milliseconds = 10 seconds +// } + + /** + * Add this method to stop the wave timer when the game ends or as needed. + */ + private void stopWaveTimer() { + if (waveTimer != null) { + waveTimer.cancel(); + waveTimer = null; + } + } + + /** + * Cases to spawn a wave + */ +// private void spawnWave() { +// wave++; +// switch (wave) { +// case 1: +// case 2: +// spawnFireWorm(); +// spawnDragonKnight(); +// +// break; +// case 3: +// spawnSkeleton(); +// spawnWizard(); +// // mobBoss2 = spawnMobBoss2(); +// break; +// case 4: +// spawnWaterQueen(); +// spawnWaterSlime(); +// // mobBoss2 = spawnMobBoss2(); +// +// break; +// case 5: +// spawnDemonBoss(); +// default: +// // Handle other wave scenarios if needed +// break; +// } +// } + + /** + * Create the game area, including terrain, static entities (trees), dynamic entities (player) + */ + @Override + public void create() { + // Load game assets + loadAllAssets(); + loadAssets(); + logger.info("selected towers in main game are " + ServiceLocator.getTowerTypes()); + displayUI(); + spawnTerrain(); + + // Set up infrastructure for end game tracking +// player = spawnPlayer(); + + waves = WaveFactory.createWaves(); + spawnEntity(waves); + waves.getEvents().addListener("spawnWave", this::spawnMob); + + spawnScrap(); + spawnGapScanners(); + +// spawnTNTTower(); +// spawnWeaponTower(); +// spawnGapScanners(); +// spawnDroidTower(); +// spawnFireWorksTower(); // Commented these out until they are needed for Demonstration +// spawnPierceTower(); +// spawnRicochetTower(); +// spawnBombship(); + } + + private void displayUI() { + Entity ui = new Entity(); + ui.addComponent(new GameAreaDisplay("Tutorial")); + ui.addComponent(ServiceLocator.getGameEndService().getDisplay()); + ui.addComponent(ServiceLocator.getCurrencyService().getDisplay()); + spawnEntity(ui); + } + + private void spawnTerrain() { + + terrain = ServiceLocator.getMapService().getComponent(); + spawnEntity(ServiceLocator.getMapService().getEntity()); + + // Terrain walls + float tileSize = terrain.getTileSize(); + GridPoint2 tileBounds = terrain.getMapBounds(0); + Vector2 worldBounds = new Vector2(tileBounds.x * tileSize, tileBounds.y * tileSize); + + // Left + spawnEntityAt( + ObstacleFactory.createWall(WALL_WIDTH, worldBounds.y), + new GridPoint2(0, 0), + false, + false); + // Right + spawnEntityAt( + ObstacleFactory.createWall(WALL_WIDTH, worldBounds.y), + new GridPoint2(tileBounds.x, 0), + false, + false); + // Top + spawnEntityAt( + ObstacleFactory.createWall(worldBounds.x, WALL_WIDTH * 0), + new GridPoint2(0, tileBounds.y), + false, + false); + // Bottom + Entity wall = ObstacleFactory.createWall(worldBounds.x, WALL_WIDTH * 0); + wall.setPosition(0,-0.1f); + ServiceLocator.getEntityService().register(wall); + + } + + private Entity spawnPlayer() { + Entity newPlayer = PlayerFactory.createPlayer(); + spawnEntityAt(newPlayer, PLAYER_SPAWN, true, true); + return newPlayer; + } + + // Spawn player at a specific position + private Entity spawnPlayer(GridPoint2 position) { + Entity newPlayer = PlayerFactory.createPlayer(); + spawnEntityAt(newPlayer, position, true, true); + return newPlayer; + } + + // commented 383 - 386 out as there was a missing arg? +// private void spawnDemonBoss() { +// Entity demon = MobBossFactory.createDemonBoss(); +// spawnEntityAt(demon, new GridPoint2(19, 5), true, false); +// } + + private void spawnPatrick() { + Entity patrick = MobBossFactory.createPatrickBoss(3000); + spawnEntityAt(patrick, new GridPoint2(18, 5), true, false); + } + + private void spawnPatrickDeath() { + Entity patrickDeath = MobBossFactory.patrickDead(); + spawnEntityAt(patrickDeath, new GridPoint2(18, 5), true, false); + } + // commented 398 - 401 out as there was a missing arg? +// private void spawnIceBaby() { +// Entity iceBaby = MobBossFactory.createIceBoss(); +// spawnEntityAt(iceBaby, new GridPoint2(19, 5), true, false); +// } + +// private void spawnDemonBoss() { +// Entity demon = MobBossFactory.createDemonBoss(); +// spawnEntityAt(demon, new GridPoint2(19, 5), true, false); +// } + +// private void spawnPatrick() { +// Entity patrick = MobBossFactory.createPatrickBoss(3000); +// spawnEntityAt(patrick, new GridPoint2(18, 5), true, false); +// } +// +// private void spawnPatrickDeath() { +// Entity patrickDeath = MobBossFactory.patrickDead(); +// spawnEntityAt(patrickDeath, new GridPoint2(18, 5), true, false); +// } +// +// private void spawnIceBaby() { +// Entity iceBaby = MobBossFactory.createIceBoss(); +// spawnEntityAt(iceBaby, new GridPoint2(19, 5), true, false); +// } + + /** + * Spawns a projectile that only heads towards the enemies in its lane. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + */ + private void spawnProjectile(Vector2 position, short targetLayer, int direction, Vector2 speed) { + Entity Projectile = ProjectileFactory.createFireBall(targetLayer, new Vector2(direction, position.y), speed); + Projectile.setPosition(position); + spawnEntity(Projectile); + } + + /** + * Spawns a projectile specifically for general mobs/xenohunters + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + */ + private void spawnProjectileTest(Vector2 position, short targetLayer, int direction, Vector2 speed) { + Entity Projectile = ProjectileFactory.createEngineerBullet(targetLayer, new Vector2(direction, position.y), speed); + Projectile.setPosition(position); + spawnEntity(Projectile); + } + + /** + * Spawns a projectile to be used for multiple projectile function. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param space The space between the projectiles' destination. + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + */ + private void spawnProjectile(Vector2 position, short targetLayer, int space, int direction, Vector2 speed) { + Entity Projectile = ProjectileFactory.createFireBall(targetLayer, new Vector2(direction, position.y + space), speed); + Projectile.setPosition(position); + spawnEntity(Projectile); + } + + /** + * Spawn an entity on the map. Is called during a wave. Add cases here for each mob type + * @param entity mob to be spawned + * @param randomPos position to be spawned at + * @param health health of the mob + */ + public void spawnMob(String entity, GridPoint2 randomPos, int health) { + Entity mob; + switch (entity) { + case "Xeno": + mob = NPCFactory.createXenoGrunt(health); + break; + case "SplittingWaterSlime": + mob = NPCFactory.createSplittingWaterSlime(health); + break; + case "DodgingDragon": + mob = NPCFactory.createDodgingDragonKnight(health); + break; + case "FireWorm": + mob = NPCFactory.createFireWorm(health); + break; + case "Skeleton": + mob = NPCFactory.createSkeleton(health); + break; + case "DeflectWizard": + mob = NPCFactory.createDeflectWizard(health); + break; + case "WaterQueen": + mob = NPCFactory.createWaterQueen(health); + break; + //TODO implement when boss is ready +// case "FireBoss": +// mob = MobBossFactory.createDemonBoss(health); +// break; + case "IceBoss": + mob = MobBossFactory.createIceBoss(health); + break; + case "PatrickBoss": + mob = MobBossFactory.createPatrickBoss(health); + break; + default: + mob = NPCFactory.createXenoGrunt(health); + break; + } + + if (entity.contains("Boss")) { + mob.scaleHeight(5f); + mob.scaleWidth(5f); + } else { + mob.setScale(1.5f, 1.5f); + } + spawnEntityAt(mob, randomPos, true, false); + } + + // * TEMPORARY FOR TESTING +// private void spawnSplittingXenoGrunt(int x, int y) { +// GridPoint2 pos = new GridPoint2(x, y); +// Entity xenoGrunt = NPCFactory.createSplittingXenoGrunt(); +// xenoGrunt.setScale(1.5f, 1.5f); +// spawnEntityAt(xenoGrunt, pos, true, true); +// } + + // * TEMPORARY FOR TESTING +// private void spawnDodgingDragonKnight(int x, int y) { +// GridPoint2 pos = new GridPoint2(x, y); +// Entity fireworm = NPCFactory.createDodgingDragonKnight(); +// fireworm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireworm, pos, true, true); +// } +// +// // * TEMPORARY FOR TESTING +// private void spawnDeflectXenoGrunt(int x, int y) { +// GridPoint2 pos = new GridPoint2(x, y); +// Entity xenoGrunt = NPCFactory.createDeflectXenoGrunt(); +// xenoGrunt.setScale(1.5f, 1.5f); +// spawnEntityAt(xenoGrunt, pos, true, true); +// } +// +// private void spawnFireWorm() { +// int[] pickedLanes = random.ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity fireWorm = NPCFactory.createFireWorm(); +// fireWorm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireWorm, randomPos, true, false); +// } +// } +// +// private void spawnSkeleton() { +// int[] pickedLanes = new Random().ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity skeleton = NPCFactory.createSkeleton(); +// skeleton.setScale(1.5f, 1.5f); +// spawnEntityAt(skeleton, randomPos, true, false); +// } +// } + +// private void spawnDragonKnight() { +// int[] pickedLanes = random.ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity fireWorm = NPCFactory.createDragonKnight(); +// fireWorm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireWorm, randomPos, true, false); +// } +// } +// +// private void spawnWizard() { +// int[] pickedLanes = new Random().ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity wizard = NPCFactory.createWizard(); +// wizard.setScale(1.5f, 1.5f); +// spawnEntityAt(wizard, randomPos, true, false); +// } +// } +// +// private void spawnWaterQueen() { +// int[] pickedLanes = new Random().ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity waterQueen = NPCFactory.createWaterQueen(); +// waterQueen.setScale(1.5f, 1.5f); +// spawnEntityAt(waterQueen, randomPos, true, false); +// } +// } +// +// private void spawnWaterSlime() { +// int[] pickedLanes = new Random().ints(1, 7) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity waterSlime = NPCFactory.createWaterSlime(); +// waterSlime.setScale(1.5f, 1.5f); +// spawnEntityAt(waterSlime, randomPos, true, false); +// } +// } + // private void spawnSplittingXenoGrunt(int x, int y) { + // GridPoint2 pos = new GridPoint2(x, y); + // Entity xenoGrunt = NPCFactory.createSplittingXenoGrunt(); + // xenoGrunt.setScale(1.5f, 1.5f); + // spawnEntityAt(xenoGrunt, pos, true, true); + // } + + // * TEMPORARY FOR TESTING +// private void spawnDodgingDragonKnight(int x, int y) { +// GridPoint2 pos = new GridPoint2(x, y); +// Entity fireworm = NPCFactory.createDodgingDragonKnight(); +// fireworm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireworm, pos, true, true); +// } +// +// // * TEMPORARY FOR TESTING +// private void spawnDeflectWizard(int x, int y) { +// GridPoint2 pos = new GridPoint2(x, y); +// Entity xenoGrunt = NPCFactory.createDeflectWizard(); +// xenoGrunt.setScale(1.5f, 1.5f); +// spawnEntityAt(xenoGrunt, pos, true, true); +// } +// +// private void spawnFireWorm() { +// +// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) +// +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity fireWorm = NPCFactory.createFireWorm(); +// fireWorm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireWorm, randomPos, true, false); +// } +// } +// +// private void spawnSkeleton() { +// +// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity skeleton = NPCFactory.createSkeleton(); +// skeleton.setScale(1.5f, 1.5f); +// spawnEntityAt(skeleton, randomPos, true, false); +// } +// } +// +// private void spawnDragonKnight() { +// +// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) +// +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity fireWorm = NPCFactory.createDodgingDragonKnight(); +// fireWorm.setScale(1.5f, 1.5f); +// spawnEntityAt(fireWorm, randomPos, true, false); +// } +// } +// +// private void spawnWizard() { +// +// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) +// +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity wizard = NPCFactory.createDeflectWizard(); +// wizard.setScale(1.5f, 1.5f); +// spawnEntityAt(wizard, randomPos, true, false); +// } +// } +// +// private void spawnWaterQueen() { +// +// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) +// +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity waterQueen = NPCFactory.createWaterQueen(); +// waterQueen.setScale(1.5f, 1.5f); +// spawnEntityAt(waterQueen, randomPos, true, false); +// } +// } +// +// private void spawnWaterSlime() { +// +// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) +// +// .distinct().limit(5).toArray(); +// for (int i = 0; i < NUM_GRUNTS; i++) { +// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); +// Entity waterSlime = NPCFactory.createSplittingWaterSlime(); +// waterSlime.setScale(1.5f, 1.5f); +// spawnEntityAt(waterSlime, randomPos, true, false); +// } +// } + + /** + * Creates multiple projectiles that travel simultaneous. They all have same + * the starting point but different destinations. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param space The space between the projectiles' destination. + * @param speed The speed of the projectiles. + * @param quantity The amount of projectiles to spawn. + */ + private void spawnMultiProjectile(Vector2 position, short targetLayer, int direction, int space, Vector2 speed, int quantity) { + int half = quantity / 2; + for (int i = 0; i < quantity; i++) { + spawnProjectile(position, targetLayer, space * half, direction, speed); + --half; + } + } + + /** + * Returns projectile that can do an area of effect damage + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + * @param effect Type of effect. + * @param aoe Whether it is an aoe projectile. + */ + private void spawnEffectProjectile(Vector2 position, short targetLayer, int direction, Vector2 speed, + ProjectileEffects effect, boolean aoe) { + Entity Projectile = ProjectileFactory.createEffectProjectile(targetLayer, new Vector2(direction, position.y), speed, effect, aoe); + Projectile.setPosition(position); + spawnEntity(Projectile); + } + + /** + * Spawns a pierce fireball. + * Pierce fireball can go through targetlayers without disappearing but damage + * will still be applied. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + */ + private void spawnPierceFireBall(Vector2 position, short targetLayer, int direction, Vector2 speed) { + Entity projectile = ProjectileFactory.createPierceFireBall(targetLayer, new Vector2(direction, position.y), speed); + projectile.setPosition(position); + spawnEntity(projectile); + } + + /** + * Spawns a ricochet fireball + * Ricochet fireballs bounce off targets with a specified maximum count of 3 + * Possible extensions: Make the bounce count flexible with a param. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should head towards. + * @param speed The speed of the projectiles. + */ + private void spawnRicochetFireball(Vector2 position, short targetLayer, int direction, Vector2 speed) { + // Bounce count set to 0. + Entity projectile = ProjectileFactory.createRicochetFireball(targetLayer, new Vector2(direction, position.y), speed, 0); + projectile.setPosition(position); + spawnEntity(projectile); + } + + /** + * Spawns a split firework fireball. + * Splits into mini projectiles that spreads out after collision. + * + * @param position The position of the Entity that's shooting the projectile. + * @param targetLayer The enemy layer of the "shooter". + * @param direction The direction the projectile should towards. + * @param speed The speed of the projectiles. + * @param amount The amount of projectiles appearing after collision. + */ + private void spawnSplitFireWorksFireBall(Vector2 position, short targetLayer, int direction, Vector2 speed, int amount) { + Entity projectile = ProjectileFactory.createSplitFireWorksFireball(targetLayer, new Vector2(direction, position.y), speed, amount); + projectile.setPosition(position); + spawnEntity(projectile); + } + + private void spawnWeaponTower() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); + + for (int i = 0; i < NUM_WEAPON_TOWERS + 7 ; i++) { + GridPoint2 randomPos1 = RandomUtils.random(minPos, maxPos); + GridPoint2 randomPos2 = RandomUtils.random(minPos, maxPos); + Entity wallTower = TowerFactory.createWallTower(); + Entity fireTower = TowerFactory.createFireTower(); + Entity stunTower = TowerFactory.createStunTower(); + spawnEntityAt(fireTower, randomPos1, true, true); + spawnEntityAt(stunTower, randomPos2, true, true); + spawnEntityAt(wallTower, randomPos2, true, true); + } + } + + // * TEMPORARY FOR TESTING + private void spawnFireTowerAt(int x, int y) { + GridPoint2 pos = new GridPoint2(x, y); + Entity fireTower = TowerFactory.createFireTower(); + + spawnEntityAt(fireTower, pos, true, true); + } + private void spawnDroidTowerAt(int x, int y) { + GridPoint2 pos = new GridPoint2(x, y); + Entity droidTower = TowerFactory.createDroidTower(); + + spawnEntityAt(droidTower, pos, true, true); + } + + private void spawnTNTTower() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); + + for (int i = 0; i < NUM_WEAPON_TOWERS + 5; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity weaponTower = TowerFactory.createTNTTower(); + spawnEntityAt(weaponTower, randomPos, true, true); + } + + } + private void spawnFireWorksTower() { + GridPoint2 minPos = new GridPoint2(0, 2); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(1, 1); + + for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity FireWorksTower = TowerFactory.createFireworksTower(); + spawnEntityAt(FireWorksTower, randomPos, true, true); + } + + } + private void spawnPierceTower() { + GridPoint2 minPos = new GridPoint2(0, 2); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(3, 3); + + for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity PierceTower = TowerFactory.createPierceTower(); + spawnEntityAt(PierceTower, randomPos, true, true); + } + + } + private void spawnRicochetTower() { + GridPoint2 minPos = new GridPoint2(0, 2); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(0, 3); + + for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity RicochetTower = TowerFactory.createRicochetTower(); + spawnEntityAt(RicochetTower, randomPos, true, true); + } + + } + + private void spawnBombship() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); + Entity bombship = BombshipFactory.createBombship(); + spawnEntityAt(bombship, minPos, true, true); + } + + private void spawnDroidTower() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); + + for (int i = 0; i < NUM_WEAPON_TOWERS + 5; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity weaponTower = TowerFactory.createDroidTower(); + spawnEntityAt(weaponTower, randomPos, true, false); + } + } + + private void playMusic() { + Music music = ServiceLocator.getResourceService().getAsset(backgroundMusic, Music.class); + music.setLooping(true); + music.setVolume(0.3f); + music.play(); + } + + private void loadAssets() { + logger.debug("Loading assets"); + ResourceService resourceService = ServiceLocator.getResourceService(); + while (!resourceService.loadForMillis(10)) { + // This could be upgraded to a loading screen + logger.info("Loading... {}%", resourceService.getProgress()); + } + } + + private void unloadAssets() { + logger.debug("Unloading assets"); + unloadAllAssets(); + + } + + @Override + public void dispose() { + super.dispose(); + this.unloadAssets(); + stopWaveTimer(); + } + + private void spawnScrap() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(2, 2); + + for (int i = 0; i < 5; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity scrap = DropFactory.createScrapDrop(); + spawnEntityAt(scrap, randomPos, true, false); + } + + for (int i = 0; i < 5; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity crystal = DropFactory.createCrystalDrop(); + spawnEntityAt(crystal, randomPos, true, false); + } + } + + private void spawnIncome() { + GridPoint2 minPos = new GridPoint2(0, 0); + GridPoint2 maxPos = terrain.getMapBounds(0).sub(2, 2); + + for (int i = 0; i < 50; i++) { + GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); + Entity towerfactory = TowerFactory.createIncomeTower(); + spawnEntityAt(towerfactory, randomPos, true, true); + } + } + + /** + * 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(); + spawnEntityAt(scanner, new GridPoint2(0, i), true, true); + } + } + + +} From 867accd2edcf20ed0cc1c155bb69d8b683477835 Mon Sep 17 00:00:00 2001 From: Gaganx0 Date: Sun, 15 Oct 2023 16:23:22 +1000 Subject: [PATCH 4/5] Tutorial clean up and next button --- .../game/screens/HelpScreen/Tutorial.java | 2 + .../HelpScreen/TutorialForestGameArea.java | 564 +----------------- .../screens/HelpScreen/TutorialOkButton.java | 88 +++ 3 files changed, 105 insertions(+), 549 deletions(-) create mode 100644 source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialOkButton.java diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java index 8c8cbd4eb..ca5ab319e 100644 --- a/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/Tutorial.java @@ -31,6 +31,7 @@ import com.csse3200.game.ui.terminal.Terminal; import com.csse3200.game.ui.terminal.TerminalDisplay; import com.csse3200.game.components.maingame.MainGameExitDisplay; +import com.csse3200.game.screens.HelpScreen.TutorialOkButton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -299,6 +300,7 @@ private void createUI() { .addComponent(new MainGameExitDisplay()) .addComponent(new MainGameLoseDisplay()) .addComponent(new MainGamePauseDisplay(this.game)) + .addComponent(new TutorialOkButton(this.game)) .addComponent(new Terminal()) .addComponent(inputComponent) .addComponent(new TerminalDisplay()); diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java index 21a321f54..e52c593a8 100644 --- a/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialForestGameArea.java @@ -1,7 +1,15 @@ package com.csse3200.game.screens.HelpScreen; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +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.ChangeListener; +import com.csse3200.game.GdxGame; import com.csse3200.game.areas.GameArea; import com.csse3200.game.areas.terrain.TerrainFactory; import com.csse3200.game.areas.terrain.TerrainFactory.TerrainType; @@ -43,19 +51,7 @@ /** Forest area for the demo game with trees, a player, and some enemies. */ public class TutorialForestGameArea extends GameArea { - private static final Logger logger = LoggerFactory.getLogger(com.csse3200.game.areas.ForestGameArea.class); - private static final int NUM_BUILDINGS = 4; - private static final int NUM_GHOSTS = 0; - private static final int NUM_GRUNTS = 5; - private static final int NUM_BOSS = 4; - - - private static final int NUM_MOBBOSS2=3; - private static final int NUM_MOBBOSS1=1; - - private SecureRandom rand = new SecureRandom(); - - private int wave = 0; + private static final Logger logger = LoggerFactory.getLogger(com.csse3200.game.screens.HelpScreen.TutorialForestGameArea.class); private Timer waveTimer; private static final int NUM_WEAPON_TOWERS = 3; @@ -65,26 +61,17 @@ public class TutorialForestGameArea extends GameArea { // Required to load assets before using them private static final String backgroundMusic = "sounds/background/Sci-Fi1.ogg"; - - private static final String[] forestMusic = {backgroundMusic}; - private Entity player; + private GdxGame game; private Entity waves; + private Table table; + private Stage stage; + Skin skin = new Skin(Gdx.files.internal("images/ui/buttons/glass.json")); - // 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 Entity mobBoss2; - private Entity mobBoss1; - - /** - * Initialise this ForestGameArea to use the provided TerrainFactory. - * - * @requires terrainFactory != null - */ public TutorialForestGameArea() { super(); } + /** * Add this method to start the wave spawning timer when the game starts. */ @@ -169,6 +156,7 @@ public void create() { // spawnPierceTower(); // spawnRicochetTower(); // spawnBombship(); + } private void displayUI() { @@ -214,103 +202,6 @@ private void spawnTerrain() { } - private Entity spawnPlayer() { - Entity newPlayer = PlayerFactory.createPlayer(); - spawnEntityAt(newPlayer, PLAYER_SPAWN, true, true); - return newPlayer; - } - - // Spawn player at a specific position - private Entity spawnPlayer(GridPoint2 position) { - Entity newPlayer = PlayerFactory.createPlayer(); - spawnEntityAt(newPlayer, position, true, true); - return newPlayer; - } - - // commented 383 - 386 out as there was a missing arg? -// private void spawnDemonBoss() { -// Entity demon = MobBossFactory.createDemonBoss(); -// spawnEntityAt(demon, new GridPoint2(19, 5), true, false); -// } - - private void spawnPatrick() { - Entity patrick = MobBossFactory.createPatrickBoss(3000); - spawnEntityAt(patrick, new GridPoint2(18, 5), true, false); - } - - private void spawnPatrickDeath() { - Entity patrickDeath = MobBossFactory.patrickDead(); - spawnEntityAt(patrickDeath, new GridPoint2(18, 5), true, false); - } - // commented 398 - 401 out as there was a missing arg? -// private void spawnIceBaby() { -// Entity iceBaby = MobBossFactory.createIceBoss(); -// spawnEntityAt(iceBaby, new GridPoint2(19, 5), true, false); -// } - -// private void spawnDemonBoss() { -// Entity demon = MobBossFactory.createDemonBoss(); -// spawnEntityAt(demon, new GridPoint2(19, 5), true, false); -// } - -// private void spawnPatrick() { -// Entity patrick = MobBossFactory.createPatrickBoss(3000); -// spawnEntityAt(patrick, new GridPoint2(18, 5), true, false); -// } -// -// private void spawnPatrickDeath() { -// Entity patrickDeath = MobBossFactory.patrickDead(); -// spawnEntityAt(patrickDeath, new GridPoint2(18, 5), true, false); -// } -// -// private void spawnIceBaby() { -// Entity iceBaby = MobBossFactory.createIceBoss(); -// spawnEntityAt(iceBaby, new GridPoint2(19, 5), true, false); -// } - - /** - * Spawns a projectile that only heads towards the enemies in its lane. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - */ - private void spawnProjectile(Vector2 position, short targetLayer, int direction, Vector2 speed) { - Entity Projectile = ProjectileFactory.createFireBall(targetLayer, new Vector2(direction, position.y), speed); - Projectile.setPosition(position); - spawnEntity(Projectile); - } - - /** - * Spawns a projectile specifically for general mobs/xenohunters - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - */ - private void spawnProjectileTest(Vector2 position, short targetLayer, int direction, Vector2 speed) { - Entity Projectile = ProjectileFactory.createEngineerBullet(targetLayer, new Vector2(direction, position.y), speed); - Projectile.setPosition(position); - spawnEntity(Projectile); - } - - /** - * Spawns a projectile to be used for multiple projectile function. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param space The space between the projectiles' destination. - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - */ - private void spawnProjectile(Vector2 position, short targetLayer, int space, int direction, Vector2 speed) { - Entity Projectile = ProjectileFactory.createFireBall(targetLayer, new Vector2(direction, position.y + space), speed); - Projectile.setPosition(position); - spawnEntity(Projectile); - } - /** * Spawn an entity on the map. Is called during a wave. Add cases here for each mob type * @param entity mob to be spawned @@ -319,425 +210,11 @@ private void spawnProjectile(Vector2 position, short targetLayer, int space, int */ public void spawnMob(String entity, GridPoint2 randomPos, int health) { Entity mob; - switch (entity) { - case "Xeno": - mob = NPCFactory.createXenoGrunt(health); - break; - case "SplittingWaterSlime": - mob = NPCFactory.createSplittingWaterSlime(health); - break; - case "DodgingDragon": - mob = NPCFactory.createDodgingDragonKnight(health); - break; - case "FireWorm": - mob = NPCFactory.createFireWorm(health); - break; - case "Skeleton": - mob = NPCFactory.createSkeleton(health); - break; - case "DeflectWizard": - mob = NPCFactory.createDeflectWizard(health); - break; - case "WaterQueen": mob = NPCFactory.createWaterQueen(health); - break; - //TODO implement when boss is ready -// case "FireBoss": -// mob = MobBossFactory.createDemonBoss(health); -// break; - case "IceBoss": - mob = MobBossFactory.createIceBoss(health); - break; - case "PatrickBoss": - mob = MobBossFactory.createPatrickBoss(health); - break; - default: - mob = NPCFactory.createXenoGrunt(health); - break; - } - - if (entity.contains("Boss")) { - mob.scaleHeight(5f); - mob.scaleWidth(5f); - } else { mob.setScale(1.5f, 1.5f); - } spawnEntityAt(mob, randomPos, true, false); } - // * TEMPORARY FOR TESTING -// private void spawnSplittingXenoGrunt(int x, int y) { -// GridPoint2 pos = new GridPoint2(x, y); -// Entity xenoGrunt = NPCFactory.createSplittingXenoGrunt(); -// xenoGrunt.setScale(1.5f, 1.5f); -// spawnEntityAt(xenoGrunt, pos, true, true); -// } - - // * TEMPORARY FOR TESTING -// private void spawnDodgingDragonKnight(int x, int y) { -// GridPoint2 pos = new GridPoint2(x, y); -// Entity fireworm = NPCFactory.createDodgingDragonKnight(); -// fireworm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireworm, pos, true, true); -// } -// -// // * TEMPORARY FOR TESTING -// private void spawnDeflectXenoGrunt(int x, int y) { -// GridPoint2 pos = new GridPoint2(x, y); -// Entity xenoGrunt = NPCFactory.createDeflectXenoGrunt(); -// xenoGrunt.setScale(1.5f, 1.5f); -// spawnEntityAt(xenoGrunt, pos, true, true); -// } -// -// private void spawnFireWorm() { -// int[] pickedLanes = random.ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity fireWorm = NPCFactory.createFireWorm(); -// fireWorm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireWorm, randomPos, true, false); -// } -// } -// -// private void spawnSkeleton() { -// int[] pickedLanes = new Random().ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity skeleton = NPCFactory.createSkeleton(); -// skeleton.setScale(1.5f, 1.5f); -// spawnEntityAt(skeleton, randomPos, true, false); -// } -// } - -// private void spawnDragonKnight() { -// int[] pickedLanes = random.ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity fireWorm = NPCFactory.createDragonKnight(); -// fireWorm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireWorm, randomPos, true, false); -// } -// } -// -// private void spawnWizard() { -// int[] pickedLanes = new Random().ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity wizard = NPCFactory.createWizard(); -// wizard.setScale(1.5f, 1.5f); -// spawnEntityAt(wizard, randomPos, true, false); -// } -// } -// -// private void spawnWaterQueen() { -// int[] pickedLanes = new Random().ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity waterQueen = NPCFactory.createWaterQueen(); -// waterQueen.setScale(1.5f, 1.5f); -// spawnEntityAt(waterQueen, randomPos, true, false); -// } -// } -// -// private void spawnWaterSlime() { -// int[] pickedLanes = new Random().ints(1, 7) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity waterSlime = NPCFactory.createWaterSlime(); -// waterSlime.setScale(1.5f, 1.5f); -// spawnEntityAt(waterSlime, randomPos, true, false); -// } -// } - // private void spawnSplittingXenoGrunt(int x, int y) { - // GridPoint2 pos = new GridPoint2(x, y); - // Entity xenoGrunt = NPCFactory.createSplittingXenoGrunt(); - // xenoGrunt.setScale(1.5f, 1.5f); - // spawnEntityAt(xenoGrunt, pos, true, true); - // } - - // * TEMPORARY FOR TESTING -// private void spawnDodgingDragonKnight(int x, int y) { -// GridPoint2 pos = new GridPoint2(x, y); -// Entity fireworm = NPCFactory.createDodgingDragonKnight(); -// fireworm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireworm, pos, true, true); -// } -// -// // * TEMPORARY FOR TESTING -// private void spawnDeflectWizard(int x, int y) { -// GridPoint2 pos = new GridPoint2(x, y); -// Entity xenoGrunt = NPCFactory.createDeflectWizard(); -// xenoGrunt.setScale(1.5f, 1.5f); -// spawnEntityAt(xenoGrunt, pos, true, true); -// } -// -// private void spawnFireWorm() { -// -// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) -// -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity fireWorm = NPCFactory.createFireWorm(); -// fireWorm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireWorm, randomPos, true, false); -// } -// } -// -// private void spawnSkeleton() { -// -// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity skeleton = NPCFactory.createSkeleton(); -// skeleton.setScale(1.5f, 1.5f); -// spawnEntityAt(skeleton, randomPos, true, false); -// } -// } -// -// private void spawnDragonKnight() { -// -// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) -// -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity fireWorm = NPCFactory.createDodgingDragonKnight(); -// fireWorm.setScale(1.5f, 1.5f); -// spawnEntityAt(fireWorm, randomPos, true, false); -// } -// } -// -// private void spawnWizard() { -// -// int[] pickedLanes = rand.ints(0, ServiceLocator.getMapService().getHeight() ) -// -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity wizard = NPCFactory.createDeflectWizard(); -// wizard.setScale(1.5f, 1.5f); -// spawnEntityAt(wizard, randomPos, true, false); -// } -// } -// -// private void spawnWaterQueen() { -// -// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) -// -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity waterQueen = NPCFactory.createWaterQueen(); -// waterQueen.setScale(1.5f, 1.5f); -// spawnEntityAt(waterQueen, randomPos, true, false); -// } -// } -// -// private void spawnWaterSlime() { -// -// int[] pickedLanes = new Random().ints(0, ServiceLocator.getMapService().getHeight() ) -// -// .distinct().limit(5).toArray(); -// for (int i = 0; i < NUM_GRUNTS; i++) { -// GridPoint2 randomPos = new GridPoint2(19, pickedLanes[i]); -// Entity waterSlime = NPCFactory.createSplittingWaterSlime(); -// waterSlime.setScale(1.5f, 1.5f); -// spawnEntityAt(waterSlime, randomPos, true, false); -// } -// } - - /** - * Creates multiple projectiles that travel simultaneous. They all have same - * the starting point but different destinations. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param space The space between the projectiles' destination. - * @param speed The speed of the projectiles. - * @param quantity The amount of projectiles to spawn. - */ - private void spawnMultiProjectile(Vector2 position, short targetLayer, int direction, int space, Vector2 speed, int quantity) { - int half = quantity / 2; - for (int i = 0; i < quantity; i++) { - spawnProjectile(position, targetLayer, space * half, direction, speed); - --half; - } - } - - /** - * Returns projectile that can do an area of effect damage - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - * @param effect Type of effect. - * @param aoe Whether it is an aoe projectile. - */ - private void spawnEffectProjectile(Vector2 position, short targetLayer, int direction, Vector2 speed, - ProjectileEffects effect, boolean aoe) { - Entity Projectile = ProjectileFactory.createEffectProjectile(targetLayer, new Vector2(direction, position.y), speed, effect, aoe); - Projectile.setPosition(position); - spawnEntity(Projectile); - } - - /** - * Spawns a pierce fireball. - * Pierce fireball can go through targetlayers without disappearing but damage - * will still be applied. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - */ - private void spawnPierceFireBall(Vector2 position, short targetLayer, int direction, Vector2 speed) { - Entity projectile = ProjectileFactory.createPierceFireBall(targetLayer, new Vector2(direction, position.y), speed); - projectile.setPosition(position); - spawnEntity(projectile); - } - - /** - * Spawns a ricochet fireball - * Ricochet fireballs bounce off targets with a specified maximum count of 3 - * Possible extensions: Make the bounce count flexible with a param. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should head towards. - * @param speed The speed of the projectiles. - */ - private void spawnRicochetFireball(Vector2 position, short targetLayer, int direction, Vector2 speed) { - // Bounce count set to 0. - Entity projectile = ProjectileFactory.createRicochetFireball(targetLayer, new Vector2(direction, position.y), speed, 0); - projectile.setPosition(position); - spawnEntity(projectile); - } - - /** - * Spawns a split firework fireball. - * Splits into mini projectiles that spreads out after collision. - * - * @param position The position of the Entity that's shooting the projectile. - * @param targetLayer The enemy layer of the "shooter". - * @param direction The direction the projectile should towards. - * @param speed The speed of the projectiles. - * @param amount The amount of projectiles appearing after collision. - */ - private void spawnSplitFireWorksFireBall(Vector2 position, short targetLayer, int direction, Vector2 speed, int amount) { - Entity projectile = ProjectileFactory.createSplitFireWorksFireball(targetLayer, new Vector2(direction, position.y), speed, amount); - projectile.setPosition(position); - spawnEntity(projectile); - } - - private void spawnWeaponTower() { - GridPoint2 minPos = new GridPoint2(0, 0); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); - - for (int i = 0; i < NUM_WEAPON_TOWERS + 7 ; i++) { - GridPoint2 randomPos1 = RandomUtils.random(minPos, maxPos); - GridPoint2 randomPos2 = RandomUtils.random(minPos, maxPos); - Entity wallTower = TowerFactory.createWallTower(); - Entity fireTower = TowerFactory.createFireTower(); - Entity stunTower = TowerFactory.createStunTower(); - spawnEntityAt(fireTower, randomPos1, true, true); - spawnEntityAt(stunTower, randomPos2, true, true); - spawnEntityAt(wallTower, randomPos2, true, true); - } - } - - // * TEMPORARY FOR TESTING - private void spawnFireTowerAt(int x, int y) { - GridPoint2 pos = new GridPoint2(x, y); - Entity fireTower = TowerFactory.createFireTower(); - - spawnEntityAt(fireTower, pos, true, true); - } - private void spawnDroidTowerAt(int x, int y) { - GridPoint2 pos = new GridPoint2(x, y); - Entity droidTower = TowerFactory.createDroidTower(); - - spawnEntityAt(droidTower, pos, true, true); - } - - private void spawnTNTTower() { - GridPoint2 minPos = new GridPoint2(0, 0); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); - - for (int i = 0; i < NUM_WEAPON_TOWERS + 5; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity weaponTower = TowerFactory.createTNTTower(); - spawnEntityAt(weaponTower, randomPos, true, true); - } - - } - private void spawnFireWorksTower() { - GridPoint2 minPos = new GridPoint2(0, 2); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(1, 1); - - for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity FireWorksTower = TowerFactory.createFireworksTower(); - spawnEntityAt(FireWorksTower, randomPos, true, true); - } - - } - private void spawnPierceTower() { - GridPoint2 minPos = new GridPoint2(0, 2); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(3, 3); - - for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity PierceTower = TowerFactory.createPierceTower(); - spawnEntityAt(PierceTower, randomPos, true, true); - } - - } - private void spawnRicochetTower() { - GridPoint2 minPos = new GridPoint2(0, 2); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(0, 3); - - for (int i = 0; i < NUM_WEAPON_TOWERS; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity RicochetTower = TowerFactory.createRicochetTower(); - spawnEntityAt(RicochetTower, randomPos, true, true); - } - - } - - private void spawnBombship() { - GridPoint2 minPos = new GridPoint2(0, 0); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); - Entity bombship = BombshipFactory.createBombship(); - spawnEntityAt(bombship, minPos, true, true); - } - - private void spawnDroidTower() { - GridPoint2 minPos = new GridPoint2(0, 0); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(5, 1); - - for (int i = 0; i < NUM_WEAPON_TOWERS + 5; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity weaponTower = TowerFactory.createDroidTower(); - spawnEntityAt(weaponTower, randomPos, true, false); - } - } - - private void playMusic() { - Music music = ServiceLocator.getResourceService().getAsset(backgroundMusic, Music.class); - music.setLooping(true); - music.setVolume(0.3f); - music.play(); - } private void loadAssets() { logger.debug("Loading assets"); @@ -778,17 +255,6 @@ private void spawnScrap() { } } - private void spawnIncome() { - GridPoint2 minPos = new GridPoint2(0, 0); - GridPoint2 maxPos = terrain.getMapBounds(0).sub(2, 2); - - for (int i = 0; i < 50; i++) { - GridPoint2 randomPos = RandomUtils.random(minPos, maxPos); - Entity towerfactory = TowerFactory.createIncomeTower(); - spawnEntityAt(towerfactory, randomPos, true, true); - } - } - /** * Creates the scanners (one per lane) that detect absence of towers and presence of mobs, * and trigger engineer spawning diff --git a/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialOkButton.java b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialOkButton.java new file mode 100644 index 000000000..918d977d5 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/screens/HelpScreen/TutorialOkButton.java @@ -0,0 +1,88 @@ +package com.csse3200.game.screens.HelpScreen; + +import com.badlogic.gdx.audio.Sound; +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.GdxGame; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.PauseMenuFactory; +import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ui.UIComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Displays a button to pause the game and bring up a pause menu. + */ +public class TutorialOkButton extends UIComponent { + private static final Logger logger = LoggerFactory.getLogger(TutorialOkButton.class); + private static final float Z_INDEX = 2f; + private Table table; + private GdxGame game; + private final String[] sounds = { + "sounds/ui/Open_Close/NA_SFUI_Vol1_Open_01.ogg" + }; + private Sound openSound; + + + public TutorialOkButton(GdxGame screenSwitchHandle) { + game = screenSwitchHandle; + } + + @Override + public void create() { + super.create(); + addActors(); + loadSounds(); + } + + private void addActors() { + table = new Table(); + table.top().right(); + table.setFillParent(true); + + TextButton mainMenuBtn = new TextButton("ok", skin); + + // Spawns a pause menu when the button is pressed. + mainMenuBtn.addListener( + new ChangeListener() { + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + logger.debug("ok button clicked"); + openSound.play(0.4f); +// PauseMenuFactory.createPauseMenu(game, false); + PauseMenuFactory.createPauseMenu(game); + + } + }); + + table.add(mainMenuBtn).padLeft(100f); + + 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(); + } + + public void loadSounds() { + ServiceLocator.getResourceService().loadSounds(sounds); + ServiceLocator.getResourceService().loadAll(); + openSound = ServiceLocator.getResourceService().getAsset(sounds[0], Sound.class); + } +} From 9b3cb8ac2e2337bb50be75bf857ea4867453d519 Mon Sep 17 00:00:00 2001 From: Gaganx0 Date: Sun, 15 Oct 2023 16:33:33 +1000 Subject: [PATCH 5/5] merge error fixed --- source/core/src/main/com/csse3200/game/GdxGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/src/main/com/csse3200/game/GdxGame.java b/source/core/src/main/com/csse3200/game/GdxGame.java index a431bdfd5..4764a5aa0 100644 --- a/source/core/src/main/com/csse3200/game/GdxGame.java +++ b/source/core/src/main/com/csse3200/game/GdxGame.java @@ -80,7 +80,7 @@ private Screen newScreen(ScreenType screenType) { case HELP_BOSS_SCREEN -> new BossDescriptionHelpScreen(this); case HOW_TO_PLAY -> new HowToPlay(this); case LOAD_SCREEN -> new LoadingScreen(this); - case TUTORIAL_SCREEN:new Tutorial(this); + case TUTORIAL_SCREEN-> new Tutorial(this); default-> null; }; }