Add levelling up mechanics through experience gained via killing enemies
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user