From f33a3989ea53e3cad0376cd87df97f6ed9845441 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 10 Apr 2021 11:51:10 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A0=84=EB=B0=A9=20=EB=8F=84=EC=8B=9C?= =?UTF-8?q?=EA=B0=80=20'=EA=B4=80'=EC=B2=98=EB=9F=BC=20=EC=9D=B8=EA=B5=AC?= =?UTF-8?q?=EA=B0=80=20=EC=A0=81=EC=9D=80=20=EA=B2=BD=EC=9A=B0=20=ED=9B=84?= =?UTF-8?q?=EB=B0=A9=20=EC=9B=8C=ED=94=84=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20feat:=20?= =?UTF-8?q?=ED=9B=84=EB=B0=A9=20=EB=B0=9C=EB=A0=B9=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EB=8F=84=20=ED=9B=84=EB=B0=A9=20=EC=9B=8C?= =?UTF-8?q?=ED=94=84=EC=99=80=20=EC=9C=A0=EC=82=AC=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=9E=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/GeneralAI.php | 143 +++++++++++++++++++++++++++++++--------- 1 file changed, 111 insertions(+), 32 deletions(-) diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index 900ebebf..6a87653c 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -657,29 +657,59 @@ class GeneralAI return null; } - $cityCandidates = []; + /** @var General */ + $pickedGeneral = Util::choiceRandom($generalCadidates); + $minRecruitPop = $pickedGeneral->getLeadership(false) * 100 + GameConst::$minAvailableRecruitPop; - if($this->backupCities){ - $cities = $this->backupCities; - } - else{ - $cities = $this->supplyCities; - } + $recruitableCityList = []; - foreach($cities as $city){ - if($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio){ + foreach($this->backupCities as $candidateCity){ + $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; + $cityID = $candidateCity['city']; + if($candidateCity['city'] == $this->city['city']){ continue; } - $cityCandidates[] = $city; + if($candidateCity['pop'] < $minRecruitPop){ + continue; + } + + if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ + $pop_ratio /= 4; + } + + $recruitableCityList[$cityID] = $pop_ratio; } - if(!$cityCandidates){ + if(!$recruitableCityList){ + foreach($this->supplyCities as $candidateCity){ + $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; + $cityID = $candidateCity['city']; + if($candidateCity['city'] == $this->city['city']){ + continue; + } + if($candidateCity['pop'] <= $minRecruitPop){ + continue; + } + + if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ + $pop_ratio /= 2; + } + + if(key_exists($cityID, $this->frontCities)){ + $pop_ratio / 2; + } + + $recruitableCityList[$cityID] = $pop_ratio; + } + } + + if(!$recruitableCityList){ return null; } $cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [ - 'destGeneralID'=>Util::choiceRandom($generalCadidates)->getID(), - 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] + 'destGeneralID'=>$pickedGeneral->getID(), + 'destCityID'=>Util::choiceRandom($recruitableCityList)['city'] ]); if(!$cmd->hasFullConditionMet()){ @@ -923,29 +953,63 @@ class GeneralAI return null; } - $cityCandidates = []; + /** @var General */ + $pickedGeneral = Util::choiceRandom($generalCadidates); + $minRecruitPop = $pickedGeneral->getLeadership(false) * 100 + GameConst::$minAvailableRecruitPop; - if($this->backupCities){ - $cities = $this->backupCities; - } - else{ - $cities = $this->supplyCities; - } + $recruitableCityList = []; - foreach($cities as $city){ - if($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio){ + foreach($this->backupCities as $candidateCity){ + $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; + $cityID = $candidateCity['city']; + if($candidateCity['city'] == $this->city['city']){ continue; } - $cityCandidates[] = $city; + if($candidateCity['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation){ + continue; + } + if($candidateCity['pop'] < $minRecruitPop){ + continue; + } + if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ + continue; + } + + $recruitableCityList[$cityID] = $pop_ratio; } - if(!$cityCandidates){ + if(!$recruitableCityList){ + foreach($this->supplyCities as $candidateCity){ + $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; + $cityID = $candidateCity['city']; + if($candidateCity['city'] == $this->city['city']){ + continue; + } + if($candidateCity['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation){ + continue; + } + if($candidateCity['pop'] <= $minRecruitPop){ + continue; + } + if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ + continue; + } + + if(key_exists($cityID, $this->frontCities)){ + $pop_ratio / 2; + } + + $recruitableCityList[$cityID] = $pop_ratio; + } + } + + if(!$recruitableCityList){ return null; } $cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [ - 'destGeneralID'=>Util::choiceRandom($generalCadidates)->getID(), - 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] + 'destGeneralID'=>$pickedGeneral->getID(), + 'destCityID'=>Util::choiceRandom($recruitableCityList)['city'] ]); if(!$cmd->hasFullConditionMet()){ @@ -2669,6 +2733,7 @@ class GeneralAI protected function do후방워프(): ?GeneralCommand { + $minRecruitPop = $this->fullLeadership * 100 + GameConst::$minAvailableRecruitPop; if (in_array($this->dipState, [self::d평화, self::d선포])) { LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 외교 상태", $this->dipState); return null; @@ -2691,14 +2756,16 @@ class GeneralAI $city = $this->city; if($this->generalPolicy->can한계징병){ - if($city['pop'] >= $this->fullLeadership * 100 + GameConst::$minAvailableRecruitPop){ + if($city['pop'] >= $minRecruitPop){ return null; } } else{ if($city['pop']/$city['pop_max'] >= $this->nationPolicy->safeRecruitCityPopulationRatio){ - LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 인구 충분", [$city['pop']/$city['pop_max'], $this->nationPolicy->safeRecruitCityPopulationRatio]); - return null; + if($city['pop'] >= $this->nationPolicy->minNPCRecruitCityPopulation && $city['pop'] >= $minRecruitPop){ + LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 인구 충분", [$city['pop']/$city['pop_max'], $this->nationPolicy->safeRecruitCityPopulationRatio]); + return null; + } } } @@ -2715,19 +2782,31 @@ class GeneralAI if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ continue; } + if($candidateCity['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation){ + continue; + } + if($candidateCity['pop'] < $minRecruitPop){ + continue; + } $recruitableCityList[$cityID] = $pop_ratio; } if(!$recruitableCityList){ foreach($this->supplyCities as $candidateCity){ + $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; + $cityID = $candidateCity['city']; if($candidateCity['city'] == $this->city['city']){ continue; } - if($candidateCity['pop'] <= $this->fullLeadership * 100 + GameConst::$minAvailableRecruitPop){ + if($candidateCity['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation){ + continue; + } + if($candidateCity['pop'] <= $minRecruitPop){ + continue; + } + if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){ continue; } - $pop_ratio = $candidateCity['pop']/$candidateCity['pop_max']; - $cityID = $candidateCity['city']; if(key_exists($cityID, $this->frontCities)){ $recruitableCityList[$cityID] = $pop_ratio / 2; }