From 81bd5c19140e49d123744e6be2aee064e034fc3e Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 30 Oct 2022 21:47:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AC=B4=EC=9E=91=EC=9C=84=EA=B1=B4?= =?UTF-8?q?=EA=B5=AD,=20=EB=AC=B4=EC=9E=91=EC=9C=84=EC=88=98=EB=8F=84?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=20=EC=BB=A4=EB=A7=A8=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_무작위건국.php | 246 ++++++++++++++++++ .../Command/Nation/che_무작위수도이전.php | 165 ++++++++++++ hwe/ts/processing/General/che_무작위건국.vue | 82 ++++++ hwe/ts/processing/General/index.ts | 2 + 4 files changed, 495 insertions(+) create mode 100644 hwe/sammo/Command/General/che_무작위건국.php create mode 100644 hwe/sammo/Command/Nation/che_무작위수도이전.php create mode 100644 hwe/ts/processing/General/che_무작위건국.vue diff --git a/hwe/sammo/Command/General/che_무작위건국.php b/hwe/sammo/Command/General/che_무작위건국.php new file mode 100644 index 00000000..02dc8327 --- /dev/null +++ b/hwe/sammo/Command/General/che_무작위건국.php @@ -0,0 +1,246 @@ +arg === null) { + return false; + } + $nationName = $this->arg['nationName'] ?? null; + $nationType = $this->arg['nationType'] ?? null; + $colorType = $this->arg['colorType'] ?? null; + + if ($nationName === null || $nationType === null || $colorType === null) { + return false; + } + + if (!is_string($nationName) || !is_string($nationType) || !is_int($colorType)) { + return false; + } + + if (mb_strwidth($nationName) > 18 || $nationName == '') { + return false; + } + + if (!key_exists($colorType, GetNationColors())) { + return false; + } + + try { + $nationTypeClass = buildNationTypeClass($nationType); + } catch (\InvalidArgumentException $e) { + return false; + } + + $this->arg = [ + 'nationName' => $nationName, + 'nationType' => $nationType, + 'colorType' => $colorType + ]; + + return true; + } + + protected function init() + { + $env = $this->env; + + $this->setNation(['gennum', 'aux']); + + $relYear = $env['year'] - $env['startyear']; + + $this->minConditionConstraints = [ + ConstraintHelper::BeOpeningPart($relYear + 1), + ConstraintHelper::ReqNationValue('level', '국가규모', '==', 0, '정식 국가가 아니어야합니다.') + ]; + } + + protected function initWithArg() + { + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + + $nationName = $this->arg['nationName']; + $nationType = $this->arg['nationType']; + $colorType = $this->arg['colorType']; + + $this->fullConditionConstraints = [ + ConstraintHelper::BeLord(), + ConstraintHelper::WanderingNation(), + ConstraintHelper::ReqNationValue('gennum', '수하 장수', '>=', 2), + ConstraintHelper::BeOpeningPart($relYear + 1), + ConstraintHelper::CheckNationNameDuplicate($nationName), + ConstraintHelper::AllowJoinAction(), + ]; + } + + public function getBrief(): string + { + $nationName = $this->arg['nationName']; + $josaUl = JosaUtil::pick($nationName, '을'); + return "【{$nationName}】{$josaUl} 무작위 도시에 건국"; + } + + public function getCost(): array + { + return [0, 0]; + } + + public function getPreReqTurn(): int + { + return 0; + } + + public function getPostReqTurn(): int + { + return 0; + } + + public function run(\Sammo\RandUtil $rng): bool + { + if (!$this->hasFullConditionMet()) { + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + $env = $this->env; + + $general = $this->generalObj; + $date = $general->getTurnTime($general::TURNTIME_HM); + $generalName = $general->getName(); + $logger = $general->getLogger(); + + $initYearMonth = Util::joinYearMonth($env['init_year'], $env['init_month']); + $yearMonth = Util::joinYearMonth($env['year'], $env['month']); + if($yearMonth <= $initYearMonth){ + $logger->pushGeneralActionLog("다음 턴부터 건국할 수 있습니다. <1>$date"); + $this->alternative = new che_인재탐색($general, $this->env, null); + return false; + } + + + $cities = $db->queryFirstColumn('SELECT city FROM city where `level`>=5 and `level`<=6 and nation=0'); + if(!$cities){ + $logger->pushGeneralActionLog("건국할 수 있는 도시가 없습니다. <1>$date"); + $this->alternative = new che_해산($general, $this->env, null); + return false; + } + $cityID = $rng->choice($cities); + if($general->getCityID() == $cityID){ + $this->setCity(); + } + else{ + $this->generalObj->setVar('city', $cityID); + $this->setCity(); + $db->update('general', [ + 'city' => $cityID + ], 'nation = %i', $general->getNationID()); + } + + $josaYi = JosaUtil::pick($generalName, '이'); + + $nationName = $this->arg['nationName']; + $nationType = $this->arg['nationType']; + $colorType = GetNationColors()[$this->arg['colorType']]; + + $cityName = $this->city['name']; + + $josaUl = JosaUtil::pick($nationName, '을'); + + $nationTypeClass = buildNationTypeClass($nationType); + $nationTypeName = $nationTypeClass->getName(); + + $logger->pushGeneralActionLog("{$nationName}{$josaUl} 건국하였습니다. <1>$date"); + $logger->pushGlobalActionLog("{$generalName}{$josaYi} {$cityName}에 국가를 건설하였습니다."); + + $josaNationYi = JosaUtil::pick($nationName, '이'); + $logger->pushGlobalHistoryLog("【건국】{$nationTypeName} {$nationName}{$josaNationYi} 새로이 등장하였습니다."); + $logger->pushGeneralHistoryLog("{$nationName}{$josaUl} 건국"); + $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$nationName}{$josaUl} 건국"); + + $exp = 1000; + $ded = 1000; + + $general->addExperience($exp); + $general->addDedication($ded); + + $aux = Json::decode($this->nation['aux']) ?? []; + $aux['can_국기변경'] = 1; + $aux['can_무작위수도이전'] = 1; + + $db->update('city', [ + 'nation' => $general->getNationID(), + 'conflict' => '{}' + ], 'city=%i', $general->getCityID()); + + $db->update('nation', [ + 'name' => $nationName, + 'color' => $colorType, + 'level' => 1, + 'type' => $nationType, + 'capital' => $general->getCityID(), + 'aux' => Json::encode($aux) + ], 'nation=%i', $general->getNationID()); + + refreshNationStaticInfo(); + + $general->increaseInheritancePoint(InheritanceKey::active_action, 1); + $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->checkStatChange(); + tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general), $general, '건국'); + $general->applyDB($db); + + return true; + } + + public function exportJSVars(): array + { + $nationTypes = []; + foreach (GameConst::$availableNationType as $nationType) { + $nationClass = buildNationTypeClass($nationType); + $nationTypes[$nationType] = [ + 'type' => $nationType, + 'name' => $nationClass->getName(), + 'pros' => $nationClass::$pros, + 'cons' => $nationClass::$cons + ]; + } + return [ + 'procRes' => [ + 'available건국' => count(getAllNationStaticInfo()) < $this->env['maxnation'], + 'nationTypes' => $nationTypes, + 'colors' => GetNationColors(), + + ] + ]; + } +} diff --git a/hwe/sammo/Command/Nation/che_무작위수도이전.php b/hwe/sammo/Command/Nation/che_무작위수도이전.php new file mode 100644 index 00000000..42f6f324 --- /dev/null +++ b/hwe/sammo/Command/Nation/che_무작위수도이전.php @@ -0,0 +1,165 @@ +arg = []; + + return true; + } + + protected function init() + { + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + + $this->setCity(); + $this->setNation(['capital', 'aux']); + + $this->fullConditionConstraints = [ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeLord(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::BeOpeningPart($relYear + 1), + ConstraintHelper::ReqNationAuxValue("can_무작위수도이전", 0, '>', 0, '더이상 변경이 불가능합니다.') + ]; + } + + + public function getCommandDetailTitle():string{ + $name = $this->getName(); + + $reqTurn = $this->getPreReqTurn()+1; + + return "{$name}/{$reqTurn}턴"; + } + + + public function getCost(): array + { + return [0, 0]; + } + + public function getPreReqTurn(): int + { + return 1; + } + + public function getPostReqTurn(): int + { + return 0; + } + + public function run(\Sammo\RandUtil $rng): bool + { + if (!$this->hasFullConditionMet()) { + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + $generalID = $general->getID(); + $generalName = $general->getName(); + $date = $general->getTurnTime($general::TURNTIME_HM); + + $year = $this->env['year']; + $month = $this->env['month']; + + $logger = $general->getLogger(); + + $oldCityID = $this->nation['capital']; + + $cities = $db->queryFirstColumn('SELECT city FROM city where `level`>=5 and `level`<=6 and nation=0'); + if (!$cities) { + $logger->pushGeneralActionLog("이동할 수 있는 도시가 없습니다. <1>$date"); + return false; + } + $destCityID = $rng->choice($cities); + $this->setDestCity($destCityID, true); + + + $destCity = $this->destCity; + $destCityID = $destCity['city']; + $destCityName = $destCity['name']; + + $nationID = $general->getNationID(); + $nationName = $this->nation['name']; + + $josaRo = JosaUtil::pick($destCityName, '로'); + + $general->addExperience(5 * ($this->getPreReqTurn() + 1)); + $general->addDedication(5 * ($this->getPreReqTurn() + 1)); + + $josaYi = JosaUtil::pick($generalName, '이'); + $josaYiNation = JosaUtil::pick($nationName, '이'); + + $aux = Json::decode($this->nation['aux']); + $aux["can_무작위수도이전"] -= 1; + + $db->update('city', [ + 'nation' => $nationID, + 'conflict' => '{}' + ], 'city=%i', $destCityID); + $db->update('nation', [ + 'capital' => $destCityID, + 'aux'=>Json::encode($aux), + ], 'nation=%i', $nationID); + $db->update('city', [ + 'nation' => 0, + 'front' => 0, + 'conflict' => '{}', + 'officer_set' => 0, + ], 'city=%i', $oldCityID); + + $general->setVar('city', $destCityID); + $generalList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no!=%i', $general->getNationID(), $general->getID()); + if ($generalList) { + $db->update('general', [ + 'city' => $destCityID + ], 'no IN %li', $generalList); + } + foreach ($generalList as $targetGeneralID) { + $targetLogger = new ActionLogger($targetGeneralID, $general->getNationID(), $year, $month); + $targetLogger->pushGeneralActionLog("국가 수도를 {$destCityName}{$josaRo} 옮겼습니다.", ActionLogger::PLAIN); + $targetLogger->flush(); + } + + \sammo\refreshNationStaticInfo(); + + $general->increaseInheritancePoint(InheritanceKey::active_action, 1); + $logger->pushGeneralActionLog("{$destCityName}{$josaRo} 국가를 옮겼습니다. <1>$date"); + $logger->pushGeneralHistoryLog("{$destCityName}{$josaRo} 무작위 수도 이전"); + $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destCityName}{$josaRo} 무작위 수도 이전"); + $logger->pushGlobalActionLog("{$generalName}{$josaYi} {$destCityName}{$josaRo} 수도 이전하였습니다."); + $logger->pushGlobalHistoryLog("【무작위 수도 이전】{$nationName}{$josaYiNation} {$destCityName}{$josaRo} 수도 이전하였습니다."); + + $this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0)); + $general->applyDB($db); + return true; + } +} diff --git a/hwe/ts/processing/General/che_무작위건국.vue b/hwe/ts/processing/General/che_무작위건국.vue new file mode 100644 index 00000000..9316f469 --- /dev/null +++ b/hwe/ts/processing/General/che_무작위건국.vue @@ -0,0 +1,82 @@ + + + + diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index da45cace..f8710642 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -1,4 +1,5 @@ import { default as che_건국 } from "./che_건국.vue"; +import { default as che_무작위건국 } from "./che_무작위건국.vue"; import { default as che_군량매매 } from "./che_군량매매.vue"; import { default as che_등용 } from "./che_등용.vue"; import { default as che_선양 } from "./che_선양.vue"; @@ -19,6 +20,7 @@ export const commandMap: Record = { che_강행: ProcessCity, che_군량매매, che_건국, + che_무작위건국, che_등용, che_모병: che_징병, che_선동: ProcessCity,