diff --git a/README.md b/README.md
index dc80cb1..9abae1b 100644
--- a/README.md
+++ b/README.md
@@ -88,39 +88,52 @@ The backend has been refactored into focused modules organized by domain for mai
- **Debug/Production Split**: Development and production logic properly separated
- **Maintainable**: 600-line monolith reduced to focused 69-line orchestrator
-### Frontend Structure (`html/`)
+### Frontend Structure (`html/js/`)
-#### Modular JavaScript Architecture:
+The frontend has been reorganized into a logical directory structure for better maintainability:
-1. **DisplayManager.js** - Display & Canvas Management
- - ROT.Display initialization and setup
- - Display state management and clearing
- - Tile-based rendering system
+#### **Organized JavaScript Architecture:**
-2. **ScreenManager.js** - Screen State Management
- - Welcome screen with block simulation
- - Win/lose screens and waiting screens
- - Centered text drawing utilities
+**Core Game Logic (`core/`)**
+- **game.js** - Main Game Controller coordinating all modules with clean APIs
+- **gameState.js** - Game State Management (player, map, monster, item data)
+- **options.js** - Game configuration and settings
-3. **RenderEngine.js** - Game Rendering Engine
- - Game screen rendering and object drawing
- - Field of view rendering and visibility checks
- - Drawing game objects (player, monsters, items, terrain)
+**Display & Rendering (`display/`)**
+- **displayManager.js** - Display & Canvas Management (ROT.Display initialization)
+- **screenManager.js** - Screen State Management (welcome, win/lose, waiting screens)
+- **renderEngine.js** - Game Rendering Engine (FOV rendering, drawing game objects)
+- **waitingScreenAnimator.js** - Animated waiting screens during block progression
-4. **GameState.js** - Game State Management
- - Player, map, monster, item data management
- - Game state updates and validation
- - Field of view computation and player movement logic
+**User Interface (`ui/`)**
+- **ui.js** - User interface management and chat functionality
+- **teletype.js** - Typewriter-style text effects
-5. **game.js** - Main Game Controller
- - Coordinates all modules with clean APIs
- - Provides backward-compatible interface
- - Handles game initialization and flow
+**Input Handling (`input/`)**
+- **inputHandler.js** - Keyboard/mouse input with movement throttling
-6. **Additional Modules**:
- - **inputHandler.js** - Keyboard/mouse input with movement throttling
- - **socketHandlers.js** - WebSocket communication with initialization protection
- - **ui.js** - User interface management and chat functionality
+**Network Communication (`network/`)**
+- **socketHandlers.js** - WebSocket communication with initialization protection
+
+**External Libraries (`lib/`)**
+- **jquery-3.4.1.min.js** - jQuery library
+- **rot.js** & **rot.min.js** - ROT.js library for roguelike mechanics
+
+## Recent Updates & Production Readiness
+
+### Console Logging Cleanup
+- **Backend**: Implemented conditional logging using `process.env.NODE_ENV` checks
+- **Frontend**: Removed verbose console.log statements while preserving error logging
+- **Production Ready**: Clean console output in production mode controlled by environment variables
+
+### Monster Collision Fix
+- **Exact Tile Collision**: Fixed monster kill logic to only trigger when monster and player occupy the exact same tile
+- **Removed Adjacent Kills**: Players are no longer killed when monsters are merely adjacent
+
+### Code Organization
+- **Frontend Restructure**: Organized JavaScript files into logical directories (`core/`, `display/`, `ui/`, `input/`, `network/`, `lib/`)
+- **Better Maintainability**: Clear separation of concerns with modular file structure
+- **Updated HTML**: Both `index.html` and `debug.html` updated to reference new file paths
## Socket Event Architecture
@@ -228,7 +241,7 @@ wowngeon/
│ │ ├── game.js # Game class with factory methods
│ │ ├── dungeon.js # Dungeon generation system
│ │ ├── player.js # Player state management
-│ │ ├── monster.js # Monster AI
+│ │ ├── monster.js # Monster AI with exact collision detection
│ │ ├── lightingAndFov.js # Field of view calculations
│ │ ├── rot.js # ROT.js library
│ │ └── rot.min.js # ROT.js minified
@@ -244,16 +257,28 @@ wowngeon/
│ └── debugManager.js # Debug/production mode handling
├── html/ # Frontend web interface
│ ├── index.html # Main game page
-│ ├── js/ # Modular JavaScript
-│ │ ├── displayManager.js # Display management
-│ │ ├── screenManager.js # Screen states
-│ │ ├── renderEngine.js # Game rendering
-│ │ ├── gameState.js # Game state management
-│ │ ├── game.js # Main game controller
-│ │ ├── inputHandler.js # Input handling
-│ │ ├── socketHandlers.js # WebSocket communication
-│ │ ├── ui.js # User interface
-│ │ └── options.js # Game configuration
+│ ├── debug.html # Debug testing page
+│ ├── js/ # Organized JavaScript modules
+│ │ ├── core/ # Core game logic
+│ │ │ ├── game.js # Main game controller
+│ │ │ ├── gameState.js # Game state management
+│ │ │ └── options.js # Game configuration
+│ │ ├── display/ # Display and rendering
+│ │ │ ├── displayManager.js # Display management
+│ │ │ ├── screenManager.js # Screen states
+│ │ │ ├── renderEngine.js # Game rendering
+│ │ │ └── waitingScreenAnimator.js # Animated screens
+│ │ ├── ui/ # User interface
+│ │ │ ├── ui.js # UI management
+│ │ │ └── teletype.js # Text effects
+│ │ ├── input/ # Input handling
+│ │ │ └── inputHandler.js # Keyboard/mouse input
+│ │ ├── network/ # Network communication
+│ │ │ └── socketHandlers.js # WebSocket communication
+│ │ └── lib/ # External libraries
+│ │ ├── jquery-3.4.1.min.js
+│ │ ├── rot.js
+│ │ └── rot.min.js
│ ├── styles/ # CSS styling
│ └── tiles.png # Game tile graphics
└── test/ # Test files
diff --git a/html/debug.html b/html/debug.html
index 9bb7d18..7883efe 100644
--- a/html/debug.html
+++ b/html/debug.html
@@ -51,16 +51,16 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
diff --git a/html/js/game.js b/html/js/core/game.js
similarity index 85%
rename from html/js/game.js
rename to html/js/core/game.js
index e4f6ee3..927c13e 100644
--- a/html/js/game.js
+++ b/html/js/core/game.js
@@ -3,7 +3,7 @@
if (typeof window !== 'undefined' && !window.socket) {
window.socket = {
emit: function(event, data) {
- console.log("[Mock Socket] Would emit:", event, data);
+ // Mock socket emit - removed debug logging
}
};
}
@@ -16,8 +16,6 @@ var Game = {
_maxLogMessages: 5,
init: function() {
- console.log("Game.init called - Modular version");
-
// Update screen dimensions from options
if (typeof options !== 'undefined') {
this._screenWidth = options.width || 25;
@@ -52,21 +50,16 @@ var Game = {
console.error("Game: Cannot start game, display not ready.");
return false;
}
- console.log("Game: startGame called. PlayerData:", playerData, "MapData:", mapData, "InitialVisibleTiles:", initialVisibleTiles);
- console.log("🔥 LIGHTING DATA received in startGame:", lightingData);
- console.log("🔦 TORCH DATA received in startGame:", torchData);
DisplayManager.clearDisplay();
// Force clear all display caches and artifacts
if (typeof DisplayManager !== 'undefined' && DisplayManager.forceClearToBlack) {
- console.log("✅ Force clearing display to prevent artifacts...");
DisplayManager.forceClearToBlack();
}
// Stop the block simulation to prevent welcome screen from interfering
if (typeof ScreenManager !== 'undefined' && ScreenManager.stopBlockSimulation) {
- console.log("✅ Stopping block simulation...");
ScreenManager.stopBlockSimulation();
}
@@ -74,7 +67,6 @@ var Game = {
GameState.setGameActive(true);
// Clear any previous game state but preserve what we need for initialization
- console.log("✅ Clearing previous game state (but preserving server data)...");
GameState._exploredTiles = {};
// Don't clear _visibleTiles yet - let initializeMap handle it properly
GameState._map = {};
@@ -97,11 +89,9 @@ var Game = {
// Initialize lighting and torch data
if (lightingData) {
GameState._lighting = lightingData;
- console.log("🔥 GameState: Lighting data stored with", Object.keys(lightingData).length, "rows");
}
if (torchData) {
GameState._torches = torchData;
- console.log("🔦 GameState: Torch data stored with", torchData.length, "torches");
}
// Initialize map and validate player position
@@ -122,7 +112,6 @@ var Game = {
GameState._scheduler.add(GameState._player, true);
- console.log("Player coordinates before drawing game screen:", GameState._player.x, GameState._player.y);
if (!GameState._map[GameState._player.y] || GameState._map[GameState._player.y][GameState._player.x] === undefined) {
console.error(`Player position (${GameState._player.x}, ${GameState._player.y}) is STILL invalid before drawing. Map issue?`);
ScreenManager.drawCenteredText(10, "Error: Player invalid for draw!");
@@ -130,7 +119,6 @@ var Game = {
}
this._drawGameScreen();
- console.log("Game started successfully and initial screen drawn.");
return true;
} catch (err) {
@@ -155,7 +143,6 @@ var Game = {
// Redraw the game screen if any relevant data changed
if (needsRedraw) {
- console.log("Redrawing game screen due to game update.");
this._drawGameScreen();
}
},
@@ -168,14 +155,6 @@ var Game = {
if (!this._ensureDisplay()) return;
const gameState = GameState.getGameStateForRender();
- // Debug: Verify lighting data is included in render state
- console.log("🎨 _drawGameScreen() passing lighting data:", {
- hasLighting: !!gameState.lighting,
- lightingKeys: gameState.lighting ? Object.keys(gameState.lighting).length : 0,
- hasTorches: !!gameState.torches,
- torchCount: gameState.torches ? gameState.torches.length : 0
- });
-
RenderEngine.drawGameScreen(gameState);
},
diff --git a/html/js/gameState.js b/html/js/core/gameState.js
similarity index 84%
rename from html/js/gameState.js
rename to html/js/core/gameState.js
index a1988f0..12d3af1 100644
--- a/html/js/gameState.js
+++ b/html/js/core/gameState.js
@@ -68,7 +68,6 @@ var GameState = {
// Try to initialize from mapData.tiles
if (mapData && mapData.tiles && typeof mapData.tiles === 'object' && Object.keys(mapData.tiles).length > 0) {
- console.log("Initializing map from mapData.tiles:", mapData.tiles);
for (var yKey in mapData.tiles) {
const y = parseInt(yKey);
this._map[y] = {};
@@ -78,11 +77,9 @@ var GameState = {
}
}
mapInitialized = true;
- console.log("Game map initialized from mapData.tiles:", this._map);
}
// Try array-based mapData
else if (mapData && Array.isArray(mapData) && mapData.length > 0) {
- console.warn("Received array-based mapData, attempting to convert.");
for (let y = 0; y < mapData.length; y++) {
this._map[y] = {};
if (mapData[y] && Array.isArray(mapData[y])) {
@@ -92,11 +89,9 @@ var GameState = {
}
}
mapInitialized = true;
- console.log("Game map initialized from array-based mapData:", this._map);
}
// Try initialVisibleTiles
else if (initialVisibleTiles && typeof initialVisibleTiles === 'object' && Object.keys(initialVisibleTiles).length > 0) {
- console.log("Initializing _visibleTiles from server-sent initialVisibleTiles and inferring _map for FOV.");
this._visibleTiles = JSON.parse(JSON.stringify(initialVisibleTiles)); // Deep copy
for (const yKey in this._visibleTiles) {
@@ -108,8 +103,6 @@ var GameState = {
}
}
mapInitialized = true;
- console.log("Game map partially initialized for FOV from initialVisibleTiles:", this._map);
- console.log("_visibleTiles set directly from initialVisibleTiles:", this._visibleTiles);
}
// Create default map if nothing worked
@@ -131,7 +124,6 @@ var GameState = {
this._map[this._player.y][this._player.x] = 0; // Force floor
}
}
- console.log("Default game map created. Player position:", this._player.x, this._player.y);
}
return mapInitialized;
@@ -150,7 +142,6 @@ var GameState = {
if (tile === 0 || tile === "'1" || tile === "'2") {
this._player.x = x_scan;
this._player.y = y_scan;
- console.warn(`Player moved to fallback position: (${this._player.x}, ${this._player.y})`);
foundFallback = true;
break;
}
@@ -191,7 +182,6 @@ var GameState = {
// NOTE: Don't call updateExploredTiles() here on initial game load
// Explored tiles should only be updated when player moves, not on first FOV computation
- console.log("Initial FOV computed/processed. Visible tiles count:", Object.keys(this._visibleTiles).reduce((acc, yKey) => acc + Object.keys(this._visibleTiles[yKey]).length, 0));
},
updateExploredTiles: function() {
@@ -207,8 +197,6 @@ var GameState = {
},
updateGameState: function(data) {
- console.log("🎲 GameState.updateGameState received data:", data);
-
if (!this._gameActive) {
console.warn("GameState.updateGameState called, but game is not active. Ignoring update.");
return false;
@@ -255,33 +243,25 @@ var GameState = {
// Update lighting and torch data
if (data.lighting !== undefined) {
- console.log("🔥 BEFORE UPDATE: this._lighting has", this._lighting ? Object.keys(this._lighting).length : 0, "rows");
- console.log("🔥 NEW DATA: data.lighting has", Object.keys(data.lighting).length, "rows");
- console.log("🔥 LIGHTING DATA SAMPLE:", JSON.stringify(data.lighting).substring(0, 200));
this._lighting = data.lighting;
- console.log("🔥 AFTER UPDATE: this._lighting has", this._lighting ? Object.keys(this._lighting).length : 0, "rows");
needsRedraw = true;
}
if (data.torches !== undefined) {
this._torches = data.torches;
needsRedraw = true;
- console.log("🔦 GameState: Updated torch data with", data.torches.length, "torches");
}
// Update visible tiles (most critical for movement feedback)
if (data.visibleTiles && typeof data.visibleTiles === 'object' && Object.keys(data.visibleTiles).length > 0) {
- console.log("Visible tiles updated. Number of rows:", Object.keys(data.visibleTiles).length);
this._visibleTiles = data.visibleTiles;
// Debug log for specific problematic coordinates
if (this._visibleTiles[18] && (this._visibleTiles[18][36] !== undefined || this._visibleTiles[18][35] !== undefined)) {
const clientDebug = `🔍 CLIENT y=18: x=35: ${this._visibleTiles[18][35]}, x=36: ${this._visibleTiles[18][36]}`;
- console.log(clientDebug);
if (window.GameDebug) window.GameDebug.updateDebugDisplay(clientDebug);
}
if (this._visibleTiles[16] && (this._visibleTiles[16][36] !== undefined || this._visibleTiles[16][35] !== undefined)) {
const clientDebug = `🔍 CLIENT y=16: x=35: ${this._visibleTiles[16][35]}, x=36: ${this._visibleTiles[16][36]}`;
- console.log(clientDebug);
if (window.GameDebug) window.GameDebug.updateDebugDisplay(clientDebug);
}
@@ -313,19 +293,18 @@ var GameState = {
// Move the player
this._player.x = newX;
this._player.y = newY;
- console.log("Player moved to:", this._player.x, this._player.y);
// Update visibility and redraw
this.updateExploredTiles();
return true;
} else {
- console.log("Move blocked by wall or invalid map data at:", newX, newY);
return false;
}
},
- // Debug functions
+ // Debug functions
debugPrintMap: function(screenWidth, screenHeight) {
+ // Map debugging - preserve console.log for debug function
console.log("Current game map:");
for (let y = 0; y < screenHeight; y++) {
let row = "";
@@ -341,6 +320,7 @@ var GameState = {
},
debugTileMapping: function() {
+ // Tile mapping debugging - preserve console.log for debug function
const testValues = [0, 1, undefined, null];
for (const val of testValues) {
const char = (val === 1) ? '#' : "\'";
@@ -357,7 +337,8 @@ var GameState = {
return;
}
- console.log("⚠️ LOCAL FOV COMPUTATION (should only be used for testing without server)");
+ // Warning for local FOV computation (keep for debugging)
+ // console.log("⚠️ LOCAL FOV COMPUTATION (should only be used for testing without server)");
const oldVisibleTiles = JSON.parse(JSON.stringify(this._visibleTiles));
this._visibleTiles = {};
@@ -376,22 +357,10 @@ var GameState = {
if (!this._exploredTiles[y]) this._exploredTiles[y] = {};
this._exploredTiles[y][x] = this._map[y] && this._map[y][x] !== undefined ? this._map[y][x] : 0;
}.bind(this));
-
- console.log("FOV computed for player at:", this._player.x, this._player.y);
- console.log("Visible tiles:", Object.keys(this._visibleTiles).length);
},
// Get game state data for rendering
getGameStateForRender: function() {
- // Debug: Log the actual lighting data being returned
- console.log("🔍 getGameStateForRender() lighting check:", {
- lightingExists: !!this._lighting,
- lightingKeys: this._lighting ? Object.keys(this._lighting).length : 0,
- lightingRef: this._lighting,
- torchExists: !!this._torches,
- torchCount: this._torches ? this._torches.length : 0
- });
-
const renderState = {
map: this._map,
player: this._player,
@@ -408,7 +377,6 @@ var GameState = {
torches: this._torches
};
- console.log("🔍 getGameStateForRender() RETURNING lighting with", renderState.lighting ? Object.keys(renderState.lighting).length : 0, "keys");
return renderState;
},
diff --git a/html/js/options.js b/html/js/core/options.js
similarity index 100%
rename from html/js/options.js
rename to html/js/core/options.js
diff --git a/html/js/displayManager.js b/html/js/display/displayManager.js
similarity index 100%
rename from html/js/displayManager.js
rename to html/js/display/displayManager.js
diff --git a/html/js/renderEngine.js b/html/js/display/renderEngine.js
similarity index 97%
rename from html/js/renderEngine.js
rename to html/js/display/renderEngine.js
index b428581..f8df427 100644
--- a/html/js/renderEngine.js
+++ b/html/js/display/renderEngine.js
@@ -120,9 +120,9 @@ var RenderEngine = {
const isCurrentlyVisible = this.isVisible(wx, wy, visibleTiles);
// Added log to inspect lightingAlpha for visible, lit tiles
- if (isCurrentlyVisible && lightingAlpha > 0.01) { // Using 0.01 to catch small, non-zero alphas
- console.log(`RenderEngine TRACE: Tile (${wx},${wy}), Visible: ${isCurrentlyVisible}, lightingAlpha: ${lightingAlpha.toFixed(3)}, from: ${lighting[wy] ? lighting[wy][wx].toFixed(3) : 'N/A'}`);
- }
+ // if (isCurrentlyVisible && lightingAlpha > 0.01) { // Using 0.01 to catch small, non-zero alphas
+ // console.log(`RenderEngine TRACE: Tile (${wx},${wy}), Visible: ${isCurrentlyVisible}, lightingAlpha: ${lightingAlpha.toFixed(3)}, from: ${lighting[wy] ? lighting[wy][wx].toFixed(3) : 'N/A'}`);
+ // }
if (isCurrentlyVisible) {
if (lightingAlpha > 0) {
diff --git a/html/js/screenManager.js b/html/js/display/screenManager.js
similarity index 93%
rename from html/js/screenManager.js
rename to html/js/display/screenManager.js
index 9ea60f0..7e6f57d 100644
--- a/html/js/screenManager.js
+++ b/html/js/display/screenManager.js
@@ -115,13 +115,10 @@ var ScreenManager = {
// Hide animation button on welcome screen
this.hideAnimationButton();
- // Debug button (shown only in development)
+ // Debug mode detection (for future use)
const isDebugMode = window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1' ||
window.location.protocol === 'file:';
- if (isDebugMode) {
- this.drawCenteredText(this._screenHeight - 3, "[DEBUG: Press D]");
- }
},
@@ -135,7 +132,6 @@ var ScreenManager = {
// Start simulated block mining (30 second intervals)
startBlockSimulation: function() {
- console.log("Starting block simulation...");
this._currentBlockHeight = Math.floor(Math.random() * 1000000) + 3200000; // Realistic Wownero block height
this._waitingForBlock = true;
@@ -179,7 +175,6 @@ var ScreenManager = {
// Stop block simulation
stopBlockSimulation: function() {
- console.log("Stopping block simulation and clearing all intervals...");
if (this._blockTimer) {
clearInterval(this._blockTimer);
this._blockTimer = null;
@@ -238,8 +233,6 @@ var ScreenManager = {
const animationEnabled = (typeof WaitingScreenAnimator !== 'undefined') ?
WaitingScreenAnimator.isAnimationEnabled() : false;
- console.log("🎬 Drawing waiting screen, animation enabled:", animationEnabled);
-
// Delegate to WaitingScreenAnimator with proper parameters
if (typeof WaitingScreenAnimator !== 'undefined') {
if (animationEnabled) {
@@ -286,9 +279,9 @@ var ScreenManager = {
const animationEnabled = (typeof WaitingScreenAnimator !== 'undefined') ?
WaitingScreenAnimator.isAnimationEnabled() : false;
animButton.textContent = animationEnabled ? '🎬 DISABLE ANIMATION' : '🎬 ENABLE ANIMATION';
- console.log("✅ Animation button shown:", animButton.textContent);
} else {
- console.warn("❌ Animation button element not found!");
+ // Animation button element not found - non-critical warning
+ // console.warn("❌ Animation button element not found!");
}
},
@@ -303,14 +296,13 @@ var ScreenManager = {
let animButton = document.getElementById('animationToggleButton');
if (!animButton) {
- console.warn("🔧 Animation button not found, checking if it exists in DOM...");
- // Try to find it by class or create it if missing
+ // Animation button not found - create or handle missing button
const statusDiv = document.querySelector('.status');
if (statusDiv) {
const existingButtons = statusDiv.querySelectorAll('button');
- console.log("Found buttons in status div:", existingButtons.length);
+ // Check existing buttons for debugging
for (let btn of existingButtons) {
- console.log("Button:", btn.id, btn.textContent);
+ // Button discovery for debugging
}
}
return false;
diff --git a/html/js/waitingScreenAnimator.js b/html/js/display/waitingScreenAnimator.js
similarity index 100%
rename from html/js/waitingScreenAnimator.js
rename to html/js/display/waitingScreenAnimator.js
diff --git a/html/js/inputHandler.js b/html/js/input/inputHandler.js
similarity index 72%
rename from html/js/inputHandler.js
rename to html/js/input/inputHandler.js
index e460c5d..e2b8ecf 100644
--- a/html/js/inputHandler.js
+++ b/html/js/input/inputHandler.js
@@ -9,11 +9,9 @@ const InputHandler = {
init: function() {
if (this._initialized) {
- console.warn("InputHandler.init() called multiple times - ignoring duplicate call");
return;
}
- console.log("InputHandler: Initializing for the first time...");
this.setupChatForm();
this.setupFocusHandlers();
this.setupKeyboardControls();
@@ -30,12 +28,9 @@ const InputHandler = {
// Don't send empty messages
if (!msg) return false;
- console.log("📝 SENDING CHAT:", msg);
-
// If the message is "enter", always send it to server
// The server will handle queueing logic and timing
if (msg.toLowerCase() === 'enter') {
- console.log("🔑 'ENTER' COMMAND DETECTED - sending to server");
socket.emit('chat message', msg);
// Show appropriate screen based on current state
@@ -44,12 +39,10 @@ const InputHandler = {
window.location.protocol === 'file:';
if (isDebugMode || ScreenManager.canEnterGame()) {
- console.log("✅ Can enter immediately - showing waiting screen");
if (typeof ScreenManager !== 'undefined' && ScreenManager.drawWaitingScreen) {
ScreenManager.drawWaitingScreen();
}
} else {
- console.log("⏳ Will be queued - showing queue message");
$('#messages').append($('
').text("* You have been added to the queue! Game will start after next block."));
UI.scrollChat();
}
@@ -93,7 +86,6 @@ const InputHandler = {
}
if (moved) {
- console.log(`🎹 KEYDOWN: dx=${dx}, dy=${dy}, key=${e.key}, time=${Date.now()}`);
e.preventDefault(); // Prevent page scrolling
// Implement movement throttling to prevent rapid-fire movement
@@ -101,18 +93,15 @@ const InputHandler = {
if (now - self._lastMoveTime >= self._moveCooldown) {
// Send move immediately if enough time has passed
socket.emit('player_move', { dx: dx, dy: dy });
- console.log(`✅ EMITTED player_move: dx=${dx}, dy=${dy}`);
self._lastMoveTime = now;
self._pendingMove = null;
} else {
// Queue the move to be sent after cooldown
self._pendingMove = { dx: dx, dy: dy };
const timeToWait = self._moveCooldown - (now - self._lastMoveTime);
- console.log(`⏳ QUEUED move: dx=${dx}, dy=${dy}, waiting ${timeToWait}ms`);
setTimeout(() => {
if (self._pendingMove) {
socket.emit('player_move', self._pendingMove);
- console.log(`✅ EMITTED queued player_move: dx=${self._pendingMove.dx}, dy=${self._pendingMove.dy}`);
self._lastMoveTime = Date.now();
self._pendingMove = null;
}
@@ -121,47 +110,19 @@ const InputHandler = {
}
} else {
// Game display has focus but game is not active (welcome screen)
- // Check for debug key 'D' to start immediately
- if (e.key === 'D' || e.key === 'd') {
- // Check if we're in debug mode (localhost)
- const isDebugMode = window.location.hostname === 'localhost' ||
- window.location.hostname === '127.0.0.1' ||
- window.location.protocol === 'file:';
-
- if (isDebugMode) {
- console.log("🔧 DEBUG: 'D' key pressed - starting game immediately");
- e.preventDefault();
-
- // Emit enter command to start game immediately
- socket.emit('chat message', 'enter');
-
- // Show waiting screen while game starts
- if (typeof ScreenManager !== 'undefined' && ScreenManager.drawWaitingScreen) {
- ScreenManager.drawWaitingScreen();
- }
-
- // Add debug message to chat
- $('#messages').append($('').text("🔧 DEBUG: Starting game immediately..."));
- UI.scrollChat();
- } else {
- console.log("Debug key pressed but not in debug mode");
- }
- } else if (e.key === 'A' || e.key === 'a') {
+ // Only handle animation toggle
+ if (e.key === 'A' || e.key === 'a') {
// Toggle animation on waiting screen
- console.log("🎬 'A' key pressed - toggling animation");
e.preventDefault();
if (typeof ScreenManager !== 'undefined') {
ScreenManager.toggleAnimation();
}
- } else {
- console.log("Game display has focus, but Game is not active.");
}
}
} else if (e.key === 'Enter' && document.activeElement !== $('#chatInput')[0]) {
// If Enter is pressed and chat is not focused
if (typeof Game !== 'undefined' && !Game._gameActive) {
// On welcome screen - start the game
- console.log("🔑 Enter key pressed on welcome screen - starting game");
e.preventDefault();
const isDebugMode = window.location.hostname === 'localhost' ||
@@ -171,12 +132,10 @@ const InputHandler = {
socket.emit('chat message', 'enter');
if (isDebugMode || ScreenManager.canEnterGame()) {
- console.log("✅ Can enter immediately - showing waiting screen");
if (typeof ScreenManager !== 'undefined' && ScreenManager.drawWaitingScreen) {
ScreenManager.drawWaitingScreen();
}
} else {
- console.log("⏳ Will be queued - showing queue message");
$('#messages').append($('').text("* You have been added to the queue! Game will start after next block."));
UI.scrollChat();
}
@@ -196,12 +155,10 @@ const InputHandler = {
setupClickHandlers: function() {
// Add click handling for the HTML START button
$('#startButton').click(function(e) {
- console.log("🖱️ START button clicked - auto-starting game");
// Use the new auto_start event for immediate entry
socket.emit('auto_start');
- console.log("✅ Auto-start requested - showing waiting screen");
if (typeof ScreenManager !== 'undefined' && ScreenManager.drawWaitingScreen) {
ScreenManager.drawWaitingScreen();
}
@@ -213,7 +170,6 @@ const InputHandler = {
// Add click handling for the animation toggle button
$('#animationToggleButton').click(function(e) {
- console.log("🎬 Animation toggle button clicked");
if (typeof ScreenManager !== 'undefined' && ScreenManager.toggleAnimation) {
ScreenManager.toggleAnimation();
@@ -235,7 +191,6 @@ const InputHandler = {
if (toggleButton) {
toggleButton.addEventListener('click', function() {
try {
- console.log("Display mode switching is no longer needed - modes are equivalent");
toggleButton.textContent = 'Mode switching disabled';
toggleButton.disabled = true;
} catch (e) {
diff --git a/html/js/jquery-3.4.1.min.js b/html/js/lib/jquery-3.4.1.min.js
similarity index 100%
rename from html/js/jquery-3.4.1.min.js
rename to html/js/lib/jquery-3.4.1.min.js
diff --git a/html/js/rot.js b/html/js/lib/rot.js
similarity index 100%
rename from html/js/rot.js
rename to html/js/lib/rot.js
diff --git a/html/js/rot.min.js b/html/js/lib/rot.min.js
similarity index 100%
rename from html/js/rot.min.js
rename to html/js/lib/rot.min.js
diff --git a/html/js/socketHandlers.js b/html/js/network/socketHandlers.js
similarity index 67%
rename from html/js/socketHandlers.js
rename to html/js/network/socketHandlers.js
index e7dc1eb..767f589 100644
--- a/html/js/socketHandlers.js
+++ b/html/js/network/socketHandlers.js
@@ -6,7 +6,6 @@ const SocketHandlers = {
init: function() {
if (this._initialized) {
- console.warn("SocketHandlers.init() called multiple times - ignoring duplicate call");
return;
}
@@ -15,7 +14,6 @@ const SocketHandlers = {
return;
}
- console.log("SocketHandlers: Initializing for the first time...");
this.registerEventHandlers();
this._initialized = true;
},
@@ -40,7 +38,6 @@ const SocketHandlers = {
},
onConnect: function() {
- console.log("Connected with socket ID:", socket.id);
// Tell server our client ID
socket.emit('register_client', {
@@ -63,7 +60,6 @@ const SocketHandlers = {
onStatusUpdate: function(data) {
// Handle player-specific status updates
- console.log("📨 STATUS UPDATE received:", data);
// Display status message with appropriate styling
const statusClass = data.type === 'error' ? 'error' : 'status';
@@ -73,7 +69,6 @@ const SocketHandlers = {
onChatBroadcast: function(data) {
// Handle chat messages broadcast to all players
- console.log("💬 CHAT BROADCAST received:", data);
const timestamp = new Date(data.timestamp || Date.now()).toLocaleTimeString();
const chatMsg = `[${timestamp}] ${data.username || 'Anonymous'}: ${data.message}`;
@@ -83,7 +78,6 @@ const SocketHandlers = {
},
onWaitingStatus: function(data) {
- console.log("🕒 WAITING STATUS received:", data);
if (data.status === 'waiting') {
$('#messages').append($('').text(data.message));
@@ -97,15 +91,6 @@ const SocketHandlers = {
},
onGameStart: function(data) {
- console.log("🎮 Game start received with data:", data);
- console.log("🔍 DETAILED DATA CHECK:");
- console.log(" - Player:", data?.player);
- console.log(" - Map keys:", data?.map ? Object.keys(data.map).length : "NO MAP");
- console.log(" - Monster:", data?.monster);
- console.log(" - Items:", data?.items);
- console.log(" - VisibleTiles keys:", data?.visibleTiles ? Object.keys(data.visibleTiles).length : "NO VISIBLE TILES");
- console.log(" - Lighting keys:", data?.lighting ? Object.keys(data.lighting).length : "NO LIGHTING");
- console.log(" - Torches:", data?.torches ? data.torches.length : "NO TORCHES (expected - lighting calculated server-side)");
$('#messages').append($('').text("Starting game..."));
@@ -122,16 +107,11 @@ const SocketHandlers = {
try {
// Pass all game data including lighting and torches
var success = Game.startGame(data.player, data.map, data.monster, data.items, data.visibleTiles, data.lighting, data.torches);
- console.log("Game start result:", success ? "SUCCESS" : "FAILED");
if (!success) {
$('#messages').append($('').text("Game start failed. Check console for details."));
- console.log("❌ GAME START FAILED - reverting to welcome screen");
if (typeof Game !== 'undefined' && Game._drawWelcomeScreen) Game._drawWelcomeScreen();
} else {
- // Draw the initial game screen - the game draws itself after startGame()
- console.log("Game started successfully, initial screen should be drawn");
-
// Shift focus to the game display area after successful game start
$('#game-display').focus();
UI.updateFocusIndicator();
@@ -144,39 +124,9 @@ const SocketHandlers = {
},
onGameUpdate: function(data) {
- // Debug log to see what data we're receiving
- console.log("🎮 GAME UPDATE received with keys:", Object.keys(data));
-
- // Debug lighting data specifically
- if (data.lighting && Object.keys(data.lighting).length > 0) {
- console.log("🔥 GAME UPDATE: lighting data received with", Object.keys(data.lighting).length, "rows");
- } else {
- console.log("⚠️ GAME UPDATE: NO lighting data in update");
- }
-
- // Debug torch data specifically
- if (data.torches && data.torches.length > 0) {
- console.log("🔦 GAME UPDATE: torch data received with", data.torches.length, "torches");
- } else {
- console.log("ℹ️ GAME UPDATE: No torch data (expected - lighting calculated server-side)");
- }
if (data.visibleTiles) {
- const debugMsg = "🔍 SOCKET: Received game update with visibleTiles";
- console.log(debugMsg);
- if (window.GameDebug) window.GameDebug.updateDebugDisplay(debugMsg);
-
- // Check for specific coordinates that are problematic
- if (data.visibleTiles[18] && (data.visibleTiles[18][36] !== undefined || data.visibleTiles[18][35] !== undefined)) {
- const coordDebug = `🔍 SOCKET y=18: x=35: ${data.visibleTiles[18][35]}, x=36: ${data.visibleTiles[18][36]}`;
- console.log(coordDebug);
- if (window.GameDebug) window.GameDebug.updateDebugDisplay(coordDebug);
- }
- if (data.visibleTiles[16] && (data.visibleTiles[16][36] !== undefined || data.visibleTiles[16][35] !== undefined)) {
- const coordDebug = `🔍 SOCKET y=16: x=35: ${data.visibleTiles[16][35]}, x=36: ${data.visibleTiles[16][36]}`;
- console.log(coordDebug);
- if (window.GameDebug) window.GameDebug.updateDebugDisplay(coordDebug);
- }
+ if (window.GameDebug) window.GameDebug.updateDebugDisplay("SOCKET: Received game update with visibleTiles");
}
if (typeof Game !== 'undefined' && Game._gameActive) {
@@ -185,7 +135,6 @@ const SocketHandlers = {
},
onGameOver: function(data) {
- console.log("🎮 GAME OVER received:", data);
// Update game state based on outcome
if (typeof Game !== 'undefined') {
@@ -224,9 +173,7 @@ const SocketHandlers = {
}
// Auto-return to title screen after 30 seconds
- console.log("⏰ Setting 30-second timer to return to title screen...");
setTimeout(() => {
- console.log("⏰ 30 seconds elapsed - returning to title screen");
$('#messages').append($('').text("Returning to title screen..."));
UI.scrollChat();
@@ -250,7 +197,6 @@ const SocketHandlers = {
},
onQueueCancelled: function() {
- console.log("Queue cancelled, returning to welcome screen");
if (typeof Game !== 'undefined' && Game._drawWelcomeScreen) {
Game._drawWelcomeScreen();
@@ -260,7 +206,6 @@ const SocketHandlers = {
},
onBlockHeight: function(height) {
- console.log(`📈 BLOCK HEIGHT: ${height}`);
UI.updateBlockHeight(height);
$('#statusValue').text('Connected');
$('#statusValue').css('color', '#0f0');
diff --git a/html/js/teletype.js b/html/js/ui/teletype.js
similarity index 100%
rename from html/js/teletype.js
rename to html/js/ui/teletype.js
diff --git a/html/js/ui.js b/html/js/ui/ui.js
similarity index 96%
rename from html/js/ui.js
rename to html/js/ui/ui.js
index 19d3243..27fb61e 100644
--- a/html/js/ui.js
+++ b/html/js/ui/ui.js
@@ -21,15 +21,12 @@ const UI = {
if (document.activeElement === gameDisplay[0]) {
gameDisplay.css('outline', '2px solid yellow');
chatInput.css('outline', 'none');
- console.log("Focus: Game Display");
} else if (document.activeElement === chatInput[0]) {
chatInput.css('outline', '2px solid cyan');
gameDisplay.css('outline', 'none');
- console.log("Focus: Chat Input");
} else {
gameDisplay.css('outline', 'none');
chatInput.css('outline', 'none');
- console.log("Focus: None or Other");
}
},
diff --git a/src/db/dbcalls.js b/src/db/dbcalls.js
index 07f4fe5..56d4b02 100644
--- a/src/db/dbcalls.js
+++ b/src/db/dbcalls.js
@@ -1,5 +1,8 @@
const { Client } = require('pg');
+// Environment-based console logging control
+const CONSOLE_LOGGING = process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development';
+
const client = new Client({
user: 'postgres',
host: 'localhost',
@@ -21,7 +24,11 @@ function initializeDatabase() {
`;
client.query(createTableQuery)
- .then(() => console.log("Database initialized"))
+ .then(() => {
+ if (CONSOLE_LOGGING) {
+ console.log("Database initialized");
+ }
+ })
.catch(err => console.error("Database initialization error:", err));
}
@@ -43,7 +50,9 @@ function insertVisitor(socketid, ip, cookie) {
// If table doesn't exist yet, try to initialize again
if (res.rows[0].to_regclass === null) {
- console.log("Table 'visitors' doesn't exist yet, creating it now...");
+ if (CONSOLE_LOGGING) {
+ console.log("Table 'visitors' doesn't exist yet, creating it now...");
+ }
initializeDatabase();
return;
}
@@ -51,11 +60,15 @@ function insertVisitor(socketid, ip, cookie) {
// Insert the visitor
client.query(insertVisitorText, values, (err, res) => {
if (err) {
- console.log(err.stack);
+ console.error("Database insert error:", err.stack);
} else if (res.rows && res.rows[0]) {
- console.log("Visitor inserted:", res.rows[0]);
+ if (CONSOLE_LOGGING) {
+ console.log("Visitor inserted:", res.rows[0]);
+ }
} else {
- console.log("Visitor inserted");
+ if (CONSOLE_LOGGING) {
+ console.log("Visitor inserted");
+ }
}
});
});
diff --git a/src/db/user.js b/src/db/user.js
index 455133e..7277fd8 100644
--- a/src/db/user.js
+++ b/src/db/user.js
@@ -1,5 +1,8 @@
const Game = require('../game/game'); // Ensure Game is required
+// Environment-based console logging control
+const CONSOLE_LOGGING = process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development';
+
// User class definition
class User {
constructor(id, address) {
@@ -22,7 +25,9 @@ class User {
// Add user to the registry upon creation
userRegistry.set(id, this);
- console.log(`User created and registered: ${id}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`User created and registered: ${id}`);
+ }
}
/**
@@ -32,7 +37,9 @@ class User {
joinGame(gameInstance) {
this.currentGame = gameInstance;
this.stats.gamesPlayed++;
- console.log(`[User.joinGame] User ${this.id} joined game ${gameInstance.id}. Total games played: ${this.stats.gamesPlayed}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[User.joinGame] User ${this.id} joined game ${gameInstance.id}. Total games played: ${this.stats.gamesPlayed}`);
+ }
}
/**
@@ -64,7 +71,9 @@ class User {
this.stats.monstersDefeated += gameStats.monstersDefeated;
}
- console.log(`[User.endGame] User ${this.id} game ended: ${result}. Score: ${score}. Stats: ${JSON.stringify(this.stats)}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[User.endGame] User ${this.id} game ended: ${result}. Score: ${score}. Stats: ${JSON.stringify(this.stats)}`);
+ }
}
}
diff --git a/src/debug/debugManager.js b/src/debug/debugManager.js
index ec4aee5..a60c1d1 100644
--- a/src/debug/debugManager.js
+++ b/src/debug/debugManager.js
@@ -5,15 +5,50 @@
*/
const rpc = require('../rpc/rpccalls.js');
+const packageConfig = require('../package.json');
class DebugManager {
constructor(broadcastManager) {
this.broadcastManager = broadcastManager;
- this.DEBUG_MODE = true; // Set to false to disable debug mode
+
+ // Environment-based configuration
+ const nodeEnv = process.env.NODE_ENV || 'production';
+ this.IS_PRODUCTION = nodeEnv === 'production';
+ this.IS_DEBUG = nodeEnv === 'debug';
+ this.IS_DEVELOPMENT = nodeEnv === 'development';
+
+ // Debug mode is enabled in development or debug environments
+ this.DEBUG_MODE = this.IS_DEBUG || this.IS_DEVELOPMENT;
+
+ // Configuration from package.json
+ const config = this.IS_PRODUCTION ? packageConfig.config.production : packageConfig.config.debug;
+ this.CONSOLE_LOGGING = config.console_logging || this.DEBUG_MODE;
+ this.DEBUG_HOTKEYS = config.debug_hotkeys || this.DEBUG_MODE;
+ this.SIMULATED_BLOCKS = config.simulated_blocks || this.DEBUG_MODE;
+
this.debugBlockHeight = 1;
this.debugInterval = null;
this.statusInterval = null;
this.lastProductionBlockHeight = 0;
+
+ // Log configuration on startup
+ this.logConfig();
+ }
+
+ // ====== CONFIGURATION LOGGING ======
+
+ /**
+ * Log current configuration settings
+ */
+ logConfig() {
+ if (this.CONSOLE_LOGGING) {
+ console.log("🔧 DEBUG MANAGER CONFIGURATION:");
+ console.log(` NODE_ENV: ${process.env.NODE_ENV || 'production'}`);
+ console.log(` DEBUG_MODE: ${this.DEBUG_MODE}`);
+ console.log(` CONSOLE_LOGGING: ${this.CONSOLE_LOGGING}`);
+ console.log(` DEBUG_HOTKEYS: ${this.DEBUG_HOTKEYS}`);
+ console.log(` SIMULATED_BLOCKS: ${this.SIMULATED_BLOCKS}`);
+ }
}
// ====== INITIALIZATION ======
@@ -22,7 +57,7 @@ class DebugManager {
* Initialize debug mode or production mode
*/
initialize() {
- if (this.DEBUG_MODE) {
+ if (this.DEBUG_MODE && this.SIMULATED_BLOCKS) {
this.initializeDebugMode();
} else {
this.initializeProductionMode();
@@ -33,7 +68,9 @@ class DebugManager {
* Initialize debug mode with simulated blocks
*/
initializeDebugMode() {
- console.log("🐛 DEBUG MODE ENABLED - Simulating blocks every 30 seconds");
+ if (this.CONSOLE_LOGGING) {
+ console.log("🐛 DEBUG MODE ENABLED - Simulating blocks every 30 seconds");
+ }
// Initial debug block broadcast
this.broadcastManager.broadcastBlockHeight(this.debugBlockHeight);
@@ -41,7 +78,9 @@ class DebugManager {
// Debug block height simulator - advances every 30 seconds
this.debugInterval = setInterval(() => {
this.debugBlockHeight++;
- console.log(`🐛 DEBUG: New simulated block: ${this.debugBlockHeight}`);
+ if (this.CONSOLE_LOGGING) {
+ console.log(`🐛 DEBUG: New simulated block: ${this.debugBlockHeight}`);
+ }
this.broadcastManager.broadcastBlockHeight(this.debugBlockHeight);
// Notify listeners about new block
@@ -60,13 +99,17 @@ class DebugManager {
* Initialize production mode with real blockchain calls
*/
initializeProductionMode() {
- console.log("🚀 PRODUCTION MODE ENABLED - Using real blockchain RPC calls");
+ if (this.CONSOLE_LOGGING) {
+ console.log("🚀 PRODUCTION MODE ENABLED - Using real blockchain RPC calls");
+ }
// Real blockchain monitoring
this.debugInterval = setInterval(() => {
rpc.daemonCall("get_block_count", "", (result) => {
if (!result || !result.result || !result.result.count) {
- console.log("❌ Failed to get block count from daemon");
+ if (this.CONSOLE_LOGGING) {
+ console.log("❌ Failed to get block count from daemon");
+ }
return;
}
@@ -75,7 +118,9 @@ class DebugManager {
// If new block found
if (currentHeight > this.lastProductionBlockHeight) {
- console.log(`⛏️ New block found: ${currentHeight}`);
+ if (this.CONSOLE_LOGGING) {
+ console.log(`⛏️ New block found: ${currentHeight}`);
+ }
this.broadcastManager.broadcastBlockHeight(currentHeight);
// Notify listeners about new block
@@ -107,8 +152,11 @@ class DebugManager {
setDebugBlockHeight(height) {
if (this.DEBUG_MODE) {
this.debugBlockHeight = height;
- this.broadcastManager.broadcastBlockHeight(this.debugBlockHeight);
- } else {
+ if (this.CONSOLE_LOGGING) {
+ console.log(`🐛 DEBUG: Block height set to: ${height}`);
+ }
+ this.broadcastManager.broadcastBlockHeight(height);
+ } else if (this.CONSOLE_LOGGING) {
console.warn("Cannot set debug block height in production mode");
}
}
@@ -119,10 +167,12 @@ class DebugManager {
advanceDebugBlock() {
if (this.DEBUG_MODE) {
this.debugBlockHeight++;
- console.log(`🐛 DEBUG: Manually advanced block to: ${this.debugBlockHeight}`);
+ if (this.CONSOLE_LOGGING) {
+ console.log(`🐛 DEBUG: Manually advanced block to: ${this.debugBlockHeight}`);
+ }
this.broadcastManager.broadcastBlockHeight(this.debugBlockHeight);
this.onNewBlock(this.debugBlockHeight);
- } else {
+ } else if (this.CONSOLE_LOGGING) {
console.warn("Cannot advance debug block in production mode");
}
}
@@ -136,7 +186,9 @@ class DebugManager {
*/
onNewBlock(blockHeight) {
// This method can be overridden or have callbacks registered
- console.log(`📦 New block detected: ${blockHeight}`);
+ if (this.CONSOLE_LOGGING) {
+ console.log(`📦 New block detected: ${blockHeight}`);
+ }
// Call registered callbacks
if (this.newBlockCallbacks) {
@@ -144,7 +196,9 @@ class DebugManager {
try {
callback(blockHeight);
} catch (error) {
- console.error("Error in new block callback:", error);
+ if (this.CONSOLE_LOGGING) {
+ console.error("Error in new block callback:", error);
+ }
}
});
}
@@ -184,13 +238,15 @@ class DebugManager {
* @param {object} data - Event data
*/
debugSocket(socketId, eventName, data) {
- const shortSocketId = socketId.substring(0, 8);
- console.log(`🔌 SOCKET DEBUG: Sending ${eventName} to ${shortSocketId}...`);
-
- // Limit payload logging to prevent console spam
- const dataStr = JSON.stringify(data);
- const shortDataStr = dataStr.length > 300 ? dataStr.substring(0, 300) + "..." : dataStr;
- console.log(`📦 PAYLOAD: ${shortDataStr}`);
+ if (this.CONSOLE_LOGGING) {
+ const shortSocketId = socketId.substring(0, 8);
+ console.log(`🔌 SOCKET DEBUG: Sending ${eventName} to ${shortSocketId}...`);
+
+ // Limit payload logging to prevent console spam
+ const dataStr = JSON.stringify(data);
+ const shortDataStr = dataStr.length > 300 ? dataStr.substring(0, 300) + "..." : dataStr;
+ console.log(`📦 PAYLOAD: ${shortDataStr}`);
+ }
}
// ====== CLEANUP ======
@@ -209,7 +265,9 @@ class DebugManager {
this.statusInterval = null;
}
- console.log("🧹 Debug manager cleaned up");
+ if (this.CONSOLE_LOGGING) {
+ console.log("🧹 Debug manager cleaned up");
+ }
}
/**
@@ -217,7 +275,9 @@ class DebugManager {
* @param {boolean} enabled - Whether to enable debug mode
*/
setDebugMode(enabled) {
- console.log(`🔄 Switching debug mode to: ${enabled ? 'ENABLED' : 'DISABLED'}`);
+ if (this.CONSOLE_LOGGING) {
+ console.log(`🔄 Switching debug mode to: ${enabled ? 'ENABLED' : 'DISABLED'}`);
+ }
this.cleanup();
this.DEBUG_MODE = enabled;
this.initialize();
diff --git a/src/game/dungeon.js b/src/game/dungeon.js
index 8874033..fbeeb1b 100644
--- a/src/game/dungeon.js
+++ b/src/game/dungeon.js
@@ -1,5 +1,8 @@
const ROT = require('./rot.js');
+// Environment-based console logging control
+const CONSOLE_LOGGING = process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development';
+
// ========================================
// DUNGEON CONFIGURATION SECTION
// ========================================
@@ -51,7 +54,9 @@ class DungeonGenerator {
};
const config = { ...defaultOptions, ...options };
- console.log(`[DungeonGenerator] Generating dungeon with effective torchDensity: ${config.torchDensity}`); // Log effective torchDensity
+ if (CONSOLE_LOGGING) {
+ console.log(`[DungeonGenerator] Generating dungeon with effective torchDensity: ${config.torchDensity}`);
+ }
// Create dungeon using ROT.js Map.Digger
const digger = new ROT.Map.Digger(width, height, {
@@ -132,7 +137,9 @@ class DungeonGenerator {
let placedTorchesCount = 0; // Counter for torches placed in this function
// Log the torchDensity being used for this map generation pass
- console.log(`[DungeonGenerator.enhanceMapWithVariations] Starting enhancement with torchDensity: ${config.torchDensity}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[DungeonGenerator.enhanceMapWithVariations] Starting enhancement with torchDensity: ${config.torchDensity}`);
+ }
const height = basicMap.length; // Use basicMap's dimensions
const width = basicMap[0].length; // Use basicMap's dimensions
@@ -159,7 +166,9 @@ class DungeonGenerator {
}
}
}
- console.log(`[DungeonGenerator.enhanceMapWithVariations] Placed ${placedTorchesCount} torches during map enhancement.`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[DungeonGenerator.enhanceMapWithVariations] Placed ${placedTorchesCount} torches during map enhancement.`);
+ }
return enhancedMap;
}
@@ -196,7 +205,9 @@ class DungeonGenerator {
const height = enhancedMap.length;
const width = enhancedMap[0].length;
- console.log(`[DungeonGenerator.getTorchPositions] Searching for torch tile '${config.torchTile}' in a ${width}x${height} map.`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[DungeonGenerator.getTorchPositions] Searching for torch tile '${config.torchTile}' in a ${width}x${height} map.`);
+ }
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
@@ -205,7 +216,9 @@ class DungeonGenerator {
}
}
}
- console.log(`[DungeonGenerator.getTorchPositions] Found ${torches.length} torches. Positions: ${JSON.stringify(torches)}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`[DungeonGenerator.getTorchPositions] Found ${torches.length} torches. Positions: ${JSON.stringify(torches)}`);
+ }
return torches;
}
diff --git a/src/game/game.js b/src/game/game.js
index 5d24cf0..47b59d5 100644
--- a/src/game/game.js
+++ b/src/game/game.js
@@ -5,6 +5,9 @@ const Monster = require('./monster.js');
const DungeonGenerator = require('./dungeon.js');
const LightingAndFov = require('./lightingAndFov.js');
+// Environment-based console logging control
+const CONSOLE_LOGGING = process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development';
+
class Game {
/**
* Create a new game instance
@@ -42,9 +45,11 @@ class Game {
...gameOptions
};
- console.log(`[Game Constructor] Creating game for user ${user.id} (socket: ${socketId})`);
- console.log(`[Game Constructor] Dimensions: ${width}x${height}`);
- console.log(`[Game Constructor] Game config:`, JSON.stringify(this.gameConfig, null, 2));
+ if (CONSOLE_LOGGING) {
+ console.log(`[Game Constructor] Creating game for user ${user.id} (socket: ${socketId})`);
+ console.log(`[Game Constructor] Dimensions: ${width}x${height}`);
+ console.log(`[Game Constructor] Game config:`, JSON.stringify(this.gameConfig, null, 2));
+ }
this.initializeGame();
}
@@ -70,7 +75,9 @@ class Game {
}
initializeGame() {
- console.log(`[Game.initializeGame] Initializing game with config:`, JSON.stringify(this.gameConfig, null, 2));
+ if (CONSOLE_LOGGING) {
+ console.log(`[Game.initializeGame] Initializing game with config:`, JSON.stringify(this.gameConfig, null, 2));
+ }
if (typeof this.gameConfig.width === 'undefined' || typeof this.gameConfig.height === 'undefined') {
console.error("[Game.initializeGame] CRITICAL: Width or Height is undefined in gameConfig!", this.gameConfig);
throw new Error(`Invalid game dimensions: width=${this.gameConfig.width}, height=${this.gameConfig.height}`);
@@ -120,7 +127,9 @@ class Game {
const newX = this.player.x + dx;
const newY = this.player.y + dy;
- console.log(`Move: (${this.player.x},${this.player.y}) -> (${newX},${newY})`);
+ if (CONSOLE_LOGGING) {
+ console.log(`Move: (${this.player.x},${this.player.y}) -> (${newX},${newY})`);
+ }
// Check if the move is valid (not into a wall and within map bounds)
const primaryFloor = this.gameConfig.primaryFloor || "'1";
@@ -132,7 +141,9 @@ class Game {
(this.dungeon.map[newY][newX] === primaryFloor || this.dungeon.map[newY][newX] === secondaryFloor)) {
this.player.moveTo(newX, newY);
- console.log(`Player moved to ${newX},${newY} in game for socket ${this.socketId}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`Player moved to ${newX},${newY} in game for socket ${this.socketId}`);
+ }
// Update FOV after moving
this.updateFOV();
@@ -144,17 +155,23 @@ class Game {
}
if (this.dungeon.treasure && this.player.isAt(this.dungeon.treasure[0], this.dungeon.treasure[1]) && !this.player.hasTreasure) {
this.player.hasTreasure = true;
- console.log(`🏆 TREASURE PICKUP: Player ${this.socketId} collected treasure at (${this.dungeon.treasure[0]}, ${this.dungeon.treasure[1]})`);
+ if (CONSOLE_LOGGING) {
+ console.log(`🏆 TREASURE PICKUP: Player ${this.socketId} collected treasure at (${this.dungeon.treasure[0]}, ${this.dungeon.treasure[1]})`);
+ }
this.dungeon.treasure = null;
- console.log(`🗑️ TREASURE REMOVED: dungeon.treasure is now null for player ${this.socketId}`);
- console.log(`Player ${this.socketId} collected treasure! hasTreasure: ${this.player.hasTreasure}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`🗑️ TREASURE REMOVED: dungeon.treasure is now null for player ${this.socketId}`);
+ console.log(`Player ${this.socketId} collected treasure! hasTreasure: ${this.player.hasTreasure}`);
+ }
return { status: 'moved', event: 'treasure_found', player: this.player.getState(), visibleTiles: this.visibleTiles };
}
return { status: 'moved', player: this.player.getState(), visibleTiles: this.visibleTiles };
}
- console.log(`Move BLOCKED: ${newX},${newY} - cell value: ${this.dungeon && this.dungeon.map[newY] ? this.dungeon.map[newY][newX] : 'undefined'}`);
+ if (CONSOLE_LOGGING) {
+ console.log(`Move BLOCKED: ${newX},${newY} - cell value: ${this.dungeon && this.dungeon.map[newY] ? this.dungeon.map[newY][newX] : 'undefined'}`);
+ }
return { status: 'invalid' };
}
@@ -174,9 +191,11 @@ class Game {
treasure: this.dungeon ? this.dungeon.treasure : null,
};
- console.log("🎮 getState() sending entities - Monster:", state.monster, "Entrance:", state.entrance, "Exit:", state.exit, "Treasure:", state.treasure);
- if (state.treasure === null) {
- console.log("✅ TREASURE NULL: Confirmed treasure is null in getState() - treasure was picked up!");
+ if (CONSOLE_LOGGING) {
+ console.log("🎮 getState() sending entities - Monster:", state.monster, "Entrance:", state.entrance, "Exit:", state.exit, "Treasure:", state.treasure);
+ if (state.treasure === null) {
+ console.log("✅ TREASURE NULL: Confirmed treasure is null in getState() - treasure was picked up!");
+ }
}
return state;
diff --git a/src/game/monster.js b/src/game/monster.js
index 5183381..e347cbd 100644
--- a/src/game/monster.js
+++ b/src/game/monster.js
@@ -70,20 +70,7 @@ class Monster {
if (!player) return false;
// Check for direct overlap - monster on same tile as player
- if (this.x === player.x && this.y === player.y) {
- return true;
- }
-
- // Check for adjacent tiles (optional - if you want 1-tile proximity kills)
- const dx = Math.abs(this.x - player.x);
- const dy = Math.abs(this.y - player.y);
-
- // If monster is adjacent (one tile away in any direction)
- if ((dx <= 1 && dy === 0) || (dx === 0 && dy <= 1)) {
- return true;
- }
-
- return false;
+ return this.x === player.x && this.y === player.y;
}
// Get monster state as object
diff --git a/src/index.js b/src/index.js
index 05eaaca..2eaf615 100644
--- a/src/index.js
+++ b/src/index.js
@@ -27,7 +27,9 @@ app.get('/', function(req, res) {
// Debug endpoint to receive client-side debug info
app.post('/debug', (req, res) => {
- console.log('📝 CLIENT DEBUG INFO:', req.body);
+ if (debugManager.CONSOLE_LOGGING) {
+ console.log('📝 CLIENT DEBUG INFO:', req.body);
+ }
res.json({ received: true, timestamp: Date.now() });
});
@@ -49,13 +51,15 @@ io.on('connection', function(socket) {
// Debug function for registered users
function debugRegisteredUsers() {
- console.log("📊 REGISTERED USERS DEBUG:");
- const allUsers = require('./db/user').getAllUsers();
- console.log(`Total registered users: ${allUsers.length}`);
- allUsers.forEach(user => {
- console.log(` - User ID: ${user.id}, Socket: ${user.socketId}, Client: ${user.clientId}`);
- });
- console.log(`Active games: ${activeGames.size}`);
+ if (debugManager.CONSOLE_LOGGING) {
+ console.log("📊 REGISTERED USERS DEBUG:");
+ const allUsers = require('./db/user').getAllUsers();
+ console.log(`Total registered users: ${allUsers.length}`);
+ allUsers.forEach(user => {
+ console.log(` - User ID: ${user.id}, Socket: ${user.socketId}, Client: ${user.clientId}`);
+ });
+ console.log(`Active games: ${activeGames.size}`);
+ }
}
// Regular debug logging
diff --git a/src/network/socketHandlers.js b/src/network/socketHandlers.js
index b9de6b9..6b3435b 100644
--- a/src/network/socketHandlers.js
+++ b/src/network/socketHandlers.js
@@ -22,16 +22,20 @@ class SocketHandlers {
* Initialize socket event handlers for a new connection
*/
handleConnection(socket) {
- console.log('A user connected');
- console.log(socket.client.id);
- console.log(socket.handshake.address);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log('A user connected');
+ console.log(socket.client.id);
+ console.log(socket.handshake.address);
+ }
// Create and register user
new user.User(socket.id, socket.handshake.address);
const newUser = this.getUserBySocket(socket.id);
if (newUser) {
newUser.clientId = socket.client.id;
- console.log(`User created with both socket.id (${socket.id}) and socket.client.id (${socket.client.id})`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`User created with both socket.id (${socket.id}) and socket.client.id (${socket.client.id})`);
+ }
}
// Send welcome and current status
@@ -39,7 +43,9 @@ class SocketHandlers {
// Send current block height
const currentBlock = this.debugManager.getCurrentBlockHeight();
- console.log(`📈 Sending current block height ${currentBlock} to new connection ${socket.id}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`📈 Sending current block height ${currentBlock} to new connection ${socket.id}`);
+ }
this.io.to(socket.id).emit('blockheight', currentBlock);
// Send connection status
@@ -58,7 +64,9 @@ class SocketHandlers {
* Handle chat messages and game commands
*/
handleChatMessage(socket, msg) {
- console.log('Message received:', msg);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log('Message received:', msg);
+ }
const command = msg.toLowerCase();
@@ -88,7 +96,9 @@ class SocketHandlers {
* Handle game entry request
*/
handleGameEntry(socket) {
- console.log(`Player ${socket.id} requested to enter the dungeon - STARTING IMMEDIATELY`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player ${socket.id} requested to enter the dungeon - STARTING IMMEDIATELY`);
+ }
const currentUser = this.getUserBySocket(socket.id);
if (!currentUser) {
@@ -96,22 +106,30 @@ class SocketHandlers {
return;
}
- console.log(`Found user for socket ${socket.id}, starting game immediately...`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Found user for socket ${socket.id}, starting game immediately...`);
+ }
try {
// For auto-entry in debug mode, player enters on current block
const currentBlock = this.debugManager.getCurrentBlockHeight();
currentUser.blockRec = currentBlock;
- console.log(`🕒 AUTO-ENTRY: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🕒 AUTO-ENTRY: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ }
const game = this.createGameForUser(currentUser, 'standard');
const gameState = game.getState();
gameState.blockHeight = currentBlock;
- console.log(`🎮 SENDING IMMEDIATE GAME_START to ${socket.id}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🎮 SENDING IMMEDIATE GAME_START to ${socket.id}`);
+ }
this.io.to(socket.id).emit('game_start', gameState);
- console.log(`Game started immediately for player ${socket.id}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Game started immediately for player ${socket.id}`);
+ }
} catch (error) {
console.error(`Error creating game:`, error);
this.broadcastManager.sendStatusUpdate(socket.id, 'error', 'Error starting game: ' + error.message);
@@ -122,7 +140,9 @@ class SocketHandlers {
* Handle game queue request (typing "enter")
*/
handleGameQueue(socket) {
- console.log(`Player ${socket.id} requested to enter the dungeon - ADDING TO QUEUE`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player ${socket.id} requested to enter the dungeon - ADDING TO QUEUE`);
+ }
const currentUser = this.getUserBySocket(socket.id);
if (!currentUser) {
@@ -156,14 +176,18 @@ class SocketHandlers {
this.broadcastManager.sendStatusUpdate(socket.id, 'queue',
`Added to queue! You will enter when block ${nextBlock} is found. Current block: ${currentBlock}`);
- console.log(`🕒 QUEUE ENTRY: Player ${socket.id} queued for block ${nextBlock}. Queue length: ${this.WAITING_PLAYERS.length}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🕒 QUEUE ENTRY: Player ${socket.id} queued for block ${nextBlock}. Queue length: ${this.WAITING_PLAYERS.length}`);
+ }
}
/**
* Handle auto start request (start button)
*/
handleAutoStart(socket) {
- console.log(`Player ${socket.id} requested auto-start via start button - STARTING IMMEDIATELY`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player ${socket.id} requested auto-start via start button - STARTING IMMEDIATELY`);
+ }
const currentUser = this.getUserBySocket(socket.id);
if (!currentUser) {
@@ -181,25 +205,35 @@ class SocketHandlers {
const waitingIndex = this.WAITING_PLAYERS.findIndex(p => p.serverId === socket.id);
if (waitingIndex !== -1) {
this.WAITING_PLAYERS.splice(waitingIndex, 1);
- console.log(`🚀 AUTO-START: Removed ${socket.id} from waiting queue for immediate start`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🚀 AUTO-START: Removed ${socket.id} from waiting queue for immediate start`);
+ }
}
- console.log(`Found user for socket ${socket.id}, starting game immediately...`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Found user for socket ${socket.id}, starting game immediately...`);
+ }
try {
// For auto-entry, player enters on current block
const currentBlock = this.debugManager.getCurrentBlockHeight();
currentUser.blockRec = currentBlock;
- console.log(`🕒 AUTO-START: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🕒 AUTO-START: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ }
const game = this.createGameForUser(currentUser, 'standard');
const gameState = game.getState();
gameState.blockHeight = currentBlock;
- console.log(`🎮 SENDING IMMEDIATE GAME_START to ${socket.id} (AUTO-START)`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🎮 SENDING IMMEDIATE GAME_START to ${socket.id} (AUTO-START)`);
+ }
this.io.to(socket.id).emit('game_start', gameState);
- console.log(`Game started immediately for player ${socket.id} via auto-start`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Game started immediately for player ${socket.id} via auto-start`);
+ }
} catch (error) {
console.error(`Error creating game:`, error);
this.broadcastManager.sendStatusUpdate(socket.id, 'error', 'Error starting game: ' + error.message);
@@ -225,7 +259,9 @@ class SocketHandlers {
* Handle chat broadcast to all clients
*/
handleChatBroadcast(socket, msg) {
- console.log(`💬 Broadcasting chat message from ${socket.id}: "${msg}"`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`💬 Broadcasting chat message from ${socket.id}: "${msg}"`);
+ }
const currentUser = this.getUserBySocket(socket.id);
const username = currentUser?.username || `User_${socket.id.substr(-4)}`;
@@ -242,12 +278,16 @@ class SocketHandlers {
* Handle player movement
*/
handlePlayerMove(socket, moveData) {
- console.log(`Player move event received from ${socket.id}:`, moveData);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player move event received from ${socket.id}:`, moveData);
+ }
const currentUser = this.getUserBySocket(socket.id);
const game = this.activeGames.get(socket.id);
if (!currentUser || !game || game.gameState !== 'active') {
- console.log(`Player move event from ${socket.id} ignored: No active game found for user.`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player move event from ${socket.id} ignored: No active game found for user.`);
+ }
return;
}
@@ -256,7 +296,9 @@ class SocketHandlers {
const lastMoveTime = this.playerMoveTimestamps.get(socket.id) || 0;
if (now - lastMoveTime < this.MOVE_COOLDOWN) {
- console.log(`Move from ${socket.id} throttled - too soon after last move (${now - lastMoveTime}ms)`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Move from ${socket.id} throttled - too soon after last move (${now - lastMoveTime}ms)`);
+ }
return;
}
@@ -269,7 +311,9 @@ class SocketHandlers {
const moveResult = game.movePlayer(moveData.dx, moveData.dy);
if (!moveResult || moveResult.status !== 'moved') {
- console.log(`Player move from ${socket.id} was invalid or resulted in no change.`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Player move from ${socket.id} was invalid or resulted in no change.`);
+ }
return;
}
@@ -326,7 +370,9 @@ class SocketHandlers {
* Handle client disconnection
*/
handleDisconnect(socket) {
- console.log('User disconnected', socket.client.id);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log('User disconnected', socket.client.id);
+ }
// Clean up movement timestamps
this.playerMoveTimestamps.delete(socket.id);
@@ -347,7 +393,9 @@ class SocketHandlers {
* Handle debug ping
*/
handleDebugPing(socket, data) {
- console.log(`Debug ping received from ${socket.client.id}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Debug ping received from ${socket.client.id}`);
+ }
socket.emit('debug_pong', {
message: "Hello from server!",
clientTime: data.time,
@@ -360,7 +408,9 @@ class SocketHandlers {
* Handle client registration
*/
handleRegisterClient(socket, data) {
- console.log(`Client registered: ${socket.id} (server) <-> ${data.clientId} (client)`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Client registered: ${socket.id} (server) <-> ${data.clientId} (client)`);
+ }
this.clientSocketMap.set(data.clientId, socket.id);
this.clientSocketMap.set(socket.id, data.clientId);
@@ -378,17 +428,23 @@ class SocketHandlers {
* Get user by socket ID with fallback mapping
*/
getUserBySocket(socketId) {
- console.log(`Looking up user with socketId: ${socketId}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Looking up user with socketId: ${socketId}`);
+ }
let foundUser = user.getUserBySocketId(socketId);
if (!foundUser && this.clientSocketMap.has(socketId)) {
const mappedId = this.clientSocketMap.get(socketId);
- console.log(`Socket ID ${socketId} not found directly, trying mapped ID: ${mappedId}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Socket ID ${socketId} not found directly, trying mapped ID: ${mappedId}`);
+ }
foundUser = user.getUserBySocketId(mappedId);
}
- console.log(`User lookup result for ${socketId}: ${foundUser ? "FOUND" : "NOT FOUND"}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`User lookup result for ${socketId}: ${foundUser ? "FOUND" : "NOT FOUND"}`);
+ }
return foundUser;
}
@@ -407,7 +463,9 @@ class SocketHandlers {
user.joinGame(game);
this.activeGames.set(user.id, game);
- console.log(`[createGameForUser] Created ${gameType} game ${game.id} for user ${user.id}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`[createGameForUser] Created ${gameType} game ${game.id} for user ${user.id}`);
+ }
return game;
}
@@ -422,20 +480,22 @@ class SocketHandlers {
* Log game update debug information
*/
logGameUpdate(socketId, gameState) {
- console.log(`🔍 GAME UPDATE DEBUG for ${socketId}:`);
- console.log(` - Player position: (${gameState.player?.x}, ${gameState.player?.y})`);
- console.log(` - Visible tiles keys: ${Object.keys(gameState.visibleTiles || {}).length} rows`);
- console.log(` - Lighting data included: ${!!gameState.lighting}`);
- if (gameState.lighting) {
- const lightingTileCount = Object.keys(gameState.lighting).reduce((acc, yKey) =>
- acc + Object.keys(gameState.lighting[yKey] || {}).length, 0);
- console.log(` - Lighting tiles count: ${lightingTileCount}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🔍 GAME UPDATE DEBUG for ${socketId}:`);
+ console.log(` - Player position: (${gameState.player?.x}, ${gameState.player?.y})`);
+ console.log(` - Visible tiles keys: ${Object.keys(gameState.visibleTiles || {}).length} rows`);
+ console.log(` - Lighting data included: ${!!gameState.lighting}`);
+ if (gameState.lighting) {
+ const lightingTileCount = Object.keys(gameState.lighting).reduce((acc, yKey) =>
+ acc + Object.keys(gameState.lighting[yKey] || {}).length, 0);
+ console.log(` - Lighting tiles count: ${lightingTileCount}`);
+ }
+ console.log(` - Torch data included: ${!!gameState.torches}`);
+ if (gameState.torches) {
+ console.log(` - Torch count: ${gameState.torches.length}`);
+ }
+ console.log(`Sending game_update to ${socketId} after player move.`);
}
- console.log(` - Torch data included: ${!!gameState.torches}`);
- if (gameState.torches) {
- console.log(` - Torch count: ${gameState.torches.length}`);
- }
- console.log(`Sending game_update to ${socketId} after player move.`);
}
// Queue management methods (for future block-based game entry)
@@ -444,19 +504,25 @@ class SocketHandlers {
* Start games for waiting players when a new block is found
*/
startGamesForWaiting(blockHeight) {
- console.log(`Starting games for ${this.WAITING_PLAYERS.length} waiting players at block height ${blockHeight}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Starting games for ${this.WAITING_PLAYERS.length} waiting players at block height ${blockHeight}`);
+ }
while (this.WAITING_PLAYERS.length > 0) {
const playerEntry = this.WAITING_PLAYERS.shift();
const serverId = playerEntry.serverId;
- console.log(`Processing player: server=${serverId}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Processing player: server=${serverId}`);
+ }
const currentUser = this.getUserBySocket(serverId);
if (currentUser) {
currentUser.blockRec = blockHeight;
- console.log(`🕒 QUEUE ENTRY: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🕒 QUEUE ENTRY: Player enters on block ${currentUser.blockRec}, will die when block ${currentUser.blockRec + 1} starts`);
+ }
try {
const game = this.createGameForUser(currentUser, 'standard');
@@ -464,9 +530,13 @@ class SocketHandlers {
const gameState = game.getState();
gameState.blockHeight = blockHeight;
- console.log(`🎮 SENDING GAME_START to ${serverId}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`🎮 SENDING GAME_START to ${serverId}`);
+ }
this.io.to(serverId).emit('game_start', gameState);
- console.log(`Game started for player ${serverId}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`Game started for player ${serverId}`);
+ }
} catch (error) {
console.error(`Error creating game:`, error);
this.io.to(serverId).emit('message', 'Error starting game: ' + error.message);
@@ -486,7 +556,9 @@ class SocketHandlers {
const user = this.getUserBySocket(socketId);
if (user && user.blockRec && currentHeight > user.blockRec) {
- console.log(`💀 GAME TIMEOUT for player ${socketId}: entered on block ${user.blockRec}, died on block ${currentHeight}`);
+ if (this.debugManager.CONSOLE_LOGGING) {
+ console.log(`💀 GAME TIMEOUT for player ${socketId}: entered on block ${user.blockRec}, died on block ${currentHeight}`);
+ }
game.gameState = 'lost';
this.io.to(socketId).emit('game_over', {
diff --git a/src/package.json b/src/package.json
index e0349dd..67e9702 100644
--- a/src/package.json
+++ b/src/package.json
@@ -4,9 +4,25 @@
"description": "",
"main": "index.js",
"scripts": {
- "start": "node index.js",
+ "start": "NODE_ENV=production node index.js",
+ "dev": "NODE_ENV=development node index.js",
+ "debug": "NODE_ENV=debug node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
+ "config": {
+ "debug": {
+ "enabled": false,
+ "console_logging": false,
+ "debug_hotkeys": false,
+ "simulated_blocks": false
+ },
+ "production": {
+ "enabled": true,
+ "console_logging": false,
+ "debug_hotkeys": false,
+ "simulated_blocks": false
+ }
+ },
"author": "jw",
"license": "ISC",
"dependencies": {
diff --git a/src/rpc/rpccalls.js b/src/rpc/rpccalls.js
index af721bb..b7aa58d 100644
--- a/src/rpc/rpccalls.js
+++ b/src/rpc/rpccalls.js
@@ -1,6 +1,9 @@
var axios = require('axios');
var request = require('request');
+// Environment-based console logging control
+const CONSOLE_LOGGING = process.env.NODE_ENV === 'debug' || process.env.NODE_ENV === 'development';
+
/*List of RPC calls
Daemon -
Get blockheight: "get_block_count"
@@ -33,7 +36,9 @@ function daemonCall(method, params, callback, io) {
json: body
}, function (error, res, body) {
if (error) {
- console.log("Daemon connection error:", error.message);
+ if (CONSOLE_LOGGING) {
+ console.log("Daemon connection error:", error.message);
+ }
callback(null);
return;
}
diff --git a/test/monster.js b/test/monster.js
index 0d048c7..9010378 100644
--- a/test/monster.js
+++ b/test/monster.js
@@ -65,20 +65,7 @@ class Monster {
if (!player) return false;
// Check for direct overlap - monster on same tile as player
- if (this.x === player.x && this.y === player.y) {
- return true;
- }
-
- // Check for adjacent tiles (optional - if you want 1-tile proximity kills)
- const dx = Math.abs(this.x - player.x);
- const dy = Math.abs(this.y - player.y);
-
- // If monster is adjacent (one tile away in any direction)
- if ((dx <= 1 && dy === 0) || (dx === 0 && dy <= 1)) {
- return true;
- }
-
- return false;
+ return this.x === player.x && this.y === player.y;
}
// Get monster state as object