Compare commits

...

3 Commits

Author SHA1 Message Date
befb117d85 created progress saves 2025-12-16 14:18:15 +01:00
54a2ee3022 refactored reset game 2025-12-16 13:57:52 +01:00
ce3f590715 bugfix 2025-12-16 13:00:00 +01:00
8 changed files with 45 additions and 101 deletions

View File

@@ -1,85 +0,0 @@
package de.miaurizius.jgame2d.core;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Config {
private final GamePanel panel;
private final HashMap<String, String> settings = new HashMap<>();
public Config(GamePanel panel) throws IOException {
this.panel = panel;
for (Setting option : Setting.values()) settings.put(option.name, null);
new File("gamedata").mkdirs();
new File("gamedata/config").createNewFile();
}
// GENERAL
public final void save() {
try {
insertToHash();
BufferedWriter writer = new BufferedWriter(new FileWriter("gamedata/config"));
settings.forEach((invoke, value) -> {
try {
writer.write(invoke + ": " + value);
writer.newLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
});
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public final void load() {
try (BufferedReader reader = new BufferedReader(new FileReader("gamedata/config"))) {
List<String> lines = reader.lines().toList();
if (lines.isEmpty()) return;
Map<String, String> configMap = new HashMap<>();
for (String line : lines) {
String[] parts = line.split(":\\s*", 2);
if (parts.length == 2) {
configMap.put(parts[0].trim(), parts[1].trim());
}
}
for (Setting setting : Setting.values()) {
String value = configMap.get(setting.name);
if (value != null) {
switch (setting) {
case FULLSCREEN -> panel.fullscreen = Boolean.parseBoolean(value);
case MUSICVOLUME -> panel.music.volumeScale = Integer.parseInt(value);
case SFXVOLUME -> panel.sfx.volumeScale = Integer.parseInt(value);
}
}
}
insertToHash();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// HELP FUNCTIONS
private void insertToHash() {
settings.put(Setting.FULLSCREEN.name, String.valueOf(panel.fullscreen));
settings.put(Setting.MUSICVOLUME.name, String.valueOf(panel.music.volumeScale));
settings.put(Setting.SFXVOLUME.name, String.valueOf(panel.sfx.volumeScale));
}
private enum Setting {
FULLSCREEN("fullscreen"),
MUSICVOLUME("music-vol"),
SFXVOLUME("sfx-vol");
private final String name;
Setting(String name) {
this.name = name;
}
}
}

View File

@@ -4,6 +4,8 @@ import de.miaurizius.jgame2d.aStar.PathFinder;
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.enums.Map;
import de.miaurizius.jgame2d.core.handlers.*; import de.miaurizius.jgame2d.core.handlers.*;
import de.miaurizius.jgame2d.data.Config;
import de.miaurizius.jgame2d.data.SaveLoad;
import de.miaurizius.jgame2d.entity.Entity; import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.Player; import de.miaurizius.jgame2d.entity.Player;
import de.miaurizius.jgame2d.environment.EnvironmentManager; import de.miaurizius.jgame2d.environment.EnvironmentManager;
@@ -61,6 +63,7 @@ public class GamePanel extends JPanel implements Runnable {
public PathFinder pFinder = new PathFinder(this); public PathFinder pFinder = new PathFinder(this);
public EnvironmentManager eManager = new EnvironmentManager(this); public EnvironmentManager eManager = new EnvironmentManager(this);
public MiniMap mapMan = new MiniMap(this); public MiniMap mapMan = new MiniMap(this);
public SaveLoad saveLoad = new SaveLoad(this);
Thread gameThread; Thread gameThread;
// ENTITY AND OBJECT // ENTITY AND OBJECT
@@ -263,18 +266,16 @@ public class GamePanel extends JPanel implements Runnable {
fScreenWidth = Boot.window.getWidth(); fScreenWidth = Boot.window.getWidth();
fScreenHeight = Boot.window.getHeight(); fScreenHeight = Boot.window.getHeight();
} }
public void retry() { public void resetGame(boolean restart) {
player.setDefaultPositions(); player.setDefaultPositions();
player.restoreLife(); player.restoreStatus();
assetSetter.setNPC(); assetSetter.setNPC();
assetSetter.setMonster(); assetSetter.setMonster();
}
public void restart() { if(!restart) return;
player.setDefaultValues(); player.setDefaultValues();
assetSetter.setObject(); assetSetter.setObject();
assetSetter.setNPC();
assetSetter.setMonster();
assetSetter.setITiles(); assetSetter.setITiles();
eManager.lighting.resetDay();
} }
} }

View File

@@ -736,6 +736,7 @@ 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

@@ -1,5 +1,6 @@
package de.miaurizius.jgame2d.core.handlers; package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.Boot;
import de.miaurizius.jgame2d.core.GamePanel; import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Direction; import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.GameState; import de.miaurizius.jgame2d.core.enums.GameState;
@@ -7,6 +8,7 @@ import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.entity.Entity; import de.miaurizius.jgame2d.entity.Entity;
import java.awt.*; import java.awt.*;
import java.util.logging.Level;
public class EventHandler { public class EventHandler {
@@ -104,10 +106,15 @@ public class EventHandler {
panel.gameState = GameState.DIALOGUE; panel.gameState = GameState.DIALOGUE;
panel.player.attackCancel = true; panel.player.attackCancel = true;
panel.playSE(2); panel.playSE(2);
panel.ui.currentDialogue = "You drank the holy water.\nYour life has been recovered!\nBut all monsters respawned... \nGood luck!"; panel.ui.currentDialogue = "You drank the holy water.\nYour life has been recovered!\nYou progress has been saved.";
panel.player.life = panel.player.maxLife; panel.player.life = panel.player.maxLife;
canTouchEvent = false; canTouchEvent = false;
panel.assetSetter.setMonster(); panel.assetSetter.setMonster();
try {
panel.saveLoad.save();
} catch (Exception e) {
Boot.logger.log(Level.SEVERE, "Saving game failed!", e);
}
} }
private void changeMap(Map map, int col, int row) { private void changeMap(Map map, int col, int row) {
panel.gameState = GameState.TRANSITION; panel.gameState = GameState.TRANSITION;

View File

@@ -1,5 +1,6 @@
package de.miaurizius.jgame2d.core.handlers; package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.Boot;
import de.miaurizius.jgame2d.core.GamePanel; import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.UI; import de.miaurizius.jgame2d.core.UI;
import de.miaurizius.jgame2d.core.enums.GameState; import de.miaurizius.jgame2d.core.enums.GameState;
@@ -7,6 +8,7 @@ import de.miaurizius.jgame2d.core.enums.Map;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.KeyListener;
import java.util.logging.Level;
public class KeyHandler implements KeyListener { public class KeyHandler implements KeyListener {
@@ -34,7 +36,14 @@ public class KeyHandler implements KeyListener {
panel.playMusic(0); panel.playMusic(0);
break; break;
case 1: case 1:
// add later System.out.printf("Loading config...%n");
try {
panel.config.load();
panel.gameState = GameState.PLAY;
panel.playMusic(0);
} catch (Exception e) {
Boot.logger.log(Level.SEVERE, "Failed to load config", e);
}
break; break;
case 2: case 2:
System.exit(0); System.exit(0);
@@ -152,12 +161,12 @@ public class KeyHandler implements KeyListener {
if(panel.ui.commandNum == 0) { if(panel.ui.commandNum == 0) {
panel.gameState = GameState.PLAY; panel.gameState = GameState.PLAY;
panel.playMusic(0); panel.playMusic(0);
panel.retry(); panel.resetGame(false);
} }
if(panel.ui.commandNum == 1) { if(panel.ui.commandNum == 1) {
panel.gameState = GameState.TITLE; panel.gameState = GameState.TITLE;
panel.ui.commandNum = 0; panel.ui.commandNum = 0;
panel.restart(); panel.resetGame(true);
panel.stopMusic(); panel.stopMusic();
} }
} }

View File

@@ -327,10 +327,10 @@ public class Entity {
int nextWorldY = user.getTopY(); int nextWorldY = user.getTopY();
switch(user.direction) { switch(user.direction) {
case UP -> nextWorldY = user.getTopY()-1; case UP -> nextWorldY = user.getTopY()-panel.player.speed;
case DOWN -> nextWorldY = user.getBottomY()+1; case DOWN -> nextWorldY = user.getBottomY()+panel.player.speed;
case LEFT -> nextWorldX = user.getLeftX()-1; case LEFT -> nextWorldX = user.getLeftX()-panel.player.speed;
case RIGHT -> nextWorldX = user.getRightX()+1; case RIGHT -> nextWorldX = user.getRightX()+panel.player.speed;
} }
int col = nextWorldX / panel.tileSize; int col = nextWorldX / panel.tileSize;
int row = nextWorldY / panel.tileSize; int row = nextWorldY / panel.tileSize;

View File

@@ -311,9 +311,14 @@ public class Player extends Entity {
worldY = panel.tileSize * 21; worldY = panel.tileSize * 21;
direction = Direction.DOWN; direction = Direction.DOWN;
} }
public void restoreLife() { public void restoreStatus() {
life = maxLife; life = maxLife;
invincible = false; invincible = false;
transparent = false;
attacking = false;
guarding = false;
knockback = false;
lightUpdated = true;
} }
public void getSleepingImage(BufferedImage image) { public void getSleepingImage(BufferedImage image) {
down1 = image; down1 = image;
@@ -346,6 +351,7 @@ public class Player extends Entity {
coins = 500; coins = 500;
currentWeapon = new SwordNormalObj(panel); currentWeapon = new SwordNormalObj(panel);
currentShield = new ShieldWoodObj(panel); currentShield = new ShieldWoodObj(panel);
currentLight = null;
projectile = new FireballObj(panel); projectile = new FireballObj(panel);
attack = getAttack(); attack = getAttack();
defense = getDefense(); defense = getDefense();

View File

@@ -75,6 +75,11 @@ public class Lighting {
} }
} }
} }
public void resetDay() {
dayState = DayState.DAY;
filterAlpha = 0f;
dayCount = 0;
}
// ... // ...
public void setLightSource() { public void setLightSource() {