From 70e64e261ee552dbd40eb274019f528987d2530a Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 04:36:06 +0900 Subject: [PATCH 01/38] =?UTF-8?q?feat(WIP):=20processing=EC=9D=84=20vue?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/b_processing.php | 51 +--- hwe/css/processing.css | 11 - hwe/func_legacy.php | 21 ++ hwe/func_template.php | 8 + hwe/sammo/Command/BaseCommand.php | 3 + hwe/sammo/Command/General/che_강행.php | 12 +- hwe/sammo/Command/General/che_이동.php | 7 + hwe/scss/processing.scss | 37 +++ hwe/ts/build_exports.json | 5 +- hwe/ts/components/MapLegacyTemplate.vue | 130 +++++++++ hwe/ts/defaultSelectCityByMap.ts | 14 +- hwe/ts/defaultSelectNationByMap.ts | 14 +- hwe/ts/map.ts | 23 +- hwe/ts/processing.ts | 300 -------------------- hwe/ts/processing/CitiesBasedOnDistance.vue | 37 +++ hwe/ts/processing/CitySelect.vue | 89 ++++++ hwe/ts/processing/General/che_강행.vue | 98 +++++++ hwe/ts/processing/General/index.ts | 1 + hwe/ts/processing/Nation/che_발령.vue | 7 + hwe/ts/processing/Nation/che_포상.vue | 7 + hwe/ts/processing/Nation/index.ts | 2 + hwe/ts/processing/args.ts | 83 ++++++ hwe/ts/v_main.ts | 4 +- hwe/ts/v_processing.ts | 112 ++++++++ 24 files changed, 694 insertions(+), 382 deletions(-) delete mode 100644 hwe/css/processing.css create mode 100644 hwe/scss/processing.scss create mode 100644 hwe/ts/components/MapLegacyTemplate.vue delete mode 100644 hwe/ts/processing.ts create mode 100644 hwe/ts/processing/CitiesBasedOnDistance.vue create mode 100644 hwe/ts/processing/CitySelect.vue create mode 100644 hwe/ts/processing/General/che_강행.vue create mode 100644 hwe/ts/processing/General/index.ts create mode 100644 hwe/ts/processing/Nation/che_발령.vue create mode 100644 hwe/ts/processing/Nation/che_포상.vue create mode 100644 hwe/ts/processing/Nation/index.ts create mode 100644 hwe/ts/processing/args.ts create mode 100644 hwe/ts/v_processing.ts diff --git a/hwe/b_processing.php b/hwe/b_processing.php index 5a398fab..3ca90ab5 100644 --- a/hwe/b_processing.php +++ b/hwe/b_processing.php @@ -77,55 +77,30 @@ $cssList = $commandObj->getCSSFiles(); + DB::prefix(), + 'serverID' => UniqueConst::$serverID, + 'commandName' => $commandObj->getName(), + 'turnList' => $turnList, + 'currentCity' => $general->getCityID(), + 'currentNation' => $general->getNationID(), + 'entryInfo' => [$isChiefTurn?'Nation':'General', $commandType] + ])?> + exportJSVars(), false) ?> - - - - - - - + - - - - - - - -
getName() ?>
-
-
- -
- getForm() ?> -
- - - - - -
-
- -
- - +
\ No newline at end of file diff --git a/hwe/css/processing.css b/hwe/css/processing.css deleted file mode 100644 index 00f5ccb7..00000000 --- a/hwe/css/processing.css +++ /dev/null @@ -1,11 +0,0 @@ -#amount { - width: 100px; -} - -#colorType { - width: 150px; -} - -.no-padding .select2-results__option { - padding: 0; -} \ No newline at end of file diff --git a/hwe/func_legacy.php b/hwe/func_legacy.php index a5ac76e2..cb8e750c 100644 --- a/hwe/func_legacy.php +++ b/hwe/func_legacy.php @@ -52,6 +52,18 @@ function bar($per, $h = 7) return $str; } +function JSOptionsForCities(callable $infoCall = null){ + $result = []; + foreach (CityConst::all() as $city) { + $item = [$city->id, $city->name]; + + if($infoCall){ + $item[2] = $infoCall($city); + } + $result[] = $item; + } + return $result; +} function optionsForCities(callable $infoCall = null) { @@ -116,6 +128,15 @@ function closeButton() return "
"; } +function JSCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): array{ + $distanceList = searchDistance($cityNo, $maxDistance, true); + $result = []; + for ($dist = 1; $dist <= $maxDistance; $dist++) { + $result[$dist] = Util::array_get($distanceList[$dist], []); + } + return $result; +} + function printCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): string { diff --git a/hwe/func_template.php b/hwe/func_template.php index 8b029dba..6f264148 100644 --- a/hwe/func_template.php +++ b/hwe/func_template.php @@ -225,6 +225,14 @@ function formatName(string $name, int $npc): string return $name; } +function getMapTheme(): string +{ + $db = DB::db(); + $gameStor = KVStorage::getStorage($db, 'game_env'); + $mapTheme = $gameStor->map_theme ?? 'che'; + return $mapTheme; +} + function getMapHtml(?string $mapTheme = null) { $templates = new \League\Plates\Engine(__DIR__ . '/templates'); diff --git a/hwe/sammo/Command/BaseCommand.php b/hwe/sammo/Command/BaseCommand.php index 6a8a2996..b7ce2565 100644 --- a/hwe/sammo/Command/BaseCommand.php +++ b/hwe/sammo/Command/BaseCommand.php @@ -478,6 +478,9 @@ abstract class BaseCommand{ public function getJSPlugins():array { return []; } + public function exportJSVars():array { + return []; + } public function getCSSFiles():array { return []; } diff --git a/hwe/sammo/Command/General/che_강행.php b/hwe/sammo/Command/General/che_강행.php index 392698f0..602f05ef 100644 --- a/hwe/sammo/Command/General/che_강행.php +++ b/hwe/sammo/Command/General/che_강행.php @@ -12,6 +12,7 @@ use \sammo\GameUnitConst; use \sammo\LastTurn; use \sammo\Command; +use function sammo\getMapTheme; use function \sammo\printCitiesBasedOnDistance; use function sammo\tryUniqueItemLottery; @@ -176,6 +177,15 @@ class che_강행 extends Command\GeneralCommand ]; } + public function exportJSVars(): array + { + return [ + 'cities' => \sammo\JSOptionsForCities(), + 'mapTheme' => getMapTheme(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), + ]; + } + public function getForm(): string { $currentCityID = $this->generalObj->getCityID(); @@ -187,7 +197,7 @@ class che_강행 extends Command\GeneralCommand 선택된 도시로 강행합니다.
최대 3칸내 도시로만 강행이 가능합니다.
목록을 선택하거나 도시를 클릭하세요.
- =>

