function loadBattle() { $battleObj = new Battle(); $battle = $battleObj->loadBattle(); $leader = $battleObj->getLeaderBoard(); $str = "\n <div id='track-1'>\n <object height='81' width='300'> \n <param name='movie' value='http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F" . $battle[0]->track_id . "'></param> \n <param name='allowscriptaccess' value='always'></param> \n <embed allowscriptaccess='always' height='81' src='http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F" . $battle[0]->track_id . "' type='application/x-shockwave-flash' width='300'></embed> \n </object>\n <br /><span id='trackTitle_" . $battle[0]->track_id . "'><a href='http://soundcloud.com/" . $battle[0]->user_permalink . "/" . $battle[0]->track_permalink . "'>" . $battle[0]->track_name . "</a> by <a href='http://soundcloud.com/" . $battle[0]->user_permalink . "'>" . $battle[0]->user_name . "</a></span><br />\n <input type='button' onclick='vote(" . $battle[0]->track_id . ", " . $battle[1]->track_id . ");' value='Vote for this pattern' />\n </div>\n <span id='vs'>VS</span>\n <div id='track-2'>\n <object height='81' width='300'> \n <param name='movie' value='http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F" . $battle[1]->track_id . "'></param> \n <param name='allowscriptaccess' value='always'></param> \n <embed allowscriptaccess='always' height='81' src='http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F" . $battle[1]->track_id . "' type='application/x-shockwave-flash' width='300'></embed> \n </object>\n <br /><span id='trackTitle_" . $battle[1]->track_id . "'><a href='http://soundcloud.com/" . $battle[1]->user_permalink . "/" . $battle[1]->track_permalink . "'>" . $battle[1]->track_name . "</a> by <a href='http://soundcloud.com/" . $battle[1]->user_permalink . "'>" . $battle[1]->user_name . "</a></span><br />\n <input type='button' onclick='vote(" . $battle[1]->track_id . ", " . $battle[0]->track_id . ");' value='Vote for this pattern' />\n </div>\n -----"; foreach ($leader as $data) { $str .= "\n <tr>\n <td>" . $data->wins . "0</td>\n <td><a href='http://soundcloud.com/" . $data->user_permalink . "/" . $data->track_permalink . "'>" . $data->track_name . "</a></td>\n <td><a href='http://soundcloud.com/" . $data->user_permalink . "'>" . $data->user_name . "</a></td>\n </tr>"; } return $str; }
public function setShootAction() { $oBattle = new Battle(); $oBattle->createMatrix(); $sCoord = tools::getParametr('coord'); $sRow = ucfirst(substr($sCoord, 0, 1)); $iRow = ord($sRow) - $this->iFirstLetter; $iColumn = substr($sCoord, 1) - 1; template::set('status', $oBattle->setFire($iColumn, $iRow)); $oBattle->saveField(); template::set('matrix', $oBattle->printMatrix()); template::show('layout'); }
public static function generateForSettings(BattleSettings $battleSetting) { $battle = Battle::doGetInstanceByCriteria(__CLASS__, array('settingsId' => $battleSetting->_id)); if (is_null($battle) || time() > $battle->updated->sec + 600) { if (is_null($battle)) { $battle = new Battle(); } $battle->data = Battle::generateBattle($battleSetting); $battle->updated = new \MongoDate(time()); $battle->settingsId = $battleSetting->_id; $battle->save(); } return $battle; }
public function __construct($debug = false) { if (empty(self::$reslist)) { self::includeVars('XG'); } if (!LangManager::getInstance()->implementationExist()) { LangManager::getInstance()->setImplementation(new LangImplementation('XG')); } $attackers = $this->getAttachers(); $defenders = $this->getDefenders(); $memory1 = memory_get_usage(); $micro1 = microtime(); $engine = new Battle($attackers, $defenders); $startBattle = DebugManager::runDebugged(array($engine, 'startBattle'), array('RunnableTest', 'myErrorHandler'), array('RunnableTest', 'save')); $startBattle($debug); $micro1 = microtime() - $micro1; $memory1 = memory_get_usage() - $memory1; $this->report = $engine->getReport(); $this->time = round(1000 * $micro1, 2); $this->memory = round($memory1 / 1000); echo $this; }
function setCombatIndex($defenderId) { $combatLog = ""; $battle = Battle::getBattle(); $combatRules = $battle->combatRules; $combats = $battle->combatRules->combats->{$defenderId}; /* @var Force $force */ $force = $battle->force; $hexagon = $battle->force->units[$defenderId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); if (count((array) $combats->attackers) == 0) { $combats->index = null; $combats->attackStrength = null; $combats->defenseStrength = null; $combats->terrainCombatEffect = null; return; } $defenders = $combats->defenders; $attackStrength = 0; $combatLog .= "Attackers<br>"; foreach ($combats->attackers as $id => $v) { $unit = $force->units[$id]; $combatLog .= $unit->strength . " " . $unit->class . " "; $attackStrength += $unit->strength; } $defenseStrength = 0; $combatLog .= " = {$attackStrength}<br>Defenders<br> "; foreach ($defenders as $defId => $defender) { $unit = $battle->force->units[$defId]; $combatLog .= $unit->strength . " " . $unit->class . " "; $defenseStrength += $unit->defStrength; $combatLog .= "<br>"; } $combatLog .= " = {$defenseStrength}"; $combatIndex = $this->getCombatIndex($attackStrength, $defenseStrength); /* Do this before terrain effects */ if ($combatIndex >= $this->maxCombatIndex) { $combatIndex = $this->maxCombatIndex; } /* @var $combatRules CombatRules */ // $terrainCombatEffect = $combatRules->getDefenderTerrainCombatEffect($defenderId); // $combatIndex -= $terrainCombatEffect; $combats->attackStrength = $attackStrength; $combats->defenseStrength = $defenseStrength; // $combats->terrainCombatEffect = $terrainCombatEffect; $combats->terrainCombatEffect = 0; $combats->index = $combatIndex; $combats->combatLog = $combatLog; }
public static function NewBattle(Colony $attacker, Colony $defender, $scheduledTime) { $battle = new Battle(); $battle->Attacker($attacker); $battle->Defender($defender); $battle->Target($defender->OriginalColony()->Coordinates()); $battle->ScheduledTime($scheduledTime); return $battle; }
protected function unitSupplyEffects($unit, $goal, $bias, $supplyLen) { $b = Battle::getBattle(); $id = $unit->id; if ($b->gameRules->mode == REPLACING_MODE) { if ($unit->status == STATUS_CAN_UPGRADE) { $unit->supplied = $b->moveRules->calcSupply($unit->id, $goal, $bias, $supplyLen); if (!$unit->supplied) { /* TODO: make this not cry (call a method) */ $unit->status = STATUS_STOPPED; } } return; } if ($unit->status == STATUS_READY || $unit->status == STATUS_UNAVAIL_THIS_PHASE) { $unit->supplied = $b->moveRules->calcSupply($unit->id, $goal, $bias, $supplyLen); } else { return; } if (!$unit->supplied && !isset($this->movementCache->{$id})) { $this->movementCache->{$id} = $unit->maxMove; $unit->maxMove = floor($unit->maxMove / 2); } if ($unit->supplied && isset($this->movementCache->{$id})) { $unit->maxMove = $this->movementCache->{$id}; unset($this->movementCache->{$id}); } if ($unit->status == STATUS_READY || $unit->status == STATUS_DEFENDING || $unit->status == STATUS_UNAVAIL_THIS_PHASE) { $unit->supplied = $b->moveRules->calcSupply($unit->id, $goal, $bias, $supplyLen); } else { return; } if (($this->unsuppliedDefenderHalved || $unit->forceId == $b->gameRules->attackingForceId) && !$unit->supplied && !isset($this->combatCache->{$id})) { $this->combatCache->{$id} = true; $unit->addAdjustment('supply', 'half'); // $unit->strength = floor($unit->strength / 2); } if ($unit->supplied && isset($this->combatCache->{$id})) { $unit->removeAdjustment('supply'); // $unit->strength = $this->combatCache->$id; unset($this->combatCache->{$id}); } }
public function action_end() { $character = $this->character; $battle = $character->battle; $monster = $battle->monster; if (!$battle->id) { $this->request->redirect('battle'); } if (Battle::can_fight($character) and Battle::can_fight($battle)) { $this->request->redirect('battle'); } $char = new Character($character); if ($battle->hp <= 0) { $view = 'won'; $character->money = $character->money + $battle->monster->money; $character->xp = $character->xp + $monster->xp; $character->save(); } else { $view = 'lost'; } $this->template->content = View::factory('battle/' . $view)->set('money', $monster->money)->set('xp', $monster->xp); $battle->delete(); }
function damageUnit($kill = false) { $battle = Battle::getBattle(); if ($this->isReduced || $kill) { $this->status = STATUS_ELIMINATING; $this->exchangeAmount = $this->getUnmodifiedStrength(); $this->defExchangeAmount = $this->getUnmodifiedDefStrength(); return true; } else { $this->damage = $this->maxStrength - $this->minStrength; $battle->victory->reduceUnit($this); $this->isReduced = true; $this->exchangeAmount = $this->damage; $this->defExchangeAmount = $this->damage; } return false; }
$accessToken = $soundcloud->accessToken($_GET['code']); $title = isset($_POST['title']) ? $_POST['title'] : ""; $description = isset($_POST['description']) ? $_POST['description'] : ""; $downloadable = isset($_POST['downloadable']) ? "true" : "false"; if ($title) { $user = '******'; $sequence = $_SESSION['sequenceArr']; $hash = md5($user . $sequence + rand()); $shareUrl = APP_URL . "?p=" . $hash; $options = array("asset_data" => "@" . APP_PATH . $_SESSION['soundcloud_tmp_file'], "title" => $title, "description" => $description . "\n<a href='{$shareUrl}'>{$shareUrl}</a>", "sharing" => "public", "streamable" => "true", "downloadable" => $downloadable); //UPLOAD TRACK TO SOUNDCLOUD $result = $soundcloud->execute('tracks.json', 'track', 'POST', $options, 'multipart/form-data'); $permalink = $result->permalink_url; //ADD NEWLY UPLOADED TRACK INFO TO DB //$tracks = $soundcloud->execute('groups/20839/tracks?format=json', '', 'GET'); $battle = new Battle(); $battle->addTrack($result); //ASSOCIATE NEWLY UPLOADED TRACK WITH GROUP $soundcloud->execute('groups/20839/contributions/' . $result->id, '', 'PUT'); //SAVE PATTERN IN `shared_patterns` TABLE $patternAPI = new Pattern(); $patternAPI->share($user, $sequence, $hash); //DELETE TRACK FROM DISK AND CLEAR SESSION VARIABLES unlink($_SESSION['soundcloud_tmp_file']); $_SESSION['soundcloud_tmp_file'] = ""; $_SESSION['sequenceArr'] = ""; $success = true; } else { $error = true; } }
} public function startBattle() { $totalRolls = $this->rollAllPlayersDice(); $attackValues = $totalRolls->attacker; $defenderValues = $totalRolls->defender; $battleOutcome = new stdClass(); $battleOutcome->attacker = 0; $battleOutcome->denfender = 0; if ($attackValues[0] > $defenderValues[0]) { $battleOutcome->attacker++; } else { $battleOutcome->denfender++; } if ($defenderValues[1] && $attackValues[1] > $defenderValues[1]) { $battleOutcome->attacker++; } else { $battleOutcome->denfender++; } $this->outcome = $battleOutcome; return json_encode($battleOutcome); } } $attackPlayerDice = new PlayerDice('attacker', 3, array(8, 6, 6)); //$rolls = $playerDice->rollAllDice(); //var_dump($rolls); $defenderPlayerDice = new PlayerDice('defender', 2, array(8, 6)); //$rolls = $playerDice->rollAllDice(); //var_dump($rolls); $battle = new Battle($attackPlayerDice, $defenderPlayerDice); echo $battle->startBattle();
/** * method attack_mission * param $fleet_row * return the attack result */ public function attack_mission($fleet_row) { // null == use default handlers $errorHandler = null; $exceptionHandler = null; if ($fleet_row['fleet_mess'] == 0 && $fleet_row['fleet_start_time'] <= time()) { $base = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR; require $base . 'utils' . DIRECTORY_SEPARATOR . 'includer.php'; $target_planet = parent::$db->query_fetch("SELECT *\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFROM " . PLANETS . " AS p\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tINNER JOIN " . BUILDINGS . " AS b ON b.building_planet_id = p.`planet_id`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tINNER JOIN " . SHIPS . " AS s ON s.ship_planet_id = p.`planet_id`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tINNER JOIN " . DEFENSES . " AS d ON d.defense_planet_id = p.`planet_id`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWHERE `planet_galaxy` = " . (int) $fleet_row['fleet_end_galaxy'] . " AND\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`planet_system` = " . (int) $fleet_row['fleet_end_system'] . " AND\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`planet_type` = " . (int) $fleet_row['fleet_end_type'] . " AND\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`planet_planet` = " . (int) $fleet_row['fleet_end_planet'] . ";"); if ($fleet_row['fleet_group'] > 0) { parent::$db->query("DELETE FROM `" . ACS_FLEETS . "`\n\t\t\t\t\t\t\t\t\t\tWHERE `acs_fleet_id` = '" . (int) $fleet_row['fleet_group'] . "'"); parent::$db->query("UPDATE `" . FLEETS . "` SET\n\t\t\t\t\t\t\t\t\t\t`fleet_mess` = '1'\n\t\t\t\t\t\t\t\t\t\tWHERE `fleet_group` = '" . $fleet_row['fleet_group'] . "'"); } else { parent::return_fleet($fleet_row['fleet_id']); } $target_user = doquery('SELECT * FROM {{table}} WHERE id=' . $target_planet['id_owner'], 'users', true); $target_userID = $target_user['id']; PlanetResourceUpdate($target_user, $target_planet, time()); // attackers fleet sum $attackers = new PlayerGroup(); if ($fleet_row['fleet_group'] != 0) { $fleets = doquery('SELECT * FROM {{table}} WHERE fleet_group=' . $fleet_row['fleet_group'], 'fleets'); $attackers = get_player_group_from_query($fleets); } else { $attackers = get_player_group($fleet_row); } //defenders fleet sum $def = doquery('SELECT * FROM {{table}} WHERE `fleet_end_galaxy` = ' . $fleet_row['fleet_end_galaxy'] . ' AND `fleet_end_system` = ' . $fleet_row['fleet_end_system'] . ' AND `fleet_end_type` = ' . $fleet_row['fleet_end_type'] . ' AND `fleet_end_planet` = ' . $fleet_row['fleet_end_planet'] . ' AND fleet_start_time<' . time() . ' AND fleet_end_stay>=' . time(), 'fleets'); $defenders = get_player_group_from_query($def, true, $target_user); //defenses sum $homeFleet = new HomeFleet(0); for ($i = self::DEFENSE_MIN_ID; $i < self::DEFENSE_MAX_ID; $i++) { if (isset($this->_resource[$i]) && isset($target_planet[$this->_resource[$i]])) { if ($target_planet[$this->_resource[$i]] != 0) { $homeFleet->add(get_ship_type($i, $target_planet[$this->_resource[$i]])); } } } for ($i = self::SHIP_MIN_ID; $i < self::SHIP_MAX_ID; $i++) { if (isset($this->_resource[$i]) && isset($target_planet[$this->_resource[$i]])) { if ($target_planet[$this->_resource[$i]] != 0) { $homeFleet->add(get_ship_type($i, $target_planet[$this->_resource[$i]])); } } } if (!$defenders->existPlayer($target_userID)) { $player = new Player($target_userID, array($homeFleet)); $player->setTech($target_user['military_tech'], $target_user['shield_tech'], $target_user['defence_tech']); $defenders->addPlayer($player); } else { $defenders->getPlayer($target_userID)->addDefense($homeFleet); } //start of battle $battle = new Battle($attackers, $defenders); $startBattle = DebugManager::runDebugged(array($battle, 'startBattle'), $errorHandler, $exceptionHandler); $startBattle(); //end of battle $report = $battle->getReport(); $steal = $this->update_attackers($report->getPresentationAttackersFleetOnRound('START'), $report->getAfterBattleAttackers(), $target_planet); $this->update_defenders($report->getPresentationDefendersFleetOnRound('START'), $report->getAfterBattleDefenders(), $target_planet, $steal); $this->updateDebris($fleet_row, $report); $this->update_moon($fleet_row, $report, '', $target_userID, $target_planet); $this->send_message($fleet_row, $report); } elseif ($fleet_row['fleet_end_time'] <= time()) { $message = sprintf($this->_lang['sys_fleet_won'], $target_planet['planet_name'], Fleets_Lib::target_link($fleet_row, ''), Format_Lib::pretty_number($fleet_row['fleet_resource_metal']), $this->_lang['Metal'], Format_Lib::pretty_number($fleet_row['fleet_resource_crystal']), $this->_lang['Crystal'], Format_Lib::pretty_number($fleet_row['fleet_resource_deuterium']), $this->_lang['Deuterium']); Functions_Lib::send_message($fleet_row['fleet_owner'], '', $fleet_row['fleet_end_time'], 1, $this->_lang['sys_mess_tower'], $this->_lang['sys_mess_fleetback'], $message); parent::restore_fleet($fleet_row); parent::remove_fleet($fleet_row['fleet_id']); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Showing examples of construction of generals, as well as movement and combat resolution</title> </head> <?php require_once 'general.php'; require_once 'battle.php'; //Test values for 2 generals $howe = new BritishGeneral("Howe", "Boston", 0, 6, 3, 1, 0, 5); $washington = new AmericanGeneral("Washington", "Lexington Concord", 1, 5, 1, 2, 2, 5); //Examples of a combat resolution from U.S. and British perpsective $usAttackBattle = new Battle($washington, $howe); $britAttackBattle = new Battle($howe, $washington); echo "Example of a battle where the U.S. player attacks:<br />"; $usAttackBattle->combatResolution(); echo "<br /><br />Example of a battle where the British player attacks:<br />"; $britAttackBattle->combatResolution(); ?> </html>
function setCombatIndex($defenderId) { $combatLog = ""; $battle = Battle::getBattle(); $combatRules = $battle->combatRules; $combats = $battle->combatRules->combats->{$defenderId}; /* @var Force $force */ $force = $battle->force; $hexagon = $battle->force->units[$defenderId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); if (count((array) $combats->attackers) == 0) { $combats->index = null; $combats->attackStrength = null; $combats->defenseStrength = null; $combats->terrainCombatEffect = null; return; } $defenders = $combats->defenders; $isTown = $isHill = $isForest = $isSwamp = $attackerIsSunkenRoad = $isRedoubt = $isElevated = false; $totalDefense = 1; $terrain = $battle->terrain; $defCombatLog = ""; foreach ($defenders as $defId => $defender) { $hexagon = $battle->force->units[$defId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); $thisHex = []; $thisLog = ""; $hexName = $hexagon->name; if ($battle->mapData->getMapSymbol($hexagon->name, 'westwall')) { $thisHex['forta'] = 2; $thisLog .= "2x defend in westwall<br>"; } if ($terrain->terrainIs($hexpart, 'roughone')) { $thisHex['roughone'] = 2; $thisLog .= "2x defend in rough<br>"; } if ($terrain->terrainIs($hexpart, 'roughtwo')) { $thisHex['roughtwo'] = 3; $thisLog .= "3x defend in mountain<br>"; } if ($battle->combatRules->allAreAttackingAcrossRiver($defId)) { $thisHex['river'] = 2; $thisLog .= "2x defend behind river<br>"; } $multiple = count($thisHex); $defense = array_sum($thisHex); if ($multiple > 1) { $defense--; } if ($defense > $totalDefense) { $totalDefense = $defense; $defCombatLog = $thisLog . "total def {$defense}x<br>"; } } $attackStrength = 0; $combatLog .= "Attackers<br>"; foreach ($combats->attackers as $attackerId => $v) { $unit = $force->units[$attackerId]; $combatLog .= $unit->strength . " " . $unit->class . "<br>"; $strength = $unit->strength; $attackStrength += $strength; } $defenseStrength = 0; $combatLog .= " = {$attackStrength}<br><br>Defenders<br> "; $unitDefenseStrength = 0; foreach ($defenders as $defId => $defender) { $unit = $battle->force->units[$defId]; $combatLog .= $unit->defStrength . " " . $unit->class . " "; $unitDefenseStrength += $unit->defStrength; $defenseStrength += $unit->defStrength * $totalDefense; $combatLog .= "<br>"; } $combatLog .= "= {$unitDefenseStrength}<br>"; $combatLog .= $defCombatLog; $combatLog .= " = {$defenseStrength}<br><br>"; $combatIndex = $this->getCombatIndex($attackStrength, $defenseStrength); /* Do this before terrain effects */ if ($combatIndex >= $this->maxCombatIndex) { $combatIndex = $this->maxCombatIndex; } /* @var $combatRules CombatRules */ // $terrainCombatEffect = $combatRules->getDefenderTerrainCombatEffect($defenderId); // $combatIndex -= $terrainCombatEffect; $combats->attackStrength = $attackStrength; $combats->defenseStrength = $defenseStrength; $combats->terrainCombatEffect = 0; $combats->index = $combatIndex; $combats->combatLog = $combatLog; }
protected function checkForBattleCacheUpdate($systemIds, $timestampStart, $timestampEnd) { if (!config::get("fleet_battles_mod_cache")) { return; } $battleIdsToUpdateWithCurrentStats = array(); include_once "include/class.battles.php"; $affectedBattles = array(); foreach ($systemIds as $systemId) { $affectedBattles = array_merge($affectedBattles, Battle::getBattlesInTimeframe($systemId, $timestampStart, $timestampEnd)); } foreach ($affectedBattles as $battle) { // echo "<pre>"; // var_dump($timestampStart); // var_dump($timestampEnd); // var_dump($battle["start"]); // var_dump($battle["end"]); // echo "</pre>"; // battle is in exactly the same time interval as the current displayed one -> can update with stats of current battle if ($timestampStart == $battle["start"] && $timestampEnd == $battle["end"]) { $this->statusMessages[] = "Stats for a cached Battle have been updated."; $battleIdsToUpdateWithCurrentStats[] = $battle["battle_id"]; } else { $this->statusMessages[] = "deleting battle {$battle["battle_id"]}"; $this->statusMessages[] = "Changes partially affect stats of a cached battle. The cache for this battle has been deleted. Please build your cache or wait for cronjob execution. </br>"; Battle::deleteBattleFromCache($battle["battle_id"]); } } $this->battlesToUpdate = $battleIdsToUpdateWithCurrentStats; }
public function playerTurnChange($arg) { $attackingId = $arg[0]; $battle = Battle::getBattle(); $mapData = $battle->mapData; $vp = $this->victoryPoints; $specialHexes = $mapData->specialHexes; $gameRules = $battle->gameRules; if ($gameRules->phase == BLUE_MECH_PHASE || $gameRules->phase == RED_MECH_PHASE) { $gameRules->flashMessages[] = "@hide crt"; } if ($attackingId == REBEL_FORCE) { $gameRules->flashMessages[] = "Rebel Player Turn"; $gameRules->replacementsAvail = 1; } if ($attackingId == LOYALIST_FORCE) { $gameRules->flashMessages[] = "Loyalist Player Turn"; $gameRules->replacementsAvail = 10; } /*only get special VPs' at end of first Movement Phase */ $this->victoryPoints = $vp; }
$divisionConn = new DivisionDAO(); $player = $_SESSION['player']; $staticData = $_SESSION['staticData']; $allUnits = $staticData->getUnits(); $allPlayers = $staticData->getPlayers(); $allSectors = $staticData->getSectors(); $coordinateX = $_POST['coordinateX']; $coordinateY = $_POST['coordinateY']; if (isset($_POST['noView'])) { $noView = $_POST['noView']; } else { $noView = false; } $sector = $allSectors[$coordinateX . "," . $coordinateY]; $battleArr = $battleConn->getBattleBySectorId($sector->getId()); $battle = new Battle($battleArr[0], 0, 0, $battleArr[2], $battleArr[3], $battleArr[4], $battleArr[5]); $attackingDivisions = array(); $defendingDivisions = array(); $isPlayerDefending = $battle->getDefenderId() == $player->getId(); $owner = $sector->getOwner(); if (empty($owner)) { $defendingPlayer = new Player(); } else { $defendingPlayer = $allPlayers[$sector->getOwner()]; } $isPlayerInvolved = true; $divisionsArr = $divisionConn->getDivisionsBySector($sector->getId()); foreach ($divisionsArr as $divisionArr) { $quantity = $divisionArr[4]; $ownerId = $divisionArr[1]; //echo "num ,";
function unitIsInRange($id, $argRange = false) { $b = Battle::getBattle(); $isInRange = false; $range = $this->units[$id]->range; $unitRange = $range * 2; if ($b->gameRules->phase == BLUE_TORP_COMBAT_PHASE || $b->gameRules->phase == RED_TORP_COMBAT_PHASE) { $unitRange = $range * 3; } $range = $unitRange; if ($argRange !== false) { $range = $argRange; } $los = new Los(); $los->setOrigin($this->units[$id]->hexagon); for ($i = 0; $i < count($this->units); $i++) { /* hexagons without names are off map */ if (!$this->units[$i]->hexagon->name) { continue; } $los->setEndPoint($this->units[$i]->hexagon); $losRange = $los->getRange(); if ($losRange <= $range && $this->units[$i]->forceId != $this->units[$id]->forceId && $this->units[$i]->status != STATUS_CAN_REINFORCE && $this->units[$i]->status != STATUS_ELIMINATED) { if ($b->combatRules->checkBlocked($los, $id)) { $isInRange = true; break; } } } return $isInRange; }
function setCombatIndex($defenderId) { $combatLog = ""; $battle = Battle::getBattle(); $combatRules = $battle->combatRules; $combats = $battle->combatRules->combats->{$defenderId}; /* @var Force $force */ $force = $battle->force; $hexagon = $battle->force->units[$defenderId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); $attackingForceId = $battle->force->attackingForceId; $attackingForceName = preg_replace("/ /", "-", Battle::$forceName[$attackingForceId]); $defendingForceId = $battle->force->defendingForceId; $defendingForceName = preg_replace("/ /", "-", Battle::$forceName[$defendingForceId]); if (count((array) $combats->attackers) == 0) { $combats->index = null; $combats->attackStrength = null; $combats->defenseStrength = null; $combats->terrainCombatEffect = null; return; } $defenders = $combats->defenders; $isTown = $isHill = $isForest = $isSwamp = $attackerIsSunkenRoad = $isRedoubt = $isElevated = false; foreach ($defenders as $defId => $defender) { $hexagon = $battle->force->units[$defId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); $isTown |= $battle->terrain->terrainIs($hexpart, 'town'); $isHill |= $battle->terrain->terrainIs($hexpart, 'hill'); $isForest |= $battle->terrain->terrainIs($hexpart, 'forest'); $isSwamp |= $battle->terrain->terrainIs($hexpart, 'swamp'); $isElevated |= $battle->terrain->terrainIs($hexpart, 'elevation'); } $isClear = true; if ($isTown || $isForest || $isHill || $isSwamp) { $isClear = false; } $attackStrength = 0; $combatLog .= "<span class='combatants {$attackingForceName}'>Attackers</span><br>"; foreach ($combats->attackers as $attackerId => $v) { $unit = $force->units[$attackerId]; $combatLog .= $unit->class . " " . $unit->strength . "<br>"; $acrossRiver = false; foreach ($defenders as $defId => $defender) { if ($battle->combatRules->thisAttackAcrossRiver($defId, $attackerId)) { $acrossRiver = true; } } $strength = $unit->strength; if ($acrossRiver) { $strength /= 2; $combatLog .= " halved across river or wadi {$strength}<br>"; } $attackStrength += $strength; } $defenseStrength = 0; $combatLog .= " total {$attackStrength}<br>"; $combatLog .= "<br><span class='combatants {$defendingForceName}'>Defenders</span><br>"; foreach ($defenders as $defId => $defender) { $unit = $battle->force->units[$defId]; $combatLog .= $unit->class . " " . $unit->defStrength . "<br>"; $defenseStrength += $unit->defStrength; } if ($isTown) { $defenseStrength *= 2; $combatLog .= "In Town doubled {$defenseStrength}<br>"; } $combatLog .= " Total {$defenseStrength}<br>"; $combatIndex = $this->getCombatIndex($attackStrength, $defenseStrength); if ($combatIndex >= $this->maxCombatIndex) { $combatIndex = $this->maxCombatIndex; } $combats->attackStrength = $attackStrength; $combats->defenseStrength = $defenseStrength; $combats->index = $combatIndex; $combats->combatLog = $combatLog; }
function damageUnit($kill = false) { $battle = Battle::getBattle(); $this->status = STATUS_ELIMINATING; $this->exchangeAmount = $this->getUnmodifiedStrength(); $this->defExchangeAmount = $this->getUnmodifiedDefStrength(); return true; }
<?php $allUnits = $staticData->getUnits(); $allPlayers = $staticData->getPlayers(); $allBuildings = $staticData->getBuildings(); $coordinateX = $_POST['coordinateX']; $coordinateY = $_POST['coordinateY']; $sectorArr = $sectorConn->getSectorByCoordinates($coordinateX, $coordinateY); $sector = new Sector($sectorArr[0], $sectorArr[1], $sectorArr[2], $sectorArr[3], $sectorArr[4], $sectorArr[5], $sectorArr[6], $sectorArr[7], explode(",", $sectorArr[8]), explode(",", $sectorArr[9])); $battleArr = $battleConn->getBattleBySectorId($sector->getId()); $battle = new Battle($battleArr[0], 0, 0, $battleArr[2], $battleArr[3], $battleArr[4], $battleArr[5]); $attackingDivisions = array(); $defendingDivisions = array(); $sectorNameString = $sector->getName() . "(" . $sector->getCoordinateX() . "," . $sector->getCoordinateY() . ")"; $isPlayerDefending = $battle->getDefenderId() == $player->getId(); $owner = $sector->getOwner(); if (empty($owner)) { $defendingPlayer = new Player(); } else { $defendingPlayer = $allPlayers[$sector->getOwner()]; } $isPlayerInvolved = true; $divisionsArr = $divisionConn->getDivisionsBySector($sector->getId()); foreach ($divisionsArr as $divisionArr) { $quantity = $divisionArr[4]; $ownerId = $divisionArr[1]; if ($battle->getDefenderId() != $ownerId && $player->getId() != $battle->getDefenderId() && $player->getId() != $ownerId) { $isPlayerInvolved = false; $attackingPlayer = $allPlayers[$ownerId]; break; }
public function fight() { // these are the "face down" cards $this->takePair(); return parent::fight(); }
if ($targetPlanet[$resource[$i]] != 0) { $homeFleet->addShipType(getShipType($i, $targetPlanet[$resource[$i]])); } } } if (!$defenders->existPlayer($TargetUserID)) { $player = new Player($TargetUserID, array($homeFleet)); $player->setTech($targetUser['military_tech'], $targetUser['shield_tech'], $targetUser['defence_tech']); $player->setName($targetUser['name']); $defenders->addPlayer($player); } else { $defenders->getPlayer($TargetUserID)->addDefense($homeFleet); } //------------------------------------------------------------------------- //------------------------------ battle ----------------------------------- $battle = new Battle($attackers, $defenders); $startBattle = DebugManager::runDebugged(array($battle, 'startBattle'), $errorHandler, $exceptionHandler); $startBattle(); //------------------------------------------------------------------------- //-------------------------- after battle stuff --------------------------- $report = $battle->getReport(); $steal = updateAttackers($report->getPresentationAttackersFleetOnRound('START'), $report->getAfterBattleAttackers(), $targetPlanet, $resource, $pricelist); $report->setSteal($steal); updateDefenders($report->getPresentationDefendersFleetOnRound('START'), $report->getAfterBattleDefenders(), $targetPlanet, $resource, $steal); updateDebris($FleetRow, $report); updateMoon($FleetRow, $report, '', $TargetUserID, $targetPlanet); sendMessage($FleetRow, $report, $lang, $resource); //------------------------------------------------------------------------- } elseif ($FleetRow['fleet_end_time'] <= time()) { $Message = sprintf($lang['sys_fleet_won'], $TargetName, GetTargetAdressLink($FleetRow, ''), Format::pretty_number($FleetRow['fleet_resource_metal']), $lang['Metal'], Format::pretty_number($FleetRow['fleet_resource_crystal']), $lang['Crystal'], Format::pretty_number($FleetRow['fleet_resource_deuterium']), $lang['Deuterium']); SendSimpleMessage($FleetRow['fleet_owner'], '', $FleetRow['fleet_end_time'], 3, $lang['sys_mess_tower'], $lang['sys_mess_fleetback'], $Message);
/** * updateDefenders * * @param Battle $playerGroupBeforeBattle Player Group before battle * @param Battle $playerGroupAfterBattle Player Group after battle * @param array $target_planet Target planet * @param array $steal Stealed resources * * @return void */ private function updateDefenders($playerGroupBeforeBattle, $playerGroupAfterBattle, $target_planet, $steal) { $Xplayer = $Xfleet = $XshipType = null; $fleetArray = ''; $emptyFleets = array(); foreach ($playerGroupBeforeBattle->getIterator() as $idPlayer => $player) { $existPlayer = $playerGroupAfterBattle->existPlayer($idPlayer); if ($existPlayer) { $Xplayer = $playerGroupAfterBattle->getPlayer($idPlayer); } foreach ($player->getIterator() as $idFleet => $fleet) { $existFleet = $existPlayer && $Xplayer->existFleet($idFleet); if ($existFleet) { $Xfleet = $Xplayer->getFleet($idFleet); } else { $emptyFleets[] = $idFleet; } foreach ($fleet as $idShipType => $fighters) { $existShipType = $existFleet && $Xfleet->existShipType($idShipType); $amount = 0; if ($existShipType) { $XshipType = $Xfleet->getShipType($idShipType); $amount = $XshipType->getCount(); } $fleetArray .= '`' . $this->_resource[$idShipType] . '` = ' . $amount . ', '; } } } // Updating defenses and ships on planet parent::$db->query("UPDATE `" . PLANETS . "`, `" . SHIPS . "` SET\n " . $fleetArray . "\n `planet_metal` = `planet_metal` - " . $steal['metal'] . ",\n `planet_crystal` = `planet_crystal` - " . $steal['crystal'] . ",\n `planet_deuterium` = `planet_deuterium` - " . $steal['deuterium'] . "\n WHERE `planet_id` = '" . $target_planet['planet_id'] . "' AND\n `ship_planet_id` = '" . $target_planet['planet_id'] . "'"); // Updating flying fleets $id_string = implode(",", $emptyFleets); if (!empty($id_string)) { parent::$db->query("DELETE FROM `" . FLEETS . "`\n WHERE `fleed_id` IN (" . $id_string . ")"); } }
function applyCRTResults($defenderId, $attackers, $combatResults, $dieRoll, $force) { $battle = Battle::getBattle(); $distance = 1; list($defenderId, $attackers, $combatResults, $dieRoll) = $battle->victory->preCombatResults($defenderId, $attackers, $combatResults, $dieRoll); $vacated = false; $exchangeMultiplier = 1; if ($combatResults === EX02) { $distance = 0; $combatResults = EX; $exchangeMultiplier = 2; } if ($combatResults === EX03) { $distance = 0; $combatResults = EX; $exchangeMultiplier = 3; } if ($combatResults === EX0) { $distance = 0; $combatResults = EX; } $defUnit = $force->units[$defenderId]; switch ($combatResults) { case EX2: $distance = 2; case EX: $eliminated = $defUnit->damageUnit($force->exchangesKill); if (!$eliminated) { if ($distance) { $defUnit->status = STATUS_CAN_RETREAT; } else { $force->clearAdvancing(); $defUnit->status = STATUS_EXCHANGED; } $defUnit->retreatCountRequired = $distance; } else { $defUnit->moveCount = 0; $force->addToRetreatHexagonList($defenderId, $force->getUnitHexagon($defenderId)); } $force->exchangeAmount += $defUnit->defExchangeAmount * $exchangeMultiplier; $defUnit->moveCount = 0; break; case DD: $defUnit->status = STATUS_DEFENDED; $defUnit->retreatCountRequired = 0; $defUnit->disruptUnit($battle->gameRules->phase); $battle->victory->disruptUnit($defUnit); break; case AL: case ALF: $defUnit->status = STATUS_DEFENDED; $defUnit->retreatCountRequired = 0; break; case AE: $defUnit->status = STATUS_DEFENDED; $defUnit->retreatCountRequired = 0; break; case AR: $defUnit->status = STATUS_DEFENDED; $defUnit->retreatCountRequired = 0; break; case DE: $defUnit->status = STATUS_ELIMINATING; $defUnit->retreatCountRequired = $distance; $defUnit->moveCount = 0; $force->addToRetreatHexagonList($defenderId, $force->getUnitHexagon($defenderId)); break; case DRL2: $distance = 2; case DRL: case DLR: case DLF: case DL2R: $eliminated = $defUnit->damageUnit(); if ($combatResults === DL2R && !$eliminated) { $eliminated = $defUnit->damageUnit(); } if ($eliminated) { $defUnit->moveCount = 0; $force->addToRetreatHexagonList($defenderId, $force->getUnitHexagon($defenderId)); } else { $defUnit->status = STATUS_CAN_RETREAT; } $defUnit->retreatCountRequired = $distance; break; case DR2: $distance = 2; case DR: $defUnit->status = STATUS_CAN_RETREAT; $defUnit->retreatCountRequired = $distance; break; case NE: case MISS: $defUnit->status = STATUS_NO_RESULT; $defUnit->retreatCountRequired = 0; $battle->victory->noEffectUnit($defUnit); break; case DL: case BL: case DL2: $eliminated = $defUnit->damageUnit(); if ($combatResults === DL2 && !$eliminated) { $eliminated = $defUnit->damageUnit(); } if ($eliminated) { $vacated = true; $defUnit->retreatCountRequired = 0; $defUnit->moveCount = 0; $force->addToRetreatHexagonList($defenderId, $force->getUnitHexagon($defenderId)); } else { $defUnit->status = STATUS_DEFENDED; $defUnit->retreatCountRequired = 0; } break; default: break; } $defUnit->combatResults = $combatResults; $defUnit->dieRoll = $dieRoll; $defUnit->combatNumber = 0; $defUnit->moveCount = 0; foreach ($attackers as $attacker => $val) { $attackingUnit = $force->units[$attacker]; if ($attackingUnit->status == STATUS_BOMBARDING) { $attackingUnit->status = STATUS_ATTACKED; $attackingUnit->retreatCountRequired = 0; $attackingUnit->combatResults = $combatResults; $attackingUnit->dieRoll = $dieRoll; $attackingUnit->combatNumber = 0; $attackingUnit->moveCount = 0; } if ($attackingUnit->status == STATUS_ATTACKING) { switch ($combatResults) { case EX2: case EX: $attackingUnit->status = STATUS_CAN_EXCHANGE; $attackingUnit->retreatCountRequired = 0; break; case AE: $attackingUnit->status = STATUS_ELIMINATING; $defUnit->retreatCountRequired = 0; break; case AL: case AL2: case ALF: case BL: $attackingUnit->status = STATUS_CAN_ATTACK_LOSE; $attackingUnit->retreatCountRequired = 0; $force->exchangeAmount = 1; if ($combatResults === AL2) { $force->exchangeAmount = ceil(ceil($attackingUnit->getUnmodifiedStrength() / 2) + 0.1); } break; case DE: $attackingUnit->status = STATUS_CAN_ADVANCE; $attackingUnit->retreatCountRequired = 0; break; case AR: $attackingUnit->status = STATUS_CAN_RETREAT; $attackingUnit->retreatCountRequired = $distance; break; case DRL2: case DR2: case DRL: case DLR: case DR: case DLF: if ($attackingUnit->status !== STATUS_NO_RESULT) { $attackingUnit->status = STATUS_CAN_ADVANCE; } $attackingUnit->retreatCountRequired = 0; break; case DL: /* for multi defender combats */ if ($vacated || $attackingUnit->status == STATUS_CAN_ADVANCE) { $attackingUnit->status = STATUS_CAN_ADVANCE; } else { $attackingUnit->status = STATUS_NO_RESULT; } $attackingUnit->retreatCountRequired = 0; break; case NE: $attackingUnit->status = STATUS_NO_RESULT; $attackingUnit->retreatCountRequired = 0; break; default: break; } $attackingUnit->combatResults = $combatResults; $attackingUnit->dieRoll = $dieRoll; $attackingUnit->combatNumber = 0; $attackingUnit->moveCount = 0; } } $gameRules = $battle->gameRules; $mapData = $battle->mapData; $mapData->breadcrumbCombat($defenderId, $force->attackingForceId, $gameRules->turn, $gameRules->phase, $gameRules->mode, $combatResults, $dieRoll, $force->getUnitHexagon($defenderId)->name); $battle->victory->postCombatResults($defenderId, $attackers, $combatResults, $dieRoll); $force->removeEliminatingUnits(); }
public function actionIndex() { $model = Battle::model()->findall(); $this->render('index', array('model' => $model)); }
static function transformChanges($doc, $last_seq, $user) { global $mode_name, $phase_name; $chatsIndex = 0; /* remove me */ $click = $doc->_rev; $matches = array(); preg_match("/^([0-9]+)-/", $click, $matches); $click = $matches[1]; $games = $doc->games; $chats = array_slice($doc->chats, $chatsIndex); $chatsIndex = count($doc->chats); $users = $doc->users; $clock = $doc->clock; $players = $doc->wargame->players; $player = array_search($user, $players); if ($player === false) { $player = 0; } $force = $doc->wargame->force; $wargame = $doc->wargame; $gameName = $doc->gameName; $gameRules = $wargame->gameRules; $fogDeploy = false; if ($wargame->scenario->fogDeploy && $doc->playerStatus == "multi") { $fogDeploy = true; } // $revs = $doc->_revs_info; Battle::loadGame($gameName, $doc->wargame->arg); //Battle::getHeader(); if (isset($doc->wargame->mapViewer)) { $playerData = $doc->wargame->mapViewer[0]; } else { $playerData = $doc->wargame->mapData[0]; } $mapUnits = array(); $moveRules = $doc->wargame->moveRules; $combatRules = $doc->wargame->combatRules; // $display = $doc->wargame->display; $units = $force->units; $attackingId = $doc->wargame->gameRules->attackingForceId; foreach ($units as $unit) { $unit = UnitFactory::build($unit); $mapUnit = $unit->fetchData(); if ($fogDeploy && ($gameRules->phase == RED_DEPLOY_PHASE || $gameRules->phase == BLUE_DEPLOY_PHASE) && $unit->forceId !== $player) { if ($unit->hexagon->parent == "gameImages") { $mapUnit = new stdClass(); } } $mapUnits[] = $mapUnit; } $turn = $doc->wargame->gameRules->turn; foreach ($units as $i => $unit) { $u = new StdClass(); $u->status = $unit->status; $u->moveAmountUsed = $unit->moveAmountUsed; $u->maxMove = $unit->maxMove; $u->forceId = $unit->forceId; $u->forceMarch = $unit->forceMarch; $u->isDisrupted = $unit->isDisrupted; if ($unit->reinforceTurn > $turn) { $u->reinforceTurn = $unit->reinforceTurn; } $units[$i] = $u; } if ($fogDeploy) { if ($gameRules->phase == BLUE_DEPLOY_PHASE && $player === RED_FORCE) { $moveRules->moves = new stdClass(); } if ($gameRules->phase == RED_DEPLOY_PHASE && $player === BLUE_FORCE) { $moveRules->moves = new stdClass(); } } if ($moveRules->moves) { foreach ($moveRules->moves as $k => $move) { unset($moveRules->moves->{$k}->isValid); } if ($moveRules->path) { foreach ($moveRules->path as $hexName) { $moveRules->hexPath[] = $path; } } } $force->units = $units; $gameRules = $wargame->gameRules; // $gameRules->display = $display; $gameRules->phase_name = $phase_name; $gameRules->mode_name = $mode_name; $gameRules->exchangeAmount = $force->exchangeAmount; $newSpecialHexes = new stdClass(); $phaseClicks = $gameRules->phaseClicks; if ($doc->wargame->mapData->specialHexes) { $specialHexes = $doc->wargame->mapData->specialHexes; foreach ($specialHexes as $k => $v) { $hex = new Hexagon($k); $mapGrid->setHexagonXY($hex->x, $hex->y); $path = new stdClass(); $newSpecialHexes->{"x" . intval($mapGrid->getPixelX()) . "y" . intval($mapGrid->getPixelY())} = $v; } } $sentBreadcrumbs = new stdClass(); if ($doc->wargame->mapData->breadcrumbs) { $breadcrumbs = $doc->wargame->mapData->breadcrumbs; $breadcrumbKey = "/{$turn}" . "t" . $attackingId . "a/"; foreach ($breadcrumbs as $key => $crumbs) { if (!preg_match($breadcrumbKey, $key)) { continue; } $matches = array(); preg_match("/m(\\d*)\$/", $key, $matches); if (strlen($matches[1]) < 1) { continue; } $unitId = $matches[1]; if (!isset($sentBreadcrumbs->{$unitId})) { $sentBreadcrumbs->{$unitId} = []; } $sentMoves = $sentBreadcrumbs->{$unitId}; foreach ($crumbs as $crumb) { if (!isset($crumb->type)) { $type = "move"; } else { $type = $crumb->type; } switch ($type) { case "move": if ($crumb->fromHex === "0000") { continue; } $fromHex = new Hexagon($crumb->fromHex); $mapGrid->setHexagonXY($fromHex->x, $fromHex->y); $crumb->fromX = intval($mapGrid->getPixelX()); $crumb->fromY = intval($mapGrid->getPixelY()); $toHex = new Hexagon($crumb->toHex); $mapGrid->setHexagonXY($toHex->x, $toHex->y); $crumb->toX = intval($mapGrid->getPixelX()); $crumb->toY = intval($mapGrid->getPixelY()); break; case "combatResult": if ($crumb->hex) { $hex = new Hexagon($crumb->hex); $mapGrid->setHexagonXY($hex->x, $hex->y); $crumb->hexX = intval($mapGrid->getPixelX()); $crumb->hexY = intval($mapGrid->getPixelY()); } break; } $sentMoves[] = $crumb; } $sentBreadcrumbs->{$unitId} = $sentMoves; } } $specialHexes = $newSpecialHexes; $newSpecialHexesChanges = new stdClass(); if ($doc->wargame->mapData->specialHexesChanges) { $specialHexesChanges = $doc->wargame->mapData->specialHexesChanges; foreach ($specialHexesChanges as $k => $v) { $hex = new Hexagon($k); $mapGrid->setHexagonXY($hex->x, $hex->y); $path = new stdClass(); $newSpecialHexesChanges->{"x" . intval($mapGrid->getPixelX()) . "y" . intval($mapGrid->getPixelY())} = $v; } } $newSpecialHexesVictory = new stdClass(); if ($doc->wargame->mapData->specialHexesVictory) { $specialHexesVictory = $doc->wargame->mapData->specialHexesVictory; foreach ($specialHexesVictory as $k => $v) { $hex = new Hexagon($k); $mapGrid->setHexagonXY($hex->x, $hex->y); $path = new stdClass(); $newSpecialHexesVictory->{"x" . intval($mapGrid->getPixelX()) . "y" . intval($mapGrid->getPixelY())} = $v; } } $vp = $doc->wargame->victory->victoryPoints; $flashMessages = $gameRules->flashMessages; if (count($flashMessages)) { } // $flashMessages = array("Victory","Is","Mine"); $specialHexesChanges = $newSpecialHexesChanges; $specialHexesVictory = $newSpecialHexesVictory; $gameRules->playerStatus = $doc->playerStatus; $clock = "The turn is " . $gameRules->turn . ". The Phase is " . $phase_name[$gameRules->phase] . ". The mode is " . $mode_name[$gameRules->mode]; return compact("sentBreadcrumbs", "phaseClicks", "click", "revs", "vp", "flashMessages", "specialHexesVictory", "specialHexes", "specialHexesChanges", "combatRules", 'force', 'seq', 'chats', 'chatsIndex', 'last_seq', 'users', 'games', 'clock', 'mapUnits', 'moveRules', 'gameRules'); }
function setCombatIndex($defenderId) { $combatLog = ""; $battle = Battle::getBattle(); $combatRules = $battle->combatRules; $combats = $battle->combatRules->combats->{$defenderId}; /* @var Force $force */ $force = $battle->force; $hexagon = $battle->force->units[$defenderId]->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); if (count((array) $combats->attackers) == 0) { $combats->index = null; $combats->attackStrength = null; $combats->defenseStrength = null; $combats->terrainCombatEffect = null; return; } $defenders = $combats->defenders; $attackStrength = 0; $combatLog .= "Attackers<br>"; $attackers = 0; foreach ($combats->attackers as $id => $v) { $attackers++; $unit = $force->units[$id]; $los = new Los(); $los->setOrigin($force->getUnitHexagon($id)); $los->setEndPoint($force->getUnitHexagon($defenderId)); $range = (int) $los->getRange(); $strength = $unit->strength; $combatLog .= $strength . " " . $unit->class; if ($battle->gameRules->phase == BLUE_TORP_COMBAT_PHASE || $battle->gameRules->phase == RED_TORP_COMBAT_PHASE) { if ($range > 2 * $unit->range) { $strength /= 3; $combatLog .= " One third for extended Range {$strength}"; } elseif ($range > $unit->range) { $strength /= 2; $combatLog .= " Halved for extended Range {$strength}"; } if ($range === 1) { $strength *= 2; $combatLog .= " Doubled for close Range {$strength}"; } if ($range === 2 && $unit->nationality === 'ijn') { $strength *= 2; $combatLog .= " Doubled for close Range {$strength}"; } } else { if ($range > $unit->range) { $strength /= 2; $combatLog .= " Halved for extended Range {$strength}"; } if ($range <= $unit->range / 2) { if ($range <= 2) { $strength *= 3; $combatLog .= " Tripled for range 2 or less {$strength}"; } else { $strength *= 2; $combatLog .= " Doubled for Range less than half normal {$strength}"; } } } $combatLog .= "<br>"; $attackStrength += $strength; } if ($attackers > 1 && !($battle->gameRules->phase == BLUE_TORP_COMBAT_PHASE || $battle->gameRules->phase == RED_TORP_COMBAT_PHASE)) { $beforeStr = $attackStrength; $attackStrength /= 2; $combatLog .= "{$beforeStr} Attack strength halved fore multi ship attack {$attackStrength}<br>"; } $defenseStrength = 0; $combatLog .= " = {$attackStrength}<br>Defenders<br> "; foreach ($defenders as $defId => $defender) { $unit = $battle->force->units[$defId]; $combatLog .= " " . $unit->class . " "; $defenseStrength += $unit->defStrength; $combatLog .= "<br>"; } if ($battle->gameRules->phase == BLUE_TORP_COMBAT_PHASE || $battle->gameRules->phase == RED_TORP_COMBAT_PHASE) { $combats->unitDefenseStrength = $defenseStrength; $combats->oneHitCol = $this->getOneHitColumn($defenseStrength); $combats->twoHitCol = $this->getTwoHitColumn($defenseStrength); $defenseStrength = $unit->maxMove + 1; } $combatLog .= " = {$defenseStrength}"; $combatIndex = $this->getCombatIndex($attackStrength, $defenseStrength); /* Do this before terrain effects */ if ($combatIndex >= $this->maxCombatIndex) { $combatIndex = $this->maxCombatIndex; } /* @var $combatRules CombatRules */ $combats->attackStrength = $attackStrength; $combats->defenseStrength = $defenseStrength; $combats->terrainCombatEffect = 0; $combats->index = $combatIndex; $combats->combatLog = $combatLog; }
/** * 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); }
<?php $battle = new Battle(); $character1 = array(); $character1['name'] = 'Xaoziq'; $character1['level'] = 1; $character1['attack'] = 10; $character1['defense'] = 50; $character1['hp'] = 100; $character2 = array(); $character2['name'] = 'Evolutionary'; $character2['level'] = 1; $character2['attack'] = 10; $character2['defense'] = 50; $character2['hp'] = 100; ?> <div class="col-lg-9"> <?php $battle->fight($character1, $character2); ?> </div>