Compare commits

...

4 Commits

17 changed files with 333 additions and 32 deletions

22
build.bat Normal file
View File

@@ -0,0 +1,22 @@
@echo off
echo [1/4] Clearing old files...
rd /s /q "out/app"
echo [2/4] Building game...
jpackage --type app-image ^
--dest "out/app" ^
--name "JGame2D" ^
--input "out/artifacts/JGame2D_jar" ^
--main-jar "JGame2D.jar" ^
--main-class de.miaurizius.jgame2d.core.Boot
echo [3/4] Copy assets
robocopy "assets" "out/app/JGame2D/assets" /e > nul
echo [4/4] Zipping...
cd out\app
tar -a -c -f ..\JGame2D.zip JGame2D
cd ../..
echo Done!

View File

@@ -1,10 +1,24 @@
rm -rf out/app #!/bin/bash
jpackage \ echo "[1/4] Clearing old files..."
--input out/artifacts/JGame2D_jar/ \ rm -rf "out/app"
--main-jar JGame2D.jar \
--main-class de.miaurizius.jgame2d.core.Boot \ echo "[2/4] Building game..."
--name JGame2D \ jpackage --type app-image \
--type app-image \ --dest "out/app" \
--add-modules ALL-MODULE-PATH \ --name "JGame2D" \
--dest out/app --input "out/artifacts/JGame2D_jar" \
--main-jar "JGame2D.jar" \
--main-class de.miaurizius.jgame2d.core.Boot
echo "[3/4] Copy assets..."
mkdir -p "out/app/JGame2D/assets"
cp -r assets/* "out/app/JGame2D/assets/"
echo "[4/4] Zipping..."
cd out/app
zip -r ../JGame2D.zip JGame2D
cd ../..
echo "Done!"

View File

@@ -28,6 +28,10 @@ public class GamePanel extends JPanel implements Runnable {
// SCREEN SETTINGS // SCREEN SETTINGS
final int originalTileSize = 16; //16x16 tile final int originalTileSize = 16; //16x16 tile
final int scale = 3; final int scale = 3;
/*
final int originalTileSize = 48; //16x16 tile
final int scale = 1;
*/
public final int tileSize = originalTileSize * scale; //48x48 tile public final int tileSize = originalTileSize * scale; //48x48 tile
public final int maxScreenCol = 20; public final int maxScreenCol = 20;
public final int maxScreenRow = 12; public final int maxScreenRow = 12;
@@ -207,13 +211,14 @@ public class GamePanel extends JPanel implements Runnable {
// DEBUG // DEBUG
if(keyH.debug) { if(keyH.debug) {
int start = 350; int start = 300;
fg2.setColor(Color.white); fg2.setColor(Color.white);
fg2.drawString("Draw Time: " + passed, 10, start); fg2.drawString("Draw Time: " + passed, 10, start);
fg2.drawString("FPS: " + fpsMeasure, 10, start+tileSize); fg2.drawString("FPS: " + fpsMeasure, 10, start+tileSize);
fg2.drawString("Invincible: " + player.invincibleCount, 10, start+tileSize*2); fg2.drawString("Invincible: " + player.invincibleCount, 10, start+tileSize*2);
fg2.drawString("X, Y: " + player.worldX+", "+player.worldY, 10, start+tileSize*3); fg2.drawString("X, Y: " + player.worldX+", "+player.worldY, 10, start+tileSize*3);
fg2.drawString("Col, Row: " + (player.worldX+player.solidArea.x)/tileSize+", "+(player.worldY+player.solidArea.y)/tileSize, 10, start+tileSize*4); fg2.drawString("Col, Row: " + (player.worldX+player.solidArea.x)/tileSize+", "+(player.worldY+player.solidArea.y)/tileSize, 10, start+tileSize*4);
fg2.drawString("God Mode: " + keyH.godMode, 10, start+tileSize*5);
Boot.logger.log(Level.FINE, "Draw Time: " + passed); Boot.logger.log(Level.FINE, "Draw Time: " + passed);
} }
} }

