diff --git a/.phan/config.php b/.phan/config.php index 4624a3b4..1daf4128 100644 --- a/.phan/config.php +++ b/.phan/config.php @@ -57,7 +57,6 @@ return [ 'hwe/b_myPage.php', 'hwe/v_processing.php', 'hwe/b_tournament.php', - 'hwe/b_troop.php', 'hwe/c_tournament.php', 'hwe/func_auction.php', 'hwe/func_command.php', diff --git a/hwe/b_troop.php b/hwe/b_troop.php deleted file mode 100644 index 5260b3ac..00000000 --- a/hwe/b_troop.php +++ /dev/null @@ -1,251 +0,0 @@ -setReadOnly(); -$userID = Session::getUserID(); - -$db = DB::db(); - -increaseRefresh("부대편성", 1); - -$me = $db->queryFirstRow('SELECT no,nation,troop,`officer_level`,permission,penalty FROM general WHERE owner=%i', $userID); -$permission = checkSecretPermission($me, false); - -$troops = []; -foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) { - $troops[$rawTroop['troop_leader']] = [ - 'name' => $rawTroop['name'], - 'users' => [] - ]; -} - -foreach ($db->query( - 'SELECT no,name,turntime,troop,city FROM general WHERE troop!=0 AND nation = %i ORDER BY turntime ASC', - $me['nation'] -) as $general) { - if (!key_exists($general['troop'], $troops)) { - trigger_error("올바르지 않은 부대 소속 {$general['no']}, {$general['name']} : {$general['troop']}"); - continue; - } - - $general['cityText'] = CityConst::byID($general['city'])->name; - - $troops[$general['troop']]['users'][] = $general; -} - -if ($troops) { - $troopLeaders = $db->query( - 'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li', - array_keys($troops) - ); - $generalTurnList = []; - - foreach ($db->queryAllLists( - 'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC', - array_column($troopLeaders, 'no') - ) as [$generalID, $turnIdx, $brief]) { - if (!key_exists($generalID, $generalTurnList)) { - $generalTurnList[$generalID] = []; - } - $generalTurnList[$generalID][$turnIdx] = $brief; - } - - foreach ($troopLeaders as $troopLeader) { - $imageTemp = GetImageURL($troopLeader['imgsvr']); - - $troopLeader['pictureFullPath'] = "$imageTemp/{$troopLeader['picture']}"; - $troopLeader['cityText'] = CityConst::byID($troopLeader['city'])->name; - - $turnText = []; - foreach ($generalTurnList[$troopLeader['no']] as $rawTurnIdx => $brief) { - if ($brief != '집합') { - $brief = '~'; - } - $turnIdx = $rawTurnIdx + 1; - $turnText[] = "{$turnIdx} : {$brief}"; - } - $troopLeader['turnText'] = join('
', $turnText); - $troops[$troopLeader['troop']]['leader'] = $troopLeader; - } -} - -uasort($troops, function ($lhs, $rhs) { - return $lhs['leader']['turntime'] <=> $rhs['leader']['turntime']; -}) - -?> - - - - - - - - <?= UniqueConst::$serverName ?>: 부대편성 - - - - - - - -
- - - - -
부 대 편 성
- - - - - - - - - - - - - - - - - $troop) { - $troopLeader = $troop['leader']; - $genlistText = []; - $cityText = $troopLeader['cityText']; - $cityID = $troopLeader['city']; - $leaderID = $troopLeader['no']; - - foreach ($troop['users'] as $troopUser) { - $spanClass = 'troopUser'; - if ($troopUser['city'] !== $cityID) { - $spanClass .= ' diffCity'; - } - if ($troopUser['no'] == $leaderID) { - $spanClass .= ' leader'; - } - $genlistText[] = "{$troopUser['name']}【{$troopUser['cityText']}】"; - } - - $genlistText = sprintf('%s (%d명)', join(', ', $genlistText), count($genlistText)); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $troop) { - ?> - - - -
선 택부 대 정 보부 대 장장 수부대장행동
- - - - - - -

");background-size:64px;'> 
- 【턴】 - - -
- - -
 
");background-size:64px;'>  - -
- - - - -
- 【턴】 - - -
-
-
- -
-
-
부대명
-
-
-
-
- - -
-
-
부대명
-
-
-
-
-
-
- -
- - - - - - - - - -
-
- - - \ No newline at end of file diff --git a/hwe/sammo/API/Nation/GeneralList.php b/hwe/sammo/API/Nation/GeneralList.php index 9568b914..26cf933b 100644 --- a/hwe/sammo/API/Nation/GeneralList.php +++ b/hwe/sammo/API/Nation/GeneralList.php @@ -2,6 +2,7 @@ namespace sammo\API\Nation; +use ArrayObject; use sammo\DB; use sammo\General; use sammo\Session; @@ -45,10 +46,11 @@ class GeneralList extends \sammo\BaseAPI 'connect' => 0, 'troop' => 0, + 'city' => 0, 'con' => 1, - 'specage' => 1, - 'specage2' => 1, + 'specage' => 0, + 'specage2' => 0, 'leadership_exp' => 1, 'strength_exp' => 1, 'intel_exp' => 1, @@ -58,7 +60,6 @@ class GeneralList extends \sammo\BaseAPI 'dex4' => 1, 'dex5' => 1, - 'city' => 1, 'experience' => 1, 'dedication' => 1, @@ -158,35 +159,59 @@ class GeneralList extends \sammo\BaseAPI $rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i ORDER BY turntime ASC', Util::formatListOfBackticks($queryColumns), $nationID), 'no'); + /** @var ArrayObject[] */ + $troops = []; + foreach ($db->queryAllLists('SELECT troop_leader,name FROM troop WHERE nation = %i', $nationID) as [$troopLeaderID, $troopName]) { + if (!key_exists($troopLeaderID, $rawGeneralList)) { + continue; + } + $troopTurnTime = $rawGeneralList[$troopLeaderID]['turntime']; + $troops[$troopLeaderID] = new ArrayObject([ + 'id' => $troopLeaderID, + 'name' => $troopName, + 'turntime' => $troopTurnTime, + 'reservedCommand' => [], + ]); + } + $reservedCommand = []; - if ($this->permission >= 1) { - $nonNPCGeneralIDList = []; - foreach ($rawGeneralList as $rawGeneral) { - if ($rawGeneral['npc'] < 2) { - $nonNPCGeneralIDList[] = $rawGeneral['no']; + if ($this->permission >= 1 || count($troops)) { + $reservedCommandTargetGeneralIDList = []; + + if($this->permission >= 1){ + foreach ($rawGeneralList as $rawGeneral) { + if ($rawGeneral['npc'] < 2) { + $reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no']; + } } } + foreach($troops as $troop){ + $reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id']; + } + - $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] = []; + if($reservedCommandTargetGeneralIDList){ + $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', + array_values($reservedCommandTargetGeneralIDList) + ); + + 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 + ]; } - $reservedCommand[$generalID][] = [ - 'action' => $action, - 'arg' => $arg, - 'brief' => $brief - ]; } } @@ -252,6 +277,17 @@ class GeneralList extends \sammo\BaseAPI $resultColumns[$column] = $column; } + foreach ($troops as $troop){ + $troopLeaderID = $troop['id']; + $troop['reservedCommand'] = array_map(function($turnObj){ + $brief = $turnObj['brief']; + if($brief == '집합'){ + return $brief; + } + return '-'; + }, $specialViewFilter['reservedCommand']($rawGeneralList[$troopLeaderID])); + } + $generalList = []; foreach ($rawGeneralList as $rawGeneral) { //General 생성? @@ -272,25 +308,14 @@ class GeneralList extends \sammo\BaseAPI $generalList[] = $item; } - $troops = []; - foreach ($db->queryAllLists('SELECT troop_leader,name FROM troop WHERE nation = %i', $nationID) as [$troopLeaderID, $troopName]) { - if (!key_exists($troopLeaderID, $rawGeneralList)) { - continue; - } - $troopTurnTime = $rawGeneralList[$troopLeaderID]['turntime']; - $troops[] = [ - 'id' => $troopLeaderID, - 'name' => $troopName, - 'turntime' => $troopTurnTime - ]; - } $result = [ 'result' => true, 'permission' => $this->permission, 'column' => array_keys($resultColumns), 'list' => $generalList, - 'troops' => $troops, + 'troops' => array_values($troops), 'env' => $env, + 'myGeneralID' => $session->generalID, ]; return $result; diff --git a/hwe/sammo/API/Nation/SetTroopName.php b/hwe/sammo/API/Nation/SetTroopName.php index b8689d6f..0dec998b 100644 --- a/hwe/sammo/API/Nation/SetTroopName.php +++ b/hwe/sammo/API/Nation/SetTroopName.php @@ -10,6 +10,7 @@ use sammo\Validator; use function sammo\checkSecretPermission; +/** @deprecated */ class SetTroopName extends \sammo\BaseAPI { public function validateArgs(): ?string diff --git a/hwe/sammo/API/Troop/ExitTroop.php b/hwe/sammo/API/Troop/ExitTroop.php new file mode 100644 index 00000000..0d71879c --- /dev/null +++ b/hwe/sammo/API/Troop/ExitTroop.php @@ -0,0 +1,46 @@ +generalID; + $db = DB::db(); + + $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID); + if($troopID == 0){ + return '부대에 소속되어 있지 않습니다.'; + } + + if($generalID != $troopID){ + $db->update('general', [ + 'troop' => 0, + ], '`no` = %i', $generalID); + return null; + } + + //부대장이다. + $db->update('general', [ + 'troop' => 0, + ], '`troop` = %i', $troopID); + $db->delete('troop', 'troop_leader = %i', $troopID); + + return null; + } +} diff --git a/hwe/sammo/API/Troop/JoinTroop.php b/hwe/sammo/API/Troop/JoinTroop.php new file mode 100644 index 00000000..42477001 --- /dev/null +++ b/hwe/sammo/API/Troop/JoinTroop.php @@ -0,0 +1,59 @@ +args); + $v->rule('required', [ + 'troopID', + ]) + ->rule('integer', 'troopID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $troopID = $this->args['troopID']; + + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + if ($me['troop'] != 0) { + return '이미 부대에 소속되어 있습니다.'; + } + $nationID = $me['nation']; + if ($nationID == 0) { + return '국가에 소속되어 있지 않습니다.'; + } + + $troopExists = $db->queryFirstField('SELECT `troop_leader` FROM `troop` WHERE `troop_leader` = %i AND `nation` = %i', $troopID, $nationID); + if (!$troopExists) { + return '부대가 올바르지 않습니다.'; + } + $generalID = $me['no']; + + $db->update('general', [ + 'troop' => $troopID, + ], '`no` = %i AND `troop` = %i', $generalID, 0); + + return null; + } +} diff --git a/hwe/sammo/API/Troop/KickFromTroop.php b/hwe/sammo/API/Troop/KickFromTroop.php new file mode 100644 index 00000000..619fc753 --- /dev/null +++ b/hwe/sammo/API/Troop/KickFromTroop.php @@ -0,0 +1,57 @@ +args); + $v->rule('required', [ + 'troopID', + 'generalID', + ]) + ->rule('integer', 'troopID') + ->rule('integer', 'generalID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $generalID = $this->args['generalID']; + $db = DB::db(); + + $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID); + if($troopID == 0){ + return '부대에 소속되어 있지 않습니다.'; + } + + if($troopID != $this->args['troopID']){ + return '다른 부대에 소속되어 있습니다.'; + } + + if($troopID == $generalID){ + return '부대장을 추방할 수 없습니다.'; + } + + $db->update('general', [ + 'troop' => 0, + ], '`no` = %i AND `troop` = %i', $generalID, $troopID); + return null; + } +} diff --git a/hwe/sammo/API/Troop/NewTroop.php b/hwe/sammo/API/Troop/NewTroop.php new file mode 100644 index 00000000..69e5521f --- /dev/null +++ b/hwe/sammo/API/Troop/NewTroop.php @@ -0,0 +1,68 @@ +args); + $v->rule('required', [ + 'troopName', + ]) + ->rule('stringWidthBetween', 'troopName', 1, 18); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $troopName = StringUtil::neutralize($this->args['troopName']); + if(!$troopName){ + return '부대 이름이 없습니다.'; + } + + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + if($me['troop'] != 0){ + return '이미 부대에 소속되어 있습니다.'; + } + $nationID = $me['nation']; + if($nationID == 0){ + return '국가에 소속되어 있지 않습니다.'; + } + + $generalID = $me['no']; + + $db->insert('troop', [ + 'name'=>$troopName, + 'troop_leader'=>$generalID, + 'nation'=>$nationID, + ]); + + if($db->affectedRows() == 0){ + return '부대가 생성되지 않았습니다. 버그일 수 있습니다.'; + } + + $db->update('general', [ + 'troop'=>$generalID + ], '`no` = %i', $generalID); + + return null; + } +} diff --git a/hwe/sammo/API/Troop/SetTroopName.php b/hwe/sammo/API/Troop/SetTroopName.php new file mode 100644 index 00000000..a59cdfb7 --- /dev/null +++ b/hwe/sammo/API/Troop/SetTroopName.php @@ -0,0 +1,65 @@ +args); + $v->rule('required', [ + 'troopID', + 'troopName', + ]) + ->rule('stringWidthBetween', 'troopName', 1, 18) + ->rule('integer', 'troopID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + $permission = checkSecretPermission($me, false); + $troopID = $this->args['troopID']; + + $generalID = $me['no']; + if($generalID != $troopID && $permission < 4){ + return "권한이 부족합니다."; + } + + $troopName = StringUtil::neutralize($this->args['troopName']); + if(!$troopName){ + return '부대 이름이 없습니다.'; + } + + $nationID = $me['nation']; + $db->update('troop', [ + 'name'=>$troopName + ], 'troop_leader=%i AND `nation`=%i',$troopID, $nationID); + + if($db->affectedRows() == 0){ + return '부대가 없습니다.'; + } + + return null; + } +} diff --git a/hwe/templates/commandButton.php b/hwe/templates/commandButton.php index 29c513c7..059d6740 100644 --- a/hwe/templates/commandButton.php +++ b/hwe/templates/commandButton.php @@ -1,6 +1,6 @@ '>회 의 실 '>기 밀 실 - '>부대 편성 + '>부대 편성 '>외 교 부 '>인 사 부 '>내 무 부 diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue new file mode 100644 index 00000000..74ce3958 --- /dev/null +++ b/hwe/ts/PageTroop.vue @@ -0,0 +1,645 @@ + + + + + diff --git a/hwe/ts/SammoAPI.ts b/hwe/ts/SammoAPI.ts index bf926c51..b63d498b 100644 --- a/hwe/ts/SammoAPI.ts +++ b/hwe/ts/SammoAPI.ts @@ -227,12 +227,30 @@ const apiRealPath = { }, GetGeneralLogResponse >, + /** @deprecated */ SetTroopName: PATCH as APICallT<{ troopID: number; troopName: string; }>, GetNationInfo: GET as APICallT<{full?: boolean}, NationInfoResponse>, }, + Troop: { + NewTroop: POST as APICallT<{ + troopName: string; + }>, + JoinTroop: PATCH as APICallT<{ + troopID: number; + }>, + ExitTroop: PATCH as APICallT, + SetTroopName: PATCH as APICallT<{ + troopID: number; + troopName: string; + }>, + KickFromTroop: PATCH as APICallT<{ + troopID: number; + generalID: number; + }> + }, Vote: { AddComment: POST as APICallT<{ voteID: number; diff --git a/hwe/ts/build_exports.json b/hwe/ts/build_exports.json index 51550860..4f253b09 100644 --- a/hwe/ts/build_exports.json +++ b/hwe/ts/build_exports.json @@ -37,6 +37,7 @@ "v_nationBetting": "v_nationBetting.ts", "v_nationGeneral": "v_nationGeneral.ts", "v_globalDiplomacy": "v_globalDiplomacy", + "v_troop": "v_troop.ts", "v_vote": "v_vote.ts" } } \ No newline at end of file diff --git a/hwe/ts/components/GeneralLiteCard.vue b/hwe/ts/components/GeneralLiteCard.vue new file mode 100644 index 00000000..18364975 --- /dev/null +++ b/hwe/ts/components/GeneralLiteCard.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/hwe/ts/components/GeneralSupplementCard.vue b/hwe/ts/components/GeneralSupplementCard.vue index 10107da0..1b75af9e 100644 --- a/hwe/ts/components/GeneralSupplementCard.vue +++ b/hwe/ts/components/GeneralSupplementCard.vue @@ -38,24 +38,24 @@
피살
{{ general.deathcrew.toLocaleString() }}
-
+
숙련도
-
예약턴
-
- {{ turn.brief }} +
예약턴
+
+ {{ turn.brief }}
@@ -161,12 +161,16 @@ const dexList = computed((): [string, number, DexInfo][] => { } .general-card-turn { - .bg1 { - border-left: solid 1px gray; + > div { + height: calc(64px / 3); + border-bottom: solid 1px gray; + border-right: solid 1px gray; } - > div { - border-bottom: solid 1px gray; + > .command{ + font-size: 90%; + display: grid; + align-content: center; } } diff --git a/hwe/ts/defs/API/Nation.ts b/hwe/ts/defs/API/Nation.ts index 126f2278..85b26c67 100644 --- a/hwe/ts/defs/API/Nation.ts +++ b/hwe/ts/defs/API/Nation.ts @@ -7,79 +7,79 @@ export type SetBlockWarResponse = ValidResponse & { }; export type GeneralListItemP0 = { - no: number, - name: string, - nation: number, - npc: number, - injury: number, - leadership: number, - strength: number, - intel: number, - explevel: number, - dedlevel: number, - gold: number, - rice: number, - killturn: number, - picture: string, - imgsvr: 0 | 1, - age: number, - specialDomestic: GameObjClassKey, - specialWar: GameObjClassKey, - personal: GameObjClassKey, - belong: number, - connect: number, + no: number; + name: string; + nation: number; + npc: number; + injury: number; + leadership: number; + strength: number; + intel: number; + explevel: number; + dedlevel: number; + gold: number; + rice: number; + killturn: number; + picture: string; + imgsvr: 0 | 1; + age: number; + specialDomestic: GameObjClassKey; + specialWar: GameObjClassKey; + personal: GameObjClassKey; + belong: number; + connect: number; - officerLevel: number, //권한에따라 태수,군사,시종 노출 여부가 다름 - officerLevelText: string, - lbonus: number, - ownerName: string | null, //NPC 출력용에 따라 결과가 다름 - honorText: string, - dedLevelText: string, - bill: number, - reservedCommand: TurnObj[] | null, + officerLevel: number; //권한에따라 태수,군사,시종 노출 여부가 다름 + officerLevelText: string; + lbonus: number; + ownerName: string | null; //NPC 출력용에 따라 결과가 다름 + honorText: string; + dedLevelText: string; + bill: number; + reservedCommand: TurnObj[] | null; - autorun_limit: number, + autorun_limit: number; - troop: number, -} + city: number; + troop: number; +}; export type GeneralListItemP1 = { - con: number, - specage: number, - specage2: number, - leadership_exp: number, - strength_exp: number, - intel_exp: number, + con: number; + specage: number; + specage2: number; + leadership_exp: number; + strength_exp: number; + intel_exp: number; - dex1: number, - dex2: number, - dex3: number, - dex4: number, - dex5: number, + dex1: number; + dex2: number; + dex3: number; + dex4: number; + dex5: number; - city: number, - experience: number, - dedication: number, - officer_level: number, - officer_city: number, - defence_train: number, - crewtype: GameObjClassKey, - crew: number, - train: number, - atmos: number, - turntime: string, - recent_war: string, - horse: GameObjClassKey, - weapon: GameObjClassKey, - book: GameObjClassKey, - item: GameObjClassKey, + experience: number; + dedication: number; + officer_level: number; + officer_city: number; + defence_train: number; + crewtype: GameObjClassKey; + crew: number; + train: number; + atmos: number; + turntime: string; + recent_war: string; + horse: GameObjClassKey; + weapon: GameObjClassKey; + book: GameObjClassKey; + item: GameObjClassKey; - warnum: number, - killnum: number, - deathnum: number, - killcrew: number, - deathcrew: number, - firenum: number, + warnum: number; + killnum: number; + deathnum: number; + killcrew: number; + deathcrew: number; + firenum: number; } & GeneralListItemP0; export type GeneralListItemP2 = GeneralListItemP1; @@ -87,45 +87,48 @@ export type GeneralListItemP2 = GeneralListItemP1; export type RawGeneralListItem = GeneralListItemP0 | GeneralListItemP1 | GeneralListItemP2; export type GeneralListItem = - (GeneralListItemP0 & { st0: true, st1: false, st2: false, permission: 0 }) | - (GeneralListItemP1 & { st0: true, st1: true, st2: false, permission: 1 }) | - (GeneralListItemP2 & { st0: true, st1: true, st2: true, permission: 2 | 3 | 4 }); + | (GeneralListItemP0 & { st0: true; st1: false; st2: false; permission: 0 }) + | (GeneralListItemP1 & { st0: true; st1: true; st2: false; permission: 1 }) + | (GeneralListItemP2 & { st0: true; st1: true; st2: true; permission: 2 | 3 | 4 }); type ResponseEnv = { - year: number, - month: number, - turntime: string, - turnterm: number, - killturn: number, + year: number; + month: number; + turntime: string; + turnterm: number; + killturn: number; autorun_user?: { - limit_minutes: number, - options: Record, - } -} + limit_minutes: number; + options: Record; + }; +}; -export type RawGeneralListP0 = ValidResponse & { - permission: 0, - column: (keyof GeneralListItemP0)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], - env: ResponseEnv, -} +type RawGeneralCommon = { + troops: { id: number; name: string; turntime: string; reservedCommand: string[] }[]; + env: ResponseEnv; + myGeneralID: number; +}; -export type RawGeneralListP1 = ValidResponse & { - permission: 1, - column: (keyof GeneralListItemP1)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], - env: ResponseEnv, -} +export type RawGeneralListP0 = ValidResponse & + RawGeneralCommon & { + permission: 0; + column: (keyof GeneralListItemP0)[]; + list: ValuesOf[][]; + }; -export type RawGeneralListP2 = ValidResponse & { - permission: 2 | 3 | 4, - column: (keyof GeneralListItemP2)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], - env: ResponseEnv, -} +export type RawGeneralListP1 = ValidResponse & + RawGeneralCommon & { + permission: 1; + column: (keyof GeneralListItemP1)[]; + list: ValuesOf[][]; + }; + +export type RawGeneralListP2 = ValidResponse & + RawGeneralCommon & { + permission: 2 | 3 | 4; + column: (keyof GeneralListItemP2)[]; + list: ValuesOf[][]; + }; export type GeneralListResponse = RawGeneralListP0 | RawGeneralListP1 | RawGeneralListP2; @@ -141,16 +144,18 @@ export type NationItem = NationStaticItem & { strategic_cmd_limit: number; surlimit: number; tech: number; -} +}; export type LiteNationInfoResponse = ValidResponse & { nation: NationStaticItem; -} +}; -export type NationInfoResponse = (ValidResponse & { - nation: NationStaticItem; -}) | (ValidResponse &{ - nation: NationItem; - impossibleStrategicCommandLists: [string, number][]; - troops: Record; -}) \ No newline at end of file +export type NationInfoResponse = + | (ValidResponse & { + nation: NationStaticItem; + }) + | (ValidResponse & { + nation: NationItem; + impossibleStrategicCommandLists: [string, number][]; + troops: Record; + }); diff --git a/hwe/ts/util/convertIterableToMap.ts b/hwe/ts/util/convertIterableToMap.ts new file mode 100644 index 00000000..ad98f75c --- /dev/null +++ b/hwe/ts/util/convertIterableToMap.ts @@ -0,0 +1,10 @@ +export function convertIterableToMap( + values: Iterable, + key: K +): Map { + const result = new Map(); + for (const obj of values) { + result.set(obj[key] as V, obj); + } + return result; +} diff --git a/hwe/ts/v_troop.ts b/hwe/ts/v_troop.ts new file mode 100644 index 00000000..45e11217 --- /dev/null +++ b/hwe/ts/v_troop.ts @@ -0,0 +1,15 @@ +import "@scss/troop.scss"; + +import { createApp } from 'vue' +import PageTroop from '@/PageTroop.vue'; +import { BootstrapVue3, BToastPlugin } from 'bootstrap-vue-3' +import { auto500px } from "./util/auto500px"; +import { htmlReady } from "./util/htmlReady"; +import { insertCustomCSS } from "./util/customCSS"; + +auto500px(); + +htmlReady(() => { + insertCustomCSS(); +}); +createApp(PageTroop).use(BootstrapVue3).use(BToastPlugin).mount('#app') \ No newline at end of file diff --git a/hwe/v_troop.php b/hwe/v_troop.php new file mode 100644 index 00000000..6923ed9a --- /dev/null +++ b/hwe/v_troop.php @@ -0,0 +1,40 @@ +setReadOnly(); +$userID = Session::getUserID(); + +$db = DB::db(); +$gameStor = KVStorage::getStorage($db, 'game_env'); + +?> + + + + + + + + <?= UniqueConst::$serverName ?>: 부대 편성 + [ + 'serverNick' => DB::prefix(), + 'mapName' => GameConst::$mapName, + 'unitSet' => GameConst::$unitSet, + ] + ], false) ?> + + + + + + + +
+ + + \ No newline at end of file