106 lines
2.9 KiB
JavaScript
106 lines
2.9 KiB
JavaScript
import { DungeonGenerator } from '../dungeon/DungeonGenerator.js';
|
|
|
|
/**
|
|
* GameEngine for Manual Dungeon Construction with Player Movement
|
|
*/
|
|
export class GameEngine {
|
|
constructor() {
|
|
this.dungeon = new DungeonGenerator();
|
|
this.player = null;
|
|
this.selectedEntity = null;
|
|
this.isRunning = false;
|
|
|
|
// Callbacks
|
|
this.onEntityUpdate = null;
|
|
this.onEntityMove = null;
|
|
this.onEntitySelect = null;
|
|
this.onPathChange = null;
|
|
}
|
|
|
|
startMission(missionConfig) {
|
|
console.log('[GameEngine] Starting mission:', missionConfig.name);
|
|
this.dungeon.startDungeon(missionConfig);
|
|
|
|
// Create player at center of first tile
|
|
this.createPlayer(1.5, 2.5); // Center of 2x6 corridor
|
|
|
|
this.isRunning = true;
|
|
}
|
|
|
|
createPlayer(x, y) {
|
|
this.player = {
|
|
id: 'p1',
|
|
name: 'Barbarian',
|
|
x: Math.floor(x),
|
|
y: Math.floor(y),
|
|
texturePath: '/assets/images/dungeon1/standees/barbaro.png'
|
|
};
|
|
|
|
if (this.onEntityUpdate) {
|
|
this.onEntityUpdate(this.player);
|
|
}
|
|
|
|
console.log('[GameEngine] Player created at', this.player.x, this.player.y);
|
|
}
|
|
|
|
onCellClick(x, y) {
|
|
// If no player selected, select player on click
|
|
if (!this.selectedEntity && this.player && x === this.player.x && y === this.player.y) {
|
|
this.selectedEntity = this.player;
|
|
if (this.onEntitySelect) {
|
|
this.onEntitySelect(this.player.id, true);
|
|
}
|
|
console.log('[GameEngine] Player selected');
|
|
return;
|
|
}
|
|
|
|
// If player selected, move to clicked cell
|
|
if (this.selectedEntity === this.player) {
|
|
if (this.canMoveTo(x, y)) {
|
|
this.movePlayer(x, y);
|
|
} else {
|
|
console.log('[GameEngine] Cannot move there');
|
|
}
|
|
}
|
|
}
|
|
|
|
canMoveTo(x, y) {
|
|
// Check if cell is walkable (occupied by a tile)
|
|
return this.dungeon.grid.isOccupied(x, y);
|
|
}
|
|
|
|
movePlayer(x, y) {
|
|
// Simple direct movement (no pathfinding for now)
|
|
const path = [{ x, y }];
|
|
|
|
this.player.x = x;
|
|
this.player.y = y;
|
|
|
|
if (this.onEntityMove) {
|
|
this.onEntityMove(this.player, path);
|
|
}
|
|
|
|
// Deselect after move
|
|
this.selectedEntity = null;
|
|
if (this.onEntitySelect) {
|
|
this.onEntitySelect(this.player.id, false);
|
|
}
|
|
|
|
console.log('[GameEngine] Player moved to', x, y);
|
|
}
|
|
|
|
isPlayerAdjacentToDoor(doorExit) {
|
|
if (!this.player) return false;
|
|
|
|
const dx = Math.abs(this.player.x - doorExit.x);
|
|
const dy = Math.abs(this.player.y - doorExit.y);
|
|
|
|
// Adjacent means distance of 1 in one direction and 0 in the other
|
|
return (dx === 1 && dy === 0) || (dx === 0 && dy === 1);
|
|
}
|
|
|
|
update(time) {
|
|
// Minimal update loop
|
|
}
|
|
}
|