diff --git a/hwe/sammo/Command/General/che_강행.php b/hwe/sammo/Command/General/che_강행.php index 2c6b035a..32bf0339 100644 --- a/hwe/sammo/Command/General/che_강행.php +++ b/hwe/sammo/Command/General/che_강행.php @@ -173,9 +173,11 @@ class che_강행 extends Command\GeneralCommand public function exportJSVars(): array { return [ - 'cities' => \sammo\JSOptionsForCities(), - 'mapTheme' => getMapTheme(), - 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), + ], ]; } } \ No newline at end of file diff --git a/hwe/sammo/Command/General/che_이동.php b/hwe/sammo/Command/General/che_이동.php index 92a60d5f..75cebd46 100644 --- a/hwe/sammo/Command/General/che_이동.php +++ b/hwe/sammo/Command/General/che_이동.php @@ -181,9 +181,11 @@ class che_이동 extends Command\GeneralCommand public function exportJSVars(): array { return [ - 'cities' => \sammo\JSOptionsForCities(), - 'mapTheme' => getMapTheme(), - 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 1), + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 1), + ], ]; } } diff --git a/hwe/sammo/Command/General/che_출병.php b/hwe/sammo/Command/General/che_출병.php index 70e5c633..42274d9c 100644 --- a/hwe/sammo/Command/General/che_출병.php +++ b/hwe/sammo/Command/General/che_출병.php @@ -243,8 +243,10 @@ class che_출병 extends Command\GeneralCommand public function exportJSVars(): array { return [ - 'cities' => \sammo\JSOptionsForCities(), 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + ], ]; } } diff --git a/hwe/sammo/Command/Nation/che_발령.php b/hwe/sammo/Command/Nation/che_발령.php index ac28bbc5..6efd3be9 100644 --- a/hwe/sammo/Command/Nation/che_발령.php +++ b/hwe/sammo/Command/Nation/che_발령.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 사망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(CityConst::byID($this->arg['destCityID']) === null){ + if (CityConst::byID($this->arg['destCityID']) === null) { return false; } $destGeneralID = $this->arg['destGeneralID']; $destCityID = $this->arg['destCityID']; $this->arg = [ - 'destGeneralID'=>$destGeneralID, - 'destCityID'=>$destCityID, + 'destGeneralID' => $destGeneralID, + 'destCityID' => $destCityID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -67,14 +74,14 @@ class che_발령 extends Command\NationCommand{ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, 1); $this->setDestGeneral($destGeneral); - if($this->arg['destGeneralID'] == $this->getGeneral()->getID()){ - $this->fullConditionConstraints=[ + if ($this->arg['destGeneralID'] == $this->getGeneral()->getID()) { + $this->fullConditionConstraints = [ ConstraintHelper::AlwaysFail('본인입니다') ]; return; } - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -86,29 +93,34 @@ class che_발령 extends Command\NationCommand{ ]; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); $failReason = $this->testFullConditionMet(); - if($failReason === null){ + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destGeneralName = $this->destGeneralObj->getName(); return "{$failReason} {$destGeneralName} {$commandName} 실패."; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - public function getPreReqTurn():int{ + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destGeneralName = $this->destGeneralObj->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; @@ -117,8 +129,9 @@ class che_발령 extends Command\NationCommand{ } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -144,8 +157,8 @@ class che_발령 extends Command\NationCommand{ $destGeneral->getLogger()->pushGeneralActionLog("{$generalName}에 의해 {$destCityName}{$josaRo} 발령됐습니다. <1>$date"); $yearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']); - if(cutTurn($general->getTurnTime(), $this->env['turnterm']) != cutTurn($destGeneral->getTurnTime(), $this->env['turnterm'])){ - $yearMonth+=1; + if (cutTurn($general->getTurnTime(), $this->env['turnterm']) != cutTurn($destGeneral->getTurnTime(), $this->env['turnterm'])) { + $yearMonth += 1; } $destGeneral->setAuxVar('last발령', $yearMonth); $logger->pushGeneralActionLog("{$destGeneralName}{$josaUl} {$destCityName}{$josaRo} 발령했습니다. <1>$date"); @@ -157,6 +170,24 @@ class che_발령 extends Command\NationCommand{ return true; } + public function exportJSVars(): array + { + $db = DB::db(); + $nationID = $this->getNationID(); + $troops = Util::convertArrayToDict($db->query('SELECT * FROM troop WHERE nation=%i', $nationID), 'troop_leader'); + $destRawGenerals = $db->queryAllLists('SELECT no,name,officer_level,npc,gold,rice,leadership,strength,intel,city,crew,train,atmos,troop FROM general WHERE nation = %i ORDER BY npc,binary(name)', $nationID); + return [ + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 1), + 'cities' => \sammo\JSOptionsForCities(), + 'troops' => $troops, + 'generals' => $destRawGenerals, + 'generalsKey' => ['no', 'name', 'officerLevel', 'npc', 'gold', 'rice', 'leadership', 'strength', 'intel', 'cityID', 'crew', 'train', 'atmos', 'troopID'] + ] + ]; + } + public function getJSPlugins(): array { return [ @@ -171,16 +202,16 @@ class che_발령 extends Command\NationCommand{ $nationID = $this->generalObj->getNationID(); $troops = Util::convertArrayToDict($db->query('SELECT * FROM troop WHERE nation=%i', $nationID), 'troop_leader'); - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice,leadership,strength,intel,city,crew,train,atmos,troop FROM general WHERE nation = %i ORDER BY npc,binary(name)',$nationID); + $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice,leadership,strength,intel,city,crew,train,atmos,troop FROM general WHERE nation = %i ORDER BY npc,binary(name)', $nationID); $destGeneralList = []; - foreach($destRawGenerals as $destGeneral){ + foreach ($destRawGenerals as $destGeneral) { $nameColor = \sammo\getNameColor($destGeneral['npc']); - if($nameColor){ + if ($nameColor) { $nameColor = " style='color:{$nameColor}'"; } $name = $destGeneral['name']; - if($destGeneral['officer_level'] >= 5){ + if ($destGeneral['officer_level'] >= 5) { $name = "*{$name}*"; } @@ -190,23 +221,23 @@ class che_발령 extends Command\NationCommand{ } ob_start(); ?> -
-선택된 도시로 아국 장수를 발령합니다.
-아국 도시로만 발령이 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
- -
-
+
+ 선택된 도시로 아국 장수를 발령합니다.
+ 아국 도시로만 발령이 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+ +
+
(item: V[], columnList: K[]): return newItem; } -export function combineArray(array: V[][], columnList: K[]): Record[] { - const result: Record[] = []; - for (const key of array.keys()) { - const item = array[key]; - result[key] = combineObject(item, columnList); - } - return result; -} - - export function errUnknown(): void { alert('작업을 실패했습니다.'); } diff --git a/hwe/ts/processing/CitySelect.vue b/hwe/ts/processing/CitySelect.vue index 3f6e62fe..07e043b2 100644 --- a/hwe/ts/processing/CitySelect.vue +++ b/hwe/ts/processing/CitySelect.vue @@ -6,14 +6,13 @@ :group-select="false" label="searchText" track-by="value" - open-direction="bottom" :show-labels="false" selectLabel="선택(엔터)" selectGroupLabel="" selectedLabel="선택됨" deselectLabel="해제(엔터)" deselectGroupLabel="" - placeholder="턴 선택" + placeholder="도시 선택" :maxHeight="400" :searchable="searchMode" > diff --git a/hwe/ts/processing/General/che_강행.vue b/hwe/ts/processing/General/che_강행.vue index c688cf9e..8b92005e 100644 --- a/hwe/ts/processing/General/che_강행.vue +++ b/hwe/ts/processing/General/che_강행.vue @@ -17,7 +17,7 @@
- +
{{ commandName }} @@ -44,10 +44,14 @@ import { Args } from "@/processing/args"; import TopBackBar from "@/components/TopBackBar.vue"; import BottomBar from "@/components/BottomBar.vue"; declare const mapTheme: string; -declare const cities: [number, string][]; -declare const currentCity: number; -declare const distanceList: Record; declare const commandName: string; +declare const currentCity: number; +declare const procRes: { + distanceList: Record, + cities: [number, string][], +} + + export default defineComponent({ components: { MapLegacyTemplate, @@ -69,10 +73,9 @@ export default defineComponent({ info?: string; } >(); - for (const [id, name] of cities) { + for (const [id, name] of procRes.cities) { citiesMap.set(id, { name }); } - console.log(citiesMap); const selectedCityID = ref(currentCity); @@ -94,7 +97,7 @@ export default defineComponent({ citiesMap: ref(citiesMap), selectedCityID, selectedCityObj: ref(undefined as MapCityParsed | undefined), - distanceList, + distanceList: procRes.distanceList, commandName, selected, submit, diff --git a/hwe/ts/processing/General/che_이동.vue b/hwe/ts/processing/General/che_이동.vue index 13ccd74a..be74fe18 100644 --- a/hwe/ts/processing/General/che_이동.vue +++ b/hwe/ts/processing/General/che_이동.vue @@ -17,7 +17,7 @@
- +
{{ commandName }} @@ -44,10 +44,12 @@ import { Args } from "@/processing/args"; import TopBackBar from "@/components/TopBackBar.vue"; import BottomBar from "@/components/BottomBar.vue"; declare const mapTheme: string; -declare const cities: [number, string][]; declare const currentCity: number; -declare const distanceList: Record; declare const commandName: string; +declare const procRes: { + distanceList: Record, + cities: [number, string][], +} export default defineComponent({ components: { MapLegacyTemplate, @@ -69,10 +71,9 @@ export default defineComponent({ info?: string; } >(); - for (const [id, name] of cities) { + for (const [id, name] of procRes.cities) { citiesMap.set(id, { name }); } - console.log(citiesMap); const selectedCityID = ref(currentCity); @@ -94,7 +95,7 @@ export default defineComponent({ citiesMap: ref(citiesMap), selectedCityID, selectedCityObj: ref(undefined as MapCityParsed | undefined), - distanceList, + distanceList: procRes.distanceList, commandName, selected, submit, diff --git a/hwe/ts/processing/General/che_출병.vue b/hwe/ts/processing/General/che_출병.vue index 2a111a5c..2489570d 100644 --- a/hwe/ts/processing/General/che_출병.vue +++ b/hwe/ts/processing/General/che_출병.vue @@ -17,7 +17,7 @@
- +
{{ commandName }} @@ -38,9 +38,11 @@ import { Args } from "@/processing/args"; import TopBackBar from "@/components/TopBackBar.vue"; import BottomBar from "@/components/BottomBar.vue"; declare const mapTheme: string; -declare const cities: [number, string][]; declare const currentCity: number; declare const commandName: string; +declare const procRes: { + cities: [number, string][], +} export default defineComponent({ components: { MapLegacyTemplate, @@ -61,10 +63,9 @@ export default defineComponent({ info?: string; } >(); - for (const [id, name] of cities) { + for (const [id, name] of procRes.cities) { citiesMap.set(id, { name }); } - console.log(citiesMap); const selectedCityID = ref(currentCity); diff --git a/hwe/ts/processing/GeneralSelect.vue b/hwe/ts/processing/GeneralSelect.vue new file mode 100644 index 00000000..d4b73b10 --- /dev/null +++ b/hwe/ts/processing/GeneralSelect.vue @@ -0,0 +1,95 @@ + + diff --git a/hwe/ts/processing/Nation/che_발령.vue b/hwe/ts/processing/Nation/che_발령.vue index f236d0f0..b7d7bcf6 100644 --- a/hwe/ts/processing/Nation/che_발령.vue +++ b/hwe/ts/processing/Nation/che_발령.vue @@ -1,7 +1,129 @@ + + diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts index 19805c88..a3e3ca23 100644 --- a/hwe/ts/processing/Nation/index.ts +++ b/hwe/ts/processing/Nation/index.ts @@ -1,2 +1,2 @@ -export * as che_발령 from "./che_발령.vue"; -export * as che_포상 from "./che_포상.vue"; \ No newline at end of file +export { default as che_발령 } from "./che_발령.vue"; +export { default as che_포상 } from "./che_포상.vue"; \ No newline at end of file diff --git a/hwe/ts/processing/processingRes.ts b/hwe/ts/processing/processingRes.ts new file mode 100644 index 00000000..ea380147 --- /dev/null +++ b/hwe/ts/processing/processingRes.ts @@ -0,0 +1,54 @@ +import { combineArray } from "@/util/combineArray"; + +export type procGeneralItem = { + no: number, + name: string, + officerLevel: number, + npc: number, + gold: number, + rice: number, + leadership: number, + strength: number, + intel: number, + cityID: number, + crew: number, + train: number, + atmos: number, + troopID: number, +} + +export type procGeneralList = procGeneralItem[]; + +export type procGeneralKeyList = [ + 'no', 'name', 'officerLevel', 'npc', 'gold', 'rice', 'leadership', 'strength', 'intel', 'cityID', 'crew', 'train', 'atmos', 'troopID' +]; + +export type procGeneralRawItem = [ + procGeneralItem[procGeneralKeyList[0]], + procGeneralItem[procGeneralKeyList[1]], + procGeneralItem[procGeneralKeyList[2]], + procGeneralItem[procGeneralKeyList[3]], + procGeneralItem[procGeneralKeyList[4]], + procGeneralItem[procGeneralKeyList[5]], + procGeneralItem[procGeneralKeyList[6]], + procGeneralItem[procGeneralKeyList[7]], + procGeneralItem[procGeneralKeyList[8]], + procGeneralItem[procGeneralKeyList[9]], + procGeneralItem[procGeneralKeyList[10]], + procGeneralItem[procGeneralKeyList[11]], + procGeneralItem[procGeneralKeyList[12]], + procGeneralItem[procGeneralKeyList[13]], +]; + +export type procTroopItem = { + troop_leader: number, + nation: number, + name: string +}; +export type procTroopList = Record; + +export type procGeneralRawItemList = procGeneralRawItem[]; + +export function convertGeneralList(keys: procGeneralKeyList, rawList: procGeneralRawItemList): procGeneralList{ + return combineArray(rawList, keys) as procGeneralList; +} \ No newline at end of file diff --git a/hwe/ts/util/combineArray.ts b/hwe/ts/util/combineArray.ts new file mode 100644 index 00000000..c247f1d8 --- /dev/null +++ b/hwe/ts/util/combineArray.ts @@ -0,0 +1,11 @@ +import { combineObject } from "../common_legacy"; + + +export function combineArray(array: V[][], columnList: K[]): Record[] { + const result: Record[] = []; + for (const key of array.keys()) { + const item = array[key]; + result[key] = combineObject(item, columnList); + } + return result; +} diff --git a/hwe/ts/v_processing.ts b/hwe/ts/v_processing.ts index 9c1ee8c7..97207454 100644 --- a/hwe/ts/v_processing.ts +++ b/hwe/ts/v_processing.ts @@ -79,13 +79,15 @@ const app: App | undefined = (function () { const moduleName = entryInfo[1]; if (!(moduleName in GeneralActions)) { console.error(`${moduleName}이 ${groupName}에 없음`); + return undefined; } return createApp(GeneralActions[moduleName]); } if (groupName == 'Nation') { const moduleName = entryInfo[1]; - if (!(moduleName in GeneralActions)) { + if (!(moduleName in NationActions)) { console.error(`${moduleName}이 ${groupName}에 없음`); + return undefined; } return createApp(NationActions[moduleName]); } @@ -95,6 +97,9 @@ const app: App | undefined = (function () { }()); if (app === undefined) { + const div = document.createElement('div'); + div.innerHTML = `모듈의 view가 없습니다. ${JSON.stringify(entryInfo)}`; + document.body.appendChild(div); console.error(`모듈이 지정되지 않음`, entryInfo); } else {