From 0871cccee7fb5c09a4a4706070031aaed260c832 Mon Sep 17 00:00:00 2001 From: Milo Date: Mon, 7 Jul 2025 13:24:46 +0200 Subject: [PATCH 1/2] no more elo update when room is on fake money mode --- game.js | 19 +------------------ index.js | 1 - 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/game.js b/game.js index 86431c4..9b22f5c 100644 --- a/game.js +++ b/game.js @@ -220,25 +220,8 @@ export async function eloHandler(p1, p2, p1score, p2score, type) { }) } -export function pokerTest() { - console.log('pokerTest') - let hand1 = Hand.solve(['Ad', 'As', 'Jc', 'Th', '2d', '3c', 'Kd'], 'standard', false); - //let hand2 = Hand.solve(['Ad', 'As', 'Jc', 'Th', '2d', '3c', 'Kd'], 'standard', false); - let hand2 = Hand.solve(['Ad', 'As', 'Jc', 'Th', '2d', 'Qs', 'Qd'], 'standard', false); - /*console.log(hand1.name) - console.log(hand2.name) - console.log(hand1.descr) - console.log(hand2.descr)*/ - console.log(hand1.toString()) - console.log(hand2.toString()) - - let winner = Hand.winners([hand1, hand2]); // hand2 - console.log(winner) - console.log(winner.includes(hand1)); - console.log(winner.includes(hand2)); -} - export async function pokerEloHandler(room) { + if (room.fakeMoney) return let DBplayers = [] Object.keys(room.players).forEach(playerId => { const DBuser = getUser.get(playerId) diff --git a/index.js b/index.js index 04cbfdb..226b861 100644 --- a/index.js +++ b/index.js @@ -25,7 +25,6 @@ import { channelPointsHandler, eloHandler, pokerEloHandler, - pokerTest, randomSkinPrice, slowmodesHandler } from './game.js'; From 71d22458e61085b6e2d19570126443acc8e89f86 Mon Sep 17 00:00:00 2001 From: Milo Date: Mon, 7 Jul 2025 14:25:23 +0200 Subject: [PATCH 2/2] poker elo calculation update Will be more balanced for larger groups of players --- game.js | 61 +++++++++++++++++++++++++++++++------------------------- index.js | 7 ++++--- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/game.js b/game.js index 9b22f5c..3b5359f 100644 --- a/game.js +++ b/game.js @@ -222,6 +222,7 @@ export async function eloHandler(p1, p2, p1score, p2score, type) { export async function pokerEloHandler(room) { if (room.fakeMoney) return + let DBplayers = [] Object.keys(room.players).forEach(playerId => { const DBuser = getUser.get(playerId) @@ -231,46 +232,52 @@ export async function pokerEloHandler(room) { }) const winnerIds = new Set(room.winners) - const baseK = 5 const playerCount = Object.keys(room.players).length - const K = baseK * Math.log2(playerCount) + const baseK = 10 + + const avgOpponentElo = (player) => { + const opponents = DBplayers.filter(p => p.id !== player.id); + return opponents.reduce((sum, p) => sum + p.elo, 0) / opponents.length; + }; DBplayers.forEach(player => { - const others = DBplayers.filter(p => p.id !== player.id) - const avgOppElo = others.reduce((sum, p) => sum + p.elo, 0) / others.length + const avgElo = avgOpponentElo(player); + const expectedScore = 1 / (1 + 10 ** ((avgElo - player.elo) / 400)) - const expectedScore = 1 / (1 + Math.pow(10, (avgOppElo - player.elo) / 400)) let actualScore; - if (winnerIds.has(player.id)) { - if (winnerIds.size === DBplayers.length) { - actualScore = 0.5 - } else { - actualScore = 1 - } + actualScore = (winnerIds.size === playerCount) ? 0.5 : 1; } else { - actualScore = 0 + actualScore = 0; } + const K = winnerIds.has(player.id) ? (baseK * playerCount) : baseK const delta = K * (actualScore - expectedScore) + const newElo = Math.max(Math.floor(player.elo + delta), 0) - console.log(`${player.id} elo update : ${player.elo} -> ${newElo} (K: ${K})`) - updateElo.run({ id: player.id, elo: newElo }) - insertGame.run({ - id: player.id + '-' + Date.now().toString(), - p1: player.id, - p2: null, - p1_score: actualScore, - p2_score: null, - p1_elo: player.elo, - p2_elo: avgOppElo, - p1_new_elo: newElo, - p2_new_elo: null, - type: 'POKER_ROUND', - timestamp: Date.now(), - }) + + if (!isNaN(newElo)) { + console.log(`${player.id} elo update: ${player.elo} -> ${newElo} (K: ${K.toFixed(2)}, Δ: ${delta.toFixed(2)})`); + updateElo.run({ id: player.id, elo: newElo }) + + insertGame.run({ + id: player.id + '-' + Date.now().toString(), + p1: player.id, + p2: null, + p1_score: actualScore, + p2_score: null, + p1_elo: player.elo, + p2_elo: avgElo, + p1_new_elo: newElo, + p2_new_elo: null, + type: 'POKER_ROUND', + timestamp: Date.now(), + }) + } else { + console.log(`# ELO UPDATE ERROR -> ${player.id} elo update: ${player.elo} -> ${newElo} (K: ${K.toFixed(2)}, Δ: ${delta.toFixed(2)})`); + } }) } diff --git a/index.js b/index.js index 226b861..f4f9646 100644 --- a/index.js +++ b/index.js @@ -609,7 +609,7 @@ client.on('messageCreate', async (message) => { } } else if (message.content.startsWith(prefix + ':poker')) { - io.emit('message', message.content); + console.log('poker') } else if (message.content.startsWith(prefix + ':elo-test')) { const numbers = message.content.match(/\d+/g); @@ -3599,8 +3599,8 @@ app.post('/poker-room/join', async (req, res) => { let amount = getUser.get(userId)?.coins let fakeMoney = false - if (!amount || amount < 100) { - amount = 100 + if (!amount || amount < 1000) { + amount = 1000 fakeMoney = true } @@ -4432,6 +4432,7 @@ async function updatePokerPlayersSolve(roomId) { import http from 'http'; import { Server } from 'socket.io'; +import * as test from "node:test"; const server = http.createServer(app); const io = new Server(server, {