fix: 게임 진행 도중 이민족이 발동되는 경우 edge case 수정

- 국가 중 하나가 이성 하나만 보유중인 경우
This commit is contained in:
2022-05-17 23:02:11 +09:00
parent 296a27a409
commit 687f2b2edf
+27 -19
View File
@@ -2,6 +2,7 @@
namespace sammo\Event\Action; namespace sammo\Event\Action;
use Ds\Set;
use sammo\ActionLogger; use sammo\ActionLogger;
use sammo\CityConst; use sammo\CityConst;
use sammo\DB; use sammo\DB;
@@ -45,7 +46,7 @@ class RaiseInvader extends \sammo\Event\Action
$this->dex = $dex; $this->dex = $dex;
} }
private function moveCapital() private function moveCapital(RandUtil $rng): Set
{ {
$cities = []; $cities = [];
foreach (CityConst::all() as $cityObj) { foreach (CityConst::all() as $cityObj) {
@@ -55,19 +56,22 @@ class RaiseInvader extends \sammo\Event\Action
$cities[] = $cityObj->id; $cities[] = $cityObj->id;
} }
$disabledInvaderCity = new Set();
if (count($cities) == 0) { if (count($cities) == 0) {
return [__CLASS__, 0]; return $disabledInvaderCity;
} }
$db = DB::db(); $db = DB::db();
foreach ($db->queryAllLists('SELECT capital, nation from nation WHERE capital in %li', $cities) as $row) {
foreach ($db->queryFirstColumn('SELECT capital, nation from nation WHERE capital in %li', $cities) as $row) { [$oldCapital, $nation] = $row;
list($oldCapital, $nation) = $row; $capitalCandidates = $db->queryFirstColumn('SELECT from city WHERE nation = %i AND city != %i', $nation);
$newCapital = $db->queryFirstRow('SELECT city from city where nation=%i and city !=%i \ if (!$capitalCandidates) {
order by rand() limit 1', $nation, $oldCapital); $disabledInvaderCity->add($oldCapital);
continue;
}
$newCapital = $rng->choice($capitalCandidates);
$db->update('nation', ['capital' => $newCapital], 'nation=%i', $nation); $db->update('nation', ['capital' => $newCapital], 'nation=%i', $nation);
$db->update('general', ['city' => $newCapital], 'nation=%i and city=%i', $nation, $oldCapital); $db->update('general', ['city' => $newCapital], 'nation=%i and city=%i', $nation, $oldCapital);
} }
@@ -82,6 +86,8 @@ class RaiseInvader extends \sammo\Event\Action
'front' => 0, 'front' => 0,
'supply' => 1, 'supply' => 1,
], 'city in %li', $cities); ], 'city in %li', $cities);
return $disabledInvaderCity;
} }
public function run(array $env) public function run(array $env)
@@ -125,7 +131,16 @@ class RaiseInvader extends \sammo\Event\Action
} }
$dex = Util::toInt($dex); $dex = Util::toInt($dex);
$this->moveCapital(); $year = $env['year'];
$month = $env['month'];
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'RaiseInvader',
$year,
$month,
)));
$disabledInvaderCity = $this->moveCapital($rng);
$serverID = UniqueConst::$serverID; $serverID = UniqueConst::$serverID;
$existNations = $db->queryFirstColumn("SELECT nation FROM `nation`"); $existNations = $db->queryFirstColumn("SELECT nation FROM `nation`");
$lastNationID = max( $lastNationID = max(
@@ -141,22 +156,15 @@ class RaiseInvader extends \sammo\Event\Action
'rice' => 999999, 'rice' => 999999,
], true); ], true);
$year = $env['year'];
$month = $env['month'];
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'RaiseInvader',
$year,
$month,
)));
$invaderNationIDList = []; $invaderNationIDList = [];
refreshNationStaticInfo(); refreshNationStaticInfo();
foreach ($cities as $cityObj) { foreach ($cities as $cityObj) {
if ($cityObj->level != 4) { if ($cityObj->level != 4) {
continue; continue;
} }
if($disabledInvaderCity->contains($cityObj->id)){
continue;
}
$lastNationID += 1; $lastNationID += 1;
$invaderNationID = $lastNationID; $invaderNationID = $lastNationID;