diff --git a/source/core/assets/images/economy/crystalBanner.png b/source/core/assets/images/economy/crystalBanner.png new file mode 100644 index 000000000..e5bfb26da Binary files /dev/null and b/source/core/assets/images/economy/crystalBanner.png differ diff --git a/source/core/assets/images/economy/crystalUI.png b/source/core/assets/images/economy/crystalUI.png deleted file mode 100644 index f2c0d4ddf..000000000 Binary files a/source/core/assets/images/economy/crystalUI.png and /dev/null differ diff --git a/source/core/assets/images/economy/scrapBanner.png b/source/core/assets/images/economy/scrapBanner.png new file mode 100644 index 000000000..8e2835190 Binary files /dev/null and b/source/core/assets/images/economy/scrapBanner.png differ diff --git a/source/core/assets/images/economy/scrapsUI.png b/source/core/assets/images/economy/scrapsUI.png deleted file mode 100644 index 35e24df68..000000000 Binary files a/source/core/assets/images/economy/scrapsUI.png and /dev/null differ diff --git a/source/core/assets/images/engineers/engineerBanner.png b/source/core/assets/images/engineers/engineerBanner.png new file mode 100644 index 000000000..f689a8fef Binary files /dev/null and b/source/core/assets/images/engineers/engineerBanner.png differ 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 000000000..52ca41115 Binary files /dev/null and b/source/core/assets/images/lose-screen/desktop-wallpaper-simple-stars-video-background-loop-black-and-white-aesthetic-space.jpg differ 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 000000000..52ca41115 Binary files /dev/null and b/source/core/assets/images/lose-screen/lose-bg.jpg differ 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/areas/ForestGameArea.java b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java index d45c99dda..390516eaa 100644 --- a/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java +++ b/source/core/src/main/com/csse3200/game/areas/ForestGameArea.java @@ -4,15 +4,12 @@ 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.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; @@ -31,30 +28,15 @@ /** 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; - - 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", @@ -94,26 +76,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", @@ -136,7 +111,6 @@ public class ForestGameArea extends GameArea { "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 +132,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,27 +166,24 @@ 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(); - + spawnScrap(); + spawnIncome(); spawnGhosts(); spawnWeaponTower(); spawnTNTTower(); spawnDroidTower(); spawnGapScanners(); spawnIncome(); -// bossKing1 = spawnBossKing1(); - bossKing2 = spawnBossKing2(); - - + bossKing2 = spawnBossKing2(); } 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); } @@ -231,8 +200,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 @@ -266,17 +233,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); @@ -358,22 +314,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() { int[] pickedLanes = new Random().ints(1, 7) .distinct().limit(5).toArray(); @@ -386,18 +326,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); @@ -509,14 +437,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); } } @@ -611,6 +536,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(); @@ -623,23 +552,4 @@ private void spawnGapScanners() { // Entity engineer = EngineerFactory.createEngineer(); // spawnEntityAt(engineer, randomPos, 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 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/gamearea/CurrencyDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/CurrencyDisplay.java index 178cd11ff..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 @@ -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; @@ -44,43 +48,34 @@ private void addActors() { table = new Table(); table.top().left(); table.setFillParent(true); - table.padTop(50f).padLeft(20f); - - // create scraps text button style - Drawable scrapDrawable = new TextureRegionDrawable(new TextureRegion(new Texture("images/economy/scrapsUI.png"))); - TextButton.TextButtonStyle scrapStyle = new TextButton.TextButtonStyle( - scrapDrawable, scrapDrawable, scrapDrawable, new BitmapFont()); - - // create scraps button - String scrapText = String.format("%d", ServiceLocator.getCurrencyService().getScrap().getAmount()); - scrapsTb = new TextButton(scrapText, scrapStyle); - scrapsTb.setDisabled(true); - scrapsTb.getLabel().setAlignment(Align.right); - scrapsTb.getLabel().setFontScale(2, 2); // font size - scrapsTb.pad(0, 0, 0, 70); - scrapsTb.setTransform(true); - scrapsTb.setScale(0.5f); // button size - - // create crystals text button style - Drawable crystalDrawable = new TextureRegionDrawable(new TextureRegion(new Texture("images/economy/crystalUI.png"))); - TextButton.TextButtonStyle crystalStyle = new TextButton.TextButtonStyle( - crystalDrawable, crystalDrawable,crystalDrawable, new BitmapFont()); - - // create crystals button - String crystalText = String.format("%d", ServiceLocator.getCurrencyService().getCrystal().getAmount()); - crystalsTb = new TextButton(crystalText, crystalStyle); - crystalsTb.setDisabled(true); - crystalsTb.getLabel().setAlignment(Align.right); - crystalsTb.getLabel().setFontScale(2, 2); // font size - crystalsTb.pad(0, 0, 0, 70); - crystalsTb.setTransform(true); - crystalsTb.setScale(0.5f); // button size - - table.add(scrapsTb); - table.add(crystalsTb); + table.padTop(140f).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).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); } + private TextButton createButton(String imageFilePath, int value) { + Drawable drawable = new TextureRegionDrawable(new TextureRegion(new Texture(imageFilePath))); + TextButton.TextButtonStyle style = new TextButton.TextButtonStyle( + drawable, drawable, drawable, new BitmapFont()); + + // create button + TextButton tb = new TextButton(String.format("%d", value), style); + tb.setDisabled(true); + tb.getLabel().setAlignment(Align.right); + + tb.pad(0, 0, 0, 50); + tb.setTransform(true); + + return tb; + } + @Override public void draw(SpriteBatch batch) { // handled by stage @@ -108,19 +103,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/gamearea/EngineerCountDisplay.java b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java new file mode 100644 index 000000000..39e849574 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/components/gamearea/EngineerCountDisplay.java @@ -0,0 +1,70 @@ +package com.csse3200.game.components.gamearea; + +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.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 engineer count display + * 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, 50); + engineerTb.setTransform(true); + + table.add(engineerTb).width(engineerTb.getWidth() * 0.5f).height(engineerTb.getHeight() * 0.5f); + 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); + } + + @Override + protected void draw(SpriteBatch batch) { + // handled by stage + } + + @Override + public void dispose() { + super.dispose(); + engineerTb.remove(); + } +} 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/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/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 b801379ca..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 @@ -9,8 +9,7 @@ import com.csse3200.game.physics.components.ColliderComponent; import com.csse3200.game.physics.components.HitboxComponent; import com.csse3200.game.rendering.AnimationRenderComponent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.csse3200.game.services.ServiceLocator; /** * HumanWanderTask is the entry point for the engineer entity's behaviour. Instantiates subtasks HumanWaitTask, @@ -18,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; @@ -61,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(); @@ -74,6 +71,8 @@ public void start() { combatTask.start(); currentTask = movementTask; + + animator = owner.getEntity().getComponent(AnimationRenderComponent.class); } /** @@ -86,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); - // TODO: make the appropriate calls to decrement the human count. + // 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) @@ -169,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; - } } 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 cf6e110a6..9fe31184b 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 @@ -129,9 +129,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/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 cebd5352c..e3cb512b0 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; @@ -32,10 +33,8 @@ 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.UIComponent; import com.csse3200.game.ui.terminal.Terminal; import com.csse3200.game.ui.terminal.TerminalDisplay; import com.csse3200.game.components.maingame.MainGameExitDisplay; @@ -61,13 +60,13 @@ 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; public static int viewportHeight= screenHeight; - private OrthographicCamera camera; private SpriteBatch batch; @@ -100,6 +99,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); @@ -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(); @@ -115,18 +117,21 @@ public MainGameScreen(GdxGame game) { ForestGameArea forestGameArea = new ForestGameArea(terrainFactory); forestGameArea.create(); } - @Override 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); batch.end(); - renderer.render(); stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f)); stage.draw(); @@ -189,11 +194,12 @@ 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)) .addComponent(new MainGameExitDisplay()) + .addComponent(new MainGameLoseDisplay()) .addComponent(new Terminal()) .addComponent(inputComponent) .addComponent(new TerminalDisplay()); 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..8b853343a --- /dev/null +++ b/source/core/src/main/com/csse3200/game/services/GameEndService.java @@ -0,0 +1,67 @@ +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; + + /** + * Constructor for the Game End Service + */ + public GameEndService() { + this.engineerCount = 5; + 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) { + if (newLimit > 0) { + engineerCount = newLimit; + } + } + + /** + * 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(); + + if (engineerCount == 0) { + gameOver = true; + } + } + + /** + * 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; + } +} 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() { 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 b8ec04420..000000000 Binary files a/source/wiki/team-2/EngineerFactory Sequence Diagram.png and /dev/null differ diff --git a/source/wiki/team-2/EngineerFactory Sequence Diagram.svg b/source/wiki/team-2/EngineerFactory Sequence Diagram.svg deleted file mode 100644 index 42ee4e04b..000000000 --- a/source/wiki/team-2/EngineerFactory Sequence Diagram.svg +++ /dev/null @@ -1,210 +0,0 @@ - - - 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 000000000..55ca66c2e Binary files /dev/null and b/source/wiki/team-2/GameEndServiceSequenceDiagram.png differ diff --git a/source/wiki/team-2/GameEndServiceUML.png b/source/wiki/team-2/GameEndServiceUML.png new file mode 100644 index 000000000..9fc33c803 Binary files /dev/null and b/source/wiki/team-2/GameEndServiceUML.png differ diff --git a/source/wiki/team-2/GapScannerFactory UML.png b/source/wiki/team-2/GapScannerFactory UML.png new file mode 100644 index 000000000..9230a3e5a Binary files /dev/null and b/source/wiki/team-2/GapScannerFactory UML.png differ 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