Add levelling up mechanics through experience gained via killing enemies

This commit is contained in:
Peter Stockings
2026-01-04 18:36:31 +11:00
parent 42cd77998d
commit 29e46093f5
11 changed files with 373 additions and 84 deletions

View File

@@ -10,7 +10,8 @@ import { TILE_SIZE } from "../core/constants";
import { inBounds, isBlocked, isPlayerOnExit } from "../engine/world/world-logic";
import { findPathAStar } from "../engine/world/pathfinding";
import { applyAction, stepUntilPlayerTurn } from "../engine/simulation/simulation";
import { makeTestWorld } from "../engine/world/generator";
import { generateWorld } from "../engine/world/generator";
import { DungeonRenderer } from "../rendering/DungeonRenderer";
import { GAME_CONFIG } from "../core/config/GameConfig";
@@ -18,7 +19,8 @@ export class GameScene extends Phaser.Scene {
private world!: World;
private playerId!: EntityId;
private levelIndex = 1;
private floorIndex = 1;
private gameState: "playing" | "player-turn" | "enemy-turn" = "player-turn";
private runState: RunState = {
stats: { ...GAME_CONFIG.player.initialStats },
@@ -62,8 +64,8 @@ export class GameScene extends Phaser.Scene {
this.isMenuOpen = isOpen;
});
// Load initial level
this.loadLevel(1);
// Load initial floor
this.loadFloor(1);
// Menu Inputs
this.input.keyboard?.on("keydown-I", () => {
@@ -214,7 +216,7 @@ export class GameScene extends Phaser.Scene {
this.events.emit("update-ui", {
world: this.world,
playerId: this.playerId,
levelIndex: this.levelIndex
floorIndex: this.floorIndex
});
}
@@ -237,16 +239,23 @@ export class GameScene extends Phaser.Scene {
if (player) {
this.dungeonRenderer.showWait(player.pos.x, player.pos.y);
}
} else if (ev.type === "orb-spawned") {
this.dungeonRenderer.spawnOrb(ev.orbId, ev.x, ev.y);
} else if (ev.type === "exp-collected" && ev.actorId === this.playerId) {
this.dungeonRenderer.collectOrb(ev.actorId, ev.amount, ev.x, ev.y);
} else if (ev.type === "leveled-up" && ev.actorId === this.playerId) {
this.dungeonRenderer.showLevelUp(ev.x, ev.y);
}
}
// Check if player died
if (!this.world.actors.has(this.playerId)) {
this.syncRunStateFromPlayer(); // Save final stats for death screen
const uiScene = this.scene.get("GameUI") as any;
if (uiScene) {
uiScene.showDeathScreen({
level: this.levelIndex,
floor: this.floorIndex,
gold: this.runState.inventory.gold,
stats: this.runState.stats
});
@@ -257,7 +266,8 @@ export class GameScene extends Phaser.Scene {
// Level transition
if (isPlayerOnExit(this.world, this.playerId)) {
this.syncRunStateFromPlayer();
this.loadLevel(this.levelIndex + 1);
this.floorIndex++;
this.loadFloor(this.floorIndex);
return;
}
@@ -267,10 +277,10 @@ export class GameScene extends Phaser.Scene {
this.emitUIUpdate();
}
private loadLevel(level: number) {
this.levelIndex = level;
private loadFloor(floor: number) {
this.floorIndex = floor;
const { world, playerId } = makeTestWorld(level, this.runState);
const { world, playerId } = generateWorld(floor, this.runState);
this.world = world;
this.playerId = playerId;
@@ -281,8 +291,8 @@ export class GameScene extends Phaser.Scene {
// Camera bounds for this level
this.cameras.main.setBounds(0, 0, this.world.width * TILE_SIZE, this.world.height * TILE_SIZE);
// Initialize Renderer for new level
this.dungeonRenderer.initializeLevel(this.world);
// Initialize Renderer for new floor
this.dungeonRenderer.initializeFloor(this.world);
// Step until player turn
const enemyStep = stepUntilPlayerTurn(this.world, this.playerId);
@@ -292,7 +302,6 @@ export class GameScene extends Phaser.Scene {
this.centerCameraOnPlayer();
this.dungeonRenderer.render(this.playerPath);
this.emitUIUpdate();
}
private syncRunStateFromPlayer() {
@@ -310,9 +319,11 @@ export class GameScene extends Phaser.Scene {
stats: { ...GAME_CONFIG.player.initialStats },
inventory: { gold: 0, items: [] }
};
this.loadLevel(1);
this.floorIndex = 1;
this.loadFloor(this.floorIndex);
}
private centerCameraOnPlayer() {
const player = this.world.actors.get(this.playerId)!;
this.cameras.main.centerOn(