Files
Masmorres/game-server.js
marti b6ca14dfa2 Feat: Hybrid Architecture Phase 1
- Implemented Game Server (game-server.js) with Socket.io
- Added JSON Schemas for Campaigns and Missions
- Updated Docker configurations for multi-service setup
- Refactored main.js to allow local network connections
- Removed legacy code (main_old.js)
- Updated dependencies
2025-12-28 20:44:40 +01:00

82 lines
2.6 KiB
JavaScript

import express from 'express';
import { createServer } from 'http';
import { Server } from 'socket.io';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "*", // Allow connections from any mobile device on local network
methods: ["GET", "POST"]
}
});
// Serve static files from 'dist' (production) or 'public' (dev partial)
// In a real setup, Vite handles dev serving, but this server handles the sockets.
app.use(express.static(join(__dirname, 'dist')));
// Game State Storage (In-Memory for now)
const LOBBIES = {
// "lobbyCode": { hostSocket: id, players: [{id, name, charId}] }
};
io.on('connection', (socket) => {
console.log('Client connected:', socket.id);
// --- HOST EVENTS (PC) ---
socket.on('HOST_GAME', () => {
const lobbyCode = generateLobbyCode();
LOBBIES[lobbyCode] = {
hostSocket: socket.id,
players: []
};
socket.join(lobbyCode);
socket.emit('LOBBY_CREATED', { code: lobbyCode });
console.log(`Lobby ${lobbyCode} created by ${socket.id}`);
});
// --- PLAYER EVENTS (MOBILE) ---
socket.on('JOIN_GAME', ({ code, name }) => {
const lobby = LOBBIES[code.toUpperCase()];
if (lobby) {
lobby.players.push({ id: socket.id, name, charId: null });
socket.join(code.toUpperCase());
// Notify Host
io.to(lobby.hostSocket).emit('PLAYER_JOINED', { id: socket.id, name });
// Confirm to Player
socket.emit('JOIN_SUCCESS', { code: code.toUpperCase() });
console.log(`Player ${name} joined lobby ${code}`);
} else {
socket.emit('ERROR', { message: "Lobby not found" });
}
});
socket.on('PLAYER_ACTION', ({ code, action, data }) => {
const lobby = LOBBIES[code];
if (lobby) {
// Forward directly to Host
io.to(lobby.hostSocket).emit('PLAYER_ACTION', { playerId: socket.id, action, data });
}
});
socket.on('disconnect', () => {
console.log('Client disconnected:', socket.id);
// Handle cleanup (remove player from lobby, notify host)
});
});
function generateLobbyCode() {
return Math.random().toString(36).substring(2, 6).toUpperCase();
}
const PORT = 3001;
httpServer.listen(PORT, () => {
console.log(`Game Server running on http://localhost:${PORT}`);
});