Skip to content

Commit

Permalink
Manchuria victory conditions, milita and MovableUnit fixes to support…
Browse files Browse the repository at this point in the history
… resurrection of militia
  • Loading branch information
daverodal committed Jan 27, 2019
1 parent c5a0bc3 commit 3ede0cd
Show file tree
Hide file tree
Showing 5 changed files with 282 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Wargame/MovableUnit.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,8 @@ function updateMoveStatus($hexagon, $moveAmount)
if ($mapData->specialHexes->$mapHexName >= 0 && $mapData->specialHexes->$mapHexName != $this->forceId) {
$victory = $battle->victory;
$mapData->specialHexesChanges->$mapHexName = true;
$victory->specialHexChange($mapHexName, $this->forceId);
$mapData->alterSpecialHex($mapHexName, $this->forceId);
$victory->specialHexChange($mapHexName, $this->forceId);
}
}
if ($mapData->getMapSymbols($mapHexName) !== false) {
Expand Down
262 changes: 262 additions & 0 deletions Wargame/TMCW/Manchuria1976/CRTResults.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
<?php
/**
* Created by PhpStorm.
* User: david
* Date: 5/25/16
* Time: 9:35 AM
*/

namespace Wargame\TMCW\Manchuria1976;
use Wargame\Battle;

trait CRTResults
{
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];
if($defUnit->class === 'militia'){
if ($combatResults === DR2) {
$combatResults = DE;
}
if($combatResults === DRL2){
$combatResults = DE;
}
}
switch ($combatResults) {
case EX2:
$distance = 2;
case EX:
$eliminated = $defUnit->damageUnit($force->exchangesKill);
if (!$eliminated){
if($distance) {
$defUnit->status = STATUS_CAN_RETREAT;
}else{
$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) + .1);
}
break;

case DE:
if($battle->victory->isUnitProhibitedFromAdvancing($attackingUnit) === true){
$attackingUnit->status = STATUS_ATTACKED;
}else {
$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)
{
if($battle->victory->isUnitProhibitedFromAdvancing($attackingUnit) === true){
$attackingUnit->status = STATUS_ATTACKED;
}else{
$attackingUnit->status = STATUS_CAN_ADVANCE;
}
}
$attackingUnit->retreatCountRequired = 0;
break;

case DL:
/* for multi defender combats */
if ($vacated || $attackingUnit->status == STATUS_CAN_ADVANCE) {
if($battle->victory->isUnitProhibitedFromAdvancing($attackingUnit) === true){
$attackingUnit->status = STATUS_ATTACKED;
}else {
$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();
}

}
2 changes: 1 addition & 1 deletion Wargame/TMCW/Manchuria1976/CombatResultsTable.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class CombatResultsTable extends \Wargame\CombatResultsTable
{
use DivMCWCombatShiftTerrain;

// use crtTraits
use CRTResults;
public $combatIndexCount;
public $maxCombatIndex;
public $dieSideCount;
Expand Down
8 changes: 4 additions & 4 deletions Wargame/TMCW/Manchuria1976/victoryCore.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public function specialHexChange($args)
$this->victoryPoints[Manchuria1976::SOVIET_FORCE] -= 10;
$this->victoryPoints[Manchuria1976::PRC_FORCE] += 10;
$battle->mapData->specialHexesVictory->$mapHexName = "<span class='prcVictoryPoints'>-10 Soviet +10 PRC vp</span>";
$this->resurrectMilitia($mapHexName);
}
}
if(in_array($mapHexName, $battle->specialHexB)){
Expand Down Expand Up @@ -121,15 +122,15 @@ public function specialHexChange($args)

public function postEliminated($args){
list($unit) = $args;
if($unit->class === "gorilla"){
if($unit->class === "gorilla" || $unit->class === "militia"){
$unit->hexagon->parent = "undeadpile";
}
}

public function resurrectMilitia($city){
$b = Battle::getBattle();
foreach($b->force->units as $k => $unit){
if($unit->status === STATUS_ELIMINATED){
if($unit->hexagon->parent === 'undeadpile'){
if($unit->forceId === Manchuria1976::PRC_FORCE){
if($unit->class === 'militia'){
$unit->status = STATUS_READY;
Expand All @@ -151,9 +152,8 @@ public function checkCityRevolt(){
if (!$mapHex->isOccupied(Manchuria1976::SOVIET_FORCE)) {
$victory = $b->victory;
$m->specialHexesChanges->$city = true;
$victory->specialHexChange($city, Manchuria1976::PRC_FORCE);
$m->alterSpecialHex($city, Manchuria1976::PRC_FORCE);
$this->resurrectMilitia($city);
$victory->specialHexChange($city, Manchuria1976::PRC_FORCE);
}
}
}
Expand Down
14 changes: 14 additions & 0 deletions Wargame/wargame-helpers/unit-images/Militia.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 3ede0cd

Please sign in to comment.