ptit commit

This commit is contained in:
milo
2025-08-05 18:32:43 +02:00
parent ebec044bb5
commit a0251cc61b
6 changed files with 180 additions and 65 deletions

View File

@@ -17,8 +17,8 @@ export let activeSolitaireGames = {};
// Stores active Poker rooms, keyed by a unique room ID (uuidv4).
export let pokerRooms = {};
// Stores active Erynies rooms, keyed by a unique room ID (uuidv4).
export let eryniesRooms = {};
// Stores active erinyes rooms, keyed by a unique room ID (uuidv4).
export let erinyesRooms = {};
// --- User and Session State ---

View File

@@ -9,7 +9,7 @@ import { apiRoutes } from './routes/api.js';
import { pokerRoutes } from './routes/poker.js';
import { solitaireRoutes } from './routes/solitaire.js';
import {getSocketIo} from "./socket.js";
import {eryniesRoutes} from "./routes/erynies.js";
import {erinyesRoutes} from "./routes/erinyes.js";
// --- EXPRESS APP INITIALIZATION ---
const app = express();
@@ -50,8 +50,8 @@ app.use('/api/poker', pokerRoutes(client, io));
// Solitaire-specific routes
app.use('/api/solitaire', solitaireRoutes(client, io));
// Erynies-specific routes
app.use('/api/erynies', eryniesRoutes(client, io));
// erinyes-specific routes
app.use('/api/erinyes', erinyesRoutes(client, io));
export { app };

View File

@@ -0,0 +1,100 @@
import express from "express";
import { v4 as uuidv4 } from 'uuid';
import {erinyesRooms} from "../../game/state.js";
import {socketEmit} from "../socket.js";
const router = express.Router();
/**
* Factory function to create and configure the erinyes API routes.
* @param {object} client - The Discord.js client instance.
* @param {object} io - The Socket.IO server instance.
* @returns {object} The configured Express router.
*/
export function erinyesRoutes(client, io) {
// --- Router Management Endpoints
router.get('/', (req, res) => {
res.status(200).json({ rooms: erinyesRooms })
})
router.get('/:id', (req, res) => {
const room = erinyesRooms[req.params.id];
if (room) {
res.status(200).json({ room });
} else {
res.status(404).json({ message: 'Room not found.' });
}
})
router.post('/create', async (req, res) => {
const { creatorId } = req.body;
if (!creatorId) return res.status(404).json({ message: 'Creator ID is required.' });
if (Object.values(erinyesRooms).some(room => creatorId === room.host_id || room.players[creatorId])) {
res.status(404).json({ message: 'You are already in a room.' });
}
const creator = await client.users.fetch(creatorId);
const id = uuidv4()
createRoom({
host_id: creatorId,
host_name: creator.globalName,
game_rules: {}, // Specific game rules
roles: [], // Every role in the game
})
await socketEmit('erinyes-update', { room: erinyesRooms[id], type: 'room-created' });
res.status(200).json({ room: id });
})
return router;
}
function createRoom(config) {
erinyesRooms[config.id] = {
host_id: config.host_id,
host_name: config.host_name,
created_at: Date.now(),
last_move_at: null,
players: {},
current_player: null,
current_turn: null,
playing: false,
game_rules: createGameRules(config.game_rules),
roles: config.roles,
roles_rules: createRolesRules(config.roles),
bonuses: {}
}
}
function createGameRules(config) {
return {
day_vote_time: config.day_vote_time ?? 60000,
// ...
};
}
function createRolesRules(roles) {
const roles_rules = {}
roles.forEach(role => {
switch (role) {
case 'erynie':
roles_rules[role] = {
//...
};
break;
//...
default:
roles_rules[role] = {
//...
};
break;
}
})
return roles_rules;
}

View File

@@ -1,60 +0,0 @@
import express from "express";
import { v4 as uuidv4 } from 'uuid';
import {eryniesRooms} from "../../game/state.js";
import {socketEmit} from "../socket.js";
const router = express.Router();
/**
* Factory function to create and configure the Erynies API routes.
* @param {object} client - The Discord.js client instance.
* @param {object} io - The Socket.IO server instance.
* @returns {object} The configured Express router.
*/
export function eryniesRoutes(client, io) {
// --- Router Management Endpoints
router.get('/', (req, res) => {
res.status(200).json({ rooms: eryniesRooms })
})
router.get('/:id', (req, res) => {
const room = eryniesRooms[req.params.id];
if (room) {
res.status(200).json({ room });
} else {
res.status(404).json({ message: 'Room not found.' });
}
})
router.post('/create', async (req, res) => {
const { creatorId } = req.body;
if (!creatorId) return res.status(404).json({ message: 'Creator ID is required.' });
if (Object.values(eryniesRooms).some(room => creatorId === room.host_id || room.players[creatorId])) {
res.status(404).json({ message: 'You are already in a room.' });
}
const creator = await client.users.fetch(creatorId);
const id = uuidv4()
eryniesRooms[id] = {
id,
host_id: creatorId,
host_name: creator.globalName,
created_at: Date.now(),
last_move_at: null,
players: {},
current_player: null,
current_turn: null,
playing: false,
winners: [],
};
await socketEmit('erynies-update', { room: eryniesRooms[id], type: 'room-created' });
res.status(200).json({ room: id });
})
return router;
}

75
src/utils/erinyes.js Normal file
View File

@@ -0,0 +1,75 @@
export const roles = {
erynie_1: {
name: 'Erinye',
subtitle: 'Mégère, la haine',
descr: '',
powers: {
double_vote: {
descr: 'Les Erinyes peuvent tuer une deuxième personne (1 seule fois).',
charges: 1,
disabled: false,
},
},
passive: {},
team: 'Erinyes',
},
erynie_2: {
name: 'Erinye',
subtitle: 'Tisiphone, la vengeance',
descr: '',
powers: {
one_shot: {
descr: 'Tuer une personne de son choix en plus du vote des Erinyes (1 seule fois).',
charges: 1,
disabled: false,
},
},
passive: {},
team: 'Erinyes',
},
erynie_3: {
name: 'Erinye',
subtitle: 'Alecto, l\'implacable',
descr: '',
powers: {
silence: {
descr: 'Empêche l\'utilisation du pouvoir de quelqu\'un pour le prochain tour.',
charges: 999,
disabled: false,
}
},
passive: {
descr: 'Voit quels pouvoirs ont été utilisés.',
disabled: false,
},
team: 'Erinyes',
},
narcisse: {
name: 'Narcisse',
subtitle: '',
descr: '',
powers: {},
passive: {
descr: 'S\'il devient maire ...',
disabled: false,
},
},
charon: {
name: 'Charon',
subtitle: 'Sorcier',
descr: 'C\'est le passeur, il est appelé chaque nuit après les Erinyes pour décider du sort des mortels.',
powers: {
revive: {
descr: 'Refuser de faire traverser le Styx (sauver quelqu\'un)',
charges: 1,
disabled: false,
},
kill: {
descr: 'Traverser le Styx (tuer quelqu\'un)',
charges: 1,
disabled: false,
}
},
},
//...
}