fix: 도시 관련 전투 제어
This commit is contained in:
@@ -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
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user