lib = $lib; $this->db = $this->lib->game->db; $this->move = $this->lib->game->getLib('beta5/moving'); $this->planets = $this->lib->game->getLib('beta5/planet'); $this->players = $this->lib->game->getLib('beta5/player'); $this->rules = $this->lib->game->getLib('beta5/rules'); } // Handles a fleet's arrival function run($fid, $dest, $from, $nStatus = null) { // Get complete fleet data $q = $this->db->query("SELECT * FROM fleet WHERE id=$fid"); $f = dbFetchHash($q); if (is_null($f['owner'])) { logText("beta5/fleetArrival($fid,$dest,$from): BUG! Fleet has no owner!", LOG_ERR); return; } if (is_null($nStatus)) { $nStatus = ($f['attacking'] == 't'); } // Get destination planet owner $po = $this->planets->call('getOwner', $dest); if (!is_null($po) && $po != $f['owner']) { // Is the fleet owner an enemy of the planet owner? $isEnemy = $this->players->call('isEnemy', $po, $f['owner']); if (!$isEnemy) { // Get fleet owner data $foi = $this->players->call('get', $f['owner']); // Check for enemy alliance $isEnemy = (!is_null($foi['aid']) && $this->players->call('isAllianceEnemy', $po, $foi['aid'])); } } else { $isEnemy = false; } // Check whether the player already has fleets at that location, // and if he does, get their current status if (!$isEnemy) { $q = $this->db->query("SELECT attacking FROM fleet WHERE location=$dest AND owner=".$f['owner']." LIMIT 1"); if ($q && dbCount($q)) { list($aa) = dbFetchArray($q); $isEnemy = ($aa == 't'); } } // Set attack status $att = ($po != $f['owner']) && ($isEnemy || $nStatus); logText("beta5/fleetArrival($fid,$dest,$from,{$f['owner']}): Attack=".($att?1:0), LOG_DEBUG); if (is_array($_SESSION[game::sessName()])) { logText("Fleet $fid was being controlled by player #{$_SESSION[game::sessName()]['player']}"); } if ($att) { if (($split = $this->hsWindowCollapsing($po, $f, $dest, $from)) === true) { return; } // Switch the player's fleets to attack at that location if the fleet arriving is attacking $this->db->query("UPDATE fleet SET attacking=TRUE,can_move='B' WHERE location=$dest AND NOT attacking AND owner=".$f['owner']); } else { $split = ""; } // Update the fleet's record $this->db->query("UPDATE fleet SET location=$dest,time_spent=0,attacking=".dbBool($att).",can_move='".($att?'B':'H')."'$split WHERE id=$fid"); // Make sure the system the fleet has arrived in can't be assigned to a new player $pinf = $this->planets->call('byId', $dest); $this->db->query("UPDATE system SET assigned=TRUE WHERE id=".$pinf['system']); // Add a fleet arrival entry to the list if (!is_array($this->lib->mainClass->fleetArrivals[$dest])) { $this->lib->mainClass->fleetArrivals[$dest] = array(array(), array()); } array_push($this->lib->mainClass->fleetArrivals[$dest][$att?1:0], array($fid, $from)); // Clear the fleet cache $this->lib->call('invCache', $fid); } function hsWindowCollapsing($po, $f, $dst, $ori) { // Apply HS window collapsing $r = $this->rules->call('get', $po); $rnd = rand(0,$r['prevent_hs_exit']*10); $splitG = floor($rnd * $f['gaships'] / 100); $splitF = floor($rnd * $f['fighters'] / 100); $splitC = ceil($rnd * $f['cruisers'] / 100); $splitB = ceil($rnd * $f['bcruisers'] / 100); if (!($rnd && ($splitC || $splitB))) { return ""; } // WE HAVE A WINNER! if (is_null($f['moving'])) { $or = $this->rules->call('get', $f['owner']); } if ($f['gaships'] == $splitG && $f['fighters'] == $splitF && $f['cruisers'] == $splitC && $f['bcruisers'] == $splitB) { // The complete fleet has to be delayed logText("Fleet #{$f['id']} was prevented from dropping out of HS", LOG_DEBUG); if (is_null($f['moving'])) { // The fleet dropped out of Hyperspace, create a move order $fmo = $this->move->call('newObject', $ori, $dst, $or['capital_ship_speed'], ($f['cruisers'] > 0), null); $this->db->query("UPDATE moving_object SET changed=60,time_left=1 WHERE id=$fmo"); $this->db->query("UPDATE fleet SET moving=$fmo,waiting=NULL WHERE id={$f['id']}"); logText("Fleet #{$f['id']} -> created new moving object", LOG_DEBUG); } else { // The fleet was moving, just modify the order $this->db->query("UPDATE moving_object SET changed=60,time_left=1 WHERE id={$f['moving']}"); logText("Fleet #{$f['id']} -> modified existing moving object", LOG_DEBUG); } $fullFleet = true; } else { logText("Fleet {$f['id']} got split by HS windows collapsing ($splitG/$splitF/$splitC/$splitB out of {$f['gaships']}/{$f['fighters']}/{$f['cruisers']}/{$f['bcruisers']})", LOG_DEBUG); // Split fleet $fullFleet = ",gaships=" . ($f['gaships'] - $splitG); $fullFleet .= ",fighters=" . ($f['fighters'] - $splitF); $fullFleet .= ",cruisers=" . ($f['cruisers'] - $splitC); $fullFleet .= ",bcruisers=" . ($f['bcruisers'] - $splitB); if (is_null($f['moving'])) { // The fleet dropped out of Hyperspace, create a move order $fmo = $this->move->call('newObject', $ori, $dst, $or['capital_ship_speed'], ($f['cruisers'] > 0), null); logText("Fleet #{$f['id']} -> created new moving object", LOG_DEBUG); } else { // The fleet was moving, duplicate the order $fmo = $this->move->call('cloneObject', $f['moving']); logText("Fleet #{$f['id']} -> cloned existing moving object", LOG_DEBUG); } $this->db->query("UPDATE moving_object SET changed=60,time_left=1 WHERE id=$fmo"); // Generate new fleet $this->db->query("INSERT INTO fleet(owner,gaships,fighters,cruisers,bcruisers,attacking,moving) VALUES (" . $f['owner'] . ",$splitG,$splitF,$splitC,$splitB,TRUE,$fmo)"); } return $fullFleet; } } ?>