private function buildPlayerGroup($tech, $fleets) { $playerObj = new Player(1); $playerObj->setName('bot'); $playerObj->setTech($tech['weapons'], $tech['shields'], $tech['armour']); foreach ($fleets as $idFleet => $fleet) { $fleetObj = new Fleet($idFleet); foreach ($fleet as $id => $count) { $count = floor($count); $id = floor($id); if ($count > 0 && $id > 0) { $fleetObj->addShipType($this->getShipType($id, $count)); } } if (!$fleetObj->isEmpty()) { $playerObj->addFleet($fleetObj); } } if ($playerObj->isEmpty()) { die("<meta http-equiv=\"refresh\" content=2;\"WebTest.php\">There should be at least an attacker and defender"); } $playerGroupObj = new PlayerGroup(); $playerGroupObj->addPlayer($playerObj); return $playerGroupObj; }
/** * calculateAttack() * Calculate the battle using OPBE. * * OPBE ,to decrease memory usage, don't save both the initial and end state of fleets in a single round: only the end state is saved. * Then OPBE store the first round in BattleReport and don't start it, just to show the fleets before the battle. * Also,cause OPBE start the rounds without saving the initial state, the informations about how many shots were fired etc must be asked to the next round. * Logically, the last round can't ask the next round because there is not. * * @param array &$attackers * @param array &$defenders * @param mixed $FleetTF * @param mixed $DefTF * @return array */ function calculateAttack(&$attackers, &$defenders, $FleetTF, $DefTF) { //null == use default handlers $errorHandler = null; $exceptionHandler = null; $CombatCaps = $GLOBALS['CombatCaps']; $pricelist = $GLOBALS['pricelist']; /********** BUILDINGS MODELS **********/ /** Note: we are transform array of data like * fleetID => infos * into object tree structure like * playerGroup -> player -> fleet -> shipType */ //attackers $attackerGroupObj = new PlayerGroup(); foreach ($attackers as $fleetID => $attacker) { $player = $attacker['player']; //techs + bonus. Note that the bonus is divided by the factor because the result sum will be multiplied by the same inside OPBE list($attTech, $defenceTech, $shieldTech) = getTechsFromArray($player); //-- $attackerPlayerObj = $attackerGroupObj->createPlayerIfNotExist($player['id'], array(), $attTech, $shieldTech, $defenceTech); $attackerFleetObj = new Fleet($fleetID); foreach ($attacker['unit'] as $element => $amount) { if (empty($amount)) { continue; } $shipType = getShipType($element, $amount); $attackerFleetObj->addShipType($shipType); } $attackerPlayerObj->addFleet($attackerFleetObj); } //defenders $defenderGroupObj = new PlayerGroup(); foreach ($defenders as $fleetID => $defender) { $player = $defender['player']; //techs + bonus. Note that the bonus is divided by the factor because the result sum will be multiplied by the same inside OPBE list($attTech, $defenceTech, $shieldTech) = getTechsFromArray($player); //-- $defenderPlayerObj = $defenderGroupObj->createPlayerIfNotExist($player['id'], array(), $attTech, $shieldTech, $defenceTech); $defenderFleetObj = getFleet($fleetID); foreach ($defender['unit'] as $element => $amount) { if (empty($amount)) { continue; } $shipType = getShipType($element, $amount); $defenderFleetObj->addShipType($shipType); } $defenderPlayerObj->addFleet($defenderFleetObj); } /********** BATTLE ELABORATION **********/ $opbe = new Battle($attackerGroupObj, $defenderGroupObj); $startBattle = DebugManager::runDebugged(array($opbe, 'startBattle'), $errorHandler, $exceptionHandler); $startBattle(); $report = $opbe->getReport(); /********** WHO WON **********/ if ($report->defenderHasWin()) { $won = DEFENDERS_WON; } elseif ($report->attackerHasWin()) { $won = ATTACKERS_WON; } elseif ($report->isAdraw()) { $won = DRAW; } else { throw new Exception('problem'); } /********** ROUNDS INFOS **********/ $ROUND = array(); $lastRound = $report->getLastRoundNumber(); for ($i = 0; $i <= $lastRound; $i++) { // in case of last round, ask for rebuilt defenses. to change rebuils prob see constants/battle_constants.php $attackerGroupObj = $lastRound == $i ? $report->getAfterBattleAttackers() : $report->getResultAttackersFleetOnRound($i); $defenderGroupObj = $lastRound == $i ? $report->getAfterBattleDefenders() : $report->getResultDefendersFleetOnRound($i); $attInfo = updatePlayers($attackerGroupObj, $attackers); $defInfo = updatePlayers($defenderGroupObj, $defenders); $ROUND[$i] = roundInfo($report, $attackers, $defenders, $attackerGroupObj, $defenderGroupObj, $i + 1, $attInfo, $defInfo); } /********** DEBRIS **********/ //attackers $debAtt = $report->getAttackerDebris(); $debAttMet = $debAtt[0]; $debAttCry = $debAtt[1]; //defenders $debDef = $report->getDefenderDebris(); $debDefMet = $debDef[0]; $debDefCry = $debDef[1]; //total $debris = array('attacker' => array(METAL_ID => $debAttMet, CRYSTAL_ID => $debAttCry), 'defender' => array(METAL_ID => $debDefMet, CRYSTAL_ID => $debDefCry)); /********** LOST UNITS **********/ $totalLost = array('attacker' => $report->getTotalAttackersLostUnits(), 'defender' => $report->getTotalDefendersLostUnits()); /********** RETURNS **********/ return array('won' => $won, 'debris' => $debris, 'rw' => $ROUND, 'unitLost' => $totalLost); }
function getPlayerGroupFromQuery($result, $targetUser = false) { $playerGroup = new PlayerGroup(); while ($fleetRow = mysql_fetch_assoc($result)) { //making the current fleet object $serializedTypes = explode(';', $fleetRow['fleet_array']); $idPlayer = $fleetRow['fleet_owner']; $fleet = new Fleet($fleetRow['fleet_id']); foreach ($serializedTypes as $serializedType) { list($id, $count) = explode(',', $serializedType); if ($id != 0 && $count != 0) { $fleet->addShipType(getShipType($id, $count)); } } //making the player object and add it to playerGroup object if (!$playerGroup->existPlayer($idPlayer)) { $player_info = $targetUser !== false && $targetUser['id'] == $idPlayer ? $targetUser : doquery("SELECT * FROM {{table}} WHERE id ={$idPlayer}", 'users', true); $player = new Player($idPlayer, array($fleet)); $player->setTech($player_info['military_tech'], $player_info['shield_tech'], $player_info['defence_tech']); $player->setName($player_info['name']); $playerGroup->addPlayer($player); } else { $playerGroup->getPlayer($idPlayer)->addFleet($fleet); } } return $playerGroup; }
/** * getPlayerGroupFromQuery * * @param array $result Result * @param boolean $target_user Target User * * @return \PlayerGroup */ private function getPlayerGroupFromQuery($result, $target_user = false) { $playerGroup = new PlayerGroup(); while ($fleet_row = parent::$db->fetch_assoc($result)) { //making the current fleet object $serializedTypes = explode(';', $fleet_row['fleet_array']); $idPlayer = $fleet_row['fleet_owner']; $fleet = new Fleet($fleet_row['fleet_id']); foreach ($serializedTypes as $serializedType) { if (!empty($serializedType)) { list($id, $count) = explode(',', $serializedType); if ($id != 0 && $count != 0) { $fleet->addShipType($this->getShipType($id, $count)); } } } //making the player object and add it to playerGroup object if (!$playerGroup->existPlayer($idPlayer)) { if ($target_user !== false && $target_user['user_id'] == $idPlayer) { $player_info = $target_user; } else { $player_info = parent::$db->query_fetch("SELECT u.user_name,\n r.research_weapons_technology,\n r.research_shielding_technology,\n r.research_armour_technology\n FROM " . USERS . " AS u\n INNER JOIN " . RESEARCH . " AS r ON r.research_user_id = u.user_id\n WHERE u.user_id = '" . $idPlayer . "';"); } $player = new Player($idPlayer, array($fleet)); $player->setTech($player_info['research_weapons_technology'], $player_info['research_shielding_technology'], $player_info['research_armour_technology']); $player->setName($player_info['user_name']); $playerGroup->addPlayer($player); } else { $playerGroup->getPlayer($idPlayer)->addFleet($fleet); } } return $playerGroup; }