fix: 도시 관련 전투 제어

This commit is contained in:
2023-05-12 00:07:00 +09:00
parent 74b9e0b4a5
commit 2ad0c6e509
4 changed files with 51 additions and 16 deletions
+10 -4
View File
@@ -341,9 +341,13 @@ usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) {
return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker)); return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker));
}); });
$rawDefenderList = array_map(function (WarUnit $unit) { $rawDefenderList = [];
return $unit->getRaw(); foreach($defenderList as $unit){
}, $defenderList); if(extractBattleOrder($unit, $attacker) <= 0){
continue;
}
$rawDefenderList[] = $unit->getRaw();
}
unset($defenderList); unset($defenderList);
$db = DB::db(); $db = DB::db();
@@ -405,7 +409,9 @@ function simulateBattle(
); );
} }
$defenderList[] = $city; if(count($defenderList) == 0 && extractBattleOrder($city, $attacker) > 0){
$defenderList[] = $city;
}
$iterDefender = new \ArrayIterator($defenderList); $iterDefender = new \ArrayIterator($defenderList);
+22 -3
View File
@@ -42,10 +42,18 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
/** @var WarUnit[] */ /** @var WarUnit[] */
$defenderList = []; $defenderList = [];
foreach($defenderGeneralList as $defenderGeneral){ foreach($defenderGeneralList as $defenderGeneral){
$defenderList[] = new WarUnitGeneral($rng, $defenderGeneral, $rawDefenderNation, false);
$defenderCandidate = new WarUnitGeneral($rng, $defenderGeneral, $rawDefenderNation, false);
if(extractBattleOrder($defenderCandidate, $attacker) <= 0){
continue;
}
$defenderList[] = $defenderCandidate;
} }
$defenderList[] = $city; if(count($defenderList) == 0 && extractBattleOrder($city, $attacker) > 0){
$defenderList[] = $city;
}
usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) { usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) {
return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker)); return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker));
@@ -183,7 +191,11 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
function extractBattleOrder(WarUnit $defender, WarUnit $attacker) function extractBattleOrder(WarUnit $defender, WarUnit $attacker)
{ {
if($defender instanceof WarUnitCity){ if($defender instanceof WarUnitCity){
return -1; if(!($attacker instanceof WarUnitGeneral)){
return 0;
}
$attackerGeneral = $attacker->getGeneral();
return $attackerGeneral->onCalcOpposeStat($defender->getGeneral(), 'cityBattleOrder', -1);
} }
$general = $defender->getGeneral(); $general = $defender->getGeneral();
@@ -229,6 +241,7 @@ function processWar_NG(
$attackerNationUpdate = []; $attackerNationUpdate = [];
$defenderNationUpdate = []; $defenderNationUpdate = [];
/** @var WarUnit */
$defender = ($getNextDefender)(null, true); $defender = ($getNextDefender)(null, true);
$conquerCity = false; $conquerCity = false;
@@ -244,6 +257,7 @@ function processWar_NG(
$logWritten = false; $logWritten = false;
if ($defender === null) { if ($defender === null) {
$defender = $city; $defender = $city;
$defender->setSiege();
if ($city->getNationVar('rice') <= 0 && $city->getVar('supply')) { if ($city->getNationVar('rice') <= 0 && $city->getVar('supply')) {
//병량 패퇴 //병량 패퇴
@@ -459,6 +473,11 @@ function processWar_NG(
$attacker->finishBattle(); $attacker->finishBattle();
$defender->finishBattle(); $defender->finishBattle();
if($city->getDead()){
$city->setSiege();
$city->finishBattle();
}
if ($defender instanceof WarUnitCity) { if ($defender instanceof WarUnitCity) {
$newConflict = $defender->addConflict(); $newConflict = $defender->addConflict();
if ($newConflict) { if ($newConflict) {
+13 -8
View File
@@ -69,9 +69,14 @@ class GameUnitDetail implements iAction
$this->info = $info; $this->info = $info;
$this->initSkillTrigger = $initSkillTrigger; $this->initSkillTrigger = $initSkillTrigger;
$this->phaseSkillTrigger = $phaseSkillTrigger; $this->phaseSkillTrigger = $phaseSkillTrigger;
$this->iActionList = array_map(function($rawAction){ $this->iActionList = [];
return buildActionCrewTypeClass($rawAction); foreach($iActionList as $rawAction){
}, $iActionList ?? []); $action = buildActionCrewTypeClass($rawAction);
if(!$action){
continue;
}
$this->iActionList[] = $action;
}
} }
public function getInfo(): string public function getInfo(): string
@@ -285,7 +290,7 @@ class GameUnitDetail implements iAction
public function onCalcStat(General $general, string $statName, $value, $aux = null) public function onCalcStat(General $general, string $statName, $value, $aux = null)
{ {
if (!$this->iActionList) { if (!$this->iActionList) {
return; return $value;
} }
foreach ($this->iActionList as $iAction) { foreach ($this->iActionList as $iAction) {
@@ -297,7 +302,7 @@ class GameUnitDetail implements iAction
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null) public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
{ {
if (!$this->iActionList) { if (!$this->iActionList) {
return; return $value;
} }
foreach ($this->iActionList as $iAction) { foreach ($this->iActionList as $iAction) {
@@ -308,7 +313,7 @@ class GameUnitDetail implements iAction
public function onCalcStrategic(string $turnType, string $varType, $value) public function onCalcStrategic(string $turnType, string $varType, $value)
{ {
if (!$this->iActionList) { if (!$this->iActionList) {
return; return $value;
} }
foreach ($this->iActionList as $iAction) { foreach ($this->iActionList as $iAction) {
@@ -319,7 +324,7 @@ class GameUnitDetail implements iAction
public function onCalcNationalIncome(string $type, $amount) public function onCalcNationalIncome(string $type, $amount)
{ {
if (!$this->iActionList) { if (!$this->iActionList) {
return; return $amount;
} }
foreach ($this->iActionList as $iAction) { foreach ($this->iActionList as $iAction) {
@@ -346,7 +351,7 @@ class GameUnitDetail implements iAction
public function onArbitraryAction(General $general, RandUtil $rng, string $actionType, ?string $phase = null, ?array $aux = null): null|array public function onArbitraryAction(General $general, RandUtil $rng, string $actionType, ?string $phase = null, ?array $aux = null): null|array
{ {
if (!$this->iActionList) { if (!$this->iActionList) {
return null; return $aux;
} }
foreach ($this->iActionList as $iAction) { foreach ($this->iActionList as $iAction) {
+6 -1
View File
@@ -7,6 +7,7 @@ class WarUnitCity extends WarUnit{
protected $hp; protected $hp;
protected $cityTrainAtmos; protected $cityTrainAtmos;
protected $onSiege = false;
function __construct(public readonly RandUtil $rng, $raw, $rawNation, int $year, int $month, int $startYear){ function __construct(public readonly RandUtil $rng, $raw, $rawNation, int $year, int $month, int $startYear){
$general = new DummyGeneral(false); $general = new DummyGeneral(false);
@@ -77,6 +78,10 @@ class WarUnitCity extends WarUnit{
return $this->hp; return $this->hp;
} }
function setSiege(){
$this->onSiege = true;
}
function getDex(GameUnitDetail $crewType){ function getDex(GameUnitDetail $crewType){
return ($this->cityTrainAtmos - 60) * 7200; return ($this->cityTrainAtmos - 60) * 7200;
} }
@@ -109,7 +114,7 @@ class WarUnitCity extends WarUnit{
} }
function finishBattle(){ function finishBattle(){
if($this->isFinished){ if($this->isFinished || !$this->onSiege){
return; return;
} }
$this->clearActivatedSkill(); $this->clearActivatedSkill();