167 lines
4.5 KiB
PHP
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;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|