public void initAbilities() throws FileNotFoundException, IOException, SlickException { BufferedReader reader = new BufferedReader(new FileReader("res/abilities.txt")); String[] values; String line; Ability ability = new Ability(); Projectile proj; try { line = reader.readLine(); while (line != null) { values = line.split(","); if (values[0].equals("add")) { entity.addAttack(ability, Integer.parseInt(values[1])); ability = new Ability(); } else { proj = new Projectile( Float.parseFloat(values[0]), Float.parseFloat(values[1]), Float.parseFloat(values[2]), Float.parseFloat(values[3]), new Image(values[4]), entity); ability.addProjectile(proj); } line = reader.readLine(); } } finally { reader.close(); } }
@Override public void update(GameContainer container, int delta) throws SlickException { Projectile proj; playerNextPos = inputHandler.playerInput(player, container.getInput(), delta, sound); entity.update(delta, sound); if (!isBlocked(playerNextPos, player.getWidth(), player.getHeight())) { player.setCoord(playerNextPos); } player.logic(); for (int i = 0; i < projectiles.size(); i++) { proj = projectiles.get(i); proj.update(delta); if (isBlocked(proj.pos, proj.getWidth(), proj.getHeight())) { projectiles.remove(i); sound.playSound(collisionSound); } else if (proj.collidesWith(entity) && proj.getOwner() == player) { proj.damage(entity); projectiles.remove(i); } else if (proj.collidesWith(player) && proj.getOwner() == entity) { proj.damage(player); projectiles.remove(i); } } }
public void render(GameContainer container, Graphics g) throws SlickException { int xOffset = -(int) player.getX() + WIDTH / 2; int yOffset = -(int) player.getY() + HEIGHT / 2; tileMap.render(xOffset, yOffset); player.draw(WIDTH, HEIGHT); entity.draw(xOffset, yOffset); for (int i = 0; i < projectiles.size(); i++) { projectiles.get(i).draw(xOffset, yOffset); } this.drawHealthBar(g, player, xOffset, yOffset); this.drawHealthBar(g, entity, xOffset, yOffset); }
@Override public void collide(Entity entity) { super.collide(entity); if (entity instanceof BasicTile || entity instanceof Player) { if (state == BossState.FALL) { Assets.boop.play(); state = BossState.LANDWAIT; timer = 0; size.getVelocity().set(50, -50); } } }
@Override public void kill() { super.kill(); fixture.setSensor(false); for (int i = 0; i < 10; i++) { HPPickup hpp = new HPPickup(0.5f); hpp.getBody().setTransform(getBody().getPosition(), 0); hpp.getBody().setLinearVelocity(MathUtils.random(-50, 50), MathUtils.random(-50, 50)); GameScreen.i.getEntities().add(hpp); } MaxHPPickup mh = new MaxHPPickup(3); mh.getBody().setTransform(getBody().getPosition(), 0); GameScreen.i.getEntities().add(mh); }
@Override public void update(float delta) { super.update(delta); xSpring.value = getBody().getPosition().x; if (state == BossState.WAITING) { xSpring.target = -50; getBody().setTransform(-50, 0, 0); if (GameScreen.i.getBossState() == GameScreen.BossState.FIGHTING) { GameScreen.i.getBoss().setName(""); state = BossState.COMING; GameScreen.i.setFreezeControls(true); timer = 0; } } else if (state == BossState.COMING) { float last = timer; timer += delta; if (timer > 3 && last <= 3) { xSpring.target = -15; GameScreen.i.getBoss().setName("HEY..."); } if (timer > 6 && last <= 6) { xSpring.target = -8; GameScreen.i.getBoss().setName("YOU"); GameScreen.i.getBoss().setHealth(1.05f); } if (timer > 7 && last <= 7) { xSpring.target = -4; GameScreen.i.getBoss().setName("YOU SHOULD"); } if (timer > 8 && last <= 8) { xSpring.target = 0; GameScreen.i.getBoss().setName("YOU SHOULD PROBABLY"); GameScreen.i.getBoss().setHealth(1.1f); } if (timer > 11 && last <= 11) { GameScreen.i.getBoss().setName("RRRUUUUUUUNNNNNN!!!!"); GameScreen.i.setFreezeControls(false); GameScreen.i.getPlayer().setSpeed(30); GameScreen.i.getBoss().setHealth(99999f); } if (timer > 11.5f) { state = BossState.RUN; } } else if (state == BossState.RUN) { float last = timer; timer += delta; xSpring.target += delta * 20; float limit = GameScreen.i.getPlayer().getBody().getPosition().x - 25f; if (xSpring.target < limit) { xSpring.target = limit + (float) Math.sin(timer * 2) * 2; } color = Palette.HIGHLIGHT .cpy() .lerp(Palette.HIGHLIGHT2, (float) (0.5f + Math.sin(timer * 6) * 0.5f)); if (MathUtils.floor(last) != MathUtils.floor(timer)) size.getVelocity().x = 100; if (MathUtils.floor(last + 0.5f) != MathUtils.floor(timer + 0.5f)) size.getVelocity().x = -100; float lastSub = subtimer; subtimer += delta; if (substate == SubState.ROOT) { if (subtimer > 2) { substate = Array.with( // SubState.BULLETS, SubState.SWEEP) .random(); subtimer = 0; } } else if (substate == SubState.BULLETS) { substate = SubState.ROOT; } else if (substate == SubState.SWEEP) { if (MathUtils.floor(lastSub * 0.8f) != MathUtils.floor(subtimer * 0.8f)) { // BossSweep sweep = new BossSweep(this, MathUtils.random(1, 3) * 2); // GameScreen.i.getEntities().add(sweep); } if (subtimer > 3) { subtimer = 0; substate = SubState.ROOT; } } } xSpring.update(delta); getBody().setLinearVelocity(xSpring.velocity, 0); if (GameScreen.i.getCollisionTracker().getCollisions().containsKey(fixture) && state == BossState.RUN) { for (Fixture fix : GameScreen.i.getCollisionTracker().getCollisions().get(fixture)) { Object ud = fix.getBody().getUserData(); if (ud instanceof Player) { ((Player) ud).damage(damageOnTouch, getBody().getPosition()); } } } }
@Override public void init(GameContainer container) throws SlickException { try { worldMusic = sound.addSoundToMap("World", "res/Sound/World.wav", sid.getMusicID(0)); playerAttackSound = sound.addSoundToMap("Attack", "res/Sound/Shoot.wav", sid.getAttackID(0)); bossAttackSound = sound.addSoundToMap("Attack", "res/Sound/Boss_attack.wav", sid.getAttackID(1)); collisionSound = sound.addSoundToMap("Collision", "res/Sound/Collide.wav", sid.getEffectID(0)); } catch (MalformedURLException e1) { e1.printStackTrace(); } sound.loopSound(worldMusic); Image[] movementUp = { new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png"), new Image("res/Character1_back.png") }; Image[] movementDown = { new Image("res/Character1_frontanimation-frame-1.png"), new Image("res/Character1_frontanimation-frame-2.png"), new Image("res/Character1_frontanimation-frame-3.png"), new Image("res/Character1_frontanimation-frame-4.png"), new Image("res/Character1_frontanimation-frame-5.png"), new Image("res/Character1_frontanimation-frame-6.png"), new Image("res/Character1_frontanimation-frame-7.png"), new Image("res/Character1_frontanimation-frame-8.png") }; Image[] movementRight = { new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png"), new Image("res/Character1_right.png") }; Image[] movementLeft = { new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png"), new Image("res/Character1_left.png") }; int duration[] = {100, 100, 100, 100, 100, 100, 100, 100}; up = new Animation(movementUp, duration, false); down = new Animation(movementDown, duration, false); left = new Animation(movementLeft, duration, false); right = new Animation(movementRight, duration, false); Animation[] animList = {up, down, left, right}; Animation[] bossAnim = {up.copy(), down.copy(), left.copy(), right.copy()}; player = new Player(new Vector2d(10 * SIZE, 10 * SIZE), animList); player.setAttackSound(playerAttackSound); entity = new Boss(new Vector2d(25 * SIZE, 25 * SIZE), bossAnim, player); entity.setProjectileList(projectiles); entity.setAttackSound(bossAttackSound); player.setCurrentBoss(entity); tileMap = new TiledMap("res/tilemap.tmx"); blocked = new boolean[tileMap.getWidth()][tileMap.getHeight()]; try { this.initAbilities(); } catch (IOException e) { e.printStackTrace(); } for (int x = 0; x < tileMap.getWidth(); x++) { for (int y = 0; y < tileMap.getHeight(); y++) { int ID = tileMap.getTileId(x, y, 0); String value = tileMap.getTileProperty(ID, "blocked", "false"); if ("true".equals(value)) { blocked[x][y] = true; } } } }
public static boolean bossBattle(Character player, Boss boss) throws InterruptedException { Texts.printIntro(boss); while (player.health > 0 && boss.health > 0) { int choice = MenuPrints.bossBattleMenu(player, boss); boolean won = true; Random random = new Random(); if (choice == 1) // ATTACK { System.out.println("* Swoosh."); int hitchance; int hit = 0; if (player.stats[2] - boss.stats[2] < 0) hitchance = 2; else hitchance = 2 + player.stats[2] - boss.stats[2]; int hityesorno = random.nextInt(hitchance); try { hit = ((player.playerEqDamage + player.stats[0]) * (2 + (random.nextInt(5) / 2)) / hityesorno) * hityesorno; } catch (ArithmeticException e) { hit = 0; } // MISS WANT DIVIDED BY ZERO :D boss.health = boss.health - hit; if (hit == 0) System.out.println(MenuPrints.bossBattleMiss(boss)); else System.out.println(MenuPrints.bossBattleHit(boss)); System.out.println("* You hit the " + boss.race + " for " + hit + " points of damage! :D"); if (boss.stats[2] - player.stats[2] < 0) hitchance = 2; else hitchance = 2 + boss.stats[2] - player.stats[2]; hityesorno = random.nextInt(hitchance); try { hit = ((((boss.stats[0] * (1 + random.nextInt(5))) - (player.playerEqDefense * (1 + random.nextInt(3)))) / hityesorno) * hityesorno); } catch (ArithmeticException e) { hit = 0; } // MISS WANT DIVIDED BY ZERO :D if (hit < 0) hit = 0; player.health = player.health - hit; if (hit == 0) System.out.println("* The " + boss.race + " has missed you!"); else System.out.println( "* The " + boss.race + " has hit you for " + hit + " points of damage!"); Thread.sleep(1500); for (int i = 0; i < 100; ++i) System.out.println(); } if (choice == 2) // OMNOMNONMONMNONMONNOMNOMNONM { for (int i = 0; i < 100; ++i) System.out.println(); MenuPrints.printInventory(player.inventory); MenuPrints.inventoryConsumeYN(player); } if (choice == 3) { for (int i = 0; i < 100; ++i) System.out.println(); Library.writeSpellInventory(player.spellbook, false); Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); for (int i = 0; i < 100; ++i) System.out.println(); input = input.trim(); int inputInt = 0; try { inputInt = Integer.parseInt(input); } catch (NumberFormatException e) { } if (inputInt > 0 && inputInt <= player.spellbook.size()) { Spell castedSpell = player.spellbook.get(inputInt - 1); if (player.mana >= castedSpell.manacost) { player.mana = player.mana - castedSpell.manacost; int randommodfier = 1 + (random.nextInt(10) / 10); int hit = (castedSpell.power * (boss.weakness[castedSpell.element]) / 100) * randommodfier; boss.health = boss.health - hit; System.out.println("* " + castedSpell.incantation + "..."); System.out.println( "* You hit the " + boss.race + " for " + hit + " points of damage! :D"); hit = (boss.stats[0] * random.nextInt(5)) - (player.playerEqDefense * random.nextInt(3)); if (hit < 0) { hit = 0; } player.health = player.health - hit; if (hit == 0) { System.out.println("* The " + boss.race + " has missed you! :D"); } else { System.out.println("* You have been hit for " + hit + " points of damage! D:"); } Thread.sleep(1000); } else { System.out.println("You need more mana!"); } Thread.sleep(1000); for (int i = 0; i < 100; ++i) System.out.println(); } else { for (int i = 0; i < 100; ++i) System.out.println(); System.out.println("* Nevermind then."); Thread.sleep(1000); for (int i = 0; i < 100; ++i) System.out.println(); } } } if (player.health <= 0) { won = false; for (int i = 0; i < 100; ++i) System.out.println(); System.out.println("You have been defeated!"); // DEFEAT MESSAGE } else if (boss.health <= 0) { for (int i = 0; i < 100; ++i) System.out.println(); System.out.println("* You have slain " + boss.bossFullName + ", the " + boss.race + " !"); System.out.println( "* You are a true hero, worthy to be written down in the books of history!"); Thread.sleep(5000); for (int i = 0; i < 100; ++i) System.out.println(); won = true; // int phatlewt = 200; // System.out.println("* You loot " + phatlewt + " coins from the " + monsterString + "."); // GAME ENDS // player.money += phatlewt; // REHEAL CHEAT ;D // player.experience = player.experience + monster.stats[4]*20; // System.out.println("* You gain " + monster.stats[4]*20 + " experience!"); // while(player.experience>= (100+((player.level*player.level)*100))) // { // player.experience = player.experience - (100+((player.level*player.level)*100)); // player.levelUp(); // System.out.println("* You have gained a level!!! :)"); // System.out.println("* Your level now is : " + player.level);// VICCTORY MESSAGE + LOOT // } } return won; }
@Override public void update(float delta) { super.update(delta); if (state == BossState.WAITING) { getBody().setType(BodyDef.BodyType.KinematicBody); getBody().setLinearVelocity(0, 0); if (GameScreen.i.getBossState() == GameScreen.BossState.FIGHTING) { state = BossState.DROPPING; upCount = 2; } } else if (state == BossState.DROPPING) { timer += delta; centerSpring.getPosition().set(getBody().getPosition()); centerSpring.getTarget().set(GameScreen.i.getPlayer().getBody().getPosition().x, 20); centerSpring.update(delta); getBody().setLinearVelocity(centerSpring.getVelocity()); if (timer > 1) { getBody().setType(BodyDef.BodyType.DynamicBody); getBody().setLinearVelocity(0, -300); size.getVelocity().set(-50, 50); state = BossState.FALL; fixture.setSensor(false); } } else if (state == BossState.CENTER) { float last = timer; timer += delta; getBody().setType(BodyDef.BodyType.DynamicBody); if (timer > 1) { if (last <= 1) { Assets.downy.play(); } centerSpring.getPosition().set(getBody().getPosition()); centerSpring.update(delta); getBody().setLinearVelocity(centerSpring.getVelocity()); } getBody().setGravityScale(0); if (getBody().getPosition().dst(centerSpring.getTarget()) < 1f) { color = Palette.FOREGROUND; size.getVelocity().set(-50, -50); Assets.shut.play(); getBody().setType(BodyDef.BodyType.KinematicBody); getBody().setLinearVelocity(0, 0); getBody().setAngularVelocity(-5); state = BossState.FREEZE; timer = 0; } } else if (state == BossState.FREEZE) { float last = timer; timer += delta; if (timer > 1 && last <= 1) { size.getVelocity().set(40, 40); spawnChasers(); } if (timer > 1) { boolean allDead = true; for (LivingEntity e : offspring) { if (e.health > 0) allDead = false; } if (allDead) { offspring.clear(); color = Palette.HIGHLIGHT; getBody().setType(BodyDef.BodyType.DynamicBody); getBody().setGravityScale(0); state = BossState.CHASE; Assets.ding.play(); timer = 0; } } } else if (state == BossState.CHASE) { timer += delta; centerSpring.getTarget().set(GameScreen.i.getPlayer().getBody().getPosition()); centerSpring.getPosition().set(getBody().getPosition()); centerSpring.update(delta); getBody().setLinearVelocity(centerSpring.getVelocity()); if (timer > 3) { state = BossState.BACKFORTH; timer = 0; } } else if (state == BossState.BACKFORTH) { float last = timer; timer += delta; if (MathUtils.floor(last % 2) != MathUtils.floor(timer % 2)) { float direction = MathUtils.floor(last % 2) == 0 ? 1 : -1; centerSpring .getTarget() .set( levelCenter + (10 * direction), GameScreen.i.getPlayer().getBody().getPosition().y); Assets.boop.play(); } centerSpring.getPosition().set(getBody().getPosition()); centerSpring.update(delta); getBody().setLinearVelocity(centerSpring.getVelocity()); centerSpring.setFrequency(4); if (timer > 5) { centerSpring.setFrequency(1); upCount = 0; state = BossState.UP; getBody().setGravityScale(0); fixture.setSensor(true); getBody().setLinearVelocity(0, 100); timer = 0; } } else if (state == BossState.UP) { if (getBody().getPosition().y > 15) { getBody().setGravityScale(0); state = BossState.DROPPING; } } else if (state == BossState.LANDWAIT) { timer += delta; if (timer > 1) { if (upCount == 2) { state = BossState.CENTER; timer = 0; centerSpring.getPosition().set(getBody().getPosition()); centerSpring.getTarget().set(levelCenter, 14); } else { size.getVelocity().set(-50, 50); upCount++; state = BossState.UP; timer = 0; getBody().setLinearVelocity(0, 100); fixture.setSensor(true); Assets.uppy.play(); } } } }
@Override public void render() { super.render(); }
@Override public void damage(float amount, Vector2 source) { if (state != BossState.FREEZE) super.damage(amount, source); }
@Override public void destroy() { super.destroy(); }