Ladder refactor

This commit is contained in:
Guangcong Luo
2015-11-25 17:34:32 -05:00
parent 249fefa3d1
commit bc8daf62e4
5 changed files with 62 additions and 64 deletions

View File

@@ -690,7 +690,7 @@
buffer += '<tr class="hidden">';
hiddenFormats.push(row.formatid);
}
buffer += '<td>' + row.formatid + '</td><td><strong>' + Math.round(row.acre) + '</strong></td><td>' + Math.round(row.gxe, 1) + '</td><td>';
buffer += '<td>' + row.formatid + '</td><td><strong>' + Math.round(row.elo) + '</strong></td><td>' + Math.round(row.gxe, 1) + '</td><td>';
if (row.rprd > 100) {
buffer += '<span><em>' + Math.round(row.rpr) + '<small> &#177; ' + Math.round(row.rprd) + '</small></em> <small>(provisional)</small></span>';
} else {

View File

@@ -43,7 +43,7 @@ foreach ($toplist as $row)
$N=$row['w']+$row['l']+$row['t'];
?>
<tr<?php /* if (floatval($row['rprd']) > 100) echo ' style="color:#999"'; */ ?>>
<td><?php echo $i; ?></td><td><?php echo htmlspecialchars($row['username']); ?></td><td><strong><?php echo round($row['acre']); ?></strong></td><td><?php echo number_format($row['gxe'],1); ?></td>
<td><?php echo $i; ?></td><td><?php echo htmlspecialchars($row['username']); ?></td><td><strong><?php echo round($row['elo']); ?></strong></td><td><?php echo number_format($row['gxe'],1); ?></td>
<td><?php echo '<em>'.round($row['rpr']).'<small> &#177; '.round($row['rprd']).'</small></em>'; /* if (floatval($row['rprd']) > 100) echo ' <small>(provisional)</small>'; */ ?></td>
<td>
<?php if ($row['formatid'] == 'oususpecttest') echo number_format($N ? 40*$row['gxe']*pow(2.0,-17.0/$N) : 0,1,'.','');

View File

@@ -498,8 +498,8 @@ class LadderActionHandler {
include_once dirname(__FILE__) . '/ntbb-ladder.lib.php';
$server = $dispatcher->findServer();
if (!$server) {
$out['errorip'] = $dispatcher->getIp();
if (!$server || $server['id'] !== 'showdown') {
$out['errorip'] = "Your version of PS is too old for this ladder system. Please update.";
return;
}
@@ -526,7 +526,9 @@ class LadderActionHandler {
include_once dirname(__FILE__) . '/ntbb-ladder.lib.php';
$server = @$PokemonServers[@$reqData['serverid']];
if (!$server) die;
if (!$server || $server['id'] !== 'showdown') {
die;
}
$ladder = new NTBBLadder($server['id'], @$reqData['format']);
$user = $this->getUserData(@$reqData['user']);
@@ -540,8 +542,8 @@ class LadderActionHandler {
include_once dirname(__FILE__) . '/ntbb-ladder.lib.php';
$server = $dispatcher->findServer();
if (!$server) {
$out['errorip'] = $dispatcher->getIp();
if (!$server || $server['id'] !== 'showdown') {
$out['errorip'] = "Your version of PS is too old for this ladder system. Please update.";
return;
}
@@ -551,7 +553,7 @@ class LadderActionHandler {
if ($user) {
$ladder->getRating($user);
if (@$user['rating']) {
$out = intval($user['rating']['acre']);
$out = intval($user['rating']['elo']);
}
}
}

View File

@@ -112,14 +112,13 @@ class GlickoPlayer {
}
class NTBBLadder {
var $serverid;
var $formatid;
var $rplen;
var $rpoffset;
function __construct($serverid, $formatid) {
// serverid is no longer used
$this->formatid = preg_replace('/[^a-z0-9]+/', '', strtolower($formatid));
$this->serverid = preg_replace('/[^a-z0-9]+/', '', strtolower($serverid));
$this->rplen = 24*60*60;
$this->rpoffset = 9*60*60;
}
@@ -136,7 +135,7 @@ class NTBBLadder {
function getRating(&$user, $create=false) {
global $ladderdb;
if (!@$user['rating']) {
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `serverid` = '{$this->serverid}' AND `formatid` = '{$this->formatid}' AND `userid` = '".$ladderdb->escape($user['userid'])."' LIMIT 1");
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `userid` = '".$ladderdb->escape($user['userid'])."' AND `formatid` = '{$this->formatid}' LIMIT 1");
if (!$res) {
return false;
}
@@ -148,7 +147,7 @@ class NTBBLadder {
}
//echo "INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`userid`,`username`) VALUES ('{$this->formatid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."')";
$rp = $this->getrp();
$ladderdb->query("INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`serverid`,`userid`,`username`,`rptime`) VALUES ('{$this->formatid}','{$this->serverid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."',".$rp.")");
$ladderdb->query("INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`userid`,`username`,`rptime`) VALUES ('{$this->formatid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."',".$rp.")");
$user['rating'] = array(
'entryid' => $ladderdb->insert_id(),
'formatid' => $this->formatid,
@@ -166,8 +165,8 @@ class NTBBLadder {
'l' => 0,
't' => 0,
'gxe' => 50,
'acre' => 1000,
'lacre' => 1000,
'elo' => 1000,
'col1' => 1000,
);
return true;
}
@@ -180,7 +179,7 @@ class NTBBLadder {
function getAllRatings(&$user) {
global $ladderdb;
if (!@$user['ratings']) {
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `serverid` = '{$this->serverid}' AND `userid` = '".$ladderdb->escape($user['userid'])."'");
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `userid` = '".$ladderdb->escape($user['userid'])."'");
if (!$res) {
return false;
}
@@ -212,12 +211,12 @@ class NTBBLadder {
// $limit = 1000;
// }
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' AND `serverid` = '{$this->serverid}' ORDER BY `lacre` DESC LIMIT $limit");
$res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' ORDER BY `elo` DESC LIMIT $limit");
$j = 0;
while ($row = $ladderdb->fetch_assoc($res)) {
$j++;
// if ($row['lacre'] < 0 && $j > 50) break;
// if ($row['col1'] < 0 && $j > 50) break;
$user = array(
'username' => $row['username'],
'userid' => $row['userid'],
@@ -239,14 +238,14 @@ class NTBBLadder {
function clearAllRatings() {
global $ladderdb;
$res = $ladderdb->query("DELETE FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' AND `serverid` = '{$this->serverid}'");
$res = $ladderdb->query("DELETE FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}'");
}
function saveRating($user) {
global $ladderdb;
if (!$user['rating']) return false;
return !!$ladderdb->query("UPDATE `{$ladderdb->prefix}ladder` SET `w`={$user['rating']['w']}, `l`={$user['rating']['l']}, `t`={$user['rating']['t']}, `r`={$user['rating']['r']}, `rd`={$user['rating']['rd']}, `sigma`={$user['rating']['sigma']}, `rptime`={$user['rating']['rptime']}, `rpr`={$user['rating']['rpr']}, `rprd`={$user['rating']['rprd']}, `rpsigma`={$user['rating']['rpsigma']}, `rpdata`='".$ladderdb->escape($user['rating']['rpdata'])."', `gxe`={$user['rating']['gxe']}, `acre`={$user['rating']['acre']}, `lacre`={$user['rating']['lacre']} WHERE `entryid` = {$user['rating']['entryid']} LIMIT 1");
return !!$ladderdb->query("UPDATE `{$ladderdb->prefix}ladder` SET `w`={$user['rating']['w']}, `l`={$user['rating']['l']}, `t`={$user['rating']['t']}, `r`={$user['rating']['r']}, `rd`={$user['rating']['rd']}, `sigma`={$user['rating']['sigma']}, `rptime`={$user['rating']['rptime']}, `rpr`={$user['rating']['rpr']}, `rprd`={$user['rating']['rprd']}, `rpsigma`={$user['rating']['rpsigma']}, `rpdata`='".$ladderdb->escape($user['rating']['rpdata'])."', `gxe`={$user['rating']['gxe']}, `elo`={$user['rating']['elo']} WHERE `entryid` = {$user['rating']['entryid']} LIMIT 1");
}
function update(&$user, $newM = false, $newMelo = 1000, $force = false) {
@@ -257,7 +256,7 @@ class NTBBLadder {
return false;
}
$elo = $user['rating']['acre'];
$elo = $user['rating']['elo'];
$rating = new GlickoPlayer($user['rating']['r'], $user['rating']['rd']);
if ($user['rating']['rpdata']) {
@@ -294,7 +293,7 @@ class NTBBLadder {
}
$user['rating']['r'] = $rating->rating;
$user['rating']['rd'] = $rating->rd;
$user['rating']['lacre'] = $user['rating']['acre'] = $elo;
$$user['rating']['elo'] = $elo;
}
if ($newM) {
@@ -324,25 +323,25 @@ class NTBBLadder {
// $user['rating']['gxe'] = round(100 / (1 + pow(10,((1500 - $rating->rating) * pi() / sqrt(3 * log(10)*log(10) * $rating->rd*$rating->rd + 2500 * (64 * pi()*pi() + 147 * log(10)*log(10)))))), 1);
$user['rating']['gxe'] = round(100 / (1 + pow(10,((1500 - $rating->rating) / 400 / sqrt(1 + 0.0000100724 * ($rating->rd*$rating->rd + 130*130))))), 1);
if ($newM) {
// compensate for Glicko2 bug: don't lose rating on win, don't gain rating on lose
// if ($newM['score'] > .9 && $rating->rating < $oldrpr) {
// $delta = $oldrpr - $rating->rating;
// $offset += $delta;
// $user['rating']['rpr'] += $delta;
// }
// if ($newM['score'] < .1 && $rating->rating > $oldrpr) {
// $delta = $oldrpr - $rating->rating;
// $offset += $delta;
// $user['rating']['rpr'] += $delta;
// }
}
// if ($newM) {
// // compensate for Glicko2 bug: don't lose rating on win, don't gain rating on lose
// if ($newM['score'] > .9 && $rating->rating < $oldrpr) {
// $delta = $oldrpr - $rating->rating;
// $offset += $delta;
// $user['rating']['rpr'] += $delta;
// }
// if ($newM['score'] < .1 && $rating->rating > $oldrpr) {
// $delta = $oldrpr - $rating->rating;
// $offset += $delta;
// $user['rating']['rpr'] += $delta;
// }
// }
if ($offset) {
$user['rating']['rpdata'] .= '##'.$offset;
}
if ($newM) {
$user['rating']['oldacre'] = $elo;
$user['rating']['oldelo'] = $elo;
$K = 50;
if ($elo < 1100) {
@@ -362,7 +361,7 @@ class NTBBLadder {
if ($elo < 1000) $elo = 1000;
$user['rating']['lacre'] = $user['rating']['acre'] = $elo;
$user['rating']['elo'] = $elo;
}
return true;
@@ -381,11 +380,11 @@ class NTBBLadder {
}
$p1M['score'] = $p1score;
$p2M['score'] = 1 - $p1score;
$p1Macre = $p2['rating']['acre'];
$p2Macre = $p1['rating']['acre'];
$p1Melo = $p2['rating']['elo'];
$p2Melo = $p1['rating']['elo'];
$this->update($p1, $p1M, $p1Macre);
$this->update($p2, $p2M, $p2Macre);
$this->update($p1, $p1M, $p1Melo);
$this->update($p2, $p2M, $p2Melo);
$this->saveRating($p1);
$this->saveRating($p2);

View File

@@ -1,16 +1,14 @@
-- phpMyAdmin SQL Dump
-- version 3.3.10.4
-- http://www.phpmyadmin.net
--
-- Host: mysql.pokemonshowdown.com
-- Generation Time: Jan 23, 2013 at 04:24 PM
-- Server version: 5.1.39
-- PHP Version: 5.3.13
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `pokemonshowdown`
-- Database: `showdown`
--
-- --------------------------------------------------------
@@ -21,10 +19,9 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
CREATE TABLE IF NOT EXISTS `ntbb_ladder` (
`entryid` int(11) NOT NULL AUTO_INCREMENT,
`serverid` varchar(255) NOT NULL,
`formatid` varchar(255) NOT NULL,
`userid` varchar(255) NOT NULL,
`username` varchar(255) NOT NULL,
`formatid` varchar(63) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`userid` varchar(63) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`username` varchar(63) COLLATE utf8mb4_bin NOT NULL,
`w` int(11) NOT NULL DEFAULT '0',
`l` int(11) NOT NULL DEFAULT '0',
`t` int(11) NOT NULL DEFAULT '0',
@@ -36,14 +33,14 @@ CREATE TABLE IF NOT EXISTS `ntbb_ladder` (
`rpr` double NOT NULL DEFAULT '1500',
`rprd` double NOT NULL DEFAULT '350',
`rpsigma` double NOT NULL DEFAULT '0.06',
`rpdata` text NOT NULL,
`acre` double NOT NULL DEFAULT '1000',
`lacre` double NOT NULL,
`rpdata` mediumtext CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`elo` double NOT NULL DEFAULT '1000',
`col1` double NOT NULL,
PRIMARY KEY (`entryid`),
KEY `ladderid` (`formatid`,`userid`,`gxe`),
KEY `serverid` (`serverid`),
KEY `acre` (`acre`),
KEY `lacre` (`lacre`),
KEY `userid` (`userid`),
KEY `formatid` (`formatid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=424968 ;
UNIQUE KEY `userformats` (`userid`,`formatid`),
KEY `formattoplist` (`formatid`,`elo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1 ;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;