function thisAttackAcrossTwoType($defenderId, $attackerId, $type) { $los = new Los(); $los->setOrigin($this->force->getUnitHexagon($defenderId)); $los->setEndPoint($this->force->getUnitHexagon($attackerId)); $hexParts = $los->getlosList(); /* * defender is located in hexParts[0], * x first hexside adjacent to defender is in $hexParts[1] need to check second hexside for elevations checks from behind. */ return $this->terrain->terrainIs($hexParts[1], $type) || $this->terrain->terrainIs($hexParts[2], $type); }
public function setCombatIndex($defenderId) { $combatLog = ""; $battle = Battle::getBattle(); $scenario = $battle->scenario; $combats = $battle->combatRules->combats->{$defenderId}; if (count((array) $combats->attackers) == 0) { $combats->index = null; $combats->attackStrength = null; $combats->defenseStrength = null; $combats->terrainCombatEffect = null; return; } $defenders = $combats->defenders; $isCrest = $isCavalry = $isTown = $isHill = $isForest = $isSwamp = $attackerIsSunkenRoad = $isRedoubt = $isElevated = false; $combats->index = []; foreach ($defenders as $defId => $defender) { $defUnit = $battle->force->units[$defId]; $hexagon = $defUnit->hexagon; if ($defUnit->class === 'cavalry') { $isCavalry = true; } $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); $isTown |= $battle->terrain->terrainIs($hexpart, 'town'); $isForest |= $battle->terrain->terrainIs($hexpart, 'forest'); if ($battle->terrain->terrainIs($hexpart, 'elevation')) { $isElevated = 1; } if ($battle->terrain->terrainIs($hexpart, 'elevation2')) { $isElevated = 2; } $defenseStrength = $defUnit->defenseStrength; } $isClear = true; if ($isTown || $isForest || $isHill || $isSwamp) { $isClear = false; } $attackers = $combats->attackers; $attackStrength = 0; $attackersCav = false; $combinedArms = array(); $combatLog .= "<br>"; foreach ($attackers as $attackerId => $attacker) { $terrainReason = ""; $unit = $battle->force->units[$attackerId]; $unitStrength = $unit->strength; $hexagon = $unit->hexagon; $hexpart = new Hexpart(); $hexpart->setXYwithNameAndType($hexagon->name, HEXAGON_CENTER); $los = new Los(); $los->setOrigin($battle->force->getUnitHexagon($attackerId)); $los->setEndPoint($battle->force->getUnitHexagon($defenderId)); $range = $los->getRange(); $hexParts = $los->getlosList(); $targetHex = array_pop($hexParts); $targetHexSide = array_pop($hexParts); if ($battle->terrain->terrainIs($targetHexSide, "crest")) { $isCrest = true; } $combatLog .= $unit->strength . " " . $unit->class . " = " . $unit->strength . "<br>"; if ($range == 1) { $isCloseAssault = false; if ($unit->weapons === ModernTacticalUnit::SM_WEAPONS) { if ($defenderId !== false) { $defUnit = $battle->force->units[$defenderId]; if ($defUnit->target === ModernTacticalUnit::HARD_TARGET) { $isCloseAssault = true; } } } if (!$isCloseAssault) { $unitStrength *= 2; $combatLog .= "range 1, doubled = {$unitStrength}<br>"; } else { $combatLog .= "close assult no range attenuation = {$unitStrength}<br>"; } } if ($range >= 4 && $range <= 5) { $unitStrength -= 1; $combatLog .= " -1 range attentuation = {$unitStrength}<br>"; } if ($range >= 6 && $range <= 8) { $unitStrength -= 2; $combatLog .= " -2 range attentuation = {$unitStrength}<br>"; } if ($range >= 9 && $range <= 10) { $unitStrength -= 3; $combatLog .= " -3 range attentuation = {$unitStrength}<br>"; } if ($range >= 11) { $unitStrength -= 6; $combatLog .= "-6 range attentuation = {$unitStrength}<br>"; } $attackerIsElevated = false; if ($battle->terrain->terrainIs($hexpart, 'elevation')) { $attackerIsElevated = 1; } if ($battle->terrain->terrainIs($hexpart, 'elevation2')) { $attackerIsElevated = 2; } $unitStrength -= $defenseStrength; $combatLog .= " - {$defenseStrength} defender = {$unitStrength}<br>"; if ($isForest) { $unitStrength--; $combatLog .= " in forest - 1 = <span class='fixed-width' >{$unitStrength}</span><br>"; } if ($isTown) { $unitStrength -= 2; $combatLog .= " in town - 2 = <span class='fixed-width' >{$unitStrength}</span><br>"; } if ($isCrest) { $unitStrength -= 1; $combatLog .= " in crest - 1 = <span class='fixed-width' >{$unitStrength}</span><br>"; } $combatLog .= "final = {$unitStrength}<br><br>"; $combats->index[] = $unitStrength; } $combats->combatLog = $combatLog; }