fix: 전방 도시가 '관'처럼 인구가 적은 경우 후방 워프하지 않는 버그 수정
feat: 후방 발령 관련 로직도 후방 워프와 유사하게 재 적용
This commit is contained in:
+111
-32
@@ -657,29 +657,59 @@ class GeneralAI
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cityCandidates = [];
|
/** @var General */
|
||||||
|
$pickedGeneral = Util::choiceRandom($generalCadidates);
|
||||||
|
$minRecruitPop = $pickedGeneral->getLeadership(false) * 100 + GameConst::$minAvailableRecruitPop;
|
||||||
|
|
||||||
if($this->backupCities){
|
$recruitableCityList = [];
|
||||||
$cities = $this->backupCities;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$cities = $this->supplyCities;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($cities as $city){
|
foreach($this->backupCities as $candidateCity){
|
||||||
if($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio){
|
$pop_ratio = $candidateCity['pop']/$candidateCity['pop_max'];
|
||||||
|
$cityID = $candidateCity['city'];
|
||||||
|
if($candidateCity['city'] == $this->city['city']){
|
||||||
continue;
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [
|
$cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [
|
||||||
'destGeneralID'=>Util::choiceRandom($generalCadidates)->getID(),
|
'destGeneralID'=>$pickedGeneral->getID(),
|
||||||
'destCityID'=>Util::choiceRandom($cityCandidates)['city']
|
'destCityID'=>Util::choiceRandom($recruitableCityList)['city']
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if(!$cmd->hasFullConditionMet()){
|
if(!$cmd->hasFullConditionMet()){
|
||||||
@@ -923,29 +953,63 @@ class GeneralAI
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cityCandidates = [];
|
/** @var General */
|
||||||
|
$pickedGeneral = Util::choiceRandom($generalCadidates);
|
||||||
|
$minRecruitPop = $pickedGeneral->getLeadership(false) * 100 + GameConst::$minAvailableRecruitPop;
|
||||||
|
|
||||||
if($this->backupCities){
|
$recruitableCityList = [];
|
||||||
$cities = $this->backupCities;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$cities = $this->supplyCities;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($cities as $city){
|
foreach($this->backupCities as $candidateCity){
|
||||||
if($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio){
|
$pop_ratio = $candidateCity['pop']/$candidateCity['pop_max'];
|
||||||
|
$cityID = $candidateCity['city'];
|
||||||
|
if($candidateCity['city'] == $this->city['city']){
|
||||||
continue;
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [
|
$cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, [
|
||||||
'destGeneralID'=>Util::choiceRandom($generalCadidates)->getID(),
|
'destGeneralID'=>$pickedGeneral->getID(),
|
||||||
'destCityID'=>Util::choiceRandom($cityCandidates)['city']
|
'destCityID'=>Util::choiceRandom($recruitableCityList)['city']
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if(!$cmd->hasFullConditionMet()){
|
if(!$cmd->hasFullConditionMet()){
|
||||||
@@ -2669,6 +2733,7 @@ class GeneralAI
|
|||||||
|
|
||||||
protected function do후방워프(): ?GeneralCommand
|
protected function do후방워프(): ?GeneralCommand
|
||||||
{
|
{
|
||||||
|
$minRecruitPop = $this->fullLeadership * 100 + GameConst::$minAvailableRecruitPop;
|
||||||
if (in_array($this->dipState, [self::d평화, self::d선포])) {
|
if (in_array($this->dipState, [self::d평화, self::d선포])) {
|
||||||
LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 외교 상태", $this->dipState);
|
LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 외교 상태", $this->dipState);
|
||||||
return null;
|
return null;
|
||||||
@@ -2691,14 +2756,16 @@ class GeneralAI
|
|||||||
|
|
||||||
$city = $this->city;
|
$city = $this->city;
|
||||||
if($this->generalPolicy->can한계징병){
|
if($this->generalPolicy->can한계징병){
|
||||||
if($city['pop'] >= $this->fullLeadership * 100 + GameConst::$minAvailableRecruitPop){
|
if($city['pop'] >= $minRecruitPop){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if($city['pop']/$city['pop_max'] >= $this->nationPolicy->safeRecruitCityPopulationRatio){
|
if($city['pop']/$city['pop_max'] >= $this->nationPolicy->safeRecruitCityPopulationRatio){
|
||||||
LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 인구 충분", [$city['pop']/$city['pop_max'], $this->nationPolicy->safeRecruitCityPopulationRatio]);
|
if($city['pop'] >= $this->nationPolicy->minNPCRecruitCityPopulation && $city['pop'] >= $minRecruitPop){
|
||||||
return null;
|
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){
|
if($pop_ratio < $this->nationPolicy->safeRecruitCityPopulationRatio){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if($candidateCity['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if($candidateCity['pop'] < $minRecruitPop){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$recruitableCityList[$cityID] = $pop_ratio;
|
$recruitableCityList[$cityID] = $pop_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$recruitableCityList){
|
if(!$recruitableCityList){
|
||||||
foreach($this->supplyCities as $candidateCity){
|
foreach($this->supplyCities as $candidateCity){
|
||||||
|
$pop_ratio = $candidateCity['pop']/$candidateCity['pop_max'];
|
||||||
|
$cityID = $candidateCity['city'];
|
||||||
if($candidateCity['city'] == $this->city['city']){
|
if($candidateCity['city'] == $this->city['city']){
|
||||||
continue;
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
$pop_ratio = $candidateCity['pop']/$candidateCity['pop_max'];
|
|
||||||
$cityID = $candidateCity['city'];
|
|
||||||
if(key_exists($cityID, $this->frontCities)){
|
if(key_exists($cityID, $this->frontCities)){
|
||||||
$recruitableCityList[$cityID] = $pop_ratio / 2;
|
$recruitableCityList[$cityID] = $pop_ratio / 2;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user