Compare commits

...
68 Commits
Author SHA1 Message Date
Hide_D 88c78ec892 game, misc: 작위 상승 메시지 변경 2022-09-01 02:49:20 +09:00
Hide_D 006ca76922 refac: ExecuteEngine 반환 타입 변경 2022-08-30 22:51:14 +09:00
Hide_D 8cb2e2a447 fix: OAuth Redirect UTI가 사전 값과 다른 경우 domain 보정 2022-08-28 18:00:53 +09:00
Hide_D 517c85d003 misc: oauth.php 에러 상세 표기 2022-08-28 17:37:55 +09:00
Hide_D 83556b710c fix, feat: HTTP_HOST가 다른 경우에도 oauth redirect 허용
- oauth 대상에서 redirect 허용 host를 설정해야함.
2022-08-28 17:24:25 +09:00
Hide_D a43b9091f8 feat: WebUtil::replaceDomain 2022-08-28 17:21:37 +09:00
Hide_D e83a1bef49 fix, misc: 사이시옷 수정 2022-08-28 15:45:44 +09:00
Hide_D 1147a8262c fix: 아이템 이름 오기 2022-08-28 15:41:50 +09:00
Hide_D 8a987cc55e fix: 조사 관련 문제 수정 2022-08-28 15:40:52 +09:00
Hide_D b28ca864f9 dep: package update 2022-08-28 15:30:35 +09:00
Hide_D 4bf77a5c55 game: 궁병 공격 시도, 추가페이즈 선제 공격
- 수비 선제와 구조적으로 동일
- 첫번째 상대에게 선제 사격
- 궁병과 궁병의 대결인 경우 항상 맞 선제 사격
2022-08-28 14:35:14 +09:00
Hide_D 4ebc20f182 game: 전투 첫 페이즈 계략시도 보정은 무장 제외 2022-08-28 14:17:09 +09:00
Hide_D 9eff1ccaed fix: 경매장 이름 풀 난수 생성기에 seed 초기화값 문제 수정 2022-08-27 12:15:12 +09:00
Hide_D 66170c98dd game: 수비 끔 시 사기 감소량 -3 => -6 2022-08-27 03:00:16 +09:00
Hide_D 397c054c66 game: 유니크 경매 제한 시간 감소
- 1분턴 마감시간 기준 1시간 -> 30분
2022-08-27 02:57:01 +09:00
Hide_D 0611551dc0 game: 의병모집 생성량 변경
- 3 + 연감 기준 평균 장수수 / 8 (반올림)
- 국가별 장수수가 평균 80명부터 역전
2022-08-27 02:46:44 +09:00
Hide_D 008f88d995 game: 전투시 얻는 기술량에서 공격자 상향
- 공격자 기술: 공격자가 입은 피해 * 0.012 (구 0.01)
- 수비자 기술: 수비자가 입은 피해 * 0.009 (구 0.01)
2022-08-27 02:39:47 +09:00
Hide_D 7fe450bc07 Revert "revert: LazyVarUpdater에 \BackedEnum 롤백"
This reverts commit a88ec71b44.
2022-08-26 22:16:06 +09:00
Hide_D a88ec71b44 revert: LazyVarUpdater에 \BackedEnum 롤백 2022-08-26 17:30:24 +09:00
Hide_D 8a5a3b67f7 refac: utilGame/getNPCColor 2022-08-26 01:06:43 +09:00
Hide_D 63771da876 misc: utilGame/index.ts 2022-08-26 00:34:56 +09:00
Hide_D 68891fafdb misc: CityColumn enum 2022-08-26 00:34:45 +09:00
Hide_D df31300a0b refac: GeneralBasicCard의 부대장 요구 정보를 간소화 2022-08-26 00:34:42 +09:00
Hide_D 16fb782bbf refac: LazyVarUpdater의 key로 BackedEnum 허용 2022-08-26 00:34:39 +09:00
Hide_D ed3e013a53 misc: GeneralColumn enum 추가 2022-08-26 00:34:32 +09:00
Hide_D 0bf568a655 feat: 국방 설정 시, 작성자와 작성 일시를 기록 2022-08-26 00:34:15 +09:00
Hide_D a5e481af96 fix: utilGame format에서 한단계 다르게 차이나는 버그 수정 2022-08-21 18:53:55 +09:00
Hide_D 78a9641c14 dep: lodash -> lodash-es 2022-08-21 18:14:36 +09:00
Hide_D b517000650 game: 성벽 공격 시 소모 쌀 20% 감소 2022-08-21 17:52:25 +09:00
Hide_D 1d20eb3c3e game: 초반 M장 생성 시 무지장 대량 생성 2022-08-21 17:42:33 +09:00
Hide_D 8248ccbcd5 game: 시간이 지남에 따라 성벽 강화
- 183년 기준 동일.
- 220년 기준 40% 전투력 상승
2022-08-20 15:03:58 +09:00
Hide_D b880b9bace game: NPC가 조금 더 상위병종을 시도할 확률을 높임 2022-08-20 14:39:51 +09:00
Hide_D 2da374410b game: 필살 계수 향상 방식 너프 2022-08-20 14:29:54 +09:00
Hide_D fff8f9493b game: 유니크 아이템 경매 시 현재가보다 1% 더 높아야 함 2022-08-20 14:15:49 +09:00
Hide_D 987baaa307 misc: 아시아 명장전 장수 구성 수정 2022-08-19 21:11:02 +09:00
Hide_D 9512ea9b52 feat: APICoveryType에 맞게 InvalidResponse 확장 2022-08-18 01:08:38 +09:00
Hide_D b0f3c1c97d feat: APIRecoveryType Enum 생성 2022-08-18 01:08:35 +09:00
Hide_D e823b97cf2 fix: 세션 관리 api 에러 2022-08-18 01:08:28 +09:00
Hide_D 203859ee5f dep: denque 추가 2022-08-16 23:58:21 +09:00
Hide_D 4870e2fa30 feat: GetRecentRecord 추가
- 메인페이지 최신 로그
2022-08-16 23:57:47 +09:00
Hide_D 970b702a2b fix: 빙의장은 제대로 유산을 받지 못하는 버그 수정 2022-08-13 03:18:31 +09:00
Hide_D 053288b227 fix: applyDB시 rankVarRead 처리 오류 (=은퇴 버그 수정)
- 은퇴는 applyDB 이후에 실행됨
- applyDB 코드 오류로 이후 key값 문제로 은퇴가 실행되지 않음
2022-08-13 03:12:09 +09:00
Hide_D e9b975bea7 fix: 의병모집에서 명성, 계급이 설정되지 않는 버그 수정 2022-08-12 02:25:12 +09:00
Hide_D 89fda44db8 game: 목우 상향, 무상성화 2022-08-10 23:53:19 +09:00
Hide_D fac8536095 fix: 도시 비중 계산식에서 '종사' 누락 2022-08-09 02:04:39 +09:00
Hide_D c79e65b6b7 misc: 아시아 명장전 유저장 스탯 수정 2022-08-08 21:38:02 +09:00
Hide_D 677e65ff6d dep: npm package update 2022-08-06 20:26:35 +09:00
Hide_D 0c7589d524 fix,misc: phan 검사 수준 복구 2022-08-05 23:45:31 +09:00
Hide_D da27ae2bad dep,refac: DTO를 composer 외부로 이동 2022-08-05 23:43:38 +09:00
Hide_D f8cd58bcb3 refac: conv_general_stat을 xlrd대신 opnepyxl로 변경
- 국가명 - 수뇌는 아직 테스트 안 해 보았음...
2022-08-03 00:53:41 +09:00
sarsandHide_D 3671a289b8 아시아 명장전 시나리오(비급) 추가 (#225)
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/225
Reviewed-by: Hide_D <hided62@gmail.com>
Co-authored-by: sars <sarsntony@gmail.com>
Co-committed-by: sars <sarsntony@gmail.com>
2022-08-02 16:47:41 +09: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
145 changed files with 4469 additions and 2475 deletions
+2 -2
View File
@@ -26,8 +26,8 @@
"nette/caching": "^3.0", "nette/caching": "^3.0",
"illuminate/database": "^9.12", "illuminate/database": "^9.12",
"illuminate/events": "^9.12", "illuminate/events": "^9.12",
"spatie/data-transfer-object": "^3.7", "php-ds/php-ds": "^1.4",
"php-ds/php-ds": "^1.4" "hided62/ldto": "^1.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
Generated
+56 -65
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "908099160e2765c04448fef3f35794c4", "content-hash": "fe4387d1f2df3d3162c053a1d50a733a",
"packages": [ "packages": [
{ {
"name": "brandonwamboldt/utilphp", "name": "brandonwamboldt/utilphp",
@@ -537,6 +537,60 @@
}, },
"time": "2021-06-11T22:34:44+00:00" "time": "2021-06-11T22:34:44+00:00"
}, },
{
"name": "hided62/ldto",
"version": "v1.0.0",
"source": {
"type": "git",
"url": "https://github.com/hided62/ldto.git",
"reference": "4c05401406f8afc1636a90763c13884f8fff0d14"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/hided62/ldto/zipball/4c05401406f8afc1636a90763c13884f8fff0d14",
"reference": "4c05401406f8afc1636a90763c13884f8fff0d14",
"shasum": ""
},
"require": {
"php": ">=8.1"
},
"require-dev": {
"phan/phan": "^5.3",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
"LDTO\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Hide_D",
"email": "hided62@gmail.com",
"homepage": "https://hided.net",
"role": "Developer"
}
],
"description": "php lightweight dto library",
"homepage": "https://github.com/hided62/ldto",
"keywords": [
"data-transfer-object",
"dto",
"hided62",
"lightweight",
"serialize"
],
"support": {
"issues": "https://github.com/hided62/ldto/issues",
"source": "https://github.com/hided62/ldto/tree/v1.0.0"
},
"time": "2022-08-05T14:30:13+00:00"
},
{ {
"name": "illuminate/bus", "name": "illuminate/bus",
"version": "v9.12.2", "version": "v9.12.2",
@@ -2238,69 +2292,6 @@
}, },
"time": "2021-06-29T04:31:23+00:00" "time": "2021-06-29T04:31:23+00:00"
}, },
{
"name": "spatie/data-transfer-object",
"version": "3.7.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/data-transfer-object.git",
"reference": "341f72c77e0fce40ea2e0dcb212cb54dc27bbe72"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/341f72c77e0fce40ea2e0dcb212cb54dc27bbe72",
"reference": "341f72c77e0fce40ea2e0dcb212cb54dc27bbe72",
"shasum": ""
},
"require": {
"php": "^8.0"
},
"require-dev": {
"illuminate/collections": "^8.36",
"jetbrains/phpstorm-attributes": "^1.0",
"larapack/dd": "^1.1",
"phpunit/phpunit": "^9.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Spatie\\DataTransferObject\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Brent Roose",
"email": "brent@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
}
],
"description": "Data transfer objects with batteries included",
"homepage": "https://github.com/spatie/data-transfer-object",
"keywords": [
"data-transfer-object",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/data-transfer-object/issues",
"source": "https://github.com/spatie/data-transfer-object/tree/3.7.3"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
},
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2021-12-30T20:31:10+00:00"
},
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.0.8", "version": "v6.0.8",
@@ -5337,5 +5328,5 @@
"platform-overrides": { "platform-overrides": {
"php": "8.1" "php": "8.1"
}, },
"plugin-api-version": "2.2.0" "plugin-api-version": "2.3.0"
} }
-2
View File
@@ -40,8 +40,6 @@ $admin = getAdmin();
<tr> <tr>
<td width=110 align=right>시작시간변경</td> <td width=110 align=right>시작시간변경</td>
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td> <td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
<td width=110 align=right>현재도시훈사</td>
<td width=285><?=$admin['city_rate']?></td>
</tr> </tr>
<tr> <tr>
<td width=110 align=right>최대 장수</td> <td width=110 align=right>최대 장수</td>
+1 -1
View File
@@ -116,7 +116,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
<?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?> <?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?>
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option> <option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
<?php endforeach; ?> <?php endforeach; ?>
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련, 사기 -3]</option> <option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련 -3, 사기 -6]</option>
</select> </select>
】<br><br> 】<br><br>
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br> <input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
+2 -2
View File
@@ -906,7 +906,7 @@ function nationMsg(General $general)
$nationID = $general->getNationID(); $nationID = $general->getNationID();
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
return $nationStor->notice ?? ''; return $nationStor->nationNotice['msg'] ?? '';
} }
function banner() function banner()
@@ -1812,7 +1812,7 @@ function deleteNation(General $lord, bool $applyDB): array
$nation['generals'] = array_keys($nationGeneralList); $nation['generals'] = array_keys($nationGeneralList);
$nation['aux'] = Json::decode($nation['aux']); $nation['aux'] = Json::decode($nation['aux']);
$nation['msg'] = $nationStor->notice; $nation['msg'] = $nationStor->nationNotice['msg'] ?? '';
$nation['scout_msg'] = $nationStor->scout_msg; $nation['scout_msg'] = $nationStor->scout_msg;
$nation['aux'] += $nationStor->max_power; $nation['aux'] += $nationStor->max_power;
$nation['history'] = getNationHistoryLogAll($nationID); $nation['history'] = getNationHistoryLogAll($nationID);
+56 -40
View File
@@ -285,13 +285,8 @@ function preUpdateMonthly()
'rate_tmp' => $db->sqleval('rate') 'rate_tmp' => $db->sqleval('rate')
], true); ], true);
//도시훈사 180년 60, 220년 87, 240년 100
$rate = Util::round(($admin['year'] - $admin['startyear']) / 1.5) + 60;
if ($rate > 100) $rate = 100;
// 20 ~ 140원 // 20 ~ 140원
$develcost = ($admin['year'] - $admin['startyear'] + 10) * 2; $develcost = ($admin['year'] - $admin['startyear'] + 10) * 2;
$gameStor->city_rate = $rate;
$gameStor->develcost = $develcost; $gameStor->develcost = $develcost;
//매달 사망자 수입 결산 //매달 사망자 수입 결산
@@ -528,7 +523,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');
@@ -559,32 +554,39 @@ function updateNationState()
$startYear = $admin['startyear']; $startYear = $admin['startyear'];
$assemblerCnts = []; $assemblerCnts = [];
$nationCityCounts = [];
foreach($db->queryAllLists('SELECT nation, count(*) FROM city WHERE LEVEL>=4 GROUP BY nation') as [$nationID, $cityCnt]){
$nationCityCounts[$nationID] = $cityCnt;
}
foreach ($db->queryAllLists('SELECT nation,count(no) FROM general WHERE npc = 5 GROUP BY nation') as [$nationID, $assemblerCnt]) { foreach ($db->queryAllLists('SELECT nation,count(no) FROM general WHERE npc = 5 GROUP BY nation') as [$nationID, $assemblerCnt]) {
$assemblerCnts[$nationID] = $assemblerCnt; $assemblerCnts[$nationID] = $assemblerCnt;
}; };
$nationLevelByCityCnt = [
0, //방랑군
1, //호족
2, //군벌
5, //주자사
8, //주목
11, //공
16, //왕
21, //황제
];
foreach ($db->query('SELECT nation,name,level,tech,aux FROM nation') as $nation) { foreach ($db->query('SELECT nation,name,level,tech,aux FROM nation') as $nation) {
//TODO: level이 진관수이소중대특 체계를 벗어날 수 있음 //TODO: level이 진관수이소중대특 체계를 벗어날 수 있음
$nationID = $nation['nation']; $nationID = $nation['nation'];
$citycount = $db->queryFirstField('SELECT count(*) FROM city WHERE nation=%i AND level>=4', $nationID); $cityCnt = $nationCityCounts[$nationID] ?? 0;
/** @var int */
if ($citycount == 0) { $nationlevel = 0;
$nationlevel = 0; // 방랑군 foreach($nationLevelByCityCnt as $cmpNationLevel => $cmpCityCnt){
} elseif ($citycount == 1) { if($cityCnt < $cmpCityCnt){
$nationlevel = 1; // 호족 break;
} elseif ($citycount <= 4) { }
$nationlevel = 2; // 군벌 $nationlevel = $cmpNationLevel;
} elseif ($citycount <= 7) {
$nationlevel = 3; // 주자사
} elseif ($citycount <= 10) {
$nationlevel = 4; // 주목
} elseif ($citycount <= 15) {
$nationlevel = 5; // 공
} elseif ($citycount <= 20) {
$nationlevel = 6; // 왕
} else {
$nationlevel = 7; // 황제
} }
if ($nationlevel > $nation['level']) { if ($nationlevel > $nation['level']) {
@@ -598,33 +600,47 @@ function updateNationState()
'rice' => $db->sqleval('rice + %i', $nationlevel * 1000), 'rice' => $db->sqleval('rice + %i', $nationlevel * 1000),
]; ];
$nationName = $nation['name'];
$lordName = $db->queryFirstField('SELECT name FROM general WHERE nation = %i AND officer_level = 12', $nationID);
$oldNationLevelText = getNationLevel($oldLevel);
$nationLevelText = getNationLevel($nationlevel);
$logger = new ActionLogger(0, $nationID, $year, $month, false);
$josaYi = JosaUtil::pick($lordName, '이');
switch ($nationlevel) { switch ($nationlevel) {
case 7: case 7: //황제
$josaUl = JosaUtil::pick(getNationLevel($nationlevel), ''); $josaRo = JosaUtil::pick($nationLevelText, '');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭하였습니다."; $logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></> {$oldNationLevelText} <Y>{$lordName}</>{$josaYi} <C>{$nationLevelText}</>{$josaRo} 옹립되었습니다.");
pushNationHistoryLog($nation['nation'], ["<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭"]); $logger->pushNationalHistoryLog("<D><b>{$nationName}</b></> {$oldNationLevelText} <Y>{$lordName}</>{$josaYi} <C>{$nationLevelText}</>{$josaRo} 옹립");
$auxVal = Json::decode($nation['aux']); $auxVal = Json::decode($nation['aux']);
$auxVal['can_국기변경'] = 1; $auxVal['can_국기변경'] = 1;
$auxVal['can_국호변경'] = 1; $auxVal['can_국호변경'] = 1;
$updateVals['aux'] = Json::encode($auxVal); $updateVals['aux'] = Json::encode($auxVal);
break; break;
case 6: case 6: //왕
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극하였습니다."; $josaRo = JosaUtil::pick($nationLevelText, '로');
pushNationHistoryLog($nation['nation'], ["<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극"]); $logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 책봉되었습니다.");
$logger->pushNationalHistoryLog("<D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 책봉");
break; break;
case 5: case 5: //공
case 4: case 4: //주목
case 3: case 3: //주자사
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명되었습니다."; $josaRo = JosaUtil::pick($nationLevelText, '로');
pushNationHistoryLog($nation['nation'], ["<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명됨"]); $logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 임명되었습니다.");
$logger->pushNationalHistoryLog("<D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 임명됨");
break; break;
case 2: case 2: //군벌
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 독립하여 <Y>" . getNationLevel($nationlevel) . "</>로 나섰습니다."; $josaRa = JosaUtil::pick($nationName, '라');
pushNationHistoryLog($nation['nation'], ["<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>로 나서다"]); $josaRo = JosaUtil::pick($nationLevelText, '로');
$logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><Y>{$lordName}</>{$josaYi} 독립하여 <D><b>{$nationName}</b></>{$josaRa}는 <C>$nationLevelText</>{$josaRo} 나섰습니다.");
$logger->pushNationalHistoryLog("<Y>{$lordName}</>{$josaYi} 독립하여 <D><b>{$nationName}</b></>{$josaRa}는 <C>$nationLevelText</>{$josaRo} 나서다");
break; break;
} }
$db->update('nation', $updateVals, 'nation=%i', $nation['nation']); $db->update('nation', $updateVals, 'nation=%i', $nation['nation']);
$logger->flush();
$turnRows = []; $turnRows = [];
foreach (Util::range(getNationChiefLevel($nation['level']), 12) as $chiefLevel) { foreach (Util::range(getNationChiefLevel($nation['level']), 12) as $chiefLevel) {
@@ -1147,7 +1163,7 @@ function checkEmperior()
$nation = $nation; $nation = $nation;
$nation['generals'] = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']); $nation['generals'] = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$nation['aux'] = Json::decode($nation['aux']); $nation['aux'] = Json::decode($nation['aux']);
$nation['msg'] = $nationStor->notice; $nation['msg'] = $nationStor->nationNotice['msg'] ?? '';;
$nation['scout_msg'] = $nationStor->scout_msg; $nation['scout_msg'] = $nationStor->scout_msg;
$nation['aux'] += $nationStor->max_power; $nation['aux'] += $nationStor->max_power;
$nation['history'] = getNationHistoryLogAll($nation['nation']); $nation['history'] = getNationHistoryLogAll($nation['nation']);
+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>
+2 -2
View File
@@ -100,7 +100,7 @@ if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){
'reason'=>'파기' 'reason'=>'파기'
]; ];
} }
$msgText = "외교 서신 #{$letterNo} 파기했습니다."; $msgText = "외교 서신(#{$letterNo})을 파기했습니다.";
$lastState = 'cancelled'; $lastState = 'cancelled';
} }
else{ else{
@@ -114,7 +114,7 @@ else{
'aux'=>Json::encode($aux) 'aux'=>Json::encode($aux)
], 'no=%i', $letterNo); ], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo} 파기 요청합니다."; $msgText = "외교 서신(#{$letterNo})을 파기 요청합니다.";
$lastState = 'activated'; $lastState = 'activated';
} }
+2 -2
View File
@@ -85,7 +85,7 @@ if($isAgree){
], 'no=%i', $prevLetterNo); ], 'no=%i', $prevLetterNo);
$prevLetterNo = $db->queryFirstField('SELECT prev_no FROM ng_diplomacy WHERE state != \'cancelled\' AND no = %i', $prevLetterNo); $prevLetterNo = $db->queryFirstField('SELECT prev_no FROM ng_diplomacy WHERE state != \'cancelled\' AND no = %i', $prevLetterNo);
} }
$msgText = "외교 서신 #{$letterNo} 승인되었습니다."; $msgText = "외교 서신( #{$letterNo})이 승인되었습니다.";
} }
else{ else{
$aux['reason'] = [ $aux['reason'] = [
@@ -97,7 +97,7 @@ else{
'state'=>'cancelled', 'state'=>'cancelled',
'aux'=>Json::encode($aux) 'aux'=>Json::encode($aux)
], 'no=%i', $letterNo); ], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo} 거부되었습니다."; $msgText = "외교 서신(#{$letterNo})이 거부되었습니다.";
if($reason){ if($reason){
$msgText .= ' 이유 : '.$reason; $msgText .= ' 이유 : '.$reason;
} }
+1 -1
View File
@@ -70,7 +70,7 @@ $db->update('ng_diplomacy', [
'state'=>'cancelled', 'state'=>'cancelled',
'aux'=>Json::encode($aux) 'aux'=>Json::encode($aux)
], 'no=%i', $letterNo); ], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo} 회수되었습니다."; $msgText = "외교 서신(#{$letterNo})이 회수되었습니다.";
$msg = new Message( $msg = new Message(
Message::MSGTYPE_DIPLOMACY, Message::MSGTYPE_DIPLOMACY,
+1 -1
View File
@@ -44,7 +44,7 @@ if($defence_train !== $me->getVar('defence_train')){
$me->increaseVar('myset', -1); $me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train); $me->setVar('defence_train', $defence_train);
$me->increaseVarWithLimit('train', -3, 20); $me->increaseVarWithLimit('train', -3, 20);
$me->increaseVarWithLimit('atmos', -3, 20); $me->increaseVarWithLimit('atmos', -6, 20);
} }
else{ else{
$me->increaseVar('myset', -1); $me->increaseVar('myset', -1);
+1 -1
View File
@@ -82,7 +82,7 @@ function applyNationPolicy($policy, $nationID, $generalName): ?string
return "{$troopID}는 국가의 부대가 아닙니다."; return "{$troopID}는 국가의 부대가 아닙니다.";
} }
if ($troopCache[$troopID] != 'Neutral') { if ($troopCache[$troopID] != 'Neutral') {
return "부대({$troopID}는 하나의 역할만 지정할 수 있습니다."; return "부대({$troopID})는 하나의 역할만 지정할 수 있습니다.";
} }
if (!is_array($troopTarget) || count($troopTarget) != 2) { if (!is_array($troopTarget) || count($troopTarget) != 2) {
return "{$troopID}의 입력양식이 올바르지 않습니다."; return "{$troopID}의 입력양식이 올바르지 않습니다.";
+4 -5
View File
@@ -281,7 +281,6 @@ unset($defenderList);
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->startyear; $startYear = $gameStor->startyear;
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
function extractRankVar(array $rawVal):Map{ function extractRankVar(array $rawVal):Map{
$rankVars = new Map; $rankVars = new Map;
@@ -298,7 +297,7 @@ function extractRankVar(array $rawVal):Map{
function simulateBattle( function simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation, $rawAttacker, $rawAttackerCity, $rawAttackerNation,
$rawDefenderList, $rawDefenderCity, $rawDefenderNation, $rawDefenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate $startYear, $year, $month
){ ){
$warSeed = bin2hex(random_bytes(16)); $warSeed = bin2hex(random_bytes(16));
@@ -310,7 +309,7 @@ function simulateBattle(
$rawAttackerNation, $rawAttackerNation,
true true
); );
$city = new WarUnitCity($warRng, $rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate); $city = new WarUnitCity($warRng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
$iterDefender = new \ArrayIterator($rawDefenderList); $iterDefender = new \ArrayIterator($rawDefenderList);
$iterDefender->rewind(); $iterDefender->rewind();
@@ -367,7 +366,7 @@ function simulateBattle(
$rice = $city->getKilled() / 100 * 0.8; $rice = $city->getKilled() / 100 * 0.8;
$rice *= $city->getCrewType()->rice; $rice *= $city->getCrewType()->rice;
$rice *= getTechCost($rawDefenderNation['tech']); $rice *= getTechCost($rawDefenderNation['tech']);
$rice *= $cityRate / 100 - 0.2; $rice *= $city->getCityTrainAtmos() / 100 - 0.2;
Util::setRound($rice); Util::setRound($rice);
$defenderRice += $rice; $defenderRice += $rice;
@@ -406,7 +405,7 @@ foreach(Util::range($repeatCnt) as $repeatIdx){
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle( [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation, $rawAttacker, $rawAttackerCity, $rawAttackerNation,
$rawDefenderList, $rawDefenderCity, $rawDefenderNation, $rawDefenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate $startYear, $year, $month
); );
$lastWarLog = Util::mapWithKey(function($key, $values){ $lastWarLog = Util::mapWithKey(function($key, $values){
return ConvertLog(join('<br>', $values)); return ConvertLog(join('<br>', $values));
+5 -6
View File
@@ -29,11 +29,11 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
} }
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
[$startYear, $year, $month, $cityRate, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'city_rate', 'join_mode']); [$startYear, $year, $month, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'join_mode']);
$attacker = new WarUnitGeneral($rng, $attackerGeneral,$rawAttackerNation, true); $attacker = new WarUnitGeneral($rng, $attackerGeneral,$rawAttackerNation, true);
$city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate); $city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
$defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city')); $defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city'));
$defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2); $defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
@@ -90,7 +90,7 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
$rice = $city->getKilled() / 100 * 0.8; $rice = $city->getKilled() / 100 * 0.8;
$rice *= $city->getCrewType()->rice; $rice *= $city->getCrewType()->rice;
$rice *= getTechCost($rawDefenderNation['tech']); $rice *= getTechCost($rawDefenderNation['tech']);
$rice *= $cityRate / 100 - 0.2; $rice *= $city->getCityTrainAtmos() / 100 - 0.2;
Util::setRound($rice); Util::setRound($rice);
$updateDefenderNation['rice'] = max(0, $rawDefenderNation['rice'] - $rice); $updateDefenderNation['rice'] = max(0, $rawDefenderNation['rice'] - $rice);
@@ -113,8 +113,8 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
'dead' => $db->sqleval('dead + %i', $totalDead * 0.6) 'dead' => $db->sqleval('dead + %i', $totalDead * 0.6)
], 'city=%i', $rawDefenderCity['city']); ], 'city=%i', $rawDefenderCity['city']);
$attackerIncTech = buildNationTypeClass($rawAttackerNation['type'])->onCalcDomestic('기술', 'score', $attacker->getDead() * 0.01); $attackerIncTech = buildNationTypeClass($rawAttackerNation['type'])->onCalcDomestic('기술', 'score', $attacker->getDead() * 0.012);
$defenderIncTech = buildNationTypeClass($rawDefenderNation['type'])->onCalcDomestic('기술', 'score', $attacker->getKilled() * 0.01); $defenderIncTech = buildNationTypeClass($rawDefenderNation['type'])->onCalcDomestic('기술', 'score', $attacker->getKilled() * 0.009);
$attackerGenCnt = $rawAttackerNation['gennum']; $attackerGenCnt = $rawAttackerNation['gennum'];
$defenderGenCnt = $rawDefenderNation['gennum']; $defenderGenCnt = $rawDefenderNation['gennum'];
@@ -175,7 +175,6 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
'startyear' => $startYear, 'startyear' => $startYear,
'year' => $year, 'year' => $year,
'month' => $month, 'month' => $month,
'city_rate' => $cityRate,
'join_mode' => $joinMode, 'join_mode' => $joinMode,
], $attacker->getGeneral(), $city->getRaw()); ], $attacker->getGeneral(), $city->getRaw());
} }
+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();
+16 -1
View File
@@ -3,8 +3,10 @@
namespace sammo\API\Global; namespace sammo\API\Global;
use sammo\Session; use sammo\Session;
use sammo\DB;
use DateTimeInterface; use DateTimeInterface;
use sammo\TurnExecutionHelper; use sammo\TurnExecutionHelper;
use sammo\UniqueConst;
class ExecuteEngine extends \sammo\BaseAPI class ExecuteEngine extends \sammo\BaseAPI
{ {
@@ -20,10 +22,23 @@ class ExecuteEngine extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{ {
$updated = TurnExecutionHelper::executeAllCommand(); $reqServerID = $this->args['serverID'] ?? null;
if($reqServerID && $reqServerID !== UniqueConst::$serverID){
return [
'result' => false,
'reason' => '서버 아이디가 다릅니다',
'reqRefresh' => true,
];
}
$updated = false;
$locked = false;
$lastExecuted = TurnExecutionHelper::executeAllCommand($updated, $locked);
return [ return [
'result' => true, 'result' => true,
'updated' => $updated, 'updated' => $updated,
'locked' => $locked,
'lastExecuted' => $lastExecuted,
]; ];
} }
} }
+128
View File
@@ -0,0 +1,128 @@
<?php
namespace sammo\API\Global;
use sammo\Session;
use DateTimeInterface;
use sammo\DB;
use sammo\Util;
use sammo\Validator;
class GetRecentRecord extends \sammo\BaseAPI
{
const ROW_LIMIT = 15;
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('int', 'lastGeneralRecordID')
->rule('int', 'lastWorldHistoryID');
if (!$v->validate()) {
return $v->errorStr();
}
$this->args['lastGeneralRecordID'] = (int)($this->args['lastGeneralRecordID']??0);
$this->args['lastWorldHistoryID'] = (int)($this->args['lastWorldHistoryID']??0);
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
private function getGlobalRecord(int $lastRecordID): array
{
$db = DB::db();
$globalRecord = $db->queryAllLists(
'SELECT id, `text` FROM general_record WHERE `general_id` = 0 AND log_type = %s AND id >= %i ORDER BY `id` DESC LIMIT %i',
'history',
$lastRecordID,
static::ROW_LIMIT + 1,
);
return $globalRecord;
}
private function getGeneralRecord(int $generalID, int $lastRecordID): array
{
$db = DB::db();
$generalRecord = $db->queryAllLists(
'SELECT id, `text` FROM general_record WHERE `general_id` = %i AND log_type = %s AND id >= %i ORDER BY `id` DESC LIMIT %i',
$generalID,
'action',
$lastRecordID,
static::ROW_LIMIT + 1,
);
return $generalRecord;
}
private function getHistory(int $lastHistoryID): array
{
$db = DB::db();
$history = $db->queryAllLists(
'SELECT id, `text` FROM world_history WHERE nation_id = 0 AND id >= %i ORDER BY `id` DESC LIMIT %i',
$lastHistoryID,
static::ROW_LIMIT + 1,
);
return $history;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{
$db = DB::db();
$lastHistoryID = $this->args['lastWorldHistoryID'];
$lastRecordID = $this->args['lastGeneralRecordID'];
$history = $this->getHistory($lastHistoryID);
$globalRecord = $this->getGlobalRecord($lastRecordID);
$generalRecord = $this->getGeneralRecord($session->generalID, $lastRecordID);
$flushHistory = true;
$flushGlobalRecord = true;
$flushGeneralRecord = true;
if($history){
if(Util::array_last($history)[0] == $lastHistoryID){
$flushHistory = false;
array_pop($history);
}
else if(count($history) > static::ROW_LIMIT){
array_pop($history);
}
}
if($globalRecord){
if(Util::array_last($globalRecord)[0] == $lastRecordID){
$flushGlobalRecord = false;
array_pop($globalRecord);
}
else if(count($globalRecord) > static::ROW_LIMIT){
array_pop($globalRecord);
}
}
if($generalRecord){
if(Util::array_last($generalRecord)[0] == $lastRecordID){
$flushGeneralRecord = false;
array_pop($generalRecord);
}
else if(count($generalRecord) > static::ROW_LIMIT){
array_pop($generalRecord);
}
}
return [
'result' => true,
'history' => $history,
'global' => $globalRecord,
'general' => $generalRecord,
'flushHistory' => $flushHistory?1:0,
'flushGlobal' => $flushGlobalRecord?1:0,
'flushGeneral' => $flushGeneralRecord?1:0,
];
}
}
+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 '권한이 부족합니다. 유저 장수의 개인 기록은 수뇌만 열람 가능합니다.';
+8 -2
View File
@@ -6,6 +6,7 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\TimeUtil;
use sammo\Validator; use sammo\Validator;
use sammo\WebUtil; use sammo\WebUtil;
@@ -36,7 +37,7 @@ class SetNotice extends \sammo\BaseAPI
$msg = $this->args['msg']; $msg = $this->args['msg'];
$userID = $session->userID; $userID = $session->userID;
$db = DB::db(); $db = DB::db();
$me = $db->queryFirstRow('SELECT `no`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); $me = $db->queryFirstRow('SELECT `no`,`name`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
$permission = checkSecretPermission($me, false); $permission = checkSecretPermission($me, false);
if($permission < 0){ if($permission < 0){
@@ -49,7 +50,12 @@ class SetNotice extends \sammo\BaseAPI
$nationID = $me['nation']; $nationID = $me['nation'];
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->notice = WebUtil::htmlPurify($msg); $nationStor->nationNotice = [
'date'=>TimeUtil::now(),
'msg'=>WebUtil::htmlPurify($msg),
'author'=>$me['name'],
'authorID'=>$me['no'],
];
return [ return [
'result' => true 'result' => true
+2 -2
View File
@@ -5,8 +5,8 @@ use \sammo\General;
class che_계략_향낭 extends \sammo\BaseItem{ class che_계략_향낭 extends \sammo\BaseItem{
protected $rawName = '항냥'; protected $rawName = '향낭';
protected $name = '항냥(계략)'; protected $name = '향낭(계략)';
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +50%p'; protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +50%p';
protected $cost = 3000; protected $cost = 3000;
protected $consumable = true; protected $consumable = true;
@@ -11,7 +11,7 @@ class event_전투특기_필살 extends \sammo\BaseItem{
protected $rawName = '비급'; protected $rawName = '비급';
protected $name = '비급(필살)'; protected $name = '비급(필살)';
protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 항상 최대'; protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 향상';
protected $cost = 100; protected $cost = 100;
protected $buyable = true; protected $buyable = true;
protected $consumable = false; protected $consumable = false;
@@ -22,8 +22,8 @@ class event_전투특기_필살 extends \sammo\BaseItem{
return $value + 0.3; return $value + 0.3;
} }
if($statName === 'criticalDamageRange'){ if($statName === 'criticalDamageRange'){
[, $rangeMax] = $value; [$rangeMin, $rangeMax] = $value;
return [$rangeMax, $rangeMax]; return [($rangeMin + $rangeMax) / 2, $rangeMax];
} }
return $value; return $value;
@@ -11,7 +11,7 @@ class che_event_필살 extends \sammo\BaseSpecial{
protected $id = 71; protected $id = 71;
protected $name = '필살'; protected $name = '필살';
protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 항상 최대'; protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 향상';
static $selectWeightType = SpecialityHelper::WEIGHT_NORM; static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
static $selectWeight = 1; static $selectWeight = 1;
@@ -26,8 +26,8 @@ class che_event_필살 extends \sammo\BaseSpecial{
return $value + 0.30; return $value + 0.30;
} }
if($statName === 'criticalDamageRange'){ if($statName === 'criticalDamageRange'){
[, $rangeMax] = $value; [$rangeMin, $rangeMax] = $value;
return [$rangeMax, $rangeMax]; return [($rangeMin + $rangeMax) / 2, $rangeMax];
} }
return $value; return $value;
+3 -3
View File
@@ -14,7 +14,7 @@ class che_필살 extends \sammo\BaseSpecial{
protected $id = 71; protected $id = 71;
protected $name = '필살'; protected $name = '필살';
protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 항상 최대'; protected $info = '[전투] 필살 확률 +30%p, 필살 발동시 대상 회피 불가, 필살 계수 향상';
static $selectWeightType = SpecialityHelper::WEIGHT_NORM; static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
static $selectWeight = 1; static $selectWeight = 1;
@@ -29,8 +29,8 @@ class che_필살 extends \sammo\BaseSpecial{
return $value + 0.30; return $value + 0.30;
} }
if($statName === 'criticalDamageRange'){ if($statName === 'criticalDamageRange'){
[, $rangeMax] = $value; [$rangeMin, $rangeMax] = $value;
return [$rangeMax, $rangeMax]; return [($rangeMin + $rangeMax) / 2, $rangeMax];
} }
return $value; return $value;
+5 -1
View File
@@ -22,7 +22,7 @@ abstract class Auction
public const COEFF_AUCTION_CLOSE_MINUTES = 24; public const COEFF_AUCTION_CLOSE_MINUTES = 24;
public const COEFF_EXTENSION_MINUTES_PER_BID = (1 / 6); public const COEFF_EXTENSION_MINUTES_PER_BID = (1 / 6);
public const COEFF_EXTENSION_MINUTES_LIMIT_BY_BID = 1; public const COEFF_EXTENSION_MINUTES_LIMIT_BY_BID = 0.5;
public const COEFF_EXTENSION_MINUTES_BY_EXTENSION_QUERY = 1; public const COEFF_EXTENSION_MINUTES_BY_EXTENSION_QUERY = 1;
public const MIN_AUCTION_CLOSE_MINUTES = 30; public const MIN_AUCTION_CLOSE_MINUTES = 30;
public const MIN_EXTENSION_MINUTES_PER_BID = 1; public const MIN_EXTENSION_MINUTES_PER_BID = 1;
@@ -40,6 +40,7 @@ abstract class Auction
if ($namePool === null) { if ($namePool === null) {
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
'obfuscatedNamePool',
))); )));
$namePool = []; $namePool = [];
foreach (GameConst::$randGenFirstName as $ch0) { foreach (GameConst::$randGenFirstName as $ch0) {
@@ -281,6 +282,9 @@ abstract class Auction
$general = $this->general; $general = $this->general;
$highestBid = $this->getHighestBid(); $highestBid = $this->getHighestBid();
if ($highestBid !== null && $amount < $highestBid->amount * 1.01) {
return '현재입찰가보다 1% 높게 입찰해야 합니다.';
}
if ($highestBid !== null && $amount < $highestBid->amount + 10) { if ($highestBid !== null && $amount < $highestBid->amount + 10) {
return '현재입찰가보다 10 포인트 높게 입찰해야 합니다.'; return '현재입찰가보다 10 포인트 높게 입찰해야 합니다.';
} }
@@ -131,7 +131,7 @@ class che_의병모집 extends Command\NationCommand
$gameStor = KVStorage::getStorage($db, 'game_env'); //TODO: 차라리 env가 이거여야..? $gameStor = KVStorage::getStorage($db, 'game_env'); //TODO: 차라리 env가 이거여야..?
$avgGenCnt = $db->queryFirstField('SELECT avg(gennum) FROM nation WHERE level > 0'); $avgGenCnt = $db->queryFirstField('SELECT avg(gennum) FROM nation WHERE level > 0');
$createGenCnt = 5 + Util::round($avgGenCnt / 10); $createGenCnt = 3 + Util::round($avgGenCnt / 8);
$createGenIdx = $gameStor->npccount + 1; $createGenIdx = $gameStor->npccount + 1;
$lastCreatGenIdx = $createGenIdx + $createGenCnt; $lastCreatGenIdx = $createGenIdx + $createGenCnt;
@@ -156,6 +156,7 @@ class che_의병모집 extends Command\NationCommand
$newNPC->setNPCType(4); $newNPC->setNPCType(4);
$newNPC->setMoney(1000, 1000); $newNPC->setMoney(1000, 1000);
$newNPC->setSpecYear(19, 19); $newNPC->setSpecYear(19, 19);
$newNPC->setExpDed($avgGen['exp'], $avgGen['ded']);
$newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env); $newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env);
$newNPC->build($this->env); $newNPC->build($this->env);
+6 -6
View File
@@ -2,13 +2,13 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\Convert; use LDTO\Attr\Convert;
use sammo\DTO\Attr\JsonString; use LDTO\Attr\JsonString;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
use sammo\DTO\Attr\RawName; use LDTO\Attr\RawName;
use sammo\DTO\Converter\DateTimeConverter; use LDTO\Converter\DateTimeConverter;
class AuctionBidItem extends DTO class AuctionBidItem extends \LDTO\DTO
{ {
public function __construct( public function __construct(
#[NullIsUndefined] #[NullIsUndefined]
+2 -2
View File
@@ -2,9 +2,9 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
class AuctionBidItemData extends DTO class AuctionBidItemData extends \LDTO\DTO
{ {
public function __construct( public function __construct(
#[NullIsUndefined] #[NullIsUndefined]
+6 -6
View File
@@ -2,15 +2,15 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\Convert; use LDTO\Attr\Convert;
use sammo\DTO\Attr\JsonString; use LDTO\Attr\JsonString;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
use sammo\DTO\Attr\RawName; use LDTO\Attr\RawName;
use sammo\DTO\Converter\DateTimeConverter; use LDTO\Converter\DateTimeConverter;
use sammo\Enums\AuctionType; use sammo\Enums\AuctionType;
use sammo\Enums\ResourceType; use sammo\Enums\ResourceType;
class AuctionInfo extends DTO class AuctionInfo extends \LDTO\DTO
{ {
public function __construct( public function __construct(
#[NullIsUndefined] #[NullIsUndefined]
+4 -4
View File
@@ -2,11 +2,11 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\Convert; use LDTO\Attr\Convert;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
use sammo\DTO\Converter\DateTimeConverter; use LDTO\Converter\DateTimeConverter;
class AuctionInfoDetail extends DTO class AuctionInfoDetail extends \LDTO\DTO
{ {
public function __construct( public function __construct(
public string $title, public string $title,
+3 -3
View File
@@ -2,13 +2,13 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\Convert; use LDTO\Attr\Convert;
use sammo\DTO\Converter\MapConverter; use LDTO\Converter\MapConverter;
use sammo\DTO\SelectItem; use sammo\DTO\SelectItem;
//https://json2dto.atymic.dev/ //https://json2dto.atymic.dev/
class BettingInfo extends DTO class BettingInfo extends \LDTO\DTO
{ {
public function __construct( public function __construct(
public int $id, public int $id,
+3 -3
View File
@@ -2,10 +2,10 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
use sammo\DTO\Attr\RawName; use LDTO\Attr\RawName;
class BettingItem extends DTO class BettingItem extends \LDTO\DTO
{ {
public function __construct( public function __construct(
#[RawName('id')] #[RawName('id')]
+3 -3
View File
@@ -2,10 +2,10 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\Convert; use LDTO\Attr\Convert;
use sammo\DTO\Converter\MapConverter; use LDTO\Converter\MapConverter;
class SelectItem extends DTO class SelectItem extends \LDTO\DTO
{ {
public function __construct( public function __construct(
public string $title, public string $title,
+3 -3
View File
@@ -2,10 +2,10 @@
namespace sammo\DTO; namespace sammo\DTO;
use sammo\DTO\Attr\NullIsUndefined; use LDTO\Attr\NullIsUndefined;
use sammo\DTO\Attr\RawName; use LDTO\Attr\RawName;
class VoteComment extends DTO class VoteComment extends \LDTO\DTO
{ {
public function __construct( public function __construct(
#[NullIsUndefined] #[NullIsUndefined]
+1 -1
View File
@@ -2,7 +2,7 @@
namespace sammo\DTO; namespace sammo\DTO;
class VoteInfo extends DTO class VoteInfo extends \LDTO\DTO
{ {
public function __construct( public function __construct(
public int $id, public int $id,
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace sammo\Enums;
/**
* API 호출 결과가 false이면서, 대상 API가 처리할 수 없는 추가 동작이 있는 경우 사용.
* 예시: 턴을 예약해야 하지만, 장수가 사망하여 게이트웨이로 이동해야함.
*/
enum APIRecoveryType: string{
case Login = 'login';//로그인 재시도부터 시작한다
case TwoFactorAuth = '2fa';//로그인은 가능하지만 인증코드 입력이 필요하다
case Gateway = 'gateway';//로그인 완료. 게임 서버 리스트를 띄워야한다
case GameLogin = 'game_login';//서버 업데이트 등으로 다시 게임 정보 수신 필요
case GameQuota = 'game_quota';//접속 제한
}
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace sammo\Enums;
/**
* City Table column
* schemal.sql과 일치
*/
enum CityColumn: string{
case city = 'city';
case name = 'name';
case level = 'level';
case nation = 'nation';
case supply = 'supply';
case front = 'front';
case pop = 'pop';
case pop_max = 'pop_max';
case agri = 'agri';
case agri_max = 'agri_max';
case comm = 'comm';
case comm_max = 'comm_max';
case secu = 'secu';
case secu_max = 'secu_max';
case trust = 'trust';
case trade = 'trade';
case dead = 'dead';
case def = 'def';
case def_max = 'def_max';
case wall = 'wall';
case wall_max = 'wall_max';
case officer_set = 'officer_set';
case state = 'state';
case region = 'region';
case term = 'term';
case conflict = 'conflict';
}
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace sammo\Enums;
/**
* General Table column
* schemal.sql과 일치
*/
enum GeneralColumn: string{
case no = 'no';
case owner = 'owner';
case npcmsg = 'npcmsg';
case npc = 'npc';
case npc_org = 'npc_org';
case affinity = 'affinity';
case bornyear = 'bornyear';
case deadyear = 'deadyear';
case newmsg = 'newmsg';
case con = 'con';
case connect = 'connect';
case refresh = 'refresh';
case logcnt = 'logcnt';
case refcnt = 'refcnt';
case picture = 'picture';
case imgsvr = 'imgsvr';
case name = 'name';
case owner_name = 'owner_name';
case nation = 'nation';
case city = 'city';
case troop = 'troop';
case leadership = 'leadership';
case leadership_exp = 'leadership_exp';
case strength = 'strength';
case strength_exp = 'strength_exp';
case intel = 'intel';
case intel_exp = 'intel_exp';
case injury = 'injury';
case experience = 'experience';
case dedication = 'dedication';
case dex1 = 'dex1';
case dex2 = 'dex2';
case dex3 = 'dex3';
case dex4 = 'dex4';
case dex5 = 'dex5';
case officer_level = 'officer_level';
case officer_city = 'officer_city';
case permission = 'permission';
case gold = 'gold';
case rice = 'rice';
case crew = 'crew';
case crewtype = 'crewtype';
case train = 'train';
case atmos = 'atmos';
case weapon = 'weapon';
case book = 'book';
case horse = 'horse';
case item = 'item';
case turntime = 'turntime';
case recent_war = 'recent_war';
case makelimit = 'makelimit';
case killturn = 'killturn';
case lastconnect = 'lastconnect';
case lastrefresh = 'lastrefresh';
case ip = 'ip';
case block = 'block';
case dedlevel = 'dedlevel';
case explevel = 'explevel';
case age = 'age';
case startage = 'startage';
case belong = 'belong';
case betray = 'betray';
case personal = 'personal';
case special = 'special';
case specage = 'specage';
case special2 = 'special2';
case specage2 = 'specage2';
case defence_train = 'defence_train';
case tnmt = 'tnmt';
case myset = 'myset';
case tournament = 'tournament';
case newvote = 'newvote';
case last_turn = 'last_turn';
case aux = 'aux';
case penalty = 'penalty';
}
+1 -1
View File
@@ -25,7 +25,7 @@ class CreateManyNPC extends \sammo\Event\Action
protected function generateNPC($env, int $cnt) protected function generateNPC($env, int $cnt)
{ {
$pickTypeList = ['무' => 1, '지' => 1]; $pickTypeList = ['무' => 0.333, '지' => 0.333, '지' => 0.334];
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
+2 -2
View File
@@ -340,8 +340,8 @@ class GameUnitConstBase{
1503, self::T_SIEGE, '목우', 1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5, 50, 200, 5, 0, 0, 15, 5,
3000, ['성도'], null, 0, 3000, ['성도'], null, 0,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8], [self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2], [self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833, 1106=>0.909],
['상대를 저지하는 특수병기입니다.'], ['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'] ['che_성벽부상무효'], ['che_저지시도', 'che_저지발동']
] ]
+1 -1
View File
@@ -174,7 +174,7 @@ class GameUnitDetail implements iAction{
$defaultWar *= 1 + $this->speed / 2; $defaultWar *= 1 + $this->speed / 2;
$defaultWar /= Util::valueFit(1 - $this->avoid / 100, 0.1); $defaultWar /= Util::valueFit(1 - $this->avoid / 100, 0.1);
$defaultWar *= 1 + $this->magicCoef / 2; $defaultWar *= 1 + $this->magicCoef / 2;
return sqrt($defaultWar); return $defaultWar;
} }
public function isValid($ownCities, $ownRegions, $relativeYear, $tech){ public function isValid($ownCities, $ownRegions, $relativeYear, $tech){
+1 -1
View File
@@ -803,7 +803,7 @@ class General implements iAction
$db->update('rank_data', [ $db->update('rank_data', [
'value' => $rankVal 'value' => $rankVal
], 'general_id = %i AND type = %s', $generalID, $rankKey->value); ], 'general_id = %i AND type = %s', $generalID, $rankKey->value);
$this->rankVarRead[$rankKey->value] = $rankVal; $this->rankVarRead[$rankKey] = $rankVal;
} }
$result = true; $result = true;
} }
+1 -1
View File
@@ -3513,7 +3513,7 @@ class GeneralAI
if ($officerLevel > 4) { if ($officerLevel > 4) {
$chiefGenerals[$officerLevel] = $nationGeneral; $chiefGenerals[$officerLevel] = $nationGeneral;
} else if ($officerLevel > 2) { } else if ($officerLevel >= 2) {
$nationCities[$officerCity]['important'] += 1; $nationCities[$officerCity]['important'] += 1;
} }
+2 -2
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;
} }
@@ -306,7 +306,7 @@ class InheritancePointManager
} }
[$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']); [$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
if (($year - $pickYearMonth) * 2 <= ($year - $startYear)) { if (($year - Util::parseYearMonth($pickYearMonth)[0]) * 2 <= ($year - $startYear)) {
return; return;
} }
} }
+45 -12
View File
@@ -15,15 +15,21 @@ trait LazyVarUpdater{
return $this->raw; return $this->raw;
} }
function getVar(string $key){ function getVar(string|\BackedEnum $key){
if($key instanceof \BackedEnum){
$key = $key->value;
}
return $this->raw[$key]; return $this->raw[$key];
} }
function getVars(string ...$keys){ function getVars(string|\BackedEnum ...$keys){
return array_map([$this, 'getVar'], $keys); return array_map([$this, 'getVar'], $keys);
} }
function touchVar(string $key):bool{ function touchVar(string|\BackedEnum $key):bool{
if($key instanceof \BackedEnum){
$key = $key->value;
}
if(key_exists($key, $this->raw)){ if(key_exists($key, $this->raw)){
return false; return false;
} }
@@ -41,16 +47,25 @@ trait LazyVarUpdater{
} }
} }
function setVar(string $key, $value){ function setVar(string|\BackedEnum $key, $value){
if($key instanceof \BackedEnum){
$key = $key->value;
}
return $this->updateVar($key, $value); return $this->updateVar($key, $value);
} }
function getAuxVar(string $key){ function getAuxVar(string|\BackedEnum $key){
if($key instanceof \BackedEnum){
$key = $key->value;
}
$this->unpackAux(); $this->unpackAux();
return $this->raw['auxVar'][$key]??null; return $this->raw['auxVar'][$key]??null;
} }
function setAuxVar(string $key, $var){ function setAuxVar(string|\BackedEnum $key, $var){
if($key instanceof \BackedEnum){
$key = $key->value;
}
$oldVar = $this->getAuxVar($key); $oldVar = $this->getAuxVar($key);
if($oldVar === $var){ if($oldVar === $var){
@@ -66,7 +81,10 @@ trait LazyVarUpdater{
$this->auxUpdated = true; $this->auxUpdated = true;
} }
function updateVar(string $key, $value){ function updateVar(string|\BackedEnum $key, $value){
if($key instanceof \BackedEnum){
$key = $key->value;
}
if(($this->raw[$key]??null) === $value){ if(($this->raw[$key]??null) === $value){
return; return;
} }
@@ -76,7 +94,10 @@ trait LazyVarUpdater{
$this->raw[$key] = $value; $this->raw[$key] = $value;
} }
function updateVarWithLimit(string $key, $value, $min = null, $max = null){ function updateVarWithLimit(string|\BackedEnum $key, $value, $min = null, $max = null){
if($key instanceof \BackedEnum){
$key = $key->value;
}
if($min !== null && $value < $min){ if($min !== null && $value < $min){
$value = $min; $value = $min;
} }
@@ -86,8 +107,11 @@ trait LazyVarUpdater{
$this->updateVar($key, $value); $this->updateVar($key, $value);
} }
function increaseVar(string $key, $value) function increaseVar(string|\BackedEnum $key, $value)
{ {
if($key instanceof \BackedEnum){
$key = $key->value;
}
if($value === 0){ if($value === 0){
return; return;
} }
@@ -95,7 +119,10 @@ trait LazyVarUpdater{
$this->updateVar($key, $targetValue); $this->updateVar($key, $targetValue);
} }
function increaseVarWithLimit(string $key, $value, $min = null, $max = null){ function increaseVarWithLimit(string|\BackedEnum $key, $value, $min = null, $max = null){
if($key instanceof \BackedEnum){
$key = $key->value;
}
$targetValue = $this->raw[$key] + $value; $targetValue = $this->raw[$key] + $value;
if($min !== null && $targetValue < $min){ if($min !== null && $targetValue < $min){
$targetValue = $min; $targetValue = $min;
@@ -106,8 +133,11 @@ trait LazyVarUpdater{
$this->updateVar($key, $targetValue); $this->updateVar($key, $targetValue);
} }
function multiplyVar(string $key, $value) function multiplyVar(string|\BackedEnum $key, $value)
{ {
if($key instanceof \BackedEnum){
$key = $key->value;
}
if($value === 1){ if($value === 1){
return; return;
} }
@@ -115,7 +145,10 @@ trait LazyVarUpdater{
$this->updateVar($key, $targetValue); $this->updateVar($key, $targetValue);
} }
function multiplyVarWithLimit(string $key, $value, $min = null, $max = null){ function multiplyVarWithLimit(string|\BackedEnum $key, $value, $min = null, $max = null){
if($key instanceof \BackedEnum){
$key = $key->value;
}
$targetValue = $this->raw[$key] * $value; $targetValue = $this->raw[$key] * $value;
if($min !== null && $targetValue < $min){ if($min !== null && $targetValue < $min){
$targetValue = $min; $targetValue = $min;
+21 -9
View File
@@ -353,26 +353,26 @@ class TurnExecutionHelper
return [false, $currentTurn]; return [false, $currentTurn];
} }
static public function executeAllCommand(): bool static public function executeAllCommand(&$executed = false, &$locked = false): string
{ {
//if(!timeover()) { return; }
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
if (TimeUtil::now(true) < $gameStor->turntime) { if (TimeUtil::now(true) < $gameStor->turntime) {
//턴 시각 이전이면 아무것도 하지 않음 //턴 시각 이전이면 아무것도 하지 않음
return false; return $gameStor->turntime;
} }
if (!tryLock()) { if (!tryLock()) {
return false; $locked = true;
return $gameStor->turntime;
} }
if ($gameStor->isunited == 2 || $gameStor->isunited == 3) { if ($gameStor->isunited == 2 || $gameStor->isunited == 3) {
//천통시에는 동결 //천통시에는 동결
return false; $locked = true;
return $gameStor->turntime;
} }
$gameStor->cacheAll(); $gameStor->cacheAll();
@@ -414,10 +414,14 @@ class TurnExecutionHelper
if ($executionOver) { if ($executionOver) {
if ($currentTurn !== null) { if ($currentTurn !== null) {
$executed = true;
$gameStor->turntime = $currentTurn; $gameStor->turntime = $currentTurn;
} }
unlock(); unlock();
return $currentTurn !== null && $lastExecuted !== $currentTurn; if($lastExecuted !== $currentTurn){
$executed = true;
}
return $gameStor->turntime;
} }
$monthlyRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $monthlyRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
@@ -505,6 +509,7 @@ class TurnExecutionHelper
); );
if ($currentTurn !== null) { if ($currentTurn !== null) {
$executed = true;
$gameStor->turntime = $currentTurn; $gameStor->turntime = $currentTurn;
} }
@@ -512,10 +517,17 @@ class TurnExecutionHelper
processTournament(); processTournament();
//거래 처리 //거래 처리
processAuction(); processAuction();
// 금 해제 // 금 해제
$turntime = $gameStor->turntime;
$gameStor->resetCache(); $gameStor->resetCache();
unlock(); unlock();
return $currentTurn !== null && $lastExecuted !== $currentTurn; if($lastExecuted !== $currentTurn){
$executed = true;
}
return $turntime;
} }
} }
+16 -7
View File
@@ -6,9 +6,9 @@ class WarUnitCity extends WarUnit{
protected $hp; protected $hp;
protected $cityRate; protected $cityTrainAtmos;
function __construct(public readonly RandUtil $rng, $raw, $rawNation, int $year, int $month, $cityRate){ function __construct(public readonly RandUtil $rng, $raw, $rawNation, int $year, int $month, int $startYear){
$general = new DummyGeneral(false); $general = new DummyGeneral(false);
$general->setVar('city', $raw['city']); $general->setVar('city', $raw['city']);
$general->setVar('nation', $raw['nation']); $general->setVar('nation', $raw['nation']);
@@ -18,7 +18,9 @@ class WarUnitCity extends WarUnit{
$this->rawNation = $rawNation; $this->rawNation = $rawNation;
$this->isAttacker = false; $this->isAttacker = false;
$this->cityRate = $cityRate;
//도시 훈사. 181년 60, 201년 80, 221년 100, 231년 110(최대)
$this->cityTrainAtmos = Util::clamp($year - $startYear + 59, 60, 110);
$this->logger = $general->getLogger(); $this->logger = $general->getLogger();
$this->crewType = GameUnitConst::byID(GameUnitConst::CREWTYPE_CASTLE); $this->crewType = GameUnitConst::byID(GameUnitConst::CREWTYPE_CASTLE);
@@ -34,11 +36,18 @@ class WarUnitCity extends WarUnit{
} }
} }
function getCityTrainAtmos(): int{
return $this->cityTrainAtmos;
}
function getName():string{ function getName():string{
return $this->getVar('name'); return $this->getVar('name');
} }
function getCityVar(string $key){ function getCityVar(string|\BackedEnum $key){
if($key instanceof \BackedEnum){
$key = $key->value;
}
return $this->raw[$key]; return $this->raw[$key];
} }
@@ -57,11 +66,11 @@ class WarUnitCity extends WarUnit{
} }
function getComputedTrain(){ function getComputedTrain(){
return $this->cityRate + $this->trainBonus; return $this->cityTrainAtmos + $this->trainBonus;
} }
function getComputedAtmos(){ function getComputedAtmos(){
return $this->cityRate + $this->atmosBonus; return $this->cityTrainAtmos + $this->atmosBonus;
} }
function getHP():int{ function getHP():int{
@@ -69,7 +78,7 @@ class WarUnitCity extends WarUnit{
} }
function getDex(GameUnitDetail $crewType){ function getDex(GameUnitDetail $crewType){
return ($this->cityRate - 60) * 7200; return ($this->cityTrainAtmos - 60) * 7200;
} }
function decreaseHP(int $damage):int{ function decreaseHP(int $damage):int{
+3
View File
@@ -271,6 +271,9 @@ class WarUnitGeneral extends WarUnit
if (!$this->isAttacker) { if (!$this->isAttacker) {
$rice *= 0.8; $rice *= 0.8;
} }
if ($this->oppose instanceof WarUnitCity){
$rice *= 0.8;
}
$rice *= $this->crewType->rice; $rice *= $this->crewType->rice;
$rice *= getTechCost($this->getNationVar('tech')); $rice *= getTechCost($this->getNationVar('tech'));
@@ -44,7 +44,13 @@ class che_계략시도 extends BaseWarUnitTrigger{
return true; return true;
} }
if($self->getPhase() == 0){ $rawIntel = $general->getIntel(false, false, false, false);
$allStat =
$general->getLeadership(false, false, false, false) +
$general->getStrength(false, false, false, false) +
$rawIntel;
if($self->getPhase() == 0 && $rawIntel * 3 >= $allStat){
$magicTrialProb *= 3; $magicTrialProb *= 3;
} }
@@ -28,23 +28,29 @@ class che_궁병선제사격 extends BaseWarUnitTrigger
if ($self->hasActivatedSkillOnLog('선제')) { if ($self->hasActivatedSkillOnLog('선제')) {
return true; return true;
} }
if ($oppose->hasActivatedSkill('선제')){
//맞 선제는 한쪽에서 같이 처리
return true;
}
$self->activateSkill('특수', '선제'); $self->activateSkill('특수', '선제');
if (!$self->isAttacker()) { $self->addPhase(-1);
$self->addPhase(-1); $oppose->addPhase(-1);
$oppose->addPhase(-1); if ($oppose->getCrewType()->armType == GameUnitConst::T_ARCHER) {
if ($oppose->getCrewType()->armType == GameUnitConst::T_ARCHER) { $oppose->activateSkill('특수', '선제');
$oppose->multiplyWarPowerMultiply(0.5);
} else { $self->multiplyWarPowerMultiply(0.5);
$oppose->multiplyWarPowerMultiply(0);
$self->multiplyWarPowerMultiply(0.5);
$self->activateSkill('회피불가', '필살불가', '계략불가');
$oppose->activateSkill('회피불가', '필살불가', '격노불가', '계략불가');
}
} else {
$oppose->multiplyWarPowerMultiply(0.5); $oppose->multiplyWarPowerMultiply(0.5);
$oppose->getLogger()->pushGeneralBattleDetailLog('서로 <C>선제 사격</>을 주고 받았다!</>', ActionLogger::PLAIN);
$self->getLogger()->pushGeneralBattleDetailLog('서로 <C>선제 사격</>을 주고 받았다!</>', ActionLogger::PLAIN);
return true;
} }
$oppose->multiplyWarPowerMultiply(0);
$self->multiplyWarPowerMultiply(0.5);
$self->activateSkill('회피불가', '필살불가', '계략불가');
$oppose->activateSkill('회피불가', '필살불가', '격노불가', '계략불가');
$oppose->getLogger()->pushGeneralBattleDetailLog('상대에게 <R>선제 사격</>을 받았다!</>', ActionLogger::PLAIN); $oppose->getLogger()->pushGeneralBattleDetailLog('상대에게 <R>선제 사격</>을 받았다!</>', ActionLogger::PLAIN);
$self->getLogger()->pushGeneralBattleDetailLog('상대에게 <C>선제 사격</>을 했다!</>', ActionLogger::PLAIN); $self->getLogger()->pushGeneralBattleDetailLog('상대에게 <C>선제 사격</>을 했다!</>', ActionLogger::PLAIN);
+937
View File
@@ -0,0 +1,937 @@
{
"title": "【가상모드27】 아시아 명장전",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드27】</b>아시아 명장전!</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>삼국지를 기반으로 아시아의 고대 명장들이 추가된 시나리오"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"iconPath": ".",
"fiction": 1,
"nation":[],
"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, 71, 93, 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, 103, 76, 101, 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, 42, 91, 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, 88, 63, 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":[
],
"initialEvents": [
[
true,
[
"ChangeCity",
"all",
{
"trade": 100
}
]
]
],
"events": [
[
"month",
1000,
[
"Date",
"==",
180,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
180,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"destroy_nation",
1000,
[
"and",
[
"Date",
">=",
183,
1
],
[
"RemainNation",
"==",
1
]
],
[
"BlockScoutAction"
],
[
"DeleteEvent"
]
]
]
}
+1078
View File
@@ -0,0 +1,1078 @@
{
"title": "【가상모드27-b】 아시아 명장전(비급)",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드27】</b>아시아 명장전!(비급)</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>삼국지를 기반으로 아시아의 고대 명장들이 추가된 시나리오"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"iconPath": ".",
"fiction": 1,
"nation":[],
"diplomacy":[],
"const": {
"npcBanMessageProb": 0,
"npcSeizureMessageProb": 0,
"npcMessageFreqByDay": 8,
"availableSpecialWar": [
"che_귀병",
"che_신산",
"che_환술",
"che_집중",
"che_신중",
"che_반계",
"che_보병",
"che_궁병",
"che_기병",
"che_공성",
"che_돌격",
"che_무쌍",
"che_견고",
"che_위압",
"che_저격",
"che_필살",
"che_징병",
"che_의술",
"che_격노",
"che_척사"
],
"allItems": {
"horse": {
"che_명마_01_노기": 0,
"che_명마_02_조랑": 0,
"che_명마_03_노새": 0,
"che_명마_04_나귀": 0,
"che_명마_05_갈색마": 0,
"che_명마_06_흑색마": 0,
"che_명마_07_백마": 2,
"che_명마_07_기주마": 2,
"che_명마_07_오환마": 2,
"che_명마_07_백상": 2,
"che_명마_08_양주마": 2,
"che_명마_08_흉노마": 2,
"che_명마_09_과하마": 2,
"che_명마_09_의남백마": 2,
"che_명마_10_대완마": 2,
"che_명마_10_옥추마": 2,
"che_명마_11_서량마": 2,
"che_명마_11_화종마": 2,
"che_명마_12_사륜거": 2,
"che_명마_12_옥란백용구": 2,
"che_명마_13_절영": 2,
"che_명마_13_적로": 2,
"che_명마_14_적란마": 2,
"che_명마_14_조황비전": 2,
"che_명마_15_한혈마": 2,
"che_명마_15_적토마": 2
},
"weapon": {
"che_무기_01_단도": 0,
"che_무기_02_단궁": 0,
"che_무기_03_단극": 0,
"che_무기_04_목검": 0,
"che_무기_05_죽창": 0,
"che_무기_06_소부": 0,
"che_무기_07_동추": 2,
"che_무기_07_철편": 2,
"che_무기_07_철쇄": 2,
"che_무기_07_맥궁": 2,
"che_무기_08_유성추": 2,
"che_무기_08_철질여골": 2,
"che_무기_09_쌍철극": 2,
"che_무기_09_동호비궁": 2,
"che_무기_10_삼첨도": 2,
"che_무기_10_대부": 2,
"che_무기_11_고정도": 2,
"che_무기_11_이광궁": 2,
"che_무기_12_철척사모": 2,
"che_무기_12_칠성검": 2,
"che_무기_13_사모": 2,
"che_무기_13_양유기궁": 2,
"che_무기_14_언월도": 2,
"che_무기_14_방천화극": 2,
"che_무기_15_청홍검": 2,
"che_무기_15_의천검": 2
},
"book": {
"che_서적_01_효경전": 0,
"che_서적_02_회남자": 0,
"che_서적_03_변도론": 0,
"che_서적_04_건상역주": 0,
"che_서적_05_여씨춘추": 0,
"che_서적_06_사민월령": 0,
"che_서적_07_위료자": 2,
"che_서적_07_사마법": 2,
"che_서적_07_한서": 2,
"che_서적_07_논어": 2,
"che_서적_08_전론": 2,
"che_서적_08_사기": 2,
"che_서적_09_장자": 2,
"che_서적_09_역경": 2,
"che_서적_10_시경": 2,
"che_서적_10_구국론": 2,
"che_서적_11_상군서": 2,
"che_서적_11_춘추전": 2,
"che_서적_12_산해경": 2,
"che_서적_12_맹덕신서": 2,
"che_서적_13_관자": 2,
"che_서적_13_병법24편": 2,
"che_서적_14_한비자": 2,
"che_서적_14_오자병법": 2,
"che_서적_15_노자": 2,
"che_서적_15_손자병법": 2
},
"item": {
"che_치료_환약": 0,
"che_저격_수극": 0,
"che_사기_탁주": 0,
"che_훈련_청주": 0,
"che_계략_이추": 0,
"che_계략_향낭": 0,
"event_전투특기_격노": 0,
"event_전투특기_견고": 0,
"event_전투특기_공성": 0,
"event_전투특기_궁병": 0,
"event_전투특기_귀병": 0,
"event_전투특기_기병": 0,
"event_전투특기_돌격": 0,
"event_전투특기_무쌍": 0,
"event_전투특기_반계": 0,
"event_전투특기_보병": 0,
"event_전투특기_신산": 0,
"event_전투특기_신중": 0,
"event_전투특기_위압": 0,
"event_전투특기_의술": 0,
"event_전투특기_저격": 0,
"event_전투특기_집중": 0,
"event_전투특기_징병": 0,
"event_전투특기_척사": 0,
"event_전투특기_필살": 0,
"event_전투특기_환술": 0
}
}
},
"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, 71, 93, 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, 103, 76, 101, 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, 42, 91, 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, 88, 63, 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":[
],
"initialEvents": [
[
true,
[
"ChangeCity",
"all",
{
"trade": 100
}
]
]
],
"events": [
[
"month",
1000,
[
"Date",
"==",
180,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
180,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"destroy_nation",
1000,
[
"and",
[
"Date",
">=",
183,
1
],
[
"RemainNation",
"==",
1
]
],
[
"BlockScoutAction"
],
[
"DeleteEvent"
]
]
]
}
+163
View File
@@ -0,0 +1,163 @@
import chai, { assert } from "chai";
import _ from "lodash";
import { formatConnectScore } from "../ts/utilGame/formatConnectScore";
import { formatDexLevel } from "../ts/utilGame/formatDexLevel";
import { formatDefenceTrain } from "../ts/utilGame/formatDefenceTrain";
import { formatHonor } from "../ts/utilGame/formatHonor";
describe("formatConnectScore", () => {
it("connectScoreEqual", () => {
assert.equal(formatConnectScore(0), "안함");
assert.equal(formatConnectScore(50), "무관심");
assert.equal(formatConnectScore(100), "보통");
assert.equal(formatConnectScore(200), "가끔");
assert.equal(formatConnectScore(400), "자주");
assert.equal(formatConnectScore(800), "열심");
assert.equal(formatConnectScore(1600), "중독");
assert.equal(formatConnectScore(3200), "폐인");
assert.equal(formatConnectScore(6400), "경고");
assert.equal(formatConnectScore(12800), "헐...");
});
it("connectScore+1", () => {
assert.equal(formatConnectScore(1), "안함");
assert.equal(formatConnectScore(51), "무관심");
assert.equal(formatConnectScore(101), "보통");
assert.equal(formatConnectScore(201), "가끔");
assert.equal(formatConnectScore(401), "자주");
assert.equal(formatConnectScore(801), "열심");
assert.equal(formatConnectScore(1601), "중독");
assert.equal(formatConnectScore(3201), "폐인");
assert.equal(formatConnectScore(6401), "경고");
assert.equal(formatConnectScore(12801), "헐...");
});
it("connectScoreF-1", () => {
assert.equal(formatConnectScore(49), "안함");
assert.equal(formatConnectScore(99), "무관심");
assert.equal(formatConnectScore(199), "보통");
assert.equal(formatConnectScore(399), "가끔");
assert.equal(formatConnectScore(799), "자주");
assert.equal(formatConnectScore(1599), "열심");
assert.equal(formatConnectScore(3199), "중독");
assert.equal(formatConnectScore(6399), "폐인");
assert.equal(formatConnectScore(11799), "경고");
assert.equal(formatConnectScore(20000), "헐...");
});
});
describe("formatDexLevel", () => {
it ("dexLevelEqual", () => {
assert.deepEqual(formatDexLevel(0 ), {level:0, 'color':'navy', name:'F-'});
assert.deepEqual(formatDexLevel(350 ), {level:1, 'color':'navy', name:'F'});
assert.deepEqual(formatDexLevel(1375 ), {level:2, 'color':'navy', name:'F+'});
assert.deepEqual(formatDexLevel(3500 ), {level:3, 'color':'skyblue', name:'E-'});
assert.deepEqual(formatDexLevel(7125 ), {level:4, 'color':'skyblue', name:'E'});
assert.deepEqual(formatDexLevel(12650 ), {level:5, 'color':'skyblue', name:'E+'});
assert.deepEqual(formatDexLevel(20475 ), {level:6, 'color':'seagreen', name:'D-'});
assert.deepEqual(formatDexLevel(31000 ), {level:7, 'color':'seagreen', name:'D'});
assert.deepEqual(formatDexLevel(44625 ), {level:8, 'color':'seagreen', name:'D+'});
assert.deepEqual(formatDexLevel(61750 ), {level:9, 'color':'teal', name:'C-'});
assert.deepEqual(formatDexLevel(82775 ), {level:10, 'color':'teal', name:'C'});
assert.deepEqual(formatDexLevel(108100 ), {level:11, 'color':'teal', name:'C+'});
assert.deepEqual(formatDexLevel(138125 ), {level:12, 'color':'limegreen', name:'B-'});
assert.deepEqual(formatDexLevel(173250 ), {level:13, 'color':'limegreen', name:'B'});
assert.deepEqual(formatDexLevel(213875 ), {level:14, 'color':'limegreen', name:'B+'});
assert.deepEqual(formatDexLevel(260400 ), {level:15, 'color':'darkorange', name:'A-'});
assert.deepEqual(formatDexLevel(313225 ), {level:16, 'color':'darkorange', name:'A'});
assert.deepEqual(formatDexLevel(372750 ), {level:17, 'color':'darkorange', name:'A+'});
assert.deepEqual(formatDexLevel(439375 ), {level:18, 'color':'tomato', name:'S-'});
assert.deepEqual(formatDexLevel(513500 ), {level:19, 'color':'tomato', name:'S'});
assert.deepEqual(formatDexLevel(595525 ), {level:20, 'color':'tomato', name:'S+'});
assert.deepEqual(formatDexLevel(685850 ), {level:21, 'color':'darkviolet', name:'Z-'});
assert.deepEqual(formatDexLevel(784875 ), {level:22, 'color':'darkviolet', name:'Z'});
assert.deepEqual(formatDexLevel(893000 ), {level:23, 'color':'darkviolet', name:'Z+'});
assert.deepEqual(formatDexLevel(1010625), {level:24, 'color': 'gold', name:'EX-'});
assert.deepEqual(formatDexLevel(1138150), {level:25, 'color': 'gold', name:'EX'});
assert.deepEqual(formatDexLevel(1275975), {level:26, 'color': 'white', name:'EX+'});
});
it ("dexLevel+1", () => {
assert.deepEqual(formatDexLevel(1 ), {level:0, 'color':'navy', name:'F-'});
assert.deepEqual(formatDexLevel(351 ), {level:1, 'color':'navy', name:'F'});
assert.deepEqual(formatDexLevel(1376 ), {level:2, 'color':'navy', name:'F+'});
assert.deepEqual(formatDexLevel(3501 ), {level:3, 'color':'skyblue', name:'E-'});
assert.deepEqual(formatDexLevel(7126 ), {level:4, 'color':'skyblue', name:'E'});
assert.deepEqual(formatDexLevel(12651 ), {level:5, 'color':'skyblue', name:'E+'});
assert.deepEqual(formatDexLevel(20476 ), {level:6, 'color':'seagreen', name:'D-'});
assert.deepEqual(formatDexLevel(31001 ), {level:7, 'color':'seagreen', name:'D'});
assert.deepEqual(formatDexLevel(44626 ), {level:8, 'color':'seagreen', name:'D+'});
assert.deepEqual(formatDexLevel(61751 ), {level:9, 'color':'teal', name:'C-'});
assert.deepEqual(formatDexLevel(82776 ), {level:10, 'color':'teal', name:'C'});
assert.deepEqual(formatDexLevel(108101 ), {level:11, 'color':'teal', name:'C+'});
assert.deepEqual(formatDexLevel(138126 ), {level:12, 'color':'limegreen', name:'B-'});
assert.deepEqual(formatDexLevel(173251 ), {level:13, 'color':'limegreen', name:'B'});
assert.deepEqual(formatDexLevel(213876 ), {level:14, 'color':'limegreen', name:'B+'});
assert.deepEqual(formatDexLevel(260401 ), {level:15, 'color':'darkorange', name:'A-'});
assert.deepEqual(formatDexLevel(313226 ), {level:16, 'color':'darkorange', name:'A'});
assert.deepEqual(formatDexLevel(372751 ), {level:17, 'color':'darkorange', name:'A+'});
assert.deepEqual(formatDexLevel(439376 ), {level:18, 'color':'tomato', name:'S-'});
assert.deepEqual(formatDexLevel(513501 ), {level:19, 'color':'tomato', name:'S'});
assert.deepEqual(formatDexLevel(595526 ), {level:20, 'color':'tomato', name:'S+'});
assert.deepEqual(formatDexLevel(685851 ), {level:21, 'color':'darkviolet', name:'Z-'});
assert.deepEqual(formatDexLevel(784876 ), {level:22, 'color':'darkviolet', name:'Z'});
assert.deepEqual(formatDexLevel(893001 ), {level:23, 'color':'darkviolet', name:'Z+'});
assert.deepEqual(formatDexLevel(1010626), {level:24, 'color': 'gold', name:'EX-'});
assert.deepEqual(formatDexLevel(1138151), {level:25, 'color': 'gold', name:'EX'});
assert.deepEqual(formatDexLevel(1275976), {level:26, 'color': 'white', name:'EX+'});
});
});
describe('formatDefenceTrain', ()=>{
it('defenceTrainEqual', ()=>{
assert.equal(formatDefenceTrain(0 ), "△");
assert.equal(formatDefenceTrain(60 ), "○");
assert.equal(formatDefenceTrain(80 ), "◎");
assert.equal(formatDefenceTrain(90 ), "☆");
assert.equal(formatDefenceTrain(999), "×");
});
it('defenceTrain+1', ()=>{
assert.equal(formatDefenceTrain(1 ), "△");
assert.equal(formatDefenceTrain(61 ), "○");
assert.equal(formatDefenceTrain(81 ), "◎");
assert.equal(formatDefenceTrain(91 ), "☆");
assert.equal(formatDefenceTrain(1000), "×");
});
});
describe('formatHonor', ()=>{
it('honorEqual', ()=>{
assert.equal(formatHonor(0 ), '전무');
assert.equal(formatHonor(640 ), '무명');
assert.equal(formatHonor(2560 ), '신동');
assert.equal(formatHonor(5760 ), '약간');
assert.equal(formatHonor(10240), '평범');
assert.equal(formatHonor(16000), '지역적');
assert.equal(formatHonor(23040), '전국적');
assert.equal(formatHonor(31360), '세계적');
assert.equal(formatHonor(40960), '유명');
assert.equal(formatHonor(45000), '명사');
assert.equal(formatHonor(51840), '호걸');
assert.equal(formatHonor(55000), '효웅');
assert.equal(formatHonor(64000), '영웅');
assert.equal(formatHonor(77440), '구세주');
});
it('honor+1', ()=>{
assert.equal(formatHonor(1 ), '전무');
assert.equal(formatHonor(641 ), '무명');
assert.equal(formatHonor(2561 ), '신동');
assert.equal(formatHonor(5761 ), '약간');
assert.equal(formatHonor(10241), '평범');
assert.equal(formatHonor(16001), '지역적');
assert.equal(formatHonor(23041), '전국적');
assert.equal(formatHonor(31361), '세계적');
assert.equal(formatHonor(40961), '유명');
assert.equal(formatHonor(45001), '명사');
assert.equal(formatHonor(51841), '호걸');
assert.equal(formatHonor(55001), '효웅');
assert.equal(formatHonor(64001), '영웅');
assert.equal(formatHonor(77441), '구세주');
});
});
+1 -1
View File
@@ -4,7 +4,7 @@ import { bufferByteSize, LiteHashDRBG } from '../ts/util/LiteHashDRBG';
import { RandUtil } from '../ts/util/RandUtil'; import { RandUtil } from '../ts/util/RandUtil';
import { convertBytesLikeToArrayBuffer } from '../ts/util/convertBytesLikeToArrayBuffer'; import { convertBytesLikeToArrayBuffer } from '../ts/util/convertBytesLikeToArrayBuffer';
import { convertBytesLikeToUint8Array as toBytes } from '../ts/util/convertBytesLikeToUint8Array'; import { convertBytesLikeToUint8Array as toBytes } from '../ts/util/convertBytesLikeToUint8Array';
import _ from 'lodash'; import _ from 'lodash-es';
chai.use(chaiBytes); chai.use(chaiBytes);
+2 -2
View File
@@ -3,7 +3,7 @@
<div <div
class="bg1 nameHeader" class="bg1 nameHeader"
:style="{ :style="{
color: getNpcColor(officer?.npcType ?? 0), color: getNPCColor(officer?.npcType ?? 0),
textDecoration: isMe ? 'underline' : undefined, textDecoration: isMe ? 'underline' : undefined,
}" }"
> >
@@ -30,7 +30,7 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import type { ChiefResponse } from "@/defs/API/NationCommand"; import type { ChiefResponse } from "@/defs/API/NationCommand";
import { mb_strwidth } from "@/util/mb_strwidth"; import { mb_strwidth } from "@/util/mb_strwidth";
import type { PropType } from "vue"; import type { PropType } from "vue";
+3 -3
View File
@@ -16,7 +16,7 @@
<div <div
class="col-7 align-self-center" class="col-7 align-self-center"
:style="{ :style="{
color: getNpcColor(officer?.npcType ?? 0), color: getNPCColor(officer?.npcType ?? 0),
}" }"
> >
{{ officer?.name }} {{ officer?.name }}
@@ -64,13 +64,13 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import { formatTime } from "@/util/formatTime"; import { formatTime } from "@/util/formatTime";
import { mb_strwidth } from "@/util/mb_strwidth"; import { mb_strwidth } from "@/util/mb_strwidth";
import { parseTime } from "@/util/parseTime"; import { parseTime } from "@/util/parseTime";
import type { StoredActionsHelper } from "@/util/StoredActionsHelper"; import type { StoredActionsHelper } from "@/util/StoredActionsHelper";
import addMinutes from "date-fns/esm/addMinutes/index"; import addMinutes from "date-fns/esm/addMinutes/index";
import { range } from "lodash"; import { range } from "lodash-es";
import { inject, onMounted, ref, type PropType } from "vue"; import { inject, onMounted, ref, type PropType } from "vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
import DragSelect from "@/components/DragSelect.vue"; import DragSelect from "@/components/DragSelect.vue";
+55 -7
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,12 +17,12 @@
</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
:style="{ :style="{
color: getNpcColor(general.npc), color: getNPCColor(general.npc),
}" }"
>{{ general.officerLevel > 4 ? `*${general.name}*` : general.name }}({{ general.turntime.slice(-5) }}){{ >{{ general.officerLevel > 4 ? `*${general.name}*` : general.name }}({{ general.turntime.slice(-5) }}){{
textMap[orderBy][3](general) textMap[orderBy][3](general)
@@ -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";
@@ -76,13 +87,14 @@ import type { GeneralListItemP1 } from "./defs/API/Nation";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import { merge2DArrToObjectArr } from "@/util/merge2DArrToObjectArr"; import { merge2DArrToObjectArr } from "@/util/merge2DArrToObjectArr";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import GeneralBasicCard from "./components/GeneralBasicCard.vue"; import GeneralBasicCard from "./components/GeneralBasicCard.vue";
import GeneralSupplementCard from "@/components/GeneralSupplementCard.vue"; import GeneralSupplementCard from "@/components/GeneralSupplementCard.vue";
import type { NationStaticItem } from "./defs"; 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-es";
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);
+1 -1
View File
@@ -102,7 +102,7 @@ import ChiefReservedCommand from "@/components/ChiefReservedCommand.vue";
import TopBackBar from "@/components/TopBackBar.vue"; import TopBackBar from "@/components/TopBackBar.vue";
import BottomBar from "@/components/BottomBar.vue"; import BottomBar from "@/components/BottomBar.vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { entriesWithType } from "./util/entriesWithType"; import { entriesWithType } from "./util/entriesWithType";
import TopItem from "@/ChiefCenter/TopItem.vue"; import TopItem from "@/ChiefCenter/TopItem.vue";
import BottomItem from "@/ChiefCenter/BottomItem.vue"; import BottomItem from "@/ChiefCenter/BottomItem.vue";
+1 -1
View File
@@ -156,7 +156,7 @@ import { getGameConstStore, type GameConstStore } from "./GameConstStore";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import type { SimpleNationObj, diplomacyState, MapResult } from "./defs"; import type { SimpleNationObj, diplomacyState, MapResult } from "./defs";
import type { GetDiplomacyResponse } from "./defs/API/Global"; import type { GetDiplomacyResponse } from "./defs/API/Global";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
const serverID = staticValues.serverID; const serverID = staticValues.serverID;
+1 -1
View File
@@ -256,7 +256,7 @@ declare const staticValues: {
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import "@scss/game_bg.scss"; import "@scss/game_bg.scss";
import TopBackBar from "@/components/TopBackBar.vue"; import TopBackBar from "@/components/TopBackBar.vue";
import _ from "lodash"; import _ from "lodash-es";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import type { inheritBuffType, InheritPointLogItem } from "./defs/API/InheritAction"; import type { inheritBuffType, InheritPointLogItem } from "./defs/API/InheritAction";
+1 -1
View File
@@ -278,7 +278,7 @@ import TopBackBar from "@/components/TopBackBar.vue";
import { getIconPath } from "@util/getIconPath"; import { getIconPath } from "@util/getIconPath";
import { isBrightColor } from "@util/isBrightColor"; import { isBrightColor } from "@util/isBrightColor";
import { abilityLeadint, abilityLeadpow, abilityPowint, abilityRand } from "@util/generalStats"; import { abilityLeadint, abilityLeadpow, abilityPowint, abilityRand } from "@util/generalStats";
import { shuffle, sum } from "lodash"; import { shuffle, sum } from "lodash-es";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import type { JoinArgs } from "./defs/API/General"; import type { JoinArgs } from "./defs/API/General";
+8 -8
View File
@@ -188,7 +188,7 @@
</div> </div>
<div class="control_bar" data-type="nationPolicy"> <div class="control_bar" data-type="nationPolicy">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button type="button" class="btn btn-dark reset_btn" @click="resetPolicy">값으로</button> <button type="button" class="btn btn-dark reset_btn" @click="resetPolicy">값으로</button>
<button type="button" class="btn btn-secondary revert_btn" @click="rollbackPolicy">이전값으로</button> <button type="button" class="btn btn-secondary revert_btn" @click="rollbackPolicy">이전값으로</button>
</div> </div>
<button type="button" class="btn btn-primary submit_btn" @click="submitPolicy">설정</button> <button type="button" class="btn btn-primary submit_btn" @click="submitPolicy">설정</button>
@@ -263,7 +263,7 @@
</div> </div>
<div class="control_bar" data-type="nationPriority"> <div class="control_bar" data-type="nationPriority">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button type="button" class="btn btn-dark reset_btn" @click="resetNationPriority">값으로</button> <button type="button" class="btn btn-dark reset_btn" @click="resetNationPriority">값으로</button>
<button type="button" class="btn btn-secondary revert_btn" @click="rollbackNationPriority"> <button type="button" class="btn btn-secondary revert_btn" @click="rollbackNationPriority">
이전값으로 이전값으로
</button> </button>
@@ -341,7 +341,7 @@
</div> </div>
<div class="control_bar" data-type="generalPriority"> <div class="control_bar" data-type="generalPriority">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button type="button" class="btn btn-dark reset_btn" @click="resetGeneralPriority">값으로</button> <button type="button" class="btn btn-dark reset_btn" @click="resetGeneralPriority">값으로</button>
<button type="button" class="btn btn-secondary revert_btn" @click="rollbackGeneralPriority"> <button type="button" class="btn btn-secondary revert_btn" @click="rollbackGeneralPriority">
이전값으로 이전값으로
</button> </button>
@@ -390,7 +390,7 @@ import "@scss/game_bg.scss";
import { ref } from "vue"; import { ref } from "vue";
import type { IDItem, InvalidResponse, NationPolicy, NPCChiefActions, NPCGeneralActions } from "@/defs"; import type { IDItem, InvalidResponse, NationPolicy, NPCChiefActions, NPCGeneralActions } from "@/defs";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { cloneDeep, isEqual, isNumber, last } from "lodash"; import { cloneDeep, isEqual, isNumber, last } from "lodash-es";
import { unwrap } from "@util/unwrap"; import { unwrap } from "@util/unwrap";
import { convertFormData } from "@util/convertFormData"; import { convertFormData } from "@util/convertFormData";
import axios from "axios"; import axios from "axios";
@@ -436,7 +436,7 @@ function resetPolicy() {
nationPolicy.value = cloneDeep(staticValues.defaultNationPolicy); nationPolicy.value = cloneDeep(staticValues.defaultNationPolicy);
toasts.info({ toasts.info({
title: "초기화 완료", title: "초기화 완료",
body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.", body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.",
}); });
} }
@@ -500,7 +500,7 @@ async function submitPolicy() {
function calcPolicyValue(title: keyof NationPolicy): number { function calcPolicyValue(title: keyof NationPolicy): number {
if (!(title in nationPolicy.value)) { if (!(title in nationPolicy.value)) {
throw `${title}이 NationPolicy key가 아님`; throw `${title}이 NationPolicy key가 아님`;
} }
const policyValue = nationPolicy.value[title]; const policyValue = nationPolicy.value[title];
if (!isNumber(policyValue)) { if (!isNumber(policyValue)) {
@@ -522,7 +522,7 @@ function resetNationPriority() {
}); });
toasts.info({ toasts.info({
title: "초기화 완료", title: "초기화 완료",
body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.", body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.",
}); });
} }
@@ -602,7 +602,7 @@ function resetGeneralPriority() {
}); });
toasts.info({ toasts.info({
title: "초기화 완료", title: "초기화 완료",
body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.", body: "서버 초값을 적용했습니다.설정 버튼을 누르면 반영됩니다.",
}); });
} }
+1 -1
View File
@@ -30,7 +30,7 @@ import BottomBar from "@/components/BottomBar.vue";
import type { ToastType } from "@/defs"; import type { ToastType } from "@/defs";
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { parseYearMonth } from "@/util/parseYearMonth"; import { parseYearMonth } from "@/util/parseYearMonth";
import { joinYearMonth } from "./util/joinYearMonth"; import { joinYearMonth } from "./util/joinYearMonth";
import BettingDetail from "@/components/BettingDetail.vue"; import BettingDetail from "@/components/BettingDetail.vue";
+1 -1
View File
@@ -287,7 +287,7 @@ import TipTap from "./components/TipTap.vue";
import TopBackBar from "@/components/TopBackBar.vue"; import TopBackBar from "@/components/TopBackBar.vue";
import BottomBar from "@/components/BottomBar.vue"; import BottomBar from "@/components/BottomBar.vue";
import { computed, reactive, ref, toRefs } from "vue"; import { computed, reactive, ref, toRefs } from "vue";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { type diplomacyState, diplomacyStateInfo, type NationStaticItem } from "./defs"; import { type diplomacyState, diplomacyStateInfo, type NationStaticItem } from "./defs";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import { joinYearMonth } from "@/util/joinYearMonth"; import { joinYearMonth } from "@/util/joinYearMonth";
+135 -47
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>
@@ -140,7 +150,7 @@ import { onMounted, provide, ref } from "vue";
import { SammoAPI } from "./SammoAPI"; import { SammoAPI } from "./SammoAPI";
import { BContainer, BButton, useToast, BFormInput, BFormSelect, BFormSelectOption } from "bootstrap-vue-3"; import { BContainer, BButton, useToast, BFormInput, BFormSelect, BFormSelectOption } from "bootstrap-vue-3";
import { unwrap } from "./util/unwrap"; import { unwrap } from "./util/unwrap";
import { isString } from "lodash"; import { isString } from "lodash-es";
import type { GeneralListItem, GeneralListItemP1 } from "./defs/API/Nation"; import type { GeneralListItem, GeneralListItemP1 } from "./defs/API/Nation";
import { merge2DArrToObjectArr } from "./util/merge2DArrToObjectArr"; import { merge2DArrToObjectArr } from "./util/merge2DArrToObjectArr";
import { convertIterableToMap } from "@/util/convertIterableToMap"; import { convertIterableToMap } from "@/util/convertIterableToMap";
@@ -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>
+1 -1
View File
@@ -190,7 +190,7 @@ import { unwrap } from "@/util/unwrap";
import { onMounted, reactive, ref, watch, computed } from "vue"; import { onMounted, reactive, ref, watch, computed } from "vue";
import type { VoteInfo, VoteDetailResult } from "@/defs/API/Vote"; import type { VoteInfo, VoteDetailResult } from "@/defs/API/Vote";
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
import { isString, range, sum } from "lodash"; import { isString, range, sum } from "lodash-es";
import { formatTime } from "@/util/formatTime"; import { formatTime } from "@/util/formatTime";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
import { formatVoteColor } from "@/utilGame/formatVoteColor"; import { formatVoteColor } from "@/utilGame/formatVoteColor";
+1 -1
View File
@@ -278,7 +278,7 @@ declare const staticValues: {
<script lang="ts" setup> <script lang="ts" setup>
import addMinutes from "date-fns/esm/addMinutes"; import addMinutes from "date-fns/esm/addMinutes";
import { range, trim } from "lodash"; import { range, trim } from "lodash-es";
import { stringifyUrl } from "query-string"; import { stringifyUrl } from "query-string";
import { onMounted, ref, watch } from "vue"; import { onMounted, ref, watch } from "vue";
import { formatTime } from "@util/formatTime"; import { formatTime } from "@util/formatTime";
+11 -1
View File
@@ -22,10 +22,12 @@ import type { SetBlockWarResponse, GeneralListResponse as NationGeneralListRespo
import type { UploadImageResponse } from "./defs/API/Misc"; import type { UploadImageResponse } from "./defs/API/Misc";
import type { GeneralLogType, GetGeneralLogResponse, JoinArgs } from "./defs/API/General"; import type { GeneralLogType, GetGeneralLogResponse, JoinArgs } from "./defs/API/General";
import type { import type {
ExecuteResponse,
GetConstResponse, GetConstResponse,
GetCurrentHistoryResponse, GetCurrentHistoryResponse,
GetDiplomacyResponse, GetDiplomacyResponse,
GetHistoryResponse, GetHistoryResponse,
GetRecentRecordResponse,
} from "./defs/API/Global"; } from "./defs/API/Global";
import type { CachedMapResult, GeneralListResponse, ItemTypeKey, MapResult } from "./defs"; import type { CachedMapResult, GeneralListResponse, ItemTypeKey, MapResult } from "./defs";
import type { VoteDetailResult, VoteListResult } from "./defs/API/Vote"; import type { VoteDetailResult, VoteListResult } from "./defs/API/Vote";
@@ -143,7 +145,15 @@ const apiRealPath = {
>, >,
GetCachedMap: GET as APICallT<undefined, CachedMapResult>, GetCachedMap: GET as APICallT<undefined, CachedMapResult>,
GetDiplomacy: GET as APICallT<undefined, GetDiplomacyResponse>, GetDiplomacy: GET as APICallT<undefined, GetDiplomacyResponse>,
ExecuteEngine: POST as APICallT<undefined, ValidResponse & { updated: boolean }>, ExecuteEngine: POST as APICallT<{
serverID: string | undefined
}, ExecuteResponse, InvalidResponse & {
reqRefresh?: boolean
}>,
GetRecentRecord: GET as APICallT<{
lastGeneralRecordID: number;
lastWorldHistoryID: number;
} | undefined, GetRecentRecordResponse>,
}, },
InheritAction: { InheritAction: {
BuyHiddenBuff: PUT as APICallT<{ BuyHiddenBuff: PUT as APICallT<{
+4 -3
View File
@@ -2,8 +2,9 @@ import $ from 'jquery';
import 'bootstrap'; import 'bootstrap';
import download from 'downloadjs'; import download from 'downloadjs';
import { unwrap } from "@util/unwrap"; import { unwrap } from "@util/unwrap";
import { isInteger } from 'lodash'; import { isInteger } from 'lodash-es';
import { errUnknown, getNpcColor } from '@/common_legacy'; import { errUnknown } from '@/common_legacy';
import { getNPCColor } from './utilGame';
import { combineArray } from "@util/combineArray"; import { combineArray } from "@util/combineArray";
import { isBrightColor } from "@util/isBrightColor"; import { isBrightColor } from "@util/isBrightColor";
import { numberWithCommas } from "@util/numberWithCommas"; import { numberWithCommas } from "@util/numberWithCommas";
@@ -999,7 +1000,7 @@ $(function ($) {
for (const general of generalList) { for (const general of generalList) {
const $item = $(`<option value="${general.no}">${general.name}</option>`); const $item = $(`<option value="${general.no}">${general.name}</option>`);
if (general.npc) { if (general.npc) {
$item.css('color', unwrap(getNpcColor(general.npc))); $item.css('color', unwrap(getNPCColor(general.npc)));
} else { } else {
$item.css('color', 'white'); $item.css('color', 'white');
} }
+1 -1
View File
@@ -79,7 +79,7 @@ function br2nl (text) {
} }
*/ */
export function getNpcColor(npcType: number): 'skyblue' | 'cyan' | 'deepskyblue' | 'darkcyan' | 'mediumaquamarine' | undefined { export function getNPCColor(npcType: number): 'skyblue' | 'cyan' | 'deepskyblue' | 'darkcyan' | 'mediumaquamarine' | undefined {
if (npcType == 6){ if (npcType == 6){
return 'mediumaquamarine'; return 'mediumaquamarine';
} }
+1 -1
View File
@@ -162,7 +162,7 @@ import type { BasicResourceAuctionInfo } from "@/defs/API/Auction";
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import { useToast, BButtonGroup, BButton } from "bootstrap-vue-3"; import { useToast, BButtonGroup, BButton } from "bootstrap-vue-3";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { onMounted, reactive, ref, watch } from "vue"; import { onMounted, reactive, ref, watch } from "vue";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { formatLog } from "@/utilGame/formatLog"; import { formatLog } from "@/utilGame/formatLog";
+6 -3
View File
@@ -51,7 +51,7 @@
<NumberInputWithInfo <NumberInputWithInfo
v-model="bidAmount" v-model="bidAmount"
:int="true" :int="true"
:min="currentAuction.bidList[0].amount" :min="Math.ceil(currentAuction.bidList[0].amount * 1.01)"
:max="currentAuction.remainPoint" :max="currentAuction.remainPoint"
title="" title=""
:step="1" :step="1"
@@ -131,7 +131,7 @@ import type { UniqueItemAuctionDetail, UniqueItemAuctionList } from "@/defs/API/
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import { useToast, BButton } from "bootstrap-vue-3"; import { useToast, BButton } from "bootstrap-vue-3";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { inject, onMounted, ref, watch, type Ref } from "vue"; import { inject, onMounted, ref, watch, type Ref } from "vue";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import type { GameConstStore } from "@/GameConstStore"; import type { GameConstStore } from "@/GameConstStore";
@@ -150,6 +150,9 @@ async function refreshDetail() {
const auctionID = currentAuctionID.value; const auctionID = currentAuctionID.value;
try { try {
currentAuction.value = await SammoAPI.Auction.GetUniqueItemAuctionDetail({ auctionID }); currentAuction.value = await SammoAPI.Auction.GetUniqueItemAuctionDetail({ auctionID });
const bidList = currentAuction.value.bidList;
const highestBidAmount = Math.max(bidList[0].amount, bidList[bidList.length-1].amount);
bidAmount.value = Math.max(bidAmount.value, Math.ceil(highestBidAmount * 1.01));
} catch (e) { } catch (e) {
console.error(e); console.error(e);
if (isString(e)) { if (isString(e)) {
@@ -196,7 +199,7 @@ async function refreshList() {
const auctionIterator = ongoingAuctionList.value.values().next(); const auctionIterator = ongoingAuctionList.value.values().next();
if (!auctionIterator.done) { if (!auctionIterator.done) {
currentAuctionID.value = auctionIterator.value.id; currentAuctionID.value = auctionIterator.value.id;
bidAmount.value = auctionIterator.value.highestBid.amount; bidAmount.value = Math.max(bidAmount.value, Math.ceil(auctionIterator.value.highestBid.amount * 1.01));
} }
} }
} catch (e) { } catch (e) {
+1 -1
View File
@@ -135,7 +135,7 @@ import type { BettingDetailResponse, BettingInfo } from "@/defs/API/Betting";
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
import { joinYearMonth } from "@/util/joinYearMonth"; import { joinYearMonth } from "@/util/joinYearMonth";
import { parseYearMonth } from "@/util/parseYearMonth"; import { parseYearMonth } from "@/util/parseYearMonth";
import { isString, range, sum } from "lodash"; import { isString, range, sum } from "lodash-es";
import { ref, type PropType, watch } from "vue"; import { ref, type PropType, watch } from "vue";
const props = defineProps({ const props = defineProps({
+4 -4
View File
@@ -5,7 +5,7 @@
<div <div
class="col-7 align-self-center" class="col-7 align-self-center"
:style="{ :style="{
color: getNpcColor(officer.npcType ?? 0), color: getNPCColor(officer.npcType ?? 0),
}" }"
> >
{{ officer.name }} {{ officer.name }}
@@ -16,7 +16,7 @@
<div class="d-grid mb-1 py-1 only500px bg1 center"> <div class="d-grid mb-1 py-1 only500px bg1 center">
<div <div
:style="{ :style="{
color: getNpcColor(officer.npcType ?? 0), color: getNPCColor(officer.npcType ?? 0),
fontSize: '1.2em', fontSize: '1.2em',
}" }"
> >
@@ -265,13 +265,13 @@ import { parseYearMonth } from "@util/parseYearMonth";
import { convertSearch초성 } from "@util/convertSearch초성"; import { convertSearch초성 } from "@util/convertSearch초성";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
import DragSelect from "@/components/DragSelect.vue"; import DragSelect from "@/components/DragSelect.vue";
import { isString, range, trim } from "lodash"; import { isString, range, trim } from "lodash-es";
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
import type { CommandItem, TurnObj } from "@/defs"; import type { CommandItem, TurnObj } from "@/defs";
import { QueryActionHelper, type TurnObjWithTime } from "@/util/QueryActionHelper"; import { QueryActionHelper, type TurnObjWithTime } from "@/util/QueryActionHelper";
import type { Args } from "@/processing/args"; import type { Args } from "@/processing/args";
import type { StoredActionsHelper } from "@/util/StoredActionsHelper"; import type { StoredActionsHelper } from "@/util/StoredActionsHelper";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import { BButton, BDropdownItem, BDropdownText, BButtonGroup, BDropdownDivider, BDropdown } from "bootstrap-vue-3"; import { BButton, BDropdownItem, BDropdownText, BButtonGroup, BDropdownDivider, BDropdown } from "bootstrap-vue-3";
import CommandSelectForm from "@/components/CommandSelectForm.vue"; import CommandSelectForm from "@/components/CommandSelectForm.vue";
import SimpleClock from "@/components/SimpleClock.vue"; import SimpleClock from "@/components/SimpleClock.vue";
+113 -91
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";
@@ -160,107 +171,118 @@ import { nextExpLevelRemain } from "@/utilGame/nextExpLevelRemain";
import { formatConnectScore } from "@/utilGame/formatConnectScore"; import { formatConnectScore } from "@/utilGame/formatConnectScore";
import SammoBar from "@/components/SammoBar.vue"; import SammoBar from "@/components/SammoBar.vue";
import { parseTime } from "@/util/parseTime"; import { parseTime } from "@/util/parseTime";
import { clamp } from "lodash"; import { clamp } from "lodash-es";
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<{
general: GeneralListItemP1; general: GeneralListItemP1;
troopInfo?: { troopInfo?: {
leader: GeneralListItemP1; leader: {
city: number;
reservedCommand?: GeneralListItemP1['reservedCommand'];
};
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>
+3 -3
View File
@@ -94,7 +94,7 @@ import type {
CellClickedEvent, CellClickedEvent,
} from "ag-grid-community"; } from "ag-grid-community";
import { ProvidedColumnGroup } from "ag-grid-community"; import { ProvidedColumnGroup } from "ag-grid-community";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import type { import type {
ValueGetterParams, ValueGetterParams,
ValueFormatterFunc, ValueFormatterFunc,
@@ -107,7 +107,7 @@ import SimpleTooltipCell from "@/gridCellRenderer/SimpleTooltipCell.vue";
import GridTooltipCell, { type GridCellInfo } from "@/gridCellRenderer/GridTooltipCell.vue"; import GridTooltipCell, { type GridCellInfo } from "@/gridCellRenderer/GridTooltipCell.vue";
import { formatConnectScore } from "@/utilGame/formatConnectScore"; import { formatConnectScore } from "@/utilGame/formatConnectScore";
import { convertSearch초성 } from "@/util/convertSearch초성"; import { convertSearch초성 } from "@/util/convertSearch초성";
import { isString } from "lodash"; import { isString } from "lodash-es";
import { formatDefenceTrain } from "@/utilGame/formatDefenceTrain"; import { formatDefenceTrain } from "@/utilGame/formatDefenceTrain";
import { BDropdownItem, BDropdownDivider, BButtonGroup, BDropdown, BButton } from "bootstrap-vue-3"; import { BDropdownItem, BDropdownDivider, BButtonGroup, BDropdown, BButton } from "bootstrap-vue-3";
import { unwrap_err } from "@/util/unwrap_err"; import { unwrap_err } from "@/util/unwrap_err";
@@ -523,7 +523,7 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
cellStyle: (val: CellClassParams<GeneralListItem>) => { cellStyle: (val: CellClassParams<GeneralListItem>) => {
const gen = unwrap(val.data); const gen = unwrap(val.data);
const style: StyleValue = { const style: StyleValue = {
color: getNpcColor(gen.npc), color: getNPCColor(gen.npc),
}; };
return style as CellStyle; return style as CellStyle;
}, },
+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>
+1 -1
View File
@@ -30,7 +30,7 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { clamp } from "lodash"; import { clamp } from "lodash-es";
import { ref, watch } from "vue"; import { ref, watch } from "vue";
const props = defineProps({ const props = defineProps({
+1 -1
View File
@@ -41,7 +41,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { clamp } from "lodash"; import { clamp } from "lodash-es";
const imagePath = window.pathConfig.gameImage; const imagePath = window.pathConfig.gameImage;
const props = defineProps<{ const props = defineProps<{
height: 7 | 10; height: 7 | 10;
+1 -1
View File
@@ -352,7 +352,7 @@ import {
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import { getBase64FromFileObject } from "@/util/getBase64FromFileObject"; import { getBase64FromFileObject } from "@/util/getBase64FromFileObject";
import { isObject, isString } from "lodash"; import { isObject, isString } from "lodash-es";
import type { AxiosError } from "axios"; import type { AxiosError } from "axios";
import { SammoAPI } from "@/SammoAPI"; import { SammoAPI } from "@/SammoAPI";
+17
View File
@@ -77,3 +77,20 @@ export type GetDiplomacyResponse = {
diplomacyList: Record<number, Record<number, diplomacyState>>; diplomacyList: Record<number, Record<number, diplomacyState>>;
myNationID: number; myNationID: number;
} }
export type ExecuteResponse = {
result: true;
updated: boolean;
locked: boolean;
lastExecuted: string;
};
export type GetRecentRecordResponse = {
result: true;
history: [number, string][];
global: [number, string][];
general: [number, string][];
flushHistory: 1 | 0;
flushGlobal: 1 | 0;
flushGeneral: 1 | 0;
}
+1 -1
View File
@@ -3,7 +3,7 @@ import { unwrap_any } from '@util/unwrap_any';
import axios from 'axios'; import axios from 'axios';
import { isBrightColor } from "@util/isBrightColor"; import { isBrightColor } from "@util/isBrightColor";
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
import { convertFormData } from '@util/convertFormData'; import { convertFormData } from '@util/convertFormData';
import type { InvalidResponse, NationStaticItem } from '@/defs'; import type { InvalidResponse, NationStaticItem } from '@/defs';
import { escapeHtml } from '@/legacy/escapeHtml'; import { escapeHtml } from '@/legacy/escapeHtml';
+2 -2
View File
@@ -2,7 +2,7 @@ import $ from 'jquery';
import { unwrap } from '@util/unwrap'; import { unwrap } from '@util/unwrap';
import axios from 'axios'; import axios from 'axios';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { getNpcColor } from './common_legacy'; import { getNPCColor } from '@/utilGame';
declare const killturn: number; declare const killturn: number;
declare const autorun_user: undefined|null|{ declare const autorun_user: undefined|null|{
@@ -230,7 +230,7 @@ $(function () {
$obj.css('text-decoration', 'line-through'); $obj.css('text-decoration', 'line-through');
+= 1; += 1;
} }
const colorNPC = getNpcColor(val.NPC); const colorNPC = getNPCColor(val.NPC);
if (colorNPC !== undefined) { if (colorNPC !== undefined) {
$obj.css('color', colorNPC); $obj.css('color', colorNPC);
} }
+1 -1
View File
@@ -1,6 +1,6 @@
import axios from 'axios'; import axios from 'axios';
import $ from 'jquery'; import $ from 'jquery';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { TemplateEngine } from '@util/TemplateEngine'; import { TemplateEngine } from '@util/TemplateEngine';
import type { InvalidResponse } from '@/defs'; import type { InvalidResponse } from '@/defs';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
+1 -1
View File
@@ -7,7 +7,7 @@ import { JQValidateForm, type NamedRules } from '@util/jqValidateForm';
import { convertFormData } from '@util/convertFormData'; import { convertFormData } from '@util/convertFormData';
import { unwrap_any } from '@util/unwrap_any'; import { unwrap_any } from '@util/unwrap_any';
import { mb_strwidth } from '@util/mb_strwidth'; import { mb_strwidth } from '@util/mb_strwidth';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
import { sha512 } from 'js-sha512'; import { sha512 } from 'js-sha512';
import '@/gateway/common'; import '@/gateway/common';
+1 -1
View File
@@ -6,7 +6,7 @@ import type { InvalidResponse } from '@/defs';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { unwrap_any } from '@util/unwrap_any'; import { unwrap_any } from '@util/unwrap_any';
import { sha512 } from 'js-sha512'; import { sha512 } from 'js-sha512';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
import { mb_strwidth } from '@util/mb_strwidth'; import { mb_strwidth } from '@util/mb_strwidth';
import '@/gateway/common'; import '@/gateway/common';
+1 -1
View File
@@ -11,7 +11,7 @@ import { unwrap } from '@util/unwrap';
import { delay } from '@util/delay'; import { delay } from '@util/delay';
import { Modal } from 'bootstrap'; import { Modal } from 'bootstrap';
import '@/gateway/common'; import '@/gateway/common';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
import { SammoRootAPI, type InvalidResponse } from '@/SammoRootAPI'; import { SammoRootAPI, type InvalidResponse } from '@/SammoRootAPI';
import type { LoginFailed, LoginResponse, LoginResponseWithKakao, OTPResponse } from '@/defs/API/Login'; import type { LoginFailed, LoginResponse, LoginResponseWithKakao, OTPResponse } from '@/defs/API/Login';
declare global { declare global {
@@ -10,7 +10,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { GameIActionInfo } from "@/defs/GameObj"; import type { GameIActionInfo } from "@/defs/GameObj";
import type { ValueFormatterParams } from "ag-grid-community"; import type { ValueFormatterParams } from "ag-grid-community";
import { isNumber, isString } from "lodash"; import { isNumber, isString } from "lodash-es";
import { ref, watch, type PropType } from "vue"; import { ref, watch, type PropType } from "vue";
const props = defineProps({ const props = defineProps({
+1 -1
View File
@@ -1,7 +1,7 @@
import Tooltip from "bootstrap/js/dist/tooltip"; import Tooltip from "bootstrap/js/dist/tooltip";
//HACK: 이유는 잘 모르겠지만 bootstrap-vue3에서 bootstrap 호출하는 것과 충돌하여 우회 중 //HACK: 이유는 잘 모르겠지만 bootstrap-vue3에서 bootstrap 호출하는 것과 충돌하여 우회 중
import $ from "jquery"; import $ from "jquery";
import { trim } from "lodash"; import { trim } from "lodash-es";
export function initTooltip($obj?: JQuery<HTMLElement>): void { export function initTooltip($obj?: JQuery<HTMLElement>): void {
if ($obj === undefined) { if ($obj === undefined) {
+1 -1
View File
@@ -1,6 +1,6 @@
import axios from 'axios'; import axios from 'axios';
import $ from 'jquery'; import $ from 'jquery';
import { isNumber, merge } from 'lodash'; import { isNumber, merge } from 'lodash-es';
import { convColorValue, convertDictById, stringFormat } from '@/common_legacy'; import { convColorValue, convertDictById, stringFormat } from '@/common_legacy';
import type { CachedMapResult, InvalidResponse, MapResult } from '@/defs'; import type { CachedMapResult, InvalidResponse, MapResult } from '@/defs';
import { unwrap } from "@util/unwrap"; import { unwrap } from "@util/unwrap";
+1 -1
View File
@@ -6,7 +6,7 @@ import axios from 'axios';
import { convertFormData } from '@util/convertFormData'; import { convertFormData } from '@util/convertFormData';
import { isBrightColor } from "@util/isBrightColor"; import { isBrightColor } from "@util/isBrightColor";
import { unwrap } from '@util/unwrap'; import { unwrap } from '@util/unwrap';
import _ from 'lodash'; import _ from 'lodash-es';
import { addMinutes } from 'date-fns'; import { addMinutes } from 'date-fns';
import { parseTime } from '@util/parseTime'; import { parseTime } from '@util/parseTime';
import { formatTime } from '@util/formatTime'; import { formatTime } from '@util/formatTime';
+2 -2
View File
@@ -55,7 +55,7 @@ import {
type procNationItem, type procNationItem,
type procNationList, type procNationList,
} from "../processingRes"; } from "../processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
const commandName = staticValues.commandName; const commandName = staticValues.commandName;
const searchable = getProcSearchable(); const searchable = getProcSearchable();
@@ -63,7 +63,7 @@ const generalList = ref<procGeneralList>([]);
const selectedGeneralID = ref(0); const selectedGeneralID = ref(0);
function textHelpGeneral(gen: procGeneralItem): string { function textHelpGeneral(gen: procGeneralItem): string {
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
return name; return name;
} }
+2 -2
View File
@@ -55,7 +55,7 @@ import {
type procGeneralKey, type procGeneralKey,
type procGeneralRawItemList, type procGeneralRawItemList,
} from "../processingRes"; } from "../processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
const commandName = staticValues.commandName; const commandName = staticValues.commandName;
const searchable = getProcSearchable(); const searchable = getProcSearchable();
@@ -64,7 +64,7 @@ const generalList = convertGeneralList(procRes.generalsKey, procRes.generals);
const selectedGeneralID = ref(generalList[0].no); const selectedGeneralID = ref(generalList[0].no);
function textHelpGeneral(gen: procGeneralItem): string { function textHelpGeneral(gen: procGeneralItem): string {
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
return `${name} (${gen.leadership}/${gen.strength}/${gen.intel})`; return `${name} (${gen.leadership}/${gen.strength}/${gen.intel})`;
} }
@@ -94,7 +94,7 @@ import {
type procNationItem, type procNationItem,
type procNationList, type procNationList,
} from "../processingRes"; } from "../processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
const commandName = staticValues.commandName; const commandName = staticValues.commandName;
@@ -106,7 +106,7 @@ const toggleZoom = ref(true);
const selectedGeneralID = ref(generalList[0].no); const selectedGeneralID = ref(generalList[0].no);
function textHelpGeneral(gen: procGeneralItem): string { function textHelpGeneral(gen: procGeneralItem): string {
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
return name; return name;
} }
+2 -2
View File
@@ -80,7 +80,7 @@ import {
type procGeneralRawItemList, type procGeneralRawItemList,
type procTroopList, type procTroopList,
} from "../processingRes"; } from "../processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import type { MapResult } from '@/defs'; import type { MapResult } from '@/defs';
import { SammoAPI } from '@/SammoAPI'; import { SammoAPI } from '@/SammoAPI';
import { getGameConstStore, type GameConstStore } from '@/GameConstStore'; import { getGameConstStore, type GameConstStore } from '@/GameConstStore';
@@ -159,7 +159,7 @@ function textHelpGeneral(gen: procGeneralItem): string {
return `,<span style="text-decoration: underline;">${troopName}</span>`; return `,<span style="text-decoration: underline;">${troopName}</span>`;
})(); })();
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
return `${name} [${citiesMap.value.get(unwrap(gen.cityID))?.name}${troops}] (${gen.leadership}/${gen.strength}/${ return `${name} [${citiesMap.value.get(unwrap(gen.cityID))?.name}${troops}] (${gen.leadership}/${gen.strength}/${
gen.intel gen.intel
+2 -2
View File
@@ -70,7 +70,7 @@ import {
type procGeneralKey, type procGeneralKey,
type procGeneralRawItemList, type procGeneralRawItemList,
} from "./processingRes"; } from "./processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
const citiesMap = ref(new Map< const citiesMap = ref(new Map<
number, number,
@@ -90,7 +90,7 @@ const isGold = ref(true);
const selectedGeneralID = ref(generalList[0].no); const selectedGeneralID = ref(generalList[0].no);
function textHelpGeneral(gen: procGeneralItem): string { function textHelpGeneral(gen: procGeneralItem): string {
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
return `${name} (금${unwrap(gen.gold).toLocaleString()}/쌀${unwrap(gen.rice).toLocaleString()}) (${gen.leadership}/${ return `${name} (금${unwrap(gen.gold).toLocaleString()}/쌀${unwrap(gen.rice).toLocaleString()}) (${gen.leadership}/${
gen.strength gen.strength
+2 -2
View File
@@ -40,7 +40,7 @@
</v-multiselect> </v-multiselect>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getNpcColor } from "@/common_legacy"; import { getNPCColor } from "@/utilGame";
import { convertSearch초성 } from "@/util/convertSearch초성"; import { convertSearch초성 } from "@/util/convertSearch초성";
import { isBrightColor } from "@/util/isBrightColor"; import { isBrightColor } from "@/util/isBrightColor";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
@@ -143,7 +143,7 @@ watch(
} }
} }
const nameColor = getNpcColor(gen.npc); const nameColor = getNPCColor(gen.npc);
const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name; const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
const searchText = convertSearch초성(gen.name); const searchText = convertSearch초성(gen.name);
+1 -1
View File
@@ -1,5 +1,5 @@
import { mb_strwidth } from "@/util/mb_strwidth"; import { mb_strwidth } from "@/util/mb_strwidth";
import { isArray, isBoolean, isInteger, isString } from "lodash"; import { isArray, isBoolean, isInteger, isString } from "lodash-es";
const stringArgs = [ const stringArgs = [
+1 -1
View File
@@ -9,7 +9,7 @@ import { unwrap_any } from '@util/unwrap_any';
import { unwrap } from '@util/unwrap'; import { unwrap } from '@util/unwrap';
import { TemplateEngine } from '@util/TemplateEngine'; import { TemplateEngine } from '@util/TemplateEngine';
import { Tooltip } from 'bootstrap'; import { Tooltip } from 'bootstrap';
import { trim } from 'lodash'; import { trim } from 'lodash-es';
type CardItem = { type CardItem = {
uniqueName: string, uniqueName: string,
+3 -3
View File
@@ -2,13 +2,13 @@ import axios from 'axios';
import { errUnknown } from '@/common_legacy'; import { errUnknown } from '@/common_legacy';
import { getIconPath } from "@util/getIconPath"; import { getIconPath } from "@util/getIconPath";
import { TemplateEngine } from "@util/TemplateEngine"; import { TemplateEngine } from "@util/TemplateEngine";
import { getNpcColor } from '@/common_legacy'; import { getNPCColor } from "@/utilGame";
import type { GeneralListResponse, InvalidResponse, PublicGeneralItem } from '@/defs'; import type { GeneralListResponse, InvalidResponse, PublicGeneralItem } from '@/defs';
import { convertFormData } from '@util/convertFormData'; import { convertFormData } from '@util/convertFormData';
import { unwrap_any } from '@util/unwrap_any'; import { unwrap_any } from '@util/unwrap_any';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest'; import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { Tooltip } from 'bootstrap'; import { Tooltip } from 'bootstrap';
import { trim } from 'lodash'; import { trim } from 'lodash-es';
import { SammoAPI } from './SammoAPI'; import { SammoAPI } from './SammoAPI';
import { unwrap } from './util/unwrap'; import { unwrap } from './util/unwrap';
@@ -289,7 +289,7 @@ function printGeneralList(value: GeneralListResponse) {
if (general.reserved == 1) { if (general.reserved == 1) {
general.userCSS = 'color:violet'; general.userCSS = 'color:violet';
} else if (general.npc > 0) { } else if (general.npc > 0) {
general.userCSS = `color:${getNpcColor(general.npc)}`; general.userCSS = `color:${getNPCColor(general.npc)}`;
} }
if (general.ownerName) { if (general.ownerName) {

Some files were not shown because too many files have changed in this diff Show More