diff --git a/hwe/sammo/Command/General/che_이동.php b/hwe/sammo/Command/General/che_이동.php index db4fc213..acb02e98 100644 --- a/hwe/sammo/Command/General/che_이동.php +++ b/hwe/sammo/Command/General/che_이동.php @@ -184,6 +184,13 @@ class che_이동 extends Command\GeneralCommand ]; } + public function exportJSVars(): array + { + return [ + 'cities' => \sammo\JSOptionsForCities() + ]; + } + public function getForm(): string { $currentCityID = $this->generalObj->getCityID(); diff --git a/hwe/scss/processing.scss b/hwe/scss/processing.scss new file mode 100644 index 00000000..d97ababa --- /dev/null +++ b/hwe/scss/processing.scss @@ -0,0 +1,37 @@ +@import "./common/break_500px.scss"; +@import "./common/bootstrap5.scss"; +@import "./editor_component.scss"; +@import "./common_legacy.scss"; + +#amount { + width: 100px; +} + +#colorType { + width: 150px; +} + +.no-padding .select2-results__option { + padding: 0; +} + + +@include media-breakpoint-up(md) { + #container { + width: 1000px; + margin: 0 auto; + } +} + + +@include media-breakpoint-down(md) { + body { + overflow-x: hidden; + } + + #container { + width: 500px; + margin: 0 auto; + margin-bottom: 100px; + } +} diff --git a/hwe/ts/build_exports.json b/hwe/ts/build_exports.json index d681655e..00a3bd8a 100644 --- a/hwe/ts/build_exports.json +++ b/hwe/ts/build_exports.json @@ -7,7 +7,6 @@ "install": "install.ts", "battle_simulator": "battle_simulator.ts", "recent_map": "recent_map.ts", - "processing": "processing.ts", "select_npc": "select_npc.ts", "betting": "betting.ts", "bossInfo": "bossInfo.ts", @@ -27,7 +26,7 @@ "v_NPCControl": "v_NPCControl.ts", "v_join": "v_join.ts", "v_main": "v_main.ts", - "v_dipcenter": "v_dipcenter.ts" - + "v_dipcenter": "v_dipcenter.ts", + "v_processing": "v_processing.ts" } } \ No newline at end of file diff --git a/hwe/ts/components/MapLegacyTemplate.vue b/hwe/ts/components/MapLegacyTemplate.vue new file mode 100644 index 00000000..762351ff --- /dev/null +++ b/hwe/ts/components/MapLegacyTemplate.vue @@ -0,0 +1,130 @@ + + diff --git a/hwe/ts/defaultSelectCityByMap.ts b/hwe/ts/defaultSelectCityByMap.ts index 15facc51..a3f5078e 100644 --- a/hwe/ts/defaultSelectCityByMap.ts +++ b/hwe/ts/defaultSelectCityByMap.ts @@ -1,21 +1,19 @@ import { reloadWorldMap } from "@/map"; -import { unwrap_any } from "@util/unwrap_any"; + +declare let vueReactive_destCityID: number|undefined; export function defaultSelectCityByMap(): void { - const $target = $("#destCityID"); - console.log('city', $target); void reloadWorldMap({ isDetailMap: false, clickableAll: true, neutralView: true, useCachedMap: true, selectCallback: function (city) { - const currVal = unwrap_any($target.val()); - $target.val(city.id); - $target.trigger("change"); - if ($target.val() === null) { - $target.val(currVal).trigger("change").blur(); + if(vueReactive_destCityID === undefined){ + console.error('아직 초기화 되지 않음'); + return false; } + vueReactive_destCityID = city.id; return false; } }); diff --git a/hwe/ts/defaultSelectNationByMap.ts b/hwe/ts/defaultSelectNationByMap.ts index 21ed28d3..0a3c953a 100644 --- a/hwe/ts/defaultSelectNationByMap.ts +++ b/hwe/ts/defaultSelectNationByMap.ts @@ -1,5 +1,6 @@ import { reloadWorldMap } from "@/map"; -import { unwrap_any } from "@util/unwrap_any"; + +declare let vueReactive_destNationID: number|undefined; export function defaultSelectNationByMap(): void{ const $target = $("#destNationID"); @@ -9,15 +10,12 @@ export function defaultSelectNationByMap(): void{ clickableAll: true, neutralView: true, useCachedMap: true, - selectCallback: (city)=>{ - const currVal = unwrap_any($target.val()); - if(!city.nationID){ + selectCallback: function (city) { + if(typeof vueReactive_destNationID === 'undefined'){ + console.error('아직 초기화 되지 않음'); return false; } - $target.val(city.nationID).trigger("change"); - if ($target.val() === null) { - $target.val(currVal).trigger("change"); - } + vueReactive_destNationID = city.nationID; return false; } }); diff --git a/hwe/ts/map.ts b/hwe/ts/map.ts index 751fbde7..d89eb76d 100644 --- a/hwe/ts/map.ts +++ b/hwe/ts/map.ts @@ -1,11 +1,12 @@ import axios from 'axios'; import $ from 'jquery'; -import { extend, isNumber } from 'lodash'; +import { extend, isNumber, merge } from 'lodash'; import { convColorValue, convertDictById, stringFormat } from '@/common_legacy'; import { InvalidResponse } from '@/defs'; import { unwrap } from "@util/unwrap"; import { convertFormData } from '@util/convertFormData'; import { exportWindow } from '@util/exportWindow'; +import { htmlReady } from './util/htmlReady'; declare const serverNick: string; declare const serverID: string; @@ -57,7 +58,7 @@ type MapCityParsedRegionLevelText = MapCityParsedClickable & { text: string, } -type MapCityParsed = MapCityParsedRegionLevelText; +export type MapCityParsed = MapCityParsedRegionLevelText; type MapCityDrawable = { cityList: MapCityParsed[], @@ -107,7 +108,7 @@ function is_touch_device(): boolean { return mq(query); } -type loadMapOption = { +export type loadMapOption = { isDetailMap?: boolean, //복잡 지도, 단순 지도 clickableAll?: boolean, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도. selectCallback?: (city: MapCityParsed) => void, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행. @@ -160,7 +161,7 @@ export async function reloadWorldMap(option: loadMapOption, drawTarget = '.world startYear: undefined, }; - option = extend({}, defaultOption, option); + option = merge({}, defaultOption, option); const useCachedMap = option.useCachedMap; const isDetailMap = option.isDetailMap; @@ -671,7 +672,6 @@ export async function reloadWorldMap(option: loadMapOption, drawTarget = '.world const $hideCityNameBtn = $world_map.find('.map_toggle_cityname'); if (localStorage.getItem('sam.hideMapCityName') == 'yes') { - console.log('tryHide!'); $world_map.addClass('hide_cityname'); $hideCityNameBtn.addClass('active').attr('aria-pressed', 'true'); } @@ -680,7 +680,6 @@ export async function reloadWorldMap(option: loadMapOption, drawTarget = '.world //이전 상태 확인 const state = localStorage.getItem('sam.hideMapCityName') == 'no'; if (state) { - console.log('tryHide!'); $world_map.addClass('hide_cityname'); localStorage.setItem('sam.hideMapCityName', 'yes'); } else { @@ -789,8 +788,12 @@ export async function reloadWorldMap(option: loadMapOption, drawTarget = '.world } exportWindow(reloadWorldMap, 'reloadWorldMap'); -$(function ($) { - if (is_touch_device()) { - $('.map_body .map_toggle_single_tap').show(); +htmlReady(function(){ + if( is_touch_device()){ + const target = document.querySelector('.map_body .map_toggle_single_tap') as HTMLElement | null; + if(!target){ + return; + } + target.style.display = 'block'; } -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/hwe/ts/processing.ts b/hwe/ts/processing.ts deleted file mode 100644 index a43a0b50..00000000 --- a/hwe/ts/processing.ts +++ /dev/null @@ -1,300 +0,0 @@ -import $ from 'jquery'; -exportWindow($, '$'); -import { exportWindow } from '@util/exportWindow'; -import axios from 'axios'; -import 'bootstrap'; -import 'select2/dist/js/select2.full.js' -import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; -import { convertFormData } from '@util/convertFormData'; -import { InvalidResponse } from '@/defs'; -import { unwrap_any } from '@util/unwrap_any'; -import { DataFormat, IdTextPair, OptionData } from 'select2'; -import { unwrap } from "@util/unwrap"; -import { defaultSelectCityByMap } from '@/defaultSelectCityByMap'; -import { defaultSelectNationByMap } from '@/defaultSelectNationByMap'; -import { colorSelect } from '@/colorSelect'; -import { recruitCrewForm } from '@/recruitCrewForm'; - -declare const isChiefTurn: boolean; -declare const jsPlugins: string[]; - -declare global { - interface Window { - submitAction: () => Promise; - turnList: number[], - command: string, - } -} - -async function reserveTurn(turnList: number[], command: string, arg: Record) { - const target = isChiefTurn ? 'j_set_chief_command.php' : 'j_set_general_command.php'; - - let data: InvalidResponse; - try { - const response = await axios({ - url: target, - responseType: 'json', - method: 'post', - data: convertFormData({ - action: command, - turnList: turnList, - arg: JSON.stringify(arg) - }) - }); - data = response.data; - } - catch (e) { - console.error(e); - alert(`에러가 발생했습니다: ${e}`); - return; - } - - if (!data.result) { - alert(data.reason); - return; - } - - if (!isChiefTurn) { - window.location.href = './'; - } else { - window.location.href = 'b_chiefcenter.php'; - } -} - -$(function ($) { - setAxiosXMLHttpRequest(); - //checkCommandArg 참고 - const availableArgumentList = { - 'string': [ - 'nationName', 'optionText', 'itemType', 'nationType', 'itemCode', 'commandType', - ], - 'int': [ - 'crewType', 'destGeneralID', 'destCityID', 'destNationID', - 'amount', 'colorType', - 'year', 'month', - 'srcArmType', 'destArmType', //숙련전환 전용 - ], - 'boolean': [ - 'isGold', 'buyRice', - ], - 'integerArray': [ - 'destNationIDList', 'destGeneralIDList', 'amountList' - ] - } - - type argTypes = keyof typeof availableArgumentList; - type argValues = string | number | boolean | number[]; - - const handlerList: Record) => argValues> = { - 'string': function ($obj: JQuery) { - return $.trim(unwrap_any($obj.eq(0).val())); - }, - 'int': function ($obj: JQuery) { - return parseInt(unwrap_any($obj.eq(0).val())); - }, - 'boolean': function ($obj: JQuery) { - switch (unwrap_any($obj.eq(0).val()).toLowerCase()) { - case "true": - case "yes": - case "1": - return true; - case "false": - case "no": - case "0": - return false; - default: - throw new Error("Boolean.parse: Cannot convert string to boolean."); - } - }, - 'integerArray': function ($obj: JQuery) { - const result: number[] = []; - $obj.each(function () { - result.push(parseInt(unwrap_any($(this).val()))); - }); - return result; - } - } - - window.submitAction = async function (): Promise { - const argument: Record = {}; - for (const typeName of Object.keys(availableArgumentList) as argTypes[]) { - const typeKeys = availableArgumentList[typeName]; - for (const typeKey of typeKeys) { - let $obj = $('#' + typeKey) as JQuery; - if ($obj.length == 0) { - $obj = $('.' + typeKey); - if ($obj.length == 0) { - continue; - } - } - - argument[typeKey] = handlerList[typeName]($obj); - } - } - - console.log(argument); - await reserveTurn(window.turnList, window.command, argument); - }; - - $('#commonSubmit').on('click', window.submitAction); - - const $colorType = $('#colorType'); - if ($colorType.length) { - $colorType.select2({ - theme: 'bootstrap4', - placeholder: "색상을 선택해 주세요.", - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - templateSelection: function (item) { - if ((item as DataFormat).disabled) { - return item.text; - } - const element = (item as OptionData).element; - if (!element) { - throw 'invalid type'; - } - const bgcolor = unwrap(element.dataset.color); - const fgcolor = unwrap(element.dataset.fontColor); - // eslint-disable-next-line no-irregular-whitespace - return $(`  ${item.text}`); - }, - templateResult: function (item) { - if ((item as DataFormat).disabled) { - return item.text; - } - const element = (item as OptionData).element; - if (!element) { - throw 'invalid type'; - } - const bgcolor = unwrap(element.dataset.color); - const fgcolor = unwrap(element.dataset.fontColor); - return $(`
${item.text}
`); - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'no-padding simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $nationType = $('#nationType'); - if ($nationType.length) { - $nationType.select2({ - theme: 'bootstrap4', - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $destCityID = $('#destCityID'); - if ($destCityID.length) { - $destCityID.select2({ - theme: 'bootstrap4', - placeholder: "도시를 선택해 주세요.", - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $destNationID = $('#destNationID'); - if ($destNationID.length) { - $destNationID.select2({ - theme: 'bootstrap4', - placeholder: "국가를 선택해 주세요.", - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $destGeneralID = $('#destGeneralID'); - if ($destGeneralID.length) { - $destGeneralID.select2({ - theme: 'bootstrap4', - placeholder: "장수를 선택해 주세요.", - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $isGold = $('#isGold'); - if ($isGold.length) { - $isGold.select2({ - theme: 'bootstrap4', - placeholder: "분량을 지정해 주세요.", - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - minimumResultsForSearch: -1, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', - }); - } - - const $amount = $('#amount:not([type=hidden])'); - if ($amount.length) { - $amount.select2({ - theme: 'bootstrap4', - placeholder: "분량을 지정해 주세요.", - allowClear: false, - language: "ko", - containerCss: { - display: "inline-block !important", - color: 'white !important', - }, - tags: true, - sorter: function (items) { - (items as IdTextPair[]).sort(function (lhs, rhs) { - return parseInt(lhs.id) - parseInt(rhs.id); - }) - return items; - }, - containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', - dropdownCssClass: 'select2-only-number simple-select2-align-center bg-secondary text-secondary', - }) - } - - $(document).on('keypress', '.select2-only-number .select2-search__field', function (e) { - $(this).val(unwrap_any($(this).val()).replace(/[^\d].+/, "")); - if ((e.which < 48 || e.which > 57)) { - e.preventDefault(); - } - }); - - const pluginMap:Recordvoid> = { - 'defaultSelectCityByMap': defaultSelectCityByMap, - 'defaultSelectNationByMap': defaultSelectNationByMap, - 'colorSelect': colorSelect, - 'recruitCrewForm': recruitCrewForm, - }; - for (const jsPlugin of jsPlugins) { - if (jsPlugin in pluginMap) { - pluginMap[jsPlugin]() - } - else{ - console.error(`'${jsPlugin}' is not supported`); - } - } -}); \ No newline at end of file diff --git a/hwe/ts/processing/CitiesBasedOnDistance.vue b/hwe/ts/processing/CitiesBasedOnDistance.vue new file mode 100644 index 00000000..89a52a13 --- /dev/null +++ b/hwe/ts/processing/CitiesBasedOnDistance.vue @@ -0,0 +1,37 @@ + + diff --git a/hwe/ts/processing/CitySelect.vue b/hwe/ts/processing/CitySelect.vue new file mode 100644 index 00000000..3f6e62fe --- /dev/null +++ b/hwe/ts/processing/CitySelect.vue @@ -0,0 +1,89 @@ + + diff --git a/hwe/ts/processing/General/che_강행.vue b/hwe/ts/processing/General/che_강행.vue new file mode 100644 index 00000000..ff83253e --- /dev/null +++ b/hwe/ts/processing/General/che_강행.vue @@ -0,0 +1,98 @@ + + + diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts new file mode 100644 index 00000000..03de46d6 --- /dev/null +++ b/hwe/ts/processing/General/index.ts @@ -0,0 +1 @@ +export { default as che_강행 } from "./che_강행.vue"; \ No newline at end of file diff --git a/hwe/ts/processing/Nation/che_발령.vue b/hwe/ts/processing/Nation/che_발령.vue new file mode 100644 index 00000000..f236d0f0 --- /dev/null +++ b/hwe/ts/processing/Nation/che_발령.vue @@ -0,0 +1,7 @@ + diff --git a/hwe/ts/processing/Nation/che_포상.vue b/hwe/ts/processing/Nation/che_포상.vue new file mode 100644 index 00000000..f236d0f0 --- /dev/null +++ b/hwe/ts/processing/Nation/che_포상.vue @@ -0,0 +1,7 @@ + diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts new file mode 100644 index 00000000..19805c88 --- /dev/null +++ b/hwe/ts/processing/Nation/index.ts @@ -0,0 +1,2 @@ +export * as che_발령 from "./che_발령.vue"; +export * as che_포상 from "./che_포상.vue"; \ No newline at end of file diff --git a/hwe/ts/processing/args.ts b/hwe/ts/processing/args.ts new file mode 100644 index 00000000..782e29bc --- /dev/null +++ b/hwe/ts/processing/args.ts @@ -0,0 +1,83 @@ +import { isArray, isBoolean, isInteger, isString } from "lodash"; + + +const stringArgs = [ + 'nationName', 'optionText', 'itemType', 'nationType', 'itemCode', 'commandType', +] as const; +const intArgs = [ + 'crewType', 'destGeneralID', 'destCityID', 'destNationID', + 'amount', 'colorType', + 'year', 'month', + 'srcArmType', 'destArmType', //숙련전환 전용 +] as const; + +const booleanArgs = [ + 'isGold', 'buyRice', +] as const; + +const integerArrayArgs = [ + 'destNationIDList', 'destGeneralIDList', 'amountList' +] as const; + +type StringKeys = typeof stringArgs[number]; +type IntKeys = typeof intArgs[number]; +type BooleanKeys = typeof booleanArgs[number]; +type IntegerArrayKeys = typeof integerArrayArgs[number]; + + +export type Args = { + [key in StringKeys]?: string; +} & { + [key in IntKeys]?: number; + } & { + [key in BooleanKeys]?: boolean; + } & { + [key in IntegerArrayKeys]?: number[] + }; + + + +export function testSubmitArgs(args: Args): true | ['int' | 'string' | 'boolean' | 'int[]', keyof Args, number | string | boolean | number[]] { + for (const intKey of intArgs) { + const testVal = args[intKey]; + if (testVal === undefined) { + continue; + } + if (!isInteger(testVal)) { + return ['int', intKey, testVal]; + } + } + for (const stringKey of stringArgs) { + const testVal = args[stringKey]; + if (testVal === undefined) { + continue; + } + if (!isString(testVal)) { + return ['string', stringKey, testVal]; + } + } + for (const booleanKey of booleanArgs) { + const testVal = args[booleanKey]; + if (testVal === undefined) { + continue; + } + if (!isBoolean(testVal)) { + return ['boolean', booleanKey, testVal]; + } + } + for (const integerArrayKey of integerArrayArgs) { + const testVal = args[integerArrayKey]; + if (testVal === undefined) { + continue; + } + if (!isArray(args[integerArrayKey])) { + return ['int[]', integerArrayKey, testVal]; + } + for (const value of testVal) { + if (!isInteger(value)) { + return ['int[]', integerArrayKey, testVal]; + } + } + } + return true; +} diff --git a/hwe/ts/v_main.ts b/hwe/ts/v_main.ts index 83b6f15a..6496f677 100644 --- a/hwe/ts/v_main.ts +++ b/hwe/ts/v_main.ts @@ -15,7 +15,5 @@ import "@/legacy/main"; import { auto500px } from './util/auto500px'; setAxiosXMLHttpRequest(); - +auto500px(); createApp(PartialReservedCommand).use(BootstrapVue3).component('v-multiselect', Multiselect).mount('#reservedCommandList'); - -auto500px(); \ No newline at end of file diff --git a/hwe/ts/v_processing.ts b/hwe/ts/v_processing.ts new file mode 100644 index 00000000..2cbe54e2 --- /dev/null +++ b/hwe/ts/v_processing.ts @@ -0,0 +1,112 @@ +import '@scss/processing.scss'; + +import $ from 'jquery'; +exportWindow($, '$'); +import { exportWindow } from '@util/exportWindow'; +import axios from 'axios'; +import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; +import { convertFormData } from '@util/convertFormData'; +import { InvalidResponse } from '@/defs'; +import { unwrap } from "@util/unwrap"; +import { defaultSelectCityByMap } from '@/defaultSelectCityByMap'; +import { defaultSelectNationByMap } from '@/defaultSelectNationByMap'; +import { colorSelect } from '@/colorSelect'; +import { recruitCrewForm } from '@/recruitCrewForm'; +import BootstrapVue3 from 'bootstrap-vue-3' +import Multiselect from 'vue-multiselect'; +import * as GeneralActions from "@/processing/General"; +import * as NationActions from "@/processing/Nation"; +import { App, createApp } from 'vue'; +import { auto500px } from './util/auto500px'; +import { isString } from 'lodash'; +import { Args, testSubmitArgs } from './processing/args'; + +declare const turnList: number[]; + +setAxiosXMLHttpRequest(); + +async function submitCommand(isChiefTurn: boolean, turnList: number[], command: string, args: Args): Promise { + + + const target = isChiefTurn ? 'j_set_chief_command.php' : 'j_set_general_command.php'; + + try { + const testResult = testSubmitArgs(args); + if (testResult !== true) { + throw new TypeError(`Invalied Type ${testResult[0]}, ${testResult[2]} should be ${testResult[1]}`); + } + console.log('trySubmit', args); + const response = await axios({ + url: target, + responseType: 'json', + method: 'post', + data: convertFormData({ + action: command, + turnList: turnList, + arg: JSON.stringify(args) + }) + }); + const data = response.data as InvalidResponse; + if (!data.result) { + throw data.reason; + } + + if (!isChiefTurn) { + window.location.href = './'; + } else { + window.location.href = 'b_chiefcenter.php'; + } + + return data as unknown as T; + } + catch (e) { + console.error(e); + if (isString(e)) { + alert(e); + } + throw e; + } +} + + + +declare const entryInfo: ['General', keyof typeof GeneralActions] | ['Nation', keyof typeof NationActions]; + +console.log('entry', entryInfo); + +auto500px(); +const app: App | undefined = (function () { + //NOTE: route를 쓴다? + const groupName = entryInfo[0]; + if (groupName == 'General') { + const moduleName = entryInfo[1]; + if (!(moduleName in GeneralActions)) { + console.error(`${moduleName}이 ${groupName}에 없음`); + } + return createApp(GeneralActions[moduleName]); + } + if (groupName == 'Nation') { + const moduleName = entryInfo[1]; + if (!(moduleName in GeneralActions)) { + console.error(`${moduleName}이 ${groupName}에 없음`); + } + return createApp(NationActions[moduleName]); + } + + console.error('알수') + return undefined; +}()); +console.log(app); +if (app === undefined) { + console.error(`모듈이 지정되지 않음`, entryInfo); +} +else { + + const div = unwrap(document.querySelector('#container')); + div.addEventListener('customSubmit', (e: Event) => { + const {detail} = e as unknown as CustomEvent; + void submitCommand(entryInfo[0] == 'Nation', turnList, entryInfo[1], detail); + }, true); + + app.use(BootstrapVue3).component('v-multiselect', Multiselect).mount('#container'); +} From 25332f272880c7c355519ac4900eabc5487f1f3c Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 05:02:47 +0900 Subject: [PATCH 02/38] =?UTF-8?q?feat(WIP):=20processing=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .phan/config.php | 2 +- hwe/sammo/Command/BaseCommand.php | 9 -- hwe/sammo/Command/General/che_강행.php | 30 +----- hwe/sammo/Command/General/che_이동.php | 12 +-- hwe/scss/processing.scss | 21 ++++- hwe/ts/PartialReservedCommand.vue | 2 +- hwe/ts/chiefCenter.ts | 2 +- hwe/ts/components/BottomBar.vue | 17 ++-- hwe/ts/components/MapLegacyTemplate.vue | 1 + hwe/ts/map.ts | 6 +- hwe/ts/processing/General/che_강행.vue | 58 ++++++------ hwe/ts/processing/General/che_이동.vue | 104 +++++++++++++++++++++ hwe/ts/processing/General/index.ts | 3 +- hwe/ts/v_processing.ts | 8 +- hwe/{b_processing.php => v_processing.php} | 7 +- 15 files changed, 182 insertions(+), 100 deletions(-) create mode 100644 hwe/ts/processing/General/che_이동.vue rename hwe/{b_processing.php => v_processing.php} (91%) diff --git a/.phan/config.php b/.phan/config.php index b6a5feea..5639e603 100644 --- a/.phan/config.php +++ b/.phan/config.php @@ -60,7 +60,7 @@ return [ 'hwe/b_myGenInfo.php', 'hwe/b_myKingdomInfo.php', 'hwe/b_myPage.php', - 'hwe/b_processing.php', + 'hwe/v_processing.php', 'hwe/b_tournament.php', 'hwe/b_troop.php', 'hwe/c_auction.php', diff --git a/hwe/sammo/Command/BaseCommand.php b/hwe/sammo/Command/BaseCommand.php index b7ce2565..469d07be 100644 --- a/hwe/sammo/Command/BaseCommand.php +++ b/hwe/sammo/Command/BaseCommand.php @@ -475,18 +475,9 @@ abstract class BaseCommand{ abstract public function run():bool; - public function getJSPlugins():array { - return []; - } public function exportJSVars():array { return []; } - public function getCSSFiles():array { - return []; - } - public function getForm():string{ - throw new \sammo\MustNotBeReachedException(); - } public function getLastTurn():LastTurn{ return $this->generalObj->getLastTurn(); diff --git a/hwe/sammo/Command/General/che_강행.php b/hwe/sammo/Command/General/che_강행.php index 602f05ef..2c6b035a 100644 --- a/hwe/sammo/Command/General/che_강행.php +++ b/hwe/sammo/Command/General/che_강행.php @@ -170,13 +170,6 @@ class che_강행 extends Command\GeneralCommand return true; } - public function getJSPlugins(): array - { - return [ - 'defaultSelectCityByMap' - ]; - } - public function exportJSVars(): array { return [ @@ -185,25 +178,4 @@ class che_강행 extends Command\GeneralCommand 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), ]; } - - public function getForm(): string - { - $currentCityID = $this->generalObj->getCityID(); - $currentCityName = CityConst::byID($currentCityID)->name; - - ob_start(); -?> -
- 선택된 도시로 강행합니다.
- 최대 3칸내 도시로만 강행이 가능합니다.
- 목록을 선택하거나 도시를 클릭하세요.
- =>

-
-
-
-
- - \sammo\JSOptionsForCities() + 'cities' => \sammo\JSOptionsForCities(), + 'mapTheme' => getMapTheme(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 1), ]; } diff --git a/hwe/scss/processing.scss b/hwe/scss/processing.scss index d97ababa..e61818f1 100644 --- a/hwe/scss/processing.scss +++ b/hwe/scss/processing.scss @@ -32,6 +32,23 @@ #container { width: 500px; margin: 0 auto; - margin-bottom: 100px; + + .world_map { + width: 500px; + height: calc((500px + 20px) * 500 / 700); + } + + .map_title { + transform-origin: 0px 0px; + transform: scale(calc(500 / 700)); + margin-bottom: calc(-20px * 200 / 700); + } + + .map_body { + transform-origin: 0px 0px; + transform: scale(calc(500 / 700)); + } } -} + + +} \ No newline at end of file diff --git a/hwe/ts/PartialReservedCommand.vue b/hwe/ts/PartialReservedCommand.vue index 35dab1eb..380a3c98 100644 --- a/hwe/ts/PartialReservedCommand.vue +++ b/hwe/ts/PartialReservedCommand.vue @@ -449,7 +449,7 @@ export default defineComponent({ if (listReqArgCommand.has(commandName)) { document.location.href = stringifyUrl({ - url: "b_processing.php", + url: "v_processing.php", query: { command: commandName, turnList: turnList.join("_"), diff --git a/hwe/ts/chiefCenter.ts b/hwe/ts/chiefCenter.ts index c9a3d8cc..83e8a98d 100644 --- a/hwe/ts/chiefCenter.ts +++ b/hwe/ts/chiefCenter.ts @@ -237,7 +237,7 @@ $(function ($) { const $command = $('#chiefCommandList option:selected'); if ($command.data('reqarg')) { document.location.href = stringifyUrl({ - url: 'b_processing.php', + url: 'v_processing.php', query: { command: unwrap_any($command.val()), turnList: turnList.join('_'), diff --git a/hwe/ts/components/BottomBar.vue b/hwe/ts/components/BottomBar.vue index 37058fe3..68c85a72 100644 --- a/hwe/ts/components/BottomBar.vue +++ b/hwe/ts/components/BottomBar.vue @@ -1,15 +1,10 @@ diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index 03de46d6..8d1d5e1c 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -1 +1,2 @@ -export { default 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/v_processing.ts b/hwe/ts/v_processing.ts index 2cbe54e2..9c1ee8c7 100644 --- a/hwe/ts/v_processing.ts +++ b/hwe/ts/v_processing.ts @@ -72,9 +72,6 @@ async function submitCommand(isChiefTurn: boolean, turnList: number[], comman declare const entryInfo: ['General', keyof typeof GeneralActions] | ['Nation', keyof typeof NationActions]; -console.log('entry', entryInfo); - -auto500px(); const app: App | undefined = (function () { //NOTE: route를 쓴다? const groupName = entryInfo[0]; @@ -96,7 +93,7 @@ const app: App | undefined = (function () { console.error('알수') return undefined; }()); -console.log(app); + if (app === undefined) { console.error(`모듈이 지정되지 않음`, entryInfo); } @@ -110,3 +107,6 @@ else { app.use(BootstrapVue3).component('v-multiselect', Multiselect).mount('#container'); } + + +auto500px(); \ No newline at end of file diff --git a/hwe/b_processing.php b/hwe/v_processing.php similarity index 91% rename from hwe/b_processing.php rename to hwe/v_processing.php index 3ca90ab5..1fd72a27 100644 --- a/hwe/b_processing.php +++ b/hwe/v_processing.php @@ -63,8 +63,6 @@ if (!$commandObj->hasPermissionToReserve()) { die_redirect(); } -$jsList = $commandObj->getJSPlugins(); -$cssList = $commandObj->getCSSFiles(); ?> @@ -74,7 +72,7 @@ $cssList = $commandObj->getCSSFiles(); <?= $commandObj->getName() ?> - + getCSSFiles(); 'entryInfo' => [$isChiefTurn?'Nation':'General', $commandType] ])?> exportJSVars(), false) ?> - Date: Sat, 18 Dec 2021 05:08:53 +0900 Subject: [PATCH 03/38] =?UTF-8?q?feat(WIP):=20processing=20=EC=B6=9C?= =?UTF-8?q?=EB=B3=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_이동.php | 21 ------ hwe/sammo/Command/General/che_출병.php | 22 +----- hwe/ts/map.ts | 3 +- hwe/ts/processing/General/che_출병.vue | 95 ++++++++++++++++++++++++++ hwe/ts/processing/General/index.ts | 3 +- 5 files changed, 102 insertions(+), 42 deletions(-) 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 index 4af17d41..92a60d5f 100644 --- a/hwe/sammo/Command/General/che_이동.php +++ b/hwe/sammo/Command/General/che_이동.php @@ -186,25 +186,4 @@ class che_이동 extends Command\GeneralCommand 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 1), ]; } - - public function getForm(): string - { - $currentCityID = $this->generalObj->getCityID(); - $currentCityName = CityConst::byID($currentCityID)->name; - - ob_start(); -?> -
- 선택된 도시로 이동합니다.
- 인접 도시로만 이동이 가능합니다.
- 목록을 선택하거나 도시를 클릭하세요.
- =>
-
-
- - \sammo\JSOptionsForCities(), + 'mapTheme' => \sammo\getMapTheme(), ]; } - - public function getForm(): string - { - $srcCityName = \sammo\CityConst::byID($this->generalObj->getCityID())->name; - ob_start(); -?> -
- 선택된 도시를 향해 침공을 합니다.
- 침공 경로에 적군의 도시가 있다면 전투를 벌입니다.
- 목록을 선택하거나 도시를 클릭하세요.
- =>
-
- + +
+ + +
+ 선택된 도시를 향해 침공을 합니다.
+ 침공 경로에 적군의 도시가 있다면 전투를 벌입니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+
+ +
+
+ {{ commandName }} +
+
+
+ + + + diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index 8d1d5e1c..c7514e1b 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -1,2 +1,3 @@ export { default as che_강행 } from "./che_강행.vue"; -export { default 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 From 3ef5c2aa6dc916d00f3e583655cb9a637c8ded37 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 14:16:51 +0900 Subject: [PATCH 04/38] =?UTF-8?q?fix:=20MapLeagcyTemplate=20warning=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/ts/components/MapLegacyTemplate.vue | 29 ++++++++++++++----------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/hwe/ts/components/MapLegacyTemplate.vue b/hwe/ts/components/MapLegacyTemplate.vue index a2a099c7..0da09524 100644 --- a/hwe/ts/components/MapLegacyTemplate.vue +++ b/hwe/ts/components/MapLegacyTemplate.vue @@ -55,32 +55,36 @@ export default defineComponent({ type: String, required: true, }, - isDetailMap: { type: Boolean, default: undefined }, - clickableAll: { type: Boolean, default: undefined }, + isDetailMap: { type: Boolean, default: undefined, required: false }, + clickableAll: { type: Boolean, default: undefined, required: false }, selectCallback: { type: Function as PropType, required: false, }, - hrefTemplate: { type: String, default: undefined }, - useCachedMap: { type: Boolean, default: undefined }, + hrefTemplate: { type: String, default: undefined, required: false }, + useCachedMap: { type: Boolean, default: undefined, required: false }, - year: { type: Number, default: undefined }, - month: { type: Number, default: undefined }, - aux: Object as PropType, - neutralView: { type: Boolean, default: undefined }, - showMe: { type: Boolean, default: undefined }, + year: { type: Number, default: undefined, required: false }, + month: { type: Number, default: undefined, required: false }, + aux: { + type: Object as PropType, + default: undefined, + required: false, + }, + neutralView: { type: Boolean, default: undefined, required: false }, + showMe: { type: Boolean, default: undefined, required: false }, - targetJson: { type: String, default: undefined }, + targetJson: { type: String, default: undefined, required: false }, reqType: { type: String as PropType, default: undefined, }, - dynamicMapTheme: { type: Boolean, default: undefined }, + dynamicMapTheme: { type: Boolean, default: undefined, required: false }, callback: { type: Function as PropType, default: undefined, }, - startYear: { type: Number, default: undefined }, + startYear: { type: Number, default: undefined, required: false }, modelValue: { type: Object as PropType, @@ -119,7 +123,6 @@ export default defineComponent({ startYear: props.startYear, }; - console.log(option); await reloadWorldMap(option, `#${uuid}`); }); From 03993052a36d6e1d4591b5352dac52fbad16a6c4 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 16:00:53 +0900 Subject: [PATCH 05/38] =?UTF-8?q?feat(WIP):=20processing,=20=EC=B6=9C?= =?UTF-8?q?=EB=B3=91=20=EC=B6=94=EA=B0=80=20-=20=EC=9E=A5=EC=88=98=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EA=B8=B0=20=EC=B6=94=EA=B0=80=20-=20v-model?= =?UTF-8?q?=20=EC=95=88=20=EC=93=B0=EB=8A=94=20=EB=B0=94=EB=B3=B4=EC=A7=93?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20-=20proc=20=EC=A0=84=EC=97=AD=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=A5=BC=20procRes=EB=A1=9C=20=EB=AC=B6?= =?UTF-8?q?=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_강행.php | 8 +- hwe/sammo/Command/General/che_이동.php | 8 +- hwe/sammo/Command/General/che_출병.php | 4 +- hwe/sammo/Command/Nation/che_발령.php | 123 +++++++++++++++--------- hwe/ts/battle_simulator.ts | 3 +- hwe/ts/common_legacy.ts | 10 -- hwe/ts/processing/CitySelect.vue | 3 +- hwe/ts/processing/General/che_강행.vue | 17 ++-- hwe/ts/processing/General/che_이동.vue | 13 +-- hwe/ts/processing/General/che_출병.vue | 9 +- hwe/ts/processing/GeneralSelect.vue | 95 +++++++++++++++++++ hwe/ts/processing/Nation/che_발령.vue | 126 ++++++++++++++++++++++++- hwe/ts/processing/Nation/index.ts | 4 +- hwe/ts/processing/processingRes.ts | 54 +++++++++++ hwe/ts/util/combineArray.ts | 11 +++ hwe/ts/v_processing.ts | 7 +- 16 files changed, 407 insertions(+), 88 deletions(-) create mode 100644 hwe/ts/processing/GeneralSelect.vue create mode 100644 hwe/ts/processing/processingRes.ts create mode 100644 hwe/ts/util/combineArray.ts 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 { From 36c37e97e0055c9bf8eac2c9cf8628f6c9cdc8b6 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 17:33:54 +0900 Subject: [PATCH 06/38] feat: typescript JosaUtil --- .gitignore | 2 +- hwe/ts/util/JosaUtil.ts | 586 +++++++++++++++++++++++++++++ package.json | 4 +- src/sammo/JosaUtil.php | 793 ++++++++++++++++++++-------------------- 4 files changed, 987 insertions(+), 398 deletions(-) create mode 100644 hwe/ts/util/JosaUtil.ts diff --git a/.gitignore b/.gitignore index 939a77b4..36bf6a43 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,7 @@ d_setting/*.php */data/file_cache **/old/* -test.php +test.* /che /kwe diff --git a/hwe/ts/util/JosaUtil.ts b/hwe/ts/util/JosaUtil.ts new file mode 100644 index 00000000..a707ef6b --- /dev/null +++ b/hwe/ts/util/JosaUtil.ts @@ -0,0 +1,586 @@ +import { unwrap_err } from "./unwrap_err"; + +// https://github.com/coxcore/postposition 의 php 버전을 다시 typescript로 재 작성 +const KO_START_CODE = 44032; +const KO_FINISH_CODE = 55203; +const HANJA_START_CODE = 0x4e00; +const HANJA_FINISH_CODE = 0xfa0b; +const REG_INVALID_CHAR_W_HANJA = /[^a-zA-Z0-9ㄱ-ㅎ가-힣一-廓\s]+/u; +const REG_INVALID_CHAR = /[^a-zA-Z0-9ㄱ-ㅎ가-힣\s]+/u; +const REG_TARGET_CHAR = /^[\s\S]*?(\S*)\s*$/u; + +const PRE_REG_NORMAL_FIXED = [ + "check|[hm]ook|limit", +]; +const PRE_REG_SPECIAL_CHAR = [ + "[ㄱ-ㄷㅁ-ㅎ]", + "^[036]", + "[^a-zA-Z][036]", + "[a-zA-Z]9", + "^[mn]", + "\\S[mn]e?", + "\\S(?:[aeiom]|lu)b", + "(?:u|\\S[aei]|[^o]o)p", + "(?:^i|[^auh]i|\\Su|[^ei][ae]|[^oi]o)t", + "(?:\\S[iou]|[^e][ae])c?k", + "\\S[aeiou](?:c|ng)", + "foot|go+d|b[ai]g|private", + "^(?:app|kor)", +]; +const PRE_REG_SPECIAL_RO = [ + "[178ㄹ]", + "^[lr]", + "^\\Sr", + "\\Sle?", +]; + +const DEFAULT_POSTPOSITION = { + "은": "는", + "이": "가", + "과": "와", + "이나": "나", + "을": "를", + "으로": "로", + "이라": "라", + "이랑": "랑", +}; + +const JONGSUNG_HANJA = [ + 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, + 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, + 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, + 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, + 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, + 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, + 0x5d4c, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, + 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, + 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, + 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, + 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, + 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x5580, + 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, 0x91b5, 0x4e7e, 0x4ef6, + 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, + 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, + 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, + 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, + 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, + 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, + 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, + 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, + 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, + 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, + 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, + 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, + 0x9838, 0x9a5a, 0x9be8, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, + 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, + 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904, 0x9aa8, 0x4f9b, + 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, + 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x4e32, + 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec, + 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, + 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, + 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, + 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5b8f, 0x7d18, + 0x80b1, 0x8f5f, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, + 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, + 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, + 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, + 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x52fb, + 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908, 0x6a58, 0x514b, + 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, + 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, + 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909, 0x4eca, 0x5997, + 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, + 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, + 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x7dca, + 0x4f76, 0x5409, 0x62ee, 0x6854, 0x91d1, 0x55ab, 0xf914, 0xf915, + 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919, 0xf91a, 0xf91b, 0xf91c, + 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f, 0x96e3, 0xf920, 0x634f, + 0x637a, 0x5357, 0xf921, 0x678f, 0x6960, 0x6e73, 0xf922, 0x7537, + 0xf923, 0xf924, 0xf925, 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, + 0x5a18, 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0xf92e, 0x5e74, + 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, + 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, + 0xf943, 0x6fc3, 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x5ae9, 0x8a25, + 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, + 0xf959, 0x533f, 0x6eba, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, + 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, + 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, + 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, + 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, + 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, + 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, + 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x5b85, 0x5fb7, 0x60b3, + 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, + 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, + 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, + 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, + 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x5c6f, + 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, + 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0xf95c, + 0x6d1b, 0x70d9, 0x73de, 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, + 0xf95e, 0x4e82, 0x5375, 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, + 0x9e1e, 0x524c, 0x8fa3, 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, + 0x7c43, 0x7e9c, 0x85cd, 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, + 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, + 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, + 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, + 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, + 0x6200, 0x6523, 0x6f23, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, + 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, + 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, + 0x4f36, 0x56f9, 0xf95f, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, + 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, + 0x9f61, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x9e93, + 0x8ad6, 0x58df, 0x5f04, 0x6727, 0x7027, 0x74cf, 0x7c60, 0x807e, + 0x9f8d, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, + 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, + 0x808b, 0x51dc, 0x51cc, 0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, + 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, + 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, + 0x7b20, 0x7c92, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, + 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, + 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, + 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, + 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, + 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x8108, 0x8c8a, + 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, + 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, + 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, + 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, + 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x6728, + 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, + 0x5922, 0x6726, 0x8499, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, + 0x554f, 0x6587, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, + 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5cb7, 0x60b6, 0x610d, 0x61ab, + 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, + 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, + 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, + 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, + 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, + 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, 0x78d0, + 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, + 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, + 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, + 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, + 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, + 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x4f2f, + 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, + 0x6a0a, 0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, + 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, + 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, + 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, + 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, + 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, + 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, + 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4f0f, + 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, + 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, + 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, + 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, + 0x92d2, 0x9cf3, 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, + 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, + 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, + 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, + 0x9d6c, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, + 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, + 0x6c37, 0x8058, 0x9a01, 0x524a, 0xf969, 0x6714, 0xf96a, 0x5098, + 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, + 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, + 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, + 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, + 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, + 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, + 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, + 0x8c61, 0x8cde, 0x971c, 0x55c7, 0xf96c, 0x7a61, 0x7d22, 0x8272, + 0x7272, 0x751f, 0x7525, 0xf96d, 0x7b19, 0x5915, 0x596d, 0x5e2d, + 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, + 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, + 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, + 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, + 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, + 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, + 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, + 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, + 0x965d, 0x651d, 0x6d89, 0x71ee, 0xf96e, 0x57ce, 0x59d3, 0x5bac, + 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, + 0x7701, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4fd7, + 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, + 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x7387, 0x5b8b, + 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x53d4, + 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, + 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, + 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, + 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, 0x84f4, 0x8563, + 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, + 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, + 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, + 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x57f4, + 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, + 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, + 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, + 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, + 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, + 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0xf972, 0x6df1, + 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0xf973, 0x96d9, + 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, + 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, + 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, + 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, + 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, + 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5384, + 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, + 0x9daf, 0x9e1a, 0x5f31, 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, + 0x84bb, 0x85e5, 0x8e8d, 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, + 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, + 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, + 0xf97b, 0x7f8a, 0xf97c, 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, + 0xf97e, 0x990a, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, + 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, + 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, + 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c, 0x75ab, + 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, + 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350, 0x633b, + 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, + 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5, 0xf994, + 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f, 0xf997, + 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b, 0x9cf6, + 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, + 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3, 0xf9a5, + 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0xf9a6, 0x95bb, 0x9ae5, + 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, 0xf9a8, 0xf9a9, 0x584b, + 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, 0x6620, 0x668e, 0x6979, + 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, + 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, 0xf9ae, 0x74d4, 0x76c8, + 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, 0x8a60, 0x8fce, 0xf9b1, + 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, 0x5c4b, 0x6c83, 0x7344, + 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, + 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, + 0x96cd, 0x9954, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, + 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, + 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, + 0x6c6a, 0x738b, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, + 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, + 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, + 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0xf9c4, + 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, + 0x980a, 0x4e91, 0xf9c5, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, + 0x82b8, 0x8553, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, + 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, + 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, + 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, + 0x8f45, 0x9060, 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, + 0x925e, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, 0xf9d3, + 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, 0x73a7, + 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, 0xf9da, + 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, 0x57a0, + 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, + 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, + 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0xf9eb, 0xf9ec, 0x7037, 0x76ca, + 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, + 0xf9ed, 0x54bd, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, + 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, 0xf9f0, 0x8693, 0x8a8d, 0xf9f1, + 0x976d, 0x9777, 0xf9f2, 0xf9f3, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, + 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, + 0x59d9, 0x6041, 0xf9f4, 0xf9f5, 0x7a14, 0xf9f6, 0x834f, 0x8cc3, + 0x5165, 0x5344, 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, + 0x82bf, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, + 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, + 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, + 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, + 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, + 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b, + 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, + 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x969c, 0x722d, + 0x7b8f, 0x8acd, 0x931a, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, + 0x6575, 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, + 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, + 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, + 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, + 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, + 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, + 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, + 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, + 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, + 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, + 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, + 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, + 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, + 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, + 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, + 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, + 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, + 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, + 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, + 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, + 0x937e, 0x9418, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, + 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, + 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, + 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, + 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, + 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x76f4, 0x7a19, 0x7a37, 0x7e54, + 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, + 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, + 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, + 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, + 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, + 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, + 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0xf9fd, 0x57f7, 0x6f57, + 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x6349, + 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, + 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, + 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, + 0x672d, 0x7d2e, 0x50ed, 0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, + 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, + 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, + 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, + 0x83d6, 0x84bc, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x501c, 0xf9ff, + 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, + 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, + 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, + 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, + 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, + 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, + 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, + 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, + 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0x4fc3, 0x56d1, + 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, + 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, + 0x8525, 0x9283, 0x64ae, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, + 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, + 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, + 0x87f2, 0x885d, 0x8877, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, + 0x5c64, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, + 0x4fb5, 0x5be2, 0x6795, 0x6c88, 0x6d78, 0x741b, 0x7827, 0x91dd, + 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x502c, 0x5353, 0x5544, 0x577c, + 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, + 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, + 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, + 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, + 0x5e11, 0x6e6f, 0xfa03, 0x8569, 0xfa04, 0x64c7, 0x6fa4, 0x6491, + 0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x615d, + 0x7279, 0x95d6, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, + 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c, 0x5f6d, 0x6f8e, + 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247, 0x7bc7, + 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, + 0x67b0, 0x840d, 0x8a55, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, + 0xfa07, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, + 0x5339, 0x5f3c, 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, + 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x58d1, 0x5b78, 0x8650, 0x8b14, + 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, + 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, + 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, + 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, + 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, + 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, + 0x809b, 0x822a, 0xfa08, 0xfa09, 0x9805, 0x52be, 0x6838, 0x5016, + 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6, + 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x61b2, 0x6af6, 0x737b, + 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, + 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, + 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, + 0x8852, 0xfa0a, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, + 0x9801, 0x5acc, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, + 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, + 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, + 0x7192, 0x73e9, 0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, + 0x93a3, 0x99a8, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, + 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, + 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, + 0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, + 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, + 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, + 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, + 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, + 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, + 0x8757, 0x9051, 0x968d, 0x9ec3, 0x5283, 0x7372, 0x5b96, 0x6a6b, + 0x9404, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, + 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, + 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, + 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, + 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, + 0x8208, 0x8a70, 0xfa0b +]; + +const RO_HANJA = [ + 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, + 0x874e, 0x97a8, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x6289, 0x6c7a, + 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x6c68, 0xf904, 0x9aa8, 0x522e, + 0x605d, 0x62ec, 0x9002, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x53a5, + 0x7357, 0x8568, 0x8e76, 0x95d5, 0x6a58, 0xf909, 0x4f76, 0x5409, + 0x62ee, 0x6854, 0x634f, 0x637a, 0x8a25, 0x64bb, 0x6fbe, 0x737a, + 0x75b8, 0x9054, 0x4e6d, 0x7a81, 0x524c, 0x8fa3, 0x51bd, 0x5217, + 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5f8b, 0x6144, 0x6817, 0xf961, + 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x6ec5, + 0x8511, 0x6b7f, 0x6c92, 0x52ff, 0x6c95, 0x7269, 0x5bc6, 0x871c, + 0x8b10, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, + 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, + 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e76, 0xf967, 0x4f5b, 0x5f17, + 0x5f7f, 0x62c2, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x5368, + 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, + 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x7387, 0x620c, 0x8853, 0x8ff0, + 0x9265, 0x745f, 0x819d, 0x8768, 0x5931, 0x5ba4, 0x5be6, 0x6089, + 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5b7c, 0x8616, 0xf99c, 0xf99d, + 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, 0xf9a1, 0x95b1, + 0x5140, 0x66f0, 0x851a, 0x9b31, 0x4e90, 0x6708, 0x8d8a, 0x925e, + 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0x807f, 0x4e59, 0x4e00, 0x4f5a, + 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x5207, + 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5352, + 0x62d9, 0x731d, 0x8301, 0x6adb, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, + 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, + 0x8cea, 0x8dcc, 0x8fed, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, + 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, + 0x8f4d, 0x9435, 0x64ae, 0x51fa, 0x672e, 0x9edc, 0x4e03, 0x67d2, + 0x6f06, 0x596a, 0x812b, 0x516b, 0x53ed, 0x634c, 0x5339, 0x5f3c, + 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, + 0x5272, 0x8f44, 0x6b47, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5ffd, + 0x60da, 0x7b0f, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x6064, + 0x8b4e, 0x9df8, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x8a70, +]; + +const regNormalFixed = new RegExp(`/(?:${PRE_REG_NORMAL_FIXED.join('|')})$/iu`); +const regSpecialChar = new RegExp(`/(?:${PRE_REG_SPECIAL_CHAR.join('|')})$/iu`); +const regSpecialRo = new RegExp(`/(?:${PRE_REG_SPECIAL_RO.join('|')})$/iu`); + +const jongsungHanja = new Set(); +for (const hanjaCode of JONGSUNG_HANJA) { + jongsungHanja.add(hanjaCode); +} +const roHanja = new Set(); +for (const hanjaCode of RO_HANJA) { + roHanja.add(hanjaCode); +} +const mapPostPosition = new Map(); +for (const [key, val] of Object.entries(DEFAULT_POSTPOSITION)) { + mapPostPosition.set(`(${key})${val}`, key); + mapPostPosition.set(key, key); + mapPostPosition.set(val, key); +} + +function checkText(text: string, isRo: boolean): boolean { + if (regNormalFixed.test(text)) { + return false; + } + + if (regSpecialChar.test(text)) { + return true; + } + + if (!isRo && regSpecialRo.test(text)) { + return true; + } + + return false; +} + +function checkCode(code: number, isRo: boolean): boolean { + const jongsung = (code - KO_START_CODE) % 28; + if (jongsung === 0) { + return false; + } + + if (isRo && jongsung === 8) { + return false; + } + + return true; +} + +export function check(text: string, type: string): boolean { + + const htarget = text.replace(REG_INVALID_CHAR_W_HANJA, ' ').replace(REG_TARGET_CHAR, '$1'); + if (!htarget) { + return false; + } + const hcode = htarget.charAt(htarget.length - 1).charCodeAt(0); + const isRo = type === '로' || type === '으로'; + + if (HANJA_START_CODE <= hcode && hcode <= HANJA_FINISH_CODE) { + if (isRo && roHanja.has(hcode)) { + return false; + } + if (jongsungHanja.has(hcode)) { + return true; + } + if (hcode < KO_START_CODE || KO_FINISH_CODE < hcode) { + return false; + } + } + + const target = text.replace(REG_INVALID_CHAR, ' ').replace(REG_TARGET_CHAR, '$1'); + const code = target.charAt(target.length - 1).charCodeAt(0); + + const isKorean = KO_START_CODE <= code && code <= KO_FINISH_CODE; + + return isKorean ? checkCode(code, isRo) : checkText(target, isRo); +} + +export function pick(text: string|number, wJongsung: string, woJongsung = ''): string { + /* NOTE:원본 코드와 인자 순서가 다름. + * 원본은 pick('바람', '랑', '이랑'); 이었다면 pick('바람', '이랑', '랑'); 으로 바뀜. + * pick('바람', '은', '는'); JosaUtil.pick('바람', '이', '가');처럼 쓰기 위해서임. + */ + if (!text) { + text = ''; + } else if(typeof text === 'number'){ + text = String(text); + } + + if(!woJongsung){ + if(!mapPostPosition.has(wJongsung)){ + throw `올바르지 않은 조사 지정: ${wJongsung}`; + } + wJongsung = unwrap_err(mapPostPosition.get(wJongsung), Error, `올바르지 않은 조사 지정: ${wJongsung}`); + woJongsung = DEFAULT_POSTPOSITION[wJongsung as keyof typeof DEFAULT_POSTPOSITION]; + } + + return check(text, wJongsung) ? wJongsung : woJongsung; +} + +export function put(text: string, wJongsung: string, woJongsung = ''): string{ + return `${text}${pick(text, wJongsung, woJongsung)}`; +} + +export function fix(wJongsung: string, woJongsung = ''){ + if(!woJongsung){ + if(!mapPostPosition.has(wJongsung)){ + throw `올바르지 않은 조사 지정: ${wJongsung}`; + } + wJongsung = unwrap_err(mapPostPosition.get(wJongsung), Error, `올바르지 않은 조사 지정: ${wJongsung}`); + woJongsung = DEFAULT_POSTPOSITION[wJongsung as keyof typeof DEFAULT_POSTPOSITION]; + } + return function(text: string){ + return put(text, wJongsung, woJongsung); + } +} + +export function batch(text: string, decorator = ';'){ + const regExp = new RegExp(`${decorator}([^${decorator}]+)${decorator}([^${decorator}]*)${decorator}([^${decorator}]+)${decorator}`, 'g'); + + let matchRes; + let lastIndex = 0; + + const result: string[] = []; + + while ((matchRes = regExp.exec(text)) !== null) { + const { + 0: partAll, + 1: body, + 2: filler, + 3: wJongsung, + index, + } = matchRes; + if(lastIndex != index){ + result.push(text.slice(lastIndex, index)); + } + + result.push(body, filler, pick(body, wJongsung)); + + lastIndex = index + partAll.length; + } + if(lastIndex != text.length){ + result.push(text.slice(lastIndex)); + } + + return result.join(''); +} \ No newline at end of file diff --git a/package.json b/package.json index 46d9a025..08d0598c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "buildDev": "webpack --mode=development", "watch": "webpack watch --mode=development", "watchProd": "webpack watch", - "lint": "eslint hwe/ts" + "lint": "eslint hwe/ts", + "tsNode": "node --loader ts-node/esm --experimental-specifier-resolution=node" }, "repository": { "type": "git", @@ -83,6 +84,7 @@ "sass": "^1.45.0", "sass-loader": "^12.4.0", "style-loader": "^3.3.1", + "ts-node": "^10.4.0", "typescript": "^4.5.3", "url-loader": "^4.1.1", "vue-eslint-parser": "^8.0.1", diff --git a/src/sammo/JosaUtil.php b/src/sammo/JosaUtil.php index 6e39cef2..bcb1d2e6 100644 --- a/src/sammo/JosaUtil.php +++ b/src/sammo/JosaUtil.php @@ -45,399 +45,400 @@ class JosaUtil{ "을"=> "를", "으로"=> "로", "이라"=> "라", + "이랑"=> "랑", ]; const JONGSUNG_HANJA = [ - 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, - 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, - 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, - 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, - 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, - 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, - 0x5d4c, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, - 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, - 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, - 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, - 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, - 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x5580, - 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, 0x91b5, 0x4e7e, 0x4ef6, - 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, - 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, - 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, - 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, - 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, - 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, - 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, - 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, - 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, - 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, - 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, - 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, - 0x9838, 0x9a5a, 0x9be8, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, - 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, - 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904, 0x9aa8, 0x4f9b, - 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, - 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x4e32, - 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec, - 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, - 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, - 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, - 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5b8f, 0x7d18, - 0x80b1, 0x8f5f, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, - 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, - 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, - 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, - 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x52fb, - 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908, 0x6a58, 0x514b, - 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, - 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, - 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909, 0x4eca, 0x5997, - 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, - 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, - 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x7dca, - 0x4f76, 0x5409, 0x62ee, 0x6854, 0x91d1, 0x55ab, 0xf914, 0xf915, - 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919, 0xf91a, 0xf91b, 0xf91c, - 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f, 0x96e3, 0xf920, 0x634f, - 0x637a, 0x5357, 0xf921, 0x678f, 0x6960, 0x6e73, 0xf922, 0x7537, - 0xf923, 0xf924, 0xf925, 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, - 0x5a18, 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0xf92e, 0x5e74, - 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, - 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, - 0xf943, 0x6fc3, 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x5ae9, 0x8a25, - 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, - 0xf959, 0x533f, 0x6eba, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, - 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, - 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, - 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, - 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, - 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, - 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, - 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x5b85, 0x5fb7, 0x60b3, - 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, - 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, - 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, - 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, - 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x5c6f, - 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, - 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0xf95c, - 0x6d1b, 0x70d9, 0x73de, 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, - 0xf95e, 0x4e82, 0x5375, 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, - 0x9e1e, 0x524c, 0x8fa3, 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, - 0x7c43, 0x7e9c, 0x85cd, 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, - 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, - 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, - 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, - 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, - 0x6200, 0x6523, 0x6f23, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, - 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, - 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, - 0x4f36, 0x56f9, 0xf95f, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, - 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, - 0x9f61, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x9e93, - 0x8ad6, 0x58df, 0x5f04, 0x6727, 0x7027, 0x74cf, 0x7c60, 0x807e, - 0x9f8d, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, - 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, - 0x808b, 0x51dc, 0x51cc, 0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, - 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, - 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, - 0x7b20, 0x7c92, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, - 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, - 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, - 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, - 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, - 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x8108, 0x8c8a, - 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, - 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, - 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, - 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, - 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x6728, - 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, - 0x5922, 0x6726, 0x8499, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, - 0x554f, 0x6587, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, - 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5cb7, 0x60b6, 0x610d, 0x61ab, - 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, - 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, - 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, - 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, - 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, - 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, 0x78d0, - 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, - 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, - 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, - 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, - 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, - 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x4f2f, - 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, - 0x6a0a, 0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, - 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, - 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, - 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, - 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, - 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, - 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, - 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4f0f, - 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, - 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, - 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, - 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, - 0x92d2, 0x9cf3, 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, - 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, - 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, - 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, - 0x9d6c, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, - 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, - 0x6c37, 0x8058, 0x9a01, 0x524a, 0xf969, 0x6714, 0xf96a, 0x5098, - 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, - 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, - 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, - 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, - 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, - 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, - 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, - 0x8c61, 0x8cde, 0x971c, 0x55c7, 0xf96c, 0x7a61, 0x7d22, 0x8272, - 0x7272, 0x751f, 0x7525, 0xf96d, 0x7b19, 0x5915, 0x596d, 0x5e2d, - 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, - 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, - 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, - 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, - 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, - 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, - 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, - 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, - 0x965d, 0x651d, 0x6d89, 0x71ee, 0xf96e, 0x57ce, 0x59d3, 0x5bac, - 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, - 0x7701, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4fd7, - 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, - 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x7387, 0x5b8b, - 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x53d4, - 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, - 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, - 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, - 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, 0x84f4, 0x8563, - 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, - 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, - 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, - 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x57f4, - 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, - 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, - 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, - 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, - 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, - 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0xf972, 0x6df1, - 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0xf973, 0x96d9, - 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, - 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, - 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, - 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, - 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, - 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5384, - 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, - 0x9daf, 0x9e1a, 0x5f31, 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, - 0x84bb, 0x85e5, 0x8e8d, 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, - 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, - 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, - 0xf97b, 0x7f8a, 0xf97c, 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, - 0xf97e, 0x990a, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, - 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, - 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, - 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c, 0x75ab, - 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, - 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350, 0x633b, - 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, - 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5, 0xf994, - 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f, 0xf997, - 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b, 0x9cf6, - 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, - 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3, 0xf9a5, - 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0xf9a6, 0x95bb, 0x9ae5, - 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, 0xf9a8, 0xf9a9, 0x584b, - 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, 0x6620, 0x668e, 0x6979, - 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, - 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, 0xf9ae, 0x74d4, 0x76c8, - 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, 0x8a60, 0x8fce, 0xf9b1, - 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, 0x5c4b, 0x6c83, 0x7344, - 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, - 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, - 0x96cd, 0x9954, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, - 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, - 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, - 0x6c6a, 0x738b, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, - 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, - 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, - 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0xf9c4, - 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, - 0x980a, 0x4e91, 0xf9c5, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, - 0x82b8, 0x8553, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, - 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, - 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, - 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, - 0x8f45, 0x9060, 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, - 0x925e, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, 0xf9d3, - 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, 0x73a7, - 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, 0xf9da, - 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, 0x57a0, - 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, - 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, - 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0xf9eb, 0xf9ec, 0x7037, 0x76ca, - 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, - 0xf9ed, 0x54bd, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, - 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, 0xf9f0, 0x8693, 0x8a8d, 0xf9f1, - 0x976d, 0x9777, 0xf9f2, 0xf9f3, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, - 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, - 0x59d9, 0x6041, 0xf9f4, 0xf9f5, 0x7a14, 0xf9f6, 0x834f, 0x8cc3, - 0x5165, 0x5344, 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, - 0x82bf, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, - 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, - 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, - 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, - 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, - 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b, - 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, - 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x969c, 0x722d, - 0x7b8f, 0x8acd, 0x931a, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, - 0x6575, 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, - 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, - 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, - 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, - 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, - 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, - 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, - 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, - 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, - 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, - 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, - 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, - 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, - 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, - 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, - 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, - 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, - 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, - 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, - 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, - 0x937e, 0x9418, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, - 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, - 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, - 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, - 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, - 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x76f4, 0x7a19, 0x7a37, 0x7e54, - 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, - 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, - 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, - 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, - 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, - 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, - 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0xf9fd, 0x57f7, 0x6f57, - 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x6349, - 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, - 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, - 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, - 0x672d, 0x7d2e, 0x50ed, 0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, - 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, - 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, - 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, - 0x83d6, 0x84bc, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x501c, 0xf9ff, - 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, - 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, - 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, - 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, - 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, - 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, - 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, - 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, - 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0x4fc3, 0x56d1, - 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, - 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, - 0x8525, 0x9283, 0x64ae, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, - 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, - 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, - 0x87f2, 0x885d, 0x8877, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, - 0x5c64, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, - 0x4fb5, 0x5be2, 0x6795, 0x6c88, 0x6d78, 0x741b, 0x7827, 0x91dd, - 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x502c, 0x5353, 0x5544, 0x577c, - 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, - 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, - 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, - 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, - 0x5e11, 0x6e6f, 0xfa03, 0x8569, 0xfa04, 0x64c7, 0x6fa4, 0x6491, - 0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x615d, - 0x7279, 0x95d6, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, - 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c, 0x5f6d, 0x6f8e, - 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247, 0x7bc7, - 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, - 0x67b0, 0x840d, 0x8a55, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, - 0xfa07, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, - 0x5339, 0x5f3c, 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, - 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x58d1, 0x5b78, 0x8650, 0x8b14, - 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, - 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, - 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, - 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, - 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, - 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, - 0x809b, 0x822a, 0xfa08, 0xfa09, 0x9805, 0x52be, 0x6838, 0x5016, - 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6, - 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x61b2, 0x6af6, 0x737b, - 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, - 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, - 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, - 0x8852, 0xfa0a, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, - 0x9801, 0x5acc, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, - 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, - 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, - 0x7192, 0x73e9, 0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, - 0x93a3, 0x99a8, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, - 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, - 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, - 0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, - 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, - 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, - 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, - 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, - 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, - 0x8757, 0x9051, 0x968d, 0x9ec3, 0x5283, 0x7372, 0x5b96, 0x6a6b, - 0x9404, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, - 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, - 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, - 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, - 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, + 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, + 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, + 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, + 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, + 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, + 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, + 0x5d4c, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, + 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, + 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, + 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, + 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, + 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x5580, + 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, 0x91b5, 0x4e7e, 0x4ef6, + 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, + 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, + 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, + 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, + 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, + 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, + 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, + 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, + 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, + 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, + 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, + 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, + 0x9838, 0x9a5a, 0x9be8, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, + 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, + 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904, 0x9aa8, 0x4f9b, + 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, + 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x4e32, + 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec, + 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, + 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, + 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, + 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5b8f, 0x7d18, + 0x80b1, 0x8f5f, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, + 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, + 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, + 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, + 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x52fb, + 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908, 0x6a58, 0x514b, + 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, + 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, + 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909, 0x4eca, 0x5997, + 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, + 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, + 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x7dca, + 0x4f76, 0x5409, 0x62ee, 0x6854, 0x91d1, 0x55ab, 0xf914, 0xf915, + 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919, 0xf91a, 0xf91b, 0xf91c, + 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f, 0x96e3, 0xf920, 0x634f, + 0x637a, 0x5357, 0xf921, 0x678f, 0x6960, 0x6e73, 0xf922, 0x7537, + 0xf923, 0xf924, 0xf925, 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, + 0x5a18, 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0xf92e, 0x5e74, + 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, + 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, + 0xf943, 0x6fc3, 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x5ae9, 0x8a25, + 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, + 0xf959, 0x533f, 0x6eba, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, + 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, + 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, + 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, + 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, + 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, + 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, + 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x5b85, 0x5fb7, 0x60b3, + 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, + 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, + 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, + 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, + 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x5c6f, + 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, + 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0xf95c, + 0x6d1b, 0x70d9, 0x73de, 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, + 0xf95e, 0x4e82, 0x5375, 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, + 0x9e1e, 0x524c, 0x8fa3, 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, + 0x7c43, 0x7e9c, 0x85cd, 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, + 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, + 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, + 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, + 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, + 0x6200, 0x6523, 0x6f23, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, + 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, + 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, + 0x4f36, 0x56f9, 0xf95f, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, + 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, + 0x9f61, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x9e93, + 0x8ad6, 0x58df, 0x5f04, 0x6727, 0x7027, 0x74cf, 0x7c60, 0x807e, + 0x9f8d, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, + 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, + 0x808b, 0x51dc, 0x51cc, 0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, + 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, + 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, + 0x7b20, 0x7c92, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, + 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, + 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, + 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, + 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, + 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x8108, 0x8c8a, + 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, + 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, + 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, + 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, + 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x6728, + 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, + 0x5922, 0x6726, 0x8499, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, + 0x554f, 0x6587, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, + 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5cb7, 0x60b6, 0x610d, 0x61ab, + 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, + 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, + 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, + 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, + 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, + 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, 0x78d0, + 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, + 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, + 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, + 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, + 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, + 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x4f2f, + 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, + 0x6a0a, 0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, + 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, + 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, + 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, + 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, + 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, + 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, + 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4f0f, + 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, + 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, + 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, + 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, + 0x92d2, 0x9cf3, 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, + 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, + 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, + 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, + 0x9d6c, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, + 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, + 0x6c37, 0x8058, 0x9a01, 0x524a, 0xf969, 0x6714, 0xf96a, 0x5098, + 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, + 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, + 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, + 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, + 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, + 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, + 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, + 0x8c61, 0x8cde, 0x971c, 0x55c7, 0xf96c, 0x7a61, 0x7d22, 0x8272, + 0x7272, 0x751f, 0x7525, 0xf96d, 0x7b19, 0x5915, 0x596d, 0x5e2d, + 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, + 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, + 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, + 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, + 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, + 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, + 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, + 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, + 0x965d, 0x651d, 0x6d89, 0x71ee, 0xf96e, 0x57ce, 0x59d3, 0x5bac, + 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, + 0x7701, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4fd7, + 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, + 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x7387, 0x5b8b, + 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x53d4, + 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, + 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, + 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, + 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, 0x84f4, 0x8563, + 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, + 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, + 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, + 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x57f4, + 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, + 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, + 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, + 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, + 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, + 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0xf972, 0x6df1, + 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0xf973, 0x96d9, + 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, + 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, + 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, + 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, + 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, + 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5384, + 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, + 0x9daf, 0x9e1a, 0x5f31, 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, + 0x84bb, 0x85e5, 0x8e8d, 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, + 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, + 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, + 0xf97b, 0x7f8a, 0xf97c, 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, + 0xf97e, 0x990a, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, + 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, + 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, + 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c, 0x75ab, + 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, + 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350, 0x633b, + 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, + 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5, 0xf994, + 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f, 0xf997, + 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b, 0x9cf6, + 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, + 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3, 0xf9a5, + 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0xf9a6, 0x95bb, 0x9ae5, + 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, 0xf9a8, 0xf9a9, 0x584b, + 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, 0x6620, 0x668e, 0x6979, + 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, + 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, 0xf9ae, 0x74d4, 0x76c8, + 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, 0x8a60, 0x8fce, 0xf9b1, + 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, 0x5c4b, 0x6c83, 0x7344, + 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, + 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, + 0x96cd, 0x9954, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, + 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, + 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, + 0x6c6a, 0x738b, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, + 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, + 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, + 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0xf9c4, + 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, + 0x980a, 0x4e91, 0xf9c5, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, + 0x82b8, 0x8553, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, + 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, + 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, + 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, + 0x8f45, 0x9060, 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, + 0x925e, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, 0xf9d3, + 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, 0x73a7, + 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, 0xf9da, + 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, 0x57a0, + 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, + 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, + 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0xf9eb, 0xf9ec, 0x7037, 0x76ca, + 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, + 0xf9ed, 0x54bd, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, + 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, 0xf9f0, 0x8693, 0x8a8d, 0xf9f1, + 0x976d, 0x9777, 0xf9f2, 0xf9f3, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, + 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, + 0x59d9, 0x6041, 0xf9f4, 0xf9f5, 0x7a14, 0xf9f6, 0x834f, 0x8cc3, + 0x5165, 0x5344, 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, + 0x82bf, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, + 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, + 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, + 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, + 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, + 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b, + 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, + 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x969c, 0x722d, + 0x7b8f, 0x8acd, 0x931a, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, + 0x6575, 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, + 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, + 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, + 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, + 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, + 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, + 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, + 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, + 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, + 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, + 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, + 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, + 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, + 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, + 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, + 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, + 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, + 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, + 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, + 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, + 0x937e, 0x9418, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, + 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, + 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, + 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, + 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, + 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x76f4, 0x7a19, 0x7a37, 0x7e54, + 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, + 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, + 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, + 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, + 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, + 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, + 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0xf9fd, 0x57f7, 0x6f57, + 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x6349, + 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, + 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, + 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, + 0x672d, 0x7d2e, 0x50ed, 0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, + 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, + 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, + 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, + 0x83d6, 0x84bc, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x501c, 0xf9ff, + 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, + 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, + 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, + 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, + 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, + 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, + 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, + 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, + 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0x4fc3, 0x56d1, + 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, + 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, + 0x8525, 0x9283, 0x64ae, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, + 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, + 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, + 0x87f2, 0x885d, 0x8877, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, + 0x5c64, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, + 0x4fb5, 0x5be2, 0x6795, 0x6c88, 0x6d78, 0x741b, 0x7827, 0x91dd, + 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x502c, 0x5353, 0x5544, 0x577c, + 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, + 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, + 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, + 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, + 0x5e11, 0x6e6f, 0xfa03, 0x8569, 0xfa04, 0x64c7, 0x6fa4, 0x6491, + 0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x615d, + 0x7279, 0x95d6, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, + 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c, 0x5f6d, 0x6f8e, + 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247, 0x7bc7, + 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, + 0x67b0, 0x840d, 0x8a55, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, + 0xfa07, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, + 0x5339, 0x5f3c, 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, + 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x58d1, 0x5b78, 0x8650, 0x8b14, + 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, + 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, + 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, + 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, + 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, + 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, + 0x809b, 0x822a, 0xfa08, 0xfa09, 0x9805, 0x52be, 0x6838, 0x5016, + 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6, + 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x61b2, 0x6af6, 0x737b, + 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, + 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, + 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, + 0x8852, 0xfa0a, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, + 0x9801, 0x5acc, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, + 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, + 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, + 0x7192, 0x73e9, 0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, + 0x93a3, 0x99a8, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, + 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, + 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, + 0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, + 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, + 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, + 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, + 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, + 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, + 0x8757, 0x9051, 0x968d, 0x9ec3, 0x5283, 0x7372, 0x5b96, 0x6a6b, + 0x9404, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, + 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, + 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, + 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, + 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, 0x8208, 0x8a70, 0xfa0b ]; const RO_HANJA = [ - 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, - 0x874e, 0x97a8, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x6289, 0x6c7a, - 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x6c68, 0xf904, 0x9aa8, 0x522e, - 0x605d, 0x62ec, 0x9002, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x53a5, - 0x7357, 0x8568, 0x8e76, 0x95d5, 0x6a58, 0xf909, 0x4f76, 0x5409, - 0x62ee, 0x6854, 0x634f, 0x637a, 0x8a25, 0x64bb, 0x6fbe, 0x737a, - 0x75b8, 0x9054, 0x4e6d, 0x7a81, 0x524c, 0x8fa3, 0x51bd, 0x5217, - 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5f8b, 0x6144, 0x6817, 0xf961, - 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x6ec5, - 0x8511, 0x6b7f, 0x6c92, 0x52ff, 0x6c95, 0x7269, 0x5bc6, 0x871c, - 0x8b10, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, - 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, - 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e76, 0xf967, 0x4f5b, 0x5f17, - 0x5f7f, 0x62c2, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x5368, - 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, - 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x7387, 0x620c, 0x8853, 0x8ff0, - 0x9265, 0x745f, 0x819d, 0x8768, 0x5931, 0x5ba4, 0x5be6, 0x6089, - 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5b7c, 0x8616, 0xf99c, 0xf99d, - 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, 0xf9a1, 0x95b1, - 0x5140, 0x66f0, 0x851a, 0x9b31, 0x4e90, 0x6708, 0x8d8a, 0x925e, - 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0x807f, 0x4e59, 0x4e00, 0x4f5a, - 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x5207, - 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5352, - 0x62d9, 0x731d, 0x8301, 0x6adb, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, - 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, - 0x8cea, 0x8dcc, 0x8fed, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, - 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, - 0x8f4d, 0x9435, 0x64ae, 0x51fa, 0x672e, 0x9edc, 0x4e03, 0x67d2, - 0x6f06, 0x596a, 0x812b, 0x516b, 0x53ed, 0x634c, 0x5339, 0x5f3c, - 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, - 0x5272, 0x8f44, 0x6b47, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5ffd, - 0x60da, 0x7b0f, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x6064, - 0x8b4e, 0x9df8, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x8a70, + 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, + 0x874e, 0x97a8, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x6289, 0x6c7a, + 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x6c68, 0xf904, 0x9aa8, 0x522e, + 0x605d, 0x62ec, 0x9002, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x53a5, + 0x7357, 0x8568, 0x8e76, 0x95d5, 0x6a58, 0xf909, 0x4f76, 0x5409, + 0x62ee, 0x6854, 0x634f, 0x637a, 0x8a25, 0x64bb, 0x6fbe, 0x737a, + 0x75b8, 0x9054, 0x4e6d, 0x7a81, 0x524c, 0x8fa3, 0x51bd, 0x5217, + 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5f8b, 0x6144, 0x6817, 0xf961, + 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x6ec5, + 0x8511, 0x6b7f, 0x6c92, 0x52ff, 0x6c95, 0x7269, 0x5bc6, 0x871c, + 0x8b10, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, + 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, + 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e76, 0xf967, 0x4f5b, 0x5f17, + 0x5f7f, 0x62c2, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x5368, + 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, + 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x7387, 0x620c, 0x8853, 0x8ff0, + 0x9265, 0x745f, 0x819d, 0x8768, 0x5931, 0x5ba4, 0x5be6, 0x6089, + 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5b7c, 0x8616, 0xf99c, 0xf99d, + 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, 0xf9a1, 0x95b1, + 0x5140, 0x66f0, 0x851a, 0x9b31, 0x4e90, 0x6708, 0x8d8a, 0x925e, + 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0x807f, 0x4e59, 0x4e00, 0x4f5a, + 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x5207, + 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5352, + 0x62d9, 0x731d, 0x8301, 0x6adb, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, + 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, + 0x8cea, 0x8dcc, 0x8fed, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, + 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, + 0x8f4d, 0x9435, 0x64ae, 0x51fa, 0x672e, 0x9edc, 0x4e03, 0x67d2, + 0x6f06, 0x596a, 0x812b, 0x516b, 0x53ed, 0x634c, 0x5339, 0x5f3c, + 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, + 0x5272, 0x8f44, 0x6b47, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5ffd, + 0x60da, 0x7b0f, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x6064, + 0x8b4e, 0x9df8, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x8a70, ]; private static $regNormalFixed; @@ -446,7 +447,7 @@ class JosaUtil{ private static $jongsungHanja; private static $roHanja; - + private static $mapPostPosition; private static $init = false; @@ -462,7 +463,7 @@ class JosaUtil{ JosaUtil::$regSpecialChar = '/(?:'.join('|', JosaUtil::PRE_REG_SPECIAL_CHAR).')$/iu'; JosaUtil::$regSpecialRo = '/(?:'.join('|', JosaUtil::PRE_REG_SPECIAL_RO).')$/iu'; - + $jongsungHanja = []; foreach(JosaUtil::JONGSUNG_HANJA as $hanja){ @@ -483,7 +484,7 @@ class JosaUtil{ $mapPostPosition[$val]=$key; } JosaUtil::$mapPostPosition = $mapPostPosition; - + } private static function checkText(string $text, bool $isRo){ @@ -522,7 +523,7 @@ class JosaUtil{ public static function check(string $text, string $type) { JosaUtil::init(); - + $htarget = preg_replace(JosaUtil::REG_INVALID_CHAR_W_HANJA, ' ', $text); $htarget = preg_replace(JosaUtil::REG_TARGET_CHAR, '$1', $htarget); @@ -531,7 +532,7 @@ class JosaUtil{ } $isRo = ($type === '으로' || $type === '로'); - + //한자 로직 $hcode = StringUtil::splitString($htarget); $hcode = $hcode[count($hcode)-1]; @@ -558,7 +559,7 @@ class JosaUtil{ if(JosaUtil::KO_START_CODE <= $code && $code <= JosaUtil::KO_FINISH_CODE){ return JosaUtil::checkCode($code, $isRo); } - + return JosaUtil::checkText($target, $isRo); } @@ -584,7 +585,7 @@ class JosaUtil{ $wJongsung = JosaUtil::$mapPostPosition[$wJongsung]; $woJongsung = JosaUtil::DEFAULT_POSTPOSITION[$wJongsung]; } - + return JosaUtil::check($text, $wJongsung)?$wJongsung:$woJongsung; } @@ -619,7 +620,7 @@ class JosaUtil{ $pattern = "/{$decorator}([^{$decorator}]+){$decorator}/"; preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE); } - + $matchCnt = count($matches[0]); if($matchCnt & 1){ @@ -651,7 +652,7 @@ class JosaUtil{ $result[] = substr($text, $prePos, $josaRawPos - $prePos); } $prePos = $josaRawPos + strlen($josaRawText); - + $pickedJosa = JosaUtil::pick($bodyText, $josaText); $result[] = $pickedJosa; } @@ -659,7 +660,7 @@ class JosaUtil{ if($prePos < $textLen){ $result[] = substr($text, $prePos, $textLen - $prePos); } - + return join('', $result); } } \ No newline at end of file From bc71ce73cf1b315ebbaf719a2ef25bf3b1c4bf3a Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 19:09:02 +0900 Subject: [PATCH 07/38] =?UTF-8?q?feat(WIP):=20process=20=EA=B5=AD=EA=B8=B0?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/Nation/che_국기변경.php | 28 +----- hwe/ts/processing/ColorSelect.vue | 111 ++++++++++++++++++++++ hwe/ts/processing/Nation/che_국기변경.vue | 61 ++++++++++++ hwe/ts/processing/Nation/index.ts | 1 + 4 files changed, 177 insertions(+), 24 deletions(-) create mode 100644 hwe/ts/processing/ColorSelect.vue create mode 100644 hwe/ts/processing/Nation/che_국기변경.vue diff --git a/hwe/sammo/Command/Nation/che_국기변경.php b/hwe/sammo/Command/Nation/che_국기변경.php index 4a4777dc..50d045ac 100644 --- a/hwe/sammo/Command/Nation/che_국기변경.php +++ b/hwe/sammo/Command/Nation/che_국기변경.php @@ -152,32 +152,12 @@ class che_국기변경 extends Command\NationCommand return true; } - public function getJSPlugins(): array + public function exportJSVars(): array { return [ - 'colorSelect' + 'procRes' => [ + 'colors' => GetNationColors(), + ], ]; } - - - public function getForm(): string - { - ob_start(); -?> - 국기를 변경합니다. 단 1회 가능합니다.
- 색상 :
-
- + + + + + + + + \ No newline at end of file diff --git a/hwe/ts/processing/Nation/che_국기변경.vue b/hwe/ts/processing/Nation/che_국기변경.vue new file mode 100644 index 00000000..14d5f05b --- /dev/null +++ b/hwe/ts/processing/Nation/che_국기변경.vue @@ -0,0 +1,61 @@ + + + diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts index a3e3ca23..f192048a 100644 --- a/hwe/ts/processing/Nation/index.ts +++ b/hwe/ts/processing/Nation/index.ts @@ -1,2 +1,3 @@ +export { default as che_국기변경 } from "./che_국기변경.vue"; export { default as che_발령 } from "./che_발령.vue"; export { default as che_포상 } from "./che_포상.vue"; \ No newline at end of file From 8a0b248caf3fc633b3bf93bb1462657b047870d3 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 18 Dec 2021 23:14:04 +0900 Subject: [PATCH 08/38] =?UTF-8?q?feat(WIP):=20process=20=EA=B5=AD=EA=B0=80?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/Nation/che_국호변경.php | 19 ---- hwe/sammo/Command/Nation/che_급습.php | 55 ++++++------ hwe/sammo/Command/Nation/che_발령.php | 53 ------------ hwe/ts/processing/CitySelect.vue | 21 +++-- hwe/ts/processing/Nation/che_국호변경.vue | 53 ++++++++++++ hwe/ts/processing/Nation/che_급습.vue | 100 ++++++++++++++++++++++ hwe/ts/processing/Nation/index.ts | 2 + hwe/ts/processing/NationSelect.vue | 100 ++++++++++++++++++++++ hwe/ts/processing/processingRes.ts | 14 ++- 9 files changed, 307 insertions(+), 110 deletions(-) create mode 100644 hwe/ts/processing/Nation/che_국호변경.vue create mode 100644 hwe/ts/processing/Nation/che_급습.vue create mode 100644 hwe/ts/processing/NationSelect.vue diff --git a/hwe/sammo/Command/Nation/che_국호변경.php b/hwe/sammo/Command/Nation/che_국호변경.php index f0cfc747..fd7b36de 100644 --- a/hwe/sammo/Command/Nation/che_국호변경.php +++ b/hwe/sammo/Command/Nation/che_국호변경.php @@ -157,23 +157,4 @@ class che_국호변경 extends Command\NationCommand $general->applyDB($db); return true; } - - public function getJSPlugins(): array - { - return [ - 'colorSelect' - ]; - } - - - public function getForm(): string - { - ob_start(); -?> - 나라의 이름을 바꿉니다. 황제가 된 후 1회 가능합니다.
- 국명 :
-
-generalObj; $nationID = $generalObj->getNationID(); $nationList = []; $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); foreach (getAllNationStaticInfo() as $destNation) { - if ($destNation['nation'] == $nationID) { + /*if ($destNation['nation'] == $nationID) { continue; - } + }*/ $testTurn->setArg(['destNationID' => $destNation['nation']]); $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); - if ($testCommand->hasFullConditionMet()) { - $destNation['availableCommand'] = true; - } else { - $destNation['availableCommand'] = false; + + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + if (!$testCommand->hasFullConditionMet()) { + $nationTarget['notAvailable'] = true; + } + if ($destNation['nation'] == $nationID) { + $nationTarget['notAvailable'] = true; } - $nationList[] = $destNation; + $nationList[] = $nationTarget; } - - ob_start(); -?> -
- 선택된 국가에 급습을 발동합니다.
- 선포, 전쟁중인 상대국에만 가능합니다.
- 상대 국가를 목록에서 선택하세요.
- 배경색은 현재 급습 불가능 국가는 붉은색으로 표시됩니다.
- - \sammo\getMapTheme(), + 'procRes' => [ + 'nations' => $nationList + ], + ]; } + + + } diff --git a/hwe/sammo/Command/Nation/che_발령.php b/hwe/sammo/Command/Nation/che_발령.php index 6efd3be9..536276df 100644 --- a/hwe/sammo/Command/Nation/che_발령.php +++ b/hwe/sammo/Command/Nation/che_발령.php @@ -187,57 +187,4 @@ class che_발령 extends Command\NationCommand ] ]; } - - public function getJSPlugins(): array - { - return [ - 'defaultSelectCityByMap' - ]; - } - - public function getForm(): string - { - $db = DB::db(); - - $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); - $destGeneralList = []; - foreach ($destRawGenerals as $destGeneral) { - $nameColor = \sammo\getNameColor($destGeneral['npc']); - if ($nameColor) { - $nameColor = " style='color:{$nameColor}'"; - } - - $name = $destGeneral['name']; - if ($destGeneral['officer_level'] >= 5) { - $name = "*{$name}*"; - } - - $destGeneral['name'] = $name; - $destGeneral['color'] = $nameColor; - $destGeneralList[] = $destGeneral; - } - ob_start(); -?> -
- 선택된 도시로 아국 장수를 발령합니다.
- 아국 도시로만 발령이 가능합니다.
- 목록을 선택하거나 도시를 클릭하세요.
- -
-
- - diff --git a/hwe/ts/processing/General/che_이동.vue b/hwe/ts/processing/General/che_이동.vue index be74fe18..e1b30294 100644 --- a/hwe/ts/processing/General/che_이동.vue +++ b/hwe/ts/processing/General/che_이동.vue @@ -10,11 +10,21 @@ v-model="selectedCityObj" /> -
+
+ 선택된 도시로 강행합니다.
+ 최대 3칸내 도시로만 강행이 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
선택된 도시로 이동합니다.
인접 도시로만 이동이 가능합니다.
목록을 선택하거나 도시를 클릭하세요.
+
+ 선택된 도시를 향해 침공을 합니다.
+ 침공 경로에 적군의 도시가 있다면 전투를 벌입니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
@@ -47,9 +57,9 @@ declare const mapTheme: string; declare const currentCity: number; declare const commandName: string; declare const procRes: { - distanceList: Record, - cities: [number, string][], -} + distanceList: Record; + cities: [number, string][]; +}; export default defineComponent({ components: { MapLegacyTemplate, diff --git a/hwe/ts/processing/General/che_출병.vue b/hwe/ts/processing/General/che_출병.vue deleted file mode 100644 index 2489570d..00000000 --- a/hwe/ts/processing/General/che_출병.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index c7514e1b..359e441f 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -1,3 +1,7 @@ -export { default as che_강행 } from "./che_강행.vue"; -export { default as che_이동 } from "./che_이동.vue"; -export { default as che_출병 } from "./che_출병.vue"; \ No newline at end of file +import { default as CityProcess} from "./che_이동.vue"; + +export const commandMap: Recordtypeof CityProcess> = { + che_강행: ()=>CityProcess, + che_이동: ()=>CityProcess, + che_출병: ()=>CityProcess, +} \ No newline at end of file diff --git a/hwe/ts/processing/Nation/che_몰수.vue b/hwe/ts/processing/Nation/che_몰수.vue index e3f68332..bd90d2a5 100644 --- a/hwe/ts/processing/Nation/che_몰수.vue +++ b/hwe/ts/processing/Nation/che_몰수.vue @@ -1,10 +1,13 @@ From 77b78d05ac788f849aa6ee6a899a7a7ecd396b4b Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 22 Dec 2021 00:24:51 +0900 Subject: [PATCH 31/38] =?UTF-8?q?feat(WIP):=20processing=20=EA=B3=84?= =?UTF-8?q?=EB=9E=B5=20=EC=84=B8=EB=B6=80=20-=20=EA=B8=B0=ED=83=80=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=9E=94=EC=97=AC=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_징병.php | 7 ----- hwe/sammo/Command/General/che_첩보.php | 27 ++++------------- hwe/sammo/Command/General/che_화계.php | 29 ++++--------------- hwe/sammo/Command/Nation/che_선전포고.php | 7 ----- .../General/{che_이동.vue => CityProcess.vue} | 12 ++++++++ hwe/ts/processing/General/index.ts | 16 ++++++---- 6 files changed, 35 insertions(+), 63 deletions(-) rename hwe/ts/processing/General/{che_이동.vue => CityProcess.vue} (84%) diff --git a/hwe/sammo/Command/General/che_징병.php b/hwe/sammo/Command/General/che_징병.php index 011e657e..5fc86816 100644 --- a/hwe/sammo/Command/General/che_징병.php +++ b/hwe/sammo/Command/General/che_징병.php @@ -333,13 +333,6 @@ class che_징병 extends Command\GeneralCommand ]; } - public function getJSPlugins(): array - { - return [ - 'recruitCrewForm' - ]; - } - public function getForm(): string { $db = DB::db(); diff --git a/hwe/sammo/Command/General/che_첩보.php b/hwe/sammo/Command/General/che_첩보.php index f1615be2..5a5f73f3 100644 --- a/hwe/sammo/Command/General/che_첩보.php +++ b/hwe/sammo/Command/General/che_첩보.php @@ -225,29 +225,14 @@ class che_첩보 extends Command\GeneralCommand return true; } - public function getJSPlugins(): array + public function exportJSVars(): array { return [ - 'defaultSelectCityByMap' + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), + ], ]; } - - public function getForm(): string - { - $currentCityID = $this->generalObj->getCityID(); - ob_start(); -?> -
- 선택된 도시에 첩보를 실행합니다.
- 인접도시일 경우 많은 정보를 얻을 수 있습니다.
- 목록을 선택하거나 도시를 클릭하세요.
-
-
-
- - \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => \sammo\JSCitiesBasedOnDistance($this->generalObj->getCityID(), 3), + ], ]; } - - public function getForm(): string - { - $currentCityID = $this->generalObj->getCityID(); - $commandName = $this->getName(); - $josaUl = JosaUtil::pick($commandName, '을'); - - ob_start(); -?> -
- 선택된 도시에 실행합니다.
- 목록을 선택하거나 도시를 클릭하세요.
-
-
-
- - 목록을 선택하거나 도시를 클릭하세요.
+
+ 선택된 도시에 첩보를 실행합니다.
+ 인접도시일 경우 많은 정보를 얻을 수 있습니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시에 {{ commandName }}{{JosaPick(commandName, '을')}} + 실행합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
도시: @@ -54,6 +64,7 @@ import { unwrap } from "@/util/unwrap"; import { Args } from "@/processing/args"; import TopBackBar from "@/components/TopBackBar.vue"; import BottomBar from "@/components/BottomBar.vue"; +import { pick as JosaPick } from "@util/JosaUtil"; declare const mapTheme: string; declare const currentCity: number; declare const commandName: string; @@ -108,6 +119,7 @@ export default defineComponent({ selectedCityObj: ref(undefined as MapCityParsed | undefined), distanceList: procRes.distanceList, commandName, + JosaPick, selected, submit, }; diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index 70d4d7a6..d1e4a7b0 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -3,11 +3,13 @@ import { default as che_군량매매 } from "./che_군량매매.vue"; import { default as che_등용 } from "./che_등용.vue"; import { default as che_선양 } from "./che_선양.vue"; -import { default as CityProcess } 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 CityProcess } from "./CityProcess.vue"; + + //TODO: 자주 쓰는 녀석들은 Slot으로 변경 export const commandMap: Record = { @@ -15,23 +17,27 @@ export const commandMap: Record = { che_군량매매, che_건국, che_등용, + che_모병: che_징병, + che_선동: CityProcess, che_선양, che_이동: CityProcess, che_임관, - che_출병: CityProcess, che_장수대상임관, che_징병, - che_모병: che_징병, + che_첩보: CityProcess, + che_출병: CityProcess, + che_탈취: CityProcess, + che_파괴: CityProcess, + che_화계: CityProcess, } /* - 항목들 -장수+ - 장수대상임관 장수/금쌀/분량 - 증여(포상 이식) 금쌀/분량 - 헌납(군량매매 또는 포상 수정) 도시 - 첩보, 계략(화계 등) -고유 양식 - 숙련전환, 장비매매, 징병 +고유 양식 - 숙련전환, 장비매매 From cde55ab574bb295cebe552f81218775669a246cb Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 22 Dec 2021 01:01:06 +0900 Subject: [PATCH 32/38] =?UTF-8?q?feat(WIP):=20processing=20=EB=AC=BC?= =?UTF-8?q?=EC=9E=90=EC=9B=90=EC=A1=B0=20-=20nations,=20nationList?= =?UTF-8?q?=EB=A5=BC=20nationList=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/Nation/che_급습.php | 2 +- hwe/sammo/Command/Nation/che_물자원조.php | 194 +++++++++++------- hwe/sammo/Command/Nation/che_선전포고.php | 2 +- hwe/ts/processing/AmountSelect.vue | 8 +- hwe/ts/processing/General/che_임관.vue | 10 +- .../processing/General/che_장수대상임관.vue | 12 +- hwe/ts/processing/Nation/che_물자원조.vue | 129 ++++++++++++ hwe/ts/processing/Nation/che_선전포고.vue | 14 +- hwe/ts/processing/Nation/index.ts | 3 + 9 files changed, 280 insertions(+), 94 deletions(-) create mode 100644 hwe/ts/processing/Nation/che_물자원조.vue diff --git a/hwe/sammo/Command/Nation/che_급습.php b/hwe/sammo/Command/Nation/che_급습.php index 14aaf13b..39f7d03e 100644 --- a/hwe/sammo/Command/Nation/che_급습.php +++ b/hwe/sammo/Command/Nation/che_급습.php @@ -223,7 +223,7 @@ class che_급습 extends Command\NationCommand return [ 'mapTheme' => \sammo\getMapTheme(), 'procRes' => [ - 'nations' => $nationList, + 'nationList' => $nationList, 'startYear' => $this->env['startyear'], ], ]; diff --git a/hwe/sammo/Command/Nation/che_물자원조.php b/hwe/sammo/Command/Nation/che_물자원조.php index 8c52fc5b..e77cc6e1 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; } - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!key_exists('amountList', $this->arg)){ + if (!key_exists('amountList', $this->arg)) { return false; } $amountList = $this->arg['amountList']; - if(!is_array($amountList)){ + if (!is_array($amountList)) { return false; } - if(count($amountList) != 2){ + if (count($amountList) != 2) { return false; } [$goldAmount, $riceAmount] = $amountList; - if(!is_int($goldAmount) || !is_int($riceAmount)){ + if (!is_int($goldAmount) || !is_int($riceAmount)) { return false; } - if($goldAmount < 0 || $riceAmount < 0){ + if ($goldAmount < 0 || $riceAmount < 0) { return false; } - if($goldAmount == 0 && $riceAmount == 0){ + if ($goldAmount == 0 && $riceAmount == 0) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'amountList'=>[$goldAmount, $riceAmount] + 'destNationID' => $destNationID, + 'amountList' => [$goldAmount, $riceAmount] ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(['gold', 'rice', 'surlimit']); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), @@ -94,47 +101,51 @@ class che_물자원조 extends Command\NationCommand{ [$goldAmount, $riceAmount] = $this->arg['amountList']; $limit = $this->nation['level'] * GameConst::$coefAidAmount; - if($goldAmount > $limit || $riceAmount > $limit){ - $this->fullConditionConstraints[ - ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.') - ]; + if ($goldAmount > $limit || $riceAmount > $limit) { + $this->fullConditionConstraints[ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')]; return; } - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::ExistsDestNation(), ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), - ConstraintHelper::ReqNationGold(GameConst::$basegold+(($goldAmount>0)?1:0)), - ConstraintHelper::ReqNationRice(GameConst::$baserice+(($riceAmount>0)?1:0)), + ConstraintHelper::ReqNationGold(GameConst::$basegold + (($goldAmount > 0) ? 1 : 0)), + ConstraintHelper::ReqNationRice(GameConst::$baserice + (($riceAmount > 0) ? 1 : 0)), ConstraintHelper::ReqNationValue('surlimit', '외교제한', '==', 0, '외교제한중입니다.'), ConstraintHelper::ReqDestNationValue('surlimit', '외교제한', '==', 0, '상대국이 외교제한중입니다.'), ]; } - 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 + { //NOTE: 자체 postReqTurn 사용 return 12; } - public function getNextAvailableTurn():?int{ + public function getNextAvailableTurn(): ?int + { return null; } - public function setNextAvailable(?int $yearMonth=null){ + public function setNextAvailable(?int $yearMonth = null) + { return; } - public function getBrief():string{ + public function getBrief(): string + { [$goldAmount, $riceAmount] = $this->arg['amountList']; $goldAmountText = number_format($goldAmount); $riceAmountText = number_format($riceAmount); @@ -144,8 +155,9 @@ class che_물자원조 extends Command\NationCommand{ } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -196,7 +208,7 @@ class che_물자원조 extends Command\NationCommand{ $broadcastMessage = "{$destNationName}{$josaRo} 금{$goldAmountText} 쌀{$riceAmountText}을 지원했습니다."; $chiefList = $db->queryFirstColumn('SELECT no FROM general WHERE officer_level >= 5 AND no != %i AND nation = %i', $generalID, $nationID); - foreach($chiefList as $chiefID){ + foreach ($chiefList as $chiefID) { $chiefLogger = new ActionLogger($chiefID, $nationID, $year, $month); $chiefLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $chiefLogger->flush(); @@ -211,7 +223,7 @@ class che_물자원조 extends Command\NationCommand{ $destBroadcastMessage = $broadcastMessage = "{$nationName}에서 금{$goldAmountText} 쌀{$riceAmountText}을 원조했습니다."; $destChiefList = $db->queryFirstColumn('SELECT no FROM general WHERE officer_level >= 5 AND nation = %i', $destNationID); - foreach($destChiefList as $destChiefID){ + foreach ($destChiefList as $destChiefID) { $destChiefLogger = new ActionLogger($destChiefID, $nationID, $year, $month); $destChiefLogger->pushGeneralActionLog($destBroadcastMessage, ActionLogger::PLAIN); $destChiefLogger->flush(); @@ -222,19 +234,19 @@ class che_물자원조 extends Command\NationCommand{ $destNationLogger->pushNationalHistoryLog("{$nationName}{$josaRoSrc}부터 금{$goldAmountText} 쌀{$riceAmountText}을 지원 받음"); $destNationStor = KVStorage::getStorage(DB::db(), $destNationID, 'nation_env'); - $destRecvAssist = $destNationStor->getValue('recv_assist')??[]; - $destRecvAssist["n{$nationID}"] = [$nationID, ($destRecvAssist["n{$nationID}"][1]??0) + $goldAmount + $riceAmount]; + $destRecvAssist = $destNationStor->getValue('recv_assist') ?? []; + $destRecvAssist["n{$nationID}"] = [$nationID, ($destRecvAssist["n{$nationID}"][1] ?? 0) + $goldAmount + $riceAmount]; $destNationStor->setValue('recv_assist', $destRecvAssist); $db->update('nation', [ - 'gold'=>$db->sqleval('gold - %i', $goldAmount), - 'rice'=>$db->sqleval('rice - %i', $riceAmount), - 'surlimit'=>$db->sqleval('surlimit + %i', $this->getPostReqTurn()) + 'gold' => $db->sqleval('gold - %i', $goldAmount), + 'rice' => $db->sqleval('rice - %i', $riceAmount), + 'surlimit' => $db->sqleval('surlimit + %i', $this->getPostReqTurn()) ], 'nation = %i', $nationID); $db->update('nation', [ - 'gold'=>$db->sqleval('gold + %i', $goldAmount), - 'rice'=>$db->sqleval('rice + %i', $riceAmount), + 'gold' => $db->sqleval('gold + %i', $goldAmount), + 'rice' => $db->sqleval('rice + %i', $riceAmount), ], 'nation = %i', $destNationID); $general->addExperience(5); @@ -246,6 +258,51 @@ class che_물자원조 extends Command\NationCommand{ return true; } + public function exportJSVars(): array + { + $generalObj = $this->generalObj; + $nationList = []; + foreach (getAllNationStaticInfo() as $destNation) { + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + + //TODO: 물자원조 자체가 가능한지도 검사? + + if($nationTarget['id'] == $generalObj->getNationID()){ + $nationTarget['notAvailable'] = true; + } + + $nationList[] = $nationTarget; + } + $currentNationLevel = getNationStaticInfo($this->generalObj->getNationID())['level']; + + $nationLevelText = []; + foreach (\sammo\getNationLevelList() as $level => [$levelText,,]) { + $nationLevelText[$level] = $levelText; + } + + $amountGuide = []; + foreach (Util::range(1, $currentNationLevel + 1) as $nationLevel) { + $amountGuide[] = $nationLevel * GameConst::$coefAidAmount; + } + + return [ + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'currentNationLevel' => $currentNationLevel, + 'nationLevelText' => $nationLevelText, + 'minAmount' => 1000, + 'maxAmount' => Util::array_last($amountGuide), + 'amountGuide' => $amountGuide, + ], + ]; + } + public function getJSPlugins(): array { return [ @@ -259,34 +316,31 @@ class che_물자원조 extends Command\NationCommand{ $currentNationLevel = getNationStaticInfo($this->generalObj->getNationID())['level']; ob_start(); ?> -
-타국에게 원조합니다.
-작위별로 금액 제한이 있습니다.
- [$levelText,,]): ?> -:
- -원조할 국가를 목록에서 선택하세요.
- -국고 -병량 -
-
+
+ 타국에게 원조합니다.
+ 작위별로 금액 제한이 있습니다.
+ [$levelText,,]) : ?> + :
+ + 원조할 국가를 목록에서 선택하세요.
+ + 국고 + 병량 +
+
\sammo\getMapTheme(), 'procRes' => [ - 'nations' => $nationList, + 'nationList' => $nationList, 'startYear' => $this->env['startyear'], ], ]; diff --git a/hwe/ts/processing/AmountSelect.vue b/hwe/ts/processing/AmountSelect.vue index b8bbbd1e..2f50b9b1 100644 --- a/hwe/ts/processing/AmountSelect.vue +++ b/hwe/ts/processing/AmountSelect.vue @@ -20,6 +20,7 @@ class="form-control" :max="maxAmount" :min="minAmount" + :step="step" v-model="amount" placeholder="금액" /> @@ -69,8 +70,13 @@ export default defineComponent({ }, amountGuide: { type: Array as PropType, - reqquired: false, + required: false, }, + step: { + type: Number, + required: false, + default: 1, + } }, emits: ["update:modelValue"], watch: { diff --git a/hwe/ts/processing/General/che_임관.vue b/hwe/ts/processing/General/che_임관.vue index 66aff13a..b2771b63 100644 --- a/hwe/ts/processing/General/che_임관.vue +++ b/hwe/ts/processing/General/che_임관.vue @@ -10,7 +10,7 @@
국가 : - +
{{ commandName }} @@ -22,7 +22,7 @@
임관권유문
(); + const nationList = new Map(); for (const nationItem of procRes.nationList) { - nations.set(nationItem.id, nationItem); + nationList.set(nationItem.id, nationItem); } const selectedNationID = ref(procRes.nationList[0].id); @@ -89,7 +89,7 @@ export default defineComponent({ } return { - nations: ref(nations), + nationList: ref(nationList), selectedNationID, commandName, isBrightColor, diff --git a/hwe/ts/processing/General/che_장수대상임관.vue b/hwe/ts/processing/General/che_장수대상임관.vue index d902fa36..f1ab5e90 100644 --- a/hwe/ts/processing/General/che_장수대상임관.vue +++ b/hwe/ts/processing/General/che_장수대상임관.vue @@ -97,9 +97,9 @@ export default defineComponent({ return name; } - const nations = new Map(); + const nationList = new Map(); for (const nationItem of procRes.nationList) { - nations.set(nationItem.id, nationItem); + nationList.set(nationItem.id, nationItem); } async function submit(e: Event) { @@ -111,16 +111,10 @@ export default defineComponent({ unwrap(e.target).dispatchEvent(event); } - const nationList = new Map(); - for (const nationItem of procRes.nationList) { - nationList.set(nationItem.id, nationItem); - } - return { - nations: ref(nations), + nationList: ref(nationList), selectedGeneralID, generalList, - nationList, commandName, isBrightColor, textHelpGeneral, diff --git a/hwe/ts/processing/Nation/che_물자원조.vue b/hwe/ts/processing/Nation/che_물자원조.vue new file mode 100644 index 00000000..eeff6f85 --- /dev/null +++ b/hwe/ts/processing/Nation/che_물자원조.vue @@ -0,0 +1,129 @@ + + + diff --git a/hwe/ts/processing/Nation/che_선전포고.vue b/hwe/ts/processing/Nation/che_선전포고.vue index 2b2371f9..a2b2b393 100644 --- a/hwe/ts/processing/Nation/che_선전포고.vue +++ b/hwe/ts/processing/Nation/che_선전포고.vue @@ -29,7 +29,7 @@
국가 : - +
{{ commandName }} @@ -54,7 +54,7 @@ declare const mapTheme: string; declare const commandName: string; declare const procRes: { - nations: procNationList; + nationList: procNationList; startYear: number, }; @@ -74,12 +74,12 @@ export default defineComponent({ }, }, setup() { - const nations = new Map(); - for (const nationItem of procRes.nations) { - nations.set(nationItem.id, nationItem); + const nationList = new Map(); + for (const nationItem of procRes.nationList) { + nationList.set(nationItem.id, nationItem); } - const selectedNationID = ref(procRes.nations[0].id); + const selectedNationID = ref(procRes.nationList[0].id); const selectedCityObj = ref();//mapping용 function selectedNation(nationID: number) { @@ -98,7 +98,7 @@ export default defineComponent({ return { startYear: procRes.startYear, mapTheme: ref(mapTheme), - nations: ref(nations), + nationList: ref(nationList), selectedCityObj, selectedNationID, commandName, diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts index 73bee302..4c3624b3 100644 --- a/hwe/ts/processing/Nation/index.ts +++ b/hwe/ts/processing/Nation/index.ts @@ -1,5 +1,7 @@ import { default as che_국기변경 } from "./che_국기변경.vue"; import { default as che_국호변경 } from "./che_국호변경.vue"; +import { default as che_물자원조 } from "./che_물자원조.vue"; + import { default as NationProcess } from "./che_선전포고.vue"; import { default as GeneralAmountProcess } from "./che_몰수.vue"; import { default as GeneralCityProcess } from "./che_발령.vue"; @@ -9,6 +11,7 @@ export const commandMap: Record = { che_국호변경, che_급습: NationProcess, che_몰수: GeneralAmountProcess, + che_물자원조, che_선전포고: NationProcess, che_포상: GeneralAmountProcess, che_발령: GeneralCityProcess, From 291976893aadaf0a1d7f3c4df1ebbb204518eeff Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 22 Dec 2021 02:06:40 +0900 Subject: [PATCH 33/38] =?UTF-8?q?refac(WIP):=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/Nation/che_물자원조.php | 49 +---- .../Command/Nation/che_불가침파기제의.php | 38 ++++ hwe/sammo/Command/Nation/che_이호경식.php | 54 +++--- hwe/sammo/Command/Nation/che_종전제의.php | 69 +++----- hwe/sammo/Command/Nation/che_피장파장.php | 167 +++++++++--------- hwe/ts/processing/General/che_건국.vue | 2 +- hwe/ts/processing/General/che_군량매매.vue | 8 +- hwe/ts/processing/General/che_등용.vue | 6 +- hwe/ts/processing/General/che_선양.vue | 6 +- hwe/ts/processing/General/che_임관.vue | 6 +- .../processing/General/che_장수대상임관.vue | 6 +- hwe/ts/processing/General/index.ts | 21 ++- hwe/ts/processing/Nation/che_국기변경.vue | 2 +- hwe/ts/processing/Nation/che_몰수.vue | 14 +- hwe/ts/processing/Nation/che_물자원조.vue | 51 ++++-- hwe/ts/processing/Nation/che_발령.vue | 12 +- .../{che_선전포고.vue => che_피장파장.vue} | 66 +++++-- hwe/ts/processing/Nation/index.ts | 27 +-- .../CityProcess.vue => ProcessCity.vue} | 6 +- hwe/ts/processing/ProcessNation.vue | 135 ++++++++++++++ .../{AmountSelect.vue => SelectAmount.vue} | 32 ++-- .../{CitySelect.vue => SelectCity.vue} | 0 .../{ColorSelect.vue => SelectColor.vue} | 0 .../{GeneralSelect.vue => SelectGeneral.vue} | 0 .../{NationSelect.vue => SelectNation.vue} | 0 25 files changed, 465 insertions(+), 312 deletions(-) rename hwe/ts/processing/Nation/{che_선전포고.vue => che_피장파장.vue} (59%) rename hwe/ts/processing/{General/CityProcess.vue => ProcessCity.vue} (96%) create mode 100644 hwe/ts/processing/ProcessNation.vue rename hwe/ts/processing/{AmountSelect.vue => SelectAmount.vue} (80%) rename hwe/ts/processing/{CitySelect.vue => SelectCity.vue} (100%) rename hwe/ts/processing/{ColorSelect.vue => SelectColor.vue} (100%) rename hwe/ts/processing/{GeneralSelect.vue => SelectGeneral.vue} (100%) rename hwe/ts/processing/{NationSelect.vue => SelectNation.vue} (100%) diff --git a/hwe/sammo/Command/Nation/che_물자원조.php b/hwe/sammo/Command/Nation/che_물자원조.php index e77cc6e1..7687d68c 100644 --- a/hwe/sammo/Command/Nation/che_물자원조.php +++ b/hwe/sammo/Command/Nation/che_물자원조.php @@ -272,7 +272,7 @@ class che_물자원조 extends Command\NationCommand //TODO: 물자원조 자체가 가능한지도 검사? - if($nationTarget['id'] == $generalObj->getNationID()){ + if ($nationTarget['id'] == $generalObj->getNationID()) { $nationTarget['notAvailable'] = true; } @@ -280,9 +280,9 @@ class che_물자원조 extends Command\NationCommand } $currentNationLevel = getNationStaticInfo($this->generalObj->getNationID())['level']; - $nationLevelText = []; + $levelInfo = []; foreach (\sammo\getNationLevelList() as $level => [$levelText,,]) { - $nationLevelText[$level] = $levelText; + $levelInfo[$level] = ['text' => $levelText, 'amount' => $level * GameConst::$coefAidAmount]; } $amountGuide = []; @@ -295,52 +295,11 @@ class che_물자원조 extends Command\NationCommand 'procRes' => [ 'nationList' => $nationList, 'currentNationLevel' => $currentNationLevel, - 'nationLevelText' => $nationLevelText, + 'levelInfo' => $levelInfo, 'minAmount' => 1000, 'maxAmount' => Util::array_last($amountGuide), 'amountGuide' => $amountGuide, ], ]; } - - public function getJSPlugins(): array - { - return [ - 'defaultSelectNationByMap' - ]; - } - - - public function getForm(): string - { - $currentNationLevel = getNationStaticInfo($this->generalObj->getNationID())['level']; - ob_start(); -?> -
- 타국에게 원조합니다.
- 작위별로 금액 제한이 있습니다.
- [$levelText,,]) : ?> - :
- - 원조할 국가를 목록에서 선택하세요.
- - 국고 - 병량 -
-
-generalObj; + $nationID = $generalObj->getNationID(); + $nationList = []; + + $db = DB::db(); + $diplomacyStatus = Util::convertArrayToDict( + $db->query('SELECT * FROM diplomacy WHERE me = %i', $nationID), + 'you' + ); + + foreach (getAllNationStaticInfo() as $destNation) { + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + + if($diplomacyStatus[$destNation['nation']]['state'] != 7){ + $nationTarget['notAvailable'] = true; + } + if ($destNation['id'] == $nationID) { + $nationTarget['notAvailable'] = true; + } + + $nationList[] = $nationTarget; + } + return [ + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'startYear' => $this->env['startyear'], + ], + ]; + } + public function getJSPlugins(): array { return [ diff --git a/hwe/sammo/Command/Nation/che_이호경식.php b/hwe/sammo/Command/Nation/che_이호경식.php index 563e6fad..5d8cc06f 100644 --- a/hwe/sammo/Command/Nation/che_이호경식.php +++ b/hwe/sammo/Command/Nation/che_이호경식.php @@ -199,48 +199,36 @@ class che_이호경식 extends Command\NationCommand return true; } - public function getJSPlugins(): array - { - return [ - 'defaultSelectNationByMap' - ]; - } - - public function getForm(): string + public function exportJSVars(): array { $generalObj = $this->generalObj; $nationID = $generalObj->getNationID(); $nationList = []; $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); foreach (getAllNationStaticInfo() as $destNation) { - if ($destNation['nation'] == $nationID) { - continue; - } - - $testTurn->setArg(['destNationID' => $destNation['nation']]); $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); - if ($testCommand->hasFullConditionMet()) { - $destNation['availableCommand'] = true; - } else { - $destNation['availableCommand'] = false; + + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + if (!$testCommand->hasFullConditionMet()) { + $nationTarget['notAvailable'] = true; + } + if ($destNation['id'] == $nationID) { + $nationTarget['notAvailable'] = true; } - $nationList[] = $destNation; + $nationList[] = $nationTarget; } - - ob_start(); -?> -
- 선택된 국가에 이호경식을 발동합니다.
- 선포, 전쟁중인 상대국에만 가능합니다.
- 상대 국가를 목록에서 선택하세요.
- 배경색은 현재 이호경식 불가능 국가는 붉은색으로 표시됩니다.
- - \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'startYear' => $this->env['startyear'], + ], + ]; } } diff --git a/hwe/sammo/Command/Nation/che_종전제의.php b/hwe/sammo/Command/Nation/che_종전제의.php index 6e26fc6a..7c6d8ea2 100644 --- a/hwe/sammo/Command/Nation/che_종전제의.php +++ b/hwe/sammo/Command/Nation/che_종전제의.php @@ -168,57 +168,36 @@ class che_종전제의 extends Command\NationCommand{ return true; } - public function getJSPlugins(): array - { - return [ - 'defaultSelectNationByMap' - ]; - } - - public function getForm(): string + public function exportJSVars(): array { $generalObj = $this->generalObj; $nationID = $generalObj->getNationID(); - - $db = DB::db(); - $diplomacyStatus = Util::convertArrayToDict( - $db->query('SELECT * FROM diplomacy WHERE me = %i', $nationID), - 'you' - ); - $nationList = []; - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ - continue; + $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); + foreach (getAllNationStaticInfo() as $destNation) { + $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); + + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + if (!$testCommand->hasFullConditionMet()) { + $nationTarget['notAvailable'] = true; + } + if ($destNation['id'] == $nationID) { + $nationTarget['notAvailable'] = true; } - if(!in_array($diplomacyStatus[$destNation['nation']]['state'], [0, 1])){ - $destNation['cssBgColor'] = 'background-color:red;'; - } - else{ - $destNation['cssBgColor'] = ''; - } - - $nationList[] = $destNation; + $nationList[] = $nationTarget; } - - ob_start(); -?> -
-전쟁중인 국가에 종전을 제의합니다.
-제의할 국가를 목록에서 선택하세요.
-배경색은 현재 제의가 불가능한 국가는 붉은색으로 표시됩니다.
-
-에게 - - \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'startYear' => $this->env['startyear'], + ], + ]; } } \ No newline at end of file diff --git a/hwe/sammo/Command/Nation/che_피장파장.php b/hwe/sammo/Command/Nation/che_피장파장.php index 20fabea0..0d45620d 100644 --- a/hwe/sammo/Command/Nation/che_피장파장.php +++ b/hwe/sammo/Command/Nation/che_피장파장.php @@ -1,16 +1,21 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } - if(!key_exists('commandType', $this->arg)){ + if (!key_exists('commandType', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; $commandType = $this->arg['commandType']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!is_string($commandType)){ + if (!is_string($commandType)) { return false; } - if(!in_array($commandType, GameConst::$availableChiefCommand['전략'])){ + if (!in_array($commandType, GameConst::$availableChiefCommand['전략'])) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'commandType'=>$commandType + 'destNationID' => $destNationID, + 'commandType' => $commandType ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -69,7 +77,7 @@ class che_피장파장 extends Command\NationCommand{ $this->setCity(); $this->setNation(); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ]; @@ -79,8 +87,8 @@ class che_피장파장 extends Command\NationCommand{ { $this->setDestNation($this->arg['destNationID'], null); - if($this->getNationID() == 0){ - $this->fullConditionConstraints=[ + if ($this->getNationID() == 0) { + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity() ]; return; @@ -90,14 +98,14 @@ class che_피장파장 extends Command\NationCommand{ $currYearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']); $nextAvailableTurn = $cmd->getNextAvailableTurn(); - if($currYearMonth < $nextAvailableTurn){ - $this->fullConditionConstraints=[ + if ($currYearMonth < $nextAvailableTurn) { + $this->fullConditionConstraints = [ ConstraintHelper::AlwaysFail('해당 전략을 아직 사용할 수 없습니다') ]; return; } - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::ExistsDestNation(), @@ -108,35 +116,41 @@ class che_피장파장 extends Command\NationCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; return "{$name}/{$reqTurn}턴(대상 재사용 대기 {$this->getTargetPostReqTurn()})"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - public function getPreReqTurn():int{ + public function getPreReqTurn(): int + { return 1; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getTargetPostReqTurn():int{ + public function getTargetPostReqTurn(): int + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*2)*10); + $nextTerm = Util::round(sqrt($genCount * 2) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); $nextTerm = Util::valueFit($nextTerm, Util::round(static::$delayCnt * 1.2)); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $cmd = buildNationCommandClass($this->arg['commandType'], $this->generalObj, $this->env, new LastTurn()); $targetCommandName = $cmd->getName(); @@ -145,8 +159,9 @@ class che_피장파장 extends Command\NationCommand{ } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -187,7 +202,7 @@ class che_피장파장 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destNationName}{$cmd->getName()} 전략의 {$commandName}{$josaUl} 발동하였습니다."; $nationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($nationGeneralList as $nationGeneralID){ + foreach ($nationGeneralList as $nationGeneralID) { $nationGeneralLogger = new ActionLogger($nationGeneralID, $nationID, $year, $month); $nationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $nationGeneralLogger->flush(); @@ -198,7 +213,7 @@ class che_피장파장 extends Command\NationCommand{ $broadcastMessage = "아국에 {$cmd->getName()} 전략의 {$commandName}{$josaYiCommand} 발동되었습니다."; $destNationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $destNationID, $generalID); - foreach($destNationGeneralList as $destNationGeneralID){ + foreach ($destNationGeneralList as $destNationGeneralID) { $destNationGeneralLogger = new ActionLogger($destNationGeneralID, $destNationID, $year, $month); $destNationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $destNationGeneralLogger->flush(); @@ -222,79 +237,55 @@ class che_피장파장 extends Command\NationCommand{ return true; } - public function getJSPlugins(): array - { - return [ - 'defaultSelectNationByMap' - ]; - } - - public function getForm(): string + public function exportJSVars(): array { $generalObj = $this->generalObj; $nationID = $generalObj->getNationID(); $nationList = []; $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ - continue; + foreach (getAllNationStaticInfo() as $destNation) { + $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); + + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; + if (!$testCommand->hasFullConditionMet()) { + $nationTarget['notAvailable'] = true; + } + if ($destNation['id'] == $nationID) { + $nationTarget['notAvailable'] = true; } - $testTurn->setArg(['destNationID'=>$destNation['nation']]); - $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID'=>$destNation['nation']]); - if($testCommand->hasFullConditionMet()){ - $destNation['availableCommand'] = true; - } - else{ - $destNation['availableCommand'] = false; - } - - $nationList[] = $destNation; + $nationList[] = $nationTarget; } + $availableCommandTypeList = []; $currYearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']); - foreach(GameConst::$availableChiefCommand['전략'] as $commandType){ + foreach (GameConst::$availableChiefCommand['전략'] as $commandType) { $cmd = buildNationCommandClass($commandType, $generalObj, $this->env, new LastTurn()); $cmdName = $cmd->getName(); $remainTurn = 0; $nextAvailableTurn = $cmd->getNextAvailableTurn(); - if($nextAvailableTurn !== null && $currYearMonth < $nextAvailableTurn){ + if ($nextAvailableTurn !== null && $currYearMonth < $nextAvailableTurn) { $remainTurn = $nextAvailableTurn - $currYearMonth; } - $availableCommandTypeList[$commandType] = [$cmdName, $remainTurn]; + $availableCommandTypeList[$commandType] = ['name' => $cmdName, 'remainTurn' => $remainTurn]; } - ob_start(); -?> -
-선택된 국가에 피장파장을 발동합니다.
-지정한 전략을 상대국이 턴 동안 사용할 수 없게됩니다.
-대신 아국은 지정한 전략을getTargetPostReqTurn()?>턴 동안 사용할 수 없습니다.
-선포, 전쟁중인 상대국에만 가능합니다.
-상대 국가를 목록에서 선택하세요.
-배경색은 현재 피장파장 불가능 국가는 붉은색으로 표시됩니다.
-에 - 전략을 - - \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'startYear' => $this->env['startyear'], + 'delayCnt' => static::$delayCnt, + 'postReqTurn' => $this->getTargetPostReqTurn(), + 'availableCommandTypeList' => $availableCommandTypeList + ], + ]; } -} \ No newline at end of file +} diff --git a/hwe/ts/processing/General/che_건국.vue b/hwe/ts/processing/General/che_건국.vue index f5f49147..970b2fc7 100644 --- a/hwe/ts/processing/General/che_건국.vue +++ b/hwe/ts/processing/General/che_건국.vue @@ -38,7 +38,7 @@ diff --git a/hwe/ts/processing/AmountSelect.vue b/hwe/ts/processing/SelectAmount.vue similarity index 80% rename from hwe/ts/processing/AmountSelect.vue rename to hwe/ts/processing/SelectAmount.vue index 2f50b9b1..c16a474c 100644 --- a/hwe/ts/processing/AmountSelect.vue +++ b/hwe/ts/processing/SelectAmount.vue @@ -1,19 +1,22 @@ @@ -76,7 +82,7 @@ export default defineComponent({ type: Number, required: false, default: 1, - } + }, }, emits: ["update:modelValue"], watch: { diff --git a/hwe/ts/processing/CitySelect.vue b/hwe/ts/processing/SelectCity.vue similarity index 100% rename from hwe/ts/processing/CitySelect.vue rename to hwe/ts/processing/SelectCity.vue diff --git a/hwe/ts/processing/ColorSelect.vue b/hwe/ts/processing/SelectColor.vue similarity index 100% rename from hwe/ts/processing/ColorSelect.vue rename to hwe/ts/processing/SelectColor.vue diff --git a/hwe/ts/processing/GeneralSelect.vue b/hwe/ts/processing/SelectGeneral.vue similarity index 100% rename from hwe/ts/processing/GeneralSelect.vue rename to hwe/ts/processing/SelectGeneral.vue diff --git a/hwe/ts/processing/NationSelect.vue b/hwe/ts/processing/SelectNation.vue similarity index 100% rename from hwe/ts/processing/NationSelect.vue rename to hwe/ts/processing/SelectNation.vue From 4178927b6fd6788af7888b536543ce9e364296b9 Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 22 Dec 2021 02:23:06 +0900 Subject: [PATCH 34/38] =?UTF-8?q?feat(WIP):=20=EC=A6=9D=EC=97=AC,=ED=97=8C?= =?UTF-8?q?=EB=82=A9,=EB=B0=B1=EC=84=B1=EB=8F=99=EC=9B=90,=EC=88=98?= =?UTF-8?q?=EB=AA=B0,=EC=B2=9C=EB=8F=84,=EC=B4=88=ED=86=A0=ED=99=94,?= =?UTF-8?q?=ED=97=88=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_증여.php | 48 ++++------ hwe/sammo/Command/General/che_헌납.php | 11 +++ hwe/sammo/Command/Nation/che_백성동원.php | 82 ++++++++--------- hwe/sammo/Command/Nation/che_수몰.php | 89 ++++++++++--------- hwe/sammo/Command/Nation/che_천도.php | 25 ++---- hwe/sammo/Command/Nation/che_초토화.php | 36 ++------ hwe/sammo/Command/Nation/che_허보.php | 25 ++---- hwe/ts/processing/General/che_헌납.vue | 79 ++++++++++++++++ hwe/ts/processing/General/index.ts | 11 +-- hwe/ts/processing/Nation/index.ts | 10 ++- hwe/ts/processing/ProcessCity.vue | 31 ++++++- .../che_몰수.vue => ProcessGeneralAmount.vue} | 6 +- hwe/ts/processing/SelectGeneral.vue | 1 - 13 files changed, 253 insertions(+), 201 deletions(-) create mode 100644 hwe/ts/processing/General/che_헌납.vue rename hwe/ts/processing/{Nation/che_몰수.vue => ProcessGeneralAmount.vue} (95%) diff --git a/hwe/sammo/Command/General/che_증여.php b/hwe/sammo/Command/General/che_증여.php index c89fdb39..81521971 100644 --- a/hwe/sammo/Command/General/che_증여.php +++ b/hwe/sammo/Command/General/che_증여.php @@ -177,40 +177,22 @@ class che_증여 extends Command\GeneralCommand return true; } - public function getForm(): string + public function exportJSVars(): array { - //TODO: 암행부처럼 보여야... $db = DB::db(); - - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation != 0 AND nation = %i AND no != %i ORDER BY npc,binary(name)', $this->generalObj->getNationID(), $this->generalObj->getID()); - ob_start(); -?> - 자신의 자금이나 군량을 다른 장수에게 증여합니다.
- 장수를 선택하세요.
- - -
-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 [ + 'procRes' => [ + 'troops' => $troops, + 'generals' => $destRawGenerals, + 'generalsKey' => ['no', 'name', 'officerLevel', 'npc', 'gold', 'rice', 'leadership', 'strength', 'intel', 'cityID', 'crew', 'train', 'atmos', 'troopID'], + 'cities' => \sammo\JSOptionsForCities(), + 'minAmount' => 100, + 'maxAmount' => GameConst::$maxResourceActionAmount, + 'amountGuide' => GameConst::$resourceActionAmountGuide, + ] + ]; } } diff --git a/hwe/sammo/Command/General/che_헌납.php b/hwe/sammo/Command/General/che_헌납.php index c05fd72f..cd8eebe6 100644 --- a/hwe/sammo/Command/General/che_헌납.php +++ b/hwe/sammo/Command/General/che_헌납.php @@ -152,6 +152,17 @@ class che_헌납 extends Command\GeneralCommand return true; } + public function exportJSVars(): array + { + return [ + 'procRes' => [ + 'minAmount' => 100, + 'maxAmount' => GameConst::$maxResourceActionAmount, + 'amountGuide' => GameConst::$resourceActionAmountGuide, + ] + ]; + } + public function getForm(): string { ob_start(); diff --git a/hwe/sammo/Command/Nation/che_백성동원.php b/hwe/sammo/Command/Nation/che_백성동원.php index 92607988..09033e6c 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; } - 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; } $destCityID = $this->arg['destCityID']; $this->arg = [ - 'destCityID'=>$destCityID, + 'destCityID' => $destCityID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -49,7 +56,7 @@ class che_백성동원 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::AvailableStrategicCommand() @@ -61,7 +68,7 @@ class che_백성동원 extends Command\NationCommand{ $this->setDestCity($this->arg['destCityID']); $this->setDestNation($this->destCity['nation']); - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::OccupiedDestCity(), @@ -69,38 +76,44 @@ class che_백성동원 extends Command\NationCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; $postReqTurn = $this->getPostReqTurn(); return "{$name}/{$reqTurn}턴(재사용 대기 $postReqTurn)"; } - 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 + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*4)*10); + $nextTerm = Util::round(sqrt($genCount * 4) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; return "【{$destCityName}】에 {$commandName}"; } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -132,7 +145,7 @@ class che_백성동원 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destCityName}백성동원을 하였습니다."; $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($targetGeneralList as $targetGeneralID){ + foreach ($targetGeneralList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $nationID, $year, $month); $targetLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $targetLogger->flush(); @@ -159,27 +172,14 @@ class che_백성동원 extends Command\NationCommand{ return true; } - public function getJSPlugins(): array + public function exportJSVars(): array { return [ - 'defaultSelectCityByMap' + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => new \stdClass(), + ], ]; } - - - public function getForm(): string - { - ob_start(); -?> -
-선택된 도시에 백성을 동원해 성벽을 쌓습니다.
-아국 도시만 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
-arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { 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; } $destCityID = $this->arg['destCityID']; $this->arg = [ - 'destCityID'=>$destCityID, + 'destCityID' => $destCityID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -51,7 +58,7 @@ class che_수몰 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::AvailableStrategicCommand(), @@ -63,7 +70,7 @@ class che_수몰 extends Command\NationCommand{ $this->setDestCity($this->arg['destCityID']); $this->setDestNation($this->destCity['nation']); - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::NotNeutralDestCity(), @@ -73,39 +80,45 @@ class che_수몰 extends Command\NationCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; $postReqTurn = $this->getPostReqTurn(); return "{$name}/{$reqTurn}턴(재사용 대기 $postReqTurn)"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - public function getPreReqTurn():int{ + public function getPreReqTurn(): int + { return 2; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*4)*10); + $nextTerm = Util::round(sqrt($genCount * 4) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; $josaUl = JosaUtil::pick($destCityName, '을'); return "【{$destCityName}】{$josaUl} {$commandName}"; } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -140,7 +153,7 @@ class che_수몰 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destCityName}수몰을 발동하였습니다."; $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($targetGeneralList as $targetGeneralID){ + foreach ($targetGeneralList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $nationID, $year, $month); $targetLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $targetLogger->flush(); @@ -150,12 +163,13 @@ class che_수몰 extends Command\NationCommand{ $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i', $destNationID); $destNationLogged = false; - foreach($targetGeneralList as $targetGeneralID){ + foreach ($targetGeneralList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $destNationID, $year, $month); $targetLogger->pushGeneralActionLog($destBroadcastMessage, ActionLogger::PLAIN); - if(!$destNationLogged){ + if (!$destNationLogged) { $targetLogger->pushNationalHistoryLog( - "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}수몰을 발동", ActionLogger::PLAIN + "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}수몰을 발동", + ActionLogger::PLAIN ); $destNationLogged = true; } @@ -182,27 +196,14 @@ class che_수몰 extends Command\NationCommand{ return true; } - public function getJSPlugins(): array + public function exportJSVars(): array { return [ - 'defaultSelectCityByMap' + 'mapTheme' => \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => new \stdClass(), + ], ]; } - - - public function getForm(): string - { - ob_start(); -?> -
-선택된 도시에 수몰을 발동합니다.
-전쟁중인 상대국 도시만 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
- \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => new \stdClass(), + ], ]; } - - - public function getForm(): string - { - ob_start(); -?> -
- 선택된 도시로 천도합니다.
- 현재 수도에서 연결된 도시만 가능하며, 1+2×거리만큼의 턴이 필요합니다.
- 목록을 선택하거나 도시를 클릭하세요.
-
-
- \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => new \stdClass(), + ], ]; } - - - public function getForm(): string - { - - $cities = Util::convertArrayToDict(DB::db()->query('SELECT * FROM city WHERE nation =%i', $this->generalObj->getNationID()), 'city'); - $calc = function(CityInitialDetail $constCity)use($cities){ - if(!key_exists($constCity->id, $cities)){ - return null; - } - $amount = $this->calcReturnAmount($cities[$constCity->id]); - $amountText = number_format($amount); - return "금쌀 각 {$amountText} 회수"; - }; - ob_start(); -?> -
-선택된 도시를 초토화 시킵니다.
-도시가 공백지가 되며, 도시의 인구, 내정 상태에 따라 상당량의 국고가 확보됩니다.
-국가의 수뇌들은 명성을 잃고, 모든 장수들은 배신 수치가 1 증가합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
- \sammo\getMapTheme(), + 'procRes' => [ + 'cities' => \sammo\JSOptionsForCities(), + 'distanceList' => new \stdClass(), + ], ]; } - - - public function getForm(): string - { - ob_start(); -?> -
- 선택된 도시에 허보를 발동합니다.
- 전쟁중인 상대국 도시만 가능합니다.
- 목록을 선택하거나 도시를 클릭하세요.
-
-
- + +
+
+ 자신의 자금이나 군량을 국가 재산으로 헌납합니다. +
+
+
+ 자원 : + + + + +
+
+ 금액 : + +
+
+ {{ commandName }} +
+
+
+ + + + diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index 04828e57..d8f92378 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -2,12 +2,13 @@ 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"; import { default as che_장수대상임관 } from "./che_장수대상임관.vue"; import { default as che_징병 } from "./che_징병.vue"; +import { default as che_헌납 } from "./che_헌납.vue"; import { default as ProcessCity } from "../ProcessCity.vue"; +import { default as ProcessGeneralAmount } from "../ProcessGeneralAmount.vue"; //TODO: 자주 쓰는 녀석들은 Slot으로 변경 @@ -24,20 +25,16 @@ export const commandMap: Record = { che_임관, che_장수대상임관, che_징병, + che_증여: ProcessGeneralAmount, che_첩보: ProcessCity, che_출병: ProcessCity, che_탈취: ProcessCity, che_파괴: ProcessCity, che_화계: ProcessCity, + che_헌납, } /* - 항목들 -장수/금쌀/분량 - 증여(포상 이식) -금쌀/분량 - 헌납(군량매매 또는 포상 수정) - 고유 양식 - 숙련전환, 장비매매 - - - */ \ No newline at end of file diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts index 56107060..d550775e 100644 --- a/hwe/ts/processing/Nation/index.ts +++ b/hwe/ts/processing/Nation/index.ts @@ -4,8 +4,9 @@ import { default as che_물자원조 } from "./che_물자원조.vue"; import { default as che_피장파장 } from "./che_피장파장.vue"; import { default as ProcessNation } from "../ProcessNation.vue"; -import { default as ProcessGeneralAmount } from "./che_몰수.vue"; +import { default as ProcessGeneralAmount } from "../ProcessGeneralAmount.vue"; import { default as ProcessGeneralCity } from "./che_발령.vue"; +import { default as ProcessCity } from "../ProcessCity.vue"; export const commandMap: Record = { che_국기변경, @@ -14,17 +15,20 @@ export const commandMap: Record = { che_몰수: ProcessGeneralAmount, che_물자원조, che_발령: ProcessGeneralCity, + che_백성동원: ProcessCity, che_불가침파기제의: ProcessNation, che_선전포고: ProcessNation, + che_수몰: ProcessCity, che_이호경식: ProcessNation, che_종전제의: ProcessNation, + che_천도: ProcessCity, + che_초토화: ProcessCity, che_포상: ProcessGeneralAmount, che_피장파장, + che_허보: ProcessCity, } /* - 항목들 -도시 - 백성동원, 수몰, 천도, 초토화, 허보 고유 양식 - 불가침제의 - */ \ No newline at end of file diff --git a/hwe/ts/processing/ProcessCity.vue b/hwe/ts/processing/ProcessCity.vue index a22d5f02..55813b71 100644 --- a/hwe/ts/processing/ProcessCity.vue +++ b/hwe/ts/processing/ProcessCity.vue @@ -31,8 +31,35 @@ 목록을 선택하거나 도시를 클릭하세요.
- 선택된 도시에 {{ commandName }}{{JosaPick(commandName, '을')}} - 실행합니다.
+ 선택된 도시에 {{ commandName + }}{{ JosaPick(commandName, "을") }} 실행합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시에 수몰을 발동합니다.
+ 전쟁중인 상대국 도시만 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시에 백성을 동원해 성벽을 쌓습니다.
+ 아국 도시만 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시로 천도합니다.
+ 현재 수도에서 연결된 도시만 가능하며, 1+2×거리만큼의 턴이 필요합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시에 허보를 발동합니다.
+ 전쟁중인 상대국 도시만 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+ 선택된 도시를 초토화 시킵니다.
+ 도시가 공백지가 되며, 도시의 인구, 내정 상태에 따라 상당량의 국고가 + 확보됩니다.
+ 국가의 수뇌들은 명성을 잃고, 모든 장수들은 배신 수치가 1 증가합니다.
목록을 선택하거나 도시를 클릭하세요.
diff --git a/hwe/ts/processing/Nation/che_몰수.vue b/hwe/ts/processing/ProcessGeneralAmount.vue similarity index 95% rename from hwe/ts/processing/Nation/che_몰수.vue rename to hwe/ts/processing/ProcessGeneralAmount.vue index 34877a2c..000e9c16 100644 --- a/hwe/ts/processing/Nation/che_몰수.vue +++ b/hwe/ts/processing/ProcessGeneralAmount.vue @@ -8,13 +8,15 @@
국고로 장수에게 자금이나 군량을 지급합니다.
+
+ 자신의 자금이나 군량을 다른 장수에게 증여합니다.
+
장수 : @@ -56,7 +58,7 @@ import { procGeneralItem, procGeneralKey, procGeneralRawItemList, -} from "../processingRes"; +} from "./processingRes"; import { getNpcColor } from "@/common_legacy"; declare const commandName: string; diff --git a/hwe/ts/processing/SelectGeneral.vue b/hwe/ts/processing/SelectGeneral.vue index a1d6e756..3a7b6734 100644 --- a/hwe/ts/processing/SelectGeneral.vue +++ b/hwe/ts/processing/SelectGeneral.vue @@ -147,7 +147,6 @@ export default defineComponent({ groupArray.push(obj); targets.set(gen.no, obj); } - console.log(forFind); return { selectedGeneral, searchMode: true, From cfbaf60989b9dc670ba41b398e72082e1a5d6b08 Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 22 Dec 2021 21:15:26 +0900 Subject: [PATCH 35/38] =?UTF-8?q?feat(WIP):=20processing=20=EC=88=99?= =?UTF-8?q?=EB=A0=A8=EC=A0=84=ED=99=98,=20=EB=B6=88=EA=B0=80=EC=B9=A8?= =?UTF-8?q?=EC=A0=9C=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_숙련전환.php | 68 +++--- hwe/sammo/Command/General/che_징병.php | 172 -------------- hwe/sammo/Command/General/che_헌납.php | 18 -- hwe/sammo/Command/Nation/che_불가침제의.php | 84 +++---- .../Command/Nation/che_불가침파기제의.php | 54 ----- hwe/ts/processing/General/che_숙련전환.vue | 220 ++++++++++++++++++ hwe/ts/processing/General/index.ts | 4 +- hwe/ts/processing/Nation/che_불가침제의.vue | 132 +++++++++++ hwe/ts/processing/Nation/index.ts | 2 + 9 files changed, 414 insertions(+), 340 deletions(-) create mode 100644 hwe/ts/processing/General/che_숙련전환.vue create mode 100644 hwe/ts/processing/Nation/che_불가침제의.vue diff --git a/hwe/sammo/Command/General/che_숙련전환.php b/hwe/sammo/Command/General/che_숙련전환.php index 84e6bc46..a8664be5 100644 --- a/hwe/sammo/Command/General/che_숙련전환.php +++ b/hwe/sammo/Command/General/che_숙련전환.php @@ -16,6 +16,7 @@ use \sammo\Command; use \sammo\ServConfig; use function \sammo\getDexCall; +use function sammo\getDexLevelList; use function \sammo\tryUniqueItemLottery; use \sammo\Constraint\Constraint; @@ -37,6 +38,9 @@ class che_숙련전환 extends Command\GeneralCommand /** @var string */ protected $destArmTypeName; + static $decreaseCoeff = 0.4; + static $convertCoeff = 0.9; + protected function argTest(): bool { if ($this->arg === null) { @@ -162,9 +166,9 @@ class che_숙련전환 extends Command\GeneralCommand $logger = $general->getLogger(); $srcDex = $general->getVar('dex' . $this->srcArmType); - $cutDex = Util::toInt($srcDex * 0.4); + $cutDex = Util::toInt($srcDex * static::$decreaseCoeff); $cutDexText = number_format($cutDex); - $addDex = Util::toInt($cutDex * 9 / 10); + $addDex = Util::toInt($cutDex * static::$convertCoeff); $addDexText = number_format($addDex); $general->increaseVar('dex' . $this->srcArmType, -$cutDex); @@ -189,47 +193,33 @@ class che_숙련전환 extends Command\GeneralCommand return true; } - public function getForm(): string + public function exportJSVars(): array { - $db = DB::db(); - $general = $this->generalObj; - - $dexSrcTexts = []; - $dexDestTexts = []; + $ownDexList = []; foreach (GameUnitConst::allType() as $armType => $armName) { - $dexVal = $general->getVar('dex' . $armType); - $dexValText = number_format($dexVal); - $cutDex = Util::toInt($dexVal * 0.4); - $addDex = Util::toInt($cutDex * 9 / 10); - $addDexText = number_format($addDex); - $newDex = $dexVal - $cutDex; - $beforeDexLevel = getDexCall($dexVal); - $afterDexLevel = getDexCall($newDex); - - $dexSrcTexts[$armType] = "{$armName} ({$beforeDexLevel} ⇒ {$afterDexLevel}, {$addDexText} 전환)"; - $dexDestTexts[$armType] = "{$armName} ({$dexValText})"; + $ownDexList[] = [ + 'armType' => $armType, + 'name' => $armName, + 'amount' => $general->getVar('dex' . $armType), + ]; } - ob_start(); -?> - 본인의 특정 병종 숙련을 40% 줄이고, 줄어든 숙련 중 9/10(90%p)를 다른 병종 숙련으로 전환합니다.
- - - 숙련을 - - - 숙련으로
- -$dexKey, + 'color'=>$color, + 'name'=>$name + ]; + } + return [ + 'procRes' => [ + 'ownDexList' => $ownDexList, + 'dexLevelList' => $dexLevelList, + 'decreaseCoeff' => static::$decreaseCoeff, + 'convertCoeff' => static::$convertCoeff, + ] + ]; } } diff --git a/hwe/sammo/Command/General/che_징병.php b/hwe/sammo/Command/General/che_징병.php index 5fc86816..e166d78a 100644 --- a/hwe/sammo/Command/General/che_징병.php +++ b/hwe/sammo/Command/General/che_징병.php @@ -332,176 +332,4 @@ class che_징병 extends Command\GeneralCommand ] ]; } - - public function getForm(): string - { - $db = DB::db(); - - $general = $this->generalObj; - - [$nationLevel, $tech] = $db->queryFirstList('SELECT level,tech FROM nation WHERE nation=%i', $general->getNationID()); - if (!$nationLevel) { - $nationLevel = 0; - } - - if (!$tech) { - $tech = 0; - } - - $ownCities = []; - $ownRegions = []; - $year = $this->env['year']; - $startyear = $this->env['startyear']; - - $relativeYear = $year - $startyear; - - foreach (DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city) { - $ownCities[$city['city']] = 1; - $ownRegions[$city['region']] = 1; - } - - $leadership = $general->getLeadership(); - $fullLeadership = $general->getLeadership(false); - $abil = getTechAbil($tech); - - $armTypes = []; - - foreach (GameUnitConst::allType() as $armType => $armName) { - $armTypeCrews = []; - - foreach (GameUnitConst::byType($armType) as $unit) { - $crewObj = new \stdClass; - $crewObj->showDefault = 'true'; - - $crewObj->id = $unit->id; - - if ($unit->reqTech == 0) { - $crewObj->bgcolor = 'green'; - } else { - $crewObj->bgcolor = 'limegreen'; - } - - if (!$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech)) { - $crewObj->showDefault = 'false'; - $crewObj->bgcolor = 'red'; - } - - $crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]); - $crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]); - - $crewObj->name = $unit->name; - $crewObj->attack = $unit->attack + $abil; - $crewObj->defence = $unit->defence + $abil; - $crewObj->speed = $unit->speed; - $crewObj->avoid = $unit->avoid; - if ($this->env['show_img_level'] < 2) { - $crewObj->img = ServConfig::$sharedIconPath . "/default.jpg"; - } else { - $crewObj->img = ServConfig::$gameImagePath . "/crewtype" . $unit->id . ".png"; - } - - $crewObj->info = join('
', $unit->info); - - - $armTypeCrews[] = $crewObj; - } - $armTypes[] = [$armName, $armTypeCrews]; - } - $commandName = $this->getName(); - - $techLevelText = getTechCall($tech); - - $crew = $general->getVar('crew'); - $gold = $general->getVar('gold'); - $crewTypeObj = $general->getCrewTypeObj(); - - ob_start(); -?> - - 병사를 모집합니다. - - 훈련과 사기치는 낮지만 가격이 저렴합니다.
- - 훈련과 사기치는 높지만 자금이 많이 듭니다. - - 가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.
- 이미 병사가 있는 경우 추가되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.
- 현재 가능한 병종은 녹색으로 표시되며,
- 현재 가능한 특수병종은 초록색으로 표시됩니다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
불가능한 병종 표시
- -
모병은 가격 2배의 자금이 소요됩니다.
- -
- 현재 기술력 : - 현재 통솔 : - 현재 병종 : name ?> - 현재 병사 : - 현재 자금 : -
사진병종공격방어기동회피가격군량병사수행동특징
계열
name ?>attack ?>defence ?>speed ?>avoid ?>baseCostShort ?>baseRiceShort ?> -
- 00명 - 원 - -
info ?>
- - - - - 자신의 자금이나 군량을 국가 재산으로 헌납합니다.
- -
-generalObj; $nationID = $generalObj->getNationID(); - - $db = DB::db(); - + $nationList = []; + $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); $currYear = $this->env['year']; - $diplomacyStatus = Util::convertArrayToDict( - $db->query('SELECT * FROM diplomacy WHERE me = %i', $nationID), - 'you' - ); - - $nationList = []; foreach (getAllNationStaticInfo() as $destNation) { - if ($destNation['nation'] == $nationID) { - continue; - } - - $testCommand = new static($generalObj, $this->env, $this->getLastTurn(), [ + $testCommand = new static($generalObj, $this->env, $testTurn, [ 'destNationID' => $destNation['nation'], - 'year' => $currYear + 1, - 'month' => 12 + 'year' => $currYear + 2, + 'month' => 1 ]); + + $nationTarget = [ + 'id' => $destNation['nation'], + 'name' => $destNation['name'], + 'color' => $destNation['color'], + 'power' => $destNation['power'], + ]; if (!$testCommand->hasFullConditionMet()) { - $destNation['cssBgColor'] = 'background-color:red;'; - } else if ($diplomacyStatus[$destNation['nation']]['state'] == 7) { - $destNation['cssBgColor'] = 'background-color:blue;'; - } else { - $destNation['cssBgColor'] = ''; + $nationTarget['notAvailable'] = true; + } + if ($destNation['id'] == $nationID) { + $nationTarget['notAvailable'] = true; } - $nationList[] = $destNation; + $nationList[] = $nationTarget; } - - ob_start(); -?> -
- 타국에게 불가침을 제의합니다.
- 제의할 국가를 목록에서 선택하세요.
- 불가침 기한 다음 달부터 선포 가능합니다.
- 배경색은 현재 제의가 불가능한 국가는 붉은색, 현재 불가침중인 국가는 푸른색으로 표시됩니다.
-
- 에게 - 년 - 월까지 - - \sammo\getMapTheme(), + 'procRes' => [ + 'nationList' => $nationList, + 'startYear' => $this->env['startyear'], + 'minYear' => $this->env['year'] + 1, + 'maxYear' => $this->env['year'] + 20, + 'month' => $this->env['month'], + ], + ]; } } diff --git a/hwe/sammo/Command/Nation/che_불가침파기제의.php b/hwe/sammo/Command/Nation/che_불가침파기제의.php index 2848ea24..74e1245b 100644 --- a/hwe/sammo/Command/Nation/che_불가침파기제의.php +++ b/hwe/sammo/Command/Nation/che_불가침파기제의.php @@ -207,58 +207,4 @@ class che_불가침파기제의 extends Command\NationCommand{ ], ]; } - - public function getJSPlugins(): array - { - return [ - 'defaultSelectNationByMap' - ]; - } - - public function getForm(): string - { - $generalObj = $this->generalObj; - $nationID = $generalObj->getNationID(); - - $db = DB::db(); - $diplomacyStatus = Util::convertArrayToDict( - $db->query('SELECT * FROM diplomacy WHERE me = %i', $nationID), - 'you' - ); - - $nationList = []; - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ - continue; - } - - if($diplomacyStatus[$destNation['nation']]['state'] != 7){ - $destNation['cssBgColor'] = 'background-color:red;'; - } - else{ - $destNation['cssBgColor'] = ''; - } - - $nationList[] = $destNation; - } - - ob_start(); -?> -
-불가침중인 국가에 조약 파기를 제의합니다.
-제의할 국가를 목록에서 선택하세요.
-배경색은 현재 제의가 불가능한 국가는 붉은색으로 표시됩니다.
-
-에게 - - + +
+
+ 본인의 특정 병종 숙련을 40% 줄이고, 줄어든 숙련 중 9/10(90%p)를 다른 병종 + 숙련으로 전환합니다. +
+
+
+ 감소 대상 숙련 : + + {{ dexInfo.name }} ({{ dexInfo.currentInfo.name }}) + +
+
+ 전환 대상 숙련 : + + {{ dexInfo.name }} ({{ dexInfo.currentInfo.name }}) + +
+
+ {{ commandName }} +
+
+
{{dexFullInfo.get(srcArmTypeID).name}}
+
[
+
{{dexFullInfo.get(srcArmTypeID).currentInfo.name}}
+
{{convNumberFormat(dexFullInfo.get(srcArmTypeID).currentInfo.amount)}}
+
]
+
+
[
+
{{dexFullInfo.get(srcArmTypeID).decreasedInfo.name}}
+
{{convNumberFormat(dexFullInfo.get(srcArmTypeID).decreasedInfo.amount)}}
+
]
+
+
+
{{dexFullInfo.get(destArmTypeID).name}}
+
[
+ + +
]
+
+
[
+
{{dexFullInfo.get(destArmTypeID).afterInfo.get(srcArmTypeID).name}}
+
{{convNumberFormat(dexFullInfo.get(destArmTypeID).afterInfo.get(srcArmTypeID).amount)}}
+
]
+
+ + +
+
+ + + + diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index d8f92378..fd27236a 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -2,6 +2,7 @@ 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"; import { default as che_임관 } from "./che_임관.vue"; import { default as che_장수대상임관 } from "./che_장수대상임관.vue"; import { default as che_징병 } from "./che_징병.vue"; @@ -21,6 +22,7 @@ export const commandMap: Record = { che_모병: che_징병, che_선동: ProcessCity, che_선양, + che_숙련전환, che_이동: ProcessCity, che_임관, che_장수대상임관, @@ -36,5 +38,5 @@ export const commandMap: Record = { /* - 항목들 -고유 양식 - 숙련전환, 장비매매 +고유 양식 - 장비매매 */ \ No newline at end of file diff --git a/hwe/ts/processing/Nation/che_불가침제의.vue b/hwe/ts/processing/Nation/che_불가침제의.vue new file mode 100644 index 00000000..065f5343 --- /dev/null +++ b/hwe/ts/processing/Nation/che_불가침제의.vue @@ -0,0 +1,132 @@ + + + diff --git a/hwe/ts/processing/Nation/index.ts b/hwe/ts/processing/Nation/index.ts index d550775e..267c943a 100644 --- a/hwe/ts/processing/Nation/index.ts +++ b/hwe/ts/processing/Nation/index.ts @@ -1,6 +1,7 @@ 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"; import { default as ProcessNation } from "../ProcessNation.vue"; @@ -16,6 +17,7 @@ export const commandMap: Record = { che_물자원조, che_발령: ProcessGeneralCity, che_백성동원: ProcessCity, + che_불가침제의, che_불가침파기제의: ProcessNation, che_선전포고: ProcessNation, che_수몰: ProcessCity, From 41d5df60f4e4201fdc03094a79d8e7c70cf7f668 Mon Sep 17 00:00:00 2001 From: hide_d Date: Thu, 23 Dec 2021 00:48:53 +0900 Subject: [PATCH 36/38] =?UTF-8?q?feat(WIP):=20=EC=9E=A5=EB=B9=84=EB=A7=A4?= =?UTF-8?q?=EB=A7=A4=20-=20=EC=B4=88=EC=84=B1=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=9D=84=20=EC=9D=BC=EC=9B=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_장비매매.php | 222 +++++++++++++-------- hwe/ts/PartialReservedCommand.vue | 9 +- hwe/ts/defs.ts | 14 +- hwe/ts/processing/General/che_임관.vue | 60 +++++- hwe/ts/processing/General/che_장비매매.vue | 191 ++++++++++++++++++ hwe/ts/processing/General/index.ts | 2 + hwe/ts/processing/SelectCity.vue | 7 +- hwe/ts/processing/SelectGeneral.vue | 8 +- hwe/ts/processing/SelectNation.vue | 9 +- hwe/ts/processing/processingRes.ts | 21 +- hwe/ts/util/convertSearch초성.ts | 9 + hwe/ts/util/entriesWithType.ts | 7 + 12 files changed, 442 insertions(+), 117 deletions(-) create mode 100644 hwe/ts/processing/General/che_장비매매.vue create mode 100644 hwe/ts/util/convertSearch초성.ts create mode 100644 hwe/ts/util/entriesWithType.ts diff --git a/hwe/sammo/Command/General/che_장비매매.php b/hwe/sammo/Command/General/che_장비매매.php index a14f46e3..ea8f4954 100644 --- a/hwe/sammo/Command/General/che_장비매매.php +++ b/hwe/sammo/Command/General/che_장비매매.php @@ -1,13 +1,17 @@ '명마', - 'weapon'=>'무기', - 'book'=>'서적', - 'item'=>'도구', + 'horse' => '명마', + 'weapon' => '무기', + 'book' => '서적', + 'item' => '도구', ]; - protected function argTest():bool{ - if($this->arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - $itemType = $this->arg['itemType']??null; - if(!in_array($itemType, array_keys(static::$itemMap))){ + $itemType = $this->arg['itemType'] ?? null; + if (!in_array($itemType, array_keys(static::$itemMap))) { return false; } - $itemCode = $this->arg['itemCode']??null; - if(!key_exists($itemCode, GameConst::$allItems[$itemType]) && $itemCode !== 'None'){ + $itemCode = $this->arg['itemCode'] ?? null; + if (!key_exists($itemCode, GameConst::$allItems[$itemType]) && $itemCode !== 'None') { return false; } $itemClass = buildItemClass($itemCode); - if(!$itemClass->isBuyable()){ + if (!$itemClass->isBuyable()) { return false; } $this->arg = [ - 'itemType'=>$itemType, - 'itemCode'=>$itemCode + 'itemType' => $itemType, + 'itemCode' => $itemCode ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - $this->minConditionConstraints=[ + $this->minConditionConstraints = [ ConstraintHelper::ReqCityTrader($general->getNPCType()), ]; } @@ -76,26 +83,25 @@ class che_장비매매 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->fullConditionConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::ReqCityTrader($general->getNPCType()), ConstraintHelper::ReqCityCapacity('secu', '치안 수치', $itemClass->getReqSecu()), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; - if($itemCode === 'None'){ + if ($itemCode === 'None') { $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralValue($itemType, $itemTypeName, '!=', 'None'); - } - else if($itemCode == $general->getVar($itemType)){ + } else if ($itemCode == $general->getVar($itemType)) { $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.'); - } - else if(!buildItemClass($general->getVar($itemType))->isBuyable()){ + } else if (!buildItemClass($general->getVar($itemType))->isBuyable()) { $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.'); } } - public function getCost():array{ - if(!$this->isArgValid){ + public function getCost(): array + { + if (!$this->isArgValid) { return [0, 0]; } @@ -106,19 +112,22 @@ class che_장비매매 extends Command\GeneralCommand{ return [$reqGold, 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 + { $itemType = $this->arg['itemType']; $itemCode = $this->arg['itemCode']; - if($itemCode === 'None'){ + if ($itemCode === 'None') { $itemTypeName = static::$itemMap[$itemType]; $josaUl = JosaUtil::pick($itemTypeName, '을'); return "{$itemTypeName}{$josaUl} 판매"; @@ -132,8 +141,9 @@ class che_장비매매 extends Command\GeneralCommand{ return "【{$itemName}】{$josaUl} 구입"; } - public function run():bool{ - if(!$this->hasFullConditionMet()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -145,11 +155,10 @@ class che_장비매매 extends Command\GeneralCommand{ $itemType = $this->arg['itemType']; $itemCode = $this->arg['itemCode']; - if($itemCode === 'None'){ + if ($itemCode === 'None') { $buying = false; $itemCode = $general->getVar($itemType); - } - else{ + } else { $buying = true; } $itemObj = buildItemClass($itemCode); @@ -161,12 +170,11 @@ class che_장비매매 extends Command\GeneralCommand{ $logger = $general->getLogger(); - if($buying){ + if ($buying) { $logger->pushGeneralActionLog("{$itemName}{$josaUl} 구입했습니다. <1>$date"); $general->increaseVarWithLimit('gold', -$cost, 0); $general->setVar($itemType, $itemCode); - } - else{ + } else { $logger->pushGeneralActionLog("{$itemName}{$josaUl} 판매했습니다. <1>$date"); $general->increaseVarWithLimit('gold', $cost / 2); $general->deleteItem($itemType); @@ -183,6 +191,60 @@ class che_장비매매 extends Command\GeneralCommand{ return true; } + public function exportJSVars(): array + { + $general = $this->generalObj; + $db = DB::db(); + $citySecu = $db->queryFirstField('SELECT secu FROM city WHERE city = %i', $this->generalObj->getCityID()); + $itemList = []; + foreach (GameConst::$allItems as $itemType => $itemCategories) { + $typeName = static::$itemMap[$itemType]; + $values = []; + foreach ($itemCategories as $itemCode => $cnt) { + if ($cnt > 0) { + continue; + } + $item = buildItemClass($itemCode); + if (!$item->isBuyable()) { + continue; + } + $values[] = [ + 'id'=>$itemCode, + 'name'=>$item->getName(), + 'reqSecu'=>$item->getReqSecu(), + 'cost'=>$item->getCost(), + 'info'=>$item->getInfo(), + 'isBuyable'=>$item->isBuyable(),//항상 true지만, 일관성을 위해 + ]; + } + $itemList[$itemType] = [ + 'typeName'=>$typeName, + 'values'=>$values + ]; + } + + $ownItem = []; + foreach($general->getItems() as $itemType => $item){ + $ownItem[$itemType] = [ + 'id'=>$item->getRawClassName(), + 'name'=>$item->getName(), + 'reqSecu'=>$item->getReqSecu(), + 'cost'=>$item->getCost(), + 'info'=>$item->getInfo(), + 'isBuyable'=>$item->isBuyable(), + ]; + } + + return [ + 'procRes' => [ + 'citySecu'=>$citySecu, + 'gold'=>$general->getVar('gold'), + 'itemList'=>$itemList, + 'ownItem'=>$ownItem, + ] + ]; + } + public function getForm(): string { $form = []; @@ -194,49 +256,49 @@ class che_장비매매 extends Command\GeneralCommand{ ob_start(); ?> - - -장비를 구입하거나 매각합니다.
-현재 구입 불가능한 것은 붉은색으로 표시됩니다.
-현재 도시 치안 :    현재 자금 :
-장비 : + 장비를 구입하거나 매각합니다.
+ 현재 구입 불가능한 것은 붉은색으로 표시됩니다.
+ 현재 도시 치안 :    현재 자금 :
+ 장비 : +
= { + horse: '명마', + weapon: '무기', + book: '서적', + item: '도구', +} + export declare type Colors = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light'; export type IDItem = { @@ -147,4 +155,8 @@ export type ToastType = { } export const keyScreenMode = 'sam.screenMode'; -export type ScreenModeType = 'auto'|'500px'|'1000px'; \ No newline at end of file +export type ScreenModeType = 'auto'|'500px'|'1000px'; + +export declare type ValuesOf = T[keyof T]; + +export const NoneValue = 'None' as const; \ No newline at end of file diff --git a/hwe/ts/processing/General/che_임관.vue b/hwe/ts/processing/General/che_임관.vue index d207f60b..08d33911 100644 --- a/hwe/ts/processing/General/che_임관.vue +++ b/hwe/ts/processing/General/che_임관.vue @@ -20,11 +20,20 @@
국가명
임관권유문
+
+ {{ toggleZoom ? "작게 보기" : "크게 보기" }} +
* { + display: none; + } } @include media-500px { + .nation-list .nation-row.nation-header { + display: grid; + grid-template-columns: 3fr 1fr; + grid-template-rows: 1fr 1fr; + + .zoom-toggle { + grid-column: 2/3; + grid-row: 1/3; + } + } + .nation-list .nation-row { display: grid; grid-template-columns: 1fr; grid-template-rows: 1fr minmax(1fr, calc(200px * 500 / 870)); } - .nation-scout-plate { - max-height: calc(200px * 500 / 870); - overflow: hidden; + .on-fit { + .nation-scout-plate { + max-height: calc(200px * 500 / 870); + overflow: hidden; + } + + .nation-scout-msg { + width: 870px; + transform-origin: 0px 0px; + transform: scale(calc(500 / 870)); + } } - .nation-scout-msg { - width: 870px; - transform-origin: 0px 0px; - transform: scale(calc(500 / 870)); + .on-zoom { + .nation-scout-plate { + max-height: 200px; + overflow-y: hidden; + overflow-x: auto; + } + + .nation-scout-msg { + max-width: 870px; + } } } \ No newline at end of file diff --git a/hwe/ts/processing/General/che_장비매매.vue b/hwe/ts/processing/General/che_장비매매.vue new file mode 100644 index 00000000..0a374d15 --- /dev/null +++ b/hwe/ts/processing/General/che_장비매매.vue @@ -0,0 +1,191 @@ + + + \ No newline at end of file diff --git a/hwe/ts/processing/General/index.ts b/hwe/ts/processing/General/index.ts index fd27236a..da45cace 100644 --- a/hwe/ts/processing/General/index.ts +++ b/hwe/ts/processing/General/index.ts @@ -4,6 +4,7 @@ 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"; import { default as che_장수대상임관 } from "./che_장수대상임관.vue"; import { default as che_징병 } from "./che_징병.vue"; import { default as che_헌납 } from "./che_헌납.vue"; @@ -25,6 +26,7 @@ export const commandMap: Record = { che_숙련전환, che_이동: ProcessCity, che_임관, + che_장비매매, che_장수대상임관, che_징병, che_증여: ProcessGeneralAmount, diff --git a/hwe/ts/processing/SelectCity.vue b/hwe/ts/processing/SelectCity.vue index 40d47078..707c4bcf 100644 --- a/hwe/ts/processing/SelectCity.vue +++ b/hwe/ts/processing/SelectCity.vue @@ -36,8 +36,7 @@ - \ No newline at end of file diff --git a/hwe/ts/processing/General/che_징병.vue b/hwe/ts/processing/General/che_징병.vue index 1f7b840e..bede7c27 100644 --- a/hwe/ts/processing/General/che_징병.vue +++ b/hwe/ts/processing/General/che_징병.vue @@ -61,11 +61,12 @@ >
-
{{ destCrewType.baseCost.toFixed(1) }}
+
{{ Math.ceil( - amount * destCrewType.baseCost + amount * destCrewType.baseCost * goldCoeff ).toLocaleString() }}금
+
{{ commandName }} @@ -126,9 +128,9 @@
공격
방어
기동
+
회피
가격
군량
-
회피
병사 수
행동
특징
@@ -140,10 +142,17 @@ :key="armCrewType.armType" >
-
{{ armCrewType.armName }} 계열
+
+ {{ armCrewType.armName }} 계열 +
-
+
금액 :
-
+
{{ commandName }}
diff --git a/hwe/ts/processing/Nation/che_국호변경.vue b/hwe/ts/processing/Nation/che_국호변경.vue index f7368d2b..bdb8b2e2 100644 --- a/hwe/ts/processing/Nation/che_국호변경.vue +++ b/hwe/ts/processing/Nation/che_국호변경.vue @@ -7,7 +7,7 @@
국명 : - +
{{ commandName }} diff --git a/hwe/ts/processing/Nation/che_불가침제의.vue b/hwe/ts/processing/Nation/che_불가침제의.vue index 065f5343..82cf7c6c 100644 --- a/hwe/ts/processing/Nation/che_불가침제의.vue +++ b/hwe/ts/processing/Nation/che_불가침제의.vue @@ -18,15 +18,14 @@ 붉은색으로 표시됩니다.
-
+
국가 :
-
+
기간 : -
- {{ yearP + minYear - 1 }} - - 년 + {{ month }} - +
-
+
{{ commandName }}
@@ -130,3 +129,9 @@ export default defineComponent({ }, }); + + \ No newline at end of file diff --git a/hwe/ts/processing/Nation/che_피장파장.vue b/hwe/ts/processing/Nation/che_피장파장.vue index 1c695645..1deae778 100644 --- a/hwe/ts/processing/Nation/che_피장파장.vue +++ b/hwe/ts/processing/Nation/che_피장파장.vue @@ -24,14 +24,14 @@ 국가 :
-
+
-
+
{{ commandName }}
diff --git a/hwe/ts/processing/ProcessGeneralAmount.vue b/hwe/ts/processing/ProcessGeneralAmount.vue index 000e9c16..8f299150 100644 --- a/hwe/ts/processing/ProcessGeneralAmount.vue +++ b/hwe/ts/processing/ProcessGeneralAmount.vue @@ -28,7 +28,7 @@
-
+
금액 :
-
+
{{ commandName }}
diff --git a/hwe/ts/processing/SelectAmount.vue b/hwe/ts/processing/SelectAmount.vue index c16a474c..64c59e78 100644 --- a/hwe/ts/processing/SelectAmount.vue +++ b/hwe/ts/processing/SelectAmount.vue @@ -20,7 +20,7 @@ > 18){ + throw `길이가 반각 18자 분량을 넘었습니다.`; + } } for (const booleanKey of booleanArgs) { const testVal = args[booleanKey]; diff --git a/hwe/ts/util/mb_strwidth.ts b/hwe/ts/util/mb_strwidth.ts index c1013c18..37ef5b8b 100644 --- a/hwe/ts/util/mb_strwidth.ts +++ b/hwe/ts/util/mb_strwidth.ts @@ -1,4 +1,3 @@ -//TODO: X-Requested-With 믿지 말자. //https://gist.github.com/demouth/3217440 /** * mb_strwidth From 9b86aaa1bdba75b93db0065f268a180fe947df76 Mon Sep 17 00:00:00 2001 From: hide_d Date: Thu, 23 Dec 2021 03:03:43 +0900 Subject: [PATCH 38/38] =?UTF-8?q?feat:=20processing=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EC=BC=AC/=EB=81=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/ts/components/TopBackBar.vue | 32 +++++- hwe/ts/jquery-toast.d.ts | 15 --- hwe/ts/processing/General/che_등용.vue | 5 +- hwe/ts/processing/General/che_선양.vue | 5 +- hwe/ts/processing/General/che_임관.vue | 11 +- hwe/ts/processing/General/che_장비매매.vue | 9 +- .../processing/General/che_장수대상임관.vue | 5 +- hwe/ts/processing/Nation/che_물자원조.vue | 7 +- hwe/ts/processing/Nation/che_발령.vue | 7 +- hwe/ts/processing/Nation/che_불가침제의.vue | 7 +- hwe/ts/processing/Nation/che_피장파장.vue | 7 +- hwe/ts/processing/ProcessCity.vue | 6 +- hwe/ts/processing/ProcessGeneralAmount.vue | 5 +- hwe/ts/processing/ProcessNation.vue | 7 +- hwe/ts/processing/SelectCity.vue | 8 +- hwe/ts/processing/SelectGeneral.vue | 8 +- hwe/ts/processing/SelectNation.vue | 8 +- hwe/ts/processing/processingRes.ts | 15 ++- hwe/ts/recruitCrewForm.ts | 103 ------------------ hwe/ts/v_processing.ts | 5 +- 20 files changed, 117 insertions(+), 158 deletions(-) delete mode 100644 hwe/ts/jquery-toast.d.ts delete mode 100644 hwe/ts/recruitCrewForm.ts diff --git a/hwe/ts/components/TopBackBar.vue b/hwe/ts/components/TopBackBar.vue index 6cb9ff2f..16587d75 100644 --- a/hwe/ts/components/TopBackBar.vue +++ b/hwe/ts/components/TopBackBar.vue @@ -2,8 +2,16 @@
+ {{ toggleSearch ? "검색 켜짐" : "검색 꺼짐" }}

{{ title }}

+
@@ -25,6 +33,17 @@ export default defineComponent({ } }, }, + data() { + return { + toggleSearch: this.searchable, + }; + }, + emits: ["update:searchable"], + watch: { + toggleSearch(val: boolean) { + this.$emit("update:searchable", val); + }, + }, props: { title: { type: String, @@ -35,6 +54,11 @@ export default defineComponent({ default: "normal", required: false, }, + searchable: { + type: Boolean, + default: undefined, + required: false, + }, }, }); @@ -55,6 +79,12 @@ export default defineComponent({ height: 24pt; } +.btn-toggle-zoom{ + position: absolute; + height: 24pt; + right: 0; +} + .title { text-align: center; line-height: 24pt; diff --git a/hwe/ts/jquery-toast.d.ts b/hwe/ts/jquery-toast.d.ts deleted file mode 100644 index bed348a5..00000000 --- a/hwe/ts/jquery-toast.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -type JQueryBootstrapToast = { - container?: JQuery, - position?: 'top-right' | 'top-left' | 'top-center' | 'bottom-right' | 'bottom-left' | 'bottom-center', - title?: string, - subtitle?: string, - content?: string, - type?: 'info'|'success'|'warning'|'danger'|'error', - delay?: number, - img?: string, - pause_on_hover?: boolean, -} - -interface JQueryStatic { - toast(opt: JQueryBootstrapToast): void; -} \ No newline at end of file diff --git a/hwe/ts/processing/General/che_등용.vue b/hwe/ts/processing/General/che_등용.vue index 9a22ff35..b805ff20 100644 --- a/hwe/ts/processing/General/che_등용.vue +++ b/hwe/ts/processing/General/che_등용.vue @@ -1,5 +1,5 @@