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/game/beta5/fleet/library/merge.inc

163 lines
4.7 KiB
PHP

<?php
class beta5_fleet_merge {
function beta5_fleet_merge($lib) {
$this->lib = $lib;
$this->db = $this->lib->game->db;
$this->moving = $this->lib->game->getLib('beta5/moving');
}
// Merge fleets
function run($fIds, $okOwners, $newName) {
// Did we get fleet IDs?
if (!count($fIds)) {
return array();
}
// Get fleets to merge
$q = $this->db->query(
"SELECT * FROM fleet "
."WHERE id IN (".join(',',$fIds).") AND owner IN (".join(',',$okOwners)
.") AND can_move='Y' AND sale IS NULL "
."ORDER BY location,owner"
);
$q2 = $this->db->query("SELECT id FROM sale WHERE fleet IN (".join(',',$fIds).")");
if (!$q || !$q2 || dbCount($q) != count($fIds) || dbCount($q2)) {
return array();
}
// Generate an array from the fleets read and extract
// movement / stand-by information
$fleets = array(); $mIds = array(); $wIds = array();
while ($r = dbFetchHash($q)) {
$fleets[$r['id']] = $r;
if (!is_null($r['moving'])) {
array_push($mIds, $r['moving']);
} elseif (!is_null($r['waiting'])) {
array_push($wIds, $r['waiting']);
}
}
// Extract movement information
$move = array();
if (count($mIds)) {
$q = $this->db->query("SELECT id,m_to,time_left,wait_order,changed FROM moving_object "
."WHERE id IN (".join(',',$mIds).")");
while ($r = dbFetchHash($q)) {
$move[$r['id']] = $r;
if (!is_null($r['wait_order']))
array_push($wIds, $r['wait_order']);
}
}
// Extract stand-by information
$wait = array();
if (count($wIds)) {
$q = $this->db->query("SELECT id,drop_point,time_left FROM hs_wait "
."WHERE id IN (".join(',',$wIds).")");
while ($r = dbFetchHash($q)) {
$wait[$r['id']] = $r;
}
}
// Group fleets by location / status / owner
$gFleets = array();
foreach ($fIds as $i) {
// Generate identifier and time to wait
$lid = $fleets[$i]['owner'].":";
$am = ($fleets[$i]['attacking'] == 't');
if (!is_null($fleets[$i]['waiting'])) {
$lid .= "W:".$wait[$fleets[$i]['waiting']]['drop_point'];
$tl = $wait[$fleets[$i]['waiting']]['time_left'];
} elseif (!is_null($moid = $fleets[$i]['moving'])) {
$mwo = $move[$moid]['wait_order'];
$lid .= "M:".$move[$moid]['m_to'].':'.$move[$moid]['time_left'].':'
.$move[$moid]['changed'].":".$this->moving->call('getLocation', $moid);
$tl = is_null($mwo) ? 0 : $wait[$mwo]['time_left'];
} else {
$tl = 0;
$lid .= "L:".$fleets[$i]['location'];
}
// Generate / update container
if (!is_array($gFleets[$lid])) {
$gFleets[$lid] = array('t' => $tl, 'a' => $am, 'l' => array());
} else {
if ($tl > $gFleets[$lid]['t']) {
$gFleets[$lid]['t'] = $tl;
}
$gFleets[$lid]['a'] |= $am;
}
// Add fleet
array_push($gFleets[$lid]['l'], $i);
}
// Merge groups into single fleets
$nfl = array();
foreach ($gFleets as $fg) {
// Compute total amount of ships
$sums = array(0,0,0,0);
$minSpent = null;
foreach ($fg['l'] as $i) {
$sums[0] += $fleets[$i]['gaships'];
$sums[1] += $fleets[$i]['fighters'];
$sums[2] += $fleets[$i]['cruisers'];
$sums[3] += $fleets[$i]['bcruisers'];
if (is_null($minSpent) || $minSpent > $fleets[$i]['time_spent']) {
$minSpent = $fleets[$i]['time_spent'];
}
}
// Update merged fleet
$nId = array_shift($fg['l']);
$name = addslashes(($newName == "") ? $fleets[$nId]['name'] : $newName);
$this->db->query("UPDATE fleet SET name='$name',gaships=".$sums[0].",fighters=".$sums[1]
. ",cruisers=".$sums[2].",bcruisers=".$sums[3].",attacking="
. dbBool($fg['a']) . ",time_spent=$minSpent WHERE id=$nId");
// Delete unneeded data
if (count($fg['l'])) {
$dMids = array(); $dWids = array();
foreach ($fg['l'] as $i) {
if (!is_null($fleets[$i]['waiting'])) {
array_push($dWids, $fleets[$i]['waiting']);
} elseif (!is_null($fleets[$i]['moving'])) {
array_push($dMids, $fleets[$i]['moving']);
}
}
foreach ($dMids as $i) {
if (!is_null($move[$i]['wait_order'])) {
array_push($dWids, $move[$i]['wait_order']);
}
}
$this->db->query("DELETE FROM fleet WHERE id IN (".join(',',$fg['l']).")");
if (count($dMids)) {
$this->db->query("DELETE FROM moving_object WHERE id IN (".join(',',$dMids).")");
}
if (count($dWids)) {
$this->db->query("DELETE FROM hs_wait WHERE id IN (".join(',',$dWids).")");
}
}
// Update detection status
$this->db->query("DELETE FROM beacon_detection WHERE fleet = $nId");
// Make sure orders are up-to-date
$mwo = $fleets[$nId]['moving'];
$dest = is_null($mwo) ? null : $move[$mwo]['m_to'];
$wait = $fg['t'] ? $fg['t'] : null;
$this->lib->call('setOrders', $nId, $dest, $wait);
array_push($nfl, $nId);
}
return $nfl;
}
}
?>