Compare commits

...
19 Commits
Author SHA1 Message Date
sars f71aa79b0d Merge branch 'devel' into asia_scenario 2022-08-02 16:20:18 +09:00
sars 15cf23dd4d 아시아 명장전 시나리오(비급) 추가 2022-08-02 00:17:37 -07:00
Hide_D 48f4dbec50 misc: 부대편성 1000px 버튼의 위치를 명확히 2022-07-31 22:34:33 +09:00
Hide_D bdb29006e9 refac: 부대편성에서 1000px 모드 버튼을 좌하단으로 2022-07-31 22:20:29 +09:00
Hide_D 5ea324f103 fix: v-b-tooltip에서 undefined -> string type 초기화 생략 2022-07-31 20:34:18 +09:00
Hide_D 2f0cd32c18 fix: 부대 편성에서 부대장 집합 순서로 정렬 필요 2022-07-31 19:50:52 +09:00
Hide_D e8911d40df fix: 부대 편성에서 부대장과 다른 도시 표기가 안됨 2022-07-31 12:08:40 +09:00
Hide_D 89f173e7e3 fix: 베팅 최소 한도가 10이 아니라 1로 된 버그 수정 2022-07-30 21:13:00 +09:00
Hide_D b0ab3f6ace fix: css 누락, 로딩 누락 2022-07-30 20:48:31 +09:00
Hide_D 641af435d4 fix: 리셋 페이지 css 2022-07-30 20:45:27 +09:00
Hide_D 16a2f20af0 fix: 장수 카드에서 '남은 시간'이 제대로 표기 안됨 2022-07-30 20:16:08 +09:00
Hide_D 79734a6dcf fix: 부대명 변경이 아무에게나 보임 2022-07-30 19:44:30 +09:00
Hide_D 2e2ff1b150 feat: 감찰부에서 '이전', '다음' 버튼 2022-07-30 19:34:34 +09:00
Hide_D 5ce899ee6e fix: 장수 카드에 부상스탯 미반영 2022-07-30 14:25:23 +09:00
Hide_D e041080773 fix: 유산 포인트가 0이어도 동작 2022-07-30 12:15:07 +09:00
Hide_D f8448fbb51 fix: 자동 해산에 필요한 변수를 제공하지 않음 2022-07-30 10:34:40 +09:00
Hide_D 8defcd29a4 fix: 인자 오류 수정 2022-07-30 10:31:31 +09:00
Hide_D fba60df9d1 fix: binarysearch 상한 에러 2022-07-29 01:24:09 +09:00
Hide_D a4ff1f44ba build: source-map 활성화(디버그용) 2022-07-29 01:13:51 +09:00
17 changed files with 1171 additions and 198 deletions
+1 -1
View File
@@ -528,7 +528,7 @@ function checkWander(RandUtil $rng)
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['year', 'month']); $admin = $gameStor->getValues(['year', 'month', 'init_year', 'init_month']);
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12'); $wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12');
+1
View File
@@ -32,6 +32,7 @@ if ($session->userGrade < 5 && !$allowReset) {
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?> <?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('css/install.css') ?> <?= WebUtil::printCSS('css/install.css') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'install']) ?> <?= WebUtil::printDist('ts', ['common', 'install']) ?>
</head> </head>
+1
View File
@@ -27,6 +27,7 @@ include "func.php";
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" /> <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?> <?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printDist('ts', ['common', 'recent_map'], true) ?> <?= WebUtil::printDist('ts', ['common', 'recent_map'], true) ?>
<?= WebUtil::printDist('vue', [], true) ?>
<style> <style>
html { html {
width: 700px; width: 700px;
+1 -1
View File
@@ -26,7 +26,7 @@ class Bet extends \sammo\BaseAPI
->rule('int', 'bettingID') ->rule('int', 'bettingID')
->rule('integerArray', 'bettingType') ->rule('integerArray', 'bettingType')
->rule('int', 'amount') ->rule('int', 'amount')
->rule('min', 'amount', 1); ->rule('min', 'amount', 10);
if (!$v->validate()) { if (!$v->validate()) {
return $v->errorStr(); return $v->errorStr();
+1 -1
View File
@@ -81,7 +81,7 @@ class GetGeneralLog extends \sammo\BaseAPI
if ( if (
$reqType === self::GENERAL_ACTION && $reqType === self::GENERAL_ACTION &&
$testGeneralNPCType < 2 && $testGeneralNPCType < 2 &&
$generalID !== $me['generalID'] && $generalID !== $me['no'] &&
$permission < 2 $permission < 2
) { ) {
return '권한이 부족합니다. 유저 장수의 개인 기록은 수뇌만 열람 가능합니다.'; return '권한이 부족합니다. 유저 장수의 개인 기록은 수뇌만 열람 가능합니다.';
+1 -1
View File
@@ -121,7 +121,7 @@ class InheritancePointManager
$gameStor = KVStorage::getStorage(DB::db(), 'game_env'); $gameStor = KVStorage::getStorage(DB::db(), 'game_env');
if ($storeType === true || ($gameStor->isunited != 0 && !$forceCalc)) { if ($storeType === true || ($gameStor->isunited != 0 && !$forceCalc)) {
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$ownerID}"); $inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$ownerID}");
[$value, $aux] = $inheritStor->getValue($key); [$value, $aux] = $inheritStor->getValue($key) ?? [0, null];
return $value; return $value;
} }
+781
View File
@@ -0,0 +1,781 @@
{
"title": "【가상모드99】 아시아 명장전",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드99】</b>아시아 명장전!</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>삼국지를 기반으로 아시아의 고대 명장들이 추가된 시나리오"
],
"stat": {
"total": 285,
"min": 55,
"max": 120
},
"iconPath": ".",
"fiction": 1,
"nation":[
["HDD", "#FFFFFF", 999999, 999999, "운영자가 다 이김", 1000, "명가", 7, ["낙양", "업", "허창", "호로", "사수", "호관", "사곡", "완", "신야", "양양"]]
],
"diplomacy":[],
"general":[
[0, "아회남", null, 0, null, 65, 74, 26, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 40, 24, 84, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 51, 44, 62, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 26, 15, 66, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 85, 82, 75, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 69, 46, 79, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 32, 14, 39, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 66, 51, 63, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 78, 90, 58, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 71, 57, 71, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 76, 65, 75, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 63, 75, 42, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 90, 69, 81, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 40, 27, 71, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 60, 78, 30, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 40, 25, 82, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 60, 70, 62, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 26, 6, 68, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 76, 60, 61, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 15, 3, 79, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 54, 27, 77, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 36, 22, 76, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 85, 73, 84, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 67, 88, 19, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 74, 64, 79, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 88, 81, 70, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 62, 41, 79, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 65, 64, 31, 0, 160, 300, null, null],
[0, "왕릉1", null, 0, null, 74, 64, 71, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 28, 30, 79, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 47, 35, 79, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 62, 36, 74, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 15, 30, 72, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 50, 38, 85, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 68, 33, 88, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 49, 65, 41, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 78, 61, 84, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 56, 69, 36, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 51, 33, 88, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 81, 22, 98, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 78, 16, 99, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 65, 80, 42, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 64, 76, 13, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 53, 66, 61, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 73, 66, 73, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 90, 71, 88, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 80, 85, 56, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 62, 50, 82, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 62, 67, 42, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 28, 9, 69, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 73, 69, 69, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 90, 77, 85, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 71, 73, 49, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 95, 92, 74, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 63, 72, 53, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 48, 51, 71, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 50, 44, 76, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 54, 39, 76, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 79, 72, 75, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 69, 73, 32, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 91, 88, 68, 0, 160, 300, null, null],
[0, "하후패", null, 0, null, 79, 85, 77, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 20, 7, 4, 0, 160, 300, null, null],
[0, "가충", null, 0, null, 54, 31, 89, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 68, 54, 75, 0, 160, 300, null, null],
[0, "화웅", null, 0, null, 78, 90, 55, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 26, 29, 65, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 96, 99, 76, 0, 160, 300, null, null],
[0, "환계", null, 0, null, 25, 26, 68, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 82, 10, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 84, 86, 62, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 22, 33, 7, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 73, 72, 84, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 76, 84, 67, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 74, 83, 56, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 78, 75, 79, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 25, 15, 71, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 36, 52, 73, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 69, 66, 36, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 51, 49, 83, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 64, 67, 18, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 76, 85, 61, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 63, 76, 25, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 92, 95, 76, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 28, 3, 27, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 78, 82, 72, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 20, 32, 75, 0, 160, 300, null, null],
[0, "안량", null, 0, null, 88, 96, 43, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 91, 90, 75, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 84, 78, 51, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 63, 35, 91, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 67, 78, 31, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 46, 29, 74, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 72, 79, 38, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 38, 60, 21, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 92, 80, 93, 0, 160, 300, null, null],
[0, "공지", null, 0, null, 43, 53, 62, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 64, 69, 38, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 59, 70, 23, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 44, 66, 64, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 23, 5, 68, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 74, 97, 36, 0, 160, 300, null, null],
[0, "허유", null, 0, null, 36, 21, 80, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 85, 84, 51, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 32, 38, 65, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 64, 76, 19, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 52, 68, 13, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 46, 46, 87, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 69, 79, 41, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 82, 83, 72, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 68, 71, 40, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 41, 12, 71, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 50, 55, 39, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 67, 70, 42, 0, 160, 300, null, null],
[0, "엄여", null, 0, null, 61, 78, 44, 0, 160, 300, null, null],
[0, "오의", null, 0, null, 79, 73, 70, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 80, 86, 70, 0, 160, 300, null, null],
[0, "고간", null, 0, null, 74, 56, 48, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 75, 59, 88, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 57, 43, 72, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 87, 89, 60, 0, 160, 300, null, null],
[0, "고상", null, 0, null, 68, 68, 53, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 67, 73, 41, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 74, 75, 68, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 63, 66, 34, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 81, 66, 62, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 74, 72, 47, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 65, 70, 60, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 39, 17, 69, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 72, 66, 65, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 86, 82, 60, 0, 160, 300, null, null],
[0, "공손속", null, 0, null, 63, 68, 57, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 67, 71, 66, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 73, 69, 66, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 88, 96, 70, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 55, 63, 43, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 66, 61, 69, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 91, 61, 82, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 30, 5, 73, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 76, 82, 68, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 69, 66, 52, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 82, 41, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 65, 74, 12, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 79, 86, 11, 0, 160, 300, null, null],
[0, "호반", null, 0, null, 55, 55, 59, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 74, 71, 59, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 52, 18, 81, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 68, 80, 35, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 39, 50, 1, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 40, 54, 2, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 70, 77, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 99, 63, 98, 0, 160, 300, null, null],
[0, "사마염", null, 0, null, 69, 59, 77, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 84, 64, 89, 0, 160, 300, null, null],
[0, "사마소", null, 0, null, 85, 57, 88, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 37, 77, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 20, 21, 72, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 66, 84, 25, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 65, 62, 73, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 74, 65, 65, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 73, 85, 41, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 68, 77, 42, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 84, 90, 48, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 52, 41, 80, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 97, 71, 98, 0, 160, 300, null, null],
[0, "주환", null, 0, null, 87, 84, 77, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 77, 57, 72, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 72, 75, 35, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 89, 65, 76, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 86, 75, 74, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 71, 56, 72, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 68, 73, 34, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 78, 73, 67, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 78, 38, 97, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 78, 66, 29, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 45, 25, 78, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 80, 35, 95, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 78, 34, 89, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 88, 62, 93, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 19, 6, 66, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 71, 58, 59, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 78, 85, 54, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 62, 43, 85, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 16, 3, 67, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 65, 76, 33, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 76, 61, 77, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 79, 24, 90, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 28, 18, 74, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 92, 80, 62, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 72, 47, 90, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 75, 34, 85, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 29, 25, 52, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 72, 72, 76, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 98, 43, 100, 0, 160, 300, null, null],
[0, "서황", null, 0, null, 95, 94, 78, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 90, 64, 94, 0, 160, 300, null, null],
[0, "서성", null, 0, null, 86, 81, 78, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 55, 32, 68, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 55, 59, 60, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 56, 62, 54, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 80, 60, 84, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 42, 24, 79, 0, 160, 300, null, null],
[0, "신평", null, 0, null, 69, 43, 77, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 31, 7, 73, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 58, 70, 35, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 63, 71, 38, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 61, 64, 34, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 74, 72, 41, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 73, 71, 80, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 34, 16, 73, 0, 160, 300, null, null],
[0, "단경1", null, 0, null, 71, 68, 43, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 78, 72, 75, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 72, 52, 82, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 84, 78, 62, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 68, 77, 38, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 78, 67, 69, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 80, 75, 55, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 85, 83, 63, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 86, 91, 59, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 45, 22, 86, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 88, 74, 70, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 94, 90, 72, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 54, 74, 38, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 100, 72, 96, 0, 160, 300, null, null],
[0, "조충", null, 0, null, 43, 21, 74, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 78, 86, 53, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 75, 71, 87, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 54, 69, 32, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 86, 46, 95, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 69, 63, 66, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 71, 66, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 82, 73, 76, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 94, 95, 73, 0, 160, 300, null, null],
[0, "손건", null, 0, null, 44, 33, 79, 0, 160, 300, null, null],
[0, "손권", null, 0, null, 86, 69, 83, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 77, 72, 67, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 93, 97, 74, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 82, 79, 76, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 66, 53, 73, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 62, 71, 36, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 62, 37, 79, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 77, 70, 68, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 67, 83, 27, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 78, 81, 67, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 94, 94, 72, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 51, 53, 54, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 75, 39, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 62, 59, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 58, 73, 14, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 72, 67, 42, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 94, 96, 75, 0, 160, 300, null, null],
[0, "장위", null, 0, null, 74, 66, 45, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 75, 74, 41, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 76, 81, 57, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 59, 70, 23, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 32, 10, 72, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 34, 66, 8, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 87, 35, 90, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 74, 35, 76, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 79, 72, 75, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 72, 68, 41, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 24, 22, 86, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 92, 89, 76, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 66, 72, 28, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 66, 55, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 80, 73, 64, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 41, 13, 87, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 40, 6, 85, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 85, 84, 78, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 67, 43, 80, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 52, 53, 71, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 28, 21, 32, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 87, 98, 72, 0, 160, 300, null, null],
[0, "장포", null, 0, null, 78, 84, 48, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 83, 71, 81, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 75, 81, 45, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 72, 70, 66, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 75, 74, 76, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 96, 94, 78, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 78, 80, 74, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 43, 68, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 65, 42, 81, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 64, 63, 26, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 62, 72, 45, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 58, 65, 43, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 84, 55, 90, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 61, 27, 77, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 32, 14, 75, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 30, 4, 82, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 71, 25, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 46, 46, 69, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 86, 77, 89, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 79, 64, 81, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 82, 78, 67, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 76, 87, 43, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 66, 69, 40, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 25, 9, 75, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 76, 49, 94, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 69, 74, 17, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 69, 73, 40, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 76, 35, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 84, 79, 79, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 81, 92, 75, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 79, 98, 42, 0, 160, 300, null, null],
[0, "전해", null, 0, null, 68, 65, 58, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 66, 66, 73, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 82, 43, 96, 0, 160, 300, null, null],
[0, "전예", null, 0, null, 93, 85, 80, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 47, 28, 79, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 57, 34, 75, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 92, 80, 94, 0, 160, 300, null, null],
[0, "도겸", null, 0, null, 51, 27, 64, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 61, 73, 45, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 73, 52, 81, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 72, 85, 50, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 56, 53, 65, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 34, 25, 80, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 91, 87, 72, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 68, 73, 31, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 49, 60, 25, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 61, 75, 29, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 74, 43, 78, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 96, 69, 95, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 49, 65, 25, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 71, 74, 16, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 68, 73, 48, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 74, 74, 55, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 38, 52, 31, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 61, 67, 84, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 79, 85, 62, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 78, 72, 68, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 86, 97, 44, 0, 160, 300, null, null],
[0, "마철", null, 0, null, 70, 62, 58, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 85, 80, 52, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 53, 23, 85, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 61, 46, 82, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 76, 80, 69, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 66, 73, 31, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 69, 61, 36, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 56, 77, 4, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 82, 56, 88, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 60, 66, 21, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 18, 28, 65, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 33, 29, 78, 0, 160, 300, null, null],
[0, "미방", null, 0, null, 54, 61, 32, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 66, 73, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 79, 34, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 72, 71, 39, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 46, 63, 37, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 73, 85, 76, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 29, 13, 70, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 76, 96, 65, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 74, 79, 43, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 87, 95, 49, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 88, 85, 69, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 56, 70, 62, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 45, 79, 3, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 56, 48, 84, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 60, 38, 69, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 82, 47, 94, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 79, 34, 97, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 89, 94, 70, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 58, 76, 49, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 52, 77, 11, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 65, 71, 39, 0, 160, 300, null, null],
[0, "보즐", null, 0, null, 83, 51, 81, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 88, 64, 87, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 63, 39, 60, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 81, 88, 42, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 75, 73, 75, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 50, 68, 22, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 62, 79, 24, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 62, 68, 68, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 73, 75, 57, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 68, 40, 82, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 94, 69, 92, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 33, 15, 77, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 68, 72, 38, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 52, 65, 40, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 46, 23, 83, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 67, 64, 60, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 17, 5, 28, 0, 160, 300, null, null],
[0, "양임", null, 0, null, 70, 78, 56, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 53, 61, 36, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 44, 45, 19, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 67, 50, 83, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 66, 65, 31, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 54, 62, 53, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 69, 78, 51, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 62, 70, 36, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 63, 77, 19, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 79, 65, 79, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 69, 72, 24, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 94, 68, 93, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 20, 7, 72, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 97, 71, 96, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 83, 84, 76, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 61, 26, 93, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 46, 69, 61, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 73, 81, 62, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 78, 80, 79, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 69, 74, 50, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 61, 38, 80, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 71, 73, 67, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 52, 12, 63, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 62, 33, 75, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 47, 63, 35, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 54, 66, 51, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 63, 46, 41, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 31, 5, 34, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 60, 62, 70, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 3, 5, 9, 0, 160, 300, null, null],
[0, "유종", null, 0, null, 24, 22, 65, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 25, 23, 26, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 29, 22, 75, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 69, 76, 47, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 88, 78, 75, 0, 160, 300, null, null],
[0, "유표", null, 0, null, 48, 31, 72, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 64, 49, 74, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 72, 47, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 75, 79, 44, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 56, 32, 92, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 62, 67, 46, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 58, 63, 29, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 73, 76, 69, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 61, 65, 19, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 73, 40, 74, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 56, 62, 66, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 75, 81, 42, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 83, 89, 60, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 53, 30, 67, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 57, 70, 62, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 56, 70, 13, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 54, 71, 12, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 80, 71, 70, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 73, 63, 75, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 89, 100, 42, 0, 160, 300, null, null],
[0, "여몽", null, 0, null, 91, 81, 90, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 46, 42, 73, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 71, 82, 61, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 52, 13, 87, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 89, 56, 93, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 86, 63, 82, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 49, 50, 36, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 43, 56, 34, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 55, 70, 58, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 38, 32, 68, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 81, 72, 86, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 23, 19, 68, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 60, 66, 46, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 73, 75, 43, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 83, 70, 82, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 40, 11, 78, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 72, 79, 73, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 35, 24, 76, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 68, 41, 78, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 73, 46, 74, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 16, 29, 68, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 79, 76, 62, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 53, 23, 77, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 32, 22, 66, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 78, 58, 83, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 73, 61, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 67, 64, 39, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 50, 43, 37, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 39, 33, 30, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 20, 14, 27, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 57, 66, 48, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 63, 27, 74, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 75, 74, 51, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 67, 71, 53, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 76, 29, 80, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 77, 70, 75, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 23, 56, 31, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 68, 67, 61, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 66, 42, 74, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 56, 35, 75, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 66, 66, 53, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 51, 73, 39, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 22, 17, 71, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 69, 75, 49, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 76, 58, 75, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 65, 61, 79, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 78, 81, 64, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 68, 53, 74, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 32, 15, 76, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 78, 69, 71, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 57, 76, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 57, 42, 78, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 42, 23, 68, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 71, 76, 50, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 32, 26, 70, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 34, 12, 44, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 41, 73, 71, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 54, 61, 59, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 30, 28, 30, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 71, 68, 75, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 64, 79, 62, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 31, 39, 68, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 52, 61, 51, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 67, 63, 71, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 74, 71, 63, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 33, 29, 70, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 60, 62, 73, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 68, 83, 24, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 64, 70, 65, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 58, 55, 65, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 61, 34, 74, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 72, 71, 65, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 65, 59, 76, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 61, 71, 50, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 76, 80, 69, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 67, 63, 72, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 20, 24, 71, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 51, 74, 15, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 66, 78, 42, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 57, 39, 68, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 86, 70, 82, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 73, 53, 74, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 63, 70, 38, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 72, 68, 21, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 61, 76, 13, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 77, 69, 52, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 80, 68, 56, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 65, 83, 48, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 63, 75, 44, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 71, 40, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 84, 72, 82, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 62, 27, 75, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 84, 82, 61, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 66, 79, 38, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 64, 73, 50, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 59, 69, 21, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 73, 74, 48, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 65, 76, 39, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 72, 78, 51, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 59, 71, 48, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 63, 68, 26, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 79, 75, 56, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 73, 81, 60, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 77, 70, 52, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 54, 60, 50, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 46, 33, 78, 0, 160, 300, null, null],
[0, "채염", null, 0, null, 42, 26, 82, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 23, 15, 78, 0, 160, 300, null, null],
[0, "신헌영", null, 0, null, 65, 35, 90, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 72, 79, 55, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 22, 30, 78, 0, 160, 300, null, null],
[0, "초선", null, 0, null, 12, 22, 71, 0, 160, 300, null, null],
[0, "교모", null, 0, null, 54, 45, 69, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 58, 62, 33, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 63, 60, 69, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 56, 40, 73, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 65, 55, 61, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 50, 26, 42, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 61, 52, 61, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 67, 68, 71, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 61, 68, 66, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 66, 73, 42, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 47, 28, 72, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 1, 1, 22, 0, 160, 300, null, null],
[0, "사정", null, 0, null, 64, 76, 34, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 77, 61, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 65, 66, 46, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 21, 25, 71, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 76, 81, 65, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 57, 62, 59, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 38, 65, 47, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 47, 60, 55, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 36, 27, 78, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 49, 61, 23, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 64, 66, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 73, 54, 75, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 68, 71, 47, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 69, 71, 56, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 74, 66, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 51, 59, 51, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 52, 68, 45, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 66, 73, 36, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 63, 52, 41, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 31, 36, 74, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 33, 6, 35, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 62, 66, 51, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 57, 25, 73, 0, 160, 300, null, null],
[0, "사마휘", null, 0, null, 55, 26, 82, 0, 160, 300, null, null],
[0, "우길", null, 0, null, 23, 15, 90, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 22, 18, 68, 0, 160, 300, null, null],
[0, "왕검", null, 0, null, 92, 51, 91, 0, 160, 300, null, null],
[0, "위만", null, 0, null, 93, 90, 62, 0, 160, 300, null, null],
[0, "부분노", null, 0, null, 97, 68, 96, 0, 160, 300, null, null],
[0, "무휼", null, 0, null, 98, 93, 72, 0, 160, 300, null, null],
[0, "태조대왕", null, 0, null, 92, 63, 91, 0, 160, 300, null, null],
[0, "명림답부", null, 0, null, 94, 68, 99, 0, 160, 300, null, null],
[0, "달가", null, 0, null, 91, 60, 96, 0, 160, 300, null, null],
[0, "고노자", null, 0, null, 93, 96, 62, 0, 160, 300, null, null],
[0, "미천왕", null, 0, null, 91, 60, 88, 0, 160, 300, null, null],
[0, "고무", null, 0, null, 90, 93, 63, 0, 160, 300, null, null],
[0, "광개토대왕", null, 0, null, 100, 99, 71, 0, 160, 300, null, null],
[0, "장수왕", null, 0, null, 97, 94, 63, 0, 160, 300, null, null],
[0, "을지문덕", null, 0, null, 99, 70, 98, 0, 160, 300, null, null],
[0, "고흘", null, 0, null, 88, 91, 63, 0, 160, 300, null, null],
[0, "온달", null, 0, null, 90, 92, 60, 0, 160, 300, null, null],
[0, "고건무", null, 0, null, 97, 91, 71, 0, 160, 300, null, null],
[0, "양만춘", null, 0, null, 98, 69, 91, 0, 160, 300, null, null],
[0, "연개소문", null, 0, null, 92, 66, 91, 0, 160, 300, null, null],
[0, "근초고왕", null, 0, null, 93, 93, 70, 0, 160, 300, null, null],
[0, "목라근자", null, 0, null, 89, 90, 68, 0, 160, 300, null, null],
[0, "근구수왕", null, 0, null, 90, 63, 89, 0, 160, 300, null, null],
[0, "사법명", null, 0, null, 91, 66, 92, 0, 160, 300, null, null],
[0, "찬수류", null, 0, null, 87, 60, 83, 0, 160, 300, null, null],
[0, "해례곤", null, 0, null, 86, 88, 59, 0, 160, 300, null, null],
[0, "목간나", null, 0, null, 85, 87, 61, 0, 160, 300, null, null],
[0, "윤충", null, 0, null, 90, 87, 59, 0, 160, 300, null, null],
[0, "의직", null, 0, null, 85, 61, 83, 0, 160, 300, null, null],
[0, "계백", null, 0, null, 93, 71, 94, 0, 160, 300, null, null],
[0, "귀실복신", null, 0, null, 83, 57, 82, 0, 160, 300, null, null],
[0, "흑치상지", null, 0, null, 90, 73, 92, 0, 160, 300, null, null],
[0, "이사금", null, 0, null, 98, 93, 71, 0, 160, 300, null, null],
[0, "물계자", null, 0, null, 88, 94, 43, 0, 160, 300, null, null],
[0, "석우로", null, 0, null, 87, 91, 54, 0, 160, 300, null, null],
[0, "이사부", null, 0, null, 90, 72, 93, 0, 160, 300, null, null],
[0, "거칠부", null, 0, null, 92, 73, 90, 0, 160, 300, null, null],
[0, "진흥왕", null, 0, null, 91, 66, 91, 0, 160, 300, null, null],
[0, "사다함", null, 0, null, 86, 91, 66, 0, 160, 300, null, null],
[0, "김세종", null, 0, null, 88, 63, 87, 0, 160, 300, null, null],
[0, "김무력", null, 0, null, 90, 93, 63, 0, 160, 300, null, null],
[0, "알천", null, 0, null, 93, 96, 51, 0, 160, 300, null, null],
[0, "김유신", null, 0, null, 97, 70, 99, 0, 160, 300, null, null],
[0, "김흠돌", null, 0, null, 87, 90, 52, 0, 160, 300, null, null],
[0, "김품일", null, 0, null, 83, 56, 82, 0, 160, 300, null, null],
[0, "김천존", null, 0, null, 84, 60, 82, 0, 160, 300, null, null],
[0, "죽지", null, 0, null, 83, 86, 52, 0, 160, 300, null, null],
[0, "문무왕", null, 0, null, 92, 73, 96, 0, 160, 300, null, null],
[0, "시득", null, 0, null, 98, 67, 90, 0, 160, 300, null, null],
[0, "장보고", null, 0, null, 99, 72, 96, 0, 160, 300, null, null],
[0, "김웅원", null, 0, null, 92, 91, 66, 0, 160, 300, null, null],
[0, "대조영", null, 0, null, 96, 92, 63, 0, 160, 300, null, null],
[0, "대무예", null, 0, null, 90, 97, 59, 0, 160, 300, null, null],
[0, "장문휴", null, 0, null, 88, 89, 53, 0, 160, 300, null, null],
[0, "대인수", null, 0, null, 89, 60, 85, 0, 160, 300, null, null],
[0, "궁예", null, 0, null, 91, 90, 57, 0, 160, 300, null, null],
[0, "왕건", null, 0, null, 96, 68, 98, 0, 160, 300, null, null],
[0, "이흔암", null, 0, null, 83, 82, 49, 0, 160, 300, null, null],
[0, "견훤", null, 0, null, 91, 65, 90, 0, 160, 300, null, null],
[0, "상귀", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
[0, "상애", null, 0, null, 76, 69, 41, 0, 160, 300, null, null],
[0, "관흔", null, 0, null, 79, 52, 83, 0, 160, 300, null, null],
[0, "유금필", null, 0, null, 87, 94, 58, 0, 160, 300, null, null],
[0, "배현경", null, 0, null, 86, 48, 90, 0, 160, 300, null, null],
[0, "서희", null, 0, null, 71, 26, 99, 0, 160, 300, null, null],
[0, "양규", null, 0, null, 95, 66, 93, 0, 160, 300, null, null],
[0, "김숙흥", null, 0, null, 87, 90, 57, 0, 160, 300, null, null],
[0, "지채문", null, 0, null, 86, 63, 88, 0, 160, 300, null, null],
[0, "강감찬", null, 0, null, 94, 68, 96, 0, 160, 300, null, null],
[0, "강민첨", null, 0, null, 92, 93, 64, 0, 160, 300, null, null],
[0, "윤관", null, 0, null, 87, 58, 86, 0, 160, 300, null, null],
[0, "척준경", null, 0, null, 90, 108, 61, 0, 160, 300, null, null],
[0, "허재", null, 0, null, 73, 48, 81, 0, 160, 300, null, null],
[0, "김의원", null, 0, null, 80, 86, 51, 0, 160, 300, null, null],
[0, "김부식", null, 0, null, 51, 21, 92, 0, 160, 300, null, null],
[0, "두경승", null, 0, null, 88, 62, 86, 0, 160, 300, null, null],
[0, "김취려", null, 0, null, 90, 88, 58, 0, 160, 300, null, null],
[0, "박서", null, 0, null, 86, 52, 87, 0, 160, 300, null, null],
[0, "김경손", null, 0, null, 73, 92, 58, 0, 160, 300, null, null],
[0, "김윤후", null, 0, null, 82, 51, 83, 0, 160, 300, null, null],
[0, "김방경", null, 0, null, 93, 56, 87, 0, 160, 300, null, null],
[0, "정세운", null, 0, null, 86, 82, 62, 0, 160, 300, null, null],
[0, "최영", null, 0, null, 96, 92, 71, 0, 160, 300, null, null],
[0, "정지", null, 0, null, 88, 91, 66, 0, 160, 300, null, null],
[0, "최무선", null, 0, null, 87, 59, 93, 0, 160, 300, null, null],
[0, "이성계", null, 0, null, 96, 62, 92, 0, 160, 300, null, null],
[0, "김성우", null, 0, null, 87, 84, 53, 0, 160, 300, null, null],
[0, "김종서", null, 0, null, 93, 66, 92, 0, 160, 300, null, null],
[0, "남이", null, 0, null, 89, 90, 63, 0, 160, 300, null, null],
[0, "권율", null, 0, null, 94, 70, 93, 0, 160, 300, null, null],
[0, "황진", null, 0, null, 87, 96, 53, 0, 160, 300, null, null],
[0, "곽재우", null, 0, null, 92, 71, 92, 0, 160, 300, null, null],
[0, "김시민", null, 0, null, 93, 72, 96, 0, 160, 300, null, null],
[0, "이순신", null, 0, null, 108, 76, 110, 0, 160, 300, null, null],
[0, "정문부", null, 0, null, 87, 56, 83, 0, 160, 300, null, null],
[0, "정충신", null, 0, null, 82, 51, 90, 0, 160, 300, null, null],
[0, "원균", null, 0, null, 1, 1, 1, 0, 160, 300, null, null],
[0, "관중", null, 0, null, 91, 45, 98, 0, 160, 300, null, null],
[0, "몽무", null, 0, null, 88, 96, 53, 0, 160, 300, null, null],
[0, "몽염", null, 0, null, 91, 83, 71, 0, 160, 300, null, null],
[0, "몽오", null, 0, null, 90, 86, 60, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 91, 57, 93, 0, 160, 300, null, null],
[0, "백기", null, 0, null, 100, 63, 92, 0, 160, 300, null, null],
[0, "범려", null, 0, null, 78, 22, 96, 0, 160, 300, null, null],
[0, "사마양저", null, 0, null, 88, 51, 92, 0, 160, 300, null, null],
[0, "사마착", null, 0, null, 93, 91, 66, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 80, 16, 96, 0, 160, 300, null, null],
[0, "손무", null, 0, null, 98, 32, 100, 0, 160, 300, null, null],
[0, "신릉군", null, 0, null, 81, 39, 90, 0, 160, 300, null, null],
[0, "악양", null, 0, null, 83, 36, 96, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 96, 70, 98, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 98, 97, 80, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 93, 39, 95, 0, 160, 300, null, null],
[0, "오운", null, 0, null, 88, 51, 90, 0, 160, 300, null, null],
[0, "왕분", null, 0, null, 89, 91, 68, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 95, 66, 93, 0, 160, 300, null, null],
[0, "왕흘", null, 0, null, 93, 92, 60, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 96, 69, 98, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 89, 90, 57, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 94, 59, 93, 0, 160, 300, null, null],
[0, "조사", null, 0, null, 91, 63, 91, 0, 160, 300, null, null],
[0, "진개", null, 0, null, 88, 87, 50, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 90, 88, 60, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 100, 74, 95, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 99, 100, 65, 0, 160, 300, null, null],
[0, "장한", null, 0, null, 88, 66, 87, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 90, 66, 85, 0, 160, 300, null, null],
[0, "조참", null, 0, null, 89, 53, 87, 0, 160, 300, null, null],
[0, "팽월", null, 0, null, 92, 93, 60, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 93, 93, 58, 0, 160, 300, null, null],
[0, "종리말", null, 0, null, 90, 83, 66, 0, 160, 300, null, null],
[0, "주발", null, 0, null, 82, 50, 83, 0, 160, 300, null, null],
[0, "번쾌", null, 0, null, 87, 92, 63, 0, 160, 300, null, null],
[0, "역상", null, 0, null, 83, 52, 83, 0, 160, 300, null, null],
[0, "관영", null, 0, null, 86, 87, 60, 0, 160, 300, null, null],
[0, "부관", null, 0, null, 83, 58, 88, 0, 160, 300, null, null],
[0, "근흡", null, 0, null, 86, 90, 52, 0, 160, 300, null, null],
[0, "왕릉2", null, 0, null, 90, 87, 56, 0, 160, 300, null, null],
[0, "계포", null, 0, null, 83, 62, 90, 0, 160, 300, null, null],
[0, "용저", null, 0, null, 86, 92, 41, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 93, 92, 53, 0, 160, 300, null, null],
[0, "마원", null, 0, null, 90, 52, 83, 0, 160, 300, null, null],
[0, "위청", null, 0, null, 92, 91, 52, 0, 160, 300, null, null],
[0, "주아부", null, 0, null, 86, 41, 92, 0, 160, 300, null, null],
[0, "곽자의", null, 0, null, 98, 97, 61, 0, 160, 300, null, null],
[0, "나오에 카네츠구", null, 0, null, 87, 91, 42, 0, 160, 300, null, null],
[0, "다케다 신겐", null, 0, null, 91, 50, 93, 0, 160, 300, null, null],
[0, "도요토미 히데요시", null, 0, null, 98, 70, 97, 0, 160, 300, null, null],
[0, "고니시 유키나가", null, 0, null, 96, 68, 94, 0, 160, 300, null, null],
[0, "가토 기요마사", null, 0, null, 92, 93, 66, 0, 160, 300, null, null],
[0, "도요토미 히데나가", null, 0, null, 94, 70, 92, 0, 160, 300, null, null],
[0, "도도 다카토라", null, 0, null, 90, 92, 62, 0, 160, 300, null, null],
[0, "도쿠가와 이에야스", null, 0, null, 92, 68, 91, 0, 160, 300, null, null],
[0, "모리 모토나리", null, 0, null, 88, 42, 96, 0, 160, 300, null, null],
[0, "우에스기 겐신", null, 0, null, 91, 96, 78, 0, 160, 300, null, null],
[0, "오다 노부나가", null, 0, null, 93, 73, 92, 0, 160, 300, null, null],
[0, "이마가와 요시모토", null, 0, null, 89, 91, 71, 0, 160, 300, null, null],
[0, "사나다 마사유키", null, 0, null, 93, 66, 90, 0, 160, 300, null, null],
[0, "사나다 노부시게", null, 0, null, 94, 92, 70, 0, 160, 300, null, null],
[0, "시마즈 이에히사", null, 0, null, 96, 94, 63, 0, 160, 300, null, null],
[0, "시마즈 요시히로", null, 0, null, 93, 63, 88, 0, 160, 300, null, null],
[0, "코바야카와타카카게", null, 0, null, 90, 61, 92, 0, 160, 300, null, null],
[0, "타치바나 도세츠", null, 0, null, 91, 89, 71, 0, 160, 300, null, null],
[0, "타치바나 무네시게", null, 0, null, 90, 69, 88, 0, 160, 300, null, null],
[0, "타카하시 쇼운", null, 0, null, 92, 91, 70, 0, 160, 300, null, null],
[0, "호조 우지야스", null, 0, null, 89, 58, 91, 0, 160, 300, null, null],
[0, "칭기즈 칸", null, 0, null, 100, 99, 63, 0, 160, 300, null, null],
[0, "오고타이 칸", null, 0, null, 98, 93, 64, 0, 160, 300, null, null],
[0, "자무카", null, 0, null, 97, 96, 60, 0, 160, 300, null, null],
[0, "수부타이", null, 0, null, 94, 71, 91, 0, 160, 300, null, null],
[0, "제베", null, 0, null, 93, 97, 68, 0, 160, 300, null, null]
],
"general_ex":[
]
}
+52 -4
View File
@@ -3,7 +3,10 @@
<TopBackBar title="감찰부" :reloadable="true" type="close" @reload="reload" /> <TopBackBar title="감찰부" :reloadable="true" type="close" @reload="reload" />
<div class="row gx-0"> <div class="row gx-0">
<div class="col-4"> <div class="col-2 col-md-1 d-grid">
<BButton @click="changeTargetByOffset(-1)"> 이전</BButton>
</div>
<div class="col-3 col-md-4">
<BFormSelect v-model="orderBy"> <BFormSelect v-model="orderBy">
<BFormSelectOption <BFormSelectOption
v-for="[orderKey, [orderName]] of Object.entries(textMap)" v-for="[orderKey, [orderName]] of Object.entries(textMap)"
@@ -14,7 +17,7 @@
</BFormSelectOption> </BFormSelectOption>
</BFormSelect> </BFormSelect>
</div> </div>
<div class="col-8"> <div class="col-5 col-md-6">
<BFormSelect v-model="targetGeneralID"> <BFormSelect v-model="targetGeneralID">
<BFormSelectOption v-for="general of orderedGeneralList" :key="general.no" :value="general.no"> <BFormSelectOption v-for="general of orderedGeneralList" :key="general.no" :value="general.no">
<span <span
@@ -28,11 +31,19 @@
</BFormSelectOption> </BFormSelectOption>
</BFormSelect> </BFormSelect>
</div> </div>
<div class="col-2 col-md-1 d-grid">
<BButton @click="changeTargetByOffset(1)">다음 </BButton>
</div>
</div> </div>
<div v-if="targetGeneral && nationInfo && targetGeneralLogs" class="row gx-0 bg0"> <div v-if="targetGeneral && nationInfo && targetGeneralLogs" class="row gx-0 bg0">
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<div class="bg1 header-cell" style="color: skyblue">장수 정보</div> <div class="bg1 header-cell" style="color: skyblue">장수 정보</div>
<GeneralBasicCard :general="targetGeneral" :nation="nationInfo" /> <GeneralBasicCard
:general="targetGeneral"
:nation="nationInfo"
:turnTerm="turnTerm"
:lastExecuted="lastExecuted"
/>
<GeneralSupplementCard :general="targetGeneral" /> <GeneralSupplementCard :general="targetGeneral" />
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
@@ -67,7 +78,7 @@ declare const queryValues: {
}; };
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { BContainer, useToast, BFormSelect, BFormSelectOption } from "bootstrap-vue-3"; import { BContainer, useToast, BFormSelect, BFormSelectOption, BButton } from "bootstrap-vue-3";
import { onMounted, provide, ref, watch } from "vue"; import { onMounted, provide, ref, watch } from "vue";
import { getGameConstStore, type GameConstStore } from "./GameConstStore"; import { getGameConstStore, type GameConstStore } from "./GameConstStore";
import TopBackBar from "@/components/TopBackBar.vue"; import TopBackBar from "@/components/TopBackBar.vue";
@@ -83,6 +94,7 @@ import type { NationStaticItem } from "./defs";
import type { GeneralLogType } from "./defs/API/General"; import type { GeneralLogType } from "./defs/API/General";
import { isString } from "lodash"; import { isString } from "lodash";
import { formatLog } from "./utilGame/formatLog"; import { formatLog } from "./utilGame/formatLog";
import { parseTime } from "./util/parseTime";
const toasts = unwrap(useToast()); const toasts = unwrap(useToast());
@@ -98,8 +110,12 @@ const textMap = {
turntime: ["최근 턴", (gen: GeneralListItemP1) => gen.turntime, false, (gen: GeneralListItemP1) => ""], turntime: ["최근 턴", (gen: GeneralListItemP1) => gen.turntime, false, (gen: GeneralListItemP1) => ""],
name: ["이름", (gen: GeneralListItemP1) => `${gen.npc} ${gen.name}`, true, (gen: GeneralListItemP1) => ""], name: ["이름", (gen: GeneralListItemP1) => `${gen.npc} ${gen.name}`, true, (gen: GeneralListItemP1) => ""],
} as const; } as const;
const turnTerm = ref<number>(1);
const lastExecuted = ref<Date>(new Date());
const orderedGeneralList = ref<GeneralListItemP1[]>([]); const orderedGeneralList = ref<GeneralListItemP1[]>([]);
const orderedInvGeneralKeyIndex = ref(new Map<number, number>());
const orderBy = ref<keyof typeof textMap>("turntime"); const orderBy = ref<keyof typeof textMap>("turntime");
const targetGeneral = ref<GeneralListItemP1>(); const targetGeneral = ref<GeneralListItemP1>();
const targetGeneralID = ref(queryValues.generalID ?? undefined); const targetGeneralID = ref(queryValues.generalID ?? undefined);
@@ -172,7 +188,15 @@ watch([generalList, orderBy], ([generalList, orderBy], [, oldOrderBy]) => {
if (aVal === bVal) return 0; if (aVal === bVal) return 0;
return isAsc ? (aVal > bVal ? 1 : -1) : aVal < bVal ? 1 : -1; return isAsc ? (aVal > bVal ? 1 : -1) : aVal < bVal ? 1 : -1;
}); });
const invIndex = new Map<number, number>();
for (const [idx, gen] of list.entries()) {
invIndex.set(gen.no, idx);
}
orderedGeneralList.value = list; orderedGeneralList.value = list;
orderedInvGeneralKeyIndex.value = invIndex;
const oldTargetGeneralID = targetGeneralID.value; const oldTargetGeneralID = targetGeneralID.value;
if (!oldTargetGeneralID) { if (!oldTargetGeneralID) {
targetGeneralID.value = list[0].no; targetGeneralID.value = list[0].no;
@@ -181,6 +205,27 @@ watch([generalList, orderBy], ([generalList, orderBy], [, oldOrderBy]) => {
} }
}); });
function changeTargetByOffset(idx: number) {
const targetID = targetGeneralID.value;
if (targetID === undefined) {
return;
}
const currIdx = orderedInvGeneralKeyIndex.value.get(targetID);
if (currIdx === undefined) {
return;
}
let newIdx = currIdx + idx;
const listLen = orderedGeneralList.value.length;
while (newIdx < 0) {
newIdx += listLen;
}
newIdx = newIdx % listLen;
targetGeneralID.value = orderedGeneralList.value[newIdx].no;
}
const asyncReady = ref(false); const asyncReady = ref(false);
const gameConstStore = ref<GameConstStore>(); const gameConstStore = ref<GameConstStore>();
provide("gameConstStore", gameConstStore); provide("gameConstStore", gameConstStore);
@@ -203,6 +248,9 @@ async function reload(): Promise<void> {
throw "권한이 부족합니다."; throw "권한이 부족합니다.";
} }
turnTerm.value = env.turnterm;
lastExecuted.value = parseTime(env.turntime);
console.log(list); console.log(list);
const rawGeneralList = merge2DArrToObjectArr(column, list); const rawGeneralList = merge2DArrToObjectArr(column, list);
+134 -46
View File
@@ -14,6 +14,11 @@
<div class="troopLeaderName"> <div class="troopLeaderName">
{{ troop.troopLeader.name }} {{ troop.troopLeader.name }}
</div> </div>
<div class="troopReservedCommand">
<div v-for="(brief, idx) in troop.reservedCommandBrief" :key="idx">
{{ `${idx + 1}: ${brief}` }}
</div>
</div>
<div class="troopMembers"> <div class="troopMembers">
<template v-for="(member, idx) in troop.members" :key="member.no"> <template v-for="(member, idx) in troop.members" :key="member.no">
<template v-if="idx != 0">, </template> <template v-if="idx != 0">, </template>
@@ -26,25 +31,29 @@
{{ member.name }} {{ member.name }}
</span> </span>
<span <span
v-else v-else-if="troop.troopLeader.city == member.city"
class="troopMember" class="troopMember"
@mouseover="setPopup($event, member)" @mouseover="setPopup($event, member)"
@mouseout="setPopup($event, undefined)" @mouseout="setPopup($event, undefined)"
> >
{{ member.name }} {{ member.name }}
</span> </span>
<span
v-else
class="troopMember troopDiffCityMemeber"
@mouseover="setPopup($event, member)"
@mouseout="setPopup($event, undefined)"
>
{{ member.name }} ({{ gameConstStore.cityConst[member.city].name }})
</span>
</template> </template>
({{ troop.members.length }}) ({{ troop.members.length }})
</div> </div>
<div class="troopReservedCommand">
<div v-for="(brief, idx) in troop.reservedCommandBrief" :key="idx">
{{ `${idx + 1}: ${brief}` }}
</div>
</div>
<div class="troopAction"> <div class="troopAction">
<div <div
v-if="tryTroopActionTarget.type === undefined || tryTroopActionTarget.targetTroop !== troop.troopID" v-if="tryTroopActionTarget.type === undefined || tryTroopActionTarget.targetTroop !== troop.troopID"
class="d-grid" class="actionButtons"
> >
<BButton v-if="!me.troop" variant="primary" @click="joinTroop(troop.troopID)">부대 탑승</BButton> <BButton v-if="!me.troop" variant="primary" @click="joinTroop(troop.troopID)">부대 탑승</BButton>
<BButton <BButton
@@ -53,32 +62,30 @@
@click="exitTroop()" @click="exitTroop()"
>{{ me.no == me.troop ? "부대 해산" : "부대 탈퇴" }}</BButton >{{ me.no == me.troop ? "부대 해산" : "부대 탈퇴" }}</BButton
> >
<BButton <BButton v-if="me.troop == troop.troopID && me.no == me.troop" @click="openKickTroopMemberDialog(troop)"
v-if="me.troop == troop.troopID && me.no == me.troop"
@click="openKickTroopMemberDialog(troop)"
>부대원 추방...</BButton >부대원 추방...</BButton
> >
<BButton variant="info" @click="openChangeTroopNameDialog(troop)" <BButton v-if="myPermission >= 4" variant="info" @click="openChangeTroopNameDialog(troop)"
>부대명 변경...</BButton >부대명 변경...</BButton
> >
</div> </div>
<div v-else-if="tryTroopActionTarget.type === 'changeName'" class="row gx-0"> <div v-else-if="tryTroopActionTarget.type === 'changeName'" class="subDialog">
<div class="col-12 bg1 center" style="padding: 0.2em">부대명 변경</div> <div class="subTitle bg1 center"><span>부대명 변경</span></div>
<div class="col-12 d-grid"> <div class="subForm d-grid">
<BFormInput v-model="newTroopName" :trim="true" type="text" /> <BFormInput v-model="newTroopName" :trim="true" type="text" />
</div> </div>
<div class="col-6 d-grid"> <div class="subBtnCancel d-grid">
<BButton variant="secondary" @click="tryTroopActionTarget = { type: undefined, targetTroop: 0 }" <BButton variant="secondary" @click="tryTroopActionTarget = { type: undefined, targetTroop: 0 }"
>취소</BButton >취소</BButton
> >
</div> </div>
<div class="col-6 d-grid"> <div class="subBtnOK d-grid">
<BButton variant="primary" @click="changeTroopName(troop)">변경</BButton> <BButton variant="primary" @click="changeTroopName(troop)">변경</BButton>
</div> </div>
</div> </div>
<div v-else-if="tryTroopActionTarget.type === 'kickMember'" class="row gx-0"> <div v-else-if="tryTroopActionTarget.type === 'kickMember'" class="subDialog">
<div class="col-12 bg1 center" style="padding: 0.2em">부대명 추방</div> <div class="subTitle bg1 center" style="padding: 0.2em">부대명 추방</div>
<div class="col-12 d-grid"> <div class="subForm d-grid">
<BFormSelect v-model="kickTroopMemberID"> <BFormSelect v-model="kickTroopMemberID">
<template v-for="member of troop.members" :key="member.no"> <template v-for="member of troop.members" :key="member.no">
<BFormSelectOption v-if="member.no != troop.troopID" :value="member.no"> <BFormSelectOption v-if="member.no != troop.troopID" :value="member.no">
@@ -87,16 +94,17 @@
</template> </template>
</BFormSelect> </BFormSelect>
</div> </div>
<div class="col-6 d-grid"> <div class="subBtnCancel d-grid">
<BButton variant="secondary" @click="tryTroopActionTarget = { type: undefined, targetTroop: 0 }" <BButton variant="secondary" @click="tryTroopActionTarget = { type: undefined, targetTroop: 0 }"
>취소</BButton >취소</BButton
> >
</div> </div>
<div class="col-6 d-grid"> <div class="subBtnOK d-grid">
<BButton variant="primary" @click="kickTroopMember(troop)">추방</BButton> <BButton variant="primary" @click="kickTroopMember(troop)">추방</BButton>
</div> </div>
</div> </div>
</div> </div>
<div class="filler"><span class="dummy"></span></div>
</div> </div>
</div> </div>
<div v-if="asyncReady && gameConstStore && me" class="row additionalTroopOptions"> <div v-if="asyncReady && gameConstStore && me" class="row additionalTroopOptions">
@@ -124,6 +132,8 @@
:general="popupGeneralTarget" :general="popupGeneralTarget"
:troopInfo="convBasicCardTroopInfo(popupGeneralTarget)" :troopInfo="convBasicCardTroopInfo(popupGeneralTarget)"
:nation="nationInfo" :nation="nationInfo"
:turnTerm="turnTerm"
:lastExecuted="lastExecuted"
/> />
<GeneralSupplementCard :general="popupGeneralTarget" :showCommandList="true" /> <GeneralSupplementCard :general="popupGeneralTarget" :showCommandList="true" />
</template> </template>
@@ -151,6 +161,7 @@ import type { NationStaticItem } from "./defs";
import GeneralLiteCard from "./components/GeneralLiteCard.vue"; import GeneralLiteCard from "./components/GeneralLiteCard.vue";
import GeneralSupplementCard from "./components/GeneralSupplementCard.vue"; import GeneralSupplementCard from "./components/GeneralSupplementCard.vue";
import { pick } from "./util/JosaUtil"; import { pick } from "./util/JosaUtil";
import { parseTime } from "./util/parseTime";
const toasts = unwrap(useToast()); const toasts = unwrap(useToast());
const asyncReady = ref(false); const asyncReady = ref(false);
@@ -221,6 +232,9 @@ type TroopInfo = {
}; };
const me = ref<GeneralListItem>({} as GeneralListItem); const me = ref<GeneralListItem>({} as GeneralListItem);
const myPermission = ref<0 | 1 | 2 | 3 | 4>(0);
const turnTerm = ref<number>(1);
const lastExecuted = ref<Date>(new Date());
const troopList = ref(new Map<number, TroopInfo>()); const troopList = ref(new Map<number, TroopInfo>());
const generalList = ref(new Map<number, GeneralListItem>()); const generalList = ref(new Map<number, GeneralListItem>());
@@ -245,6 +259,8 @@ async function refresh() {
const nationP = SammoAPI.Nation.GetNationInfo({}); const nationP = SammoAPI.Nation.GetNationInfo({});
nationInfo.value = (await nationP).nation; nationInfo.value = (await nationP).nation;
const { column, list, permission, troops, env, myGeneralID } = await generalListP; const { column, list, permission, troops, env, myGeneralID } = await generalListP;
turnTerm.value = env.turnterm;
lastExecuted.value = parseTime(env.turntime);
//빠른 턴 순서로 정렬되어있다. //빠른 턴 순서로 정렬되어있다.
@@ -277,11 +293,23 @@ async function refresh() {
throw `?? ${permission}`; throw `?? ${permission}`;
} }
myPermission.value = permission;
me.value = unwrap(generalList.value.get(myGeneralID)); me.value = unwrap(generalList.value.get(myGeneralID));
troopList.value = new Map(); troopList.value = new Map();
for (const { id: troopLeaderID, name: troopName, turntime: troopTurntime, reservedCommand } of troops) { const sortedTroops = troops.sort((lhs, rhs) => {
if (lhs.turntime < rhs.turntime) {
return -1;
}
if (lhs.turntime > rhs.turntime) {
return 1;
}
return lhs.id - rhs.id;
});
for (const { id: troopLeaderID, name: troopName, turntime: troopTurntime, reservedCommand } of sortedTroops) {
if (!generalList.value.has(troopLeaderID)) { if (!generalList.value.has(troopLeaderID)) {
toasts.warning({ toasts.warning({
title: "경고", title: "경고",
@@ -410,11 +438,11 @@ async function exitTroop() {
await refresh(); await refresh();
} }
function openChangeTroopNameDialog(troop: TroopInfo){ function openChangeTroopNameDialog(troop: TroopInfo) {
tryTroopActionTarget.value = { tryTroopActionTarget.value = {
type: 'changeName', type: "changeName",
targetTroop: troop.troopID targetTroop: troop.troopID,
} };
newTroopName.value = troop.troopName; newTroopName.value = troop.troopName;
} }
@@ -448,14 +476,13 @@ async function changeTroopName(troop: TroopInfo) {
await refresh(); await refresh();
} }
function openKickTroopMemberDialog(troop: TroopInfo) {
function openKickTroopMemberDialog(troop: TroopInfo){
tryTroopActionTarget.value = { tryTroopActionTarget.value = {
type: 'kickMember', type: "kickMember",
targetTroop: troop.troopID targetTroop: troop.troopID,
} };
for(const member of troop.members){ for (const member of troop.members) {
if(member.no == troop.troopID){ if (member.no == troop.troopID) {
continue; continue;
} }
kickTroopMemberID.value = member.no; kickTroopMemberID.value = member.no;
@@ -465,7 +492,7 @@ function openKickTroopMemberDialog(troop: TroopInfo){
async function kickTroopMember(troop: TroopInfo) { async function kickTroopMember(troop: TroopInfo) {
const kickMember = generalList.value.get(kickTroopMemberID.value); const kickMember = generalList.value.get(kickTroopMemberID.value);
if(kickMember === undefined){ if (kickMember === undefined) {
toasts.danger({ toasts.danger({
title: "오류", title: "오류",
body: "잘못된 접근입니다.", body: "잘못된 접근입니다.",
@@ -524,6 +551,10 @@ async function kickTroopMember(troop: TroopInfo) {
border: solid 1px gray; border: solid 1px gray;
} }
.troopDiffCityMemeber {
color: red;
}
.troopItem { .troopItem {
display: grid; display: grid;
border-right: solid 1px gray; border-right: solid 1px gray;
@@ -534,7 +565,7 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopInfo { .troopInfo {
grid-column: 1/2; grid-column: 1/3;
grid-row: 1/2; grid-row: 1/2;
display: grid; display: grid;
align-content: center; align-content: center;
@@ -542,7 +573,7 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopTurn { .troopTurn {
grid-column: 1/2; grid-column: 1/3;
grid-row: 2/3; grid-row: 2/3;
display: grid; display: grid;
align-content: center; align-content: center;
@@ -550,7 +581,7 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopLeaderIcon { .troopLeaderIcon {
grid-column: 2/3; grid-column: 3/4;
grid-row: 1/2; grid-row: 1/2;
display: grid; display: grid;
align-content: center; align-content: center;
@@ -558,7 +589,7 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopLeaderName { .troopLeaderName {
grid-column: 2/3; grid-column: 3/4;
grid-row: 2/3; grid-row: 2/3;
display: grid; display: grid;
align-items: center; align-items: center;
@@ -573,7 +604,7 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopAction { .troopAction {
grid-column: 5/6; grid-column: 6/7;
grid-row: 1/3; grid-row: 1/3;
.btn { .btn {
@@ -600,17 +631,51 @@ async function kickTroopMember(troop: TroopInfo) {
} }
.troopItem { .troopItem {
grid-template-rows: 65px 28px; grid-template-rows: 65px 28px 34.5px;
grid-template-columns: 130px 130px 1fr 100px 140px; grid-template-columns: 65px 65px 130px 100px 1fr;
.troopMembers { .troopMembers {
grid-column: 3/4; grid-column: 5/6;
grid-row: 1/3; grid-row: 1/3;
} }
&:last-of-type { &:last-of-type {
border-bottom: solid 1px gray; border-bottom: solid 1px gray;
} }
.filler {
grid-column: 1/2;
grid-row: 3/4;
display: grid;
align-content: center;
justify-content: right;
.dummy::after {
content: "└";
padding-right: 1.5ch;
}
}
.troopAction {
grid-column: 2/7;
grid-row: 3/4;
border-left: transparent;
.actionButtons {
display: grid;
grid-template-columns: 110px 110px 110px;
grid-template-rows: 33.5px;
}
}
}
.subDialog {
display: grid;
grid-template-columns: 90px 140px 50px 50px;
.subTitle {
display: grid;
align-content: center;
}
} }
} }
@@ -627,19 +692,42 @@ async function kickTroopMember(troop: TroopInfo) {
.troopItem { .troopItem {
grid-template-rows: 65px 28px auto; grid-template-rows: 65px 28px auto;
grid-template-columns: 130px 130px 0px 100px 140px; grid-template-columns: 65px 65px 130px 100px 0px 140px;
.troopMembers { .troopMembers {
grid-column: 2/6; grid-column: 3/7;
grid-row: 3/4; grid-row: 3/4;
} }
&:last-of-type { &:last-of-type {
.troopMembers, .troopMembers {
.troopTurn {
border-bottom: solid 1px gray; border-bottom: solid 1px gray;
} }
} }
.filler {
border-top: solid 1px gray;
grid-column: 1/3;
grid-row: 3/4;
}
}
.actionButtons {
display: grid;
}
.subDialog {
display: grid;
height: 100%;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
.subTitle,
.subForm {
display: grid;
align-content: center;
grid-column: 1/3;
}
} }
} }
</style> </style>
+108 -89
View File
@@ -27,7 +27,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col"> <div class="col">
<span :style="{ color: injuryInfo.color }">{{ general.leadership }}</span> <span :style="{ color: injuryInfo.color }">{{ calcInjury("leadership", general) }}</span>
<!-- eslint-disable-next-line vue/no-v-html --> <!-- eslint-disable-next-line vue/no-v-html -->
<span v-if="general.lbonus > 0" style="color: cyan">+{{ general.lbonus }}</span> <span v-if="general.lbonus > 0" style="color: cyan">+{{ general.lbonus }}</span>
</div> </div>
@@ -40,7 +40,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }"> <div class="col" :style="{ color: injuryInfo.color }">
{{ general.strength }} {{ calcInjury("strength", general) }}
</div> </div>
<div class="col align-self-center"> <div class="col align-self-center">
<SammoBar :height="10" :percent="(general.strength_exp / 20) * 100" /> <SammoBar :height="10" :percent="(general.strength_exp / 20) * 100" />
@@ -51,7 +51,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }"> <div class="col" :style="{ color: injuryInfo.color }">
{{ general.intel }} {{ calcInjury("intel", general) }}
</div> </div>
<div class="col align-self-center"> <div class="col align-self-center">
<SammoBar :height="10" :percent="(general.intel_exp / 20) * 100" /> <SammoBar :height="10" :percent="(general.intel_exp / 20) * 100" />
@@ -60,18 +60,24 @@
</div> </div>
<div class="bg1">명마</div> <div class="bg1">명마</div>
<div v-b-tooltip.hover :title="horse.info ?? '-'">{{ horse.name }}</div> <div v-if="!horse.info">{{ horse.name }}</div>
<div v-else v-b-tooltip.hover :title="horse.info">{{ horse.name }}</div>
<div class="bg1">무기</div> <div class="bg1">무기</div>
<div v-b-tooltip.hover :title="weapon.info ?? '-'">{{ weapon.name }}</div> <div v-if="!weapon.info">{{ weapon.name }}</div>
<div v-else v-b-tooltip.hover :title="weapon.info">{{ weapon.name }}</div>
<div class="bg1">서적</div> <div class="bg1">서적</div>
<div v-b-tooltip.hover :title="book.info ?? '-'">{{ book.name }}</div> <div v-if="!book.info">{{ book.name }}</div>
<div v-else v-b-tooltip.hover :title="book.info">{{ book.name }}</div>
<div class="bg1">자금</div> <div class="bg1">자금</div>
<div>{{ general.gold.toLocaleString() }}</div> <div>{{ general.gold.toLocaleString() }}</div>
<div class="bg1">군량</div> <div class="bg1">군량</div>
<div>{{ general.rice.toLocaleString() }}</div> <div>{{ general.rice.toLocaleString() }}</div>
<div class="bg1">도구</div> <div class="bg1">도구</div>
<div v-b-tooltip.hover :title="item.info ?? '-'">{{ item.name }}</div> <div v-if="!item.info">{{ item.name }}</div>
<div v-else v-b-tooltip.hover :title="item.info">{{ item.name }}</div>
<!-- TODO: show_img_level을 고려 --> <!-- TODO: show_img_level을 고려 -->
<div <div
@@ -82,11 +88,13 @@
></div> ></div>
<div class="bg1">병종</div> <div class="bg1">병종</div>
<div v-b-tooltip.hover :title="crewtype.info ?? '-'">{{ crewtype.name }}</div> <div v-if="!crewtype.info">{{ crewtype.name }}</div>
<div v-else v-b-tooltip.hover :title="crewtype.info">{{ crewtype.name }}</div>
<div class="bg1">병사</div> <div class="bg1">병사</div>
<div>{{ general.crew.toLocaleString() }}</div> <div>{{ general.crew.toLocaleString() }}</div>
<div class="bg1">성격</div> <div class="bg1">성격</div>
<div v-b-tooltip.hover :title="personal.info ?? '-'">{{ personal.name }}</div> <div v-if="!personal.info">{{ personal.name }}</div>
<div v-else v-b-tooltip.hover :title="personal.info">{{ personal.name }}</div>
<!-- TODO: bonusTrain 같은 개념이 필요 --> <!-- TODO: bonusTrain 같은 개념이 필요 -->
<div class="bg1">훈련</div> <div class="bg1">훈련</div>
@@ -95,8 +103,11 @@
<div>{{ general.atmos }}</div> <div>{{ general.atmos }}</div>
<div class="bg1">특기</div> <div class="bg1">특기</div>
<div> <div>
<span v-b-tooltip.hover :title="specialDomestic.info ?? '-'"> {{ specialDomestic.name }}</span> / <span v-if="!specialDomestic.info"> {{ specialDomestic.name }}</span
<span v-b-tooltip.hover :title="specialWar.info ?? '-'"> {{ specialWar.name }}</span> ><span v-else v-b-tooltip.hover :title="specialDomestic.info"> {{ specialDomestic.name }}</span>
/
<span v-if="!specialWar.info"> {{ specialWar.name }}</span
><span v-else v-b-tooltip.hover :title="specialWar.info"> {{ specialWar.name }}</span>
</div> </div>
<div class="bg1">Lv</div> <div class="bg1">Lv</div>
@@ -148,7 +159,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { GeneralListItemP1 } from "@/defs/API/Nation"; import type { GeneralListItemP1 } from "@/defs/API/Nation";
import { computed, inject, onMounted, ref, toRefs, type Ref } from "vue"; import { inject, ref, toRefs, watch, type Ref } from "vue";
import { getIconPath } from "@/util/getIconPath"; import { getIconPath } from "@/util/getIconPath";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
import { formatInjury } from "@/utilGame/formatInjury"; import { formatInjury } from "@/utilGame/formatInjury";
@@ -163,6 +174,10 @@ import { parseTime } from "@/util/parseTime";
import { clamp } from "lodash"; import { clamp } from "lodash";
import { formatCityName } from "@/utilGame/formatCityName"; import { formatCityName } from "@/utilGame/formatCityName";
import { isValidObjKey } from "@/utilGame/isValidObjKey"; import { isValidObjKey } from "@/utilGame/isValidObjKey";
import { calcInjury } from "@/utilGame/calcInjury";
import { addMinutes } from "date-fns/esm";
import type { GameIActionInfo } from "@/defs/GameObj";
const imagePath = window.pathConfig.gameImage; const imagePath = window.pathConfig.gameImage;
const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore")); const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore"));
const props = defineProps<{ const props = defineProps<{
@@ -172,95 +187,99 @@ const props = defineProps<{
name: string; name: string;
}; };
nation: NationStaticItem; nation: NationStaticItem;
turnTerm: number;
lastExecuted: Date;
}>(); }>();
const { general, troopInfo, nation } = toRefs(props); const { general, troopInfo, nation } = toRefs(props);
const iconPath = computed(() => getIconPath(general.value.imgsvr, general.value.picture)); const iconPath = ref("");
const injuryInfo = computed(() => {
const [text, color] = formatInjury(general.value.injury);
return {
text,
color,
};
});
const generalTypeCall = computed(() =>
formatGeneralTypeCall(
general.value.leadership,
general.value.strength,
general.value.intel,
gameConstStore.value.gameConst
)
);
const horse = computed(() => const injuryInfo = ref<{ text: string; color: string }>({ text: "-", color: "white" });
isValidObjKey(general.value.horse) const generalTypeCall = ref<string>("-");
? gameConstStore.value.iActionInfo.item[general.value.horse]
: { value: "None", name: "-", info: "" }
);
const weapon = computed(() =>
isValidObjKey(general.value.weapon)
? gameConstStore.value.iActionInfo.item[general.value.weapon]
: { value: "None", name: "-", info: "" }
);
const book = computed(() =>
isValidObjKey(general.value.book)
? gameConstStore.value.iActionInfo.item[general.value.book]
: { value: "None", name: "-", info: "" }
);
const item = computed(() =>
isValidObjKey(general.value.item)
? gameConstStore.value.iActionInfo.item[general.value.item]
: { value: "None", name: "-", info: "" }
);
const crewtype = computed(() => const ageColor = ref<string>("limegreen");
isValidObjKey(general.value.crewtype)
? gameConstStore.value.iActionInfo.crewtype[general.value.crewtype]
: { value: "None", name: "-", info: "-" }
);
const personal = computed(() => watch(
isValidObjKey(general.value.personal) general,
? gameConstStore.value.iActionInfo.personality[general.value.personal] (general) => {
: { value: "None", name: "-", info: "-" } iconPath.value = getIconPath(general.imgsvr, general.picture);
);
const specialDomestic = computed(() => const [text, color] = formatInjury(general.injury);
isValidObjKey(general.value.specialDomestic) injuryInfo.value = { text, color };
? gameConstStore.value.iActionInfo.specialDomestic[general.value.specialDomestic]
: { generalTypeCall.value = formatGeneralTypeCall(
value: "None", general.leadership,
name: `${Math.max(general.value.age + 1, general.value.specage)}`, general.strength,
info: '-', general.intel,
gameConstStore.value.gameConst
);
ageColor.value = (() => {
const age = general.age;
const retirementYear = gameConstStore.value.gameConst.retirementYear;
if (age < retirementYear * 0.75) {
return "limegreen";
} }
); if (age < retirementYear) {
const specialWar = computed(() => return "yellow";
isValidObjKey(general.value.specialWar)
? gameConstStore.value.iActionInfo.specialWar[general.value.specialWar]
: {
value: "None",
name: `${Math.max(general.value.age + 1, general.value.specage2)}`,
info: '-',
} }
return "red";
})();
},
{ immediate: true }
); );
const ageColor = computed(() => { const dummyInfo: GameIActionInfo = { value: "None", name: "-", info: "" };
const age = general.value.age;
const retirementYear = gameConstStore.value.gameConst.retirementYear; const horse = ref<GameIActionInfo>(dummyInfo);
if (age < retirementYear * 0.75) { const weapon = ref<GameIActionInfo>(dummyInfo);
return "limegreen"; const book = ref<GameIActionInfo>(dummyInfo);
} const item = ref<GameIActionInfo>(dummyInfo);
if (age < retirementYear) {
return "yellow"; const crewtype = ref<GameIActionInfo>(dummyInfo);
}
return "red"; const personal = ref<GameIActionInfo>(dummyInfo);
}); const specialDomestic = ref<GameIActionInfo>(dummyInfo);
const specialWar = ref<GameIActionInfo>(dummyInfo);
watch(
general,
(general) => {
horse.value = !isValidObjKey(general.horse) ? dummyInfo : gameConstStore.value.iActionInfo.item[general.horse];
weapon.value = !isValidObjKey(general.weapon) ? dummyInfo : gameConstStore.value.iActionInfo.item[general.weapon];
book.value = !isValidObjKey(general.book) ? dummyInfo : gameConstStore.value.iActionInfo.item[general.book];
item.value = !isValidObjKey(general.item) ? dummyInfo : gameConstStore.value.iActionInfo.item[general.item];
crewtype.value = !isValidObjKey(general.crewtype)
? dummyInfo
: gameConstStore.value.iActionInfo.crewtype[general.crewtype];
personal.value = !isValidObjKey(general.personal)
? dummyInfo
: gameConstStore.value.iActionInfo.personality[general.personal];
specialDomestic.value = !isValidObjKey(general.specialDomestic)
? { value: "None", name: `${Math.max(general.age + 1, general.specage)}`, info: "-" }
: gameConstStore.value.iActionInfo.specialDomestic[general.specialDomestic];
specialWar.value = !isValidObjKey(general.specialWar)
? { value: "None", name: `${Math.max(general.age + 1, general.specage2)}`, info: "-" }
: gameConstStore.value.iActionInfo.specialWar[general.specialWar];
},
{ immediate: true }
);
const nextExecuteMinute = ref(999); const nextExecuteMinute = ref(999);
onMounted(() => { watch(
const now = new Date(); general,
const turnTime = parseTime(general.value.turntime); () => {
nextExecuteMinute.value = Math.floor(clamp(turnTime.getSeconds() - now.getSeconds() / 60, 0)); let turnTime = parseTime(general.value.turntime);
}); if (turnTime.getTime() < props.lastExecuted.getTime()) {
turnTime = addMinutes(turnTime, props.turnTerm);
}
nextExecuteMinute.value = Math.floor(clamp((turnTime.getTime() - props.lastExecuted.getTime()) / 60000, 0, 999));
},
{ immediate: true }
);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
+71 -50
View File
@@ -23,7 +23,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col"> <div class="col">
<span :style="{ color: injuryInfo.color }">{{ general.leadership }}</span> <span :style="{ color: injuryInfo.color }">{{ calcInjury("leadership", general) }}</span>
<!-- eslint-disable-next-line vue/no-v-html --> <!-- eslint-disable-next-line vue/no-v-html -->
<span v-if="general.lbonus > 0" style="color: cyan">+{{ general.lbonus }}</span> <span v-if="general.lbonus > 0" style="color: cyan">+{{ general.lbonus }}</span>
</div> </div>
@@ -33,7 +33,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }"> <div class="col" :style="{ color: injuryInfo.color }">
{{ general.strength }} {{ calcInjury("strength", general) }}
</div> </div>
</div> </div>
</div> </div>
@@ -41,7 +41,7 @@
<div> <div>
<div class="row gx-0"> <div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }"> <div class="col" :style="{ color: injuryInfo.color }">
{{ general.intel }} {{ calcInjury("intel", general) }}
</div> </div>
</div> </div>
</div> </div>
@@ -51,7 +51,8 @@
<div class="bg1">군량</div> <div class="bg1">군량</div>
<div>{{ general.rice.toLocaleString() }}</div> <div>{{ general.rice.toLocaleString() }}</div>
<div class="bg1">성격</div> <div class="bg1">성격</div>
<div v-b-tooltip.hover :title="personal.info ?? undefined">{{ personal.name }}</div> <div v-if="!personal.info">{{ personal.name }}</div>
<div v-else v-b-tooltip.hover :title="personal.info">{{ personal.name }}</div>
<div class="filler"></div> <div class="filler"></div>
<div class="bg1">Lv</div> <div class="bg1">Lv</div>
@@ -64,8 +65,11 @@
<div class="bg1">특기</div> <div class="bg1">특기</div>
<div> <div>
<span v-b-tooltip.hover :title="specialDomestic.info ?? undefined"> {{ specialDomestic.name }}</span> / <span v-if="!specialDomestic.info"> {{ specialDomestic.name }}</span
<span v-b-tooltip.hover :title="specialWar.info ?? undefined"> {{ specialWar.name }}</span> ><span v-else v-b-tooltip.hover :title="specialDomestic.info"> {{ specialDomestic.name }}</span>
/
<span v-if="!specialWar.info"> {{ specialWar.name }}</span
><span v-else v-b-tooltip.hover :title="specialWar.info"> {{ specialWar.name }}</span>
</div> </div>
<div class="filler"></div> <div class="filler"></div>
@@ -82,7 +86,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { GeneralListItemP0 } from "@/defs/API/Nation"; import type { GeneralListItemP0 } from "@/defs/API/Nation";
import { computed, inject, toRefs, type Ref } from "vue"; import { computed, inject, ref, toRefs, watch, type Ref } from "vue";
import { getIconPath } from "@/util/getIconPath"; import { getIconPath } from "@/util/getIconPath";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
import { formatInjury } from "@/utilGame/formatInjury"; import { formatInjury } from "@/utilGame/formatInjury";
@@ -91,6 +95,10 @@ import { unwrap } from "@/util/unwrap";
import type { GameConstStore } from "@/GameConstStore"; import type { GameConstStore } from "@/GameConstStore";
import { formatGeneralTypeCall } from "@/utilGame/formatGeneralTypeCall"; import { formatGeneralTypeCall } from "@/utilGame/formatGeneralTypeCall";
import { formatConnectScore } from "@/utilGame/formatConnectScore"; import { formatConnectScore } from "@/utilGame/formatConnectScore";
import { calcInjury } from "@/utilGame/calcInjury";
import type { GameIActionInfo } from "@/defs/GameObj";
import { isValidObjKey } from "@/utilGame/isValidObjKey";
const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore")); const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore"));
const props = defineProps<{ const props = defineProps<{
general: GeneralListItemP0; general: GeneralListItemP0;
@@ -98,52 +106,65 @@ const props = defineProps<{
}>(); }>();
const { general, nation } = toRefs(props); const { general, nation } = toRefs(props);
const iconPath = computed(() => getIconPath(general.value.imgsvr, general.value.picture)); const iconPath = ref("");
const injuryInfo = computed(() => {
const [text, color] = formatInjury(general.value.injury); const injuryInfo = ref<{ text: string; color: string }>({ text: "-", color: "white" });
return { const generalTypeCall = ref<string>("-");
text,
color, const ageColor = ref<string>("limegreen");
};
}); watch(
const generalTypeCall = computed(() => general,
formatGeneralTypeCall( (general) => {
general.value.leadership, iconPath.value = getIconPath(general.imgsvr, general.picture);
general.value.strength,
general.value.intel, const [text, color] = formatInjury(general.injury);
gameConstStore.value.gameConst injuryInfo.value = { text, color };
)
generalTypeCall.value = formatGeneralTypeCall(
general.leadership,
general.strength,
general.intel,
gameConstStore.value.gameConst
);
ageColor.value = (() => {
const age = general.age;
const retirementYear = gameConstStore.value.gameConst.retirementYear;
if (age < retirementYear * 0.75) {
return "limegreen";
}
if (age < retirementYear) {
return "yellow";
}
return "red";
})();
},
{ immediate: true }
); );
const personal = computed( const dummyInfo: GameIActionInfo = { value: "None", name: "-", info: "" };
() => gameConstStore.value.iActionInfo.personality[general.value.personal] ?? { value: "None", name: "-" }
);
const specialDomestic = computed(
() =>
gameConstStore.value.iActionInfo.specialDomestic[general.value.specialDomestic] ?? {
value: "None",
name: `-`,
}
);
const specialWar = computed(
() =>
gameConstStore.value.iActionInfo.specialWar[general.value.specialWar] ?? {
value: "None",
name: `-`,
}
);
const ageColor = computed(() => { const personal = ref<GameIActionInfo>(dummyInfo);
const age = general.value.age; const specialDomestic = ref<GameIActionInfo>(dummyInfo);
const retirementYear = gameConstStore.value.gameConst.retirementYear; const specialWar = ref<GameIActionInfo>(dummyInfo);
if (age < retirementYear * 0.75) {
return "limegreen"; watch(
} general,
if (age < retirementYear) { (general) => {
return "yellow"; personal.value = !isValidObjKey(general.personal)
} ? dummyInfo
return "red"; : gameConstStore.value.iActionInfo.personality[general.personal];
});
specialDomestic.value = !isValidObjKey(general.specialDomestic)
? dummyInfo
: gameConstStore.value.iActionInfo.specialDomestic[general.specialDomestic];
specialWar.value = !isValidObjKey(general.specialWar)
? dummyInfo
: gameConstStore.value.iActionInfo.specialWar[general.specialWar];
},
{ immediate: true }
);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
+6
View File
@@ -0,0 +1,6 @@
import type { GeneralListItemP0 } from "@/defs/API/Nation";
export function calcInjury(statKey: 'leadership'|'strength'|'intel', general: GeneralListItemP0){
const baseStat = general[statKey];
return Math.round(baseStat * (100 -general.injury) / 100);
}
+3 -1
View File
@@ -1,4 +1,5 @@
import bs from 'binary-search'; import bs from 'binary-search';
import { clamp } from 'lodash';
const connectMap: [number, string][] = [ const connectMap: [number, string][] = [
[0, '안함'], [0, '안함'],
@@ -18,5 +19,6 @@ export function formatConnectScore(connect: number) {
if (idx >= 0) { if (idx >= 0) {
return connectMap[idx][1] ?? '?'; return connectMap[idx][1] ?? '?';
} }
return connectMap[-(idx + 1)][1] ?? '?'; const uidx = clamp(-idx - 1, 0, connectMap.length - 1);
return connectMap[uidx][1] ?? '?';
} }
+3 -1
View File
@@ -1,4 +1,5 @@
import bs from 'binary-search'; import bs from 'binary-search';
import { clamp } from 'lodash';
const defenceMap: [number,string][] = [ const defenceMap: [number,string][] = [
[0, "△"], [0, "△"],
@@ -13,5 +14,6 @@ export function formatDefenceTrain(defenceTrain: number): string {
if(idx >= 0){ if(idx >= 0){
return defenceMap[idx][1]??'?'; return defenceMap[idx][1]??'?';
} }
return defenceMap[-(idx + 1)][1]??'?'; const uidx = clamp(-idx - 1, 0, defenceMap.length - 1);
return defenceMap[uidx][1]??'?';
} }
+2 -1
View File
@@ -1,4 +1,5 @@
import bs from 'binary-search'; import bs from 'binary-search';
import { clamp } from 'lodash';
export const DexLevelMap: [number, string, string][] = [ export const DexLevelMap: [number, string, string][] = [
[0, 'navy', 'F-'], [0, 'navy', 'F-'],
@@ -38,7 +39,7 @@ export type DexInfo = {
export function formatDexLevel(dex: number): DexInfo { export function formatDexLevel(dex: number): DexInfo {
const rawIdx = bs(DexLevelMap, dex, ([dexKey], needle) => dexKey - needle); const rawIdx = bs(DexLevelMap, dex, ([dexKey], needle) => dexKey - needle);
const level = rawIdx >= 0 ? rawIdx : -(rawIdx + 1); const level = rawIdx >= 0 ? rawIdx : clamp(-(rawIdx + 1), 0, DexLevelMap.length - 1);
const [, color, name] = DexLevelMap[level]; const [, color, name] = DexLevelMap[level];
+3 -1
View File
@@ -1,4 +1,5 @@
import bs from 'binary-search'; import bs from 'binary-search';
import { clamp } from 'lodash';
const hornorMap: [number, string][] = [ const hornorMap: [number, string][] = [
[0, '전무'], [0, '전무'],
@@ -22,5 +23,6 @@ export function formatHonor(experience: number): string {
if (idx >= 0) { if (idx >= 0) {
return hornorMap[idx][1] ?? '?'; return hornorMap[idx][1] ?? '?';
} }
return hornorMap[-(idx + 1)][1] ?? '?'; const uidx = clamp(-idx - 1, 0, hornorMap.length - 1);
return hornorMap[uidx][1] ?? '?';
} }
+2 -1
View File
@@ -63,7 +63,8 @@ module.exports = (env, argv) => {
entryIngameVue['bootstrap'] = `${scssDir}/bootstrap.scss`; entryIngameVue['bootstrap'] = `${scssDir}/bootstrap.scss`;
const cacheDirectory = path.resolve(__dirname, 'node_modules/.cache/webpack'); const cacheDirectory = path.resolve(__dirname, 'node_modules/.cache/webpack');
const devtool = mode != 'production' ? 'eval-source-map' : (env.WEBPACK_WATCH ? 'source-map' : undefined); //const devtool = mode != 'production' ? 'eval-source-map' : (env.WEBPACK_WATCH ? 'source-map' : undefined);
const devtool = mode != 'production' ? 'eval-source-map' : 'source-map';
const optimization = { const optimization = {
splitChunks: { splitChunks: {