feat: initial Regnum project structure (Vue3 + Phaser3 + Socket.io)
This commit is contained in:
commit
1db221e468
23 files changed
+1265
No files matched your search
@@ -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}`)
|
||||
})
|
||||
Reference in new issue
Block a user