feat(wip): 세력장수에서 암행부, 랭크 값 모두 불러옴

This commit is contained in:
2022-04-07 03:03:38 +09:00
parent 09fb96d9b3
commit c104fbcf58
5 changed files with 207 additions and 117 deletions
+163 -93
View File
@@ -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;
+10 -3
View File
@@ -1,7 +1,7 @@
<template>
<BContainer id="container" :toast="{ root: true }" class="pageNationGeneral bg0">
<TopBackBar :title="title" />
<GeneralList v-if="asyncReady" :list="generalList" :height="'fill'" />
<GeneralList v-if="asyncReady" :list="generalList" :env="envVal" :height="'fill'" />
<BottomBar />
</BContainer>
</template>
@@ -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<GeneralListItem[]>([]);
const envVal = ref<GeneralListResponse['env']>({
year: 1,
month: 1,
turnterm: 1,
turntime: '2022-02-22 22:22:22.22222'
});
const gameConstStore = ref<GameConstStore>();
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);
+5 -19
View File
@@ -19,7 +19,7 @@
</template>
<script lang="ts"></script>
<script lang="ts" setup>
import type { GeneralListItem, GeneralListItemP2 } from "@/defs/API/Nation";
import type { GeneralListItem, GeneralListItemP2, GeneralListResponse } from "@/defs/API/Nation";
import { getIconPath } from "@/util/getIconPath";
import { inject, ref, watch, type PropType, type Ref, type StyleValue } from "vue";
import { AgGridVue } from "ag-grid-vue3";
@@ -52,20 +52,20 @@ const props = defineProps({
required: false,
default: "static",
},
env: {
type: Object as PropType<GeneralListResponse['env']>,
required: true,
}
});
const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore"));
const iActionInfo = gameConstStore.value.iActionInfo;
console.log(iActionInfo);
//debug
console.log(`list`, props.list);
watch(
() => props.list,
() => {
setTimeout(() => {
//debug
console.log(`list`, props.list);
gridApi.value?.redrawRows();
}, 0);
}
@@ -155,20 +155,6 @@ type GridCellInfo = {
target: keyof GeneralListItem;
};
function naiveCheClassNameFilter(value: string): string {
const text = value.split("_").pop() ?? "None";
if (text === "None") {
return "-";
}
return text;
}
function naiveCheClassNameFilterFromRow(key: keyof GeneralListItem) {
return (value: GenValueParams): string => {
return naiveCheClassNameFilter(value.data[key]?.toString() ?? "None");
};
}
function numberFormatter(value: GenValueParams): string {
return (value.value as number).toLocaleString();
}
+29
View File
@@ -36,6 +36,9 @@ export type GeneralListItemP0 = {
honorText: string,
dedLevelText: string,
bill: number,
reservedCommand: TurnObj[] | null,
autorun_limit: number,
}
export type GeneralListItemP1 = {
@@ -47,7 +50,24 @@ export type GeneralListItemP1 = {
export type GeneralListItemP2 = GeneralListItemP1 & {
officer_level: number,
officer_city: number,
defence_train: number,
troop: number,
crewtype: GameObjClassKey,
crew: number,
train: number,
atmos: number,
turntime: string,
horse: GameObjClassKey,
weapon: GameObjClassKey,
book: GameObjClassKey,
item: GameObjClassKey,
warnum: number,
killnum: number,
deathnum: number,
killcrew: number,
deathcrew: number,
firenum: number,
}
export type RawGeneralListItem = GeneralListItemP0 | GeneralListItemP1 | GeneralListItemP2;
@@ -57,23 +77,32 @@ export type GeneralListItem =
({ permission: 1 } & GeneralListItemP1) |
({ permission: 2 | 3 | 4 } & GeneralListItemP2);
type ResponseEnv = {
year: number,
month: number,
turntime: string,
turnterm: number,
}
export type RawGeneralListP0 = ValidResponse & {
permission: 0,
column: (keyof GeneralListItemP0)[],
list: ValuesOf<GeneralListItemP0>[][],
env: ResponseEnv,
}
export type RawGeneralListP1 = ValidResponse & {
permission: 1,
column: (keyof GeneralListItemP1)[],
list: ValuesOf<GeneralListItemP1>[][],
env: ResponseEnv,
}
export type RawGeneralListP2 = ValidResponse & {
permission: 2 | 3 | 4,
column: (keyof GeneralListItemP2)[],
list: ValuesOf<GeneralListItemP2>[][],
env: ResponseEnv,
}
export type GeneralListResponse = RawGeneralListP0 | RawGeneralListP1 | RawGeneralListP2;
@@ -44,6 +44,4 @@ const props = defineProps({
required: true,
},
});
console.log(props.params.cells);
</script>