View File

@@ -29,7 +29,7 @@ public class UI {
private int transCount; private int transCount;
private int sleepCount; private int sleepCount;
private int charIndex; private int charIndex;
private String combinedText = ""; private String combinedText;
// SUB-STATES // SUB-STATES
public TradeState tradeState = TradeState.SELECT; public TradeState tradeState = TradeState.SELECT;
@@ -757,7 +757,6 @@ public class UI {
if(commandNum == 1) { if(commandNum == 1) {
graphics2d.drawString(">", textX-25, textY); graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) optionState = OptionState.OVERVIEW; if(panel.keyH.spacePressed) optionState = OptionState.OVERVIEW;
panel.resetGame(true);
} }
} }

View File

@@ -3,7 +3,9 @@ package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.GamePanel; import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Map; import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.entity.item.*; import de.miaurizius.jgame2d.entity.item.*;
import de.miaurizius.jgame2d.entity.monster.BatMON;
import de.miaurizius.jgame2d.entity.monster.OrcMON; import de.miaurizius.jgame2d.entity.monster.OrcMON;
import de.miaurizius.jgame2d.entity.monster.SkeletonLordMON;
import de.miaurizius.jgame2d.entity.npc.BigRockNPC; import de.miaurizius.jgame2d.entity.npc.BigRockNPC;
import de.miaurizius.jgame2d.entity.npc.MerchantNPC; import de.miaurizius.jgame2d.entity.npc.MerchantNPC;
import de.miaurizius.jgame2d.entity.npc.OldManNPC; import de.miaurizius.jgame2d.entity.npc.OldManNPC;
@@ -134,6 +136,36 @@ public class AssetSetter {
panel.monster[Map.OVERWORLD.getIndex()][i] = new OrcMON(panel); panel.monster[Map.OVERWORLD.getIndex()][i] = new OrcMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*12; panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*12;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*33; panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*33;
i = 0;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i] = new BatMON(panel);
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldX = panel.tileSize*34;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldY = panel.tileSize*39;
i++;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i] = new BatMON(panel);
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldX = panel.tileSize*36;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldY = panel.tileSize*25;
i++;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i] = new BatMON(panel);
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldX = panel.tileSize*39;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldY = panel.tileSize*26;
i++;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i] = new BatMON(panel);
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldX = panel.tileSize*28;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldY = panel.tileSize*11;
i++;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i] = new BatMON(panel);
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldX = panel.tileSize*10;
panel.monster[Map.DUNGEON_FIRST_FLOOR.getIndex()][i].worldY = panel.tileSize*19;
i = 0;
panel.monster[Map.DUNGEON_SECOND_FLOOR.getIndex()][i] = new SkeletonLordMON(panel);
panel.monster[Map.DUNGEON_SECOND_FLOOR.getIndex()][i].worldX = panel.tileSize*23;
panel.monster[Map.DUNGEON_SECOND_FLOOR.getIndex()][i].worldY = panel.tileSize*16;
} }
public void setITiles() { public void setITiles() {

View File

@@ -59,6 +59,10 @@ public class CollisionHandler {
} }
public int checkObject(Entity entity, boolean player) { public int checkObject(Entity entity, boolean player) {
int index = 999; int index = 999;
Direction direction = entity.direction;
if(entity.knockback) direction = entity.knockbackDirection;
int c = -1; int c = -1;
for(Entity obj : panel.obj[panel.currentMap.getIndex()]) { for(Entity obj : panel.obj[panel.currentMap.getIndex()]) {
@@ -71,7 +75,7 @@ public class CollisionHandler {
obj.solidArea.x += obj.worldX; obj.solidArea.x += obj.worldX;
obj.solidArea.y += obj.worldY; obj.solidArea.y += obj.worldY;
parseSolidArea(entity); parseSolidArea(entity, direction);
if (entity.solidArea.intersects(obj.solidArea)) { if (entity.solidArea.intersects(obj.solidArea)) {
if (obj.collision) entity.collisionOn = true; if (obj.collision) entity.collisionOn = true;
@@ -90,6 +94,10 @@ public class CollisionHandler {
//NPC OR MONSTER COLLISION //NPC OR MONSTER COLLISION
public int checkEntity(Entity entity, Entity[] target) { public int checkEntity(Entity entity, Entity[] target) {
int index = 999; int index = 999;
Direction direction = entity.direction;
if(entity.knockback) direction = entity.knockbackDirection;
int c = -1; int c = -1;
for(Entity e : target) { for(Entity e : target) {
@@ -102,7 +110,7 @@ public class CollisionHandler {
e.solidArea.x += e.worldX; e.solidArea.x += e.worldX;
e.solidArea.y += e.worldY; e.solidArea.y += e.worldY;
parseSolidArea(entity); parseSolidArea(entity, direction);
if (entity.solidArea.intersects(e.solidArea) && e != entity) { if (entity.solidArea.intersects(e.solidArea) && e != entity) {
entity.collisionOn = true; entity.collisionOn = true;
@@ -149,4 +157,13 @@ public class CollisionHandler {
} }
} }
private void parseSolidArea(Entity entity, Direction direction) {
switch (direction) {
case UP -> entity.solidArea.y -= entity.speed;
case DOWN -> entity.solidArea.y += entity.speed;
case LEFT -> entity.solidArea.x -= entity.speed;
case RIGHT -> entity.solidArea.x += entity.speed;
}
}
} }

View File

@@ -68,6 +68,7 @@ public class EventHandler {
if(hit(Map.OVERWORLD, 27,16, Direction.RIGHT)) damagePit(); if(hit(Map.OVERWORLD, 27,16, Direction.RIGHT)) damagePit();
//if(hit(Map.OVERWORLD, 26,16, Direction.RIGHT)) changeMap(Map.DUNGEON_FIRST_FLOOR, 9, 41); //test //if(hit(Map.OVERWORLD, 26,16, Direction.RIGHT)) changeMap(Map.DUNGEON_FIRST_FLOOR, 9, 41); //test
else if(hit(Map.OVERWORLD, 23,12, null)) healingPool(); else if(hit(Map.OVERWORLD, 23,12, null)) healingPool();
else if(hit(Map.DUNGEON_SECOND_FLOOR, 27, 39, null)) healingPool();
// HUT // HUT
else if(hit(Map.OVERWORLD, 10, 39, null)) changeMap(Map.HUT, 12, 13); else if(hit(Map.OVERWORLD, 10, 39, null)) changeMap(Map.HUT, 12, 13);

View File

@@ -15,6 +15,7 @@ public class KeyHandler implements KeyListener {
public boolean upPressed, downPressed, leftPressed, rightPressed, spacePressed, shotKeyPressed, CTLKeyPressed; public boolean upPressed, downPressed, leftPressed, rightPressed, spacePressed, shotKeyPressed, CTLKeyPressed;
public GamePanel panel; public GamePanel panel;
public boolean debug; public boolean debug;
public boolean godMode;
public KeyHandler(GamePanel panel) { public KeyHandler(GamePanel panel) {
this.panel = panel; this.panel = panel;
@@ -33,6 +34,7 @@ public class KeyHandler implements KeyListener {
switch (panel.ui.commandNum) { switch (panel.ui.commandNum) {
case 0: case 0:
panel.gameState = GameState.PLAY; panel.gameState = GameState.PLAY;
panel.resetGame(true);
panel.playMusic(0); panel.playMusic(0);
break; break;
case 1: case 1:
@@ -69,6 +71,7 @@ public class KeyHandler implements KeyListener {
// DEBUG OPTIONS // DEBUG OPTIONS
case KeyEvent.VK_T -> debug = !debug; case KeyEvent.VK_T -> debug = !debug;
case KeyEvent.VK_G -> godMode = !godMode;
case KeyEvent.VK_R -> {for(Map m : Map.values()) panel.tileM.loadMap(m);} case KeyEvent.VK_R -> {for(Map m : Map.values()) panel.tileM.loadMap(m);}
// GAME STATES // GAME STATES

View File

@@ -1,5 +1,7 @@
package de.miaurizius.jgame2d.data; package de.miaurizius.jgame2d.data;
import de.miaurizius.jgame2d.core.enums.Map;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -19,6 +21,7 @@ public class DataStorage implements Serializable {
int nextLevelExp; int nextLevelExp;
int coins; int coins;
int worldX, worldY; int worldX, worldY;
Map currentMap;
// PLAYER INVENTORY // PLAYER INVENTORY
List<String> itemNames = new ArrayList<>(); List<String> itemNames = new ArrayList<>();

View File

@@ -44,6 +44,7 @@ public class SaveLoad {
ds.coins = panel.player.coins; ds.coins = panel.player.coins;
ds.worldX = panel.player.worldX; ds.worldX = panel.player.worldX;
ds.worldY = panel.player.worldY; ds.worldY = panel.player.worldY;
ds.currentMap = panel.currentMap;
// PLAYER INVENTORY // PLAYER INVENTORY
for(int i = 0; i < panel.player.inventory.size(); i++) { for(int i = 0; i < panel.player.inventory.size(); i++) {
@@ -95,7 +96,7 @@ public class SaveLoad {
panel.player.coins = ds.coins; panel.player.coins = ds.coins;
panel.player.worldX = ds.worldX; panel.player.worldX = ds.worldX;
panel.player.worldY = ds.worldY; panel.player.worldY = ds.worldY;
panel.currentMap = ds.currentMap;
// PLAYER INVENTORY // PLAYER INVENTORY
panel.player.inventory.clear(); panel.player.inventory.clear();
@@ -118,7 +119,7 @@ public class SaveLoad {
panel.obj[mapNum][i] = getObject(ds.mapObjectNames[mapNum][i]); panel.obj[mapNum][i] = getObject(ds.mapObjectNames[mapNum][i]);
panel.obj[mapNum][i].worldX = ds.mapObjectWorldX[mapNum][i]; panel.obj[mapNum][i].worldX = ds.mapObjectWorldX[mapNum][i];
panel.obj[mapNum][i].worldY = ds.mapObjectWorldY[mapNum][i]; panel.obj[mapNum][i].worldY = ds.mapObjectWorldY[mapNum][i];
if (ds.mapObjectLootNames[mapNum][i] != null) panel.obj[mapNum][i].loot = getObject(ds.mapObjectLootNames[mapNum][i]); if (ds.mapObjectLootNames[mapNum][i] != null) panel.obj[mapNum][i].setLoot(getObject(ds.mapObjectLootNames[mapNum][i]));
panel.obj[mapNum][i].opened = ds.mapObjectOpened[mapNum][i]; panel.obj[mapNum][i].opened = ds.mapObjectOpened[mapNum][i];
panel.obj[mapNum][i].setDialogue(); panel.obj[mapNum][i].setDialogue();
if(panel.obj[mapNum][i].opened) panel.obj[mapNum][i].down1 = panel.obj[mapNum][i].image2; if(panel.obj[mapNum][i].opened) panel.obj[mapNum][i].down1 = panel.obj[mapNum][i].image2;

View File

@@ -51,6 +51,7 @@ public class Entity {
public boolean onPath; public boolean onPath;
public boolean knockback; public boolean knockback;
public boolean guarding; public boolean guarding;
public boolean rage;
public Direction knockbackDirection; public Direction knockbackDirection;
// COUNTER // COUNTER
@@ -161,9 +162,9 @@ public class Entity {
int screenX = worldX - panel.player.worldX + panel.player.screenX; int screenX = worldX - panel.player.worldX + panel.player.screenX;
int screenY = worldY - panel.player.worldY + panel.player.screenY; int screenY = worldY - panel.player.worldY + panel.player.screenY;
if(worldX + panel.tileSize > panel.player.worldX - panel.player.screenX && if(worldX + panel.tileSize*5 > panel.player.worldX - panel.player.screenX &&
worldX - panel.tileSize < panel.player.worldX + panel.player.screenX && worldX - panel.tileSize < panel.player.worldX + panel.player.screenX &&
worldY + panel.tileSize > panel.player.worldY - panel.player.screenY && worldY + panel.tileSize*5 > panel.player.worldY - panel.player.screenY &&
worldY - panel.tileSize < panel.player.worldY + panel.player.screenY worldY - panel.tileSize < panel.player.worldY + panel.player.screenY
) { ) {
@@ -191,8 +192,8 @@ public class Entity {
if(dying) dyingAnimation(graphics2d); if(dying) dyingAnimation(graphics2d);
if(type == EntityType.PLAYER || name.equals("orc")) { // only modify sprite render position for player because I dont know yet how monster attack sprite are gonna look if(type == EntityType.PLAYER || name.equals("orc")) { // only modify sprite render position for player because I dont know yet how monster attack sprite are gonna look
if(attacking) graphics2d.drawImage(parseSpriteATK(), if(attacking) graphics2d.drawImage(parseSpriteATK(),
(direction == Direction.LEFT) ? screenX - panel.tileSize : screenX, (direction == Direction.LEFT) ? screenX - left1.getWidth() : screenX,
(direction == Direction.UP) ? screenY - panel.tileSize : screenY, null); (direction == Direction.UP) ? screenY - up1.getHeight() : screenY, null);
else if(guarding) graphics2d.drawImage(parseSpriteGRD(), screenX, screenY, null); else if(guarding) graphics2d.drawImage(parseSpriteGRD(), screenX, screenY, null);
else graphics2d.drawImage(parseSprite(), screenX, screenY, null); else graphics2d.drawImage(parseSprite(), screenX, screenY, null);
} else graphics2d.drawImage(parseSprite(), screenX, screenY, null); } else graphics2d.drawImage(parseSprite(), screenX, screenY, null);
@@ -207,6 +208,19 @@ public class Entity {
// INTERACTION // INTERACTION
public void setAction() {} public void setAction() {}
public void moveTowardPlayer(int interval) {
actionLock++;
if(actionLock > interval) {
if(dX(panel.player) > dY(panel.player)) {
if(panel.player.getCenterX() < getCenterX()) direction = Direction.LEFT;
else direction = Direction.RIGHT;
} else if(dX(panel.player) < dY(panel.player)) {
if(panel.player.getCenterY() < getCenterY()) direction = Direction.UP;
else direction = Direction.DOWN;
}
actionLock = 0;
}
}
public void move(Direction direction) {} public void move(Direction direction) {}
public void damageReaction() {} public void damageReaction() {}
public void attacking() { public void attacking() {
@@ -415,10 +429,16 @@ public class Entity {
return (worldY + solidArea.y) / panel.tileSize; return (worldY + solidArea.y) / panel.tileSize;
} }
public int dX(Entity target) { public int dX(Entity target) {
return Math.abs(worldX - target.worldX); return Math.abs(getCenterX() - target.getCenterX());
} }
public int dY(Entity target) { public int dY(Entity target) {
return Math.abs(worldY - target.worldY); return Math.abs(getCenterY() - target.getCenterY());
}
public int getCenterX() {
return worldX + left1.getWidth()/2;
}
public int getCenterY() {
return worldY + up1.getHeight()/2;
} }
public int dTile(Entity target) { public int dTile(Entity target) {
//if(Objects.equals(name, "orc")) System.out.println("dX: " + dX(target) + " dY: " + dY(target)); //if(Objects.equals(name, "orc")) System.out.println("dX: " + dX(target) + " dY: " + dY(target));
@@ -589,16 +609,16 @@ public class Entity {
switch(direction) { switch(direction) {
case UP -> { case UP -> {
if(panel.player.worldY < worldY && yDist < straight && xDist < horizontal) targetInRange = true; if(panel.player.getCenterY() < getCenterY() && yDist < straight && xDist < horizontal) targetInRange = true;
} }
case DOWN -> { case DOWN -> {
if(panel.player.worldY > worldY && yDist < straight && xDist < horizontal) targetInRange = true; if(panel.player.getCenterY() > getCenterY() && yDist < straight && xDist < horizontal) targetInRange = true;
} }
case LEFT -> { case LEFT -> {
if(panel.player.worldX < worldX && xDist < straight && yDist < horizontal) targetInRange = true; if(panel.player.getCenterX() < getCenterX() && xDist < straight && yDist < horizontal) targetInRange = true;
} }
case RIGHT -> { case RIGHT -> {
if(panel.player.worldX > worldX && xDist < straight && yDist < horizontal) targetInRange = true; if(panel.player.getCenterX() > getCenterX() && xDist < straight && yDist < horizontal) targetInRange = true;
} }
} }
@@ -610,9 +630,9 @@ public class Entity {
shotAvailableCount = 0; shotAvailableCount = 0;
} }
} }
public void setRandomDirection() { public void setRandomDirection(int interval) {
actionLock++; actionLock++;
if(actionLock == 120) { //lock action for x frames if(actionLock > interval) { //lock action for x frames
Random rand = new Random(); Random rand = new Random();
int i = rand.nextInt(100)+1; //Generate number between 1 and 100 int i = rand.nextInt(100)+1; //Generate number between 1 and 100
if(i <= 25) direction = Direction.UP; if(i <= 25) direction = Direction.UP;

View File

@@ -4,6 +4,7 @@ import de.miaurizius.jgame2d.core.*;
import de.miaurizius.jgame2d.core.enums.Direction; import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.EntityType; import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState; import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.core.handlers.KeyHandler; import de.miaurizius.jgame2d.core.handlers.KeyHandler;
import de.miaurizius.jgame2d.entity.item.KeyObj; import de.miaurizius.jgame2d.entity.item.KeyObj;
import de.miaurizius.jgame2d.entity.item.LanternObj; import de.miaurizius.jgame2d.entity.item.LanternObj;
@@ -178,6 +179,7 @@ public class Player extends Entity {
if(!invincible) return; if(!invincible) return;
invincibleCounting(); invincibleCounting();
if(keyH.godMode) return;
if(life <= 0) { if(life <= 0) {
panel.gameState = GameState.GAMEOVER; panel.gameState = GameState.GAMEOVER;
invincibleCount = 0; invincibleCount = 0;
@@ -312,8 +314,15 @@ public class Player extends Entity {
if(selectedItem.amt > 1) selectedItem.amt--; else inventory.remove(selectedItem); if(selectedItem.amt > 1) selectedItem.amt--; else inventory.remove(selectedItem);
} }
public void setDefaultPositions() { public void setDefaultPositions() {
panel.currentMap = Map.OVERWORLD;
worldX = panel.tileSize * 23; worldX = panel.tileSize * 23;
worldY = panel.tileSize * 21; worldY = panel.tileSize * 21;
// panel.currentMap = Map.DUNGEON_SECOND_FLOOR;
// worldX = panel.tileSize * 26;
// worldY = panel.tileSize * 40;
// panel.player.inventory.add(new LanternObj(panel));
direction = Direction.DOWN; direction = Direction.DOWN;
} }
public void restoreStatus() { public void restoreStatus() {
@@ -367,7 +376,6 @@ public class Player extends Entity {
inventory.add(currentWeapon); inventory.add(currentWeapon);
inventory.add(currentShield); inventory.add(currentShield);
inventory.add(new KeyObj(panel)); inventory.add(new KeyObj(panel));
inventory.add(new LanternObj(panel));
} }
public void setDialogue() { public void setDialogue() {
dialogue[0][0] = "You are level " + level + " now!\nYou feel stronger!"; dialogue[0][0] = "You are level " + level + " now!\nYou feel stronger!";

View File

@@ -13,7 +13,7 @@ public class LanternObj extends Entity {
down1 = initEntitySprites("objects/lantern"); down1 = initEntitySprites("objects/lantern");
description = "[" + name + "]\nA lantern that lights up\nthe surrounding area."; description = "[" + name + "]\nA lantern that lights up\nthe surrounding area.";
price = 100; price = 100;
lightRadius = 250; lightRadius = 350;
} }
} }

View File

@@ -0,0 +1,65 @@
package de.miaurizius.jgame2d.entity.monster;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.CoinObj;
import de.miaurizius.jgame2d.entity.item.HeartObj;
import de.miaurizius.jgame2d.entity.item.PotionObj;
import java.util.Random;
public class BatMON extends Entity {
public BatMON(GamePanel panel) {
super(panel);
type = EntityType.MONSTER;
name = "bat";
defaultSpeed = 4;
speed = defaultSpeed;
maxLife = 4;
life = maxLife;
attack = 1;
defense = 0;
exp = 2;
knockbackVal = 5;
solidArea.x = 3;
solidArea.y = 15;
solidArea.width = 42;
solidArea.height = 21;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
getImage();
}
// INTERACTION
public void setAction() {
setRandomDirection(10);
}
public void damageReaction() {
actionLock = 0;
//onPath = true;
}
public void checkDrop() {
int i = new Random().nextInt(100)+1;
if(i < 50) dropItem(new CoinObj(panel));
if(i >= 50 && i < 75) dropItem(new HeartObj(panel));
if(i >= 75 && i < 100) dropItem(new PotionObj(panel));
}
// SETTING THINGS UP
public void getImage() {
up1 = initEntitySprites("monster/bat_down_1");
up2 = initEntitySprites("monster/bat_down_2");
down1 = initEntitySprites("monster/bat_down_1");
down2 = initEntitySprites("monster/bat_down_2");
left1 = initEntitySprites("monster/bat_down_1");
left2 = initEntitySprites("monster/bat_down_2");
right1 = initEntitySprites("monster/bat_down_1");
right2 = initEntitySprites("monster/bat_down_2");
}
}

View File

@@ -45,7 +45,7 @@ public class GreenSlimeMON extends Entity {
followPlayer(); followPlayer();
return; return;
} }
setRandomDirection(); setRandomDirection(120);
checkShooting(200, 30); checkShooting(200, 30);
} }
public void damageReaction() { public void damageReaction() {

View File

@@ -41,7 +41,7 @@ public class OrcMON extends Entity {
public void setAction() { public void setAction() {
if(!onPath) checkStartChasing(panel.player, 10 ,100); else followPlayer(); if(!onPath) checkStartChasing(panel.player, 10 ,100); else followPlayer();
checkStopChasing(panel.player, 15, 100); checkStopChasing(panel.player, 15, 100);
setRandomDirection(); setRandomDirection(120);
if(!attacking) checkAttack(50, panel.tileSize*4, panel.tileSize); if(!attacking) checkAttack(50, panel.tileSize*4, panel.tileSize);
} }
public void damageReaction() { public void damageReaction() {

View File

@@ -0,0 +1,111 @@
package de.miaurizius.jgame2d.entity.monster;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.CoinObj;
import de.miaurizius.jgame2d.entity.item.HeartObj;
import de.miaurizius.jgame2d.entity.item.PotionObj;
import java.util.Random;
public class SkeletonLordMON extends Entity {
private final int spriteScale = 5;
public SkeletonLordMON(GamePanel panel) {
super(panel);
type = EntityType.MONSTER;
name = "Skeleton Lord";
defaultSpeed = 1;
speed = defaultSpeed;
maxLife = 50;
life = maxLife;
attack = 10;
defense = 2;
exp = 50;
knockbackVal = 5;
int size = panel.tileSize*spriteScale;
solidArea.x = 48;
solidArea.y = 48;
solidArea.width = size-48*2;
solidArea.height = size-48;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
attackArea.width = 170;
attackArea.height = 170;
getImage();
getAttackImage();
}
// INTERACTION
public void setAction() {
if(!rage && life < maxLife/2) {
rage = true;
getImage();
getAttackImage();
defaultSpeed++;
speed = defaultSpeed;
attack *= 2;
}
if(dTile(panel.player) < 10) moveTowardPlayer(60); else setRandomDirection(120);
if(!attacking) checkAttack(60, panel.tileSize*7, panel.tileSize*5);
}
public void damageReaction() {
actionLock = 0;
}
public void checkDrop() {
int i = new Random().nextInt(100)+1;
if(i < 50) dropItem(new CoinObj(panel));
if(i >= 50 && i < 75) dropItem(new HeartObj(panel));
if(i >= 75 && i < 100) dropItem(new PotionObj(panel));
}
// SETTING THINGS UP
public void getImage() {
if(rage) {
up1 = initEntitySprites("monster/skeletonlord_phase2_up_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
up2 = initEntitySprites("monster/skeletonlord_phase2_up_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
down1 = initEntitySprites("monster/skeletonlord_phase2_down_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
down2 = initEntitySprites("monster/skeletonlord_phase2_down_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
left1 = initEntitySprites("monster/skeletonlord_phase2_left_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
left2 = initEntitySprites("monster/skeletonlord_phase2_left_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
right1 = initEntitySprites("monster/skeletonlord_phase2_right_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
right2 = initEntitySprites("monster/skeletonlord_phase2_right_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
return;
}
up1 = initEntitySprites("monster/skeletonlord_up_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
up2 = initEntitySprites("monster/skeletonlord_up_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
down1 = initEntitySprites("monster/skeletonlord_down_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
down2 = initEntitySprites("monster/skeletonlord_down_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
left1 = initEntitySprites("monster/skeletonlord_left_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
left2 = initEntitySprites("monster/skeletonlord_left_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
right1 = initEntitySprites("monster/skeletonlord_right_1", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
right2 = initEntitySprites("monster/skeletonlord_right_2", panel.tileSize * spriteScale, panel.tileSize * spriteScale);
}
public void getAttackImage() {
if(rage) {
attackUp1 = initEntitySprites("monster/skeletonlord_phase2_attack_up_1", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackUp2 = initEntitySprites("monster/skeletonlord_phase2_attack_up_2", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackDown1 = initEntitySprites("monster/skeletonlord_phase2_attack_down_1", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackDown2 = initEntitySprites("monster/skeletonlord_phase2_attack_down_2", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackLeft1 = initEntitySprites("monster/skeletonlord_phase2_attack_left_1", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackLeft2 = initEntitySprites("monster/skeletonlord_phase2_attack_left_2", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackRight1 = initEntitySprites("monster/skeletonlord_phase2_attack_right_1", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackRight2 = initEntitySprites("monster/skeletonlord_phase2_attack_right_2", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
return;
}
attackUp1 = initEntitySprites("monster/skeletonlord_attack_up_1", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackUp2 = initEntitySprites("monster/skeletonlord_attack_up_2", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackDown1 = initEntitySprites("monster/skeletonlord_attack_down_1", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackDown2 = initEntitySprites("monster/skeletonlord_attack_down_2", panel.tileSize * spriteScale, panel.tileSize * 2 * spriteScale);
attackLeft1 = initEntitySprites("monster/skeletonlord_attack_left_1", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackLeft2 = initEntitySprites("monster/skeletonlord_attack_left_2", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackRight1 = initEntitySprites("monster/skeletonlord_attack_right_1", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
attackRight2 = initEntitySprites("monster/skeletonlord_attack_right_2", panel.tileSize*2*spriteScale, panel.tileSize*spriteScale);
}
}