diff --git a/hwe/sammo/API/Nation/GeneralList.php b/hwe/sammo/API/Nation/GeneralList.php index 0a0643a9..d29ab73d 100644 --- a/hwe/sammo/API/Nation/GeneralList.php +++ b/hwe/sammo/API/Nation/GeneralList.php @@ -25,8 +25,84 @@ class GeneralList extends \sammo\BaseAPI { private int $permission; + static $viewColumns = [ + 'no' => 0, + 'name' => 0, + 'nation' => 0, + 'npc' => 0, + 'injury' => 0, + 'leadership' => 0, + 'strength' => 0, + 'intel' => 0, + 'explevel' => 0, + 'dedlevel' => 0, + 'gold' => 0, + 'rice' => 0, + 'killturn' => 0, + 'picture' => 0, + 'imgsvr' => 0, + 'age' => 0, + 'special' => 0, + 'special2' => 0, + 'personal' => 0, + 'belong' => 0, + 'connect' => 0, + + + 'city' => 1, + 'experience' => 1, + 'dedication' => 1, + + 'officer_level' => 2, + 'officer_city' => 2, + 'defence_train' => 2, + 'troop' => 2, + 'crewtype' => 2, + 'crew' => 2, + 'train' => 2, + 'atmos' => 2, + 'turntime' => 2, + 'horse' => 2, + 'weapon' => 2, + 'book' => 2, + 'item' => 2, + + 'aux' => 2, + + + 'owner_name' => 9,//안씀. + + //RANK + 'warnum' => 2, + 'killnum' => 2, + 'deathnum' => 2, + 'killcrew' => 2, + 'deathcrew' => 2, + 'firenum' => 2, + ]; + + static $columnRemap = [ + 'special' => 'specialDomestic', + 'special2' => 'specialWar', + 'aux' => null, + ]; + + static $customViewColumns = [ + 'officerLevel' => 0, + 'officerLevelText' => 0, + 'lbonus' => 0, + 'ownerName' => 0, + 'honorText' => 0, + 'dedLevelText' => 0, + 'bill' => 0, + 'reservedCommand' => 2, + + 'autorun_limit' => 2, + ]; + public function validateArgs(): ?string { + //TODO: 장기적으로는 요청에 따라 반환해야... return null; } @@ -53,6 +129,9 @@ class GeneralList extends \sammo\BaseAPI $db = DB::db(); + $gameStor = \sammo\KVStorage::getStorage($db, 'game_env'); + $env = $gameStor->getValues(['year', 'month', 'turntime', 'turnterm']); + $me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $session->getUserID()); $con = checkLimit($me['con']); if ($con >= 2) { @@ -64,112 +143,99 @@ class GeneralList extends \sammo\BaseAPI $nationArr = getNationStaticInfo($nationID); - $viewColumns = [ - 'no' => 0, - 'name' => 0, - 'owner_name' => 9, - 'nation' => 0, - 'city' => 1, - 'officer_level' => 2, - 'officer_city' => 2, - 'npc' => 0, - 'defence_train' => 2, - 'troop' => 2, - 'injury' => 0, - 'leadership' => 0, - 'strength' => 0, - 'intel' => 0, - 'experience' => 1, - 'explevel' => 0, - 'dedication' => 1, - 'dedlevel' => 0, - 'gold' => 0, - 'rice' => 0, - 'crewtype' => 2, - 'crew' => 2, - 'train' => 2, - 'atmos' => 2, - 'killturn' => 0, - 'turntime' => 2, - 'picture' => 0, - 'imgsvr' => 0, - 'age' => 0, - 'special' => 0, - 'special2' => 0, - 'personal' => 0, - 'belong' => 0, - 'horse' => 2, - 'weapon' => 2, - 'book' => 2, - 'item' => 2, - 'connect' => 0 - ]; - - $columnRemap = [ - 'special' => 'specialDomestic', - 'special2' => 'specialWar', - ]; - - $customViewColumns = [ - 'officerLevel' => 0, - 'officerLevelText' => 0, - 'lbonus' => 0, - 'ownerName' => 0, - 'honorText' => 0, - 'dedLevelText' => 0, - 'bill' => 0, - ]; - $specialViewFilter = [ - 'officerLevel' => function ($rawGeneral) { - return $this->getOfficerLevel($rawGeneral); - }, - 'officerLevelText' => function ($rawGeneral) use ($nationArr) { - $level = $this->getOfficerLevel($rawGeneral); - return getOfficerLevelText($level, $nationArr['level']); - }, - 'lbonus' => function ($rawGeneral) use ($nationArr) { - return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']); - }, - 'ownerName' => function ($rawGeneral) { - if ($rawGeneral['npc'] != 1) { - return null; - } - return $rawGeneral['owner_name']; - }, - 'honorText' => function ($rawGeneral) { - return getHonor($rawGeneral['experience']); - }, - 'dedLevelText' => function ($rawGeneral) { - return getDedLevelText($rawGeneral['dedlevel']); - }, - 'turntime' => function ($rawGeneral) { - //'0000-00-00 11:23'; - return substr($rawGeneral['turntime'], 11, 5); - }, - 'bill' => fn($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']) - - ]; - - [$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys($viewColumns), 1); + [$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys(static::$viewColumns), 1); $rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i', Util::formatListOfBackticks($queryColumns), $nationID), 'no'); + $reservedCommand = []; + if ($this->permission >= 2) { + $nonNPCGeneralIDList = []; + foreach ($rawGeneralList as $rawGeneral) { + if ($rawGeneral['npc'] < 2) { + $nonNPCGeneralIDList[] = $rawGeneral['no']; + } + } + + $rawTurnList = $db->query( + 'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc', + $nonNPCGeneralIDList + ); + + foreach ($rawTurnList as $rawTurn) { + [ + 'general_id' => $generalID, + 'action' => $action, + 'arg' => $arg, + 'brief' => $brief, + ] = $rawTurn; + if (!key_exists($generalID, $reservedCommand)) { + $reservedCommand[$generalID] = []; + } + $reservedCommand[$generalID][] = [ + 'action' => $action, + 'arg' => $arg, + 'brief' => $brief + ]; + } + } + + $rankList = []; + if ($rankColumns) { + $rawRankList = $db->query('SELECT general_id, `type`, `value` FROM rank_data WHERE nation_id = %i AND `type` IN %ls', $nationID, $rankColumns); + foreach ($rawRankList as $rawRank) { + [ + 'general_id' => $generalID, + 'type' => $type, + 'value' => $value + ] = $rawRank; + + if (!key_exists($generalID, $rankList)) { + $rankList[$generalID] = []; + } + $rankList[$generalID][$type] = $value; + } + } + + $getRankVar = fn ($key) => (fn ($rawGeneral) => (($rankList[$rawGeneral['no']] ?? [])[$key] ?? 0)); + + + $specialViewFilter = [ + 'officerLevel' => fn ($rawGeneral) => $this->getOfficerLevel($rawGeneral), + 'officerLevelText' => fn ($rawGeneral) => getOfficerLevelText($this->getOfficerLevel($rawGeneral), $nationArr['level']), + 'lbonus' => fn ($rawGeneral) => calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']), + 'ownerName' => fn ($rawGeneral) => ($rawGeneral['npc'] != 1) ? null : $rawGeneral['owner_name'], + 'honorText' => fn ($rawGeneral) => getHonor($rawGeneral['experience']), + 'dedLevelText' => fn ($rawGeneral) => getDedLevelText($rawGeneral['dedlevel']), + //'0000-00-00 11:23'; + 'turntime' => fn ($rawGeneral) => substr($rawGeneral['turntime'], 0, 19), + 'bill' => fn ($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']), + 'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null, + 'autorun_limit' => fn ($rawGeneral) => ($rawGeneral['aux'] ?? [])['autorun_limit'] ?? 0, + ]; + + foreach ($rankColumns as $rankKey) { + $specialViewFilter[$rankKey] = $getRankVar($rankKey); + } + + $resultColumns = []; - foreach ($viewColumns as $column => $reqPermission) { + foreach (static::$viewColumns as $column => $reqPermission) { if ($reqPermission > $this->permission) { continue; } - if(key_exists($column, $columnRemap)){ - $resultColumns[$columnRemap[$column]] = $column; - } - else{ + if (key_exists($column, static::$columnRemap)) { + $newColumn = static::$columnRemap[$column]; + if($newColumn !== null){ + $resultColumns[$newColumn] = $column; + } + } else { $resultColumns[$column] = $column; } } - foreach ($customViewColumns as $column => $reqPermission) { + foreach (static::$customViewColumns as $column => $reqPermission) { if ($reqPermission > $this->permission) { continue; } @@ -179,6 +245,9 @@ class GeneralList extends \sammo\BaseAPI $generalList = []; foreach ($rawGeneralList as $rawGeneral) { //General 생성? + if (key_exists('aux', $rawGeneral)) { + $rawGeneral['aux'] = \sammo\JSON::decode($rawGeneral['aux']); + } $item = []; foreach ($resultColumns as $column) { @@ -198,6 +267,7 @@ class GeneralList extends \sammo\BaseAPI 'permission' => $this->permission, 'column' => array_keys($resultColumns), 'list' => $generalList, + 'env' => $env, ]; return $result; diff --git a/hwe/ts/PageNationGeneral.vue b/hwe/ts/PageNationGeneral.vue index e243616e..d5ac1313 100644 --- a/hwe/ts/PageNationGeneral.vue +++ b/hwe/ts/PageNationGeneral.vue @@ -1,7 +1,7 @@ @@ -20,11 +20,17 @@ import { BContainer } from "bootstrap-vue-3"; import { onMounted, provide, ref } from "vue"; import { SammoAPI } from "./SammoAPI"; import { merge2DArrToObjectArr } from "./util/merge2DArrToObjectArr"; -import type { GeneralListItem } from "./defs/API/Nation"; +import type { GeneralListItem, GeneralListResponse } from "./defs/API/Nation"; import GeneralList from "./components/GeneralList.vue"; import { type GameConstStore, getGameConstStore } from "./GameConstStore"; const generalList = ref([]); +const envVal = ref({ + year: 1, + month: 1, + turnterm: 1, + turntime: '2022-02-22 22:22:22.22222' +}); const gameConstStore = ref(); provide('gameConstStore', gameConstStore); @@ -43,7 +49,7 @@ void Promise.all([storeP]).then(()=>{ onMounted(async () => { try { - const { column, list, permission } = await SammoAPI.Nation.GeneralList(); + const { column, list, permission, env } = await SammoAPI.Nation.GeneralList(); //XXX: 로직상 똑같은데.... if (permission == 0) { const rawGeneralList = merge2DArrToObjectArr(column, list); @@ -57,6 +63,7 @@ onMounted(async () => { } else { throw `?? ${permission}`; } + envVal.value = env; } catch (e) { console.error(e); diff --git a/hwe/ts/components/GeneralList.vue b/hwe/ts/components/GeneralList.vue index ee6d169b..095a90fb 100644 --- a/hwe/ts/components/GeneralList.vue +++ b/hwe/ts/components/GeneralList.vue @@ -19,7 +19,7 @@