fix: 게임 진행 도중 이민족이 발동되는 경우 edge case 수정
- 국가 중 하나가 이성 하나만 보유중인 경우
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user