This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/site/beta5/handlers/planet.inc

670 lines
19 KiB
PHP

<?php
class page_handler
{
var $needsAuth = true;
var $ajax = array(
"func" => array(
"getPlanetList", "getPlanetData", "addToQueue",
"factoryAction", "replaceItems", "flushQueue",
"moveItems", "deleteItems", "rename",
"planetSale", "cancelSale", "abandon",
"cancelAbandon", "blowItUp", "cancelDestruction",
"getSellableFleets", "destroyTurrets"
),
"init" => "initPlanetPage();"
);
function getPlanetList() {
$l = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$str = count($l);
foreach ($l as $id => $name)
$str .= "\n$id#$name";
return $str;
}
function getPlanetData($id) {
// Get planet data
$id = (int)$id;
$info = gameAction('getPlanetById', $id);
if (is_null($info)) {
return "";
}
$pid = $_SESSION[game::sessName()]['player'];
// Build result array
$result = array(
"{$info['status']}#$id#{$info['x']}#{$info['y']}#" . ($info['orbit']+1)
. "#" . utf8entities($info['name'])
);
// Get probe report
$probeData = null; // FIXME
// Build fleets summary
$ownFleets = array_keys(gameAction('getFleetsAt', $id, $pid));
$allFleets = array_keys(gameAction('getFleetsAt', $id));
$ownSum = 0;
if (count($ownFleets) || $info['owner'] == $pid)
{
$attSum = 0;
$defSum = 0;
$ownMode = ($info['owner'] == $pid ? 1 : null);
foreach ($allFleets as $fid)
{
$finf = gameAction('getFleet', $fid);
if ($finf['owner'] == $pid)
{
if (is_null($ownMode))
$ownMode = ($finf['attacking'] == 't') ? 2 : 1;
$ownSum += gameAction('getFleetPower', $finf['owner'], 0, $finf['gaships'], $finf['fighters'], $finf['cruisers'], $finf['bcruisers']);
}
elseif ($finf['attacking'] == 't')
$attSum += gameAction('getFleetPower', $finf['owner'], 0, $finf['gaships'], $finf['fighters'], $finf['cruisers'], $finf['bcruisers']);
else
$defSum += gameAction('getFleetPower', $finf['owner'], 0, $finf['gaships'], $finf['fighters'], $finf['cruisers'], $finf['bcruisers']);
}
if (is_null($ownMode))
$ownMode = 0;
array_push($result, "$ownMode#$ownSum#$attSum#$defSum");
}
elseif (!is_null($probeData))
{
// FIXME: get fleets data from probe report
}
else
array_push($result, "0###");
// If the planet has been destroyed or is a nebula, we're done
if ($info['status'] != 0)
return join("\n", $result);
// Get owner and player data
$isOwn = ($info['owner'] == $pid);
$owner = is_null($info['owner']) ? null : gameAction('getPlayerInfo', $info['owner']);
$player = $isOwn ? $owner : gameAction('getPlayerInfo', $pid);
$protected = is_null($owner) ? false : (
$this->game->getLib('beta5/player')->call('getProtectionLevel', $info['owner']) > 0
);
$plPriv = gameAction('getAlliancePrivileges', $pid);
$vacation = ($isOwn && $info['vacation'] != 'NO ')
|| (!$isOwn && $info['vacation'] == 'YES ');
// Build planet summary:
// - isOwner
$s = ($isOwn ? 1 : 0) . "#" . ($vacation ? 1 : 0) . "#" . ($protected ? 1 : 0) . "#";
// - turrets
if ($isOwn || $ownSum || ($player['aid'] == $owner['aid'] && $plPriv['list_access'] == 3))
$s .= $info['turrets'];
elseif (!is_null($probeData))
$s .= ""; //FIXME: use probe report
$s .= "#";
// - population
if ($isOwn || $ownSum)
$s .= $info['pop'];
elseif (!is_null($probeData))
$s .= ""; //FIXME: use probe report
else
$s .= "";
$s .= "#";
// - factories
if (!$isOwn && $player['aid'] == $owner['aid'] && $plPriv['list_access'] == 3)
$s .= ((int)$info['ifact'] + (int)$info['mfact']);
elseif (!is_null($probeData)) // FIXME: don't include it if the probe got the exact amounts
$s .= ""; // FIXME: use probe report
$s .= "#";
if ($isOwn)
$s .= $info['ifact'] . "#" . $info['mfact'];
elseif (!is_null($probeData)) // FIXME: only include it if the probe got the exact amounts
$s .= "#"; // FIXME: use probe report
else
$s .= "#";
$s .= "#";
// - happiness
if ($isOwn)
$s .= $info['happiness'];
elseif (!is_null($probeData))
$s .= ""; // FIXME: use probe report
$s .= "#";
// - corruption
if ($isOwn)
$s .= round($info['corruption'] / 320);
elseif (!is_null($probeData))
$s .= ""; // FIXME: use probe report
$s .= "#";
// - profit
if ($isOwn) {
$m = gameAction('getPlanetIncome', $info['owner'], $info['pop'], $info['happiness'], $info['ifact'], $info['mfact'], $info['turrets'], $info['corruption']);
$s .= $m[0];
}
$s .= "#";
// - alliance tag
$s .= $owner['alliance'];
array_push($result, $s);
// We're done if we're not the owner
if (!$isOwn)
return join("\n", $result);
$rules = gameAction('loadPlayerRules', $pid);
// Current action
if (!is_null($info['bh_prep']))
$s = "2#".($info['bh_prep'] + 1);
elseif (!is_null($info['abandon']))
$s = "3#".($info['abandon']);
else
{
$offer = gameAction('getPlanetSale', $id);
if (is_null($offer))
{
$restr = gameAction('isPlayerRestrained', $pid);
$np = gameAction('getRealPlanetCount', $pid);
$canSell = ($restr == 0) && ($np > 1);
$q = dbQuery("SELECT bh_unhappiness FROM player WHERE id=$pid");
list($bhu) = dbFetchArray($q);
$q = dbQuery("SELECT COUNT(*) FROM planet WHERE owner=$pid AND bh_prep IS NOT NULL");
list($bhp) = dbFetchArray($q);
$canBlow = ($np > 1) && ($rules['planet_destruction'] > 0) && ($bhu < 20) && ($bhp < 4);
if ($canBlow && $this->game->params['victory'] == 2) {
// Prevent planets from being destroyed in CTF games
$ctfLib = $this->game->getLib('beta5/ctf');
$canBlow = !($ctfLib->call('isTarget', $info['system']));
}
$s = "0#" . $info['rename'] . "#" . ($canSell ? 1 : 0) . "#" . ($canBlow ? 1 : 0) . "#" . ($np > 1 ? 1 : 0);
}
else
{
$s = "1#" . (is_null($offer['finalized']) ? 0 : ($info['sale'] + 1));
$s .= "#" . $offer['sold_to'] . "#";
if (!is_null($offer['sold_to']))
$s .= utf8entities(gameAction('getPlayerName', $offer['sold_to']));
}
}
array_push($result, $s);
// Capabilities and prices
$s = $rules['military_level'] . "#" . $rules['if_cost'] . "#" . $rules['mf_cost'] . "#" . $rules['bh_cost'] . "#";
$s .= $rules['build_cost_turret'] . "#" . $rules['build_cost_gaship'] . "#" . $rules['build_cost_fighter'];
$s .= "#" . $rules['build_cost_cruiser'] . "#" . $rules['build_cost_bcruiser'];
array_push($result, $s);
// Build queue
$bq = gameAction('getBuildQueue', $id);
foreach ($bq as $bqi)
array_push($result, $bqi["type"] . "#" . $bqi['quantity'] . "#" . $bqi['time'] . "#" . $bqi['ctime']);
return join("\n", $result);
}
function factoryAction($pid, $act, $nb, $type) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
if ((int)$nb != $nb || $nb <= 0) {
return "ERR#3";
}
$t = ($type == '1') ? "m" : "i";
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids)) {
return "ERR#-1";
}
if ($act != "1") {
$planets = $this->game->getLib('beta5/planet');
$err = $planets->call('checkBuildFactories', $pid, $nb, $t);
if ($err) {
return "ERR#" . ($err + 23);
}
} else {
$err = gameAction('checkDestroyFactories', $pid, $nb, $t);
if ($err) {
return "ERR#" . ($err + 7);
}
}
gameAction(($act == "1") ? "destroyFactories" : "buildFactories", $pid, $nb, $t);
return $this->getPlanetData($pid);
}
function addToQueue($pid, $nb, $type) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
if ((int)$nb != $nb || $nb <= 0) {
return "ERR#2";
}
$r = gameAction('loadPlayerRules', $_SESSION[game::sessName()]['player']);
$type = (int)$type;
if ($type < 0 || $type > $r['military_level'] + 2)
return "ERR#1";
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids))
return "ERR#-1";
$types = array('turret', 'gaship', 'fighter', 'cruiser', 'bcruiser');
$cost = $r['build_cost_'.$types[$type]] * $nb;
$pinf = gameAction('getPlayerInfo', $_SESSION[game::sessName()]['player']);
if ($pinf['cash'] < $cost)
return "ERR#0";
gameAction('addToBuildQueue', $pid, $nb, $type);
return $this->getPlanetData($pid);
}
function replaceItems($pid, $items, $nb, $type) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
if ((int)$nb != $nb || $nb <= 0)
return "ERR#2";
$r = gameAction('loadPlayerRules', $_SESSION[game::sessName()]['player']);
if ($type < 0 || $type > $r['military_level'] + 2)
return "ERR#1";
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids))
return "ERR#-1";
$lst = explode('#', $items);
if (!count($lst))
return "ERR#5";
foreach ($lst as $it)
if (!preg_match('/^[0-9]+$/', $it))
return "ERR#-2";
$types = array('turret', 'gaship', 'fighter', 'cruiser', 'bcruiser');
$icost = $r['build_cost_'.$types[$type]] * $nb;
$sum = gameAction('getReplacementCost', $pid, $lst, $icost);
$pinf = gameAction('getPlayerInfo', $_SESSION[game::sessName()]['player']);
if ($pinf['cash'] < $sum)
return "ERR#0";
gameAction('replaceItems', $pid, $lst, $nb, $type);
return $this->getPlanetData($pid);
}
function moveItems($pid, $items, $dir) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids))
return "ERR#-1";
$lst = explode('#', $items);
if (!count($lst))
return 5;
foreach ($lst as $li)
if (!preg_match('/^[0-9]+$/', $li))
return "ERR#-2";
sort($lst);
if ($dir != '1')
{
$bql = gameAction('getQueueLength', $pid);
if ($lst[0] >= $bql - 1)
return "ERR#8";
$lst = array_reverse($lst);
}
elseif ($lst[0] == 0)
return "ERR#7";
$ga = ($dir == '1') ? "Up" : "Down";
foreach ($lst as $it)
gameAction('moveItem' . $ga, $pid, $it);
return $this->getPlanetData($pid);
}
function deleteItems($pid, $sel) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids))
return "ERR#-1";
$items = explode('#', $sel);
if (!count($items))
return "ERR#5";
foreach ($items as $i)
{
if (!preg_match('/^[0-9]+$/', $i))
continue;
gameAction('deleteBuildQueueItem', $pid, $i);
}
gameAction('reorderBuildQueue', $pid);
return $this->getPlanetData($pid);
}
function flushQueue($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$plp = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$ids = array_keys($plp);
if (!in_array($pid, $ids))
return "ERR#-1";
gameAction('flushBuildQueue', $pid);
return $this->getPlanetData($pid);
}
function rename($pid, $name) {
$player = $_SESSION[game::sessName()]['player'];
$playerLib = $this->game->getLib('beta5/player');
if ($playerLib->call('isOnVacation', $player)) {
return "ERR#200";
}
$plp = $playerLib->call('getPlanets', $player);
$ids = array_keys($plp);
if (!in_array($pid, $ids)) {
return "ERR#-1";
}
$n = trim($name);
$err = $this->game->getLib()->call('checkPlanetName', $n);
if ($err) {
if ($err == 6) {
return "ERR#38";
}
return "ERR#". ($err + 12);
}
$planetLib = $this->game->getLib('beta5/planet');
$salesLib = $this->game->getLib('beta5/sale');
$info = $planetLib->call('byId', $pid);
$offer = $salesLib->call('getPlanetSale', $pid);
if (is_null($info['abandon']) && is_null($info['bh_prep']) && $info['rename'] && is_null($offer)) {
$planetLib->call('rename', $pid, $n);
}
return $this->getPlanetData($pid);
}
function planetSale($pid, $mode, $player, $price, $expires, $fleets) {
$cPlayer = $_SESSION[game::sessName()]['player'];
if (gameAction('isOnVacation', $cPlayer)) {
return "ERR#200";
} elseif (gameAction('getProtectionLevel', $cPlayer)) {
return "ERR#201";
}
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$info = gameAction('getPlanetById', $pid);
$offer = gameAction('getPlanetSale', $pid);
if (!(is_null($info['abandon']) && is_null($info['bh_prep']) && is_null($offer)))
return "ERR#-1";
$restr = gameAction('isPlayerRestrained', $cPlayer);
$np = gameAction('getRealPlanetCount', $cPlayer);
if ($restr > 0 || $np <= 1)
return "ERR#-1";
$mode = (int)$mode;
if ($mode < 0 || $mode > 3)
return "ERR#-1";
if ($mode < 2)
{
$player = trim($player);
if ($player == '')
return "ERR#1";
$tPid = gameAction('getPlayer', $player);
if (is_null($tPid))
return "ERR#4";
elseif ($tPid == $cPlayer) {
return "ERR#6";
} elseif (gameAction('getProtectionLevel', $tPid)) {
return "ERR#5";
}
}
else
$tPid = null;
if ($mode != 0)
{
$price = (int)$price;
if ($price <= 0)
return "ERR#2";
}
else
$price = 0;
$expOk = array(0, 6, 12, 24, 48, 72, 96, 120);
$expires = (int)$expires;
if (!in_array($expires,$expOk))
return "ERR#-1";
elseif ($mode == 3 && $expires == 0)
return "ERR#3";
// Check fleets
if ($fleets != "")
{
$sFleets = split('#', $fleets);
$flist = array_keys(gameAction('getFleetsAt', $pid, $cPlayer));
foreach ($sFleets as $fid)
{
if (!in_array($fid, $flist))
return "ERR#7";
$f = gameAction('getFleet', $fid);
if ($f['can_move'] != 'Y' || !is_null($fleet['sale_info']) || !is_null($fleet['sale']))
return "ERR#8";
}
}
else
$sFleets = array();
// Merge fleets
if (count($sFleets) > 1)
{
$tmp = gameAction('mergeFleets', $sFleets, array($cPlayer), '');
$fleet = $tmp[0];
}
elseif (count($sFleets))
$fleet = $sFleets[0];
else
$fleet = null;
gameAction('newSale', $cPlayer, ($mode>1), ($mode == 3), $expires, $price, $tPid, $pid, $fleet);
return $this->getPlanetData($pid);
}
function abandon($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$info = gameAction('getPlanetById', $pid);
$offer = gameAction('getPlanetSale', $pid);
if (!(is_null($info['abandon']) && is_null($info['bh_prep']) && is_null($offer)))
return "ERR#-1";
$np = gameAction('getRealPlanetCount', $cPlayer);
if ($np <= 1)
return "ERR#-1";
gameAction('setPlanetAbandon', $pid);
return $this->getPlanetData($pid);
}
function cancelAbandon($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$info = gameAction('getPlanetById', $pid);
if (is_null($info['abandon']))
return "ERR#-1";
gameAction('setPlanetAbandon', $pid, false);
return $this->getPlanetData($pid);
}
function cancelSale($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$offer = gameAction('getPlanetSale', $pid);
if (is_null($offer))
return "ERR#-1";
if (is_null($offer['finalized']))
gameAction('cancelSale', $cPlayer, $offer['id']);
elseif (!gameAction('cancelTransfer', $cPlayer, $offer['id']))
return "ERR#18";
return $this->getPlanetData($pid);
}
function blowItUp($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids)) {
return "ERR#-1";
}
$info = gameAction('getPlanetById', $pid);
$offer = gameAction('getPlanetSale', $pid);
if (!(is_null($info['abandon']) && is_null($info['bh_prep']) && is_null($offer))) {
return "ERR#-1";
}
$rules = gameAction('loadPlayerRules', $cPlayer);
$np = gameAction('getRealPlanetCount', $cPlayer);
$q = dbQuery("SELECT bh_unhappiness FROM player WHERE id=$cPlayer");
list($bhu) = dbFetchArray($q);
$q = dbQuery("SELECT COUNT(*) FROM planet WHERE owner=$pid AND bh_prep IS NOT NULL");
list($bhp) = dbFetchArray($q);
$canBlow = ($np > 1) && ($rules['planet_destruction'] > 0) && ($bhu < 20) && ($bhp < 4);
if ($canBlow && $this->game->params['victory'] == 2) {
// Prevent planets from being destroyed in CTF games
$ctfLib = $this->game->getLib('beta5/ctf');
$canBlow = !($ctfLib->call('isTarget', $info['system']));
}
if (! $canBlow) {
return "ERR#-1";
}
gameAction('setPlanetBoom', $pid);
return $this->getPlanetData($pid);
}
function cancelDestruction($pid) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$info = gameAction('getPlanetById', $pid);
if (is_null($info['bh_prep']))
return "ERR#-1";
gameAction('setPlanetBoom', $pid, false);
return $this->getPlanetData($pid);
}
function getSellableFleets($pid)
{
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$fleets = array_keys(gameAction('getFleetsAt', $pid, $cPlayer));
$rv = array();
foreach ($fleets as $fid)
{
$f = gameAction('getFleet', $fid);
if ($f['can_move'] != 'Y' || !is_null($fleet['sale_info']) || !is_null($fleet['sale']))
continue;
$s = "$fid#" . $f['gaships'] . "#" . $f['fighters'] . "#" . $f['cruisers'] . "#" . $f['bcruisers'] . "#";
$s .= gameAction('getFleetPower', $cPlayer, 0, $f['gaships'], $f['fighters'], $f['cruisers'], $f['bcruisers']) . "#";
$s .= utf8entities($f['name']);
array_push($rv, $s);
}
return join("\n", $rv);
}
function destroyTurrets($pid, $turrets) {
if (gameAction('isOnVacation', $_SESSION[game::sessName()]['player'])) {
return "ERR#200";
}
$cPlayer = $_SESSION[game::sessName()]['player'];
$ids = array_keys(gameAction('getPlayerPlanets', $cPlayer));
if (!in_array($pid, $ids))
return "ERR#-1";
$turrets = (int)$turrets;
if ($turrets <= 0)
return "ERR#19";
$err = gameAction('destroyTurrets', $pid, $turrets);
if ($err > 0)
return "ERR#" . ($err + 19);
return $this->getPlanetData($pid);
}
function handle($input)
{
if (!preg_match('/^[0-9]+$/', $input['id'])) {
logText("****** BUG? Planet not found: '{$input['id']}' (from {$_SERVER['HTTP_REFERER']})", LOG_DEBUG);
$this->output = "planetnf";
return;
}
$info = gameAction('getPlanetById', $input['id']);
if (is_null($info))
{
$this->output = "planetnf";
return;
}
$this->data = array(
'id' => $input['id'],
'plist' => $this->getPlanetList(),
'pdata' => $this->getPlanetData($input['id'])
);
$this->output = "planet";
}
}
?>