예제 #1
0
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;
}
예제 #2
0
 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');
 }
예제 #3
0
 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;
 }
예제 #4
0
 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;
 }
예제 #6
0
 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;
 }
예제 #7
0
 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});
     }
 }
예제 #8
0
 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();
 }
예제 #9
0
 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;
 }
예제 #10
0
    $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;
    }
}
예제 #11
0
    }
    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();
예제 #12
0
 /**
  * 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']);
     }
 }
예제 #13
0
<!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;
 }
예제 #15
0
 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;
 }
예제 #16
0
 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;
 }
예제 #17
0
$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   ,";
예제 #18
0
 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;
 }
예제 #20
0
 function damageUnit($kill = false)
 {
     $battle = Battle::getBattle();
     $this->status = STATUS_ELIMINATING;
     $this->exchangeAmount = $this->getUnmodifiedStrength();
     $this->defExchangeAmount = $this->getUnmodifiedDefStrength();
     return true;
 }
예제 #21
0
<?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;
    }
예제 #22
0
파일: War.php 프로젝트: aaemnnosttv/War.php
 public function fight()
 {
     // these are the "face down" cards
     $this->takePair();
     return parent::fight();
 }
예제 #23
0
            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);
예제 #24
0
 /**
  * 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 . ")");
     }
 }
예제 #25
0
 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();
 }
예제 #26
0
 public function actionIndex()
 {
     $model = Battle::model()->findall();
     $this->render('index', array('model' => $model));
 }
예제 #27
0
 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');
 }
예제 #28
0
 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;
 }
예제 #29
0
/**
 * 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);
}
예제 #30
-62
파일: battle.php 프로젝트: Xaoziq/EVOBOTS
<?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>