mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
124 lines
4.3 KiB
Lua
124 lines
4.3 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
local PLAYER = FindMetaTable( "Player" )
|
|
if not PLAYER then return end
|
|
|
|
function PLAYER:GetChessElo()
|
|
return self:GetNWInt( "ChessElo", 1400 ) or 1400
|
|
end
|
|
function PLAYER:GetDraughtsElo()
|
|
return self:GetNWInt( "DraughtsElo", 1400 ) or 1400
|
|
end
|
|
if CLIENT then return end
|
|
function PLAYER:SetChessElo( num )
|
|
self:SetNWInt( "ChessElo", num or Chess_GetElo(ply:SteamID()) or 1400 )
|
|
Chess_SetElo( self:SteamID(), num, false )
|
|
end
|
|
function PLAYER:SetDraughtsElo( num )
|
|
self:SetNWInt( "DraughtsElo", num or Chess_GetElo(ply:SteamID(), true) or 1400 )
|
|
Chess_SetElo( self:SteamID(), num, true )
|
|
end
|
|
|
|
function PLAYER:RefreshChessElo()
|
|
-- Convert old PData stuff
|
|
if self:GetPData("ChessElo") then
|
|
Chess_SetElo( self:SteamID(), self:GetPData("ChessElo"), false )
|
|
self:RemovePData("ChessElo")
|
|
end
|
|
if self:GetPData("DraughtsElo") then
|
|
Chess_SetElo( self:SteamID(), self:GetPData("DraughtsElo"), true )
|
|
self:RemovePData("DraughtsElo")
|
|
end
|
|
|
|
self:SetChessElo( Chess_GetElo(self:SteamID()) or 1400)
|
|
self:SetDraughtsElo( Chess_GetElo(self:SteamID(), true) or 1400)
|
|
end
|
|
hook.Add( "PlayerInitialSpawn", "Chess InitialSpawn InitElo", function(ply)
|
|
ply:RefreshChessElo()
|
|
end)
|
|
|
|
function PLAYER:ExpectedChessWin( against )
|
|
return (1/ (1+( 10^( (against:GetChessElo() - self:GetChessElo())/400 ) )) )
|
|
end
|
|
function PLAYER:ExpectedDraughtsWin( against )
|
|
return (1/ (1+( 10^( (against:GetDraughtsElo() - self:GetDraughtsElo())/400 ) )) )
|
|
end
|
|
|
|
function PLAYER:GetChessKFactor() --Imitating FIDE's K-factor ranges
|
|
local games = tonumber(self:GetPData( "ChessGamesPlayed", 0 )) or 0
|
|
if games<30 then
|
|
self:SetPData( "ChessEloKFactor", 15 )
|
|
return 30
|
|
end
|
|
local k = self:GetChessElo()>=2400 and 10 or self:GetPData( "ChessEloKFactor", 15 ) or 15
|
|
self:SetPData( "ChessEloKFactor", k )
|
|
return k
|
|
end
|
|
function PLAYER:GetDraughtsKFactor() --Imitating FIDE's K-factor ranges
|
|
local games = self:GetPData( "DraughtsGamesPlayed", 0 )
|
|
if games<30 then
|
|
self:SetPData( "DraughtsEloKFactor", 15 )
|
|
return 30
|
|
end
|
|
local k = self:GetDraughtsElo()>=2400 and 10 or self:GetPData( "DraughtsEloKFactor", 15 ) or 15
|
|
self:SetPData( "DraughtsEloKFactor", k )
|
|
return k
|
|
end
|
|
|
|
function PLAYER:DoChessElo( score, against )
|
|
local mod = math.ceil(self:GetChessKFactor() * (score - self:ExpectedChessWin(against)))
|
|
local NewElo = math.floor( self:GetChessElo() + mod )
|
|
|
|
self:SetChessElo( NewElo )
|
|
|
|
if IsValid(against) then
|
|
mod = mod*(-1)
|
|
local NewElo = math.floor( against:GetChessElo() + mod )
|
|
|
|
against:SetChessElo( NewElo )
|
|
local rank,count = Chess_GetRank(against)
|
|
against:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
|
end
|
|
local rank,count = Chess_GetRank(self)
|
|
self:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
|
|
|
Chess_UpdateElo( self )
|
|
end
|
|
function PLAYER:ChessWin( against )
|
|
if not IsValid(against) then return end
|
|
|
|
self:DoChessElo(1, against)
|
|
end
|
|
function PLAYER:ChessDraw( against ) self:DoChessElo(0.5, against) end
|
|
|
|
function PLAYER:DoDraughtsElo( score, against )
|
|
local mod = math.ceil(self:GetDraughtsKFactor() * (score - self:ExpectedDraughtsWin(against)))
|
|
local NewElo = math.floor( self:GetDraughtsElo() + mod )
|
|
|
|
self:SetDraughtsElo( NewElo )
|
|
|
|
if IsValid(against) then
|
|
mod = mod*(-1)
|
|
local NewElo = math.floor( against:GetDraughtsElo() + mod )
|
|
|
|
against:SetDraughtsElo( NewElo )
|
|
local rank = Chess_GetRank(self, "Draughts")
|
|
against:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
|
end
|
|
local rank = Chess_GetRank(self, "Draughts")
|
|
self:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
|
|
|
Chess_UpdateElo( self )
|
|
end
|
|
function PLAYER:DraughtsWin( against ) self:DoDraughtsElo(1, against) end
|
|
function PLAYER:DraughtsDraw( against ) self:DoDraughtsElo(0.5, against) end
|