feat: initial Regnum project structure (Vue3 + Phaser3 + Socket.io)

This commit is contained in:
kevin.lhereec committed 2026-08-17 11:34:55 +02:00
commit 1db221e468
23 files changed
+1265

No files matched your search

+117
View File
@@ -0,0 +1,117 @@
const express = require('express')
const http = require('http')
const { Server } = require('socket.io')
const cors = require('cors')
const { RoomManager } = require('./game/RoomManager')
const app = express()
app.use(cors())
app.use(express.json())
const server = http.createServer(app)
const io = new Server(server, {
cors: { origin: '*', methods: ['GET', 'POST'] }
})
const rooms = new RoomManager()
io.on('connection', (socket) => {
console.log(`[+] Connexion: ${socket.id}`)
socket.on('join-room', ({ roomId, playerName }) => {
const room = rooms.getOrCreate(roomId)
const joined = room.addPlayer(socket.id, playerName)
if (!joined) {
socket.emit('error', { message: 'Salle pleine (4 joueurs max)' })
return
}
socket.join(roomId)
socket.data.roomId = roomId
socket.data.playerName = playerName
io.to(roomId).emit('room-update', { players: room.getPlayersInfo() })
console.log(`[room:${roomId}] ${playerName} rejoint (${room.playerCount}/4)`)
})
socket.on('start-game', ({ roomId }) => {
const room = rooms.get(roomId)
if (!room || room.playerCount < 2) return
room.startGame()
io.to(roomId).emit('game-start')
// Envoyer l'état initial à chaque joueur avec sa main
room.players.forEach((player) => {
io.to(player.socketId).emit('game-state', room.getStateFor(player.socketId))
})
})
socket.on('request-state', ({ roomId }) => {
const room = rooms.get(roomId)
if (!room) return
socket.emit('game-state', room.getStateFor(socket.id))
})
socket.on('play-card', ({ roomId, cardId }) => {
const room = rooms.get(roomId)
if (!room) return
const result = room.playCard(socket.id, cardId)
if (!result.ok) {
socket.emit('error', { message: result.error })
return
}
// Mise à jour de phase pour tous
io.to(roomId).emit('game-state', {
players: room.getPlayersInfo(),
currentTurn: room.currentTurn,
maxTurns: room.maxTurns,
phase: room.phase
})
// Tous les joueurs ont joué → résolution
if (room.allPlayersPlayed()) {
const roundResult = room.resolveRound()
io.to(roomId).emit('game-state', {
players: room.getPlayersInfo(),
currentTurn: room.currentTurn,
maxTurns: room.maxTurns,
phase: 'resolve',
playedCards: roundResult.playedCards
})
io.to(roomId).emit('round-result', { message: roundResult.message })
setTimeout(() => {
if (room.isGameOver()) {
io.to(roomId).emit('game-over', room.getPlayersInfo())
} else {
room.nextTurn()
room.players.forEach((player) => {
io.to(player.socketId).emit('game-state', room.getStateFor(player.socketId))
})
}
}, 3000)
}
})
socket.on('disconnect', () => {
const roomId = socket.data.roomId
if (roomId) {
const room = rooms.get(roomId)
if (room) {
room.removePlayer(socket.id)
io.to(roomId).emit('room-update', { players: room.getPlayersInfo() })
}
}
console.log(`[-] Déconnexion: ${socket.id}`)
})
})
const PORT = process.env.PORT || 3000
server.listen(PORT, () => {
console.log(`Serveur Regnum démarré sur le port ${PORT}`)
})