From d4426b8b3c29c6693549cf1541b086a6dfa56a0c Mon Sep 17 00:00:00 2001 From: josua Date: Sat, 21 Sep 2019 12:54:26 +1000 Subject: [PATCH] Created a functional boss fight --- src/shootergame/display/bossbar/BossBars.java | 2 +- src/shootergame/entity/EntityBoss.java | 11 ++- .../entity/EntityGrapplingHook.java | 4 +- .../entity/player/EntityPlayer.java | 2 +- src/shootergame/init/Layers.java | 5 +- src/shootergame/init/Tiles.java | 2 + src/shootergame/items/ItemGrapplingHook.java | 3 - src/shootergame/tiles/TileBossPortal.java | 85 +++++++++++++++++++ src/shootergame/world/layer/Layer.java | 1 - .../layer/layergen/LayerGenBossArena.java | 5 +- .../layer/layergen/LayerGenLavaCaves.java | 15 ++++ .../layer/layergen/PortalSpawnrates.java | 8 +- 12 files changed, 123 insertions(+), 20 deletions(-) create mode 100644 src/shootergame/tiles/TileBossPortal.java diff --git a/src/shootergame/display/bossbar/BossBars.java b/src/shootergame/display/bossbar/BossBars.java index dace10f..b04ab28 100644 --- a/src/shootergame/display/bossbar/BossBars.java +++ b/src/shootergame/display/bossbar/BossBars.java @@ -47,7 +47,7 @@ public class BossBars } for(IBossBar bossbar : toRemove) { - bossbars.remove(toRemove); + bossbars.remove(bossbar); } } } diff --git a/src/shootergame/entity/EntityBoss.java b/src/shootergame/entity/EntityBoss.java index 0dc0512..ea40b74 100644 --- a/src/shootergame/entity/EntityBoss.java +++ b/src/shootergame/entity/EntityBoss.java @@ -42,12 +42,6 @@ public class EntityBoss extends EntityVertical implements IBossBar this.noise_walk = new OpenSimplexNoise(rand.nextLong()); this.noise_spawn = new OpenSimplexNoise(rand.nextLong()); - Main.player.gun_level = 4; - Main.player.defence_level = 4; - Main.player.getInventory().setItem(new ItemStack(Items.HEALTH_POTION, 100, (byte)50), 0); - Main.player.getInventory().setItem(new ItemStack(Items.TNT, 100, (byte)10), 1); - Main.player.getInventory().setItem(new ItemStack(Items.GRAPPLING_HOOK, 100, (byte)2), 2); - BossBars.register(this); } @@ -223,4 +217,9 @@ public class EntityBoss extends EntityVertical implements IBossBar Items.AMMO, RandomHelpers.randrange(rand, 200), (byte)50))); layer.spawnEntity(new EntityItem(pos.copy(), new ItemStack(Items.GRAPPLING_HOOK, 1, (byte)2))); } + + @Override + public void push(double amount, double angle) { + super.push(amount, angle / 10.0); + } } diff --git a/src/shootergame/entity/EntityGrapplingHook.java b/src/shootergame/entity/EntityGrapplingHook.java index afe761f..f65da13 100644 --- a/src/shootergame/entity/EntityGrapplingHook.java +++ b/src/shootergame/entity/EntityGrapplingHook.java @@ -61,8 +61,8 @@ public class EntityGrapplingHook extends EntityVertical } - if(layer instanceof LayerGenRememberPlayerPos) { - LayerGenRememberPlayerPos lgrpp = (LayerGenRememberPlayerPos)layer; + if(layer.layergen instanceof LayerGenRememberPlayerPos) { + LayerGenRememberPlayerPos lgrpp = (LayerGenRememberPlayerPos)layer.layergen; entity.pos = lgrpp.getPlayerPos(); } diff --git a/src/shootergame/entity/player/EntityPlayer.java b/src/shootergame/entity/player/EntityPlayer.java index 144d8ff..2c91afa 100644 --- a/src/shootergame/entity/player/EntityPlayer.java +++ b/src/shootergame/entity/player/EntityPlayer.java @@ -186,7 +186,7 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI int d = (int)(1 + gun_level / 4.0); int b = (int)(1 + gun_level / 4.0); Main.world.getLayer().spawnEntity(new EntityBullet(pos.copy(), this, angle + this.angle, - 20*d*d, 5/b, 60)); + 20*d*d, 5/b, 60).withHeight(0, height)); } } diff --git a/src/shootergame/init/Layers.java b/src/shootergame/init/Layers.java index 86c7587..97fc396 100644 --- a/src/shootergame/init/Layers.java +++ b/src/shootergame/init/Layers.java @@ -4,11 +4,10 @@ import java.util.ArrayList; import java.util.Random; import shootergame.Main; -import shootergame.util.math.vec.Vec2d; import shootergame.world.World; import shootergame.world.layer.Layer; -import shootergame.world.layer.layergen.LayerGenBossArena; import shootergame.world.layer.layergen.LayerGenCaves; +import shootergame.world.layer.layergen.LayerGenEarth; import shootergame.world.layer.layergen.LayerGenLavaCaves; public class Layers @@ -18,7 +17,7 @@ public class Layers public static void init(long seed) { // Create all the layers - EARTH = new Layer(new Random(seed), new LayerGenBossArena(), 0); + EARTH = new Layer(new Random(seed), new LayerGenEarth(), 0); CAVES = new Layer(new Random(seed), new LayerGenCaves(), 1); LAVA_CAVES = new Layer(new Random(seed), new LayerGenLavaCaves(), 2); diff --git a/src/shootergame/init/Tiles.java b/src/shootergame/init/Tiles.java index 5d160d7..0e2313d 100644 --- a/src/shootergame/init/Tiles.java +++ b/src/shootergame/init/Tiles.java @@ -1,6 +1,7 @@ package shootergame.init; import shootergame.tiles.Tile; +import shootergame.tiles.TileBossPortal; import shootergame.tiles.TileChest; import shootergame.tiles.TileDirt; import shootergame.tiles.TileFire; @@ -42,4 +43,5 @@ public class Tiles public static final Tile CHEST = new TileChest("chest"); public static final Tile LANTERN = new TileLantern("lantern"); public static final Tile WALL_UNBREAKABLE = new TileWallUnbreakable("wall_unbreakable"); + public static final Tile BOSS_PORTAL = new TileBossPortal("boss_portal"); } diff --git a/src/shootergame/items/ItemGrapplingHook.java b/src/shootergame/items/ItemGrapplingHook.java index 7b3ed68..cad3fc4 100644 --- a/src/shootergame/items/ItemGrapplingHook.java +++ b/src/shootergame/items/ItemGrapplingHook.java @@ -1,14 +1,11 @@ package shootergame.items; -import shootergame.Main; import shootergame.entity.Entity; import shootergame.entity.EntityGrapplingHook; -import shootergame.init.Layers; import shootergame.init.Textures; import shootergame.util.math.ItemStack; import shootergame.util.math.MathHelpers; import shootergame.util.math.vec.Vec2d; -import shootergame.world.World; import shootergame.world.chunk.Chunk; import shootergame.world.layer.Layer; diff --git a/src/shootergame/tiles/TileBossPortal.java b/src/shootergame/tiles/TileBossPortal.java new file mode 100644 index 0000000..0f25503 --- /dev/null +++ b/src/shootergame/tiles/TileBossPortal.java @@ -0,0 +1,85 @@ +package shootergame.tiles; + +import java.util.Random; + +import mainloop.task.IMainloopTask; +import shootergame.Main; +import shootergame.entity.Entity; +import shootergame.entity.player.EntityPlayer; +import shootergame.init.Textures; +import shootergame.util.math.TileState; +import shootergame.util.math.vec.Vec2d; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.chunk.ChunkEventHandler; +import shootergame.world.layer.Layer; +import shootergame.world.layer.layergen.LayerGenBossArena; + +public class TileBossPortal extends TileVertical +{ + private static Random rand = new Random(); + + public TileBossPortal(String id) { + super(id, Textures.TILE_BOSS_PORTAL, new Vec2d(2, 2)); + + this.emitsLight = true; + this.opaqueTile = true; + this.tileHitbox = 0.4; + this.tileSolid = true; + } + + @Override + public double getLightLevel(TileState state, Vec2i pos) { + return 0.6; + } + + @Override + public void onActivated(Layer layer, Vec2i tpos, Entity entity, TileState state) { + super.onActivated(layer, tpos, entity, state); + + if(entity instanceof EntityPlayer) + { + // Get the player and set some player variables + EntityPlayer ep = (EntityPlayer)entity; + ep.height = 8; + + // Create the boss arena + LayerGenBossArena layergen = new LayerGenBossArena(); + layergen.spawnPlayer(ep); + layer.breakFrontTile(tpos); + Main.world.setLayer(new Layer(rand, layergen, rand.nextInt())); + + // Do the arena falling animation + Main.mainloop.register(new IMainloopTask() + { + int stage = 0; + + @Override + public void MainLoopUpdate() + { + if(stage == 0) + { + // Only do this if the world is loaded + if(ChunkEventHandler.loaded) + { + ep.height -= 0.05; + if(ep.height <= 0) { + ep.height = 0; + } + } + } + } + + @Override + public boolean MainLoopRepeat() { + return ep.height > 0; + } + + @Override + public boolean MainLoopDelay(long millis) { + return millis > 10; + } + }); + } + } + +} diff --git a/src/shootergame/world/layer/Layer.java b/src/shootergame/world/layer/Layer.java index 0650d5d..938ecc6 100644 --- a/src/shootergame/world/layer/Layer.java +++ b/src/shootergame/world/layer/Layer.java @@ -3,7 +3,6 @@ package shootergame.world.layer; import java.util.ArrayList; import java.util.Random; -import bdf.types.BdfObject; import shootergame.Main; import shootergame.display.Camera; import shootergame.entity.Entity; diff --git a/src/shootergame/world/layer/layergen/LayerGenBossArena.java b/src/shootergame/world/layer/layergen/LayerGenBossArena.java index 8a6338c..7fd0d60 100644 --- a/src/shootergame/world/layer/layergen/LayerGenBossArena.java +++ b/src/shootergame/world/layer/layergen/LayerGenBossArena.java @@ -18,6 +18,7 @@ public class LayerGenBossArena extends LayerGen implements LayerGenRememberPlaye private final Vec2i center = new Vec2i(0, 0); private final int size = 10; private Vec2d player_pos = new Vec2d(0, 0); + private Random rand = new Random(); @Override public void generateChunk(Chunk chunk, Layer layer, long seed, Random rand, Vec2i pos) @@ -103,7 +104,9 @@ public class LayerGenBossArena extends LayerGen implements LayerGenRememberPlaye @Override public void spawnPlayer(EntityPlayer player) { this.player_pos = player.pos.copy(); - player.pos = new Vec2d(0, 0); + player.pos = new Vec2d( + RandomHelpers.randrange(rand, -size + 2, size - 2), + RandomHelpers.randrange(rand, -size + 2, size - 2)); } } diff --git a/src/shootergame/world/layer/layergen/LayerGenLavaCaves.java b/src/shootergame/world/layer/layergen/LayerGenLavaCaves.java index 0241361..ee1bb4a 100644 --- a/src/shootergame/world/layer/layergen/LayerGenLavaCaves.java +++ b/src/shootergame/world/layer/layergen/LayerGenLavaCaves.java @@ -34,6 +34,14 @@ public class LayerGenLavaCaves extends LayerGen RandomHelpers.randrange(rand, 16)); } + boolean hasBossPortal = PortalSpawnrates.LavaCaveBossArenaPortal(rand); + Vec2i boss_portal_pos = null; + if(hasBossPortal) { + boss_portal_pos = new Vec2i( + RandomHelpers.randrange(rand, 16), + RandomHelpers.randrange(rand, 16)); + } + // Get some noise generators OpenSimplexNoise noisegen_n = new OpenSimplexNoise(new Random(seed + layer.id).nextLong()); @@ -79,6 +87,13 @@ public class LayerGenLavaCaves extends LayerGen chunk.setFrontTile(new TileState(Tiles.LADDER_UP, (short)1), ladder_pos); } + if( + hasBossPortal && + chunk.getBackTile(boss_portal_pos).tile == getTileDestroyed().tile && + chunk.getFrontTile(boss_portal_pos).tile == Tiles.VOID) { + chunk.setFrontTile(Tiles.BOSS_PORTAL.getDefaultState(), boss_portal_pos); + } + Vec2i chest_pos = new Vec2i( RandomHelpers.randrange(rand, Chunk.CHUNK_SIZE.mx), RandomHelpers.randrange(rand, Chunk.CHUNK_SIZE.my)); diff --git a/src/shootergame/world/layer/layergen/PortalSpawnrates.java b/src/shootergame/world/layer/layergen/PortalSpawnrates.java index 3e6b3cc..67cdb9f 100644 --- a/src/shootergame/world/layer/layergen/PortalSpawnrates.java +++ b/src/shootergame/world/layer/layergen/PortalSpawnrates.java @@ -7,10 +7,14 @@ import shootergame.util.math.random.RandomHelpers; class PortalSpawnrates { static boolean WorldCavePortal(Random rand) { - return RandomHelpers.randrange(rand, 2) == 0; + return RandomHelpers.randrange(rand, 10) == 0; } static boolean CaveLavaCavePortal(Random rand) { - return RandomHelpers.randrange(rand, 2) == 0; + return RandomHelpers.randrange(rand, 10) == 0; + } + + static boolean LavaCaveBossArenaPortal(Random rand) { + return RandomHelpers.randrange(rand, 5) == 0; } }