/** * Game Initializer * Handles initialization of multiplayer game modes */ console.log('[GAME INITIALIZER] GameInitializer.js script loaded'); class GameInitializer { constructor() { console.log('[GAME INITIALIZER] Constructor called'); this.gameMode = 'multiplayer'; this.serverData = null; this.authToken = null; this.currentUser = null; this.socket = null; this.apiBaseUrl = 'https://api.korvarix.com/api'; // API Server this.gameServerUrl = 'https://dev.gameserver.galaxystrike.online'; // Game Server for Socket.IO (local dev server) } updateServerUrls(apiUrl, gameUrl) { console.log('[GAME INITIALIZER] Updating server URLs:', { apiUrl, gameUrl }); this.apiBaseUrl = apiUrl; this.gameServerUrl = gameUrl; } initializeMultiplayer(server, serverData, authToken, currentUser) { console.log('[GAME INITIALIZER] Initializing multiplayer game mode'); this.gameMode = 'multiplayer'; this.serverData = { ...server, ...serverData }; this.authToken = authToken; this.currentUser = currentUser; // Initialize Socket.IO connection this.initializeSocketConnection(); // Initialize game systems with multiplayer support this.initializeGameSystems(); // Update UI for multiplayer mode this.updateUIForMultiplayerMode(); console.log('[GAME INITIALIZER] Multiplayer game initialized'); } initializeSocketConnection() { if (!this.serverData) { console.error('[GAME INITIALIZER] No server data for socket connection'); return; } console.log('[GAME INITIALIZER] Initializing Socket.IO connection'); // Check if we're in local mode and should use mock socket if (this.gameServerUrl.includes('localhost') && window.localServerManager && window.localServerManager.localServer) { console.log('[GAME INITIALIZER] Using mock socket for local mode'); this.socket = window.localServerManager.localServer.createMockSocket(); // Trigger connected event immediately since mock socket auto-connects setTimeout(() => { this.onSocketConnected(); }, 200); return; } // Connect to the game server (different from API server) this.socket = io(this.gameServerUrl, { auth: { token: this.authToken, serverId: this.serverData.id } }); // Socket event handlers this.socket.on('connect', () => { console.log('[GAME INITIALIZER] Connected to server'); this.onSocketConnected(); }); this.socket.on('disconnect', () => { console.log('[GAME INITIALIZER] Disconnected from server'); this.onSocketDisconnected(); }); this.socket.on('error', (error) => { console.error('[GAME INITIALIZER] Socket error:', error); }); this.socket.on('force_disconnect', (data) => { console.warn('[GAME INITIALIZER] Force disconnected:', data); this.onForceDisconnect(data); }); // Game-specific events this.socket.on('playerJoined', (data) => { console.log('[GAME INITIALIZER] Player joined:', data); this.onPlayerJoined(data); }); this.socket.on('playerLeft', (data) => { console.log('[GAME INITIALIZER] Player left:', data); this.onPlayerLeft(data); }); this.socket.on('gameUpdate', (data) => { console.log('[GAME INITIALIZER] Game update:', data); this.onGameUpdate(data); }); this.socket.on('chatMessage', (data) => { console.log('[GAME INITIALIZER] Chat message:', data); this.onChatMessage(data); }); } onSocketConnected() { // Join the server room this.socket.emit('joinServer', { serverId: this.serverData.id, userId: this.currentUser.userId, username: this.currentUser.username }); // Show connected status this.showConnectionStatus('Connected', 'success'); } onSocketDisconnected() { // Show disconnected status this.showConnectionStatus('Disconnected', 'error'); } onPlayerJoined(data) { // Handle player joining this.updatePlayerList(); this.showNotification(`${data.username} joined the server`, 'info'); } onPlayerLeft(data) { // Handle player leaving this.updatePlayerList(); this.showNotification(`${data.username} left the server`, 'info'); } onGameUpdate(data) { // Handle game state updates if (window.game && window.game.handleServerUpdate) { window.game.handleServerUpdate(data); } } onChatMessage(data) { // Handle chat messages if (window.game && window.game.handleChatMessage) { window.game.handleChatMessage(data); } } onForceDisconnect(data) { // Handle forced disconnection from server console.warn('[GAME INITIALIZER] Force disconnected by server:', data); // Show notification to user if (window.game && window.game.showNotification) { window.game.showNotification( `Disconnected: ${data.reason}`, 'warning', 10000 ); } // Disconnect the socket if (this.socket) { this.socket.disconnect(); } // Clean up multiplayer mode if (window.game) { window.game.setMultiplayerMode(false); } // Return to main menu after a delay setTimeout(() => { if (window.liveMainMenu) { window.liveMainMenu.showLoginSection(); } }, 2000); } initializeGameSystems() { console.log('[GAME INITIALIZER] Initializing game systems'); // Wait for the main game script to be ready if (typeof window.game !== 'undefined') { console.log('[GAME INITIALIZER] window.game is available, calling setupGameSystems'); this.setupGameSystems(); } else { console.log('[GAME INITIALIZER] window.game not available, waiting 100ms'); // Wait for the game to be initialized setTimeout(() => this.initializeGameSystems(), 100); } } setupGameSystems() { if (!window.game) { console.error('[GAME INITIALIZER] Game not available'); return; } console.log('[GAME INITIALIZER] Setting up game systems for multiplayer mode'); // Configure game for multiplayer mode console.log('[GAME INITIALIZER] Configuring for multiplayer mode'); window.game.setMultiplayerMode(true, this.socket, this.serverData, this.currentUser); // Game is already set up with save data, just start the game loop if (window.game.start) { // console.log('[GAME INITIALIZER] Calling start() to begin game loop'); window.game.start(); } else if (window.game.startGame) { // console.log('[GAME INITIALIZER] Calling startGame(false) - save data already applied'); window.game.startGame(false); // false = don't load again (save data already applied) } else { console.error('[GAME INITIALIZER] No start method available on window.game'); } console.log('[GAME INITIALIZER] Game systems configured'); } updateUIForMultiplayerMode() { // Update UI elements to show multiplayer mode const playerName = document.getElementById('playerName'); if (playerName && this.currentUser) { playerName.textContent = this.currentUser.username; } // Show multiplayer-specific UI elements this.showMultiplayerUI(); // Show server info this.showServerInfo(); } hideMultiplayerUI() { // Hide elements that are only relevant in multiplayer const chatContainer = document.getElementById('chatContainer'); if (chatContainer) { chatContainer.classList.add('hidden'); } const playerList = document.getElementById('playerList'); if (playerList) { playerList.classList.add('hidden'); } } showMultiplayerUI() { // Show multiplayer-specific elements const chatContainer = document.getElementById('chatContainer'); if (chatContainer) { chatContainer.classList.remove('hidden'); } const playerList = document.getElementById('playerList'); if (playerList) { playerList.classList.remove('hidden'); } } showServerInfo() { // Add server information to the UI const header = document.querySelector('.game-header'); if (header && !header.querySelector('.server-info')) { const serverInfo = document.createElement('div'); serverInfo.className = 'server-info'; serverInfo.innerHTML = ` ${this.serverData.name} (${this.serverData.currentPlayers}/${this.serverData.maxPlayers}) `; serverInfo.style.cssText = ` background: rgba(0, 212, 255, 0.2); color: #00d4ff; padding: 4px 8px; border-radius: 4px; font-size: 0.8rem; margin-left: 10px; `; header.appendChild(serverInfo); } } showConnectionStatus(status, type) { // Show connection status in the UI const statusElement = document.getElementById('connectionStatus'); if (statusElement) { statusElement.textContent = status; statusElement.className = `connection-status ${type}`; } } updatePlayerList() { // Update the player list UI if (this.socket && this.serverData) { // Request updated player list from server this.socket.emit('getPlayerList', { serverId: this.serverData.id }); } } showNotification(message, type = 'info') { // Show a notification to the user if (window.game && window.game.showNotification) { window.game.showNotification(message, type, 3000); } else { // Fallback to alert console.log(`[GAME INITIALIZER] Notification: ${message}`); } } // Method to send actions to the server sendGameAction(actionType, actionData) { if (this.socket && this.gameMode === 'multiplayer') { this.socket.emit('gameAction', { type: actionType, data: actionData, userId: this.currentUser.userId, serverId: this.serverData.id }); } } // Method to send chat messages sendChatMessage(message) { if (this.socket && this.gameMode === 'multiplayer') { this.socket.emit('chatMessage', { message: message, userId: this.currentUser.userId, username: this.currentUser.username, serverId: this.serverData.id }); } } // Cleanup method cleanup() { console.log('[GAME INITIALIZER] Cleaning up'); if (this.socket) { this.socket.disconnect(); this.socket = null; } this.gameMode = null; this.serverData = null; this.authToken = null; this.currentUser = null; } } // Create global instance window.gameInitializer = new GameInitializer(); // Export for use in other scripts if (typeof module !== 'undefined' && module.exports) { module.exports = GameInitializer; }