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/market.inc

463 lines
13 KiB
PHP

<?php
class page_handler
{
var $needsAuth = true;
var $ajax = array(
'func' => array(
'getPublicOffers', 'moveMap', 'cancelSale', 'placeBid',
'buyPublic', 'getPrivateOffers', 'buyPrivate', 'declinePrivate',
'getSentOffers'
),
'init' => 'initMarket();'
);
//--------------------
// Public offers
function findName($n)
{
$n = trim($n);
$a = gameAction('getPlanetByName', $n);
if (is_null($a))
return null;
$o = ($a['owner'] == $_SESSION[game::sessName()]['player']) ? 0 : 1;
$i = $o ? $a['name'] : $a['id'];
return array($o + 1, $i, $a['x'], $a['y']);
}
function getPlayerPlanets()
{
$pl = gameAction('getPlayerPlanets', $_SESSION[game::sessName()]['player']);
$as = array(count($pl));
foreach ($pl as $id => $name)
array_push($as, "$id#$name");
return $as;
}
function getPublicOffers() {
$page = &$this->sessData('page'); $page = 0;
$player = $_SESSION[game::sessName()]['player'];
$pinfo = gameAction('getPlayerInfo', $player);
$result = array();
// Get map configuration
$map = &$this->sessData('po_map');
if (!is_array($map)) {
$pname = gameAction('getFirstPlanet', $player);
list($type,$param,$x,$y) = $this->findName($pname);
$map = array(
'type' => $type,
'x' => $x,
'y' => $y,
'param' => $param,
'dist' => 1
);
} elseif ($map['type'] == 1) {
$pi = gameAction('getPlanetOwner', $map['param']);
if ($pi['owner'] != $player) {
$pi['type'] = 2;
$pi['param'] = $pi['name'];
}
}
// Add map data to the output array
array_push($result, $map['type']."#".$map['x']."#".$map['y']."#".$map['dist'].($map['type'] == 0 ? '' : ('#'.utf8entities($map['param']))));
$result = array_merge($result, $this->getPlayerPlanets());
// Get selected system data
$sys = gameAction('getSystemAt', $map['x'], $map['y']);
if (is_null($sys)) {
array_push($result, "-1#0");
} else {
switch ($this->game->params['victory']) {
case 0:
$sys['prot'] = ($sys['prot'] > 0) ? 1 : 0;
break;
case 1:
$sys['prot'] = 0;
break;
case 2:
$sys['prot'] = input::$game->getLib('beta5/ctf')->call('isTarget', $sys['id']) ? 1 : 0;
break;
}
$pLev = gameAction('getProtectionLevel', $player);
array_push($result, $sys['nebula']."#".$sys['prot']);
$plist = gameAction('getSystemPlanets', $sys['id']);
foreach ($plist as $pi) {
$s = $pi['id']."#".$pi['status']."#".($pi['owner'] == $player ? '1' : '0') . '#';
$s .= ($pinfo['aid'] && $pi['owner'] != $player && $pinfo['alliance'] == $pi['tag']) ? '1' : '0';
array_push($result, $s . "#" . utf8entities($pi['name']));
}
}
// Look for sales
$pIds = gameAction('getPlanetsAround', $map['x'], $map['y'], $map['dist']);
if (count($pIds))
{
$sales = gameAction('getSales', $pIds);
$pSales = $fSales = array();
for ($i=0;$i<count($sales);$i++)
if (is_null($sales[$i]['planet']))
array_push($fSales, $i);
else
array_push($pSales, $i);
array_push($result, count($pSales)."#".count($fSales));
$sellers = array();
// Planet sales, with or without fleets
for ($i=0;$i<count($pSales);$i++)
{
$o = $sales[$pSales[$i]];
$p = $o['planet'];
if (!in_array($o['player'],$sellers))
array_push($sellers, $o['player']);
$s = $o['id']."#".$o['expires']."#".$p['id']."#".$o['player']."#".$p['x']."#".$p['y']."#".($p['orbit']+1)."#".$o['price']."#";
$s .= ($o['auction']=='t'?1:0)."#".$p['pop']."#".$p['turrets']."#".$p['fact']."#".(is_null($o['fleet'])?0:1)."#".utf8entities($p['name']);
array_push($result, $s);
if (is_null($o['fleet']))
continue;
$f = $o['fleet'];
array_push($result, $f['id']."#".$f['sg']."#".$f['sf']."#".$f['sc']."#".$f['sb']);
}
// Fleet sales
for ($i=0;$i<count($fSales);$i++)
{
$o = $sales[$fSales[$i]];
$f = $o['fleet'];
if (!in_array($o['player'],$sellers))
array_push($sellers, $o['player']);
$s = $o['id']."#".$o['expires']."#".$f['id']."#".$o['player']."#".$f['x']."#".$f['y']."#".($f['orbit']+1)."#".$f['pid']."#".$o['price']."#";
$s .= ($o['auction']=='t'?1:0)."#".$f['sg']."#".$f['sf']."#".$f['sc']."#".$f['sb']."#".utf8entities($f['pname']);
array_push($result, $s);
}
// Current owners
foreach ($sellers as $sid)
{
$pinf = gameAction('getPlayerInfo', $sid, true);
array_push($result, "$sid#" . ($player==$sid?1:0) . "#" . $pinf['quit'] . "#" . utf8entities($pinf['name']));
}
}
else
// No sales
array_push($result, "0#0");
return join("\n", $result);
}
function moveMap($type,$parm,$dist) {
$map = &$this->sessData('po_map');
$type = (int)$type;
if ($type < 0 || $type > 2) {
$type = 0;
}
$dist = (int)$dist;
if ($dist < 1 || $dist > 7) {
$dist = 1;
}
$map['dist'] = $dist;
switch ($type) :
case 0:
list($x,$y) = split('#',$parm);
$map['x'] = (int)$x;
$map['y'] = (int)$y;
$map['type'] = 0;
break;
case 1:
$a = gameAction('getPlanetById', (int)$parm);
if (!is_null($a)) {
$map['x'] = $a['x'];
$map['y'] = $a['y'];
$map['param'] = (int)$parm;
$map['type'] = 1;
}
break;
case 2:
$a = $this->findName($parm);
if (!is_null($a)) {
list($map['type'],$map['param'],$map['x'],$map['y']) = $a;
}
break;
endswitch;
return $this->getPublicOffers();
}
function cancelSale($id) {
$player = $_SESSION[game::sessName()]['player'];
$pLib = $this->game->getLib('beta5/player');
if ($pLib->call('isOnVacation', $player)) {
return "ERR#200";
} elseif ($pLib->call('getProtectionLevel', $player)) {
return "ERR#201";
}
gameAction('cancelSale', $_SESSION[game::sessName()]['player'], (int)$id);
return $this->getMarketData();
}
function placeBid($id, $bid) {
$player = $_SESSION[game::sessName()]['player'];
$pLib = $this->game->getLib('beta5/player');
if ($pLib->call('isOnVacation', $player)) {
return "ERR#200";
} elseif ($pLib->call('getProtectionLevel', $player)) {
return "ERR#201";
}
$r = gameAction('placeBid', $_SESSION[game::sessName()]['player'], (int)$id, (int)$bid);
if ($r != '')
return "ERR#$r";
return $this->getPublicOffers();
}
function buyPublic($offer) {
$player = $_SESSION[game::sessName()]['player'];
$pLib = $this->game->getLib('beta5/player');
if ($pLib->call('isOnVacation', $player)) {
return "ERR#200";
} elseif ($pLib->call('getProtectionLevel', $player)) {
return "ERR#201";
}
$r = gameAction('buy', $_SESSION[game::sessName()]['player'], (int)$offer);
if ($r != '')
return "ERR#$r";
return $this->getPublicOffers();
}
//--------------------
// Private offers
function getPrivateOffers() {
$page = &$this->sessData('page'); $page = 1;
$player = $_SESSION[game::sessName()]['player'];
$pinfo = gameAction('getPlayerInfo', $player);
$result = array();
// Get offers and history
$offers = gameAction('getDirectSales', $player);
$history = gameAction('getSalesHistoryTo', $player);
$sellers = array();
array_push($result, count($offers) . "#" . count($history));
// Generate offers list
foreach ($offers as $o)
{
$f = $o['fleet'];
$p = $o['planet'];
if (!in_array($o['player'], $sellers))
array_push($sellers, $o['player']);
$cs = is_null($p) ? $f : $p;
$rs = array($o['id'], $o['player'], $o['price'], $cs['x'], $cs['y'], $cs['orbit']+1);
array_push($rs, is_null($p) ? '' : $p['id']);
array_push($rs, is_null($f) ? '' : $f['id']);
array_push($rs, $o['started']); array_push($rs, $o['expires']);
array_push($rs, utf8entities(is_null($p) ? $f['pname'] : $p['name']));
array_push($result, join('#', $rs));
if (!is_null($f))
{
$rs = array($f['sg'], $f['sf'], $f['sc'], $f['sb']);
array_push($result, join('#', $rs));
}
if (!is_null($p))
{
$rs = array($p['pop'], $p['turrets'], $p['fact']);
array_push($result, join('#', $rs));
}
}
// Generate history list
foreach ($history as $o)
{
if (!in_array($o['from_player'], $sellers))
array_push($sellers, $o['from_player']);
$price = is_null($o['sell_price']) ? $o['price'] : $o['sell_price'];
$hf = ($o['is_planet'] == 'f') || ($o['f_gaships'] + $o['f_fighters'] + $o['f_cruisers'] + $o['f_bcruisers'] != 0);
$pinf = gameAction('getPlanetById', $o['p_id']);
$rs = array(
$o['from_player'], $price, $pinf['x'], $pinf['y'], $pinf['orbit']+1,
($o['is_planet'] == 't' ? 1 : 0), $hf?1:0,
$o['started'], $o['end_mode'], $o['ended'], utf8entities($o['p_name'])
);
array_push($result, join("#", $rs));
if ($hf)
array_push($result, $o['f_gaships']."#".$o['f_fighters']."#".$o['f_cruisers']."#".$o['f_bcruisers']);
if ($o['is_planet'] == 't')
array_push($result, $o['p_pop']."#".$o['p_turrets']."#".$o['p_factories']);
}
// Player names and status
foreach ($sellers as $sid)
{
$pinf = gameAction('getPlayerInfo', $sid, true);
array_push($result, "$sid#" . $pinf['quit'] . "#" . utf8entities($pinf['name']));
}
return join("\n", $result);
}
function buyPrivate($offer) {
$player = $_SESSION[game::sessName()]['player'];
$pLib = $this->game->getLib('beta5/player');
if ($pLib->call('isOnVacation', $player)) {
return "ERR#200";
} elseif ($pLib->call('getProtectionLevel', $player)) {
return "ERR#201";
}
$r = gameAction('buy', $_SESSION[game::sessName()]['player'], (int)$offer);
if ($r != '')
return "ERR#$r";
return $this->getPrivateOffers();
}
function declinePrivate($offer) {
$player = $_SESSION[game::sessName()]['player'];
$pLib = $this->game->getLib('beta5/player');
if ($pLib->call('isOnVacation', $player)) {
return "ERR#200";
} elseif ($pLib->call('getProtectionLevel', $player)) {
return "ERR#201";
}
if (!gameAction('isDirectOffer', $_SESSION[game::sessName()]['player'], (int)$offer)) {
return "ERR#0";
}
gameAction('declinePrivate', (int)$offer);
return $this->getPrivateOffers();
}
//--------------------
// Sent offers
function getSentOffers() {
$page = &$this->sessData('page'); $page = 2;
$player = $_SESSION[game::sessName()]['player'];
$pinfo = gameAction('getPlayerInfo', $player);
$result = array();
// Get offers and history
$offers = gameAction('getSentOffers', $player);
$history = gameAction('getSalesHistoryFrom', $player);
$buyers = array();
array_push($result, count($offers) . "#" . count($history));
// Generate offers list
foreach ($offers as $o) {
$f = $o['fleet'];
$p = $o['planet'];
if ($o['to_player'] != '' && !in_array($o['to_player'], $buyers))
array_push($buyers, $o['to_player']);
$cs = is_null($p) ? $f : $p;
$rs = array($o['id'], $o['mode'], $o['price'], $o['to_player'], $cs['x'], $cs['y'], $cs['orbit'] + 1, is_null($p) ? 0 : 1, is_null($f) ? 0 : 1);
array_push($rs, $o['started']); array_push($rs, $o['expires']);
array_push($rs, utf8entities(is_null($p) ? $f['pname'] : $p['name']));
array_push($result, join('#', $rs));
if (!is_null($f)) {
$rs = array($f['sg'], $f['sf'], $f['sc'], $f['sb']);
array_push($result, join('#', $rs));
}
if (!is_null($p)) {
$rs = array($p['pop'], $p['turrets'], $p['fact']);
array_push($result, join('#', $rs));
}
}
// Generate history list
foreach ($history as $o) {
if ($o['to_player'] != '' && !in_array($o['to_player'], $buyers))
array_push($buyers, $o['to_player']);
$price = is_null($o['sell_price']) ? $o['price'] : $o['sell_price'];
$hf = ($o['is_planet'] == 'f') || ($o['f_gaships'] + $o['f_fighters'] + $o['f_cruisers'] + $o['f_bcruisers'] != 0);
$pinf = gameAction('getPlanetById', $o['p_id']);
$rs = array(
$pinf['x'], $pinf['y'], $pinf['orbit'] + 1, $o['mode'], ($o['is_planet'] == 't' ? 1 : 0),
$hf?1:0, $o['to_player'], $price,
$o['started'], $o['end_mode'], $o['ended'], utf8entities($o['p_name'])
);
array_push($result, join("#", $rs));
if ($hf)
array_push($result, $o['f_gaships']."#".$o['f_fighters']."#".$o['f_cruisers']."#".$o['f_bcruisers']);
if ($o['is_planet'] == 't')
array_push($result, $o['p_pop']."#".$o['p_turrets']."#".$o['p_factories']);
}
// Player names and status
foreach ($buyers as $sid) {
$pinf = gameAction('getPlayerInfo', $sid, true);
array_push($result, "$sid#" . $pinf['quit'] . "#" . utf8entities($pinf['name']));
}
return join("\n", $result);
}
//--------------------
// Standard output
function &sessData($name)
{
if (!is_array($_SESSION[game::sessName()]['market']))
$_SESSION[game::sessName()]['market'] = array('page' => 0);
if (!isset($_SESSION[game::sessName()]['market'][$name]))
$_SESSION[game::sessName()]['market'][$name] = null;
return $_SESSION[game::sessName()]['market'][$name];
}
function getMarketData()
{
switch ($this->sessData('page')) :
case 0: $s = $this->getPublicOffers(); break;
case 1: $s = $this->getPrivateOffers(); break;
case 2: $s = $this->getSentOffers(); break;
default: $s = ""; break;
endswitch;
return $s;
}
function handle($input)
{
$page = &$this->sessData('page');
switch ($input['p']) :
case 'p': $page = 0; break;
case 'r': $page = 1; break;
case 's': $page = 2; break;
endswitch;
$r = gameAction('isPlayerRestrained', $_SESSION[game::sessName()]['player']);
if ($r > 0)
$this->data = $r;
else
$this->data = array(
"page" => $page,
"pdata" => $this->getMarketData()
);
$this->output = "market";
}
}
?>