lwb5-in-2025/scripts/game/beta5/library/register.inc

167 lines
4.5 KiB
PHP

<?php
class beta5_register {
public function __construct($lib) {
$this->lib = $lib;
$this->db = $this->lib->game->db;
}
function run($uid, $planet, $nick) {
// Player mustn't be playing already
if ($this->lib->call('doesUserPlay', $uid)) {
return 1;
}
// Extract the player's name
$q = $this->db->query("SELECT name FROM account WHERE id=$uid");
list($pn) = dbFetchArray($q);
if (is_null($nick)) {
$nick = $pn;
}
$n = addslashes($nick);
// Nickname must be unique
$q = $this->db->query("SELECT name FROM account WHERE (LOWER(name)=LOWER('$n') AND id <> $uid)");
if (!$q || dbCount($q)) {
return 2;
}
$q = $this->db->query("SELECT name FROM player WHERE LOWER(name)=LOWER('$n')");
if (!$q || dbCount($q) || ($nick == $pn && $this->lib->call('hasPlayed', $uid))) {
return 2;
}
// Planet name must be unique
$planetLib = $this->lib->game->getLib('beta5/planet');
if ($planetLib->call('nameExists', $planet)) {
return 3;
}
// Create player record
$ni = ($nick == $pn) ? "null" : "'$n'";
$initCash = $this->lib->game->params['initialcash'];
$cf = $initCash ? ",cash" : "";
$cv = $initCash ? ",$initCash" : "";
$pid = $this->db->query("INSERT INTO player(userid,name$cf) VALUES($uid,$ni$cv)");
if (!$pid) {
return 4;
}
// Initialize rules
$this->db->query("INSERT INTO rule (name,player,value) SELECT name,$pid,value FROM rule_def");
// Initialize rankings
$rLib = $this->lib->game->getLib('main/rankings');
$types = array('general','civ','military','financial','idr');
foreach ($types as $t) {
$rt = $rLib->call('getType', "p_$t");
$rLib->call('append', $rt, $nick);
}
// Handle locked alliances if required
if ((int) $this->lib->game->params['lockalliances'] > 1 && ! ($team = $this->lockedAlliances($pid))) {
return 4;
}
if ((int) $this->lib->game->params['usemap'] == 0) {
// Assign planet random planets for matches and rounds
$pLib = $this->lib->game->getLib('beta5/player');
$plid = $pLib->call('assign', $pid, $planet);
} else {
// Assign planet according to map specifications for CTF games
$ctfLib = $this->lib->game->getLib('beta5/ctf');
$plid = $ctfLib->call('assign', $pid, $planet, $team);
// Send welcoming message to the player
$ctfLib->call('message', $pid, 0, $team);
$ctfLib->call('joinMessage', $team, $pid);
}
if (!$plid) {
return 4;
}
$this->db->query("UPDATE player SET first_planet=$plid WHERE id=$pid");
// Initialize session
$_SESSION[game::sessName()] = array("player" => $pid);
return 0;
}
private function lockedAlliances($player) {
// Lock the table
$this->db->query("LOCK TABLE alliance IN ACCESS EXCLUSIVE MODE");
// Get the amount of alliances in the database
$q = $this->db->query("SELECT COUNT(*) FROM alliance");
if (!($q && dbCount($q))) {
return 0;
}
list($nAlliances) = dbFetchArray($q);
// Check if there are enough
$nWanted = (int) $this->lib->game->params['lockalliances'];
if ($nWanted > $nAlliances) {
// No, we need to create one
$rv = $this->createDefaultAlliance($player);
} else {
// Yes, have the player join the smallest alliance
$rv = $this->joinDefaultAlliance($player);
}
return $rv;
}
private function createDefaultAlliance($player) {
// Fetch default alliance records that haven't been used yet
$q = $this->db->query("SELECT tag,name FROM default_alliance WHERE tag NOT IN ("
. "SELECT tag FROM alliance)");
if (!($q && dbCount($q))) {
return false;
}
$defaults = array();
while ($r = dbFetchHash($q)) {
array_push($defaults, $r);
}
// Choose a random alliance tag from the list
$toCreate = $defaults[rand(0, count($defaults) - 1)];
// Create the alliance
$aLib = $this->lib->game->getLib('beta5/alliance');
$aID = $aLib->call('create', $toCreate['tag'], $toCreate['name'], $player);
if (is_null($aID)) {
return false;
}
// Make the alliance a democracy
$aLib->call('setDemocratic', $aID, true);
return $aID;
}
private function joinDefaultAlliance($player) {
// Get the ID of the smallest alliance
$q = $this->db->query("SELECT alliance,COUNT(*) AS members FROM player "
. "WHERE alliance IS NOT NULL GROUP BY alliance "
. "ORDER BY members,alliance LIMIT 1");
if (!($q && dbCount($q))) {
return false;
}
list($aID, $junk) = dbFetchArray($q);
// Have the player join the alliance
$this->db->query("UPDATE player SET alliance = $aID, a_status = 'IN', a_vote = NULL, a_grade = NULL "
. "WHERE id = $player");
return $aID;
}
}
?>