mirror of
https://github.com/Such-Software/wownerogue.git
synced 2026-10-19 07:08:33 +02:00
196 lines
8.0 KiB
JavaScript
196 lines
8.0 KiB
JavaScript
/**
|
|
* ScreenManager - Handles drawing different game screens
|
|
*/
|
|
var ScreenManager = {
|
|
displayManager: null,
|
|
defaultFg: "#FFF",
|
|
|
|
init: function(displayManager) {
|
|
this.displayManager = displayManager;
|
|
},
|
|
|
|
drawWelcomeScreen: function() {
|
|
if (!this.displayManager.isReady()) return;
|
|
|
|
console.log("Drawing welcome screen");
|
|
this.displayManager.clear();
|
|
this.displayManager.drawBorder(this.defaultFg);
|
|
|
|
// Draw content with centered text
|
|
let y = 3;
|
|
y = this.displayManager.drawCenteredText(y, "WOWGUE", this.defaultFg);
|
|
y += 4;
|
|
|
|
// Draw instructions
|
|
y = this.displayManager.drawCenteredText(y, "Type enter to start!", this.defaultFg);
|
|
y = this.displayManager.drawCenteredText(y, "Or type help...", this.defaultFg);
|
|
y += 2;
|
|
|
|
// Draw legend
|
|
const centerX = Math.floor(this.displayManager.getScreenWidth() / 2) - 11;
|
|
const symbols = this.displayManager.symbols;
|
|
|
|
this.displayManager.draw(centerX, y, symbols.player, this.defaultFg, null);
|
|
this.displayManager.drawText(centerX + 2, y, "- This is you", this.defaultFg);
|
|
y++;
|
|
|
|
this.displayManager.draw(centerX, y, symbols.exit, this.defaultFg, null);
|
|
this.displayManager.drawText(centerX + 2, y, "- Escape the dungeon", this.defaultFg);
|
|
y++;
|
|
|
|
this.displayManager.draw(centerX, y, symbols.monster, this.defaultFg, null);
|
|
this.displayManager.drawText(centerX + 2, y, "- Avoid the monster", this.defaultFg);
|
|
y++;
|
|
|
|
this.displayManager.draw(centerX, y, symbols.treasure, this.defaultFg, null);
|
|
this.displayManager.drawText(centerX + 2, y, "- Secure the bag", this.defaultFg);
|
|
y++;
|
|
|
|
// Draw footer
|
|
y += 1;
|
|
this.displayManager.drawCenteredText(17, "Type enter in chat =", this.defaultFg);
|
|
},
|
|
|
|
drawWinScreen: function(hasTreasure) {
|
|
if (!this.displayManager.isReady()) return;
|
|
|
|
console.log("Drawing win screen, hasTreasure:", hasTreasure);
|
|
this.displayManager.clear();
|
|
this.displayManager.drawBorder(this.defaultFg);
|
|
|
|
let y = 5;
|
|
y = this.displayManager.drawCenteredText(y, "YOU ESCAPED!", this.defaultFg);
|
|
y += 1;
|
|
|
|
const subtitle = hasTreasure ? "WITH THE TREASURE!" : "ALIVE!";
|
|
y = this.displayManager.drawCenteredText(y, subtitle, this.defaultFg);
|
|
y += 2;
|
|
|
|
if (hasTreasure) {
|
|
y = this.displayManager.drawCenteredText(y, "You won extra Wownero!", this.defaultFg);
|
|
y += 1;
|
|
}
|
|
|
|
y += 1;
|
|
this.displayManager.drawCenteredText(y, "Type ENTER to retry", this.defaultFg);
|
|
},
|
|
|
|
drawLoseScreen: function(reason) {
|
|
if (!this.displayManager.isReady()) return;
|
|
|
|
console.log("Drawing lose screen, reason:", reason);
|
|
this.displayManager.clear();
|
|
this.displayManager.drawBorder(this.defaultFg);
|
|
|
|
let y = 5;
|
|
y = this.displayManager.drawCenteredText(y, "YOU DIED!", this.defaultFg);
|
|
y += 1;
|
|
|
|
let subtitle = "";
|
|
if (reason === 'monster') {
|
|
subtitle = "KILLED BY THE MONSTER";
|
|
} else if (reason === 'timeout') {
|
|
subtitle = "YOU RAN OUT OF TIME";
|
|
}
|
|
|
|
if (subtitle) {
|
|
y = this.displayManager.drawCenteredText(y, subtitle, this.defaultFg);
|
|
y += 1;
|
|
}
|
|
|
|
y += 2;
|
|
this.displayManager.drawCenteredText(y, "Type ENTER to retry", this.defaultFg);
|
|
},
|
|
|
|
drawWaitingScreen: function() {
|
|
if (!this.displayManager.isReady()) return;
|
|
|
|
console.log("Drawing waiting screen");
|
|
this.displayManager.clear();
|
|
this.displayManager.drawBorder(this.defaultFg);
|
|
|
|
const centerY = Math.floor(this.displayManager.getScreenHeight() / 2);
|
|
this.displayManager.drawCenteredText(centerY, "Waiting for next block...", this.defaultFg);
|
|
},
|
|
|
|
drawGameScreen: function(gameState) {
|
|
if (!this.displayManager.isReady()) return;
|
|
|
|
console.log("Drawing game screen...");
|
|
this.displayManager.clear();
|
|
|
|
if (!gameState.player) {
|
|
console.error("No player data in game state!");
|
|
return;
|
|
}
|
|
|
|
const centerX = Math.floor(this.displayManager.getScreenWidth() / 2);
|
|
const centerY = Math.floor(this.displayManager.getScreenHeight() / 2);
|
|
const symbols = this.displayManager.symbols;
|
|
const playerX = gameState.player.x;
|
|
const playerY = gameState.player.y;
|
|
|
|
// Draw visible tiles centered on player (absolute to relative coordinate conversion)
|
|
for (let worldY in gameState.visibleTiles) {
|
|
worldY = parseInt(worldY);
|
|
for (let worldX in gameState.visibleTiles[worldY]) {
|
|
worldX = parseInt(worldX);
|
|
|
|
// Convert world coordinates to screen coordinates relative to player
|
|
const screenX = centerX + (worldX - playerX);
|
|
const screenY = centerY + (worldY - playerY);
|
|
|
|
if (screenX >= 0 && screenY >= 0 &&
|
|
screenX < this.displayManager.getScreenWidth() &&
|
|
screenY < this.displayManager.getScreenHeight()) {
|
|
|
|
const tileType = gameState.visibleTiles[worldY][worldX];
|
|
|
|
if (tileType === 1) { // Wall
|
|
this.displayManager.draw(screenX, screenY, symbols.wall, this.defaultFg, null);
|
|
} else { // Floor
|
|
this.displayManager.draw(screenX, screenY, symbols.floor, this.defaultFg, null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Draw entities with stacking (now with correct coordinate conversion)
|
|
this._drawEntityStacked(centerX, centerY, playerX, playerY, gameState.entrance, symbols.entrance, gameState.visibleTiles);
|
|
this._drawEntityStacked(centerX, centerY, playerX, playerY, gameState.exit, symbols.exit, gameState.visibleTiles);
|
|
this._drawEntityStacked(centerX, centerY, playerX, playerY, gameState.treasure, symbols.treasure, gameState.visibleTiles);
|
|
this._drawEntityStacked(centerX, centerY, playerX, playerY, gameState.monster, symbols.monster, gameState.visibleTiles);
|
|
|
|
// Always draw player at center
|
|
const baseTile = gameState.visibleTiles[playerY] && gameState.visibleTiles[playerY][playerX] === 1 ?
|
|
symbols.wall : symbols.floor;
|
|
this.displayManager.draw(centerX, centerY, [baseTile, symbols.player],
|
|
[this.defaultFg, this.defaultFg], [null, null]);
|
|
},
|
|
|
|
_drawEntityStacked: function(centerX, centerY, playerX, playerY, entity, symbol, visibleTiles) {
|
|
if (!entity) return;
|
|
|
|
const entityX = Array.isArray(entity) ? entity[0] : entity.x;
|
|
const entityY = Array.isArray(entity) ? entity[1] : entity.y;
|
|
|
|
// Convert world coordinates to screen coordinates relative to player
|
|
const screenX = centerX + (entityX - playerX);
|
|
const screenY = centerY + (entityY - playerY);
|
|
|
|
if (screenX >= 0 && screenY >= 0 &&
|
|
screenX < this.displayManager.getScreenWidth() &&
|
|
screenY < this.displayManager.getScreenHeight()) {
|
|
|
|
// Check if entity is visible
|
|
if (visibleTiles[entityY] && visibleTiles[entityY][entityX] !== undefined) {
|
|
const baseTile = visibleTiles[entityY][entityX] === 1 ?
|
|
this.displayManager.symbols.wall : this.displayManager.symbols.floor;
|
|
|
|
this.displayManager.draw(screenX, screenY, [baseTile, symbol],
|
|
[this.defaultFg, this.defaultFg], [null, null]);
|
|
}
|
|
}
|
|
}
|
|
};
|