Compare commits

...
Author SHA1 Message Date
Hide_D 4ffd7b5bc0 fix: preserve S100 generated NPC stat floor 2026-07-31 05:06:15 +00:00
Hide_D 1e30659bdd test: verify S100 final-growth reselection 2026-07-31 01:19:23 +00:00
Hide_D 162f198f08 fix: stabilize S100 cooldowns and generated NPC growth 2026-07-31 01:11:47 +00:00
Hide_D 191abf83c0 test: isolate S100 inheritance browser logs 2026-07-29 08:51:51 +00:00
Hide_D edfeae5f0f fix: block S100 inheritance stat resets 2026-07-29 08:42:38 +00:00
Hide_D 424184a51a fix: define mixed S100 dex conversion ownership 2026-07-29 07:29:43 +00:00
Hide_D 03a321f95d fix: prevent S100 dex conversion refills 2026-07-29 06:36:33 +00:00
Hide_D e3615fa6bb fix: cap S100 NPC dex growth at forty percent 2026-07-29 05:20:53 +00:00
Hide_D 32991f736d fix: expose S100 event traits to frontend 2026-07-29 05:11:19 +00:00
Hide_D 8b2748d3d4 feat: 재선택 현재 능력치 기준 표시 2026-07-28 16:56:02 +00:00
Hide_D 883080e275 feat: 100기 NPC 동조 및 후보 추첨 기능 개선과 초기 능력치 계산 로직 추가 2026-07-28 16:28:13 +00:00
Hide_D ce807e2564 유니크 획득 확률 조금 더 증가 2026-07-28 16:11:24 +00:00
Hide_D 9a2ac82373 시나리오 문제점 수정 2026-07-28 16:07:21 +00:00
Hide_D 3c35539c16 CreateManyNPC 추가 2026-07-28 16:04:50 +00:00
Hide_D 5ab08403c6 feat: 100기 NPC 동조와 후보 추첨 보완 2026-07-28 16:02:14 +00:00
Hide_D c1ce478d22 feat: exclude prior event seasons from all-star pool 2026-07-28 00:43:46 +00:00
Hide_D d8bf8ba922 feat: expand 100th-season pool through phase 99 2026-07-28 00:29:25 +00:00
Hide_D 95f66e4c39 feat: add 100th-season all-star growth event 2026-07-25 10:46:23 +00:00
Hide_D 4de7ebec17 요양 깃수 추가 2026-03-04 14:16:08 +00:00
Hide_D d43dff35fb fix: 디버그 코드 복구 2026-02-18 18:54:46 +00:00
Hide_D 5b13f8bd30 ip 기록 2026-02-17 22:31:08 +09:00
Hide_D e51bc6f711 fix: 턴 데몬에 cookie jar 적용 2026-02-17 20:35:15 +09:00
Hide_D 1b08aa0c58 wip: 디버그 코드 추가 2026-02-17 19:12:28 +09:00
Hide_D f2547fe207 dbg 2026-02-17 18:32:04 +09:00
류화영 cec7726731 fix: 방랑군이 빈번하게 해산하는 문제 해결 시도 2026-01-19 22:50:11 +09:00
Hide_D d679a6fed8 fix: InheritancePointManager 버그 수정 2025-11-01 17:38:02 +00:00
Hide_D 6fe156eb7c fix: composer uninstall 누락 2025-10-29 13:00:46 +00:00
Hide_D 663ddbe76a fix: inheritance_result 작성 문제 2025-10-28 20:24:25 +00:00
Hide_D 30297454f7 refac: inheritance_result로 데이터 이관 2025-10-28 20:15:05 +00:00
Hide_D bc602722bf feat: schema에 inheritance_result 추가
- storage에 의미없이 쌓이는 데이터 이관
2025-10-28 20:09:30 +00:00
Hide_D be8f147216 dep: brandonwamboldt/utilphp 제거 2025-10-28 19:56:02 +00:00
Hide_D b9495fb64a refac: 턴 데몬 전체를 async로 변경경 2025-10-07 20:05:55 +09:00
Hide_D 07b217b290 fix: 서버 오픈 핸들러를 00초에 맞추도록 변경경 2025-10-07 19:54:24 +09:00
Hide_D 42fac46062 refac: brandonwamboldt/utilphp 의존 코드 수정
- 실제 의존성 제거는 이후에에
2025-10-07 19:26:22 +09:00
Hide_D 24bc8985d0 __filename 2025-10-04 11:39:35 +00:00
Hide_D 76a2d5ff63 daemon typescript 버전 추가 2025-10-04 11:29:03 +00:00
Hide_D 148f32f78b fix: execute engine updated 2025-10-04 11:04:36 +00:00
Hide_D 62f5b6597e proc.php 일부 수정
- api.php 미사용 경로 대비
2025-10-04 10:59:56 +00:00
Hide_D 7e810b0279 LogText 끄기 2025-09-07 06:01:04 +00:00
Hide_D 2336b29b65 fix: ?? 2025-08-30 06:15:25 +00:00
Hide_D 185c0e16a0 fix: AI 일부 key 접근 문제 수정 2025-08-30 06:11:37 +00:00
Hide_D 656baeb9ee fix: 토너먼트 분노 공격 확률 오류 수정 (#263)
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/263
2025-08-23 10:08:13 +09:00
류화영 3e06304dc7 fix: 토너먼트 분노 공격 확률 오류 수정 2025-08-23 09:23:00 +09:00
Hide_D 4bb940c8c5 fix: ?? 연산자 우선순위 2025-08-20 12:59:40 +00:00
Hide_D 2b376b6aab fix: logError 버그 수정 2025-07-06 06:15:18 +00:00
Hide_D 04df26ff83 misc: 군웅할거 손견 국명 손책으로 변경
- 서버 시작 시점에서 손견은 맞으나, 땅따 시작점에는 손책임
2025-06-28 12:37:16 +00:00
Hide_D aca4240b92 game: 강서유서 월드로 명칭 변경 2025-06-26 18:37:42 +00:00
Hide_D faf26fa8a2 game: 강서유서 소설 월드(비세력) 수정 2025-06-26 18:36:19 +00:00
Hide_D 030ab1e7ea game: 군웅축록 연도 수정 2025-06-26 18:25:14 +00:00
Hide_D 7f2c1d4782 game: 역사모드4-2 황제 원술
- 제작자: 강서유서
- 유비가 서주를 가지고 있어야 원술을 치지 않나?
2025-06-26 18:23:36 +00:00
Hide_D 9132138a99 game: 군웅축록 외교 2025-06-26 17:54:32 +00:00
Hide_D 84875d60bd game: 역사모드2-2 반동탁연합 결성(정사)
- 제작자: 강서유서
2025-06-26 17:51:39 +00:00
Hide_D 3cbaf76626 game: 역사모드3-2 군웅축록
- 제작자: 강서유서
2025-06-26 17:26:26 +00:00
Hide_D f4846d0d66 game: 무한대흥 NPC 능력치 감소 2025-06-25 15:07:52 +00:00
Hide_D f183dcc72b frontend: 기술 제한 표기 수정 2025-06-25 14:16:19 +00:00
Hide_D 63cc5d8e88 game: 무한대흥 초기 성수 3천 2025-06-25 13:58:47 +00:00
Hide_D f858c32fdf feat: 점령 후 일반 도시 성벽 수치 조정 가능 2025-06-25 13:58:29 +00:00
Hide_D 60eb127d71 game: 천지비급 상인 등장 2025-06-25 13:54:47 +00:00
Hide_D ede33f3a37 game: ban 메시지 빈도 감소 2025-06-25 13:53:36 +00:00
Hide_D ffd53a2390 game: 무한대흥 스탯 2025-06-25 13:20:21 +00:00
Hide_D 2591fbde67 game: 무한대흥 시나리오 2025-06-25 13:12:41 +00:00
Hide_D 922d3f1938 feat: 기술 등급 제한 수치 유연화 2025-06-25 13:12:32 +00:00
Hide_D 64522ba8a6 fix: ChangeCity에서 _max 키 입력 가능하게 2025-06-25 13:09:24 +00:00
Hide_D 7b1eedb574 feat: ChangeCity에 최대 내정 수치도 연산자로 바꿀 수 있도록 2025-06-25 12:31:29 +00:00
Hide_D 7ec6ca605f run_daemon timeout 2025-05-28 13:55:30 +00:00
Hide_D 5a5c613814 game: 랜임 확률 보정 완화
- 강국의 디버프 감소소
2025-03-05 17:35:08 +00:00
Hide_D 1a3ef20a35 fix: 다병종 밸런스 누락분 수정정 2025-02-08 13:54:01 +00:00
Hide_D fba966177d fix: 고급모드 연구턴 커맨드 창 넘치는 문제 2025-01-25 19:52:28 +00:00
Hide_D 62c72dfdbe fix: 척사 버그 수정 2025-01-24 15:26:56 +09:00
Hide_D 1ae1ff9b72 refac,fix: reqTech, reqRegions, reqCities 간이 호출 추가 2025-01-24 15:23:13 +09:00
Hide_D c1e12c2737 fix: 버그 수정 2025-01-24 15:19:23 +09:00
Hide_D de09a66d6f fix: 병종 연구 커맨드에서 금쌀 검새 안하는 문제 해결 2025-01-24 10:07:56 +09:00
Hide_D 3c2012da46 fix: 사령턴에서 불가능한 턴이 별도 강조가 없는 문제 수정 2025-01-23 17:32:36 +00:00
Hide_D d55be54320 fix: 연구커맨드 검사 조건 2025-01-23 17:27:20 +00:00
Hide_D dcbefa1a96 fix: 연구 커맨드에 금쌀 표기 없음 2025-01-23 17:20:10 +00:00
Hide_D be8f1fff96 fix: 버그 수정 2025-01-23 17:17:37 +00:00
Hide_D 6117dbdcc0 fix: 이벤트 다병종 화시병 위치 2025-01-23 17:14:35 +00:00
Hide_D 0a39ba1023 fix: NPC AI가 현재 병종 기술등급을 고려하지 않는 문제 수정
- 아직 사용하지 않는 징병 페이지 요구 기술 항목도 수정
2025-01-23 17:13:11 +00:00
Hide_D dae5f65baa fix: 특성초토화시에만 did_특성초토화 증가 2025-01-23 17:08:50 +00:00
Hide_D 080bb30103 fix: 버그수정2 2025-01-22 19:42:43 +00:00
Hide_D 9e647c7ce5 fix: 도시 규모조건 징병 불가 2025-01-22 19:41:20 +00:00
Hide_D 73606b0fb4 feat: 초토화시 내부 카운트 추가 2025-01-22 18:54:23 +00:00
Hide_D e62eb36cc2 feat: event 연구 커맨드 추가 2025-01-22 18:53:08 +00:00
Hide_D 6b81f744d4 feat: event용 연구 추가 2025-01-22 18:41:24 +00:00
Hide_D 1a9b3b78cb fix: 화륜차 조건 추가 2025-01-22 18:40:59 +00:00
Hide_D c3cbf956d0 fix: 병종 조건에서 같은 키가 여러개인 경우 대비 2025-01-22 18:40:49 +00:00
Hide_D 91188c555d fix: 커맨드의 aux값값 2025-01-22 18:16:37 +00:00
Hide_D 913028dd6c fix: 병종 특성관련 발생 버그 수정 2025-01-22 18:08:18 +00:00
Hide_D dfb3f6478d game(wip): 다병종 시나리오에 병종 지정 2025-01-22 17:56:17 +00:00
Hide_D 6afc6221d3 feat: 특정 등급 이상 도시 보유 조건 추가 2025-01-22 17:48:49 +00:00
Hide_D 7b5a02487e misc: ReqCitiesWithCityLevel 설명 보완 2025-01-22 17:36:17 +00:00
Hide_D 533b79762e game(wip): 다병종 깃수 준비 2025-01-22 17:29:58 +00:00
Hide_D 53b7dbfdd0 feat: 병종 징병 조건 추가
- 군주 및 수뇌
- 군주 및 수뇌 아님
- 도시의 규모 요구
- 특정 Nation Aux 값 요구
2025-01-22 17:17:30 +00:00
Hide_D fd14c5403b feat: NationAuxKey Enum 2025-01-22 16:57:23 +00:00
Hide_D dc476e73a1 feat: 병종 검사에서 $nation['aux']를 정식 입력 2025-01-22 16:54:27 +00:00
Hide_D e60150705e refac: Constraint의 generalObj destGeneralObj로 General 객체 입력 2025-01-22 16:53:39 +00:00
Hide_D 2869ba5c42 feat,refac: GameUnitConstraint 개념 추가
- GameUnitDetail의 요구 기술, 지역, 도시, 연도를 GameUnitConstraint로 통합
- GameUnitConstraint는 조건 검사, 설명 제공
- 병종 정의를 GameUnitConstraint 이용 재정의
- test 함수에 General 객체 요구,
- test 함수의 ownCities에 단순 도시 외 도시 정보 추가
- 변경된 값에 맞게 호출 함수 변경
2025-01-22 16:26:15 +00:00
148 changed files with 127557 additions and 2022 deletions
-1
View File
@@ -12,7 +12,6 @@
} }
}, },
"require": { "require": {
"brandonwamboldt/utilphp": "^1.1",
"sergeytsalkov/meekrodb": "^2.5", "sergeytsalkov/meekrodb": "^2.5",
"league/plates": "^3.5", "league/plates": "^3.5",
"vlucas/valitron": "^1.4", "vlucas/valitron": "^1.4",
Generated
+2 -52
View File
@@ -4,58 +4,8 @@
"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": "deed9afdc95bc42f84784df67d295223", "content-hash": "7edae9b6be35e66ffd0d180f5fac6679",
"packages": [ "packages": [
{
"name": "brandonwamboldt/utilphp",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/brandonwamboldt/utilphp.git",
"reference": "36c32efc4f0679c05163464a550f45c8d83fe683"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brandonwamboldt/utilphp/zipball/36c32efc4f0679c05163464a550f45c8d83fe683",
"reference": "36c32efc4f0679c05163464a550f45c8d83fe683",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
"satooshi/php-coveralls": "dev-master"
},
"type": "library",
"autoload": {
"psr-0": {
"utilphp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Brandon Wamboldt",
"email": "brandon.wamboldt@gmail.com"
}
],
"description": "util.php is a collection of useful functions and snippets that you need or could use every day, designed to avoid conflicts with existing projects",
"homepage": "https://github.com/brandonwamboldt/utilphp",
"keywords": [
"collection",
"helpers",
"php",
"utility"
],
"support": {
"issues": "https://github.com/brandonwamboldt/utilphp/issues",
"source": "https://github.com/brandonwamboldt/utilphp/tree/master"
},
"time": "2015-02-02T17:56:14+00:00"
},
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.12.1", "version": "0.12.1",
@@ -5721,5 +5671,5 @@
"platform-overrides": { "platform-overrides": {
"php": "8.3" "php": "8.3"
}, },
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }
+4 -1
View File
@@ -99,7 +99,10 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
$err = str_replace(ROOT, '{ROOT}', $err); $err = str_replace(ROOT, '{ROOT}', $err);
$errstr = str_replace(ROOT, '{ROOT}', $errstr); $errstr = str_replace(ROOT, '{ROOT}', $errstr);
$errpath = str_replace(ROOT, '{ROOT}', $errpath); $errpath = str_replace(ROOT, '{ROOT}', $errpath);
$trace = array_map(function (string $text) { $trace = array_map(function (string|array $text) {
if (is_array($text)) {
$text = Json::encode($text);
}
return str_replace(ROOT, '{ROOT}', $text); return str_replace(ROOT, '{ROOT}', $text);
}, $trace); }, $trace);
+1 -1
View File
@@ -31,7 +31,7 @@ $queryMap = [
]; ];
if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) { if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
$reqQueryType = Util::array_first_key($queryMap); $reqQueryType = array_key_first($queryMap);
} }
//로그인 검사 //로그인 검사
+4 -1
View File
@@ -243,11 +243,14 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
"SELECT nation,no,name,owner_name as ownerName, owner, picture, imgsvr, "SELECT nation,no,name,owner_name as ownerName, owner, picture, imgsvr,
experience, dedication, experience, dedication,
dex1, dex2, dex3, dex4, dex5, dex1, dex2, dex3, dex4, dex5,
horse, weapon, book, item horse, weapon, book, item, aux
FROM general WHERE %l", FROM general WHERE %l",
$btn == "NPC 보기" ? "npc>=2" : "npc<2" $btn == "NPC 보기" ? "npc>=2" : "npc<2"
) as $general) { ) as $general) {
$generalID = $general['no']; $generalID = $general['no'];
foreach (['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey) {
$general[$dexKey] = CentennialAllStarGrowthService::recordableRawValue($general, $dexKey);
}
$general['bgColor'] = $nationColor[$general['nation']] ?? GameConst::$basecolor4; $general['bgColor'] = $nationColor[$general['nation']] ?? GameConst::$basecolor4;
$general['fgColor'] = newColor($general['bgColor']); $general['fgColor'] = newColor($general['bgColor']);
$general['nationName'] = $nationName[$general['nation']]; $general['nationName'] = $nationName[$general['nation']];
+18 -4
View File
@@ -22,8 +22,6 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']); $gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
increaseRefresh("내정보", 1);
$me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog); $me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
$myset = $me->getVar('myset'); $myset = $me->getVar('myset');
@@ -41,8 +39,24 @@ $lastRefresh = $db->queryFirstField(
$generalID $generalID
); );
$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart); $nextChange = $me->getAuxVar('next_change');
if (!is_string($nextChange) || $nextChange === '') {
$nextChange = null;
}
increaseRefresh("내정보", 1);
if ($gameStor->turntime <= $gameStor->opentime) { if ($gameStor->turntime <= $gameStor->opentime) {
$targetTime = $me->getAuxVar('prestart_delete_after');
if (!is_string($targetTime) || $targetTime === '') {
$targetTime = addTurn(
$lastRefresh ?: TimeUtil::now(),
$gameStor->turnterm,
GameConst::$minTurnDieOnPrestart
);
$me->setAuxVar('prestart_delete_after', $targetTime);
$me->applyDB($db);
}
//서버 가오픈시 할 수 있는 행동 //서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0 && $me->getNationID() == 0) { if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
$showDieOnPrestartBtn = true; $showDieOnPrestartBtn = true;
@@ -174,7 +188,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<?php endif; ?> <?php endif; ?>
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?> <?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
다른 장수 선택 (<?= substr($me->getAuxVar('next_change') ?? TimeUtil::now(), 0, 19) ?> 부터)<br> 다른 장수 선택 (<?= $nextChange ? substr($nextChange, 0, 19) : '지금' ?>부터)<br>
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br> <a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br>
<?php endif; ?> <?php endif; ?>
+16
View File
@@ -51,6 +51,22 @@
display: none; display: none;
} }
.picture_choice {
margin: 8px auto;
}
.picture_choice label,
.event_picture label {
display: inline-flex;
align-items: center;
gap: 4px;
margin: 4px 8px;
}
.picture_choice img {
object-fit: cover;
}
.custom_picture { .custom_picture {
display: none; display: none;
} }
+4 -1
View File
@@ -1047,7 +1047,7 @@ function increaseRefresh($type = "", $cnt = 1)
$logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql'); $logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
$ip = $_SERVER['REMOTE_ADDR'] ?? 'local'; $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? 'local';
$date = date('Y-m-d H:i:s'); $date = date('Y-m-d H:i:s');
$logDB->insert('api_log', [ $logDB->insert('api_log', [
@@ -1403,6 +1403,9 @@ function CheckHall($no)
if ($valueType === 'natural') { if ($valueType === 'natural') {
$value = $generalObj->getVar($typeName); $value = $generalObj->getVar($typeName);
if (in_array($typeName, ['dex1', 'dex2', 'dex3', 'dex4', 'dex5'], true)) {
$value = CentennialAllStarGrowthService::recordableValue($generalObj, $typeName);
}
} else if ($valueType === 'rank') { } else if ($valueType === 'rank') {
$value = $generalObj->getRankVar(RankColumn::from($typeName)); $value = $generalObj->getRankVar(RankColumn::from($typeName));
} else if ($valueType === 'calc') { } else if ($valueType === 'calc') {
+1 -1
View File
@@ -686,7 +686,7 @@ function TechLimit($startYear, $year, $tech) : bool {
$relYear = $year - $startYear; $relYear = $year - $startYear;
$relMaxTech = Util::valueFit( $relMaxTech = Util::valueFit(
floor($relYear / 5) + 1, floor($relYear / GameConst::$techLevelIncYear) + GameConst::$initialAllowedTechLevel,
1, 1,
GameConst::$maxTechLevel GameConst::$maxTechLevel
); );
+1 -1
View File
@@ -559,7 +559,7 @@ function checkStatistic()
$nationHist = ''; $nationHist = '';
foreach (GameConst::$availableNationType as $nationType) { foreach (GameConst::$availableNationType as $nationType) {
if (!Util::array_get($nationHists[$nationType])) { if (!($nationHists[$nationType] ?? null)) {
$nationHists[$nationType] = '-'; $nationHists[$nationType] = '-';
} }
$nationHist .= getNationType($nationType) . "({$nationHists[$nationType]}), "; $nationHist .= getNationType($nationType) . "({$nationHists[$nationType]}), ";
+2 -2
View File
@@ -138,7 +138,7 @@ function JSCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): array{
$distanceList = searchDistance($cityNo, $maxDistance, true); $distanceList = searchDistance($cityNo, $maxDistance, true);
$result = []; $result = [];
for ($dist = 1; $dist <= $maxDistance; $dist++) { for ($dist = 1; $dist <= $maxDistance; $dist++) {
$result[$dist] = Util::array_get($distanceList[$dist], []); $result[$dist] = $distanceList[$dist] ?? [];
} }
return $result; return $result;
} }
@@ -152,7 +152,7 @@ function printCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): string
for ($dist = 1; $dist <= $maxDistance; $dist++) { for ($dist = 1; $dist <= $maxDistance; $dist++) {
$cityList = array_map(function ($cityID) { $cityList = array_map(function ($cityID) {
return CityConst::byID($cityID)->name; return CityConst::byID($cityID)->name;
}, Util::array_get($distanceList[$dist], [])); }, $distanceList[$dist] ?? []);
$cityStr = join(', ', $cityList); $cityStr = join(', ', $cityList);
+7 -3
View File
@@ -1153,21 +1153,25 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
]; ];
//막판 분노 //막판 분노
$factor1 = 1.0;
$factor2 = 1.0;
$ratio = rand() % 300; $ratio = rand() % 300;
if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) { if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) {
$damage2 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500% $factor2 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical1 = 1; $critical1 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]); $str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!"; $log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!";
} }
$ratio = rand() % 300; $ratio = rand() % 300;
if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) { if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) {
$damage1 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500% $factor1 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical2 = 1; $critical2 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]); $str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!"; $log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!";
} }
$damage1 *= $factor1;
$damage2 *= $factor2;
//1합 승부 //1합 승부
if ($phase == 1) { if ($phase == 1) {
+22 -4
View File
@@ -10,7 +10,23 @@ function sortTokens(&$tokens){
}); });
} }
function putInfoText(&$info){ function putInfoText(&$info, ?array $currentTargetEnv){
if (($info['event100Growth'] ?? false) === true) {
if ($currentTargetEnv === null) {
$displayStats = CentennialAllStarGrowthService::calculateUserInitialStats($info);
$info['selectionStatLabel'] = '시작 능력치';
} else {
$displayStats = CentennialAllStarGrowthService::calculateUserCurrentTargetStats(
$info,
$currentTargetEnv
);
$info['selectionStatLabel'] = '현재 변경 기준 능력치';
}
$info['selectionLeadership'] = $displayStats['leadership'];
$info['selectionStrength'] = $displayStats['strength'];
$info['selectionIntel'] = $displayStats['intel'];
}
if(key_exists('specialDomestic', $info)){ if(key_exists('specialDomestic', $info)){
$class = buildGeneralSpecialDomesticClass($info['specialDomestic']); $class = buildGeneralSpecialDomesticClass($info['specialDomestic']);
$info['specialDomesticName'] = $class->getName(); $info['specialDomesticName'] = $class->getName();
@@ -34,7 +50,8 @@ $now = $oNow->format('Y-m-d H:i:s');
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$npcmode = $gameStor->getValue('npcmode'); $eventEnv = $gameStor->getValues(['npcmode', 'startyear', 'year', 'month']);
$npcmode = $eventEnv['npcmode'];
if($npcmode!=2){ if($npcmode!=2){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
@@ -43,6 +60,7 @@ if($npcmode!=2){
} }
$rawGeneral = $db->queryFirstRow('SELECT no, aux FROM general WHERE `owner` = %i', $userID); $rawGeneral = $db->queryFirstRow('SELECT no, aux FROM general WHERE `owner` = %i', $userID);
$currentTargetEnv = $rawGeneral ? $eventEnv : null;
if($rawGeneral){ if($rawGeneral){
$generalAux = Json::decode($rawGeneral['aux']); $generalAux = Json::decode($rawGeneral['aux']);
if(key_exists('next_change', $generalAux)&& $generalAux['next_change'] > $now){ if(key_exists('next_change', $generalAux)&& $generalAux['next_change'] > $now){
@@ -62,7 +80,7 @@ if($tokens){
foreach($tokens as $token){ foreach($tokens as $token){
$valid_until = $token['reserved_until']; $valid_until = $token['reserved_until'];
$info = Json::decode($token['info']); $info = Json::decode($token['info']);
putInfoText($info); putInfoText($info, $currentTargetEnv);
$info['uniqueName'] = $token['unique_name']; $info['uniqueName'] = $token['unique_name'];
$pick[] = $info; $pick[] = $info;
} }
@@ -83,7 +101,7 @@ $valid_until = null;
foreach(pickGeneralFromPool($db, $rng, $userID, 14) as $pickObj){ foreach(pickGeneralFromPool($db, $rng, $userID, 14) as $pickObj){
$valid_until = $pickObj->getValidUntil(); $valid_until = $pickObj->getValidUntil();
$info = $pickObj->getInfo(); $info = $pickObj->getInfo();
putInfoText($info); putInfoText($info, $currentTargetEnv);
$pick[] = $info; $pick[] = $info;
} }
sortTokens($pick);//좀 무식하지만.. sortTokens($pick);//좀 무식하지만..
+1 -1
View File
@@ -144,7 +144,7 @@ function do도시임명(General $general, int $cityID, int $targetOfficerLevel):
return '올바르지 않은 도시입니다'; return '올바르지 않은 도시입니다';
} }
if ($general->getVar(GeneralColumn::officer_level) >= 4 && $myPenalty[PenaltyKey::NoChiefChange->value] ?? false) { if ($general->getVar(GeneralColumn::officer_level) >= 4 && ($myPenalty[PenaltyKey::NoChiefChange->value] ?? false)) {
return '수뇌인 장수를 변경할 수 없는 상태입니다.'; return '수뇌인 장수를 변경할 수 없는 상태입니다.';
} }
+1 -1
View File
@@ -41,7 +41,7 @@ $penaltyInfo = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefi
$penalty = []; $penalty = [];
foreach($penaltyInfo as $penaltyKey => $penaltyValue){ foreach($penaltyInfo as $penaltyKey => $penaltyValue){
if($penaltyValue['expire'] ?? 0 > TimeUtil::now()){ if(($penaltyValue['expire'] ?? 0) > TimeUtil::now()){
$penalty[$penaltyKey] = $penaltyValue['value']; $penalty[$penaltyKey] = $penaltyValue['value'];
} }
} }
+83 -7
View File
@@ -8,10 +8,20 @@ WebUtil::requireAJAX();
$pick = Util::getPost('pick'); $pick = Util::getPost('pick');
$leadership = Util::getPost('leadership', 'int', GameConst::$defaultStatMin); $leadership = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$strength = Util::getPost('leadership', 'int', GameConst::$defaultStatMin); $isCentennialAllStar = CentennialAllStarGrowthService::isActive();
$intel = Util::getPost('leadership', 'int', GameConst::$defaultStatMin); $strength = Util::getPost(
$isCentennialAllStar ? 'strength' : 'leadership',
'int',
GameConst::$defaultStatMin
);
$intel = Util::getPost(
$isCentennialAllStar ? 'intel' : 'leadership',
'int',
GameConst::$defaultStatMin
);
$personal = Util::getPost('personal', 'string', null); $personal = Util::getPost('personal', 'string', null);
$use_own_picture = Util::getPost('use_own_picture', 'bool', false); $use_own_picture = Util::getPost('use_own_picture', 'bool', false);
$pictureSource = Util::getPost('picture_source', 'string', 'selected');
if(!$pick){ if(!$pick){
@@ -60,13 +70,36 @@ if(!$selectInfo){
} }
$selectInfo = Json::decode($selectInfo); $selectInfo = Json::decode($selectInfo);
$ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID); $ownerInfo = RootDB::db()->queryFirstRow(
'SELECT `name`,`picture`,`imgsvr`,`grade` FROM member WHERE `NO`=%i',
$userID
);
if(!$ownerInfo){ if(!$ownerInfo){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.' 'reason'=>'멤버 정보를 가져오지 못했습니다.'
]); ]);
} }
if ($isCentennialAllStar) {
if (!in_array($pictureSource, ['selected', 'own'], true)) {
Json::die([
'result' => false,
'reason' => '올바르지 않은 전콘 선택입니다.',
]);
}
if ($pictureSource === 'own') {
$canUseOwnPicture = in_array('picture', GameConst::$generalPoolAllowOption, true)
&& $env['show_img_level'] >= 1
&& $ownerInfo['grade'] >= 1
&& $ownerInfo['picture'] !== '';
if (!$canUseOwnPicture) {
Json::die([
'result' => false,
'reason' => '사용할 수 있는 내 전콘이 없습니다.',
]);
}
}
}
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2'); $gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
@@ -80,12 +113,25 @@ if ($gencount >= $maxgeneral) {
$poolClass = getGeneralPoolClass(GameConst::$targetGeneralPool); $poolClass = getGeneralPoolClass(GameConst::$targetGeneralPool);
/** @var AbsGeneralPool */ /** @var AbsGeneralPool */
$pickedGeneral = new $poolClass($db, $selectInfo, $now); if ($isCentennialAllStar) {
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'selectPickedGeneral',
$userID,
$pick
)));
$pickedGeneral = new $poolClass($db, $rng, $selectInfo, $now);
} else {
$pickedGeneral = new $poolClass($db, $selectInfo, $now);
}
$builder = $pickedGeneral->getGeneralBuilder(); $builder = $pickedGeneral->getGeneralBuilder();
if ($isCentennialAllStar) {
CentennialAllStarGrowthService::prepareInitialUser($builder, $selectInfo);
}
foreach(GameConst::$generalPoolAllowOption as $allowOption){ foreach(GameConst::$generalPoolAllowOption as $allowOption){
if($allowOption == 'stat'){ if($allowOption == 'stat' && !$isCentennialAllStar){
$leadership = Util::valueFit($leadership, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $leadership = Util::valueFit($leadership, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$strength = Util::valueFit($strength, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $strength = Util::valueFit($strength, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$intel = Util::valueFit($intel, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $intel = Util::valueFit($intel, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
@@ -98,14 +144,23 @@ foreach(GameConst::$generalPoolAllowOption as $allowOption){
} }
$builder->setStat($leadership, $strength, $intel); $builder->setStat($leadership, $strength, $intel);
} }
else if($allowOption == 'picture' && $use_own_picture){ else if(
$allowOption == 'picture'
&& (
(!$isCentennialAllStar && $use_own_picture)
|| ($isCentennialAllStar && $pictureSource === 'own')
)
){
$builder->setPicture($ownerInfo['imgsvr'], $ownerInfo['picture']); $builder->setPicture($ownerInfo['imgsvr'], $ownerInfo['picture']);
} }
else if($allowOption == 'ego'){ else if($allowOption == 'ego'){
if(!$personal || $personal == 'Random'){ if(!$personal || $personal == 'Random'){
$personal = Util::choiceRandom(GameConst::$availablePersonality); $personal = Util::choiceRandom(GameConst::$availablePersonality);
} }
if(!array_search($personal, GameConst::$availablePersonality)){ $invalidPersonal = $isCentennialAllStar
? !in_array($personal, GameConst::$availablePersonality, true)
: !array_search($personal, GameConst::$availablePersonality);
if($invalidPersonal){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'올바르지 않은 성격입니다.' 'reason'=>'올바르지 않은 성격입니다.'
@@ -122,7 +177,28 @@ $builder->setOwnerName($userNick);
$builder->setKillturn(5); $builder->setKillturn(5);
$builder->setNPCType(0); $builder->setNPCType(0);
$builder->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $env['turnterm'])); $builder->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $env['turnterm']));
$builder->setAuxVar(
'prestart_delete_after',
addTurn($now, $env['turnterm'], GameConst::$minTurnDieOnPrestart)
);
$builder->fillRemainSpecAsZero($env); $builder->fillRemainSpecAsZero($env);
if ($isCentennialAllStar) {
$candidateCities = $db->queryFirstColumn(
'SELECT city FROM city WHERE level >= 5 AND level <= 6 AND nation = 0'
);
if (!$candidateCities) {
$candidateCities = $db->queryFirstColumn(
'SELECT city FROM city WHERE level >= 5 AND level <= 6'
);
}
if (!$candidateCities) {
Json::die([
'result' => false,
'reason' => '장수를 생성할 소·중성이 없습니다.',
]);
}
$builder->setCityID($rng->choice($candidateCities));
}
$builder->build($env); $builder->build($env);
$generalID = $builder->getGeneralID(); $generalID = $builder->getGeneralID();
if(!$generalID){ if(!$generalID){
+1 -1
View File
@@ -88,7 +88,7 @@ $penaltyInfo = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefi
$penalty = []; $penalty = [];
foreach ($penaltyInfo as $penaltyKey => $penaltyValue) { foreach ($penaltyInfo as $penaltyKey => $penaltyValue) {
if ($penaltyValue['expire'] ?? 0 > TimeUtil::now()) { if (($penaltyValue['expire'] ?? 0) > TimeUtil::now()) {
$penalty[$penaltyKey] = $penaltyValue['value']; $penalty[$penaltyKey] = $penaltyValue['value'];
} }
} }
+76 -24
View File
@@ -7,6 +7,7 @@ include "func.php";
WebUtil::requireAJAX(); WebUtil::requireAJAX();
$pick = Util::getPost('pick'); $pick = Util::getPost('pick');
$pictureSource = Util::getPost('picture_source', 'string', 'selected');
if(!$pick){ if(!$pick){
Json::die([ Json::die([
@@ -35,10 +36,20 @@ if(!$generalID){
list( list(
$year, $year,
$month, $month,
$startYear,
$maxgeneral, $maxgeneral,
$npcmode, $npcmode,
$turnterm $turnterm,
) = $gameStor->getValuesAsArray(['year', 'month', 'maxgeneral', 'npcmode', 'turnterm']); $showImgLevel
) = $gameStor->getValuesAsArray([
'year',
'month',
'startyear',
'maxgeneral',
'npcmode',
'turnterm',
'show_img_level',
]);
if($npcmode!=2){ if($npcmode!=2){
Json::die([ Json::die([
@@ -55,7 +66,10 @@ if(!$info){
]); ]);
} }
$ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID); $ownerInfo = RootDB::db()->queryFirstRow(
'SELECT `name`,`picture`,`imgsvr`,`grade` FROM member WHERE `NO`=%i',
$userID
);
if(!$ownerInfo){ if(!$ownerInfo){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
@@ -64,6 +78,27 @@ if(!$ownerInfo){
} }
$info = Json::decode($info); $info = Json::decode($info);
$isCentennialAllStar = CentennialAllStarGrowthService::isActive();
if ($isCentennialAllStar) {
if (!in_array($pictureSource, ['current', 'own', 'selected'], true)) {
Json::die([
'result' => false,
'reason' => '올바르지 않은 전콘 선택입니다.',
]);
}
if ($pictureSource === 'own') {
$canUseOwnPicture = in_array('picture', GameConst::$generalPoolAllowOption, true)
&& $showImgLevel >= 1
&& $ownerInfo['grade'] >= 1
&& $ownerInfo['picture'] !== '';
if (!$canUseOwnPicture) {
Json::die([
'result' => false,
'reason' => '사용할 수 있는 내 전콘이 없습니다.',
]);
}
}
}
$generalObj = General::createObjFromDB($generalID); $generalObj = General::createObjFromDB($generalID);
@@ -101,34 +136,51 @@ $db->update('select_pool',[
'reserved_until'=>null, 'reserved_until'=>null,
], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now); ], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now);
if(key_exists('leadership', $info)){ if ($isCentennialAllStar) {
$generalObj->updateVar('leadership', $info['leadership']); CentennialAllStarGrowthService::prepareLegacyUserReselection($generalObj);
$generalObj->updateVar('strength', $info['strength']); CentennialAllStarGrowthService::applyTarget($generalObj, $info, [
$generalObj->updateVar('intel', $info['intel']); 'startyear' => $startYear,
'year' => $year,
'month' => $month,
]);
} else {
if(key_exists('leadership', $info)){
$generalObj->updateVar('leadership', $info['leadership']);
$generalObj->updateVar('strength', $info['strength']);
$generalObj->updateVar('intel', $info['intel']);
}
if(key_exists('dex', $info)){
$generalObj->updateVar('dex1', $info['dex'][0]);
$generalObj->updateVar('dex2', $info['dex'][1]);
$generalObj->updateVar('dex3', $info['dex'][2]);
$generalObj->updateVar('dex4', $info['dex'][3]);
$generalObj->updateVar('dex5', $info['dex'][4]);
}
if(key_exists('ego', $info)){
$generalObj->updateVar('personal', $info['ego']);
}
if(key_exists('specialDomestic', $info)){
$generalObj->updateVar('special', $info['specialDomestic']);
}
if(key_exists('specialWar', $info)){
$generalObj->updateVar('special2', $info['specialWar']);
}
} }
if(key_exists('picture', $info)){ if ($isCentennialAllStar) {
if ($pictureSource === 'own') {
$generalObj->updateVar('imgsvr', $ownerInfo['imgsvr']);
$generalObj->updateVar('picture', $ownerInfo['picture']);
} elseif ($pictureSource === 'selected' && key_exists('picture', $info)) {
$generalObj->updateVar('imgsvr', $info['imgsvr']);
$generalObj->updateVar('picture', $info['picture']);
}
} elseif(key_exists('picture', $info)){
$generalObj->updateVar('imgsvr', $info['imgsvr']); $generalObj->updateVar('imgsvr', $info['imgsvr']);
$generalObj->updateVar('picture', $info['picture']); $generalObj->updateVar('picture', $info['picture']);
} }
if(key_exists('generalName', $info)){ if(key_exists('generalName', $info)){
$generalObj->updateVar('name', $info['generalName']); $generalObj->updateVar('name', $info['generalName']);
} }
if(key_exists('dex', $info)){
$generalObj->updateVar('dex1', $info['dex'][0]);
$generalObj->updateVar('dex2', $info['dex'][1]);
$generalObj->updateVar('dex3', $info['dex'][2]);
$generalObj->updateVar('dex4', $info['dex'][3]);
$generalObj->updateVar('dex5', $info['dex'][4]);
}
if(key_exists('ego', $info)){
$generalObj->updateVar('personal', $info['ego']);
}
if(key_exists('specialDomestic', $info)){
$generalObj->updateVar('special', $info['specialDomestic']);
}
if(key_exists('specialWar', $info)){
$generalObj->updateVar('special2', $info['specialWar']);
}
$generalObj->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $turnterm)); $generalObj->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $turnterm));
$userNick = $ownerInfo['name']; $userNick = $ownerInfo['name'];
+3 -2
View File
@@ -51,8 +51,9 @@ function MessageBox($str)
function LogText($prefix, $variable) function LogText($prefix, $variable)
{ {
$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable)); return;
file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND); //$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable));
//file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
} }
function prepareDir(string $dirPath, bool $forceCreate=true):bool{ function prepareDir(string $dirPath, bool $forceCreate=true):bool{
+9 -1
View File
@@ -8,4 +8,12 @@ $session = Session::getInstance()->setReadOnly();
$db = DB::db(); $db = DB::db();
TurnExecutionHelper::executeAllCommand(); $updated = false;
$locked = false;
$lastExecuted = TurnExecutionHelper::executeAllCommand($updated, $locked);
Json::die([
'result' => true,
'updated' => $updated,
'locked' => $locked,
'lastExecuted' => $lastExecuted,
]);
+3 -3
View File
@@ -526,7 +526,7 @@ function DeleteConflict($nation)
function getConquerNation($city): int function getConquerNation($city): int
{ {
$conflict = Json::decode($city['conflict']); $conflict = Json::decode($city['conflict']);
return Util::array_first_key($conflict); return array_key_first($conflict);
} }
function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList) function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList)
@@ -785,8 +785,8 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
'officer_set' => 0, 'officer_set' => 0,
]; ];
if ($city['level'] > 3) { if ($city['level'] > 3) {
$query['def'] = 1000; $query['def'] = GameConst::$defaultCityWall;
$query['wall'] = 1000; $query['wall'] = GameConst::$defaultCityWall;
} else { } else {
$query['def'] = $db->sqleval('def_max/2'); $query['def'] = $db->sqleval('def_max/2');
$query['wall'] = $db->sqleval('wall_max/2'); $query['wall'] = $db->sqleval('wall_max/2');
+18 -8
View File
@@ -39,6 +39,10 @@ class DieOnPrestart extends \sammo\BaseAPI
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']); $gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID); $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID);
if (!$general) {
return '장수가 없습니다';
}
$lastRefresh = $db->queryFirstField( $lastRefresh = $db->queryFirstField(
'SELECT %b FROM general_access_log WHERE %b = %i', 'SELECT %b FROM general_access_log WHERE %b = %i',
GeneralAccessLogColumn::lastRefresh->value, GeneralAccessLogColumn::lastRefresh->value,
@@ -46,8 +50,9 @@ class DieOnPrestart extends \sammo\BaseAPI
$general['no'] $general['no']
); );
if (!$general) { $generalObj = General::createObjFromDB($general['no']);
return '장수가 없습니다'; if ($generalObj instanceof DummyGeneral) {
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
} }
increaseRefresh("장수 삭제", 1); increaseRefresh("장수 삭제", 1);
@@ -61,18 +66,23 @@ class DieOnPrestart extends \sammo\BaseAPI
return '이미 국가에 소속되어있습니다.'; return '이미 국가에 소속되어있습니다.';
} }
$targetTime = $generalObj->getAuxVar('prestart_delete_after');
if (!is_string($targetTime) || $targetTime === '') {
$targetTime = addTurn(
$lastRefresh ?: TimeUtil::now(),
$gameStor->turnterm,
GameConst::$minTurnDieOnPrestart
);
$generalObj->setAuxVar('prestart_delete_after', $targetTime);
$generalObj->applyDB($db);
}
//서버 가오픈시 할 수 있는 행동 //서버 가오픈시 할 수 있는 행동
$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
if ($targetTime > TimeUtil::now()) { if ($targetTime > TimeUtil::now()) {
$targetTimeShort = substr($targetTime, 0, 19); $targetTimeShort = substr($targetTime, 0, 19);
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."; return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
} }
$generalObj = General::createObjFromDB($general['no']);
if ($generalObj instanceof DummyGeneral) {
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
}
$generalName = $generalObj->getName(); $generalName = $generalObj->getName();
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 홀연히 모습을 <R>감추었습니다</>"); $generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 홀연히 모습을 <R>감추었습니다</>");
+9 -2
View File
@@ -99,7 +99,7 @@ class Join extends \sammo\BaseAPI
} }
$gameID = UniqueConst::$serverID; $gameID = UniqueConst::$serverID;
$alreadyJoined = $db->queryFirstField('SELECT count(*) FROM `storage` WHERE `namespace` = %s AND `key` LIKE %s', 'inheritance_result', "{$gameID}_{$userID}_%"); $alreadyJoined = $db->queryFirstField('SELECT COUNT(*) FROM `inheritance_result` WHERE `server_id` = %s AND `owner` = %i', $gameID, $userID);
if ($alreadyJoined) { if ($alreadyJoined) {
//이미 받았음 //이미 받았음
return 0; return 0;
@@ -157,7 +157,7 @@ class Join extends \sammo\BaseAPI
$penalty = []; $penalty = [];
foreach($penaltyInfo as $penaltyKey => $penaltyValue){ foreach($penaltyInfo as $penaltyKey => $penaltyValue){
if($penaltyValue['expire'] ?? 0 > TimeUtil::now()){ if(($penaltyValue['expire'] ?? 0) > TimeUtil::now()){
$penalty[$penaltyKey] = $penaltyValue['value']; $penalty[$penaltyKey] = $penaltyValue['value'];
} }
} }
@@ -435,6 +435,13 @@ class Join extends \sammo\BaseAPI
'specage2' => $specage2, 'specage2' => $specage2,
'special2' => $special2, 'special2' => $special2,
'penalty' => Json::encode($penalty), 'penalty' => Json::encode($penalty),
'aux' => Json::encode([
'prestart_delete_after' => addTurn(
$now,
$admin['turnterm'],
GameConst::$minTurnDieOnPrestart
),
]),
]); ]);
$generalID = $db->insertId(); $generalID = $db->insertId();
$db->insert('general_access_log', [ $db->insert('general_access_log', [
@@ -4,6 +4,7 @@ namespace sammo\API\InheritAction;
use sammo\Session; use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\CentennialAllStarGrowthService;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\RankColumn; use sammo\Enums\RankColumn;
@@ -98,6 +99,10 @@ class ResetStat extends \sammo\BaseAPI
return 'NPC는 능력치 초기화를 할 수 없습니다.'; return 'NPC는 능력치 초기화를 할 수 없습니다.';
} }
if (!CentennialAllStarGrowthService::isStatResetAllowed()) {
return '100기 올스타 장수는 능력치 초기화를 사용할 수 없습니다.';
}
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
+6 -2
View File
@@ -8,6 +8,11 @@ use sammo\Util;
abstract class AbsFromUserPool extends AbsGeneralPool{ abstract class AbsFromUserPool extends AbsGeneralPool{
protected static function getCandidateWeight(array $info, int $owner): int|float
{
return array_sum($info['dex'] ?? []);
}
public function occupyGeneralName(): bool public function occupyGeneralName(): bool
{ {
$generalID = $this->getGeneralBuilder()->getGeneralID(); $generalID = $this->getGeneralBuilder()->getGeneralID();
@@ -36,8 +41,7 @@ abstract class AbsFromUserPool extends AbsGeneralPool{
$pool = []; $pool = [];
foreach($db->query('SELECT id, unique_name, info FROM select_pool WHERE reserved_until IS NULL AND general_id IS NULL', $pickCnt) as $cand){ foreach($db->query('SELECT id, unique_name, info FROM select_pool WHERE reserved_until IS NULL AND general_id IS NULL', $pickCnt) as $cand){
$cand['info'] = Json::decode($cand['info']); $cand['info'] = Json::decode($cand['info']);
$dexTotal = array_sum($cand['info']['dex']); $pool[] = [$cand, static::getCandidateWeight($cand['info'], $owner)];
$pool[] = [$cand, $dexTotal];
} }
if(count($pool) < $pickCnt){ if(count($pool) < $pickCnt){
@@ -15,7 +15,7 @@ class che_척사_오악진형도 extends \sammo\BaseItem{
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType(); $opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){ if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.15, 0.85]; return [1.15, 0.85];
} }
return [1, 1]; return [1, 1];
@@ -33,7 +33,7 @@ class event_전투특기_공성 extends \sammo\BaseItem{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_SIEGE; $myArmType = 'dex'.GameUnitConst::T_SIEGE;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -28,7 +28,7 @@ class event_전투특기_궁병 extends \sammo\BaseItem{
if($statName === 'warAvoidRatio'){ if($statName === 'warAvoidRatio'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_ARCHER; $myArmType = 'dex'.GameUnitConst::T_ARCHER;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -28,7 +28,7 @@ class event_전투특기_귀병 extends \sammo\BaseItem{
if($statName === 'warMagicSuccessProb'){ if($statName === 'warMagicSuccessProb'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_WIZARD; $myArmType = 'dex'.GameUnitConst::T_WIZARD;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -32,7 +32,7 @@ class event_전투특기_기병 extends \sammo\BaseItem{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_CAVALRY; $myArmType = 'dex'.GameUnitConst::T_CAVALRY;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -33,7 +33,7 @@ class event_전투특기_보병 extends \sammo\BaseItem{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_FOOTMAN; $myArmType = 'dex'.GameUnitConst::T_FOOTMAN;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -17,7 +17,7 @@ class event_전투특기_척사 extends \sammo\BaseItem{
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType(); $opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){ if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8]; return [1.2, 0.8];
} }
return [1, 1]; return [1, 1];
@@ -0,0 +1,68 @@
<?php
namespace sammo\ActionScenarioEffect;
use \sammo\iAction;
use sammo\Util;
use sammo\WarUnit;
use sammo\WarUnitCity;
use sammo\WarUnitTrigger\che_전멸시페이즈증가;
use sammo\WarUnitTriggerCaller;
class event_MoreEffect implements iAction
{
use \sammo\DefaultAction;
public function getWarPowerMultiplier(WarUnit $unit): array
{
if ($unit->isAttacker()) {
return [1.4, 0.7143];
}
return [1, 1];
}
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
{
$scoreMap = [
'상업' => 2,
'농업' => 2,
'치안' => 2,
'기술' => 2,
'성벽' => 2,
'수비' => 2,
'인구' => 2,
'민심' => 2,
];
if ($turnType == 'changeDefenceTrain') {
return 0;
}
if ($varType === 'score' && key_exists($turnType, $scoreMap)) {
$multiplier = $scoreMap[$turnType];
$value *= $multiplier;
return $value;
}
return $value;
}
public function onCalcNationalIncome(string $type, $amount){
if($type == 'gold'){
return $amount * 2;
}
if($type == 'rice'){
return $amount * 2;
}
if($type == 'pop' && $amount > 0){
return $amount * 2;
}
return $amount;
}
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
{
return new WarUnitTriggerCaller(
new che_전멸시페이즈증가($unit),
);
}
}
@@ -35,7 +35,7 @@ class che_event_공성 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_SIEGE; $myArmType = 'dex'.GameUnitConst::T_SIEGE;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -31,7 +31,7 @@ class che_event_궁병 extends \sammo\BaseSpecial{
if($statName === 'warAvoidRatio'){ if($statName === 'warAvoidRatio'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_ARCHER; $myArmType = 'dex'.GameUnitConst::T_ARCHER;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -30,7 +30,7 @@ class che_event_귀병 extends \sammo\BaseSpecial{
if($statName === 'warMagicSuccessProb'){ if($statName === 'warMagicSuccessProb'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_WIZARD; $myArmType = 'dex'.GameUnitConst::T_WIZARD;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -35,7 +35,7 @@ class che_event_기병 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_CAVALRY; $myArmType = 'dex'.GameUnitConst::T_CAVALRY;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -35,7 +35,7 @@ class che_event_보병 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_FOOTMAN; $myArmType = 'dex'.GameUnitConst::T_FOOTMAN;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
@@ -21,7 +21,7 @@ class che_event_척사 extends \sammo\BaseSpecial{
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType(); $opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){ if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8]; return [1.2, 0.8];
} }
return [1, 1]; return [1, 1];
+1 -1
View File
@@ -35,7 +35,7 @@ class che_공성 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_SIEGE; $myArmType = 'dex'.GameUnitConst::T_SIEGE;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
+1 -1
View File
@@ -31,7 +31,7 @@ class che_궁병 extends \sammo\BaseSpecial{
if($statName === 'warAvoidRatio'){ if($statName === 'warAvoidRatio'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_ARCHER; $myArmType = 'dex'.GameUnitConst::T_ARCHER;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
+1 -1
View File
@@ -30,7 +30,7 @@ class che_귀병 extends \sammo\BaseSpecial{
if($statName === 'warMagicSuccessProb'){ if($statName === 'warMagicSuccessProb'){
return $value + 0.2; return $value + 0.2;
} }
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_WIZARD; $myArmType = 'dex'.GameUnitConst::T_WIZARD;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
+1 -1
View File
@@ -35,7 +35,7 @@ class che_기병 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_CAVALRY; $myArmType = 'dex'.GameUnitConst::T_CAVALRY;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
+1 -1
View File
@@ -35,7 +35,7 @@ class che_보병 extends \sammo\BaseSpecial{
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if(\sammo\Util::starts_with($statName, 'dex')){ if(str_starts_with($statName, 'dex')){
$myArmType = 'dex'.GameUnitConst::T_FOOTMAN; $myArmType = 'dex'.GameUnitConst::T_FOOTMAN;
$opposeArmType = 'dex'.$aux['opposeType']->armType;; $opposeArmType = 'dex'.$aux['opposeType']->armType;;
if($aux['isAttacker'] && $opposeArmType === $statName){ if($aux['isAttacker'] && $opposeArmType === $statName){
+1 -1
View File
@@ -21,7 +21,7 @@ class che_척사 extends \sammo\BaseSpecial{
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType(); $opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){ if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8]; return [1.2, 0.8];
} }
return [1, 1]; return [1, 1];
@@ -0,0 +1,640 @@
<?php
namespace sammo;
use sammo\Scenario\GeneralBuilder;
final class CentennialAllStarGrowthService
{
public const POOL_CLASS = 'SPoolUnderU100';
public const AUX_KEY = 'event100_allstar';
public const TRAIT_UNLOCK_PROGRESS = 0.4;
public const NPC_PROGRESS_MULTIPLIER = 0.9;
private const STAT_KEYS = ['leadership', 'strength', 'intel'];
private const DEX_KEYS = ['dex1', 'dex2', 'dex3', 'dex4', 'dex5'];
public static function isActive(): bool
{
return GameConst::$targetGeneralPool === self::POOL_CLASS;
}
public static function isStatResetAllowed(): bool
{
return !self::isActive();
}
public static function initialAux(array $targetInfo, ?array $userInitialStats = null): array
{
$granted = array_fill_keys(array_merge(self::STAT_KEYS, self::DEX_KEYS), 0);
if ($userInitialStats !== null) {
foreach (self::STAT_KEYS as $key) {
$initial = (int) ($userInitialStats[$key] ?? GameConst::$defaultStatMin);
$granted[$key] = max(0, $initial - min($initial, GameConst::$defaultStatMin));
}
}
return [
'targetId' => (string) ($targetInfo['uniqueName'] ?? ''),
'granted' => $granted,
'dexConsumed' => array_fill_keys(self::DEX_KEYS, 0),
'dexFloor' => array_fill_keys(self::DEX_KEYS, 0),
'progressMonth' => -1,
'milestone' => 0,
'naturalSpecialDomestic' => null,
'eventSpecialDomestic' => null,
'userInitialStats' => $userInitialStats,
'dexTargetRatio' => 1.0,
];
}
public static function attachInitialTarget(GeneralBuilder $builder, array $targetInfo): void
{
$builder->setAuxVar(self::AUX_KEY, self::initialAux($targetInfo));
}
/**
* Builds an ordinary-user stat total while preserving the selected
* candidate's relative strengths as closely as integer stats allow.
*
* @return array{leadership:int,strength:int,intel:int}
*/
public static function calculateUserInitialStats(array $targetInfo): array
{
$targets = [];
$bases = [];
foreach (self::STAT_KEYS as $key) {
$target = min(
GameConst::$defaultStatMax,
max(0, (int) ($targetInfo[$key] ?? 0))
);
$targets[$key] = $target;
$bases[$key] = min($target, GameConst::$defaultStatMin);
}
$targetTotal = array_sum($targets);
$desiredTotal = min(GameConst::$defaultStatTotal, $targetTotal);
$baseTotal = array_sum($bases);
$capacityTotal = $targetTotal - $baseTotal;
if ($capacityTotal <= 0 || $desiredTotal <= $baseTotal) {
return $bases;
}
$ratio = ($desiredTotal - $baseTotal) / $capacityTotal;
$result = [];
$fractions = [];
foreach (self::STAT_KEYS as $idx => $key) {
$raw = $bases[$key] + ($targets[$key] - $bases[$key]) * $ratio;
$result[$key] = (int) floor($raw);
$fractions[] = [
'key' => $key,
'fraction' => $raw - $result[$key],
'order' => $idx,
];
}
usort($fractions, static function (array $lhs, array $rhs): int {
$fractionOrder = $rhs['fraction'] <=> $lhs['fraction'];
return $fractionOrder !== 0 ? $fractionOrder : $lhs['order'] <=> $rhs['order'];
});
$remainder = $desiredTotal - array_sum($result);
foreach ($fractions as $fraction) {
if ($remainder <= 0) {
break;
}
$key = $fraction['key'];
if ($result[$key] >= $targets[$key]) {
continue;
}
$result[$key]++;
$remainder--;
}
return $result;
}
/**
* Returns the event stat baseline that a newly selected target receives at
* the supplied game date. Organic growth can still leave the actual stat
* above this baseline.
*
* @return array{leadership:int,strength:int,intel:int}
*/
public static function calculateUserCurrentTargetStats(
array $targetInfo,
array $env
): array {
$initialStats = self::calculateUserInitialStats($targetInfo);
$progress = self::calculateProgress(
(int) $env['startyear'],
(int) $env['year'],
(int) $env['month']
);
$result = [];
foreach (self::STAT_KEYS as $key) {
$target = min(
GameConst::$maxLevel,
max(0, (int) ($targetInfo[$key] ?? 0))
);
$result[$key] = max(
$initialStats[$key],
CentennialAllStarGrowth::statFloor(
$target,
GameConst::$defaultStatMin,
$progress
)
);
}
return $result;
}
public static function prepareInitialUser(
GeneralBuilder $builder,
array $targetInfo
): void {
$initialStats = self::calculateUserInitialStats($targetInfo);
$builder->setStat(
$initialStats['leadership'],
$initialStats['strength'],
$initialStats['intel']
);
$builder->setAuxVar(
self::AUX_KEY,
self::initialAux($targetInfo, $initialStats)
);
}
/**
* Old 100th-season characters did not distinguish their form-entered
* initial stats from organic growth. Before their first reselection, treat
* the ordinary creation range as the replaceable initial allocation.
*/
public static function prepareLegacyUserReselection(General $general): void
{
$aux = $general->getAuxVar(self::AUX_KEY);
if (!is_array($aux) || is_array($aux['userInitialStats'] ?? null)) {
return;
}
$granted = is_array($aux['granted'] ?? null)
? $aux['granted']
: array_fill_keys(array_merge(self::STAT_KEYS, self::DEX_KEYS), 0);
$legacyInitialStats = [];
foreach (self::STAT_KEYS as $key) {
$current = (int) $general->getVar($key);
$granted[$key] = self::calculateLegacyUserGrant(
$current,
(int) ($granted[$key] ?? 0)
);
$beforeEventGrant = max(
0,
$current - max(0, (int) ($aux['granted'][$key] ?? 0))
);
$legacyInitialStats[$key] = min(
$beforeEventGrant,
GameConst::$defaultStatMax
);
}
$aux['granted'] = $granted;
$aux['userInitialStats'] = $legacyInitialStats;
$general->setAuxVar(self::AUX_KEY, $aux);
}
public static function calculateLegacyUserGrant(int $current, int $eventGrant): int
{
$eventGrant = max(0, $eventGrant);
$beforeEventGrant = max(0, $current - $eventGrant);
$replaceableInitialGrant = max(
0,
min($beforeEventGrant, GameConst::$defaultStatMax)
- min($beforeEventGrant, GameConst::$defaultStatMin)
);
return $eventGrant + $replaceableInitialGrant;
}
public static function calculateProgress(
int $startYear,
int $year,
int $month,
float $progressMultiplier = 1.0
): float {
if ($progressMultiplier < 0 || $progressMultiplier > 1) {
throw new \InvalidArgumentException('progress multiplier must be between 0 and 1');
}
return min(
1,
CentennialAllStarGrowth::progress($startYear, $year, $month)
* $progressMultiplier
);
}
public static function calculateDexTargetFloor(
int $target,
array $env,
float $targetRatio = 1.0
): int {
if ($targetRatio < 0 || $targetRatio > 1) {
throw new \InvalidArgumentException('dex target ratio must be between 0 and 1');
}
$target = min(GameConst::$dexLimit, max(0, $target));
$scaledTarget = (int) floor($target * $targetRatio);
$progress = self::calculateProgress(
(int) $env['startyear'],
(int) $env['year'],
(int) $env['month']
);
return CentennialAllStarGrowth::dexFloor($scaledTarget, $progress);
}
/**
* Mutates the General object but leaves persistence to the caller.
*
* @return array{progress:float,milestone:int,previousMilestone:int,targetChanged:bool,changed:bool}
*/
public static function applyTarget(
General $general,
array $targetInfo,
array $env,
float $progressMultiplier = 1.0,
float $dexTargetRatio = 1.0
): array
{
$startYear = (int) $env['startyear'];
$year = (int) $env['year'];
$month = (int) $env['month'];
$progress = self::calculateProgress(
$startYear,
$year,
$month,
$progressMultiplier
);
$progressMonth = (int) floor(
max(0, ($year - $startYear) * 12 + $month - 1)
* $progressMultiplier
);
$targetId = (string) ($targetInfo['uniqueName'] ?? '');
$aux = $general->getAuxVar(self::AUX_KEY);
if (!is_array($aux)) {
$aux = self::initialAux($targetInfo);
}
$granted = is_array($aux['granted'] ?? null)
? $aux['granted']
: array_fill_keys(array_merge(self::STAT_KEYS, self::DEX_KEYS), 0);
$targetChanged = ($aux['targetId'] ?? '') !== $targetId;
$dexConsumed = is_array($aux['dexConsumed'] ?? null)
? $aux['dexConsumed']
: array_fill_keys(self::DEX_KEYS, 0);
if ($targetChanged) {
$dexConsumed = array_fill_keys(self::DEX_KEYS, 0);
}
$dexFloor = is_array($aux['dexFloor'] ?? null)
? $aux['dexFloor']
: array_fill_keys(self::DEX_KEYS, 0);
$isUserTarget = is_array($aux['userInitialStats'] ?? null);
$nextUserInitialStats = $targetChanged && $isUserTarget
? self::calculateUserInitialStats($targetInfo)
: ($aux['userInitialStats'] ?? null);
$previousDexTargetRatio = is_numeric($aux['dexTargetRatio'] ?? null)
? (float) $aux['dexTargetRatio']
: 1.0;
$dexTargetRatioChanged = $previousDexTargetRatio !== $dexTargetRatio;
$userCurrentTargetStats = $isUserTarget
? self::calculateUserCurrentTargetStats($targetInfo, $env)
: null;
$changed = $dexTargetRatioChanged;
foreach (self::STAT_KEYS as $key) {
if (!array_key_exists($key, $targetInfo)) {
continue;
}
$target = min(GameConst::$maxLevel, max(0, (int) $targetInfo[$key]));
$floor = CentennialAllStarGrowth::statFloor(
$target,
GameConst::$defaultStatMin,
$progress
);
if ($userCurrentTargetStats !== null) {
$floor = $userCurrentTargetStats[$key];
}
$current = (int) $general->getVar($key);
if ($targetChanged) {
$result = CentennialAllStarGrowth::replaceTarget(
$current,
(int) ($granted[$key] ?? 0),
$floor
);
} else {
$result = CentennialAllStarGrowth::advance(
$current,
(int) ($granted[$key] ?? 0),
$floor
);
}
if ($result['value'] !== $current) {
$general->updateVar($key, $result['value']);
$changed = true;
}
$granted[$key] = $result['granted'];
}
$targetDex = $targetInfo['dex'] ?? [];
foreach (self::DEX_KEYS as $idx => $key) {
if (!array_key_exists($idx, $targetDex)) {
continue;
}
$floor = max(
0,
self::calculateDexTargetFloor(
(int) $targetDex[$idx],
$env,
$dexTargetRatio
) - max(0, (int) ($dexConsumed[$key] ?? 0))
);
$dexFloor[$key] = $floor;
$current = (int) $general->getVar($key);
if ($targetChanged || $dexTargetRatioChanged) {
$result = CentennialAllStarGrowth::replaceTarget(
$current,
(int) ($granted[$key] ?? 0),
$floor
);
} else {
$result = CentennialAllStarGrowth::advance(
$current,
(int) ($granted[$key] ?? 0),
$floor
);
}
if ($result['value'] !== $current) {
$general->updateVar($key, $result['value']);
$changed = true;
}
$granted[$key] = $result['granted'];
}
$oldEventSpecial = $aux['eventSpecialDomestic'] ?? null;
if ($targetChanged && $oldEventSpecial !== null
&& $general->getVar('special') === $oldEventSpecial
) {
$general->updateVar(
'special',
$aux['naturalSpecialDomestic'] ?? GameConst::$defaultSpecialDomestic
);
$changed = true;
$aux['eventSpecialDomestic'] = null;
}
$targetSpecial = $targetInfo['specialDomestic'] ?? null;
if ($progress >= self::TRAIT_UNLOCK_PROGRESS && is_string($targetSpecial) && $targetSpecial !== '') {
if (($aux['naturalSpecialDomestic'] ?? null) === null) {
$aux['naturalSpecialDomestic'] = $general->getVar('special');
}
if ($general->getVar('special') !== $targetSpecial) {
$general->updateVar('special', $targetSpecial);
$changed = true;
}
$aux['eventSpecialDomestic'] = $targetSpecial;
}
$previousMilestone = (int) ($aux['milestone'] ?? 0);
$milestone = min(5, (int) floor($progress * 5 + 0.0000001));
$aux['targetId'] = $targetId;
$aux['granted'] = $granted;
$aux['dexConsumed'] = $dexConsumed;
$aux['dexFloor'] = $dexFloor;
$aux['progressMonth'] = max((int) ($aux['progressMonth'] ?? -1), $progressMonth);
$aux['milestone'] = max($previousMilestone, $milestone);
$aux['userInitialStats'] = $nextUserInitialStats;
$aux['dexTargetRatio'] = $dexTargetRatio;
$general->setAuxVar(self::AUX_KEY, $aux);
return [
'progress' => $progress,
'milestone' => $milestone,
'previousMilestone' => $previousMilestone,
'targetChanged' => $targetChanged,
'changed' => $changed || $targetChanged || $milestone > $previousMilestone,
];
}
public static function progressMultiplierFor(General $general): float
{
return self::progressMultiplierForNPCType($general->getNPCType());
}
public static function progressMultiplierForNPCType(int $npcType): float
{
return in_array($npcType, [3, 4], true)
? self::NPC_PROGRESS_MULTIPLIER
: 1.0;
}
public static function dexTargetRatioForNPCType(int $npcType): float
{
return in_array($npcType, [3, 4], true)
? GameConst::$centennialNpcDexTargetRatio
: 1.0;
}
public static function applyCurrentTargetToBuiltNPC(
\MeekroDB $db,
GeneralBuilder $builder,
array $targetInfo,
array $env
): ?array {
if (!self::isActive()) {
return null;
}
$general = General::createObjFromDB($builder->getGeneralID());
if (!in_array($general->getNPCType(), [3, 4], true)) {
return null;
}
self::initializeGeneratedNPC($general, $targetInfo);
$result = self::applyTarget(
$general,
$targetInfo,
$env,
self::NPC_PROGRESS_MULTIPLIER,
GameConst::$centennialNpcDexTargetRatio
);
$general->applyDB($db);
return $result;
}
/**
* Keeps the ordinary M/G-general stat total while aligning its strong,
* middle, and weak stats with the selected all-star target. The target's
* creation-date growth floor is applied immediately afterwards.
*/
public static function initializeGeneratedNPC(
General $general,
array $targetInfo
): void {
$generatedStats = [];
foreach (self::STAT_KEYS as $key) {
$generatedStats[$key] = (int) $general->getVar($key);
}
$initialStats = self::calculateGeneratedNPCInitialStats(
$targetInfo,
$generatedStats
);
foreach (self::STAT_KEYS as $key) {
$general->updateVar($key, $initialStats[$key]);
}
foreach (self::DEX_KEYS as $key) {
$general->updateVar($key, 0);
}
$general->setAuxVar(self::AUX_KEY, self::initialAux($targetInfo));
}
/**
* @param array<string, mixed> $targetInfo
* @param array{leadership:int,strength:int,intel:int} $generatedStats
* @return array{leadership:int,strength:int,intel:int}
*/
public static function calculateGeneratedNPCInitialStats(
array $targetInfo,
array $generatedStats
): array {
$targetOrder = self::STAT_KEYS;
$keyOrder = array_flip(self::STAT_KEYS);
usort(
$targetOrder,
static function (string $lhs, string $rhs) use ($targetInfo, $keyOrder): int {
$targetCompare = (int) ($targetInfo[$rhs] ?? 0)
<=> (int) ($targetInfo[$lhs] ?? 0);
return $targetCompare !== 0
? $targetCompare
: $keyOrder[$lhs] <=> $keyOrder[$rhs];
}
);
$generatedValues = array_map(
static fn (string $key): int => (int) ($generatedStats[$key] ?? 0),
self::STAT_KEYS
);
rsort($generatedValues, SORT_NUMERIC);
$result = array_fill_keys(self::STAT_KEYS, 0);
foreach ($targetOrder as $idx => $key) {
$result[$key] = $generatedValues[$idx];
}
return $result;
}
/**
* Moves the event-backed part of a dex conversion with the converted
* value and consumes any guaranteed floor crossed by the source value.
* This keeps the monthly floor from refilling points already converted.
*/
public static function reconcileDexConversion(
General $general,
string $sourceKey,
string $destinationKey,
int $sourceBefore,
int $sourceAfter,
int $destinationBefore,
int $destinationAfter,
float $convertCoeff
): void {
if (!in_array($sourceKey, self::DEX_KEYS, true)
|| !in_array($destinationKey, self::DEX_KEYS, true)
|| $sourceKey === $destinationKey
) {
throw new \InvalidArgumentException('invalid dex conversion keys');
}
if ($convertCoeff < 0 || $convertCoeff > 1) {
throw new \InvalidArgumentException('dex conversion coefficient must be between 0 and 1');
}
$sourceDecrease = max(0, $sourceBefore - $sourceAfter);
$destinationIncrease = max(0, $destinationAfter - $destinationBefore);
if ($sourceDecrease === 0 && $destinationIncrease === 0) {
return;
}
$aux = $general->getAuxVar(self::AUX_KEY);
if (!is_array($aux)) {
return;
}
$granted = is_array($aux['granted'] ?? null)
? $aux['granted']
: array_fill_keys(array_merge(self::STAT_KEYS, self::DEX_KEYS), 0);
$dexConsumed = is_array($aux['dexConsumed'] ?? null)
? $aux['dexConsumed']
: array_fill_keys(self::DEX_KEYS, 0);
$dexFloor = is_array($aux['dexFloor'] ?? null)
? $aux['dexFloor']
: [];
$sourceGrantedBefore = min(
max(0, $sourceBefore),
max(0, (int) ($granted[$sourceKey] ?? 0))
);
/*
* A dex value can contain both organic and event-backed points. Split
* the actual command deltas by their share of the source total instead
* of consuming either bucket first. This keeps the combined ownership
* stable when conversion and target reselection are interleaved.
*/
$eventGrantRemoved = $sourceBefore > 0
? intdiv($sourceDecrease * $sourceGrantedBefore, $sourceBefore)
: 0;
$sourceGrantedAfter = max(0, $sourceGrantedBefore - $eventGrantRemoved);
$destinationGrantedBefore = min(
max(0, $destinationBefore),
max(0, (int) ($granted[$destinationKey] ?? 0))
);
$eventGrantTransferred = $sourceBefore > 0
? intdiv($destinationIncrease * $sourceGrantedBefore, $sourceBefore)
: 0;
$eventGrantTransferred = min(
$destinationIncrease,
$eventGrantRemoved,
$eventGrantTransferred
);
$granted[$sourceKey] = $sourceGrantedAfter;
$granted[$destinationKey] = min(
max(0, $destinationAfter),
$destinationGrantedBefore + $eventGrantTransferred
);
$sourceFloor = max(
0,
(int) ($dexFloor[$sourceKey] ?? $sourceBefore)
);
$gapBefore = max(0, $sourceFloor - $sourceBefore);
$gapAfter = max(0, $sourceFloor - $sourceAfter);
$dexConsumed[$sourceKey] = max(
0,
(int) ($dexConsumed[$sourceKey] ?? 0)
+ max(0, $gapAfter - $gapBefore)
);
$aux['granted'] = $granted;
$aux['dexConsumed'] = $dexConsumed;
$general->setAuxVar(self::AUX_KEY, $aux);
}
public static function recordableValue(General $general, string $key): int
{
$aux = $general->getAuxVar(self::AUX_KEY);
$granted = is_array($aux) && is_array($aux['granted'] ?? null)
? (int) ($aux['granted'][$key] ?? 0)
: 0;
return CentennialAllStarGrowth::recordableValue((int) $general->getVar($key), $granted);
}
public static function recordableRawValue(array $general, string $key): int
{
$aux = Json::decode($general['aux'] ?? '{}');
$eventAux = is_array($aux[self::AUX_KEY] ?? null) ? $aux[self::AUX_KEY] : [];
$granted = is_array($eventAux['granted'] ?? null)
? (int) ($eventAux['granted'][$key] ?? 0)
: 0;
return CentennialAllStarGrowth::recordableValue((int) ($general[$key] ?? 0), $granted);
}
}
+14 -7
View File
@@ -5,6 +5,7 @@ use \sammo\{
Util, JosaUtil, DB, Util, JosaUtil, DB,
General, GameConst, General, GameConst,
ActionLogger, ActionLogger,
Json,
LastTurn, LastTurn,
NotInheritedMethodException, NotInheritedMethodException,
RandUtil RandUtil
@@ -118,6 +119,7 @@ abstract class BaseCommand{
$nationID = $this->generalObj->getNationID(); $nationID = $this->generalObj->getNationID();
if($nationID == 0){ if($nationID == 0){
$this->nation = $this->generalObj->getStaticNation(); $this->nation = $this->generalObj->getStaticNation();
$this->nation['aux'] = [];
return; return;
} }
@@ -138,7 +140,8 @@ abstract class BaseCommand{
'gold'=>0, 'gold'=>0,
'rice'=>2000, 'rice'=>2000,
'tech'=>0, 'tech'=>0,
'gennum'=>1 'gennum'=>1,
'aux'=>'{}',
]; ];
if($this->nation && $this->nation['nation'] === $nationID){ if($this->nation && $this->nation['nation'] === $nationID){
@@ -170,6 +173,10 @@ abstract class BaseCommand{
else{ else{
$this->nation = $nation; $this->nation = $nation;
} }
if(is_string($this->nation['aux'] ?? null)){
$this->nation['aux'] = Json::decode($this->nation['aux']);
}
} }
protected function setDestGeneral(General $destGeneralObj){ protected function setDestGeneral(General $destGeneralObj){
@@ -312,12 +319,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux(); $this->generalObj->unpackAux();
$constraintInput = [ $constraintInput = [
'general'=>$this->generalObj->getRaw(), 'general'=>$this->generalObj,
'city'=>$this->city, 'city'=>$this->city,
'nation'=>$this->nation, 'nation'=>$this->nation,
'cmd_arg'=>$this->arg, 'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null, 'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity, 'destCity'=>$this->destCity,
'destNation'=>$this->destNation, 'destNation'=>$this->destNation,
]; ];
@@ -346,12 +353,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux(); $this->generalObj->unpackAux();
$constraintInput = [ $constraintInput = [
'general'=>$this->generalObj->getRaw(), 'general'=>$this->generalObj,
'city'=>$this->city, 'city'=>$this->city,
'nation'=>$this->nation, 'nation'=>$this->nation,
'cmd_arg'=>$this->arg, 'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null, 'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity, 'destCity'=>$this->destCity,
'destNation'=>$this->destNation, 'destNation'=>$this->destNation,
]; ];
@@ -384,12 +391,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux(); $this->generalObj->unpackAux();
$constraintInput = [ $constraintInput = [
'general'=>$this->generalObj->getRaw(), 'general'=>$this->generalObj,
'city'=>$this->city, 'city'=>$this->city,
'nation'=>$this->nation, 'nation'=>$this->nation,
'cmd_arg'=>$this->arg, 'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null, 'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity, 'destCity'=>$this->destCity,
'destNation'=>$this->destNation, 'destNation'=>$this->destNation,
]; ];
+1 -1
View File
@@ -183,7 +183,7 @@ class che_건국 extends Command\GeneralCommand
$general->addExperience($exp); $general->addExperience($exp);
$general->addDedication($ded); $general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? []; $aux = $this->nation['aux'];
$aux['can_국기변경'] = 1; $aux['can_국기변경'] = 1;
$db->update('city', [ $db->update('city', [
@@ -181,7 +181,7 @@ class che_랜덤임관 extends Command\GeneralCommand
if ($notIn) { if ($notIn) {
$rawGeneralsCnt = $db->query( $rawGeneralsCnt = $db->query(
"SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`npc` < 2 THEN 1.2 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower "SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 50000)/(rb.value + 50000)*(CASE WHEN g.`npc` < 2 THEN 1.15 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower
FROM general AS g FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person' LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person' LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person'
@@ -193,7 +193,7 @@ class che_랜덤임관 extends Command\GeneralCommand
); );
} else { } else {
$rawGeneralsCnt = $db->query( $rawGeneralsCnt = $db->query(
"SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 100)/(rb.value + 100)*(CASE WHEN g.`npc` < 2 THEN 1.2 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower "SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 50000)/(rb.value + 50000)*(CASE WHEN g.`npc` < 2 THEN 1.15 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower
FROM general AS g FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person' LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person' LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person'
@@ -208,7 +208,7 @@ class che_랜덤임관 extends Command\GeneralCommand
foreach ($rawGeneralsCnt as $nation) { foreach ($rawGeneralsCnt as $nation) {
$calcCnt = $nation['warpower'] + $nation['develpower']; $calcCnt = $nation['warpower'] + $nation['develpower'];
if ($general->getNPCType() < 2 && Util::starts_with($nation['name'], 'ⓤ')) { if ($general->getNPCType() < 2 && str_starts_with($nation['name'], 'ⓤ')) {
$calcCnt *= 100; $calcCnt *= 100;
} }
@@ -194,7 +194,7 @@ class che_무작위건국 extends Command\GeneralCommand
$general->addExperience($exp); $general->addExperience($exp);
$general->addDedication($ded); $general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? []; $aux = $this->nation['aux'];
$aux['can_국기변경'] = 1; $aux['can_국기변경'] = 1;
$aux['can_무작위수도이전'] = 1; $aux['can_무작위수도이전'] = 1;
@@ -14,6 +14,7 @@ use function \sammo\tryUniqueItemLottery;
use \sammo\Constraint\ConstraintHelper; use \sammo\Constraint\ConstraintHelper;
use sammo\StaticEventHandler; use sammo\StaticEventHandler;
use sammo\CentennialAllStarGrowthService;
class che_숙련전환 extends Command\GeneralCommand class che_숙련전환 extends Command\GeneralCommand
{ {
@@ -157,6 +158,7 @@ class che_숙련전환 extends Command\GeneralCommand
$logger = $general->getLogger(); $logger = $general->getLogger();
$srcDex = $general->getVar('dex' . $this->srcArmType); $srcDex = $general->getVar('dex' . $this->srcArmType);
$destDex = $general->getVar('dex' . $this->destArmType);
$cutDex = Util::toInt($srcDex * static::$decreaseCoeff); $cutDex = Util::toInt($srcDex * static::$decreaseCoeff);
$cutDexText = number_format($cutDex); $cutDexText = number_format($cutDex);
$addDex = Util::toInt($cutDex * static::$convertCoeff); $addDex = Util::toInt($cutDex * static::$convertCoeff);
@@ -164,6 +166,19 @@ class che_숙련전환 extends Command\GeneralCommand
$general->increaseVar('dex' . $this->srcArmType, -$cutDex); $general->increaseVar('dex' . $this->srcArmType, -$cutDex);
$general->increaseVar('dex' . $this->destArmType, $addDex); $general->increaseVar('dex' . $this->destArmType, $addDex);
// 100기 이벤트 지급분을 목적 숙련으로 옮기고 소비한 성장 하한은 다시 채우지 않는다.
if (CentennialAllStarGrowthService::isActive()) {
CentennialAllStarGrowthService::reconcileDexConversion(
$general,
'dex' . $this->srcArmType,
'dex' . $this->destArmType,
$srcDex,
$general->getVar('dex' . $this->srcArmType),
$destDex,
$general->getVar('dex' . $this->destArmType),
static::$convertCoeff
);
}
$josaUl = JosaUtil::pick($cutDex, '을'); $josaUl = JosaUtil::pick($cutDex, '을');
$josaRo = JosaUtil::pick($addDex, '로'); $josaRo = JosaUtil::pick($addDex, '로');
@@ -7,6 +7,7 @@ use \sammo\Util;
use \sammo\JosaUtil; use \sammo\JosaUtil;
use \sammo\General; use \sammo\General;
use \sammo\ActionLogger; use \sammo\ActionLogger;
use \sammo\CentennialAllStarGrowthService;
use \sammo\GameConst; use \sammo\GameConst;
use \sammo\LastTurn; use \sammo\LastTurn;
use \sammo\GameUnitConst; use \sammo\GameUnitConst;
@@ -190,6 +191,12 @@ class che_인재탐색 extends Command\GeneralCommand
$newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env); $newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env);
$newNPC->build($this->env); $newNPC->build($this->env);
CentennialAllStarGrowthService::applyCurrentTargetToBuiltNPC(
$db,
$newNPC,
$pickedNPC->getInfo(),
$this->env
);
$pickedNPC->occupyGeneralName(); $pickedNPC->occupyGeneralName();
$npcName = $newNPC->getGeneralName(); $npcName = $newNPC->getGeneralName();
$josaRa = JosaUtil::pick($npcName, '라'); $josaRa = JosaUtil::pick($npcName, '라');
+13 -14
View File
@@ -79,7 +79,7 @@ class che_징병 extends Command\GeneralCommand
protected function init() protected function init()
{ {
$this->setCity(); $this->setCity();
$this->setNation(['tech']); $this->setNation(['tech', 'aux']);
$this->minConditionConstraints = [ $this->minConditionConstraints = [
ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotBeNeutral(),
@@ -256,8 +256,11 @@ class che_징병 extends Command\GeneralCommand
$ownCities = []; $ownCities = [];
$ownRegions = []; $ownRegions = [];
foreach (DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city) { foreach (DB::db()->query('SELECT city, region, secu, level from city where nation = %i', $general->getNationID()) as $city) {
$ownCities[$city['city']] = 1; $ownCities[$city['city']] = [
'secu' => $city['secu'],
'level' => $city['level'],
];
$ownRegions[$city['region']] = 1; $ownRegions[$city['region']] = 1;
} }
@@ -273,23 +276,19 @@ class che_징병 extends Command\GeneralCommand
'values' => [], 'values' => [],
]; ];
$crewTypes = [];
foreach (GameUnitConst::byType($armType) as $unit) { foreach (GameUnitConst::byType($armType) as $unit) {
$crewObj = new \stdClass; $crewObj = new \stdClass;
$crewObj->id = $unit->id; $crewObj->id = $unit->id;
$crewObj->reqTech = $unit->reqTech; /** @var ?\sammo\GameUnitConstraints\ReqTech */
$crewObj->reqYear = $unit->reqYear; $reqTechObj = $unit->reqConstraints['ReqTech'] ?? null;
$crewObj->reqTech = $reqTechObj ? $reqTechObj->reqTech : 0;
/* /** @var ?\sammo\GameUnitConstraint\ReqMinRelYear */
if ($unit->reqTech == 0) { $reqMinRelYearObj = $unit->reqConstraints['reqMinRelYear'] ?? null;
$crewObj->bgcolor = 'green'; $crewObj->reqYear = $reqMinRelYearObj ? $reqMinRelYearObj->reqMinRelYear : 0;
} else {
$crewObj->bgcolor = 'limegreen';
}
*/
$crewObj->notAvailable = !$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech); $crewObj->notAvailable = !$unit->isValid($general, $ownCities, $ownRegions, $relativeYear, $tech, $this->nation['aux']);
$crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]); $crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]);
$crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]); $crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]);
+1 -1
View File
@@ -164,7 +164,7 @@ class che_출병 extends Command\GeneralCommand
$currDist = 999; $currDist = 999;
$minDist = Util::array_first_key($distanceList); $minDist = array_key_first($distanceList);
do { do {
//1: 최단 거리 도시 중 공격 대상이 있는가 확인 //1: 최단 거리 도시 중 공격 대상이 있는가 확인
//2: 최단 거리 + 1 도시 중 공격 대상이 있는가 확인 //2: 최단 거리 + 1 도시 중 공격 대상이 있는가 확인
+1 -1
View File
@@ -180,7 +180,7 @@ class cr_건국 extends Command\GeneralCommand
$general->addExperience($exp); $general->addExperience($exp);
$general->addDedication($ded); $general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? []; $aux = $this->nation['aux'];
$aux['can_국기변경'] = 1; $aux['can_국기변경'] = 1;
$db->update('city', [ $db->update('city', [
@@ -122,7 +122,7 @@ class che_국기변경 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']); $aux = $this->nation['aux'];
$aux["can_{$actionName}"] = 0; $aux["can_{$actionName}"] = 0;
$db->update('nation', [ $db->update('nation', [
@@ -140,7 +140,7 @@ class che_국호변경 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']); $aux = $this->nation['aux'];
$aux["can_{$actionName}"] = 0; $aux["can_{$actionName}"] = 0;
$db->update('nation', [ $db->update('nation', [
@@ -119,7 +119,7 @@ class che_무작위수도이전 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']); $aux = $this->nation['aux'];
$aux["can_무작위수도이전"] -= 1; $aux["can_무작위수도이전"] -= 1;
$db->update('city', [ $db->update('city', [
@@ -7,6 +7,7 @@ use \sammo\Util;
use \sammo\JosaUtil; use \sammo\JosaUtil;
use \sammo\General; use \sammo\General;
use \sammo\ActionLogger; use \sammo\ActionLogger;
use \sammo\CentennialAllStarGrowthService;
use \sammo\GameConst; use \sammo\GameConst;
use \sammo\LastTurn; use \sammo\LastTurn;
use \sammo\GameUnitConst; use \sammo\GameUnitConst;
@@ -160,6 +161,12 @@ class che_의병모집 extends Command\NationCommand
$newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env); $newNPC->fillRemainSpecAsRandom($pickTypeList, $avgGen, $env);
$newNPC->build($this->env); $newNPC->build($this->env);
CentennialAllStarGrowthService::applyCurrentTargetToBuiltNPC(
$db,
$newNPC,
$pickedNPC->getInfo(),
$this->env
);
$pickedNPC->occupyGeneralName(); $pickedNPC->occupyGeneralName();
} }
+9 -1
View File
@@ -13,12 +13,14 @@ use \sammo\{
Message, Message,
CityConst, CityConst,
CityInitialDetail, CityInitialDetail,
Json,
StaticEventHandler StaticEventHandler
}; };
use \sammo\Constraint\Constraint; use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper; use \sammo\Constraint\ConstraintHelper;
use sammo\Enums\InheritanceKey; use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use sammo\Event\Action; use sammo\Event\Action;
class che_초토화 extends Command\NationCommand{ class che_초토화 extends Command\NationCommand{
@@ -52,7 +54,7 @@ class che_초토화 extends Command\NationCommand{
$env = $this->env; $env = $this->env;
$this->setCity(); $this->setCity();
$this->setNation(['surlimit', 'gold', 'rice', 'capital']); $this->setNation(['surlimit', 'gold', 'rice', 'capital', 'aux']);
$this->minConditionConstraints=[ $this->minConditionConstraints=[
ConstraintHelper::OccupiedCity(), ConstraintHelper::OccupiedCity(),
@@ -157,6 +159,11 @@ class che_초토화 extends Command\NationCommand{
$josaYiNation = JosaUtil::pick($nationName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이');
$amount = $this->calcReturnAmount($destCity); $amount = $this->calcReturnAmount($destCity);
$aux = $this->nation['aux'];
if($destCity['level'] >= 8){
$aux[NationAuxKey::did_특성초토화->value] = ($aux[NationAuxKey::did_특성초토화->value] ?? 0) + 1;
}
$db->update('general', [ $db->update('general', [
'experience'=>$db->sqleval('experience * 0.9') 'experience'=>$db->sqleval('experience * 0.9')
@@ -184,6 +191,7 @@ class che_초토화 extends Command\NationCommand{
'gold' => $db->sqleval('gold + %i', $amount), 'gold' => $db->sqleval('gold + %i', $amount),
'rice' => $db->sqleval('rice + %i', $amount), 'rice' => $db->sqleval('rice + %i', $amount),
'surlimit' => $db->sqleval('surlimit + %i', $this->getPostReqTurn()), 'surlimit' => $db->sqleval('surlimit + %i', $this->getPostReqTurn()),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID); ], 'nation=%i', $nationID);
\sammo\refreshNationStaticInfo(); \sammo\refreshNationStaticInfo();
@@ -0,0 +1,108 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_극병연구 extends Command\NationCommand{
static protected $actionName = '극병 연구';
static protected $auxType = NationAuxKey::can_극병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_대검병연구 extends Command\NationCommand{
static protected $actionName = '대검병 연구';
static protected $auxType = NationAuxKey::can_대검병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_무희연구 extends Command\NationCommand{
static protected $actionName = '무희 연구';
static protected $auxType = NationAuxKey::can_무희사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_산저병연구 extends Command\NationCommand{
static protected $actionName = '산저병 연구';
static protected $auxType = NationAuxKey::can_산저병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_상병연구 extends Command\NationCommand{
static protected $actionName = '상병 연구';
static protected $auxType = NationAuxKey::can_상병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_원융노병연구 extends Command\NationCommand{
static protected $actionName = '원융노병 연구';
static protected $auxType = NationAuxKey::can_원융노병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_음귀병연구 extends Command\NationCommand{
static protected $actionName = '음귀병 연구';
static protected $auxType = NationAuxKey::can_음귀병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_화륜차연구 extends Command\NationCommand{
static protected $actionName = '화륜차 연구';
static protected $auxType = NationAuxKey::can_화륜차사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_화시병연구 extends Command\NationCommand{
static protected $actionName = '화시병 연구';
static protected $auxType = NationAuxKey::can_화시병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
+1 -1
View File
@@ -50,7 +50,7 @@ class AllowJoinDestNation extends Constraint{
return false; return false;
} }
if(($this->general['npc']??2 < 2) && \str_starts_with($this->destNation['name'], 'ⓤ')){ if((($this->general['npc']??2) < 2) && \str_starts_with($this->destNation['name'], 'ⓤ')){
$this->reason = "유저장은 태수국에 임관할 수 없습니다."; $this->reason = "유저장은 태수국에 임관할 수 없습니다.";
return false; return false;
} }
@@ -6,9 +6,10 @@ use \sammo\GameUnitConst;
use \sammo\DB; use \sammo\DB;
use \sammo\KVStorage; use \sammo\KVStorage;
use \sammo\CityConst; use \sammo\CityConst;
use sammo\Json;
class AvailableRecruitCrewType extends Constraint{ class AvailableRecruitCrewType extends Constraint{
const REQ_VALUES = Constraint::REQ_NATION|Constraint::REQ_INT_ARG; const REQ_VALUES = Constraint::REQ_GENERAL|Constraint::REQ_NATION|Constraint::REQ_INT_ARG;
public function checkInputValues(bool $throwExeception=true):bool{ public function checkInputValues(bool $throwExeception=true):bool{
if(!parent::checkInputValues($throwExeception) && !$throwExeception){ if(!parent::checkInputValues($throwExeception) && !$throwExeception){
@@ -47,13 +48,22 @@ class AvailableRecruitCrewType extends Constraint{
$ownCities = []; $ownCities = [];
$ownRegions = []; $ownRegions = [];
foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i', $nationID) as $ownCity){ foreach($db->query('SELECT city, region, secu, level FROM city WHERE nation = %i', $nationID) as $ownCity){
$ownCities[$ownCity] = 1; $ownCityID = $ownCity['city'];
$ownRegions[CityConst::byId($ownCity)->region] = 1; $ownCities[$ownCityID] = [
'secu'=>$ownCity['secu'],
'level'=>$ownCity['level'],
];
$ownRegions[CityConst::byId($ownCityID)->region] = 1;
}
$nationAux = $this->nation['aux'] ?? null;
if($nationAux === null){
$nationAux = Json::decode($db->queryFirstField('SELECT aux FROM nation WHERE id = %i', $nationID) ?? "{}");
} }
$crewType = GameUnitConst::byID($this->arg); $crewType = GameUnitConst::byID($this->arg);
if($crewType->isValid($ownCities, $ownRegions, $year - $startyear, $tech)){ if($crewType->isValid($this->generalObj, $ownCities, $ownRegions, $year - $startyear, $tech, $nationAux)){
return true; return true;
} }
+12 -4
View File
@@ -2,6 +2,8 @@
namespace sammo\Constraint; namespace sammo\Constraint;
use sammo\General;
abstract class Constraint abstract class Constraint
{ {
private function __construct() private function __construct()
@@ -24,6 +26,8 @@ abstract class Constraint
const REQ_VALUES = 0; const REQ_VALUES = 0;
/** @var ?General */
protected $generalObj = null;
protected $general = null; protected $general = null;
protected $city = null; protected $city = null;
protected $nation = null; protected $nation = null;
@@ -33,6 +37,8 @@ abstract class Constraint
protected $cmd_arg = null; protected $cmd_arg = null;
/** @var ?General */
protected $destGeneralObj = null;
protected $destGeneral = null; protected $destGeneral = null;
protected $destCity = null; protected $destCity = null;
protected $destNation = null; protected $destNation = null;
@@ -48,9 +54,10 @@ abstract class Constraint
return static::REQ_VALUES; return static::REQ_VALUES;
} }
public function setGeneral(array $general) public function setGeneral(General $general)
{ {
$this->general = $general; $this->generalObj = $general;
$this->general = $general->getRaw();
$this->tested = false; $this->tested = false;
$this->reason = null; $this->reason = null;
} }
@@ -85,9 +92,10 @@ abstract class Constraint
$this->reason = null; $this->reason = null;
} }
public function setDestGeneral(array $general) public function setDestGeneral(General $general)
{ {
$this->destGeneral = $general; $this->destGeneralObj = $general;
$this->destGeneral = $general->getRaw();
$this->tested = false; $this->tested = false;
$this->reason = null; $this->reason = null;
} }
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\Enums;
// Nation['aux'] 에서 지정될 수 있는 키
enum NationAuxKey: string
{
case can_국기변경 = 'can_국기변경';
case can_국호변경 = 'can_국호변경';
case did_특성초토화 = 'did_특성초토화';
// 이벤트
case can_무작위수도이전 = 'can_무작위수도이전';
case can_대검병사용 = 'can_대검병사용';
case can_극병사용 = 'can_극병사용';
case can_화시병사용 = 'can_화시병사용';
case can_원융노병사용 = 'can_원융노병사용';
case can_산저병사용 = 'can_산저병사용';
case can_상병사용 = 'can_상병사용';
case can_음귀병사용 = 'can_음귀병사용';
case can_무희사용 = 'can_무희사용';
case can_화륜차사용 = 'can_화륜차사용';
}
@@ -0,0 +1,55 @@
<?php
namespace sammo\Event\Action;
use sammo\ActionLogger;
use sammo\CentennialAllStarGrowthService;
use sammo\DB;
use sammo\General;
use sammo\Json;
class AdvanceCentennialAllStar extends \sammo\Event\Action
{
public function run(array $env)
{
if (!CentennialAllStarGrowthService::isActive()) {
return [__CLASS__, 0];
}
$db = DB::db();
$updated = 0;
foreach ($db->query(
'SELECT general.no, select_pool.info
FROM general
JOIN select_pool ON select_pool.general_id = general.no'
) as $row) {
$general = General::createObjFromDB((int) $row['no']);
$targetInfo = Json::decode($row['info']);
$result = CentennialAllStarGrowthService::applyTarget(
$general,
$targetInfo,
$env,
CentennialAllStarGrowthService::progressMultiplierFor($general),
CentennialAllStarGrowthService::dexTargetRatioForNPCType(
$general->getNPCType()
)
);
if ($result['milestone'] > $result['previousMilestone']) {
$percent = $result['milestone'] * 20;
$general->getLogger()->pushGeneralActionLog(
"<L>올스타 동조율</>이 <C>{$percent}%</>에 도달했습니다!",
ActionLogger::PLAIN
);
$general->getLogger()->pushGeneralHistoryLog(
"<L>올스타 동조율 {$percent}% 달성</>"
);
}
if ($general->applyDB($db)) {
$updated++;
}
}
return [__CLASS__, $updated];
}
}
+17
View File
@@ -14,6 +14,13 @@ class ChangeCity extends \sammo\Event\Action{
'def'=>true, 'def'=>true,
'wall'=>true, 'wall'=>true,
'trade'=>true, 'trade'=>true,
'pop_max'=>true,
'agri_max'=>true,
'comm_max'=>true,
'secu_max'=>true,
'def_max'=>true,
'wall_max'=>true,
]; ];
const REGEXP_PERCENT = '/^(\d+(\.\d+)?)%$/';// 123.5% [1]=float const REGEXP_PERCENT = '/^(\d+(\.\d+)?)%$/';// 123.5% [1]=float
const REGEXP_MATH = '/^([\+\-\/\*])(\d+(\.\d+)?)$/'; //+30 [1]=기호, [2]=float const REGEXP_MATH = '/^([\+\-\/\*])(\d+(\.\d+)?)$/'; //+30 [1]=기호, [2]=float
@@ -120,6 +127,16 @@ class ChangeCity extends \sammo\Event\Action{
return DB::db()->sqleval('ROUND(%b * %d, 0)', $keyMax, $value/100); return DB::db()->sqleval('ROUND(%b * %d, 0)', $keyMax, $value/100);
} }
if(str_ends_with($key, '_max') && preg_match(self::REGEXP_MATH, $value, $matches)){
//key가 아예 최대치에 대한 값이면 연산은 결과값이 0보다만 높게.
$op = $matches[1];
$value = $matches[2];
if($op == '/' && $value == 0){
throw new \InvalidArgumentException('0으로 나눌 수 없습니다.');
}
return DB::db()->sqleval('greatest(0, ROUND(%b '.$op.' %i, 0))', $key, $value);
}
if(preg_match(self::REGEXP_MATH, $value, $matches)){ if(preg_match(self::REGEXP_MATH, $value, $matches)){
$op = $matches[1]; $op = $matches[1];
$value = $matches[2]; $value = $matches[2];
+9 -1
View File
@@ -5,6 +5,7 @@ namespace sammo\Event\Action;
use \sammo\GameConst; use \sammo\GameConst;
use \sammo\Util; use \sammo\Util;
use \sammo\DB; use \sammo\DB;
use sammo\CentennialAllStarGrowthService;
use sammo\LiteHashDRBG; use sammo\LiteHashDRBG;
use sammo\RandUtil; use sammo\RandUtil;
use sammo\UniqueConst; use sammo\UniqueConst;
@@ -35,7 +36,8 @@ class CreateManyNPC extends \sammo\Event\Action
))); )));
$result = []; $result = [];
foreach (pickGeneralFromPool(DB::db(), $rng, 0, $cnt) as $pickedNPC) { $db = DB::db();
foreach (pickGeneralFromPool($db, $rng, 0, $cnt) as $pickedNPC) {
$age = $rng->nextRangeInt(20, 25); $age = $rng->nextRangeInt(20, 25);
$birthYear = $env['year'] - $age; $birthYear = $env['year'] - $age;
$deathYear = $env['year'] + $rng->nextRangeInt(10, 50); $deathYear = $env['year'] + $rng->nextRangeInt(10, 50);
@@ -50,6 +52,12 @@ class CreateManyNPC extends \sammo\Event\Action
} }
$newNPC->fillRemainSpecAsZero($env); $newNPC->fillRemainSpecAsZero($env);
$newNPC->build($env); $newNPC->build($env);
CentennialAllStarGrowthService::applyCurrentTargetToBuiltNPC(
$db,
$newNPC,
$pickedNPC->getInfo(),
$env
);
$pickedNPC->occupyGeneralName(); $pickedNPC->occupyGeneralName();
$result[] = [ $result[] = [
$newNPC->getGeneralName(), $newNPC->getGeneralID() $newNPC->getGeneralName(), $newNPC->getGeneralID()
+14
View File
@@ -94,6 +94,11 @@ class GameConstBase
/** @var int 최대 레벨 */ /** @var int 최대 레벨 */
public static $maxLevel = 255; public static $maxLevel = 255;
/** @var int 기술등급 허용 증가 단위 년 */
public static $techLevelIncYear = 5;
/** @var int 초기 기술등급 */
public static $initialAllowedTechLevel = 1;
/** @var int 최소 인구 증가량 */ /** @var int 최소 인구 증가량 */
public static $basePopIncreaseAmount = 5000; public static $basePopIncreaseAmount = 5000;
/** @var int 증축시 인구 증가량 */ /** @var int 증축시 인구 증가량 */
@@ -109,6 +114,9 @@ class GameConstBase
/** @var int 징병 허용 최소 인구 */ /** @var int 징병 허용 최소 인구 */
public static $minAvailableRecruitPop = 30000; public static $minAvailableRecruitPop = 30000;
/** @var int 점령 후 일반 도시 성벽 */
public static $defaultCityWall = 1000;
/** @var int 초기 제한시 장수 제한 */ /** @var int 초기 제한시 장수 제한 */
public static $initialNationGenLimit = 10; public static $initialNationGenLimit = 10;
@@ -176,6 +184,10 @@ class GameConstBase
/** @var array 선택할 수 없으나 게임 내에 유효한 장수 내정 특기 */ /** @var array 선택할 수 없으나 게임 내에 유효한 장수 내정 특기 */
public static $optionalSpecialDomestic = [ public static $optionalSpecialDomestic = [
'None', 'None',
'che_event_귀병', 'che_event_신산', 'che_event_환술', 'che_event_집중', 'che_event_신중',
'che_event_반계', 'che_event_보병', 'che_event_궁병', 'che_event_기병', 'che_event_공성',
'che_event_돌격', 'che_event_무쌍', 'che_event_견고', 'che_event_위압', 'che_event_저격',
'che_event_필살', 'che_event_징병', 'che_event_의술', 'che_event_격노', 'che_event_척사',
]; ];
/** @var string 기본 전투 특기 */ /** @var string 기본 전투 특기 */
@@ -408,6 +420,8 @@ class GameConstBase
public static $retirementYear = 80; public static $retirementYear = 80;
public static $targetGeneralPool = 'RandomNameGeneral'; public static $targetGeneralPool = 'RandomNameGeneral';
/** @var float 100기 올스타 NPC의 원본 목표 대비 최종 숙련 비율 */
public static $centennialNpcDexTargetRatio = 0.4;
public static $generalPoolAllowOption = ['stat', 'ego', 'picture']; public static $generalPoolAllowOption = ['stat', 'ego', 'picture'];
public static $randGenFirstName = [ public static $randGenFirstName = [
+328 -396
View File
@@ -1,6 +1,13 @@
<?php <?php
namespace sammo; namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqTech;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqMinRelYear;
class GameUnitConstBase{ class GameUnitConstBase{
protected function __construct(){ protected function __construct(){
@@ -21,8 +28,6 @@ class GameUnitConstBase{
protected static $constID = []; protected static $constID = [];
protected static $constName = []; protected static $constName = [];
protected static $constCity = [];
protected static $constRegion = [];
protected static $constType = []; protected static $constType = [];
protected static $typeData = [ protected static $typeData = [
@@ -33,319 +38,322 @@ class GameUnitConstBase{
self::T_SIEGE => '차병', self::T_SIEGE => '차병',
]; ];
protected static $_buildData = [ protected static function getBuildData(): array {
[ return [
1000, self::T_CASTLE, '성벽', [
100, 100, 7, 0, 0, 99, 9, 1000, self::T_CASTLE, '성벽',
999999, null, null, 999999, 100, 100, 7, 0, 0, 99, 9,
[],//성벽은 공격할 수 없다. [new Impossible()],
[self::T_FOOTMAN=>1.2], [], // 성벽은 공격할 수 없다.
['성벽입니다.','생성할 수 없습니다.'], [self::T_FOOTMAN=>1.2],
null, ['che_선제사격시도', 'che_선제사격발동'], null ['성벽입니다.','생성할 수 없습니다.'],
], null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[ [
1100, self::T_FOOTMAN, '보병', 1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9, 100, 150, 7, 10, 0, 9, 9,
0, null, null, 0, [],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'], ['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1101, self::T_FOOTMAN, '청주병', 1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11, 100, 200, 7, 10, 0, 10, 11,
1000, null, ['중원'], 0, [new ReqTech(1000), new ReqRegions('중원')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'], ['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1102, self::T_FOOTMAN, '수병', 1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10, 150, 150, 7, 10, 0, 11, 10,
1000, null, ['오월'], 0, [new ReqTech(1000), new ReqRegions('오월')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'], ['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1103, self::T_FOOTMAN, '자객병', 1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10, 100, 150, 8, 20, 0, 10, 10,
2000, ['저'], null, 0, [new ReqTech(2000), new ReqCities('저')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'], ['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1104, self::T_FOOTMAN, '근위병', 1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12, 150, 200, 7, 10, 0, 12, 12,
3000, ['낙양'], null, 0, [new ReqTech(3000), new ReqCities('낙양')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'], ['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1105, self::T_FOOTMAN, '등갑병', 1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10, 100, 225, 7, 5, 0, 13, 10,
1000, null, ['남중'], 0, [new ReqTech(1000), new ReqRegions('남중')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2], [self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'], ['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1106, self::T_FOOTMAN, '백이병', 1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11, 175, 175, 7, 5, 0, 13, 11,
3000, ['성도'], null, 0, [new ReqTech(3000), new ReqCities('성도')],
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1], [self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9], [self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'], ['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null null, ['che_방어력증가5p'], null
], ],
[ [
1200, self::T_ARCHER, '궁병', 1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10, 100, 100, 7, 10, 0, 10, 10,
0, null, null, 0, [],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2], [self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8], [self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'], ['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null null, ['che_선제사격시도', 'che_선제사격발동'], null
], ],
[ [
1201, self::T_ARCHER, '궁기병', 1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12, 100, 100, 8, 20, 0, 11, 12,
1000, null, ['동이'], 0, [new ReqTech(1000), new ReqRegions('동이')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2], [self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8], [self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'], ['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null null, ['che_선제사격시도', 'che_선제사격발동'], null
], ],
[ [
1202, self::T_ARCHER, '연노병', 1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11, 150, 100, 8, 10, 0, 12, 11,
1000, null, ['서촉'], 0, [new ReqTech(1000), new ReqRegions('서촉')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2], [self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8], [self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'], ['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null null, ['che_선제사격시도', 'che_선제사격발동'], null
], ],
[ [
1203, self::T_ARCHER, '강궁병', 1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13, 150, 150, 7, 10, 0, 13, 13,
3000, ['양양'], null, 0, [new ReqTech(3000), new ReqCities('양양')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2], [self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8], [self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'], ['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null null, ['che_선제사격시도', 'che_선제사격발동'], null
], ],
[ [
1204, self::T_ARCHER, '석궁병', 1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13, 200, 100, 7, 10, 0, 13, 13,
3000, ['건업'], null, 0, [new ReqTech(3000), new ReqCities('건업')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2], [self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8], [self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'], ['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null null, ['che_선제사격시도', 'che_선제사격발동'], null
], ],
[ [
1300, self::T_CAVALRY, '기병', 1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11, 150, 100, 7, 5, 0, 11, 11,
0, null, null, 0, [],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'], ['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1301, self::T_CAVALRY, '백마병', 1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13, 200, 100, 7, 5, 0, 12, 13,
1000, null, ['하북'], 0, [new ReqTech(1000), new ReqRegions('하북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'], ['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1302, self::T_CAVALRY, '중장기병', 1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12, 150, 150, 7, 5, 0, 13, 12,
1000, null, ['서북'], 0, [new ReqTech(1000), new ReqRegions('서북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'], ['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1303, self::T_CAVALRY, '돌격기병', 1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11, 200, 100, 8, 5, 0, 13, 11,
2000, ['흉노'], null, 0, [new ReqTech(2000), new ReqCities('흉노')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'], ['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1304, self::T_CAVALRY, '철기병', 1304, self::T_CAVALRY, '철기병',
100, 250, 7, 5, 0, 11, 13, 100, 250, 7, 5, 0, 11, 13,
2000, ['강'], null, 0, [new ReqTech(2000), new ReqCities('강')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'], ['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1305, self::T_CAVALRY, '수렵기병', 1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12, 150, 100, 8, 15, 0, 12, 12,
2000, ['산월'], null, 0, [new ReqTech(2000), new ReqCities('산월')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'], ['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1306, self::T_CAVALRY, '맹수병', 1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16, 250, 175, 6, 0, 0, 16, 16,
2000, ['남만'], null, 0, [new ReqTech(2000), new ReqCities('남만')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'], ['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1307, self::T_CAVALRY, '호표기병', 1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14, 200, 150, 7, 5, 0, 14, 14,
3000, ['허창'], null, 0, [new ReqTech(3000), new ReqCities('허창')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'], ['정예 기병입니다.'],
null, ['che_기병병종전투'], null null, ['che_기병병종전투'], null
], ],
[ [
1400, self::T_WIZARD, '귀병', 1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9, 80, 80, 7, 5, 0.5, 9, 9,
0, null, null, 0, [],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'], ['계략을 사용하는 병종입니다.'],
null, null, null null, null, null
], ],
[ [
1401, self::T_WIZARD, '신귀병', 1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10, 80, 80, 7, 20, 0.6, 10, 10,
1000, null, ['초'], 0, [new ReqTech(1000), new ReqRegions('초')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'], ['신출귀몰한 귀병입니다.'],
null, null, null null, null, null
], ],
[ [
1402, self::T_WIZARD, '백귀병', 1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11, 80, 130, 7, 5, 0.6, 9, 11,
2000, ['오환'], null, 0, [new ReqTech(2000), new ReqCities('오환')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'], ['저렴하고 튼튼합니다.'],
null, null, null null, null, null
], ],
[ [
1403, self::T_WIZARD, '흑귀병', 1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9, 130, 80, 7, 5, 0.6, 11, 9,
2000, ['왜'], null, 0, [new ReqTech(2000), new ReqCities('왜')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'], ['저렴하고 강력합니다.'],
null, null, null null, null, null
], ],
[ [
1404, self::T_WIZARD, '악귀병', 1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12, 130, 130, 7, 0, 0.6, 12, 12,
3000, ['장안'], null, 0, [new ReqTech(3000), new ReqCities('장안')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'], ['백병전에도 능숙합니다.'],
null, null, null null, null, null
], ],
[ [
1405, self::T_WIZARD, '남귀병', 1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8, 60, 60, 7, 10, 0.8, 8, 8,
1000, null, null, 0, [new ReqTech(1000)],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'], ['전투를 포기하고 계략에 몰두합니다.'],
null, null, null null, null, null
], ],
[ [
1406, self::T_WIZARD, '황귀병', 1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10, 110, 110, 7, 0, 0.8, 13, 10,
3000, ['낙양'], null, 0, [new ReqTech(3000), new ReqCities('낙양')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'], ['고도로 훈련된 귀병입니다.'],
null, null, null null, null, null
], ],
[ [
1407, self::T_WIZARD, '천귀병', 1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12, 80, 130, 7, 15, 0.6, 11, 12,
3000, ['성도'], null, 0, [new ReqTech(3000), new ReqCities('성도')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'], ['갑주를 두른 귀병입니다.'],
null, null, null null, null, null
], ],
[ [
1408, self::T_WIZARD, '마귀병', 1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11, 130, 80, 7, 15, 0.6, 12, 11,
3000, ['업'], null, 0, [new ReqTech(3000), new ReqCities('업')],
[self::T_SIEGE=>1.2], [self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8], [self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'], ['날카로운 무기를 가진 귀병입니다.'],
null, null, null null, null, null
], ],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
[new ReqMinRelYear(3)],
[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, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
[new ReqTech(3000), new ReqCities('업')],
[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, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
}
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
0, null, null, 3,
[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, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
3000, ['업'], null, 0,
[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, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
3000, ['성도'], null, 0,
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
public static function addGameUnit(GameUnitDetail $unitType){ public static function addGameUnit(GameUnitDetail $unitType){
static::_generate(); static::_generate();
@@ -357,22 +365,6 @@ class GameUnitConstBase{
static::$constType[$unitType->armType] = []; static::$constType[$unitType->armType] = [];
} }
static::$constType[$unitType->armType][] = $unitType; static::$constType[$unitType->armType][] = $unitType;
foreach($unitType->reqCities as $reqCity){
if(!key_exists($reqCity, static::$constCity)){
static::$constCity[$reqCity] = [];
}
static::$constCity[$reqCity][] = $unitType;
}
if($unitType->reqRegions){
foreach($unitType->reqRegions as $reqRegion){
if(!key_exists($reqRegion, static::$constRegion)){
static::$constRegion[$reqRegion] = [];
}
static::$constRegion[$reqRegion][] = $unitType;
}
}
} }
/** /**
@@ -400,22 +392,6 @@ class GameUnitConstBase{
return static::$constName[$name]??null; return static::$constName[$name]??null;
} }
/**
* @return \sammo\GameUnitDetail[]
*/
public static function byCity(int $city): array{
static::_generate();
return static::$constCity[$city]??[];
}
/**
* @return \sammo\GameUnitDetail[]
*/
public static function byRegion(int $region): array{
static::_generate();
return static::$constRegion[$region]??[];
}
/** /**
* @return \sammo\GameUnitDetail[] * @return \sammo\GameUnitDetail[]
@@ -435,17 +411,17 @@ class GameUnitConstBase{
protected static function _generate(){ protected static function _generate(){
if(static::$constID || static::$constName || static::$constCity || static::$constRegion || static::$constType){ if(static::$constID || static::$constName || static::$constType){
return; return;
} }
$constID = []; $constID = [];
$constName = []; $constName = [];
$constCity = [];
$constRegion = [];
$constType = []; $constType = [];
foreach(static::$_buildData as $rawUnit){ $buildData = static::getBuildData();
foreach($buildData as $rawUnit){
[ [
$id, $id,
$armType, $armType,
@@ -457,10 +433,7 @@ class GameUnitConstBase{
$magicCoef, $magicCoef,
$cost, $cost,
$rice, $rice,
$reqTech, $reqConstraints,
$reqCities,
$reqRegions,
$reqYear,
$attackCoef, $attackCoef,
$defenceCoef, $defenceCoef,
$info, $info,
@@ -469,26 +442,9 @@ class GameUnitConstBase{
$iActionList, $iActionList,
] = $rawUnit; ] = $rawUnit;
if($reqYear > 0){ foreach($reqConstraints as $constraint){
$info[] = "{$reqYear}년 경과 후 사용 가능"; /** @var \sammo\GameUnitConstraint\BaseGameUnitConstraint $constraint */
} $info[] = $constraint->getInfo();
if($reqTech > 0){
$info[] = "기술력 {$reqTech} 이상 필요";
}
if($reqCities !== null){
$reqCities = array_map(function($reqCity) use (&$info){
$info[] = "{$reqCity} 소유시 가능";
return CityConst::byName($reqCity)->id;
}, $reqCities);
}
if($reqRegions !== null){
$reqRegions = array_map(function($reqRegion) use (&$info){
$info[] = "{$reqRegion} 지역 소유시 가능";
return CityConst::$regionMap[$reqRegion];
}, $reqRegions);
} }
$unit = new GameUnitDetail( $unit = new GameUnitDetail(
@@ -502,16 +458,13 @@ class GameUnitConstBase{
$magicCoef, $magicCoef,
$cost, $cost,
$rice, $rice,
$reqTech, $reqConstraints,
$reqCities,
$reqRegions,
$reqYear,
$attackCoef, $attackCoef,
$defenceCoef, $defenceCoef,
$info, $info,
$initSkillTrigger, $initSkillTrigger,
$phaseSkillTrigger, $phaseSkillTrigger,
$iActionList, $iActionList
); );
$constID[$id] = $unit; $constID[$id] = $unit;
@@ -521,31 +474,10 @@ class GameUnitConstBase{
} }
$constType[$armType][$id] = $unit; $constType[$armType][$id] = $unit;
if($unit->reqCities){
foreach($unit->reqCities as $reqCity){
if(!key_exists($reqCity, $constCity)){
$constCity[$reqCity] = [];
}
$constCity[$reqCity][$id] = $unit;
}
}
if($unit->reqRegions){
foreach($unit->reqRegions as $reqRegion){
if(!key_exists($reqRegion, $constRegion)){
$constRegion[$reqRegion] = [];
}
$constRegion[$reqRegion][$id] = $unit;
}
}
} }
static::$constID = $constID; static::$constID = $constID;
static::$constName = $constName; static::$constName = $constName;
static::$constCity = $constCity;
static::$constRegion = $constRegion;
static::$constType = $constType; static::$constType = $constType;
static::_generateOptional(); static::_generateOptional();
@@ -0,0 +1,11 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
abstract class BaseGameUnitConstraint {
public abstract function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool;
public abstract function getInfo(): string;
}
@@ -0,0 +1,18 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class Impossible extends BaseGameUnitConstraint {
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
return false;
}
public function getInfo(): string
{
return "불가능";
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqChief extends BaseGameUnitConstraint
{
public function __construct()
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if($general->getVar('officer_level') >= 5){
return true;
}
return false;
}
public function getInfo(): string
{
return "군주 및 수뇌부만 가능";
}
}
@@ -0,0 +1,42 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqCities extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(...$reqCities)
{
$dstReqCities = [];
if (count($reqCities) == 0) {
$this->reqCities = [];
return;
}
foreach ($reqCities as $city) {
$dstReqCities[CityConst::byName($city)->id] = $city;
}
$this->reqCities = $dstReqCities;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqCities as $cityID => $cityName) {
if (key_exists($cityID, $ownCities)) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$cityNameText = implode(', ', $this->reqCities);
return "{$cityNameText} 소유시 가능";
}
}
@@ -0,0 +1,51 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
use function sammo\getCityLevelList;
class ReqCitiesWithCityLevel extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(
public readonly int $reqCityLevel,
...$reqCities)
{
$dstReqCities = [];
if (count($reqCities) == 0) {
$this->reqCities = [];
return;
}
foreach ($reqCities as $city) {
$dstReqCities[CityConst::byName($city)->id] = $city;
}
$this->reqCities = $dstReqCities;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqCities as $cityID => $cityName) {
if (!key_exists($cityID, $ownCities)) {
continue;
}
if($ownCities[$cityID]['level'] >= $this->reqCityLevel) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$cityLevelText = getCityLevelList()[$this->reqCityLevel];
$cityNameText = implode(', ', $this->reqCities);
return "{$cityNameText} {$cityLevelText}성 소유시 가능";
}
}
@@ -0,0 +1,39 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use function sammo\getCityLevelList;
class ReqHighLevelCities extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(
public readonly int $reqCityLevel,
public readonly int $reqCityCount
) {}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
$cnt = 0;
foreach ($ownCities as $cityItem) {
if ($cityItem['level'] >= $this->reqCityLevel) {
$cnt++;
}
}
if($cnt >= $this->reqCityCount) {
return true;
}
return false;
}
public function getInfo(): string
{
$cityLevelText = getCityLevelList()[$this->reqCityLevel];
return "{$cityLevelText}{$this->reqCityCount}개 이상 소유시 가능";
}
}
@@ -0,0 +1,22 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqMinRelYear extends BaseGameUnitConstraint {
public function __construct(public readonly int $reqMinRelYear)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
return $relativeYear >= $this->reqMinRelYear;
}
public function getInfo(): string
{
return "{$this->reqMinRelYear}년 경과 후 사용 가능";
}
}
@@ -0,0 +1,122 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\Enums\NationAuxKey;
use sammo\General;
class ReqNationAux extends BaseGameUnitConstraint
{
const AVAILABLE_CMP = [
'==' => true,
'!=' => true,
'<' => true,
'>' => true,
'<=' => true,
'>=' => true,
];
public function __construct(
public readonly NationAuxKey $reqNationAuxKey,
public readonly string $cmp,
public readonly int|float $value
) {
if (!array_key_exists($cmp, self::AVAILABLE_CMP)) {
throw new \InvalidArgumentException('올바르지 않은 비교연산자입니다');
}
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
$lhs = $nationAux[$this->reqNationAuxKey->value] ?? 0;
$rhs = $this->value;
$value = false;
switch ($this->cmp) {
case '==':
$value = ($lhs == $rhs);
break;
case '!=':
$value = ($lhs != $rhs);
break;
case '<=':
$value = ($lhs <= $rhs);
break;
case '>=':
$value = ($lhs >= $rhs);
break;
case '<':
$value = ($lhs < $rhs);
break;
case '>':
$value = ($lhs > $rhs);
break;
}
return $value;
}
public function getInfo(): string
{
//Enum별 특수한 경우
switch ($this->reqNationAuxKey) {
case NationAuxKey::can_대검병사용:
if ($this->cmp == "==" && $this->value == 1) return "대검병 연구 시 가능";
break;
case NationAuxKey::can_극병사용:
if ($this->cmp == "==" && $this->value == 1) return "극병 연구 시 가능";
break;
case NationAuxKey::can_화시병사용:
if ($this->cmp == "==" && $this->value == 1) return "화시병 연구 시 가능";
break;
case NationAuxKey::can_원융노병사용:
if ($this->cmp == "==" && $this->value == 1) return "원융노병 연구 시 가능";
break;
case NationAuxKey::can_산저병사용:
if ($this->cmp == "==" && $this->value == 1) return "산저병 연구 시 가능";
break;
case NationAuxKey::can_상병사용:
if ($this->cmp == "==" && $this->value == 1) return "상병 연구 시 가능";
break;
case NationAuxKey::can_음귀병사용:
if ($this->cmp == "==" && $this->value == 1) return "음귀병 연구 시 가능";
break;
case NationAuxKey::can_무희사용:
if ($this->cmp == "==" && $this->value == 1) return "무희 연구 시 가능";
break;
case NationAuxKey::can_화륜차사용:
if ($this->cmp == "==" && $this->value == 1) return "화륜차 연구 시 가능";
break;
case NationAuxKey::did_특성초토화:
if ($this->cmp == ">=" && $this->value == 1) return "특성 초토화 시 가능";
break;
}
//범용
switch ($this->cmp) {
case '==': {
if ($this->value == 0) {
return "{$this->reqNationAuxKey->value} 없을 때";
}
if ($this->value == 1) {
return "{$this->reqNationAuxKey->value} 있을 때";
}
return "{$this->reqNationAuxKey->value} = {$this->value} 일 때";
};
case '!=': {
if ($this->value == 0) {
return "{$this->reqNationAuxKey->value} 없을 때";
}
if ($this->value == 1) {
return "{$this->reqNationAuxKey->value} 있을 때";
}
return "{$this->reqNationAuxKey->value} != {$this->value} 일 때";
};
default:
return "{$this->reqNationAuxKey->value} {$this->cmp} {$this->value} 일 때";
}
}
}
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqNotChief extends BaseGameUnitConstraint
{
public function __construct()
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if($general->getVar('officer_level') < 5){
return true;
}
return false;
}
public function getInfo(): string
{
return "군주 및 수뇌부는 불가";
}
}
@@ -0,0 +1,43 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqRegions extends BaseGameUnitConstraint
{
public readonly array $reqRegions;
public function __construct(...$reqRegions)
{
$dstReqRegions = [];
if (count($reqRegions) == 0) {
$this->reqRegions = [];
return;
}
foreach ($reqRegions as $region) {
$dstReqRegions[CityConst::$regionMap[$region]] = $region;
}
$this->reqRegions = $dstReqRegions;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqRegions as $regionID => $regionText) {
if (key_exists($regionID, $ownRegions)) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$regionNameText = implode(', ', $this->reqRegions);
return "{$regionNameText} 지역 소유시 가능";
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use sammo\KVStorage;
class ReqTech extends BaseGameUnitConstraint {
public function __construct(public readonly int $reqTech)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if ($tech < $this->reqTech) {
return false;
}
return true;
}
public function getInfo(): string
{
return "기술력 {$this->reqTech} 이상 필요";
}
}
+46 -46
View File
@@ -2,6 +2,8 @@
namespace sammo; namespace sammo;
use sammo\GameUnitConstraint\BaseGameUnitConstraint;
class GameUnitDetail implements iAction class GameUnitDetail implements iAction
{ {
use DefaultAction; use DefaultAction;
@@ -16,17 +18,14 @@ class GameUnitDetail implements iAction
public $magicCoef; public $magicCoef;
public $cost; public $cost;
public $rice; public $rice;
public $reqTech;
public $reqCities;
public $reqRegions;
public $reqYear;
public $attackCoef; public $attackCoef;
public $defenceCoef; public $defenceCoef;
public $info;
public $initSkillTrigger; public $initSkillTrigger;
public $phaseSkillTrigger; public $phaseSkillTrigger;
/** @var iAction[]|null iActionList */ /** @var iAction[]|null iActionList */
public $iActionList; public $iActionList;
public array $reqConstraints;
public function __construct( public function __construct(
int $id, int $id,
@@ -39,13 +38,10 @@ class GameUnitDetail implements iAction
float $magicCoef, float $magicCoef,
int $cost, int $cost,
int $rice, int $rice,
int $reqTech, array $reqConstraints,
?array $reqCities,
?array $reqRegions,
int $reqYear,
array $attackCoef, array $attackCoef,
array $defenceCoef, array $defenceCoef,
array $info, public readonly array $info,
?array $initSkillTrigger, ?array $initSkillTrigger,
?array $phaseSkillTrigger, ?array $phaseSkillTrigger,
?array $iActionList, ?array $iActionList,
@@ -60,13 +56,18 @@ class GameUnitDetail implements iAction
$this->magicCoef = $magicCoef; $this->magicCoef = $magicCoef;
$this->cost = $cost; $this->cost = $cost;
$this->rice = $rice; $this->rice = $rice;
$this->reqTech = $reqTech; $this->reqConstraints = [];
$this->reqCities = $reqCities; foreach($reqConstraints as $constraint){
$this->reqRegions = $reqRegions; $className = Util::getClassNameFromObj($constraint);
$this->reqYear = $reqYear; if(!key_exists($className, $this->reqConstraints)){
$this->reqConstraints[$className] = $constraint;
}
else{
$this->reqConstraints[] = $constraint;
}
}
$this->attackCoef = $attackCoef; $this->attackCoef = $attackCoef;
$this->defenceCoef = $defenceCoef; $this->defenceCoef = $defenceCoef;
$this->info = $info;
$this->initSkillTrigger = $initSkillTrigger; $this->initSkillTrigger = $initSkillTrigger;
$this->phaseSkillTrigger = $phaseSkillTrigger; $this->phaseSkillTrigger = $phaseSkillTrigger;
$this->iActionList = []; $this->iActionList = [];
@@ -79,6 +80,33 @@ class GameUnitDetail implements iAction
} }
} }
public function reqTech(): int {
$reqTechObj = $this->reqConstraints['ReqTech'] ?? null;
if($reqTechObj === null){
return 0;
}
return $reqTechObj->reqTech;
}
public function reqRegions(): ?array {
$reqRegionsObj = $this->reqConstraints['ReqRegions'] ?? null;
if($reqRegionsObj === null){
return null;
}
return $reqRegionsObj->reqRegions;
}
public function reqCities(): ?array {
$reqCitiesObj = $this->reqConstraints['ReqCities'] ?? null;
if($reqCitiesObj === null){
return null;
}
return $reqCitiesObj->reqCities;
}
public function getInfo(): string public function getInfo(): string
{ {
return join("\n<br>", $this->info); return join("\n<br>", $this->info);
@@ -193,41 +221,13 @@ class GameUnitDetail implements iAction
return $defaultWar; return $defaultWar;
} }
public function isValid($ownCities, $ownRegions, $relativeYear, $tech) public function isValid(General $general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux)
{ {
//음수 없음 //음수 없음
$relativeYear = max(0, $relativeYear); $relativeYear = max(0, $relativeYear);
if ($relativeYear < $this->reqYear) { foreach($this->reqConstraints as $constraint){
return false; if(!$constraint->test($general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux)){
}
if ($tech < $this->reqTech) {
return false;
}
if ($this->reqCities !== null) {
$valid = false;
foreach ($this->reqCities as $reqCity) {
if (\key_exists($reqCity, $ownCities)) {
$valid = true;
break;
}
}
if (!$valid) {
return false;
}
}
if ($this->reqRegions !== null) {
$valid = false;
foreach ($this->reqRegions as $reqRegion) {
if (\key_exists($reqRegion, $ownRegions)) {
$valid = true;
break;
}
}
if (!$valid) {
return false; return false;
} }
} }
+25 -12
View File
@@ -2084,7 +2084,7 @@ class GeneralAI
} }
} }
$finalCityID = Util::array_first_key($cityScoreList); $finalCityID = array_key_first($cityScoreList);
$dist = $distanceList[$capital][$finalCityID]; $dist = $distanceList[$capital][$finalCityID];
$targetCityID = $finalCityID; $targetCityID = $finalCityID;
if ($dist > 1) { if ($dist > 1) {
@@ -2558,8 +2558,11 @@ class GeneralAI
$cities = []; $cities = [];
$regions = []; $regions = [];
foreach ($db->queryAllLists('SELECT city, region FROM city WHERE nation = %i', $nationID) as [$cityID, $regionID]) { foreach ($db->queryAllLists('SELECT city, region, secu, level FROM city WHERE nation = %i', $nationID) as [$cityID, $regionID, $secu, $level]) {
$cities[$cityID] = true; $cities[$cityID] = [
'secu' => $secu,
'level' => $level,
];
$regions[$regionID] = true; $regions[$regionID] = true;
} }
$relYear = Util::valueFit($env['year'] - $env['startyear'], 0); $relYear = Util::valueFit($env['year'] - $env['startyear'], 0);
@@ -2567,7 +2570,7 @@ class GeneralAI
$types = []; $types = [];
foreach (GameUnitConst::byType($armType) as $crewtype) { foreach (GameUnitConst::byType($armType) as $crewtype) {
if ($crewtype->isValid($cities, $regions, $relYear, $tech)) { if ($crewtype->isValid($general, $cities, $regions, $relYear, $tech, $this->nation['aux'])) {
$score = $crewtype->pickScore($tech); $score = $crewtype->pickScore($tech);
$types[$crewtype->id] = $score; $types[$crewtype->id] = $score;
} }
@@ -2581,12 +2584,16 @@ class GeneralAI
if ($this->generalPolicy->can고급병종) { if ($this->generalPolicy->can고급병종) {
$currCrewType = $general->getCrewTypeObj(); $currCrewType = $general->getCrewTypeObj();
if ($currCrewType->isValid($cities, $regions, $relYear, $tech)) { if ($currCrewType->isValid($general, $cities, $regions, $relYear, $tech, $this->nation['aux'])) {
if ($currCrewType->reqTech >= 2000) { $reqTechObj = $currCrewType->reqConstraints['ReqTech'] ?? null;
$type = $currCrewType->id; if($reqTechObj){
} else if ($currCrewType->armType != $armType && $currCrewType->reqTech >= 1000) { $reqTech = $reqTechObj->reqTech;
//굳이 뽑은 이유가 있겠지 if ($reqTech >= 2000) {
$type = $currCrewType->id; $type = $currCrewType->id;
} else if ($currCrewType->armType != $armType && $reqTech >= 1000) {
//굳이 뽑은 이유가 있겠지
$type = $currCrewType->id;
}
} }
} }
} }
@@ -3122,8 +3129,14 @@ class GeneralAI
$db = DB::db(); $db = DB::db();
$dupLord = $db->queryFirstField('SELECT COUNT(*) FROM general WHERE officer_level = 12 AND city = %i', $this->general->getCityID()); $dupLord = $db->queryFirstField('SELECT COUNT(*) FROM general WHERE officer_level = 12 AND city = %i', $this->general->getCityID());
if($dupLord <= 1 && !in_array($this->general->getRawCity()['level'], [5, 6])) { if($dupLord <= 1) {
return null; if ($this->general->getRawCity() === null) {
$rawCity = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $this->general->getCityID());
$this->general->setRawCity($rawCity);
}
if (in_array($this->general->getRawCity()['level'], [5, 6])) {
return null;
}
} }
$general = $this->general; $general = $this->general;
File diff suppressed because it is too large Load Diff
+90
View File
@@ -0,0 +1,90 @@
<?php
namespace sammo\GeneralPool;
use sammo\AbsFromUserPool;
use sammo\CentennialAllStarGrowthService;
use sammo\Json;
use sammo\RandUtil;
class SPoolUnderU100 extends AbsFromUserPool
{
private const MIN_DEX_WEIGHT = 100000;
private const STAT_BONUS_MIN_TOTAL = 160;
private const STAT_BONUS_MAX_TOTAL = 190;
private const STAT_BONUS_MAX_MULTIPLIER = 1.5;
public function __construct(\MeekroDB $db, RandUtil $rng, array $info, string $validUntil)
{
$targetInfo = $info;
$initialInfo = $info;
foreach ([
'leadership',
'strength',
'intel',
'experience',
'dedication',
'dex',
'specialDomestic',
'specialWar',
] as $targetKey) {
unset($initialInfo[$targetKey]);
}
parent::__construct($db, $rng, $initialInfo, $validUntil);
$this->info = $targetInfo;
CentennialAllStarGrowthService::attachInitialTarget($this->builder, $targetInfo);
}
public static function getPoolName(): string
{
return '100기 올스타 클래식';
}
protected static function getCandidateWeight(array $info, int $owner): int|float
{
$dexWeight = max(
self::MIN_DEX_WEIGHT,
array_sum($info['dex'] ?? [])
);
if ($owner <= 0) {
return $dexWeight;
}
$statTotal = array_sum([
(int) ($info['leadership'] ?? 0),
(int) ($info['strength'] ?? 0),
(int) ($info['intel'] ?? 0),
]);
$normalizedStat = min(1, max(
0,
($statTotal - self::STAT_BONUS_MIN_TOTAL)
/ (self::STAT_BONUS_MAX_TOTAL - self::STAT_BONUS_MIN_TOTAL)
));
$statMultiplier = 1
+ (self::STAT_BONUS_MAX_MULTIPLIER - 1) * $normalizedStat;
return $dexWeight * $statMultiplier;
}
public static function initPool(\MeekroDB $db)
{
$jsonData = Json::decode(file_get_contents(__DIR__ . '/Pool/UnderS100.json'));
$columns = $jsonData['columns'];
$sqlValues = [];
foreach ($jsonData['data'] as $idx => $rawItem) {
if (count($rawItem) !== count($columns)) {
throw new \RuntimeException(($rawItem[0] ?? (string) $idx) . ' Error');
}
$item = array_combine($columns, $rawItem);
$uniqueName = sprintf('A100%04d', $idx + 1);
$item['uniqueName'] = $uniqueName;
$item['event100Growth'] = true;
$sqlValues[] = [
'unique_name' => $uniqueName,
'info' => Json::encode($item),
];
}
$db->insert('select_pool', $sqlValues);
}
}
+10 -2
View File
@@ -334,11 +334,19 @@ class InheritancePointManager
$inheritStor->setValue($key, [$point, $aux]); $inheritStor->setValue($key, [$point, $aux]);
} }
$oldInheritStor = KVStorage::getStorage(DB::db(), "inheritance_result"); $db = DB::db();
$serverID = UniqueConst::$serverID; $serverID = UniqueConst::$serverID;
$year = $gameStor->year; $year = $gameStor->year;
$month = $gameStor->month; $month = $gameStor->month;
$oldInheritStor->setValue("{$serverID}_{$ownerID}_{$general->getID()}_{$year}_{$month}", $inheritStor->getAll(true));
$db->insert('inheritance_result', [
'server_id'=>$serverID,
'owner'=>$ownerID,
'general_id'=>$general->getID(),
'year'=>$year,
'month'=>$month,
'value'=>Json::encode($inheritStor->getAll(true))
]);
} }
+1 -1
View File
@@ -62,7 +62,7 @@ abstract class TriggerCaller{
return $this; return $this;
} }
$lastKey = Util::array_last_key($this->triggerListByPriority); $lastKey = array_key_last($this->triggerListByPriority);
if($lastKey < $priority){ if($lastKey < $priority){
$this->triggerListByPriority[$priority] = [$uniqueID=>$trigger]; $this->triggerListByPriority[$priority] = [$uniqueID=>$trigger];
return $this; return $this;
+1 -8
View File
@@ -422,7 +422,7 @@ class TurnExecutionHelper
$date = TimeUtil::now(true); $date = TimeUtil::now(true);
// 최종 처리 월턴의 다음 월턴시간 구함 // 최종 처리 월턴의 다음 월턴시간 구함
$lastExecuted = $gameStor->turntime; //$lastExecuted = $gameStor->turntime;
$prevTurn = cutTurn($gameStor->turntime, $gameStor->turnterm); $prevTurn = cutTurn($gameStor->turntime, $gameStor->turnterm);
$nextTurn = addTurn($prevTurn, $gameStor->turnterm); $nextTurn = addTurn($prevTurn, $gameStor->turnterm);
@@ -455,9 +455,6 @@ class TurnExecutionHelper
$gameStor->turntime = $currentTurn; $gameStor->turntime = $currentTurn;
} }
unlock(); unlock();
if($lastExecuted !== $currentTurn){
$executed = true;
}
return $gameStor->turntime; return $gameStor->turntime;
} }
@@ -516,10 +513,6 @@ class TurnExecutionHelper
$gameStor->resetCache(); $gameStor->resetCache();
unlock(); unlock();
if($lastExecuted !== $currentTurn){
$executed = true;
}
return $turntime; return $turntime;
} }
} }
+974
View File
@@ -0,0 +1,974 @@
{
"title":"【역사모드2-2】 반동탁연합 결성(정사)",
"startYear":187,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["동탁", "#A9A9A9", 12000, 80000, "천자를 등에 업은 동탁", 2000, "명가", 5, ["낙양", "호로", "사수", "함곡", "장안", "홍농", "사곡", "안정"]],
["조조", "#0000FF", 10000, 40000, "동탁의거의 조조", 1000, "법가", 1, ["진류"]],
["유대", "#800000", 10000, 10000, "연주자사 유대, 유요의 형", 1000, "병가", 3, ["복양"]],
["공손찬", "#FF00FF", 10000, 10000, "백마의 공손찬", 1000, "병가", 1, ["북평"]],
["장양", "#7B68EE", 10000, 10000, "병주자사 장양", 1000, "병가", 3, ["진양"]],
["유언", "#483D8B", 10000, 30000, "익주목 유언", 1000, "유가", 4, ["성도", "자동", "면죽"]],
["원술", "#FFC0CB", 15000, 40000, "후장군 원술", 1000, "병가", 2, ["완"]],
["도겸", "#00FF00", 10000, 10000, "서주목 도겸", 1000, "유가", 4, ["서주", "하비.광릉"]],
["진온", "#808000", 10000, 10000, "양주자사 진온", 1000, "유가", 3, ["수춘", "합비"]],
["마등", "#808000", 10000, 10000, "서량태수 마등", 1000, "병가", 1, ["서량"]],
["공손도", "#A0522D", 10000, 10000, "요동의 왕 공손도", 1000, "덕가", 1, ["안평"]],
["한복", "#A0522D", 10000, 10000, "기주자사 한복", 1000, "병가", 3, ["업"]],
["유표", "#E0FFFF", 10000, 10000, "형주자사 유표", 1000, "유가", 3, ["양양", "장판", "강하"]],
["장로", "#20B2AA", 10000, 10000, "사실 이때 없는 애지만 장로", 1000, "오두미도", 1, ["한중"]],
["왕광", "#483D8B", 10000, 10000, "하내태수 왕광", 1000, "유가", 1, ["하내"]],
["유우", "#6495ED", 10000, 10000, "유주자사 유우", 1000, "유가", 5, ["계", "역경"]],
["원소", "#FFFF00", 10000, 10000, "발해태수 원소", 1000, "병가", 1, ["남피"]],
["사섭", "#800000", 10000, 10000, "교주자사 사섭", 1000, "유가", 3, ["교지", "남해"]],
["공융", "#800080", 10000, 10000, "북해태수 공융", 1000, "유가", 1, ["북해"]],
["한수", "#FFFFFF", 10000, 10000, "서량의 모반자 한수", 1000, "병가", 1, ["천수"]],
["공주", "#800080", 10000, 10000, "예주 자사 공주", 1000, "유가", 3, ["초"]],
["유총", "#7B68EE", 10000, 10000, "진민왕 유총", 1000, "덕가", 6, ["여남"]]
],
"diplomacy":[
[1,2,1,36],
[1,3,1,36],
[1,5,1,36],
[1,6,1,36],
[1,7,1,36],
[1,8,1,36],
[1,9,1,36],
[1,10,1,36],
[1,11,1,36],
[1,12,1,36],
[1,13,1,36],
[1,14,1,36],
[1,15,1,36],
[1,16,1,36],
[1,17,1,36],
[1,18,1,36],
[1,19,1,36],
[1,20,1,36],
[1,21,1,36],
[1,22,1,36],
[2,3,7,24],
[2,5,7,24],
[2,6,7,24],
[2,7,7,24],
[2,8,7,24],
[2,9,7,24],
[2,10,7,24],
[2,11,7,24],
[2,12,7,24],
[2,13,7,24],
[2,14,7,24],
[2,15,7,24],
[2,16,7,24],
[2,17,7,24],
[2,18,7,24],
[2,19,7,24],
[2,20,7,24],
[2,21,7,24],
[2,22,7,24],
[3,5,7,24],
[3,6,7,24],
[3,7,7,24],
[3,8,7,24],
[3,9,7,24],
[3,10,7,24],
[3,11,7,24],
[3,12,7,24],
[3,13,7,24],
[3,14,7,24],
[3,15,7,24],
[3,16,7,24],
[3,17,7,24],
[3,18,7,24],
[3,19,7,24],
[3,20,7,24],
[3,21,7,24],
[3,22,7,24],
[5,6,7,24],
[5,7,7,24],
[5,8,7,24],
[5,9,7,24],
[5,10,7,24],
[5,11,7,24],
[5,12,7,24],
[5,13,7,24],
[5,14,7,24],
[5,15,7,24],
[5,16,7,24],
[5,17,7,24],
[5,18,7,24],
[5,19,7,24],
[5,20,7,24],
[5,21,7,24],
[5,22,7,24],
[6,7,7,24],
[6,8,7,24],
[6,9,7,24],
[6,10,7,24],
[6,11,7,24],
[6,12,7,24],
[6,13,7,24],
[6,14,7,24],
[6,15,7,24],
[6,16,7,24],
[6,17,7,24],
[6,18,7,24],
[6,19,7,24],
[6,20,7,24],
[6,21,7,24],
[6,22,7,24],
[7,8,7,24],
[7,9,7,24],
[7,10,7,24],
[7,11,7,24],
[7,12,7,24],
[7,13,7,24],
[7,14,7,24],
[7,15,7,24],
[7,16,7,24],
[7,17,7,24],
[7,18,7,24],
[7,19,7,24],
[7,20,7,24],
[7,21,7,24],
[7,22,7,24],
[8,9,7,24],
[8,10,7,24],
[8,11,7,24],
[8,12,7,24],
[8,13,7,24],
[8,14,7,24],
[8,15,7,24],
[8,16,7,24],
[8,17,7,24],
[8,18,7,24],
[8,19,7,24],
[8,20,7,24],
[8,21,7,24],
[8,22,7,24],
[9,10,7,24],
[9,11,7,24],
[9,12,7,24],
[9,13,7,24],
[9,14,7,24],
[9,15,7,24],
[9,16,7,24],
[9,17,7,24],
[9,18,7,24],
[9,19,7,24],
[9,20,7,24],
[9,21,7,24],
[9,22,7,24],
[10,11,7,24],
[10,12,7,24],
[10,13,7,24],
[10,14,7,24],
[10,15,7,24],
[10,16,7,24],
[10,17,7,24],
[10,18,7,24],
[10,19,7,24],
[10,20,7,24],
[10,21,7,24],
[10,22,7,24],
[11,12,7,24],
[11,13,7,24],
[11,14,7,24],
[11,15,7,24],
[11,16,7,24],
[11,17,7,24],
[11,18,7,24],
[11,19,7,24],
[11,20,7,24],
[11,21,7,24],
[11,22,7,24],
[12,13,7,24],
[12,14,7,24],
[12,15,7,24],
[12,16,7,24],
[12,17,7,24],
[12,18,7,24],
[12,19,7,24],
[12,20,7,24],
[12,21,7,24],
[12,22,7,24],
[13,14,7,24],
[13,15,7,24],
[13,16,7,24],
[13,17,7,24],
[13,18,7,24],
[13,19,7,24],
[13,20,7,24],
[13,21,7,24],
[13,22,7,24],
[14,15,7,24],
[14,16,7,24],
[14,17,7,24],
[14,18,7,24],
[14,19,7,24],
[14,20,7,24],
[14,21,7,24],
[14,22,7,24],
[15,16,7,24],
[15,17,7,24],
[15,18,7,24],
[15,19,7,24],
[15,20,7,24],
[15,21,7,24],
[15,22,7,24],
[16,17,7,24],
[16,18,7,24],
[16,19,7,24],
[16,20,7,24],
[16,21,7,24],
[16,22,7,24],
[17,18,7,24],
[17,19,7,24],
[17,20,7,24],
[17,21,7,24],
[17,22,7,24],
[18,19,7,24],
[18,20,7,24],
[18,21,7,24],
[18,22,7,24],
[19,20,7,24],
[19,21,7,24],
[19,22,7,24],
[20,21,7,24],
[20,22,7,24],
[21,22,7,24]
],
"general":[
[0, "아회남", null, 0, null, 65, 74, 26, 0, 190, 225, null, null],
[0, "이적", null, 0, null, 29, 24, 84, 0, 162, 273, null, null],
[0, "윤상", null, 0, null, 51, 44, 62, 0, 194, 260, null, null],
[0, "윤묵", null, 0, null, 26, 15, 66, 0, 183, 239, null, null],
[0, "우금1", null, 0, null, 83, 78, 74, 0, 159, 221, null, null],
[0, "위관", null, 0, null, 69, 46, 79, 0, 220, 291, null, null],
[0, "원윤", null, 7, "완", 15, 14, 39, 1, 150, 199, null, null],
[0, "원희", null, 17, "남피", 66, 51, 63, 1, 176, 207, null, null],
[0, "염행", null, 20, "천수", 76, 84, 66, 1, 159, 215, null, null],
[0, "염유", null, 0, "계", 71, 57, 71, 0, 168, 227, null, null],
[0, "원술", null, 7, "완", 44, 65, 65, 12, 155, 199, null, null, "흥 마궁수 주제에 어딜 앞에 나서느냐! 썩 꺼져라!"],
[0, "원상", null, 0, null, 63, 75, 42, 0, 179, 207, null, null],
[0, "원소", null, 17, "남피", 81, 69, 70, 12, 154, 202, null, null, "안량과 문추만 이곳에 있엇어도…"],
[0, "염상", null, 0, null, 30, 27, 71, 0, 158, 199, null, null],
[0, "원담", null, 17, "남피", 60, 69, 30, 1, 173, 205, null, null],
[0, "염포", null, 14, "한중", 29, 25, 82, 11, 167, 231, null, null],
[0, "왕위", null, 0, null, 60, 70, 62, 0, 163, 222, null, null],
[0, "왕윤", null, 1, "장안", 26, 6, 68, 1, 137, 192, null, null],
[0, "왕항", null, 0, null, 76, 60, 61, 0, 184, 254, null, null],
[0, "왕찬", null, 0, null, 15, 3, 79, 0, 177, 217, null, null],
[0, "왕수", null, 19, "북해", 54, 27, 77, 11, 168, 218, null, null],
[0, "왕숙", null, 0, null, 36, 22, 76, 0, 195, 256, null, null],
[0, "왕준", null, 0, null, 81, 73, 77, 0, 206, 286, null, null],
[0, "왕쌍", null, 0, null, 67, 88, 19, 0, 195, 228, null, null],
[0, "왕창", null, 0, null, 74, 64, 79, 0, 188, 259, null, null],
[0, "왕평", null, 0, null, 83, 79, 76, 0, 192, 248, null, null],
[0, "왕보", null, 0, null, 62, 41, 79, 0, 171, 219, null, null],
[0, "왕문", null, 0, null, 65, 64, 31, 0, 162, 205, null, null],
[0, "왕릉", null, 0, null, 74, 64, 71, 0, 172, 251, null, null],
[0, "왕루", null, 0, null, 28, 30, 79, 0, 173, 211, null, null],
[0, "왕랑", null, 8, "서주", 47, 35, 79, 1, 167, 228, null, null],
[0, "온회", null, 0, null, 62, 36, 74, 0, 178, 228, null, null],
[0, "하안", null, 0, null, 15, 30, 72, 0, 190, 249, null, null],
[0, "괴월", null, 13, "양양", 47, 27, 82, 11, 157, 214, null, null],
[0, "괴량", null, 13, "양양", 68, 33, 88, 1, 155, 204, null, null],
[0, "가화", null, 0, null, 49, 65, 41, 0, 176, 222, null, null],
[0, "가규", null, 0, null, 78, 61, 84, 0, 177, 231, null, null],
[0, "하의", null, 0, null, 56, 69, 36, 0, 161, 195, null, null],
[0, "화흠", null, 1, "낙양", 33, 33, 82, 1, 157, 231, null, null],
[0, "가후", null, 1, "안정", 88, 48, 97, 1, 147, 223, null, null],
[0, "곽가", null, 0, null, 88, 15, 96, 0, 170, 207, null, null],
[0, "악환", null, 0, null, 65, 82, 42, 0, 196, 251, null, null],
[0, "곽사", null, 1, "안정", 64, 76, 13, 1, 146, 197, null, null],
[0, "악취", null, 0, null, 53, 66, 61, 0, 157, 195, null, null],
[0, "곽준", null, 0, null, 73, 66, 73, 0, 178, 217, null, null],
[0, "학소", null, 0, null, 86, 79, 78, 0, 185, 229, null, null],
[0, "악진", null, 2, "진류", 80, 84, 56, 1, 159, 218, null, null],
[0, "곽도", null, 17, "남피", 52, 50, 82, 1, 157, 205, null, null],
[0, "학맹", null, 0, null, 62, 67, 42, 0, 156, 300, null, null],
[0, "곽유지", null, 0, null, 28, 9, 69, 0, 190, 259, null, null],
[0, "곽익", null, 0, null, 73, 69, 69, 0, 207, 270, null, null],
[0, "곽회", null, 0, null, 87, 78, 81, 0, 187, 255, null, null],
[0, "하후위", null, 0, null, 71, 73, 49, 0, 204, 253, null, null],
[0, "하후연", null, 2, "진류", 90, 91, 68, 1, 162, 219, null, null],
[0, "하후은", null, 0, null, 63, 72, 53, 0, 180, 208, null, null],
[0, "하후화", null, 0, null, 48, 51, 71, 0, 207, 265, null, null],
[0, "하후혜", null, 0, null, 50, 44, 76, 0, 206, 242, null, null],
[0, "하후현", null, 0, null, 54, 39, 76, 0, 208, 254, null, null],
[0, "하후상", null, 0, null, 79, 72, 75, 0, 181, 225, null, null],
[0, "하후덕", null, 0, null, 69, 73, 32, 0, 178, 218, null, null],
[0, "하후돈", null, 2, "진류", 92, 90, 63, 1, 156, 220, null, null],
[0, "하후패", null, 0, null, 79, 84, 77, 0, 202, 262, null, null],
[0, "하후무", null, 0, null, 20, 7, 4, 0, 201, 259, null, null],
[0, "가충", null, 0, null, 54, 31, 89, 0, 217, 282, null, null],
[0, "하진", null, 0, null, 39, 40, 6, 0, 135, 189, null, null],
[0, "화웅", null, 1, "호로", 88, 92, 61, 1, 155, 190, null, null],
[0, "한윤", null, 7, "완", 26, 29, 65, 1, 155, 197, null, null],
[0, "관우", null, 0, "진류", 97, 97, 79, 0, 162, 219, null, null, "술이 식기 전에 돌아오겠소"],
[0, "환계", null, 7, "완", 25, 26, 68, 1, 156, 221, null, null],
[0, "관해", null, 0, null, 70, 82, 10, 0, 160, 193, null, null],
[0, "관구검", null, 0, null, 78, 74, 55, 0, 202, 255, null, null],
[0, "한현", null, 0, null, 22, 33, 62, 0, 163, 220, null, null],
[0, "한호", null, 15, "하내", 69, 72, 84, 11, 164, 224, null, null],
[0, "관흥", null, 0, null, 76, 86, 67, 0, 199, 234, null, null],
[0, "관색", null, 0, null, 74, 88, 56, 0, 200, 239, null, null],
[0, "한수", null, 20, "천수", 81, 75, 82, 12, 142, 215, null, null],
[0, "한숭", null, 0, null, 25, 15, 71, 0, 154, 210, null, null],
[0, "관정", null, 4, "북평", 36, 52, 73, 11, 158, 199, null, null],
[0, "한섬", null, 0, null, 69, 66, 36, 0, 159, 196, null, null],
[0, "감택", null, 0, null, 43, 49, 83, 0, 182, 243, null, null],
[0, "한충", null, 0, null, 64, 67, 18, 0, 151, 184, null, null],
[0, "한당", null, 7, "완", 76, 85, 61, 1, 156, 227, null, null],
[0, "한덕", null, 0, null, 63, 76, 25, 0, 171, 228, null, null],
[0, "감녕", null, 0, null, 93, 94, 76, 0, 174, 219, null, null],
[0, "한복", null, 12, "업", 28, 3, 27, 12, 149, 193, null, null],
[0, "관평", null, 0, null, 80, 82, 72, 0, 186, 219, null, null],
[0, "간옹", null, 0, "진류", 20, 32, 75, 0, 164, 225, null, null],
[0, "안량", null, 17, "남피", 88, 94, 21, 1, 160, 200, null, null],
[0, "위연", null, 0, null, 85, 92, 72, 0, 175, 234, null, null],
[0, "국의", null, 12, "업", 82, 78, 51, 1, 146, 197, null, null],
[0, "희지재", null, 0, null, 63, 7, 88, 0, 157, 196, null, null],
[0, "위속", null, 0, null, 67, 78, 31, 0, 156, 200, null, null],
[0, "위유", null, 16, "계", 46, 29, 74, 11, 151, 193, null, null],
[0, "우금2", null, 0, null, 72, 79, 38, 0, 173, 226, null, null],
[0, "우보", null, 1, "천수", 38, 60, 21, 1, 159, 192, null, null],
[0, "강유", null, 0, null, 92, 89, 90, 0, 202, 264, null, null],
[0, "공지", null, 0, null, 43, 53, 62, 0, 178, 197, null, null],
[0, "교유", null, 0, null, 64, 69, 38, 0, 143, 195, null, null],
[0, "공도", null, 0, null, 59, 70, 23, 0, 164, 200, null, null],
[0, "허공", null, 0, null, 44, 66, 64, 0, 155, 200, null, null],
[0, "허정", null, 21, "초", 23, 5, 68, 11, 152, 222, null, null],
[0, "허저", null, 0, null, 74, 96, 36, 0, 169, 226, null, null],
[0, "허유", null, 17, "남피", 36, 21, 80, 1, 155, 204, null, null],
[0, "기령", null, 7, "완", 78, 83, 51, 1, 155, 199, null, null],
[0, "김의", null, 0, null, 32, 38, 65, 0, 177, 218, null, null],
[0, "김배삼결", null, 0, null, 64, 76, 19, 0, 192, 225, null, null],
[0, "김선", null, 1, "장안", 52, 68, 13, 1, 155, 220, null, null],
[0, "우번", null, 0, null, 43, 46, 86, 0, 164, 233, null, null],
[0, "형도영", null, 0, null, 69, 80, 41, 0, 174, 208, null, null],
[0, "엄안", null, 6, "자동", 82, 83, 72, 1, 151, 222, null, null],
[0, "곽마", null, 0, null, 68, 71, 40, 0, 239, 281, null, null],
[0, "엄준", null, 0, null, 28, 2, 71, 0, 169, 246, null, null],
[0, "엄정", null, 0, null, 50, 55, 39, 0, 151, 189, null, null],
[0, "엄백호", null, 0, null, 67, 70, 23, 0, 142, 198, null, null, "이 몸은 동오의 덕왕 엄백호라고 하오!"],
[0, "엄여", null, 0, null, 61, 78, 44, 0, 145, 196, null, null],
[0, "오의", null, 0, null, 79, 73, 70, 0, 165, 237, null, null],
[0, "황개", null, 7, "완", 80, 83, 70, 1, 154, 218, null, null],
[0, "고간", null, 0, null, 74, 56, 48, 0, 168, 206, null, null],
[0, "황권", null, 0, null, 75, 59, 82, 0, 167, 240, null, null],
[0, "고유", null, 0, null, 57, 43, 72, 0, 174, 263, null, null],
[0, "고순", null, 0, null, 85, 86, 60, 0, 162, 198, null, null],
[0, "고상", null, 0, null, 68, 68, 53, 0, 194, 252, null, null],
[0, "고승", null, 0, null, 67, 73, 41, 0, 145, 184, null, null],
[0, "후성", null, 0, null, 74, 75, 68, 0, 158, 199, null, null],
[0, "후선", null, 20, "천수", 63, 66, 34, 1, 175, 228, null, null],
[0, "황조", null, 13, "강하", 74, 66, 55, 1, 148, 208, null, null],
[0, "공손월", null, 4, "북평", 74, 72, 47, 1, 160, 192, null, null],
[0, "공손연", null, 0, null, 65, 70, 60, 0, 205, 238, null, null],
[0, "공손공", null, 11, "안평", 39, 17, 69, 1, 174, 240, null, null],
[0, "공손강", null, 11, "안평", 72, 66, 65, 1, 172, 211, null, null],
[0, "공손찬", null, 4, "북평", 84, 83, 75, 12, 152, 199, null, null],
[0, "공손속", null, 4, "북평", 63, 68, 57, 1, 176, 199, null, null],
[0, "공손도", null, 11, "안평", 67, 71, 66, 12, 154, 204, null, null],
[0, "공손범", null, 4, "북평", 73, 69, 66, 1, 158, 199, null, null],
[0, "황충", null, 0, null, 90, 93, 65, 0, 154, 220, null, null],
[0, "고정", null, 0, null, 55, 63, 43, 0, 190, 251, null, null],
[0, "고패", null, 0, null, 66, 61, 69, 0, 170, 212, null, null],
[0, "황보숭", null, 1, "홍농", 92, 61, 73, 1, 132, 195, null, null],
[0, "공융", null, 19, "북해", 30, 5, 73, 12, 153, 208, null, null],
[0, "고람", null, 17, "남피", 76, 82, 68, 1, 159, 201, null, null],
[0, "오경", null, 0, null, 69, 66, 52, 0, 151, 211, null, null],
[0, "호거아", null, 1, "사곡", 70, 82, 41, 1, 164, 206, null, null],
[0, "호진", null, 1, "호로", 65, 74, 12, 1, 148, 190, null, null],
[0, "올돌골", null, 0, null, 79, 86, 1, 0, 186, 225, null, null],
[0, "호반", null, 0, null, 55, 55, 59, 0, 179, 233, null, null],
[0, "오반", null, 0, null, 74, 71, 59, 0, 171, 234, null, null],
[0, "고옹", null, 0, null, 43, 18, 80, 0, 168, 243, null, null],
[0, "오란", null, 6, "성도", 68, 80, 35, 1, 170, 218, null, null],
[0, "채화", null, 13, "장판", 39, 50, 1, 1, 166, 208, null, null],
[0, "채중", null, 13, "장판", 40, 54, 2, 1, 168, 208, null, null],
[0, "채모", null, 13, "양양", 70, 70, 77, 1, 160, 215, null, null],
[0, "착융", null, 0, null, 60, 69, 38, 0, 161, 195, null, null],
[0, "사마의", null, 0, "하내", 98, 63, 98, 0, 179, 251, null, null],
[0, "사마염", null, 0, null, 69, 59, 77, 0, 238, 290, null, null],
[0, "사마사", null, 0, null, 79, 64, 88, 0, 208, 255, null, null],
[0, "사마소", null, 0, null, 76, 57, 87, 0, 211, 265, null, null],
[0, "사마부", null, 0, "하내", 70, 37, 77, 0, 180, 272, null, null],
[0, "사마랑", null, 1, "낙양", 20, 21, 72, 1, 171, 217, null, null],
[0, "사마가", null, 0, null, 66, 84, 25, 0, 167, 222, null, null],
[0, "주흔", null, 9, "수춘", 65, 62, 73, 11, 159, 196, null, null],
[0, "주앙", null, 17, "남피", 74, 65, 65, 1, 162, 195, null, null],
[0, "주지", null, 0, null, 65, 85, 41, 0, 233, 295, null, null],
[0, "주창", null, 0, "여남", 68, 84, 42, 0, 164, 219, null, null],
[0, "주태유평", null, 0, null, 84, 91, 48, 0, 171, 225, null, null],
[0, "주방", null, 0, null, 52, 41, 80, 0, 200, 240, null, null],
[0, "주유", null, 0, null, 95, 71, 96, 0, 175, 210, null, null],
[0, "주환", null, 0, null, 84, 82, 77, 0, 177, 238, null, null],
[0, "주거", null, 0, null, 77, 57, 72, 0, 190, 246, null, null],
[0, "축융", null, 0, null, 74, 85, 29, 0, 182, 230, null, null],
[0, "주준", null, 1, "낙양", 89, 65, 70, 1, 149, 195, null, null],
[0, "주연", null, 0, null, 79, 69, 71, 0, 182, 249, null, null],
[0, "주치", null, 0, null, 71, 56, 72, 0, 156, 224, null, null],
[0, "주포", null, 0, null, 68, 73, 34, 0, 191, 225, null, null],
[0, "주령", null, 0, null, 71, 73, 67, 0, 170, 236, null, null],
[0, "순욱", null, 0, null, 62, 14, 95, 0, 163, 212, null, null],
[0, "순우경", null, 17, "남피", 72, 66, 29, 1, 146, 200, null, null],
[0, "순심", null, 0, null, 34, 25, 78, 0, 164, 208, null, null],
[0, "순유", null, 0, "낙양", 73, 26, 94, 0, 157, 214, null, null],
[0, "장완", null, 0, null, 78, 34, 84, 0, 188, 246, null, null],
[0, "종회", null, 0, null, 82, 51, 91, 0, 225, 264, null, null],
[0, "장간", null, 0, null, 19, 6, 66, 0, 175, 208, null, null],
[0, "장의거", null, 17, "남피", 71, 58, 59, 1, 159, 205, null, null],
[0, "장흠", null, 0, null, 78, 84, 54, 0, 159, 208, null, null],
[0, "장제3", null, 0, null, 48, 43, 85, 0, 188, 249, null, null],
[0, "초주", null, 0, null, 16, 3, 67, 0, 201, 270, null, null],
[0, "초촉", null, 0, null, 65, 76, 33, 0, 159, 208, null, null],
[0, "상총", null, 0, null, 76, 61, 77, 0, 195, 240, null, null],
[0, "종요", null, 0, null, 70, 24, 77, 0, 151, 230, null, null],
[0, "상랑", null, 0, null, 28, 18, 74, 0, 167, 247, null, null],
[0, "서영", null, 1, "사수", 80, 76, 62, 1, 147, 192, null, null],
[0, "제갈각", null, 0, null, 72, 47, 90, 0, 203, 253, null, null],
[0, "제갈근", null, 0, null, 75, 34, 81, 0, 174, 241, null, null],
[0, "제갈균", null, 0, null, 29, 25, 52, 0, 185, 252, null, null],
[0, "제갈탄", null, 0, null, 72, 72, 76, 0, 206, 258, null, null],
[0, "제갈량", null, 0, null, 98, 38, 100, 0, 184, 234, null, null],
[0, "서황", null, 0, null, 91, 90, 78, 0, 165, 228, null, null],
[0, "서서", null, 0, null, 87, 64, 93, 0, 160, 300, null, null],
[0, "서성", null, 0, null, 86, 81, 78, 0, 178, 232, null, null],
[0, "서막", null, 0, null, 55, 32, 68, 0, 171, 249, null, null],
[0, "신의", null, 0, null, 55, 59, 60, 0, 190, 252, null, null],
[0, "신탐", null, 0, null, 56, 62, 54, 0, 188, 254, null, null],
[0, "심배", null, 12, "업", 80, 60, 83, 1, 156, 204, null, null],
[0, "신비", null, 0, null, 39, 24, 79, 0, 171, 240, null, null],
[0, "신평", null, 17, "남피", 69, 43, 77, 1, 165, 204, null, null],
[0, "진복", null, 0, null, 31, 7, 73, 0, 160, 226, null, null],
[0, "진랑", null, 0, null, 58, 70, 35, 0, 192, 234, null, null],
[0, "휴고", null, 0, null, 63, 71, 38, 0, 151, 199, null, null],
[0, "추단", null, 0, null, 61, 64, 34, 0, 144, 193, null, null],
[0, "성의", null, 20, "천수", 74, 72, 41, 1, 168, 211, null, null],
[0, "성공영", null, 20, "천수", 73, 71, 80, 11, 171, 220, null, null],
[0, "설종", null, 0, null, 34, 16, 73, 0, 187, 243, null, null],
[0, "선경", null, 4, "북평", 71, 68, 43, 1, 156, 199, null, null],
[0, "전종", null, 0, null, 78, 72, 75, 0, 183, 249, null, null],
[0, "조예", null, 0, null, 72, 52, 82, 0, 205, 239, null, null],
[0, "조휴", null, 0, null, 74, 75, 62, 0, 174, 228, null, null],
[0, "송헌", null, 0, null, 68, 77, 38, 0, 157, 200, null, null],
[0, "조앙", null, 2, "진류", 74, 67, 69, 1, 161, 197, null, null],
[0, "조홍 자렴", null, 2, "진류", 79, 81, 44, 1, 169, 232, null, null, "좌절감이 사나이를 키우는 것이다!"],
[0, "조순", null, 2, "진류", 75, 71, 63, 1, 170, 210, null, null],
[0, "조창", null, 0, null, 82, 90, 40, 0, 190, 223, null, null],
[0, "조식", null, 0, null, 33, 22, 81, 0, 192, 232, null, null],
[0, "조진", null, 0, null, 81, 74, 70, 0, 185, 231, null, null],
[0, "조인", null, 2, "진류", 89, 86, 62, 1, 168, 223, null, null],
[0, "조성", null, 0, null, 54, 74, 38, 0, 163, 198, null, null],
[0, "조조", null, 2, "진류", 99, 72, 91, 12, 151, 220, null, null, "내가 천하 사람들을 저버릴지언정, 천하 사람들이 나를 저버리게 하지는 않을 것이다."],
[0, "조충", null, 0, null, 31, 21, 85, 0, 196, 207, null, null],
[0, "장패", null, 0, null, 78, 75, 53, 0, 165, 231, null, null],
[0, "조비", null, 0, null, 70, 71, 83, 0, 187, 226, null, null],
[0, "조표", null, 8, "서주", 66, 69, 32, 1, 151, 196, null, null],
[0, "저수", null, 12, "업", 78, 35, 90, 11, 156, 201, null, null],
[0, "소비", null, 0, null, 69, 63, 66, 0, 172, 221, null, null],
[0, "조무", null, 7, "완", 70, 71, 66, 1, 155, 193, null, null],
[0, "손환", null, 0, null, 82, 73, 76, 0, 166, 228, null, null],
[0, "손견", null, 7, "완", 94, 90, 79, 11, 156, 192, null, null, "내가 옥새를 가지고 있다면 나는 칼과 화살을 맞아 죽을 것이다."],
[0, "손건", null, 0, null, 34, 33, 79, 0, 165, 215, null, null],
[0, "손권", null, 0, null, 79, 67, 80, 0, 182, 252, null, null],
[0, "손교", null, 0, null, 77, 72, 67, 0, 181, 219, null, null],
[0, "손책", null, 0, null, 96, 92, 74, 0, 175, 200, null, null],
[0, "손소", null, 0, null, 80, 79, 76, 0, 188, 241, null, null],
[0, "손정", null, 7, "완", 66, 53, 73, 1, 160, 206, null, null],
[0, "손중", null, 0, null, 62, 71, 36, 0, 154, 184, null, null],
[0, "손등", null, 0, null, 62, 37, 79, 0, 209, 241, null, null],
[0, "손유", null, 0, null, 77, 70, 68, 0, 177, 215, null, null],
[0, "손익", null, 0, null, 67, 78, 27, 0, 184, 204, null, null],
[0, "손례", null, 0, null, 78, 81, 67, 0, 180, 250, null, null],
[0, "태사자", null, 0, "안평", 90, 93, 69, 0, 166, 206, null, null],
[0, "대래동주", null, 0, null, 51, 53, 54, 0, 195, 249, null, null],
[0, "대릉", null, 0, null, 70, 75, 39, 0, 199, 258, null, null],
[0, "타사대왕", null, 0, null, 62, 59, 70, 0, 186, 225, null, null],
[0, "담웅", null, 0, null, 58, 73, 14, 0, 188, 221, null, null],
[0, "장윤", null, 13, "양양", 72, 67, 42, 1, 163, 208, null, null],
[0, "조운", null, 0, "진양", 96, 96, 77, 0, 168, 229, null, null],
[0, "장위", null, 14, "한중", 74, 66, 45, 1, 172, 228, null, null, "쌀 다섯 말만 가지고 오시오~ 모두 고쳐드리리다."],
[0, "장영", null, 0, null, 75, 74, 41, 0, 154, 195, null, null],
[0, "장연", null, 0, "진양", 76, 81, 57, 0, 153, 210, null, null],
[0, "장횡", null, 0, null, 59, 70, 23, 0, 178, 211, null, null],
[0, "장온", null, 0, null, 32, 10, 72, 0, 193, 231, null, null],
[0, "장개", null, 8, "하비", 34, 66, 8, 1, 155, 194, null, null],
[0, "장각", null, 0, null, 87, 25, 86, 0, 140, 184, null, null],
[0, "장기", null, 0, null, 74, 35, 76, 0, 170, 223, null, null],
[0, "장의", null, 0, null, 79, 72, 75, 0, 153, 215, null, null],
[0, "장훈", null, 7, "완", 72, 68, 41, 1, 156, 206, null, null],
[0, "장굉", null, 0, null, 24, 22, 86, 0, 153, 212, null, null],
[0, "장합", null, 12, "업", 89, 89, 73, 1, 167, 231, null, null],
[0, "조홍", null, 0, null, 66, 72, 28, 0, 156, 184, null, null],
[0, "장제1", null, 1, "장안", 70, 66, 55, 1, 144, 196, null, null],
[0, "장수", null, 1, "함곡", 80, 73, 64, 1, 154, 207, null, null],
[0, "장소 자포", null, 0, null, 33, 3, 84, 0, 156, 236, null, null],
[0, "장송", null, 0, null, 25, 6, 88, 0, 170, 212, null, null],
[0, "장임", null, 6, "성도", 84, 84, 78, 1, 169, 214, null, null],
[0, "장제", null, 0, null, 67, 43, 80, 0, 236, 280, null, null],
[0, "장막", null, 2, "진류", 52, 53, 71, 1, 155, 195, null, null],
[0, "조범", null, 0, null, 28, 21, 32, 0, 168, 218, null, null],
[0, "장비", null, 0, "진류", 94, 98, 30, 0, 165, 221, null, null],
[0, "장포", null, 0, null, 78, 87, 48, 0, 198, 219, null, null],
[0, "장보", null, 0, null, 83, 71, 81, 0, 148, 184, null, null],
[0, "장만성", null, 0, null, 75, 81, 45, 0, 143, 184, null, null],
[0, "장양", null, 5, "진양", 72, 70, 66, 12, 151, 195, null, null],
[0, "장익", null, 0, null, 75, 74, 76, 0, 188, 264, null, null],
[0, "장료", null, 1, "사곡", 95, 92, 78, 1, 169, 222, null, null],
[0, "장량", null, 0, null, 78, 80, 74, 0, 153, 184, null, null],
[0, "조루", null, 0, null, 70, 43, 68, 0, 183, 219, null, null],
[0, "장로", null, 14, "한중", 51, 26, 74, 12, 163, 216, null, null],
[0, "진횡", null, 0, null, 64, 63, 26, 0, 161, 195, null, null],
[0, "진응", null, 0, null, 62, 72, 45, 0, 172, 208, null, null],
[0, "진기", null, 0, null, 58, 65, 43, 0, 165, 198, null, null],
[0, "진궁", null, 2, "진류", 84, 55, 89, 11, 154, 198, null, null],
[0, "진교", null, 0, null, 61, 27, 77, 0, 175, 237, null, null],
[0, "진군", null, 0, null, 32, 14, 75, 0, 167, 236, null, null],
[0, "진규", null, 8, "서주", 30, 4, 82, 11, 132, 206, null, null],
[0, "진식", null, 0, null, 70, 71, 25, 0, 191, 230, null, null],
[0, "진진", null, 0, null, 46, 46, 69, 0, 170, 235, null, null],
[0, "진태", null, 0, null, 84, 77, 86, 0, 210, 260, null, null],
[0, "진등", null, 8, "하비", 79, 64, 81, 1, 169, 208, null, null],
[0, "진도", null, 0, null, 76, 71, 67, 0, 171, 237, null, null],
[0, "진무", null, 0, null, 76, 87, 43, 0, 176, 215, null, null],
[0, "진란", null, 0, null, 66, 69, 40, 0, 157, 204, null, null],
[0, "진림", null, 0, null, 25, 9, 75, 0, 160, 217, null, null],
[0, "정욱", null, 0, null, 70, 49, 90, 0, 141, 220, null, null],
[0, "정원지", null, 0, null, 69, 74, 17, 0, 145, 184, null, null],
[0, "정은", null, 0, null, 69, 73, 40, 0, 184, 220, null, null],
[0, "정원", null, 0, null, 70, 76, 35, 0, 137, 189, null, null],
[0, "정보", null, 7, "완", 84, 79, 79, 1, 151, 216, null, null],
[0, "정봉승연", null, 0, null, 81, 80, 75, 0, 190, 271, null, null],
[0, "전위", null, 0, null, 72, 95, 35, 0, 160, 197, null, null],
[0, "전해", null, 4, "북평", 68, 65, 58, 1, 154, 199, null, null],
[0, "전주", null, 0, null, 66, 66, 73, 0, 169, 214, null, null],
[0, "전풍", null, 12, "업", 72, 29, 93, 1, 162, 200, null, null],
[0, "전예", null, 0, null, 80, 72, 80, 0, 171, 252, null, null],
[0, "동윤", null, 0, null, 47, 28, 79, 0, 192, 246, null, null],
[0, "동화", null, 0, null, 57, 34, 75, 0, 168, 219, null, null],
[0, "등애", null, 0, null, 93, 87, 89, 0, 197, 264, null, null],
[0, "도겸", null, 8, "서주", 51, 27, 64, 12, 132, 194, null, null],
[0, "등현", null, 0, null, 61, 73, 45, 0, 188, 248, null, null],
[0, "등지", null, 0, null, 73, 52, 81, 0, 178, 251, null, null],
[0, "동습", null, 0, null, 72, 85, 50, 0, 169, 215, null, null],
[0, "동승", null, 1, "낙양", 56, 53, 65, 1, 154, 200, null, null],
[0, "동소", null, 0, null, 34, 25, 80, 0, 156, 236, null, null],
[0, "동탁", null, 1, "낙양", 85, 87, 73, 12, 139, 192, null, null, "크하하, 천하는 이제 나의 것이다!"],
[0, "동도나", null, 0, null, 68, 73, 31, 0, 189, 225, null, null],
[0, "동민", null, 1, "장안", 49, 60, 25, 1, 149, 192, null, null],
[0, "등무", null, 0, null, 61, 75, 29, 0, 147, 184, null, null],
[0, "두기", null, 0, null, 66, 32, 75, 0, 163, 224, null, null],
[0, "두예", null, 0, null, 84, 30, 85, 0, 222, 284, null, null],
[0, "배원소", null, 0, null, 49, 65, 25, 0, 169, 200, null, null],
[0, "마완", null, 0, null, 71, 74, 16, 0, 170, 211, null, null],
[0, "마휴", null, 0, null, 68, 73, 48, 0, 178, 212, null, null],
[0, "파재", null, 0, null, 74, 74, 55, 0, 145, 184, null, null],
[0, "마준", null, 0, null, 38, 52, 31, 0, 196, 230, null, null],
[0, "마속", null, 0, null, 61, 67, 87, 0, 190, 228, null, null],
[0, "마대", null, 0, null, 79, 85, 62, 0, 183, 246, null, null],
[0, "마충", null, 0, null, 78, 72, 68, 0, 187, 249, null, null],
[0, "마초", null, 0, null, 93, 97, 44, 0, 176, 222, null, null],
[0, "마철", null, 0, null, 70, 62, 58, 0, 179, 212, null, null],
[0, "마등", null, 10, "서량", 82, 80, 52, 12, 149, 212, null, null],
[0, "마량", null, 0, null, 53, 23, 88, 0, 187, 222, null, null],
[0, "반준", null, 0, null, 61, 18, 83, 0, 174, 239, null, null],
[0, "반장", null, 0, null, 76, 80, 74, 0, 177, 234, null, null],
[0, "번조", null, 1, "안정", 66, 73, 31, 1, 149, 192, null, null],
[0, "번능", null, 0, null, 69, 61, 36, 0, 158, 195, null, null],
[0, "반봉", null, 12, "업", 56, 77, 4, 1, 155, 190, null, null],
[0, "비의", null, 0, null, 77, 30, 83, 0, 193, 253, null, null],
[0, "비연", null, 0, null, 60, 66, 21, 0, 196, 238, null, null],
[0, "비시", null, 0, null, 18, 28, 65, 0, 176, 240, null, null],
[0, "미축", null, 8, "하비", 33, 29, 78, 1, 165, 220, null, null],
[0, "미방", null, 8, "광릉", 54, 61, 32, 1, 169, 226, null, null],
[0, "비요", null, 0, null, 70, 66, 73, 0, 192, 228, null, null],
[0, "무안국", null, 19, "북해", 70, 83, 34, 1, 156, 193, null, null],
[0, "풍습", null, 0, null, 72, 71, 39, 0, 182, 222, null, null],
[0, "부사인", null, 0, null, 46, 63, 37, 0, 182, 225, null, null],
[0, "부첨", null, 0, null, 73, 85, 76, 0, 216, 263, null, null],
[0, "부손", null, 0, null, 29, 13, 70, 0, 162, 230, null, null],
[0, "문앙", null, 0, null, 76, 93, 65, 0, 238, 291, null, null],
[0, "문흠", null, 0, null, 74, 83, 43, 0, 200, 258, null, null],
[0, "문추", null, 17, "남피", 89, 93, 47, 1, 169, 200, null, null],
[0, "문빙", null, 0, null, 80, 82, 69, 0, 178, 237, null, null],
[0, "변희", null, 0, null, 56, 70, 62, 0, 169, 200, null, null],
[0, "망아장", null, 0, null, 45, 79, 3, 0, 191, 225, null, null],
[0, "봉기", null, 17, "남피", 43, 21, 84, 11, 153, 202, null, null],
[0, "방희", null, 0, null, 60, 38, 69, 0, 152, 192, null, null],
[0, "법정", null, 0, null, 82, 47, 94, 0, 176, 220, null, null],
[0, "방통", null, 0, null, 85, 34, 97, 0, 178, 213, null, null],
[0, "방덕", null, 10, "서량", 89, 94, 75, 11, 170, 219, null, null],
[0, "포륭", null, 0, null, 58, 76, 49, 0, 174, 208, null, null],
[0, "목순", null, 0, null, 52, 77, 11, 0, 157, 190, null, null],
[0, "목록대왕", null, 0, null, 65, 71, 39, 0, 184, 225, null, null],
[0, "보즐", null, 0, null, 72, 51, 84, 0, 177, 247, null, null],
[0, "만총", null, 0, null, 84, 64, 82, 0, 170, 242, null, null],
[0, "모개", null, 0, null, 63, 39, 60, 0, 161, 216, null, null],
[0, "맹획", null, 0, null, 87, 87, 42, 0, 186, 245, null, null],
[0, "맹달", null, 0, null, 75, 73, 75, 0, 172, 228, null, null],
[0, "맹우", null, 0, null, 50, 68, 22, 0, 190, 243, null, null],
[0, "유섭", null, 7, "완", 62, 79, 24, 1, 158, 190, null, null],
[0, "양부2", null, 0, null, 62, 68, 68, 0, 167, 212, null, null],
[0, "옹개", null, 0, null, 73, 75, 57, 0, 188, 225, null, null],
[0, "양의", null, 0, null, 68, 40, 82, 0, 190, 235, null, null],
[0, "양호", null, 0, null, 90, 64, 84, 0, 221, 278, null, null],
[0, "양홍", null, 7, "완", 33, 15, 77, 1, 152, 199, null, null],
[0, "양앙", null, 0, null, 68, 72, 38, 0, 172, 215, null, null],
[0, "양추1", null, 0, null, 52, 65, 40, 0, 159, 199, null, null],
[0, "양수", null, 0, null, 25, 4, 83, 0, 175, 219, null, null],
[0, "양추2", null, 0, null, 67, 64, 60, 0, 172, 238, null, null],
[0, "양송", null, 0, null, 1, 5, 28, 0, 167, 215, null, null],
[0, "양임", null, 14, "한중", 70, 78, 56, 1, 170, 215, null, null],
[0, "양조", null, 0, null, 53, 61, 36, 0, 223, 286, null, null],
[0, "양백", null, 14, "한중", 44, 45, 19, 1, 171, 214, null, null],
[0, "양부1", null, 0, null, 67, 50, 83, 0, 178, 239, null, null],
[0, "양봉1", null, 0, null, 66, 65, 31, 0, 153, 197, null, null],
[0, "양봉2", null, 0, null, 54, 62, 53, 0, 191, 252, null, null],
[0, "뇌동", null, 0, null, 69, 78, 51, 0, 172, 218, null, null],
[0, "뇌박", null, 0, null, 62, 70, 36, 0, 157, 206, null, null],
[0, "이이", null, 0, null, 63, 77, 19, 0, 187, 222, null, null],
[0, "이회", null, 0, null, 79, 65, 79, 0, 175, 231, null, null],
[0, "이각", null, 1, "낙양", 69, 72, 24, 1, 148, 198, null, null],
[0, "육항", null, 0, null, 91, 63, 87, 0, 226, 274, null, null],
[0, "육적", null, 0, null, 20, 7, 72, 0, 187, 219, null, null],
[0, "육손", null, 0, null, 94, 69, 95, 0, 183, 245, null, null],
[0, "이엄", null, 0, null, 83, 84, 76, 0, 172, 234, null, null],
[0, "이유", null, 1, "낙양", 61, 26, 93, 11, 150, 192, null, null, "장안으로 천도를 하는것이 어떻겠습니까?"],
[0, "이숙", null, 1, "낙양", 46, 69, 61, 1, 156, 192, null, null],
[0, "이통", null, 0, "여남", 73, 83, 62, 0, 168, 209, null, null],
[0, "이전", null, 0, null, 78, 77, 79, 0, 181, 216, null, null],
[0, "이풍", null, 0, null, 69, 74, 50, 0, 158, 199, null, null],
[0, "유언", null, 6, "성도", 53, 38, 80, 12, 132, 194, null, null],
[0, "유괴", null, 6, "성도", 71, 73, 67, 1, 165, 214, null, null],
[0, "유기", null, 13, "양양", 52, 12, 63, 1, 174, 210, null, null],
[0, "유우", null, 16, "계", 55, 33, 70, 12, 145, 193, null, null],
[0, "유훈", null, 0, null, 47, 63, 35, 0, 163, 216, null, null],
[0, "유현", null, 0, null, 54, 66, 51, 0, 188, 252, null, null],
[0, "유순", null, 0, null, 63, 46, 41, 0, 172, 255, null, null],
[0, "유장", null, 6, "성도", 31, 5, 34, 1, 162, 219, null, null],
[0, "유심", null, 0, null, 60, 62, 70, 0, 238, 264, null, null],
[0, "유선", null, 0, null, 3, 5, 9, 0, 208, 270, null, null],
[0, "유종", null, 0, null, 24, 22, 65, 0, 195, 220, null, null],
[0, "유도", null, 0, null, 25, 23, 26, 0, 168, 214, null, null],
[0, "유파", null, 0, null, 29, 22, 75, 0, 186, 222, null, null],
[0, "유반", null, 0, null, 69, 76, 47, 0, 168, 210, null, null],
[0, "유비", null, 0, "진류", 81, 77, 80, 0, 161, 223, null, null],
[0, "유표1", null, 13, "양양", 48, 31, 72, 12, 142, 208, null, null, "강하 팔준에서 제일가는 이 유표에게로 오시오!"],
[0, "유복", null, 0, null, 64, 49, 74, 0, 164, 208, null, null],
[0, "유벽", null, 0, null, 70, 72, 47, 0, 145, 201, null, null],
[0, "유봉", null, 0, null, 75, 79, 44, 0, 188, 220, null, null],
[0, "유엽", null, 0, null, 56, 32, 92, 0, 176, 235, null, null],
[0, "유요", null, 0, null, 62, 67, 46, 0, 156, 198, null, null],
[0, "여위황", null, 0, null, 58, 63, 29, 0, 159, 200, null, null],
[0, "요화", null, 0, null, 73, 76, 69, 0, 168, 264, null, null],
[0, "양흥", null, 10, "서량", 61, 65, 19, 1, 169, 211, null, null],
[0, "양습", null, 0, null, 73, 40, 74, 0, 168, 230, null, null],
[0, "양서", null, 0, null, 56, 62, 66, 0, 198, 260, null, null],
[0, "능조", null, 0, null, 75, 81, 42, 0, 168, 203, null, null],
[0, "능통", null, 0, null, 77, 89, 60, 0, 189, 217, null, null],
[0, "여개", null, 0, null, 53, 30, 67, 0, 194, 227, null, null],
[0, "여건", null, 0, null, 57, 70, 62, 0, 173, 238, null, null],
[0, "여광", null, 0, null, 56, 70, 13, 0, 162, 207, null, null],
[0, "여상", null, 0, null, 54, 71, 12, 0, 164, 207, null, null],
[0, "여대", null, 0, null, 75, 71, 70, 0, 161, 256, null, null],
[0, "여범", null, 0, null, 73, 63, 75, 0, 169, 228, null, null],
[0, "여포", null, 1, "사수", 97, 100, 26, 1, 156, 198, null, null],
[0, "여몽", null, 0, null, 82, 81, 20, 0, 178, 219, null, null],
[0, "윤직", null, 0, null, 46, 42, 73, 0, 196, 237, null, null],
[0, "냉포", null, 0, null, 71, 82, 61, 0, 176, 214, null, null],
[0, "진취", null, 0, null, 56, 63, 45, 0, 174, 208, null, null],
[0, "노숙", null, 0, null, 84, 56, 92, 0, 172, 217, null, null],
[0, "노식", null, 0, null, 86, 63, 82, 0, 139, 192, null, null],
[0, "범강", null, 0, null, 49, 50, 36, 0, 174, 222, null, null],
[0, "장달", null, 0, null, 43, 56, 34, 0, 175, 222, null, null],
[0, "규람", null, 0, null, 55, 70, 58, 0, 165, 204, null, null],
[0, "대원", null, 0, null, 38, 32, 68, 0, 166, 204, null, null],
[0, "왕기", null, 0, null, 77, 72, 86, 0, 190, 261, null, null],
[0, "왕상", null, 0, null, 23, 19, 68, 0, 180, 268, null, null],
[0, "왕돈", null, 0, null, 60, 66, 46, 0, 198, 256, null, null],
[0, "악침", null, 0, null, 73, 75, 43, 0, 196, 257, null, null],
[0, "하제", null, 0, null, 83, 70, 82, 0, 171, 227, null, null],
[0, "환범", null, 0, null, 40, 11, 78, 0, 199, 249, null, null],
[0, "견초", null, 0, null, 72, 79, 73, 0, 168, 244, null, null],
[0, "고당륭", null, 0, null, 35, 24, 76, 0, 190, 244, null, null],
[0, "오찬", null, 0, null, 68, 41, 78, 0, 181, 245, null, null],
[0, "호질", null, 0, null, 73, 46, 74, 0, 192, 250, null, null],
[0, "오질", null, 0, null, 16, 29, 68, 0, 177, 230, null, null],
[0, "호준", null, 0, null, 79, 76, 62, 0, 200, 256, null, null],
[0, "고담", null, 0, null, 53, 23, 77, 0, 203, 244, null, null],
[0, "최림", null, 0, null, 32, 22, 66, 0, 187, 244, null, null],
[0, "사마망", null, 0, null, 78, 58, 83, 0, 205, 271, null, null],
[0, "주이", null, 0, null, 70, 73, 61, 0, 201, 257, null, null],
[0, "전단", null, 0, null, 67, 64, 39, 0, 204, 261, null, null],
[0, "조우", null, 0, null, 50, 43, 37, 0, 199, 278, null, null],
[0, "조상", null, 0, null, 39, 33, 30, 0, 207, 249, null, null],
[0, "조방", null, 0, null, 20, 14, 27, 0, 232, 274, null, null],
[0, "태사향", null, 0, null, 57, 66, 48, 0, 189, 246, null, null],
[0, "장휴", null, 0, null, 63, 27, 74, 0, 204, 244, null, null],
[0, "장호", null, 0, null, 75, 74, 51, 0, 195, 240, null, null],
[0, "조광", null, 0, null, 67, 71, 53, 0, 210, 263, null, null],
[0, "장집", null, 0, null, 76, 29, 80, 0, 196, 254, null, null],
[0, "장승", null, 0, null, 77, 70, 75, 0, 178, 244, null, null],
[0, "장소", null, 0, null, 23, 56, 31, 0, 202, 264, null, null],
[0, "조통", null, 0, null, 68, 67, 61, 0, 209, 260, null, null],
[0, "진표", null, 0, null, 66, 42, 74, 0, 207, 237, null, null],
[0, "정무", null, 0, null, 56, 35, 75, 0, 201, 265, null, null],
[0, "정봉", null, 0, null, 66, 66, 53, 0, 198, 266, null, null],
[0, "전만", null, 0, null, 51, 73, 39, 0, 181, 235, null, null],
[0, "마균", null, 0, null, 22, 17, 71, 0, 200, 259, null, null],
[0, "방회", null, 0, null, 69, 75, 49, 0, 205, 272, null, null],
[0, "서구", null, 0, null, 69, 42, 70, 0, 149, 208, null, null],
[0, "육개", null, 0, null, 65, 61, 79, 0, 198, 269, null, null],
[0, "유찬", null, 0, null, 78, 81, 64, 0, 172, 255, null, null],
[0, "유소", null, 0, null, 68, 53, 74, 0, 195, 264, null, null],
[0, "요립", null, 0, null, 32, 15, 76, 0, 181, 250, null, null],
[0, "여거", null, 0, null, 78, 69, 71, 0, 196, 256, null, null],
[0, "제갈첨", null, 0, null, 70, 57, 76, 0, 227, 263, null, null],
[0, "손휴", null, 0, null, 57, 42, 78, 0, 235, 264, null, null],
[0, "극정", null, 0, null, 42, 23, 68, 0, 208, 278, null, null],
[0, "호분", null, 0, null, 71, 76, 50, 0, 222, 288, null, null],
[0, "손량", null, 0, null, 32, 26, 70, 0, 243, 260, null, null],
[0, "마막", null, 0, null, 34, 12, 44, 0, 221, 266, null, null],
[0, "손호", null, 0, null, 41, 73, 71, 0, 242, 284, null, null],
[0, "조모", null, 0, null, 54, 61, 59, 0, 241, 260, null, null],
[0, "조환", null, 0, null, 30, 28, 30, 0, 246, 302, null, null],
[0, "사마유", null, 0, null, 71, 68, 75, 0, 248, 283, null, null],
[0, "제갈상", null, 0, null, 64, 79, 62, 0, 246, 263, null, null],
[0, "손화", null, 0, null, 31, 39, 68, 0, 224, 253, null, null],
[0, "염우", null, 0, null, 52, 61, 51, 0, 209, 264, null, null],
[0, "왕경", null, 0, null, 67, 63, 71, 0, 206, 260, null, null],
[0, "왕혼", null, 0, null, 74, 71, 63, 0, 223, 297, null, null],
[0, "곽혁", null, 0, null, 33, 29, 70, 0, 187, 225, null, null],
[0, "가범", null, 0, null, 60, 62, 73, 0, 202, 237, null, null],
[0, "서질", null, 0, null, 68, 83, 24, 0, 207, 253, null, null],
[0, "손준", null, 0, null, 64, 70, 65, 0, 219, 256, null, null],
[0, "손침", null, 0, null, 58, 55, 65, 0, 231, 258, null, null],
[0, "우사", null, 0, null, 61, 34, 74, 0, 217, 273, null, null],
[0, "진건", null, 0, null, 72, 71, 65, 0, 214, 292, null, null],
[0, "동궐", null, 0, null, 65, 59, 76, 0, 204, 271, null, null],
[0, "당자", null, 0, null, 61, 71, 50, 0, 196, 265, null, null],
[0, "등충", null, 0, null, 76, 86, 69, 0, 230, 264, null, null],
[0, "황숭", null, 0, null, 67, 63, 72, 0, 208, 263, null, null],
[0, "화핵", null, 0, null, 20, 24, 71, 0, 217, 278, null, null],
[0, "허의", null, 0, null, 51, 74, 15, 0, 213, 263, null, null],
[0, "송겸", null, 0, null, 66, 78, 42, 0, 175, 227, null, null],
[0, "호제", null, 0, null, 57, 39, 68, 0, 207, 264, null, null],
[0, "나헌", null, 0, null, 85, 70, 77, 0, 218, 270, null, null],
[0, "아들노숙", null, 0, null, 73, 53, 74, 0, 217, 272, null, null],
[0, "구성", null, 0, null, 63, 70, 38, 0, 157, 187, null, null],
[0, "어부라", null, 0, null, 72, 68, 21, 0, 150, 195, null, null],
[0, "아하소과", null, 0, null, 61, 76, 13, 0, 204, 253, null, null],
[0, "가비능", null, 0, null, 77, 69, 52, 0, 172, 235, null, null],
[0, "구력거", null, 0, null, 80, 68, 56, 0, 152, 193, null, null],
[0, "강단", null, 0, null, 65, 83, 48, 0, 168, 234, null, null],
[0, "황란", null, 0, null, 63, 75, 44, 0, 200, 264, null, null],
[0, "호주천", null, 0, null, 70, 71, 40, 0, 169, 230, null, null],
[0, "종리목", null, 0, null, 80, 72, 73, 0, 214, 269, null, null],
[0, "제갈교", null, 0, null, 62, 27, 75, 0, 204, 228, null, null],
[0, "답돈", null, 0, null, 84, 82, 61, 0, 158, 207, null, null],
[0, "반임", null, 0, null, 66, 79, 38, 0, 168, 225, null, null],
[0, "보도근", null, 0, null, 64, 73, 50, 0, 170, 233, null, null],
[0, "미당대왕", null, 0, null, 59, 69, 21, 0, 202, 260, null, null],
[0, "유표(흉노)", null, 0, null, 73, 74, 48, 0, 173, 252, null, null],
[0, "루반", null, 0, null, 65, 76, 39, 0, 178, 207, null, null],
[0, "손관", null, 0, null, 72, 78, 51, 0, 166, 217, null, null],
[0, "곽석", null, 0, null, 59, 71, 48, 0, 158, 187, null, null],
[0, "주조", null, 0, null, 63, 68, 26, 0, 152, 187, null, null],
[0, "장거", null, 0, null, 79, 75, 56, 0, 150, 188, null, null],
[0, "장순", null, 0, null, 73, 81, 60, 0, 152, 188, null, null],
[0, "해니", null, 0, null, 62, 78, 35, 0, 191, 233, null, null],
[0, "토안", null, 0, null, 53, 82, 30, 0, 191, 233, null, null],
[0, "유주", null, 0, null, 67, 78, 42, 0, 172, 233, null, null],
[0, "비잔", null, 0, null, 60, 71, 51, 0, 181, 216, null, null],
[0, "월길", null, 0, null, 81, 88, 26, 0, 190, 227, null, null],
[0, "아단", null, 0, null, 72, 65, 78, 0, 186, 259, null, null],
[0, "철리길", null, 0, null, 77, 70, 52, 0, 179, 259, null, null],
[0, "주삭", null, 0, null, 54, 60, 50, 0, 174, 253, null, null],
[0, "왕이", null, 0, null, 87, 59, 77, 0, 171, 230, null, null],
[0, "왕원희", null, 0, null, 53, 37, 73, 0, 217, 268, null, null],
[0, "곽씨", null, 0, null, 42, 4, 55, 0, 184, 235, null, null],
[0, "하후씨", null, 0, null, 34, 13, 42, 0, 188, 243, null, null],
[0, "하후령녀", null, 0, null, 22, 33, 60, 0, 207, 257, null, null],
[0, "하씨", null, 0, null, 51, 14, 67, 0, 150, 189, null, null],
[0, "관은병", null, 0, null, 87, 84, 75, 0, 204, 271, null, null],
[0, "감씨", null, 0, null, 14, 10, 44, 0, 175, 210, null, null],
[0, "황월영", null, 0, null, 62, 33, 90, 0, 186, 235, null, null],
[0, "채염", null, 0, null, 53, 14, 80, 0, 168, 224, null, null],
[0, "채씨", null, 0, null, 38, 7, 70, 0, 159, 212, null, null],
[0, "소교", null, 0, null, 40, 3, 70, 0, 178, 212, null, null],
[0, "서씨", null, 0, null, 48, 16, 80, 0, 183, 232, null, null],
[0, "신헌영", null, 0, null, 48, 28, 84, 0, 191, 269, null, null],
[0, "견씨", null, 0, null, 42, 18, 74, 0, 182, 221, null, null],
[0, "추씨", null, 1, "낙양", 4, 9, 66, 1, 165, 200, null, null],
[0, "조절", null, 0, null, 32, 33, 79, 0, 190, 260, null, null],
[0, "손씨", null, 0, null, 32, 14, 55, 0, 188, 250, null, null],
[0, "손상향", null, 0, null, 77, 82, 55, 0, 193, 222, null, null],
[0, "손노육", null, 0, null, 52, 10, 66, 0, 204, 253, null, null],
[0, "손노반", null, 0, null, 17, 15, 80, 0, 202, 258, null, null],
[0, "대교", null, 0, null, 33, 30, 66, 0, 177, 215, null, null],
[0, "장씨", null, 0, null, 55, 35, 66, 0, 207, 237, null, null],
[0, "장춘화", null, 0, null, 66, 29, 77, 0, 179, 234, null, null],
[0, "초선", null, 0, null, 42, 18, 81, 0, 176, 230, null, null],
[0, "번씨", null, 0, null, 6, 12, 50, 0, 183, 225, null, null],
[0, "미씨", null, 0, null, 13, 6, 72, 0, 176, 208, null, null],
[0, "변씨", null, 0, null, 30, 23, 55, 0, 160, 230, null, null],
[0, "보련사", null, 0, null, 45, 30, 77, 0, 198, 248, null, null],
[0, "유씨", null, 0, null, 8, 8, 44, 0, 164, 215, null, null],
[0, "화만", null, 0, null, 85, 92, 40, 0, 191, 233, null, null],
[0, "포삼낭", null, 0, null, 87, 83, 36, 0, 191, 240, null, null],
[0, "성렴", null, 1, "사수", 66, 72, 43, 1, 168, 199, null, null],
[0, "위월", null, 0, null, 68, 76, 39, 0, 170, 199, null, null],
[0, "진의록", null, 0, null, 46, 43, 17, 0, 168, 199, null, null],
[0, "채옹", null, 1, "장안", 27, 16, 81, 1, 133, 192, null, null],
[0, "지양군", null, 1, "낙양", 13, 8, 55, 1, 103, 192, null, null],
[0, "위소", null, 0, null, 21, 23, 65, 0, 204, 273, null, null],
[0, "위강", null, 0, null, 58, 35, 56, 0, 168, 213, null, null],
[0, "원요", null, 0, null, 28, 41, 50, 0, 177, 206, null, null],
[0, "왕기2", null, 0, null, 69, 67, 61, 0, 217, 281, null, null],
[0, "원환", null, 0, null, 30, 17, 72, 0, 165, 225, null, null],
[0, "우전", null, 0, null, 64, 76, 40, 0, 204, 258, null, null],
[0, "왕광", null, 15, "하내", 33, 65, 55, 12, 150, 190, null, null],
[0, "왕업", null, 0, null, 33, 6, 66, 0, 220, 280, null, null],
[0, "왕융", null, 0, null, 40, 57, 68, 0, 234, 305, null, null],
[0, "왕충", null, 0, null, 46, 39, 57, 0, 152, 214, null, null],
[0, "위풍", null, 0, null, 52, 23, 72, 0, 182, 219, null, null],
[0, "구건", null, 0, null, 39, 52, 65, 0, 239, 272, null, null],
[0, "구본", null, 0, null, 50, 41, 67, 0, 232, 269, null, null],
[0, "동백", null, 1, "장안", 12, 7, 52, 1, 173, 192, null, null],
[0, "마운", null, 0, null, 78, 88, 53, 0, 183, 225, null, null],
[0, "사섭", null, 18, "교지", 53, 31, 76, 12, 137, 226, null, null],
[0, "사지", null, 18, "교지", 58, 51, 52, 1, 163, 227, null, null],
[0, "사휘", null, 18, "남해", 69, 64, 44, 1, 165, 227, null, null],
[0, "사일", null, 18, "남해", 48, 36, 67, 1, 153, 230, null, null],
[0, "사광", null, 18, "교지", 58, 45, 64, 1, 175, 235, null, null],
[0, "후음", null, 0, null, 76, 72, 45, 0, 184, 219, null, null],
[0, "공주", null, 21, "초", 26, 16, 68, 12, 151, 191, null, null],
[0, "고담륭", null, 0, null, 35, 24, 76, 0, 190, 251, null, null],
[0, "국연", null, 0, null, 50, 19, 77, 0, 160, 219, null, null],
[0, "오언", null, 0, null, 74, 72, 77, 0, 235, 297, null, null],
[0, "오강", null, 0, null, 48, 38, 65, 0, 216, 275, null, null],
[0, "최염", null, 0, null, 18, 55, 77, 0, 162, 216, null, null],
[0, "좌혁", null, 0, null, 62, 66, 51, 0, 232, 280, null, null],
[0, "차주", null, 0, null, 49, 49, 40, 0, 164, 199, null, null],
[0, "주태", null, 0, null, 71, 64, 71, 0, 207, 261, null, null],
[0, "북궁백옥", null, 0, null, 66, 72, 49, 0, 146, 187, null, null],
[0, "변장", null, 0, null, 69, 56, 47, 0, 133, 187, null, null],
[0, "순의", null, 0, null, 16, 13, 72, 0, 207, 274, null, null],
[0, "서진순욱", null, 0, null, 8, 19, 77, 0, 225, 289, null, null],
[0, "사마준", null, 0, null, 85, 82, 80, 0, 232, 286, null, null],
[0, "종육", null, 0, null, 32, 12, 71, 0, 223, 263, null, null],
[0, "초이", null, 0, null, 62, 69, 63, 0, 219, 266, null, null],
[0, "제갈정", null, 0, null, 58, 63, 66, 0, 246, 300, null, null],
[0, "보협", null, 0, null, 62, 49, 53, 0, 216, 264, null, null],
[0, "복양흥", null, 0, null, 32, 70, 65, 0, 224, 264, null, null],
[0, "보천", null, 0, null, 71, 60, 71, 0, 222, 272, null, null],
[0, "유대연주", null, 3, "복양", 53, 32, 55, 12, 148, 192, null, null],
[0, "유대", null, 0, null, 63, 58, 30, 0, 155, 202, null, null],
[0, "유승", null, 0, null, 45, 65, 33, 0, 215, 258, null, null],
[0, "여영기", null, 0, null, 79, 88, 37, 0, 182, 198, null, null],
[0, "독발수기능", null, 0, null, 89, 93, 77, 0, 232, 279, null, null],
[0, "진수", null, 0, null, 12, 22, 68, 0, 233, 297, null, null],
[0, "마륭", null, 0, null, 84, 75, 76, 0, 231, 296, null, null],
[0, "도황", null, 0, null, 76, 68, 72, 0, 232, 290, null, null],
[0, "진온", null, 9, "수춘", 60, 38, 48, 12, 167, 192, null, null],
[0, "교모", null, 3, "복양", 54, 45, 69, 11, 137, 190, null, null],
[0, "교국로", null, 0, null, 38, 17, 55, 0, 150, 220, null, null],
[0, "포신", null, 2, "진류", 77, 67, 81, 1, 152, 192, null, null],
[0, "포훈", null, 0, null, 41, 35, 75, 0, 180, 226, null, null],
[0, "포도", null, 2, "진류", 57, 70, 43, 1, 159, 190, null, null],
[0, "위자", null, 2, "진류", 58, 38, 62, 1, 150, 190, null, null],
[0, "유화", null, 16, "계", 21, 16, 59, 1, 165, 216, null, null],
[0, "이이자", null, 0, null, 32, 18, 48, 0, 157, 199, null, null],
[0, "선우보", null, 16, "계", 74, 69, 65, 1, 161, 229, null, null],
[0, "원유", null, 3, "복양", 57, 39, 73, 1, 150, 193, null, null],
[0, "사마휘", null, 0, null, 21, 8, 92, 0, 173, 208, "은둔", null, "좋지~좋아"],
[0, "화타", null, 0, null, 8, 7, 68, 0, 173, 207, "은둔", "의술"],
[0, "관로", null, 0, null, 13, 9, 72, 0, 200, 233, "은둔", null],
[0, "예형", null, 0, null, 13, 4, 90, 0, 173, 199, null, null],
[0, "원혁", null, 0, null, 18, 18, 18, 0, 180, 246, null, null],
[0, "헌제", null, 1, "낙양", 23, 17, 66, 1, 184, 234, null, null, "한 황실은 이대로 끝나는 것인가…"],
[0, "황완", null, 1, "낙양", 40, 34, 71, 1, 141, 192, null, null],
[0, "마일제", null, 1, "낙양", 43, 25, 70, 1, 130, 194, null, null],
[0, "유총", null, 22, "여남", 82, 45, 60, 12, 151, 197, null, null],
[0, "낙준", null, 0, null, 51, 37, 66, 0, 152, 197, null, null],
[0, "낙통", null, 0, null, 76, 57, 73, 0, 193, 228, null, null],
[0, "이리", null, 1, "홍농", 65, 72, 38, 1, 171, 198, null, null],
[0, "허소", null, 0, null, 46, 13, 78, 0, 150, 195, null, null, "자네는 치세의 능신, 난세의 간옹이 되겠군."],
[0, "허사", null, 0, null, 24, 20, 60, 0, 163, 199, null, null],
[0, "장초", null, 0, null, 61, 32, 60, 0, 168, 196, null, null],
[0, "양표", null, 1, "낙양", 24, 20, 60, 1, 142, 225, null, null],
[0, "왕필", null, 0, null, 53, 44, 59, 0, 170, 228, null, null],
[0, "사환", null, 2, "진류", 70, 71, 45, 1, 173, 209, null, null],
[0, "정비", null, 0, null, 34, 30, 57, 0, 158, 214, null, null],
[0, "두씨", null, 1, "낙양", 26, 41, 52, 1, 172, 236, null, null],
[0, "누규", null, 13, "양양", 58, 40, 87, 1, 143, 212, null, null],
[0, "단외", null, 1, "장안", 55, 48, 55, 1, 148, 209, null, null],
[0, "원사", null, 0, null, 65, 43, 78, 0, 159, 210, null, null],
[0, "사의관", null, 0, null, 22, 12, 67, 0, 168, 199, null, null],
[0, "송건", null, 0, null, 66, 77, 40, 0, 164, 214, null, null],
[0, "곽원", null, 17, "업", 66, 73, 36, 1, 162, 205, null, null],
[0, "소유", null, 0, null, 51, 59, 48, 0, 167, 210, null, null],
[0, "주한", null, 0, null, 49, 51, 26, 0, 162, 204, null, null],
[0, "뇌서", null, 0, null, 68, 65, 34, 0, 170, 212, null, null],
[0, "장홍", null, 0, "복양", 72, 81, 65, 0, 164, 196, null, null],
[0, "유위대", null, 4, "북평", 53, 44, 62, 1, 152, 199, null, null],
[0, "문칙", null, 4, "계", 59, 53, 32, 1, 164, 199, null, null],
[0, "습진", null, 0, null, 64, 68, 51, 0, 189, 221, null, null],
[0, "습정", null, 0, null, 49, 29, 70, 0, 181, 229, null, null]
],
"general_ex":[],
"cities":[
],
"history":[
"<C>●</>190년 1월:<L><b>【역사모드2-2】</b></>반동탁연합 결성(정사)",
"<C>●</>190년 1월:<G><b>【연합】</b></>동탁을 토벌하기 위해 18로 제후가 뭉쳤다."
],
"initialEvents":[
[
true,
["ChangeCity", "free", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80
}],
["ChangeCity", "occupied", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80,
"def":"70%",
"wall":"70%"
}]
]
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
}
+1 -1
View File
@@ -31,7 +31,7 @@
["여포", "#A9A9A9", 100000, 100000, "조조의 본거지를 빼앗은 당대 최고의 맹장 여포", 1000, "병가", 2, [ ["여포", "#A9A9A9", 100000, 100000, "조조의 본거지를 빼앗은 당대 최고의 맹장 여포", 1000, "병가", 2, [
"복양" "복양"
]], ]],
["손", "#FF0000", 100000, 100000, "손견의 뒤를 이은 소패왕 손책", 1000, "병가", 2, [ ["손", "#FF0000", 100000, 100000, "손견의 뒤를 이은 소패왕 손책", 1000, "병가", 2, [
"여강" "여강"
]], ]],
["공손찬", "#FF00FF", 100000, 100000, "북평 태수 공손찬", 1000, "병가", 3, [ ["공손찬", "#FF00FF", 100000, 100000, "북평 태수 공손찬", 1000, "병가", 3, [
+766
View File
@@ -0,0 +1,766 @@
{
"title":"【역사모드3-2】 군웅축록",
"startYear":192,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["이각", "#A9A9A9", 100000, 100000, "천자를 등에 업은 이각", 1000, "명가", 5, ["함곡", "장안", "홍농", "사곡", "안정"]],
["조조", "#0000FF", 10000, 40000, "위태로운 조조", 1000, "병가", 3, ["진류", "정도", ""]],
["여포", "#A9A9A9", 10000, 10000, "조조를 공격하는 여포", 1000, "병가", 1, ["복양"]],
["공손찬", "#FF00FF", 10000, 10000, "백마의 공손찬", 1000, "병가", 3, ["북평", "역경", "계"]],
["장양", "#7B68EE", 10000, 10000, "병주자사 장양", 1000, "병가", 3, ["하내"]],
["유장", "#483D8B", 10000, 30000, "익주목 유장", 1000, "유가", 4, ["성도", "자동", "면죽", "강주"]],
["원술", "#FFC0CB", 15000, 40000, "후장군 원술", 1000, "병가", 2, ["수춘"]],
["유비", "#008000", 10000, 10000, "서주목 유비", 1000, "유가", 4, ["서주", "하비", "소패"]],
["유요", "#808000", 10000, 10000, "양주자사 유요", 1000, "유가", 3, ["합비", "건업"]],
["마등", "#808000", 10000, 10000, "서량태수 마등", 1000, "병가", 3, ["서량"]],
["공손도", "#A0522D", 10000, 10000, "요동의 왕 공손도", 1000, "덕가", 1, ["안평"]],
["엄백호", "#800080", 10000, 10000, "동오의 호족, 엄백호", 1000, "병가", 1, ["오"]],
["유표", "#E0FFFF", 10000, 10000, "형주자사 유표", 1000, "유가", 4, ["양양", "장판", "강하"]],
["장로", "#20B2AA", 10000, 10000, "오두미도 장로", 1000, "오두미도", 1, ["한중", "양평"]],
["장연", "#87CEEB", 10000, 10000, "흑산적 장연", 1000, "도적", 2, ["진양"]],
["화흠", "#6495ED", 10000, 10000, "예장태수 화흠", 1000, "유가", 1, ["시상"]],
["원소", "#FFFF00", 10000, 10000, "기주목 원소", 1000, "병가", 4, ["남피", "업", "계교", "평원"]],
["사섭", "#800000", 10000, 10000, "교주자사 사섭", 1000, "유가", 3, ["교지", "남해"]],
["공융", "#800080", 10000, 10000, "북해태수 공융", 1000, "유가", 1, ["북해"]],
["한수", "#FFFFFF", 10000, 10000, "서량의 모반자 한수", 1000, "병가", 1, ["천수"]],
["왕랑", "#87CEEB", 10000, 10000, "회계태수 왕랑", 1000, "유가", 1, ["회계"]],
["유총", "#7B68EE", 10000, 10000, "진민왕 유총", 1000, "덕가", 6, ["초"]],
["손책", "#FF0000", 10000, 10000, "원술에게서 벗어나려는 손책", 1000, "병가", 2, ["여강"]],
["유벽", "#FFD700", 10000, 10000, "여남 황건적", 1000, "도적", 1, ["여남"]]
],
"diplomacy":[
[4, 17, 1, 36],
[23, 9, 1, 36],
[4, 8, 7, 48],
[17, 2, 7, 48],
[7, 23, 7, 48],
[3, 2, 1, 36]
],
"general":[
[0, "아회남", null, 0, null, 65, 74, 26, 0, 190, 225, null, null],
[0, "이적", null, 0, null, 29, 24, 84, 0, 162, 273, null, null],
[0, "윤상", null, 0, null, 51, 44, 62, 0, 194, 260, null, null],
[0, "윤묵", null, 0, null, 26, 15, 66, 0, 183, 239, null, null],
[0, "우금1", null, 2, "진류", 83, 78, 74, 1, 159, 221, null, null],
[0, "위관", null, 0, null, 69, 46, 79, 0, 220, 291, null, null],
[0, "원윤", null, 7, "수춘", 15, 14, 39, 1, 150, 199, null, null],
[0, "원희", null, 17, "업", 66, 51, 63, 1, 176, 207, null, null],
[0, "염행", null, 20, "천수", 76, 84, 66, 1, 159, 215, null, null],
[0, "염유", null, 0, "계", 71, 57, 71, 0, 168, 227, null, null],
[0, "원술", null, 7, "수춘", 44, 65, 65, 12, 155, 199, null, null, "꿀물~! 꿀을 더 가져 오거라"],
[0, "원상", null, 0, null, 63, 75, 42, 0, 179, 207, null, null],
[0, "원소", null, 17, "업", 81, 69, 70, 12, 154, 202, null, null, "사세 삼공의 이 원소가 모조리 통일하겠소"],
[0, "염상", null, 7, "수춘", 30, 27, 71, 11, 158, 199, null, null],
[0, "원담", null, 17, "평원", 60, 69, 30, 1, 173, 205, null, null],
[0, "염포", null, 14, "한중", 29, 25, 82, 11, 167, 231, null, null],
[0, "왕위", null, 0, null, 60, 70, 62, 0, 163, 222, null, null],
[0, "왕윤", null, 0, null, 26, 6, 68, 0, 137, 192, null, null],
[0, "왕항", null, 0, null, 76, 60, 61, 0, 184, 254, null, null],
[0, "왕찬", null, 13, "양양", 15, 3, 79, 1, 177, 217, null, null],
[0, "왕수", null, 19, "북해", 54, 27, 77, 11, 168, 218, null, null],
[0, "왕숙", null, 0, null, 36, 22, 76, 0, 195, 256, null, null],
[0, "왕준", null, 0, null, 81, 73, 77, 0, 206, 286, null, null],
[0, "왕쌍", null, 0, null, 67, 88, 19, 0, 195, 228, null, null],
[0, "왕창", null, 0, null, 74, 64, 79, 0, 188, 259, null, null],
[0, "왕평", null, 0, null, 83, 79, 76, 0, 192, 248, null, null],
[0, "왕보", null, 0, null, 62, 41, 79, 0, 171, 219, null, null],
[0, "왕문", null, 17, "남피", 65, 64, 31, 1, 162, 205, null, null],
[0, "왕릉", null, 0, null, 74, 64, 71, 0, 172, 251, null, null],
[0, "왕루", null, 0, null, 28, 30, 79, 0, 173, 211, null, null],
[0, "왕랑", null, 21, "회계", 47, 35, 79, 12, 167, 228, null, null],
[0, "온회", null, 0, null, 62, 36, 74, 0, 178, 228, null, null],
[0, "하안", null, 0, null, 15, 30, 72, 0, 190, 249, null, null],
[0, "괴월", null, 13, "양양", 47, 27, 82, 1, 157, 214, null, null],
[0, "괴량", null, 13, "양양", 68, 33, 88, 11, 155, 204, null, null],
[0, "가화", null, 0, null, 49, 65, 41, 0, 176, 222, null, null],
[0, "가규", null, 0, null, 78, 61, 84, 0, 177, 231, null, null],
[0, "하의", null, 7, "수춘", 56, 69, 36, 1, 161, 196, null, null],
[0, "화흠", null, 16, "시상", 33, 33, 82, 12, 157, 231, null, null],
[0, "가후", null, 1, "장안", 88, 48, 97, 11, 147, 223, null, null],
[0, "곽가", null, 2, "진류", 88, 15, 96, 11, 170, 207, null, null],
[0, "악환", null, 0, null, 65, 82, 42, 0, 196, 251, null, null],
[0, "곽사", null, 1, "안정", 64, 76, 13, 1, 146, 197, null, null],
[0, "악취", null, 0, null, 53, 66, 61, 0, 157, 195, null, null],
[0, "곽준", null, 0, null, 73, 66, 73, 0, 178, 217, null, null],
[0, "학소", null, 0, null, 86, 79, 78, 0, 185, 229, null, null],
[0, "악진", null, 2, "진류", 80, 84, 56, 1, 159, 218, null, null],
[0, "곽도", null, 17, "업", 52, 50, 82, 1, 157, 205, null, null],
[0, "학맹", null, 0, null, 62, 67, 42, 0, 156, 300, null, null],
[0, "곽유지", null, 0, null, 28, 9, 69, 0, 190, 259, null, null],
[0, "곽익", null, 0, null, 73, 69, 69, 0, 207, 270, null, null],
[0, "곽회", null, 0, null, 87, 78, 81, 0, 187, 255, null, null],
[0, "하후위", null, 0, null, 71, 73, 49, 0, 204, 253, null, null],
[0, "하후연", null, 2, "진류", 90, 91, 68, 1, 162, 219, null, null],
[0, "하후은", null, 0, null, 63, 72, 53, 0, 180, 208, null, null],
[0, "하후화", null, 0, null, 48, 51, 71, 0, 207, 265, null, null],
[0, "하후혜", null, 0, null, 50, 44, 76, 0, 206, 242, null, null],
[0, "하후현", null, 0, null, 54, 39, 76, 0, 208, 254, null, null],
[0, "하후상", null, 0, null, 79, 72, 75, 0, 181, 225, null, null],
[0, "하후덕", null, 0, null, 69, 73, 32, 0, 178, 218, null, null],
[0, "하후돈", null, 2, "진류", 92, 90, 63, 1, 156, 220, null, null],
[0, "하후패", null, 0, null, 79, 84, 77, 0, 202, 262, null, null],
[0, "하후무", null, 0, null, 20, 7, 4, 0, 201, 259, null, null],
[0, "가충", null, 0, null, 54, 31, 89, 0, 217, 282, null, null],
[0, "하진", null, 0, null, 39, 40, 6, 0, 135, 189, null, null],
[0, "화웅", null, 0, null, 88, 92, 61, 0, 155, 190, null, null],
[0, "한윤", null, 7, "수춘", 26, 29, 65, 1, 155, 197, null, null],
[0, "관우", null, 8, "서주", 97, 97, 79, 1, 162, 219, null, null, "술이 식기 전에 돌아오겠소"],
[0, "환계", null, 23, "여강", 25, 26, 68, 1, 156, 221, null, null],
[0, "관해", null, 0, null, 70, 82, 10, 0, 160, 193, null, null],
[0, "관구검", null, 0, null, 78, 74, 55, 0, 202, 255, null, null],
[0, "한현", null, 0, null, 22, 33, 62, 0, 163, 220, null, null],
[0, "한호", null, 2, "진류", 69, 72, 84, 1, 164, 224, null, null],
[0, "관흥", null, 0, null, 76, 86, 67, 0, 199, 234, null, null],
[0, "관색", null, 0, null, 74, 88, 56, 0, 200, 239, null, null],
[0, "한수", null, 20, "천수", 81, 75, 82, 12, 142, 215, null, null],
[0, "한숭", null, 13, "강하", 25, 15, 71, 1, 154, 210, null, null],
[0, "관정", null, 4, "북평", 36, 52, 73, 11, 158, 199, null, null],
[0, "한섬", null, 0, null, 69, 66, 36, 0, 159, 196, null, null],
[0, "감택", null, 0, null, 43, 49, 83, 0, 182, 243, null, null],
[0, "한충", null, 0, null, 64, 67, 18, 0, 151, 184, null, null],
[0, "한당", null, 23, "여강", 76, 85, 61, 1, 156, 227, null, null],
[0, "한덕", null, 0, null, 63, 76, 25, 0, 171, 228, null, null],
[0, "감녕", null, 13, "강하", 93, 94, 76, 1, 174, 219, null, null],
[0, "한복", null, 0, null, 28, 3, 27, 0, 149, 193, null, null],
[0, "관평", null, 0, null, 80, 82, 72, 0, 186, 219, null, null],
[0, "간옹", null, 8, "하비", 20, 32, 75, 1, 164, 225, null, null],
[0, "안량", null, 17, "업", 88, 94, 21, 1, 160, 200, null, null],
[0, "위연", null, 0, null, 85, 92, 72, 0, 175, 234, null, null],
[0, "국의", null, 17, "업", 82, 78, 51, 1, 146, 197, null, null],
[0, "희지재", null, 2, "진류", 63, 7, 88, 1, 157, 196, null, null],
[0, "위속", null, 3, "복양", 67, 78, 31, 1, 156, 200, null, null],
[0, "위유", null, 0, null, 46, 29, 74, 0, 151, 193, null, null],
[0, "우금2", null, 0, null, 72, 79, 38, 0, 173, 226, null, null],
[0, "우보", null, 0, null, 38, 60, 21, 0, 159, 192, null, null],
[0, "강유", null, 0, null, 92, 89, 90, 0, 202, 264, null, null],
[0, "공지", null, 0, null, 43, 53, 62, 0, 178, 197, null, null],
[0, "교유", null, 7, "수춘", 64, 69, 38, 1, 143, 195, null, null],
[0, "공도", null, 24, "여남", 59, 70, 23, 1, 164, 200, null, null],
[0, "허공", null, 0, null, 44, 66, 64, 0, 155, 200, null, null],
[0, "허정", null, 21, "회계", 23, 5, 68, 1, 152, 222, null, null],
[0, "허저", null, 2, "진류", 74, 96, 36, 1, 169, 226, null, null],
[0, "허유", null, 17, "업", 36, 21, 80, 1, 155, 204, null, null],
[0, "기령", null, 7, "수춘", 78, 83, 51, 1, 155, 199, null, null],
[0, "김의", null, 0, null, 32, 38, 65, 0, 177, 218, null, null],
[0, "김배삼결", null, 0, null, 64, 76, 19, 0, 192, 225, null, null],
[0, "김선", null, 0, null, 52, 68, 13, 0, 155, 220, null, null],
[0, "우번", null, 21, "회계", 43, 46, 86, 11, 164, 233, null, null],
[0, "형도영", null, 0, null, 69, 80, 41, 0, 174, 208, null, null],
[0, "엄안", null, 6, "자동", 82, 83, 72, 1, 151, 222, null, null],
[0, "곽마", null, 0, null, 68, 71, 40, 0, 239, 281, null, null],
[0, "엄준", null, 0, null, 28, 2, 71, 0, 169, 246, null, null],
[0, "엄정", null, 0, null, 50, 55, 39, 0, 151, 189, null, null],
[0, "엄백호", null, 12, "오", 67, 70, 23, 12, 142, 198, null, null, "이 몸은 동오의 덕왕 엄백호라고 하오!"],
[0, "엄여", null, 12, "오", 61, 78, 44, 1, 145, 196, null, null],
[0, "오의", null, 0, null, 79, 73, 70, 0, 165, 237, null, null],
[0, "황개", null, 23, "여강", 80, 83, 70, 1, 154, 218, null, null],
[0, "고간", null, 17, "업", 74, 56, 48, 1, 168, 206, null, null],
[0, "황권", null, 6, "성도", 75, 59, 82, 11, 167, 240, null, null],
[0, "고유", null, 17, "업", 57, 43, 72, 1, 174, 263, null, null],
[0, "고순", null, 3, "복양", 85, 86, 60, 1, 162, 198, null, null],
[0, "고상", null, 0, null, 68, 68, 53, 0, 194, 252, null, null],
[0, "고승", null, 0, null, 67, 73, 41, 0, 145, 184, null, null],
[0, "후성", null, 3, "복양", 74, 75, 68, 1, 158, 199, null, null],
[0, "후선", null, 20, "천수", 63, 66, 34, 1, 175, 228, null, null],
[0, "황조", null, 13, "강하", 74, 66, 55, 1, 148, 208, null, null],
[0, "공손월", null, 0, null, 74, 72, 47, 0, 160, 192, null, null],
[0, "공손연", null, 0, null, 65, 70, 60, 0, 205, 238, null, null],
[0, "공손공", null, 11, "안평", 39, 17, 69, 1, 174, 240, null, null],
[0, "공손강", null, 11, "안평", 72, 66, 65, 1, 172, 211, null, null],
[0, "공손찬", null, 4, "북평", 84, 83, 75, 12, 152, 199, null, null],
[0, "공손속", null, 4, "북평", 63, 68, 57, 1, 176, 199, null, null],
[0, "공손도", null, 11, "안평", 67, 71, 66, 12, 154, 204, null, null],
[0, "공손범", null, 4, "북평", 73, 69, 66, 1, 158, 199, null, null],
[0, "황충", null, 0, null, 90, 93, 65, 0, 154, 220, null, null],
[0, "고정", null, 0, null, 55, 63, 43, 0, 190, 251, null, null],
[0, "고패", null, 0, null, 66, 61, 69, 0, 170, 212, null, null],
[0, "황보숭", null, 0, null, 92, 61, 73, 0, 132, 195, null, null],
[0, "공융", null, 19, "북해", 30, 5, 73, 12, 153, 208, null, null],
[0, "고람", null, 17, "평원", 76, 82, 68, 1, 159, 201, null, null],
[0, "오경", null, 0, null, 69, 66, 52, 0, 151, 211, null, null],
[0, "호거아", null, 1, "홍농", 70, 82, 41, 1, 164, 206, null, null],
[0, "호진", null, 0, null, 65, 74, 12, 0, 148, 190, null, null],
[0, "올돌골", null, 0, null, 79, 86, 1, 0, 186, 225, null, null],
[0, "호반", null, 0, null, 55, 55, 59, 0, 179, 233, null, null],
[0, "오반", null, 0, null, 74, 71, 59, 0, 171, 234, null, null],
[0, "고옹", null, 0, null, 43, 18, 80, 0, 168, 243, null, null],
[0, "오란", null, 6, "성도", 68, 80, 35, 1, 170, 218, null, null],
[0, "채화", null, 13, "장판", 39, 50, 1, 1, 166, 208, null, null],
[0, "채중", null, 13, "장판", 40, 54, 2, 1, 168, 208, null, null],
[0, "채모", null, 13, "양양", 70, 70, 77, 1, 160, 215, null, null],
[0, "착융", null, 9, "건업", 60, 69, 38, 1, 161, 196, null, null],
[0, "사마의", null, 0, null, 98, 63, 98, 0, 179, 251, null, null],
[0, "사마염", null, 0, null, 69, 59, 77, 0, 238, 290, null, null],
[0, "사마사", null, 0, null, 79, 64, 88, 0, 208, 255, null, null],
[0, "사마소", null, 0, null, 76, 57, 87, 0, 211, 265, null, null],
[0, "사마부", null, 0, null, 70, 37, 77, 0, 180, 272, null, null],
[0, "사마랑", null, 0, null, 20, 21, 72, 0, 171, 217, null, null],
[0, "사마가", null, 0, null, 66, 84, 25, 0, 167, 222, null, null],
[0, "주흔", null, 21, "회계", 65, 62, 73, 1, 159, 196, null, null],
[0, "주앙", null, 17, "남피", 74, 65, 65, 1, 162, 195, null, null],
[0, "주지", null, 0, null, 65, 85, 41, 0, 233, 295, null, null],
[0, "주창", null, 0, null, 68, 84, 42, 0, 164, 219, null, null],
[0, "주태유평", null, 23, "여강", 84, 91, 48, 1, 171, 225, null, null],
[0, "주방", null, 0, null, 52, 41, 80, 0, 200, 240, null, null],
[0, "주유", null, 23, "여강", 95, 71, 96, 11, 175, 210, null, null],
[0, "주환", null, 0, null, 84, 82, 77, 0, 177, 238, null, null],
[0, "주거", null, 0, null, 77, 57, 72, 0, 190, 246, null, null],
[0, "축융", null, 0, null, 74, 85, 29, 0, 182, 230, null, null],
[0, "주준", null, 1, "장안", 89, 65, 70, 1, 149, 195, null, null],
[0, "주연", null, 0, null, 79, 69, 71, 0, 182, 249, null, null],
[0, "주치", null, 0, null, 71, 56, 72, 0, 156, 224, null, null],
[0, "주포", null, 0, null, 68, 73, 34, 0, 191, 225, null, null],
[0, "주령", null, 2, "진류", 71, 73, 67, 1, 170, 236, null, null],
[0, "순욱", null, 2, "진류", 62, 14, 95, 1, 163, 212, null, null],
[0, "순우경", null, 17, "남피", 72, 66, 29, 1, 146, 200, null, null],
[0, "순심", null, 17, "업", 34, 25, 78, 1, 164, 208, null, null],
[0, "순유", null, 2, "진류", 73, 26, 94, 1, 157, 214, null, null],
[0, "장완", null, 0, null, 78, 34, 84, 0, 188, 246, null, null],
[0, "종회", null, 0, null, 82, 51, 91, 0, 225, 264, null, null],
[0, "장간", null, 0, null, 19, 6, 66, 0, 175, 208, null, null],
[0, "장의거", null, 17, "업", 71, 58, 59, 1, 159, 205, null, null],
[0, "장흠", null, 23, "여강", 78, 84, 54, 1, 159, 208, null, null],
[0, "장제3", null, 0, null, 48, 43, 85, 0, 188, 249, null, null],
[0, "초주", null, 0, null, 16, 3, 67, 0, 201, 270, null, null],
[0, "초촉", null, 17, "업", 65, 76, 33, 1, 159, 208, null, null],
[0, "상총", null, 0, null, 76, 61, 77, 0, 195, 240, null, null],
[0, "종요", null, 1, "장안", 70, 24, 77, 1, 151, 230, null, null],
[0, "상랑", null, 0, null, 28, 18, 74, 0, 167, 247, null, null],
[0, "서영", null, 0, null, 80, 76, 62, 0, 147, 192, null, null],
[0, "제갈각", null, 0, null, 72, 47, 90, 0, 203, 253, null, null],
[0, "제갈근", null, 0, null, 75, 34, 81, 0, 174, 241, null, null],
[0, "제갈균", null, 0, null, 29, 25, 52, 0, 185, 252, null, null],
[0, "제갈탄", null, 0, null, 72, 72, 76, 0, 206, 258, null, null],
[0, "제갈량", null, 0, null, 98, 38, 100, 0, 184, 234, null, null],
[0, "서황", null, 1, "사곡", 91, 90, 78, 1, 165, 228, null, null],
[0, "서서", null, 0, null, 87, 64, 93, 0, 160, 300, null, null],
[0, "서성", null, 0, null, 86, 81, 78, 0, 178, 232, null, null],
[0, "서막", null, 0, null, 55, 32, 68, 0, 171, 249, null, null],
[0, "신의", null, 0, null, 55, 59, 60, 0, 190, 252, null, null],
[0, "신탐", null, 0, null, 56, 62, 54, 0, 188, 254, null, null],
[0, "심배", null, 17, "업", 80, 60, 83, 1, 156, 204, null, null],
[0, "신비", null, 17, "남피", 39, 24, 79, 1, 171, 240, null, null],
[0, "신평", null, 17, "남피", 69, 43, 77, 1, 165, 204, null, null],
[0, "진복", null, 0, null, 31, 7, 73, 0, 160, 226, null, null],
[0, "진랑", null, 0, null, 58, 70, 35, 0, 192, 234, null, null],
[0, "휴고", null, 15, "진양", 63, 71, 38, 1, 151, 199, null, null],
[0, "추단", null, 0, null, 61, 64, 34, 0, 144, 193, null, null],
[0, "성의", null, 20, "천수", 74, 72, 41, 1, 168, 211, null, null],
[0, "성공영", null, 20, "천수", 73, 71, 80, 11, 172, 220, null, null],
[0, "설종", null, 0, null, 34, 16, 73, 0, 187, 243, null, null],
[0, "선경", null, 4, "북평", 71, 68, 43, 1, 156, 199, null, null],
[0, "전종", null, 0, null, 78, 72, 75, 0, 183, 249, null, null],
[0, "조예", null, 0, null, 72, 52, 82, 0, 205, 239, null, null],
[0, "조휴", null, 2, "진류", 74, 75, 62, 1, 174, 228, null, null],
[0, "송헌", null, 3, "복양", 68, 77, 38, 1, 157, 200, null, null],
[0, "조앙", null, 2, "진류", 74, 67, 69, 1, 161, 197, null, null],
[0, "조홍 자렴", null, 2, "진류", 79, 81, 44, 1, 169, 232, null, null, "좌절감이 사나이를 키우는 것이다!"],
[0, "조순", null, 2, "진류", 75, 71, 63, 1, 170, 210, null, null],
[0, "조창", null, 0, null, 82, 90, 40, 0, 190, 223, null, null],
[0, "조식", null, 0, null, 33, 22, 81, 0, 192, 232, null, null],
[0, "조진", null, 0, null, 81, 74, 70, 0, 185, 231, null, null],
[0, "조인", null, 2, "진류", 89, 86, 62, 1, 168, 223, null, null],
[0, "조성", null, 0, null, 54, 74, 38, 0, 163, 198, null, null],
[0, "조조", null, 2, "진류", 99, 72, 91, 12, 151, 220, null, null, "내가 천하 사람들을 저버릴지언정, 천하 사람들이 나를 저버리게 하지는 않을 것이다."],
[0, "조충", null, 0, null, 31, 21, 85, 0, 196, 207, null, null],
[0, "장패", null, 0, null, 78, 75, 53, 0, 165, 231, null, null],
[0, "조비", null, 0, null, 70, 71, 83, 0, 187, 226, null, null],
[0, "조표", null, 8, "서주", 66, 69, 32, 1, 151, 196, null, null],
[0, "저수", null, 17, "업", 78, 35, 90, 1, 156, 201, null, null],
[0, "소비", null, 0, null, 69, 63, 66, 0, 172, 221, null, null],
[0, "조무", null, 0, null, 70, 71, 66, 0, 155, 193, null, null],
[0, "손환", null, 0, null, 82, 73, 76, 0, 166, 228, null, null],
[0, "손견", null, 0, null, 94, 90, 79, 0, 156, 192, null, null, "내가 옥새를 가지고 있다면 나는 칼과 화살을 맞아 죽을 것이다."],
[0, "손건", null, 0, null, 34, 33, 79, 0, 165, 215, null, null],
[0, "손권", null, 0, null, 79, 67, 80, 0, 182, 252, null, null],
[0, "손교", null, 0, null, 77, 72, 67, 0, 181, 219, null, null],
[0, "손책", null, 23, "여강", 96, 92, 74, 12, 175, 200, null, null],
[0, "손소", null, 0, null, 80, 79, 76, 0, 188, 241, null, null],
[0, "손정", null, 23, "여강", 66, 53, 73, 1, 160, 206, null, null],
[0, "손중", null, 0, null, 62, 71, 36, 0, 154, 184, null, null],
[0, "손등", null, 0, null, 62, 37, 79, 0, 209, 241, null, null],
[0, "손유", null, 0, null, 77, 70, 68, 0, 177, 215, null, null],
[0, "손익", null, 0, null, 67, 78, 27, 0, 184, 204, null, null],
[0, "손례", null, 0, null, 78, 81, 67, 0, 180, 250, null, null],
[0, "태사자", null, 9, "건업", 90, 93, 69, 1, 166, 206, null, null],
[0, "대래동주", null, 0, null, 51, 53, 54, 0, 195, 249, null, null],
[0, "대릉", null, 0, null, 70, 75, 39, 0, 199, 258, null, null],
[0, "타사대왕", null, 0, null, 62, 59, 70, 0, 186, 225, null, null],
[0, "담웅", null, 0, null, 58, 73, 14, 0, 188, 221, null, null],
[0, "장윤", null, 13, "양양", 72, 67, 42, 1, 163, 208, null, null],
[0, "조운", null, 4, "북평", 96, 96, 77, 1, 168, 229, null, null],
[0, "장위", null, 14, "한중", 74, 66, 45, 1, 172, 228, null, null, "쌀 다섯 말만 가지고 오시오~ 모두 고쳐드리리다."],
[0, "장영", null, 9, "건업", 75, 74, 41, 1, 154, 196, null, null],
[0, "장연", null, 15, "진양", 76, 81, 57, 12, 153, 210, null, null],
[0, "장횡", null, 9, "건업", 59, 70, 23, 1, 178, 211, null, null],
[0, "장온", null, 0, null, 32, 10, 72, 0, 193, 231, null, null],
[0, "장개", null, 0, null, 34, 66, 8, 0, 155, 194, null, null],
[0, "장각", null, 0, null, 87, 25, 86, 0, 140, 184, null, null],
[0, "장기", null, 0, null, 74, 35, 76, 0, 170, 223, null, null],
[0, "장의", null, 17, "남피", 79, 72, 75, 1, 153, 215, null, null],
[0, "장훈", null, 7, "수춘", 72, 68, 41, 1, 156, 206, null, null],
[0, "장굉", null, 23, "여강", 24, 22, 86, 1, 153, 212, null, null],
[0, "장합", null, 17, "평원", 89, 89, 73, 1, 167, 231, null, null],
[0, "조홍", null, 0, null, 66, 72, 28, 0, 156, 184, null, null],
[0, "장제1", null, 1, "홍농", 70, 66, 55, 1, 144, 196, null, null],
[0, "장수", null, 1, "홍농", 80, 73, 64, 1, 154, 207, null, null],
[0, "장소 자포", null, 23, "여강", 33, 3, 84, 1, 156, 236, null, null],
[0, "장송", null, 0, null, 25, 6, 88, 0, 170, 212, null, null],
[0, "장임", null, 6, "성도", 84, 84, 78, 1, 169, 214, null, null],
[0, "장제", null, 0, null, 67, 43, 80, 0, 236, 280, null, null],
[0, "장막", null, 3, "복양", 52, 53, 71, 1, 155, 195, null, null],
[0, "조범", null, 0, null, 28, 21, 32, 0, 168, 218, null, null],
[0, "장비", null, 8, "하비", 94, 98, 30, 1, 165, 221, null, null],
[0, "장포", null, 0, null, 78, 87, 48, 0, 198, 219, null, null],
[0, "장보", null, 0, null, 83, 71, 81, 0, 148, 184, null, null],
[0, "장만성", null, 0, null, 75, 81, 45, 0, 143, 184, null, null],
[0, "장양", null, 5, "진양", 72, 70, 66, 12, 151, 195, null, null],
[0, "장익", null, 0, null, 75, 74, 76, 0, 188, 264, null, null],
[0, "장료", null, 3, "복양", 95, 92, 78, 1, 169, 222, null, null],
[0, "장량", null, 0, null, 78, 80, 74, 0, 153, 184, null, null],
[0, "조루", null, 0, null, 70, 43, 68, 0, 183, 219, null, null],
[0, "장로", null, 14, "한중", 51, 26, 74, 12, 163, 216, null, null],
[0, "진횡", null, 9, "건업", 64, 63, 26, 1, 161, 196, null, null],
[0, "진응", null, 0, null, 62, 72, 45, 0, 172, 208, null, null],
[0, "진기", null, 7, "수춘", 58, 65, 43, 1, 165, 198, null, null],
[0, "진궁", null, 3, "복양", 84, 55, 89, 11, 154, 198, null, null, "조조…그자는 더 이상 내가 감당하기 어려워졌다"],
[0, "진교", null, 0, null, 61, 27, 77, 0, 175, 237, null, null],
[0, "진군", null, 8, "하비", 32, 14, 75, 11, 167, 236, null, null],
[0, "진규", null, 8, "서주", 30, 4, 82, 1, 132, 206, null, null],
[0, "진식", null, 0, null, 70, 71, 25, 0, 191, 230, null, null],
[0, "진진", null, 0, null, 46, 46, 69, 0, 170, 235, null, null],
[0, "진태", null, 0, null, 84, 77, 86, 0, 210, 260, null, null],
[0, "진등", null, 8, "하비", 79, 64, 81, 1, 169, 208, null, null],
[0, "진도", null, 0, null, 76, 71, 67, 0, 171, 237, null, null],
[0, "진무", null, 0, null, 76, 87, 43, 0, 176, 215, null, null],
[0, "진란", null, 7, "수춘", 66, 69, 40, 1, 157, 204, null, null],
[0, "진림", null, 17, "남피", 25, 9, 75, 1, 160, 217, null, null],
[0, "정욱", null, 2, "진류", 70, 49, 90, 1, 141, 220, null, null],
[0, "정원지", null, 0, null, 69, 74, 17, 0, 145, 184, null, null],
[0, "정은", null, 10, "서량", 69, 73, 40, 1, 184, 220, null, null],
[0, "정원", null, 0, null, 70, 76, 35, 0, 137, 189, null, null],
[0, "정보", null, 23, "여강", 84, 79, 79, 1, 151, 216, null, null],
[0, "정봉승연", null, 0, null, 81, 80, 75, 0, 190, 271, null, null],
[0, "전위", null, 0, null, 72, 95, 35, 0, 160, 197, null, null],
[0, "전해", null, 4, "북평", 68, 65, 58, 1, 154, 199, null, null],
[0, "전주", null, 0, null, 66, 66, 73, 0, 169, 214, null, null],
[0, "전풍", null, 17, "업", 72, 29, 93, 11, 162, 200, null, null],
[0, "전예", null, 4, "계", 80, 72, 80, 1, 171, 252, null, null],
[0, "동윤", null, 0, null, 47, 28, 79, 0, 192, 246, null, null],
[0, "동화", null, 0, null, 57, 34, 75, 0, 168, 219, null, null],
[0, "등애", null, 0, null, 93, 87, 89, 0, 197, 264, null, null],
[0, "도겸", null, 0, null, 51, 27, 64, 0, 132, 194, null, null],
[0, "등현", null, 0, null, 61, 73, 45, 0, 188, 248, null, null],
[0, "등지", null, 0, null, 73, 52, 81, 0, 178, 251, null, null],
[0, "동습", null, 0, null, 72, 85, 50, 0, 169, 215, null, null],
[0, "동승", null, 1, "장안", 56, 53, 65, 1, 154, 200, null, null],
[0, "동소", null, 5, "하내", 34, 25, 80, 11, 156, 236, null, null],
[0, "동탁", null, 0, null, 85, 87, 73, 0, 139, 192, null, null],
[0, "동도나", null, 0, null, 68, 73, 31, 0, 189, 225, null, null],
[0, "동민", null, 0, null, 49, 60, 25, 0, 149, 192, null, null],
[0, "등무", null, 0, null, 61, 75, 29, 0, 147, 184, null, null],
[0, "두기", null, 0, null, 66, 32, 75, 0, 163, 224, null, null],
[0, "두예", null, 0, null, 84, 30, 85, 0, 222, 284, null, null],
[0, "배원소", null, 0, null, 49, 65, 25, 0, 169, 200, null, null],
[0, "마완", null, 0, null, 71, 74, 16, 0, 170, 211, null, null],
[0, "마휴", null, 0, null, 68, 73, 48, 0, 178, 212, null, null],
[0, "파재", null, 0, null, 74, 74, 55, 0, 145, 184, null, null],
[0, "마준", null, 0, null, 38, 52, 31, 0, 196, 230, null, null],
[0, "마속", null, 0, null, 61, 67, 87, 0, 190, 228, null, null],
[0, "마대", null, 0, null, 79, 85, 62, 0, 183, 246, null, null],
[0, "마충", null, 0, null, 78, 72, 68, 0, 187, 249, null, null],
[0, "마초", null, 0, "서량", 93, 97, 44, 0, 176, 222, null, null],
[0, "마철", null, 0, null, 70, 62, 58, 0, 179, 212, null, null],
[0, "마등", null, 10, "서량", 82, 80, 52, 12, 149, 212, null, null],
[0, "마량", null, 0, null, 53, 23, 88, 0, 187, 222, null, null],
[0, "반준", null, 0, null, 61, 18, 83, 0, 174, 239, null, null],
[0, "반장", null, 0, null, 76, 80, 74, 0, 177, 234, null, null],
[0, "번조", null, 0, null, 66, 73, 31, 0, 149, 192, null, null],
[0, "번능", null, 0, null, 69, 61, 36, 0, 158, 195, null, null],
[0, "반봉", null, 0, null, 56, 77, 4, 0, 155, 190, null, null],
[0, "비의", null, 0, null, 77, 30, 83, 0, 193, 253, null, null],
[0, "비연", null, 0, null, 60, 66, 21, 0, 196, 238, null, null],
[0, "비시", null, 0, null, 18, 28, 65, 0, 176, 240, null, null],
[0, "미축", null, 8, "하비", 33, 29, 78, 1, 165, 220, null, null],
[0, "미방", null, 8, "하비", 54, 61, 32, 1, 169, 226, null, null],
[0, "비요", null, 0, null, 70, 66, 73, 0, 192, 228, null, null],
[0, "무안국", null, 19, "북해", 70, 83, 34, 1, 156, 193, null, null],
[0, "풍습", null, 0, null, 72, 71, 39, 0, 182, 222, null, null],
[0, "부사인", null, 0, null, 46, 63, 37, 0, 182, 225, null, null],
[0, "부첨", null, 0, null, 73, 85, 76, 0, 216, 263, null, null],
[0, "부손", null, 0, null, 29, 13, 70, 0, 162, 230, null, null],
[0, "문앙", null, 0, null, 76, 93, 65, 0, 238, 291, null, null],
[0, "문흠", null, 0, null, 74, 83, 43, 0, 200, 258, null, null],
[0, "문추", null, 17, "남피", 89, 93, 47, 1, 169, 200, null, null],
[0, "문빙", null, 0, null, 80, 82, 69, 0, 178, 237, null, null],
[0, "변희", null, 0, null, 56, 70, 62, 0, 169, 200, null, null],
[0, "망아장", null, 0, null, 45, 79, 3, 0, 191, 225, null, null],
[0, "봉기", null, 17, "남피", 43, 21, 84, 1, 153, 202, null, null],
[0, "방희", null, 0, null, 60, 38, 69, 0, 152, 192, null, null],
[0, "법정", null, 0, null, 82, 47, 94, 0, 176, 220, null, null],
[0, "방통", null, 0, null, 85, 34, 97, 0, 178, 213, null, null],
[0, "방덕", null, 10, "서량", 89, 94, 75, 11, 170, 219, null, null],
[0, "포륭", null, 0, null, 58, 76, 49, 0, 174, 208, null, null],
[0, "목순", null, 0, null, 52, 77, 11, 0, 157, 190, null, null],
[0, "목록대왕", null, 0, null, 65, 71, 39, 0, 184, 225, null, null],
[0, "보즐", null, 0, null, 72, 51, 84, 0, 177, 247, null, null],
[0, "만총", null, 0, null, 84, 64, 82, 0, 170, 242, null, null],
[0, "모개", null, 0, null, 63, 39, 60, 0, 161, 216, null, null],
[0, "맹획", null, 0, null, 87, 87, 42, 0, 186, 245, null, null],
[0, "맹달", null, 0, null, 75, 73, 75, 0, 172, 228, null, null],
[0, "맹우", null, 0, null, 50, 68, 22, 0, 190, 243, null, null],
[0, "유섭", null, 7, "완", 62, 79, 24, 1, 158, 190, null, null],
[0, "양부2", null, 0, null, 62, 68, 68, 0, 167, 212, null, null],
[0, "옹개", null, 0, null, 73, 75, 57, 0, 188, 225, null, null],
[0, "양의", null, 0, null, 68, 40, 82, 0, 190, 235, null, null],
[0, "양호", null, 0, null, 90, 64, 84, 0, 221, 278, null, null],
[0, "양홍", null, 7, "완", 33, 15, 77, 1, 152, 199, null, null],
[0, "양앙", null, 0, null, 68, 72, 38, 0, 172, 215, null, null],
[0, "양추1", null, 0, null, 52, 65, 40, 0, 159, 199, null, null],
[0, "양수", null, 0, null, 25, 4, 83, 0, 175, 219, null, null],
[0, "양추2", null, 0, null, 67, 64, 60, 0, 172, 238, null, null],
[0, "양송", null, 0, null, 1, 5, 28, 0, 167, 215, null, null],
[0, "양임", null, 14, "한중", 70, 78, 56, 1, 170, 215, null, null],
[0, "양조", null, 0, null, 53, 61, 36, 0, 223, 286, null, null],
[0, "양백", null, 14, "한중", 44, 45, 19, 1, 171, 214, null, null],
[0, "양부1", null, 0, null, 67, 50, 83, 0, 178, 239, null, null],
[0, "양봉1", null, 0, null, 66, 65, 31, 0, 153, 197, null, null],
[0, "양봉2", null, 0, null, 54, 62, 53, 0, 191, 252, null, null],
[0, "뇌동", null, 0, null, 69, 78, 51, 0, 172, 218, null, null],
[0, "뇌박", null, 7, "수춘", 62, 70, 36, 1, 157, 206, null, null],
[0, "이이", null, 0, null, 63, 77, 19, 0, 187, 222, null, null],
[0, "이회", null, 0, null, 79, 65, 79, 0, 175, 231, null, null],
[0, "이각", null, 1, "장안", 69, 72, 24, 12, 148, 198, null, null],
[0, "육항", null, 0, null, 91, 63, 87, 0, 226, 274, null, null],
[0, "육적", null, 0, null, 20, 7, 72, 0, 187, 219, null, null],
[0, "육손", null, 0, null, 94, 69, 95, 0, 183, 245, null, null],
[0, "이엄", null, 0, null, 83, 84, 76, 0, 172, 234, null, null],
[0, "이유", null, 0, null, 61, 26, 93, 0, 150, 192, null, null, "장안으로 천도를 하는것이 어떻겠습니까?"],
[0, "이숙", null, 0, null, 46, 69, 61, 0, 156, 192, null, null],
[0, "이통", null, 0, "여남", 73, 83, 62, 0, 168, 209, null, null],
[0, "이전", null, 0, null, 78, 77, 79, 0, 181, 216, null, null],
[0, "이풍", null, 7, "수춘", 69, 74, 50, 1, 158, 199, null, null],
[0, "유언", null, 0, null, 53, 38, 80, 0, 132, 194, null, null],
[0, "유괴", null, 6, "성도", 71, 73, 67, 1, 165, 214, null, null],
[0, "유기", null, 13, "양양", 52, 12, 63, 1, 174, 210, null, null],
[0, "유우", null, 0, null, 55, 33, 70, 0, 145, 193, null, null],
[0, "유훈", null, 7, "수춘", 47, 63, 35, 1, 163, 216, null, null],
[0, "유현", null, 0, null, 54, 66, 51, 0, 188, 252, null, null],
[0, "유순", null, 0, null, 63, 46, 41, 0, 172, 255, null, null],
[0, "유장", null, 6, "성도", 31, 5, 34, 12, 162, 219, null, null],
[0, "유심", null, 0, null, 60, 62, 70, 0, 238, 264, null, null],
[0, "유선", null, 0, null, 3, 5, 9, 0, 208, 270, null, null],
[0, "유종", null, 0, null, 24, 22, 65, 0, 195, 220, null, null],
[0, "유도", null, 0, null, 25, 23, 26, 0, 168, 214, null, null],
[0, "유파", null, 0, null, 29, 22, 75, 0, 186, 222, null, null],
[0, "유반", null, 0, null, 69, 76, 47, 0, 168, 210, null, null],
[0, "유비", null, 8, "하비", 81, 77, 80, 12, 161, 223, null, null],
[0, "유표1", null, 13, "양양", 48, 31, 72, 1, 142, 208, null, null, "강하 팔준에서 제일가는 이 유표에게로 오시오!"],
[0, "유복", null, 0, null, 64, 49, 74, 0, 164, 208, null, null],
[0, "유벽", null, 24, "여남", 70, 72, 47, 12, 145, 201, null, null],
[0, "유봉", null, 0, null, 75, 79, 44, 0, 188, 220, null, null],
[0, "유엽", null, 0, null, 56, 32, 92, 0, 176, 235, null, null],
[0, "유요", null, 9, "건업", 62, 67, 46, 12, 156, 198, null, null],
[0, "여위황", null, 17, "남피", 58, 63, 29, 1, 159, 200, null, null],
[0, "요화", null, 0, null, 73, 76, 69, 0, 168, 264, null, null],
[0, "양흥", null, 10, "서량", 61, 65, 19, 1, 169, 211, null, null],
[0, "양습", null, 0, null, 73, 40, 74, 0, 168, 230, null, null],
[0, "양서", null, 0, null, 56, 62, 66, 0, 198, 260, null, null],
[0, "능조", null, 0, null, 75, 81, 42, 0, 168, 203, null, null],
[0, "능통", null, 0, null, 77, 89, 60, 0, 189, 217, null, null],
[0, "여개", null, 0, null, 53, 30, 67, 0, 194, 227, null, null],
[0, "여건", null, 2, "진류", 57, 70, 62, 1, 173, 238, null, null],
[0, "여광", null, 0, null, 56, 70, 13, 0, 162, 207, null, null],
[0, "여상", null, 0, null, 54, 71, 12, 0, 164, 207, null, null],
[0, "여대", null, 0, null, 75, 71, 70, 0, 161, 256, null, null],
[0, "여범", null, 0, null, 73, 63, 75, 0, 169, 228, null, null],
[0, "여포", null, 3, "복양", 97, 100, 26, 12, 156, 198, null, null, "크하하하 다 부숴 버리겠다!"],
[0, "여몽", null, 0, null, 82, 81, 20, 0, 178, 219, null, null],
[0, "윤직", null, 0, null, 46, 42, 73, 0, 196, 237, null, null],
[0, "냉포", null, 0, null, 71, 82, 61, 0, 176, 214, null, null],
[0, "진취", null, 13, "강하", 56, 63, 45, 1, 174, 208, null, null],
[0, "노숙", null, 0, null, 84, 56, 92, 0, 172, 217, null, null],
[0, "노식", null, 0, null, 86, 63, 82, 0, 139, 192, null, null],
[0, "범강", null, 0, null, 49, 50, 36, 0, 174, 222, null, null],
[0, "장달", null, 0, null, 43, 56, 34, 0, 175, 222, null, null],
[0, "규람", null, 0, null, 55, 70, 58, 0, 165, 204, null, null],
[0, "대원", null, 0, null, 38, 32, 68, 0, 166, 204, null, null],
[0, "왕기", null, 0, null, 77, 72, 86, 0, 190, 261, null, null],
[0, "왕상", null, 0, null, 23, 19, 68, 0, 180, 268, null, null],
[0, "왕돈", null, 0, null, 60, 66, 46, 0, 198, 256, null, null],
[0, "악침", null, 0, null, 73, 75, 43, 0, 196, 257, null, null],
[0, "하제", null, 0, null, 83, 70, 82, 0, 171, 227, null, null],
[0, "환범", null, 0, null, 40, 11, 78, 0, 199, 249, null, null],
[0, "견초", null, 17, "남피", 72, 79, 73, 1, 168, 244, null, null],
[0, "강경", null, 0, null, 69, 64, 54, 0, 178, 212, null, null],
[0, "오찬", null, 0, null, 68, 41, 78, 0, 181, 245, null, null],
[0, "호질", null, 0, null, 73, 46, 74, 0, 192, 250, null, null],
[0, "오질", null, 0, null, 16, 29, 68, 0, 177, 230, null, null],
[0, "호준", null, 0, null, 79, 76, 62, 0, 200, 256, null, null],
[0, "고담", null, 0, null, 53, 23, 77, 0, 203, 244, null, null],
[0, "최림", null, 0, null, 32, 22, 66, 0, 187, 244, null, null],
[0, "사마망", null, 0, null, 78, 58, 83, 0, 205, 271, null, null],
[0, "주이", null, 0, null, 70, 73, 61, 0, 201, 257, null, null],
[0, "전단", null, 0, null, 67, 64, 39, 0, 204, 261, null, null],
[0, "조우", null, 0, null, 50, 43, 37, 0, 199, 278, null, null],
[0, "조상", null, 0, null, 39, 33, 30, 0, 207, 249, null, null],
[0, "조방", null, 0, null, 20, 14, 27, 0, 232, 274, null, null],
[0, "태사향", null, 0, null, 57, 66, 48, 0, 189, 246, null, null],
[0, "장휴", null, 0, null, 63, 27, 74, 0, 204, 244, null, null],
[0, "장호", null, 0, null, 75, 74, 51, 0, 195, 240, null, null],
[0, "조광", null, 0, null, 67, 71, 53, 0, 210, 263, null, null],
[0, "장집", null, 0, null, 76, 29, 80, 0, 196, 254, null, null],
[0, "장승", null, 0, null, 77, 70, 75, 0, 178, 244, null, null],
[0, "장소", null, 0, null, 23, 56, 31, 0, 202, 264, null, null],
[0, "조통", null, 0, null, 68, 67, 61, 0, 209, 260, null, null],
[0, "진표", null, 0, null, 66, 42, 74, 0, 207, 237, null, null],
[0, "정무", null, 0, null, 56, 35, 75, 0, 201, 265, null, null],
[0, "정봉", null, 0, null, 66, 66, 53, 0, 198, 266, null, null],
[0, "전만", null, 0, null, 51, 73, 39, 0, 181, 235, null, null],
[0, "마균", null, 0, null, 22, 17, 71, 0, 200, 259, null, null],
[0, "방회", null, 0, null, 69, 75, 49, 0, 205, 272, null, null],
[0, "서구", null, 0, null, 69, 42, 70, 0, 149, 208, null, null],
[0, "육개", null, 0, null, 65, 61, 79, 0, 198, 269, null, null],
[0, "유찬", null, 0, null, 78, 81, 64, 0, 172, 255, null, null],
[0, "유소", null, 0, null, 68, 53, 74, 0, 195, 264, null, null],
[0, "요립", null, 0, null, 32, 15, 76, 0, 181, 250, null, null],
[0, "여거", null, 0, null, 78, 69, 71, 0, 196, 256, null, null],
[0, "제갈첨", null, 0, null, 70, 57, 76, 0, 227, 263, null, null],
[0, "손휴", null, 0, null, 57, 42, 78, 0, 235, 264, null, null],
[0, "극정", null, 0, null, 42, 23, 68, 0, 208, 278, null, null],
[0, "호분", null, 0, null, 71, 76, 50, 0, 222, 288, null, null],
[0, "손량", null, 0, null, 32, 26, 70, 0, 243, 260, null, null],
[0, "마막", null, 0, null, 34, 12, 44, 0, 221, 266, null, null],
[0, "손호", null, 0, null, 41, 73, 71, 0, 242, 284, null, null],
[0, "조모", null, 0, null, 54, 61, 59, 0, 241, 260, null, null],
[0, "조환", null, 0, null, 30, 28, 30, 0, 246, 302, null, null],
[0, "사마유", null, 0, null, 71, 68, 75, 0, 248, 283, null, null],
[0, "제갈상", null, 0, null, 64, 79, 62, 0, 246, 263, null, null],
[0, "손화", null, 0, null, 31, 39, 68, 0, 224, 253, null, null],
[0, "염우", null, 0, null, 52, 61, 51, 0, 209, 264, null, null],
[0, "왕경", null, 0, null, 67, 63, 71, 0, 206, 260, null, null],
[0, "왕혼", null, 0, null, 74, 71, 63, 0, 223, 297, null, null],
[0, "곽혁", null, 0, null, 33, 29, 70, 0, 187, 225, null, null],
[0, "가범", null, 0, null, 60, 62, 73, 0, 202, 237, null, null],
[0, "서질", null, 0, null, 68, 83, 24, 0, 207, 253, null, null],
[0, "손준", null, 0, null, 64, 70, 65, 0, 219, 256, null, null],
[0, "손침", null, 0, null, 58, 55, 65, 0, 231, 258, null, null],
[0, "우사", null, 0, null, 61, 34, 74, 0, 217, 273, null, null],
[0, "진건", null, 0, null, 72, 71, 65, 0, 214, 292, null, null],
[0, "동궐", null, 0, null, 65, 59, 76, 0, 204, 271, null, null],
[0, "당자", null, 0, null, 61, 71, 50, 0, 196, 265, null, null],
[0, "등충", null, 0, null, 76, 86, 69, 0, 230, 264, null, null],
[0, "황숭", null, 0, null, 67, 63, 72, 0, 208, 263, null, null],
[0, "화핵", null, 0, null, 20, 24, 71, 0, 217, 278, null, null],
[0, "허의", null, 0, null, 51, 74, 15, 0, 213, 263, null, null],
[0, "송겸", null, 0, null, 66, 78, 42, 0, 175, 227, null, null],
[0, "호제", null, 0, null, 57, 39, 68, 0, 207, 264, null, null],
[0, "나헌", null, 0, null, 85, 70, 77, 0, 218, 270, null, null],
[0, "아들노숙", null, 0, null, 73, 53, 74, 0, 217, 272, null, null],
[0, "구성", null, 0, null, 63, 70, 38, 0, 157, 187, null, null],
[0, "어부라", null, 0, null, 72, 68, 21, 0, 150, 195, null, null],
[0, "아하소과", null, 0, null, 61, 76, 13, 0, 204, 253, null, null],
[0, "가비능", null, 0, null, 77, 69, 52, 0, 172, 235, null, null],
[0, "구력거", null, 0, null, 80, 68, 56, 0, 152, 193, null, null],
[0, "강단", null, 0, null, 65, 83, 48, 0, 168, 234, null, null],
[0, "황란", null, 0, null, 63, 75, 44, 0, 200, 264, null, null],
[0, "호주천", null, 0, null, 70, 71, 40, 0, 169, 230, null, null],
[0, "종리목", null, 0, null, 80, 72, 73, 0, 214, 269, null, null],
[0, "제갈교", null, 0, null, 62, 27, 75, 0, 204, 228, null, null],
[0, "답돈", null, 0, null, 84, 82, 61, 0, 158, 207, null, null],
[0, "반임", null, 0, null, 66, 79, 38, 0, 168, 225, null, null],
[0, "보도근", null, 0, null, 64, 73, 50, 0, 170, 233, null, null],
[0, "미당대왕", null, 0, null, 59, 69, 21, 0, 202, 260, null, null],
[0, "유표(흉노)", null, 0, null, 73, 74, 48, 0, 173, 252, null, null],
[0, "루반", null, 0, null, 65, 76, 39, 0, 178, 207, null, null],
[0, "손관", null, 0, null, 72, 78, 51, 0, 166, 217, null, null],
[0, "곽석", null, 0, null, 59, 71, 48, 0, 158, 187, null, null],
[0, "주조", null, 0, null, 63, 68, 26, 0, 152, 187, null, null],
[0, "장거", null, 0, null, 79, 75, 56, 0, 150, 188, null, null],
[0, "장순", null, 0, null, 73, 81, 60, 0, 152, 188, null, null],
[0, "해니", null, 0, null, 62, 78, 35, 0, 191, 233, null, null],
[0, "토안", null, 0, null, 53, 82, 30, 0, 191, 233, null, null],
[0, "유주", null, 0, null, 67, 78, 42, 0, 172, 233, null, null],
[0, "비잔", null, 0, null, 60, 71, 51, 0, 181, 216, null, null],
[0, "월길", null, 0, null, 81, 88, 26, 0, 190, 227, null, null],
[0, "아단", null, 0, null, 72, 65, 78, 0, 186, 259, null, null],
[0, "철리길", null, 0, null, 77, 70, 52, 0, 179, 259, null, null],
[0, "주삭", null, 0, null, 54, 60, 50, 0, 174, 253, null, null],
[0, "왕이", null, 0, null, 87, 59, 77, 0, 171, 230, null, null],
[0, "왕원희", null, 0, null, 53, 37, 73, 0, 217, 268, null, null],
[0, "곽씨", null, 0, null, 42, 4, 55, 0, 184, 235, null, null],
[0, "하후씨", null, 0, null, 34, 13, 42, 0, 188, 243, null, null],
[0, "하후령녀", null, 0, null, 22, 33, 60, 0, 207, 257, null, null],
[0, "하씨", null, 0, null, 51, 14, 67, 0, 150, 189, null, null],
[0, "관은병", null, 0, null, 87, 84, 75, 0, 204, 271, null, null],
[0, "감씨", null, 8, "서주", 14, 10, 44, 1, 175, 210, null, null],
[0, "황월영", null, 0, null, 62, 33, 90, 0, 186, 235, null, null],
[0, "채염", null, 0, null, 53, 14, 80, 0, 168, 224, null, null],
[0, "채씨", null, 13, "양양", 38, 7, 70, 1, 159, 212, null, null],
[0, "소교", null, 0, null, 40, 3, 70, 0, 178, 212, null, null],
[0, "서씨", null, 0, null, 48, 16, 80, 0, 183, 232, null, null],
[0, "신헌영", null, 0, null, 48, 28, 84, 0, 191, 269, null, null],
[0, "견씨", null, 0, null, 42, 18, 74, 0, 182, 221, null, null],
[0, "추씨", null, 1, "홍농", 4, 9, 66, 1, 165, 200, null, null],
[0, "조절", null, 0, null, 32, 33, 79, 0, 190, 260, null, null],
[0, "손씨", null, 0, null, 32, 14, 55, 0, 188, 250, null, null],
[0, "손상향", null, 0, null, 77, 82, 55, 0, 193, 222, null, null],
[0, "손노육", null, 0, null, 52, 10, 66, 0, 204, 253, null, null],
[0, "손노반", null, 0, null, 17, 15, 80, 0, 202, 258, null, null],
[0, "대교", null, 0, null, 33, 30, 66, 0, 177, 215, null, null],
[0, "장씨", null, 0, null, 55, 35, 66, 0, 207, 237, null, null],
[0, "장춘화", null, 0, null, 66, 29, 77, 0, 179, 234, null, null],
[0, "초선", null, 0, null, 42, 18, 81, 0, 176, 230, null, null],
[0, "번씨", null, 0, null, 6, 12, 50, 0, 183, 225, null, null],
[0, "미씨", null, 0, null, 13, 6, 72, 0, 176, 208, null, null],
[0, "변씨", null, 0, null, 30, 23, 55, 0, 160, 230, null, null],
[0, "보련사", null, 0, null, 45, 30, 77, 0, 198, 248, null, null],
[0, "유씨", null, 17, "업", 8, 8, 44, 1, 164, 215, null, null],
[0, "화만", null, 0, null, 85, 92, 40, 0, 191, 233, null, null],
[0, "포삼낭", null, 0, null, 87, 83, 36, 0, 191, 240, null, null],
[0, "성렴", null, 3, "복양", 66, 72, 43, 1, 168, 199, null, null],
[0, "위월", null, 3, "복양", 68, 76, 39, 1, 170, 199, null, null],
[0, "진의록", null, 3, "복양", 46, 43, 17, 1, 168, 199, null, null],
[0, "채옹", null, 0, null, 27, 16, 81, 0, 133, 192, null, null],
[0, "지양군", null, 0, null, 13, 8, 55, 0, 103, 192, null, null],
[0, "위소", null, 0, null, 21, 23, 65, 0, 204, 273, null, null],
[0, "위강", null, 0, null, 58, 35, 56, 0, 168, 213, null, null],
[0, "원요", null, 0, null, 28, 41, 50, 0, 177, 206, null, null],
[0, "왕기2", null, 0, null, 69, 67, 61, 0, 217, 281, null, null],
[0, "원환", null, 0, null, 30, 17, 72, 0, 165, 225, null, null],
[0, "우전", null, 0, null, 64, 76, 40, 0, 204, 258, null, null],
[0, "왕광", null, 0, null, 33, 65, 55, 0, 150, 190, null, null],
[0, "왕업", null, 0, null, 33, 6, 66, 0, 220, 280, null, null],
[0, "왕융", null, 0, null, 40, 57, 68, 0, 234, 305, null, null],
[0, "왕충", null, 0, null, 46, 39, 57, 0, 152, 214, null, null],
[0, "위풍", null, 0, null, 52, 23, 72, 0, 182, 219, null, null],
[0, "구건", null, 0, null, 39, 52, 65, 0, 239, 272, null, null],
[0, "구본", null, 0, null, 50, 41, 67, 0, 232, 269, null, null],
[0, "동백", null, 0, null, 12, 7, 52, 0, 173, 192, null, null],
[0, "마운", null, 0, null, 78, 88, 53, 0, 183, 225, null, null],
[0, "사섭", null, 18, "교지", 53, 31, 76, 12, 137, 226, null, null],
[0, "사지", null, 18, "교지", 58, 51, 52, 1, 163, 227, null, null],
[0, "사휘", null, 18, "남해", 69, 64, 44, 1, 165, 227, null, null],
[0, "사일", null, 18, "남해", 48, 36, 67, 1, 153, 230, null, null],
[0, "사광", null, 18, "교지", 58, 45, 64, 1, 175, 235, null, null],
[0, "후음", null, 0, null, 76, 72, 45, 0, 184, 219, null, null],
[0, "공주", null, 0, null, 26, 16, 68, 0, 151, 191, null, null],
[0, "고담륭", null, 0, null, 35, 24, 76, 0, 190, 251, null, null],
[0, "국연", null, 0, null, 50, 19, 77, 0, 160, 219, null, null],
[0, "오언", null, 0, null, 74, 72, 77, 0, 235, 297, null, null],
[0, "오강", null, 0, null, 48, 38, 65, 0, 216, 275, null, null],
[0, "최염", null, 0, null, 18, 55, 77, 0, 162, 216, null, null],
[0, "좌혁", null, 0, null, 62, 66, 51, 0, 232, 280, null, null],
[0, "차주", null, 0, null, 49, 49, 40, 0, 164, 199, null, null],
[0, "주태", null, 0, null, 71, 64, 71, 0, 207, 261, null, null],
[0, "북궁백옥", null, 0, null, 66, 72, 49, 0, 146, 187, null, null],
[0, "변장", null, 0, null, 69, 56, 47, 0, 133, 187, null, null],
[0, "순의", null, 0, null, 16, 13, 72, 0, 207, 274, null, null],
[0, "서진순욱", null, 0, null, 8, 19, 77, 0, 225, 289, null, null],
[0, "사마준", null, 0, null, 85, 82, 80, 0, 232, 286, null, null],
[0, "종육", null, 0, null, 32, 12, 71, 0, 223, 263, null, null],
[0, "초이", null, 0, null, 62, 69, 63, 0, 219, 266, null, null],
[0, "제갈정", null, 0, null, 58, 63, 66, 0, 246, 300, null, null],
[0, "보협", null, 0, null, 62, 49, 53, 0, 216, 264, null, null],
[0, "복양흥", null, 0, null, 32, 70, 65, 0, 224, 264, null, null],
[0, "보천", null, 0, null, 71, 60, 71, 0, 222, 272, null, null],
[0, "유대연주", null, 0, null, 53, 32, 55, 0, 148, 192, null, null],
[0, "유대", null, 2, "진류", 63, 58, 30, 1, 155, 202, null, null],
[0, "유승", null, 0, null, 45, 65, 33, 0, 215, 258, null, null],
[0, "여영기", null, 0, null, 79, 88, 37, 0, 182, 198, null, null],
[0, "독발수기능", null, 0, null, 89, 93, 77, 0, 232, 279, null, null],
[0, "진수", null, 0, null, 12, 22, 68, 0, 233, 297, null, null],
[0, "마륭", null, 0, null, 84, 75, 76, 0, 231, 296, null, null],
[0, "도황", null, 0, null, 76, 68, 72, 0, 232, 290, null, null],
[0, "진온", null, 0, null, 60, 38, 48, 0, 167, 192, null, null],
[0, "교모", null, 0, null, 54, 45, 69, 0, 137, 190, null, null],
[0, "교국로", null, 0, null, 38, 17, 55, 0, 150, 220, null, null],
[0, "포신", null, 0, null, 77, 67, 81, 0, 152, 192, null, null],
[0, "포훈", null, 0, null, 41, 35, 75, 0, 180, 226, null, null],
[0, "포도", null, 0, null, 57, 70, 43, 0, 159, 190, null, null],
[0, "위자", null, 0, null, 58, 38, 62, 0, 150, 190, null, null],
[0, "유화", null, 17, "남피", 21, 16, 59, 1, 165, 216, null, null],
[0, "이이자", null, 4, "북평", 32, 18, 48, 1, 157, 199, null, null],
[0, "선우보", null, 0, null, 74, 69, 65, 0, 161, 229, null, null],
[0, "원유", null, 0, null, 57, 39, 73, 0, 150, 193, null, null],
[0, "사마휘", null, 0, null, 21, 8, 92, 0, 173, 208, "은둔", null, "좋지~좋아"],
[0, "화타", null, 0, null, 8, 7, 68, 0, 173, 207, "은둔", "의술"],
[0, "관로", null, 0, null, 13, 9, 72, 0, 200, 233, "은둔", null],
[0, "예형", null, 0, null, 13, 4, 90, 0, 173, 199, null, null],
[0, "원혁", null, 7, "수춘", 18, 18, 18, 1, 180, 246, null, null],
[0, "헌제", null, 1, "장안", 23, 17, 66, 1, 184, 234, null, null, "한 황실은 이대로 끝나는 것인가…"],
[0, "황완", null, 0, null, 40, 34, 71, 0, 141, 192, null, null],
[0, "마일제", null, 0, "수춘", 43, 25, 70, 0, 130, 194, null, null],
[0, "유총", null, 22, "여남", 82, 45, 60, 12, 151, 197, null, null],
[0, "낙준", null, 22, "여남", 51, 37, 66, 11, 152, 197, null, null],
[0, "낙통", null, 0, null, 76, 57, 73, 0, 193, 228, null, null],
[0, "허소", null, 9, "건업", 46, 11, 82, 11, 150, 196, null, null, "태사자는 배신의 상이요! 쓰면 배신을 할것이오"],
[0, "허사", null, 3, "복양", 24, 20, 60, 1, 163, 199, null, null],
[0, "장초", null, 3, "복양", 61, 32, 60, 1, 168, 196, null, null],
[0, "양표", null, 1, "장안", 24, 20, 60, 1, 142, 225, null, null],
[0, "왕필", null, 2, "진류", 53, 44, 59, 1, 170, 228, null, null],
[0, "사환", null, 2, "진류", 70, 71, 45, 1, 173, 209, null, null],
[0, "정비", null, 2, "진류", 34, 30, 57, 1, 158, 214, null, null],
[0, "두씨", null, 3, "복양", 26, 41, 52, 1, 172, 236, null, null],
[0, "누규", null, 13, "양양", 58, 40, 87, 1, 143, 212, null, null],
[0, "단외", null, 1, "장안", 55, 48, 55, 1, 148, 209, null, null],
[0, "원사", null, 7, "수춘", 65, 43, 78, 1, 159, 210, null, null],
[0, "사의관", null, 7, "수춘", 22, 12, 67, 1, 168, 199, null, null],
[0, "송건", null, 0, null, 66, 77, 40, 0, 164, 214, null, null],
[0, "곽원", null, 17, "업", 66, 73, 36, 1, 162, 205, null, null],
[0, "소유", null, 17, "업", 51, 59, 48, 1, 167, 210, null, null],
[0, "주한", null, 17, "남피", 49, 51, 26, 1, 162, 204, null, null],
[0, "뇌서", null, 0, null, 68, 65, 34, 0, 170, 212, null, null],
[0, "장홍", null, 3, "복양", 72, 81, 65, 1, 164, 196, null, null],
[0, "유위대", null, 4, "북평", 53, 44, 62, 1, 152, 199, null, null],
[0, "문칙", null, 4, "계", 59, 53, 32, 1, 164, 199, null, null],
[0, "습진", null, 0, null, 64, 68, 51, 0, 189, 221, null, null],
[0, "습정", null, 0, null, 49, 29, 70, 0, 181, 229, null, null],
[0, "이리", null, 1, "장안", 65, 72, 37, 1, 171, 198, null, null]
],
"general_ex":[
],
"cities":[
],
"history":[
"<C>●</>195년 1월:<L><b>【역사모드3-2】</b>군욱축록</>",
"<C>●</>195년 1월:<L><b>【이벤트】</b></>천하는 분열하고 군웅할거가 도래하다"
],
"initialEvents":[
[
true,
["ChangeCity", "free", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80
}],
["ChangeCity", "occupied", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80,
"def":"70%",
"wall":"70%"
}]
]
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 195, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
}
+764
View File
@@ -0,0 +1,764 @@
{
"title":"【역사모드4-2】 황제 원술",
"startYear":194,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["이각", "#A9A9A9", 5000, 5000, "바람앞의 등불 이각", 1000, "도적", 5, ["장안", "함곡"]],
["조조", "#0000FF", 10000, 40000, "승천하는 조조", 1000, "병가", 3, ["진류", "정도", "복양", "초", "낙양", "사곡", "허창", "사수", "호로"]],
["여포", "#A9A9A9", 10000, 10000, "서주를 뺏은 여포", 1000, "병가", 1, ["서주", "하비", "광릉"]],
["공손찬", "#FF00FF", 10000, 10000, "히키코모리 공손찬", 1000, "병가", 3, ["북평", "역경"]],
["장수", "#7B68EE", 10000, 10000, "동탁의 잔당 장수", 1000, "병가", 3, ["완"]],
["유장", "#483D8B", 10000, 30000, "익주목 유장", 1000, "유가", 4, ["성도", "자동", "면죽", "강주"]],
["중", "#FFC0CB", 15000, 40000, "중나라 황제 원술", 1000, "병가", 7, ["수춘", "여강", "합비"]],
["유비", "#008000", 10000, 10000, "예주자사 좌장군 유비", 1000, "유가", 3, ["패"]],
["마등", "#808000", 10000, 10000, "서량태수 마등", 1000, "병가", 3, ["서량"]],
["공손도", "#A0522D", 10000, 10000, "요동의 왕 공손도", 1000, "덕가", 1, ["안평"]],
["엄백호", "#800080", 10000, 10000, "엄백호의 잔당세력", 1000, "도적", 1, ["산월"]],
["유표", "#E0FFFF", 10000, 10000, "형주자사 유표", 1000, "유가", 4, ["양양", "장판", "강하"]],
["장로", "#20B2AA", 10000, 10000, "오두미도국 장로", 1000, "오두미도", 2, ["한중", "양평"]],
["장연", "#87CEEB", 10000, 10000, "흑산적 장연", 1000, "유가", 2, ["진양"]],
["화흠", "#6495ED", 10000, 10000, "예장태수 화흠", 1000, "유가", 1, ["시상"]],
["원소", "#FFFF00", 10000, 10000, "대장군 원소", 1000, "병가", 5, ["남피", "업", "계교", "평원", "북해"]],
["사섭", "#800000", 10000, 10000, "교주자사 사섭", 1000, "유가", 3, ["교지", "남해"]],
["한수", "#FFFFFF", 10000, 10000, "서량의 모반자 한수", 1000, "병가", 1, ["천수"]],
["손책", "#FF0000", 10000, 10000, "강동을 제패한 손책", 1000, "병가", 2, ["건업", "오", "회계"]],
["유벽", "#FFD700", 10000, 10000, "여남 황건적", 1000, "도적", 1, ["여남"]]
],
"diplomacy":[
[7, 2, 1, 36],
[7, 8, 1, 36],
[7, 19, 1, 36],
[3, 8, 7, 48],
[2, 8, 7, 48],
[16, 2, 7, 48],
[13, 6, 1, 36]
],
"general":[
[0, "아회남", null, 0, null, 65, 74, 26, 0, 190, 225, null, null],
[0, "이적", null, 0, null, 29, 24, 84, 0, 162, 273, null, null],
[0, "윤상", null, 0, null, 51, 44, 62, 0, 194, 260, null, null],
[0, "윤묵", null, 0, null, 26, 15, 66, 0, 183, 239, null, null],
[0, "우금1", null, 2, "진류", 83, 78, 74, 1, 159, 221, null, null],
[0, "위관", null, 0, null, 69, 46, 79, 0, 220, 291, null, null],
[0, "원윤", null, 7, "수춘", 15, 14, 39, 1, 150, 199, null, null],
[0, "원희", null, 16, "업", 66, 51, 63, 1, 176, 207, null, null],
[0, "염행", null, 18, "천수", 76, 84, 66, 1, 159, 215, null, null],
[0, "염유", null, 0, null, 71, 57, 71, 0, 168, 227, null, null],
[0, "원술", null, 7, "수춘", 44, 65, 65, 12, 155, 199, null, null, "이몸은 이제부터 중의 황제다!"],
[0, "원상", null, 0, null, 63, 75, 42, 0, 179, 207, null, null],
[0, "원소", null, 16, "업", 81, 69, 70, 12, 154, 202, null, null, "사세 삼공의 이 원소가 천하를 지배하겠다!"],
[0, "염상", null, 7, "수춘", 30, 27, 71, 11, 158, 199, null, null],
[0, "원담", null, 16, "북해", 60, 69, 30, 1, 173, 205, null, null],
[0, "염포", null, 13, "한중", 29, 25, 82, 11, 167, 231, null, null],
[0, "왕위", null, 12, "양양", 60, 70, 62, 1, 163, 222, null, null],
[0, "왕윤", null, 0, null, 26, 6, 68, 0, 137, 192, null, null],
[0, "왕항", null, 0, null, 76, 60, 61, 0, 184, 254, null, null],
[0, "왕찬", null, 12, "양양", 15, 3, 79, 1, 177, 217, null, null],
[0, "왕수", null, 16, "북해", 54, 27, 77, 1, 168, 218, null, null],
[0, "왕숙", null, 0, null, 36, 22, 76, 0, 195, 256, null, null],
[0, "왕준", null, 0, null, 81, 73, 77, 0, 206, 286, null, null],
[0, "왕쌍", null, 0, null, 67, 88, 19, 0, 195, 228, null, null],
[0, "왕창", null, 0, null, 74, 64, 79, 0, 188, 259, null, null],
[0, "왕평", null, 0, null, 83, 79, 76, 0, 192, 248, null, null],
[0, "왕보", null, 0, null, 62, 41, 79, 0, 171, 219, null, null],
[0, "왕문", null, 16, "남피", 65, 64, 31, 1, 162, 205, null, null],
[0, "왕릉", null, 0, null, 74, 64, 71, 0, 172, 251, null, null],
[0, "왕루", null, 0, null, 28, 30, 79, 0, 173, 211, null, null],
[0, "왕랑", null, 0, null, 47, 35, 79, 0, 167, 228, null, null],
[0, "온회", null, 0, null, 62, 36, 74, 0, 178, 228, null, null],
[0, "하안", null, 0, null, 15, 30, 72, 0, 190, 249, null, null],
[0, "괴월", null, 12, "양양", 47, 27, 82, 1, 157, 214, null, null],
[0, "괴량", null, 12, "양양", 68, 33, 88, 11, 155, 204, null, null],
[0, "가화", null, 0, null, 49, 65, 41, 0, 176, 222, null, null],
[0, "가규", null, 0, null, 78, 61, 84, 0, 177, 231, null, null],
[0, "하의", null, 0, null, 56, 69, 36, 0, 161, 196, null, null],
[0, "화흠", null, 15, "시상", 33, 33, 82, 12, 157, 231, null, null],
[0, "가후", null, 5, "완", 88, 48, 97, 11, 147, 223, null, null],
[0, "곽가", null, 2, "진류", 88, 15, 96, 11, 170, 207, null, null],
[0, "악환", null, 0, null, 65, 82, 42, 0, 196, 251, null, null],
[0, "곽사", null, 1, "장안", 64, 76, 13, 1, 146, 197, null, null],
[0, "악취", null, 0, null, 53, 66, 61, 0, 157, 195, null, null],
[0, "곽준", null, 0, null, 73, 66, 73, 0, 178, 217, null, null],
[0, "학소", null, 0, null, 86, 79, 78, 0, 185, 229, null, null],
[0, "악진", null, 2, "진류", 80, 84, 56, 1, 159, 218, null, null],
[0, "곽도", null, 16, "업", 52, 50, 82, 1, 157, 205, null, null],
[0, "학맹", null, 0, null, 62, 67, 42, 0, 156, 196, null, null],
[0, "곽유지", null, 0, null, 28, 9, 69, 0, 190, 259, null, null],
[0, "곽익", null, 0, null, 73, 69, 69, 0, 207, 270, null, null],
[0, "곽회", null, 0, null, 87, 78, 81, 0, 187, 255, null, null],
[0, "하후위", null, 0, null, 71, 73, 49, 0, 204, 253, null, null],
[0, "하후연", null, 2, "낙양", 90, 91, 68, 1, 162, 219, null, null],
[0, "하후은", null, 2, "복양", 63, 72, 53, 1, 180, 208, null, null],
[0, "하후화", null, 0, null, 48, 51, 71, 0, 207, 265, null, null],
[0, "하후혜", null, 0, null, 50, 44, 76, 0, 206, 242, null, null],
[0, "하후현", null, 0, null, 54, 39, 76, 0, 208, 254, null, null],
[0, "하후상", null, 0, null, 79, 72, 75, 0, 181, 225, null, null],
[0, "하후덕", null, 0, null, 69, 73, 32, 0, 178, 218, null, null],
[0, "하후돈", null, 2, "진류", 92, 90, 63, 1, 156, 220, null, null],
[0, "하후패", null, 0, null, 79, 84, 77, 0, 202, 262, null, null],
[0, "하후무", null, 0, null, 20, 7, 4, 0, 201, 259, null, null],
[0, "가충", null, 0, null, 54, 31, 89, 0, 217, 282, null, null],
[0, "하진", null, 0, null, 39, 40, 6, 0, 135, 189, null, null],
[0, "화웅", null, 0, null, 88, 92, 61, 0, 155, 190, null, null],
[0, "한윤", null, 7, "수춘", 26, 29, 65, 1, 155, 197, null, null],
[0, "관우", null, 8, "소패", 97, 97, 79, 1, 162, 219, null, null, "술이 식기 전에 돌아오겠소"],
[0, "환계", null, 19, "건업", 25, 26, 68, 1, 156, 221, null, null],
[0, "관해", null, 0, null, 70, 82, 10, 0, 160, 193, null, null],
[0, "관구검", null, 0, null, 78, 74, 55, 0, 202, 255, null, null],
[0, "한현", null, 12, "양양", 22, 33, 62, 1, 163, 220, null, null],
[0, "한호", null, 2, "진류", 69, 72, 84, 1, 164, 224, null, null],
[0, "관흥", null, 0, null, 76, 86, 67, 0, 199, 234, null, null],
[0, "관색", null, 0, null, 74, 88, 56, 0, 200, 239, null, null],
[0, "한수", null, 18, "천수", 81, 75, 82, 12, 142, 215, null, null],
[0, "한숭", null, 12, "강하", 25, 15, 71, 1, 154, 210, null, null],
[0, "관정", null, 4, "북평", 36, 52, 73, 11, 158, 199, null, null],
[0, "한섬", null, 7, "수춘", 69, 66, 36, 1, 159, 197, null, null],
[0, "감택", null, 0, null, 43, 49, 83, 0, 182, 243, null, null],
[0, "한충", null, 0, null, 64, 67, 18, 0, 151, 184, null, null],
[0, "한당", null, 19, "건업", 76, 85, 61, 1, 156, 227, null, null],
[0, "한덕", null, 0, null, 63, 76, 25, 0, 171, 228, null, null],
[0, "감녕", null, 12, "강하", 93, 94, 76, 1, 174, 219, null, null],
[0, "한복", null, 0, null, 28, 3, 27, 0, 149, 193, null, null],
[0, "관평", null, 0, null, 80, 82, 72, 0, 186, 219, null, null],
[0, "간옹", null, 8, "소패", 20, 32, 75, 1, 164, 225, null, null],
[0, "안량", null, 16, "업", 88, 94, 21, 1, 160, 200, null, null],
[0, "위연", null, 0, null, 85, 92, 72, 0, 175, 234, null, null],
[0, "국의", null, 0, null, 82, 78, 51, 0, 146, 197, null, null],
[0, "희지재", null, 0, null, 63, 7, 88, 0, 157, 196, null, null],
[0, "위속", null, 3, "서주", 67, 78, 31, 1, 156, 200, null, null],
[0, "위유", null, 0, null, 46, 29, 74, 0, 151, 193, null, null],
[0, "우금2", null, 2, "낙양", 72, 79, 38, 1, 173, 226, null, null],
[0, "우보", null, 0, null, 38, 60, 21, 0, 159, 192, null, null],
[0, "강유", null, 0, null, 92, 89, 90, 0, 202, 264, null, null],
[0, "공지", null, 0, null, 43, 53, 62, 0, 178, 197, null, null],
[0, "교유", null, 0, null, 64, 69, 38, 0, 143, 195, null, null],
[0, "공도", null, 20, "여남", 59, 70, 23, 1, 164, 200, null, null],
[0, "허공", null, 0, null, 44, 66, 64, 0, 155, 200, null, null],
[0, "허정", null, 17, "남해", 23, 5, 68, 1, 152, 222, null, null],
[0, "허저", null, 2, "낙양", 74, 96, 36, 1, 169, 226, null, null],
[0, "허유", null, 16, "업", 36, 21, 80, 1, 155, 204, null, null],
[0, "기령", null, 7, "수춘", 78, 83, 51, 1, 155, 199, null, null],
[0, "김의", null, 0, null, 32, 38, 65, 0, 177, 218, null, null],
[0, "김배삼결", null, 0, null, 64, 76, 19, 0, 192, 225, null, null],
[0, "김선", null, 12, "양양", 52, 68, 13, 1, 155, 220, null, null],
[0, "우번", null, 19, "회계", 43, 46, 86, 1, 164, 233, null, null],
[0, "형도영", null, 0, null, 69, 80, 41, 0, 174, 208, null, null],
[0, "엄안", null, 6, "자동", 82, 83, 72, 1, 151, 222, null, null],
[0, "곽마", null, 0, null, 68, 71, 40, 0, 239, 281, null, null],
[0, "엄준", null, 0, null, 28, 2, 71, 0, 169, 246, null, null],
[0, "엄정", null, 0, null, 50, 55, 39, 0, 151, 189, null, null],
[0, "엄백호", null, 11, "산월", 67, 70, 23, 12, 142, 198, null, null, "이 몸은 동오의 덕왕 엄백호라고 하오!"],
[0, "엄여", null, 0, null, 61, 78, 44, 0, 145, 196, null, null],
[0, "오의", null, 0, null, 79, 73, 70, 0, 165, 237, null, null],
[0, "황개", null, 19, "건업", 80, 83, 70, 1, 154, 218, null, null],
[0, "고간", null, 16, "업", 74, 56, 48, 1, 168, 206, null, null],
[0, "황권", null, 6, "성도", 75, 59, 82, 11, 167, 240, null, null],
[0, "고유", null, 16, "업", 57, 43, 72, 1, 174, 263, null, null],
[0, "고순", null, 3, "하비", 85, 86, 60, 1, 162, 198, null, null],
[0, "고상", null, 0, null, 68, 68, 53, 0, 194, 252, null, null],
[0, "고승", null, 0, null, 67, 73, 41, 0, 145, 184, null, null],
[0, "후성", null, 3, "하비", 74, 75, 68, 1, 158, 199, null, null],
[0, "후선", null, 18, "천수", 63, 66, 34, 1, 175, 228, null, null],
[0, "황조", null, 12, "강하", 74, 66, 55, 1, 148, 208, null, null],
[0, "공손월", null, 0, null, 74, 72, 47, 0, 160, 192, null, null],
[0, "공손연", null, 0, null, 65, 70, 60, 0, 205, 238, null, null],
[0, "공손공", null, 10, "안평", 39, 17, 69, 1, 174, 240, null, null],
[0, "공손강", null, 10, "안평", 72, 66, 65, 1, 172, 211, null, null],
[0, "공손찬", null, 4, "북평", 84, 83, 75, 12, 152, 199, null, null],
[0, "공손속", null, 4, "북평", 63, 68, 57, 1, 176, 199, null, null],
[0, "공손도", null, 10, "안평", 67, 71, 66, 12, 154, 204, null, null],
[0, "공손범", null, 4, "북평", 73, 69, 66, 1, 158, 199, null, null],
[0, "황충", null, 12, "양양", 90, 93, 65, 1, 154, 220, null, null],
[0, "고정", null, 6, "자동", 55, 63, 43, 1, 190, 251, null, null],
[0, "고패", null, 0, null, 66, 61, 69, 0, 170, 212, null, null],
[0, "황보숭", null, 0, null, 92, 61, 73, 0, 132, 195, null, null],
[0, "공융", null, 2, "허창", 30, 5, 73, 1, 153, 208, null, null],
[0, "고람", null, 16, "평원", 76, 82, 68, 1, 159, 201, null, null],
[0, "오경", null, 0, null, 69, 66, 52, 0, 151, 211, null, null],
[0, "호거아", null, 5, "완", 70, 82, 41, 1, 164, 206, null, null],
[0, "호진", null, 0, null, 65, 74, 12, 0, 148, 190, null, null],
[0, "올돌골", null, 0, null, 79, 86, 1, 0, 186, 225, null, null],
[0, "호반", null, 0, null, 55, 55, 59, 0, 179, 233, null, null],
[0, "오반", null, 6, "성도", 74, 71, 59, 1, 171, 234, null, null],
[0, "고옹", null, 0, null, 43, 18, 80, 0, 168, 243, null, null],
[0, "오란", null, 6, "성도", 68, 80, 35, 1, 170, 218, null, null],
[0, "채화", null, 12, "장판", 39, 50, 1, 1, 166, 208, null, null],
[0, "채중", null, 12, "장판", 40, 54, 2, 1, 168, 208, null, null],
[0, "채모", null, 12, "양양", 70, 70, 77, 1, 160, 215, null, null],
[0, "착융", null, 0, "건업", 60, 69, 38, 0, 161, 196, null, null],
[0, "사마의", null, 0, null, 98, 63, 98, 0, 179, 251, null, null],
[0, "사마염", null, 0, null, 69, 59, 77, 0, 238, 290, null, null],
[0, "사마사", null, 0, null, 79, 64, 88, 0, 208, 255, null, null],
[0, "사마소", null, 0, null, 76, 57, 87, 0, 211, 265, null, null],
[0, "사마부", null, 0, null, 70, 37, 77, 0, 180, 272, null, null],
[0, "사마랑", null, 0, null, 20, 21, 72, 0, 171, 217, null, null],
[0, "사마가", null, 0, null, 66, 84, 25, 0, 167, 222, null, null],
[0, "주흔", null, 0, null, 65, 62, 73, 0, 159, 196, null, null],
[0, "주앙", null, 0, null, 74, 65, 65, 0, 162, 195, null, null],
[0, "주지", null, 0, null, 65, 85, 41, 0, 233, 295, null, null],
[0, "주창", null, 0, null, 68, 84, 42, 0, 164, 219, null, null],
[0, "주태유평", null, 19, "건업", 84, 91, 48, 1, 171, 225, null, null],
[0, "주방", null, 0, null, 52, 41, 80, 0, 200, 240, null, null],
[0, "주유", null, 19, "건업", 95, 71, 96, 11, 175, 210, null, null],
[0, "주환", null, 0, null, 84, 82, 77, 0, 177, 238, null, null],
[0, "주거", null, 0, null, 77, 57, 72, 0, 190, 246, null, null],
[0, "축융", null, 0, null, 74, 85, 29, 0, 182, 230, null, null],
[0, "주준", null, 0, null, 89, 65, 70, 0, 149, 195, null, null],
[0, "주연", null, 0, null, 79, 69, 71, 0, 182, 249, null, null],
[0, "주치", null, 0, null, 71, 56, 72, 0, 156, 224, null, null],
[0, "주포", null, 0, null, 68, 73, 34, 0, 191, 225, null, null],
[0, "주령", null, 2, "진류", 71, 73, 67, 1, 170, 236, null, null],
[0, "순욱", null, 2, "진류", 62, 14, 95, 1, 163, 212, null, null],
[0, "순우경", null, 16, "남피", 72, 66, 29, 1, 146, 200, null, null],
[0, "순심", null, 16, "업", 34, 25, 78, 1, 164, 208, null, null],
[0, "순유", null, 2, "진류", 73, 26, 94, 1, 157, 214, null, null],
[0, "장완", null, 0, null, 78, 34, 84, 0, 188, 246, null, null],
[0, "종회", null, 0, null, 82, 51, 91, 0, 225, 264, null, null],
[0, "장간", null, 0, null, 19, 6, 66, 0, 175, 208, null, null],
[0, "장의거", null, 16, "업", 71, 58, 59, 1, 159, 205, null, null],
[0, "장흠", null, 19, "오", 78, 84, 54, 1, 159, 208, null, null],
[0, "장제3", null, 0, null, 48, 43, 85, 0, 188, 249, null, null],
[0, "초주", null, 0, null, 16, 3, 67, 0, 201, 270, null, null],
[0, "초촉", null, 16, "업", 65, 76, 33, 1, 159, 208, null, null],
[0, "상총", null, 0, null, 76, 61, 77, 0, 195, 240, null, null],
[0, "종요", null, 2, "낙양", 70, 24, 77, 1, 151, 230, null, null],
[0, "상랑", null, 0, null, 28, 18, 74, 0, 167, 247, null, null],
[0, "서영", null, 0, null, 80, 76, 62, 0, 147, 192, null, null],
[0, "제갈각", null, 0, null, 72, 47, 90, 0, 203, 253, null, null],
[0, "제갈근", null, 0, null, 75, 34, 81, 0, 174, 241, null, null],
[0, "제갈균", null, 0, null, 29, 25, 52, 0, 185, 252, null, null],
[0, "제갈탄", null, 0, null, 72, 72, 76, 0, 206, 258, null, null],
[0, "제갈량", null, 0, null, 98, 38, 100, 0, 184, 234, null, null],
[0, "서황", null, 2, "낙양", 91, 90, 78, 1, 165, 228, null, null],
[0, "서서", null, 0, null, 87, 64, 93, 0, 160, 300, null, null],
[0, "서성", null, 0, null, 86, 81, 78, 0, 178, 232, null, null],
[0, "서막", null, 0, null, 55, 32, 68, 0, 171, 249, null, null],
[0, "신의", null, 0, null, 55, 59, 60, 0, 190, 252, null, null],
[0, "신탐", null, 0, null, 56, 62, 54, 0, 188, 254, null, null],
[0, "심배", null, 16, "업", 80, 60, 83, 1, 156, 204, null, null],
[0, "신비", null, 16, "남피", 39, 24, 79, 1, 171, 240, null, null],
[0, "신평", null, 16, "남피", 69, 43, 77, 1, 165, 204, null, null],
[0, "진복", null, 0, null, 31, 7, 73, 0, 160, 226, null, null],
[0, "진랑", null, 0, null, 58, 70, 35, 0, 192, 234, null, null],
[0, "휴고", null, 14, "진양", 63, 71, 38, 1, 151, 199, null, null],
[0, "추단", null, 0, null, 61, 64, 34, 0, 144, 193, null, null],
[0, "성의", null, 18, "천수", 74, 72, 41, 1, 168, 211, null, null],
[0, "성공영", null, 18, "천수", 73, 71, 80, 11, 172, 220, null, null],
[0, "설종", null, 0, null, 34, 16, 73, 0, 187, 243, null, null],
[0, "선경", null, 4, "북평", 71, 68, 43, 1, 156, 199, null, null],
[0, "전종", null, 0, null, 78, 72, 75, 0, 183, 249, null, null],
[0, "조예", null, 0, null, 72, 52, 82, 0, 205, 239, null, null],
[0, "조휴", null, 2, "진류", 74, 75, 62, 1, 174, 228, null, null],
[0, "송헌", null, 3, "하비", 68, 77, 38, 1, 157, 200, null, null],
[0, "조앙", null, 2, "진류", 74, 67, 69, 1, 161, 197, null, null],
[0, "조홍 자렴", null, 2, "진류", 79, 81, 44, 1, 169, 232, null, null, "좌절감이 사나이를 키우는 것이다!"],
[0, "조순", null, 2, "진류", 75, 71, 63, 1, 170, 210, null, null],
[0, "조창", null, 0, null, 82, 90, 40, 0, 190, 223, null, null],
[0, "조식", null, 0, null, 33, 22, 81, 0, 192, 232, null, null],
[0, "조진", null, 0, null, 81, 74, 70, 0, 185, 231, null, null],
[0, "조인", null, 2, "진류", 89, 86, 62, 1, 168, 223, null, null],
[0, "조성", null, 0, null, 54, 74, 38, 0, 163, 198, null, null],
[0, "조조", null, 2, "진류", 99, 72, 91, 12, 151, 220, null, null, "내가 천하 사람들을 저버릴지언정, 천하 사람들이 나를 저버리게 하지는 않을 것이다."],
[0, "조충", null, 0, null, 31, 21, 85, 0, 196, 207, null, null],
[0, "장패", null, 0, null, 78, 75, 53, 0, 165, 231, null, null],
[0, "조비", null, 0, null, 70, 71, 83, 0, 187, 226, null, null],
[0, "조표", null, 0, null, 66, 69, 32, 0, 151, 196, null, null],
[0, "저수", null, 16, "업", 78, 35, 90, 1, 156, 201, null, null],
[0, "소비", null, 0, null, 69, 63, 66, 0, 172, 221, null, null],
[0, "조무", null, 0, null, 70, 71, 66, 0, 155, 193, null, null],
[0, "손환", null, 0, null, 82, 73, 76, 0, 166, 228, null, null],
[0, "손견", null, 0, null, 94, 90, 79, 0, 156, 192, null, null, "내가 옥새를 가지고 있다면 나는 칼과 화살을 맞아 죽을 것이다."],
[0, "손건", null, 0, null, 34, 33, 79, 0, 165, 215, null, null],
[0, "손권", null, 19, "건업", 79, 67, 80, 1, 182, 252, null, null],
[0, "손교", null, 0, null, 77, 72, 67, 0, 181, 219, null, null],
[0, "손책", null, 19, "건업", 96, 92, 74, 12, 175, 200, null, null],
[0, "손소", null, 0, null, 80, 79, 76, 0, 188, 241, null, null],
[0, "손정", null, 19, "오", 66, 53, 73, 1, 160, 206, null, null],
[0, "손중", null, 0, null, 62, 71, 36, 0, 154, 184, null, null],
[0, "손등", null, 0, null, 62, 37, 79, 0, 209, 241, null, null],
[0, "손유", null, 0, null, 77, 70, 68, 0, 177, 215, null, null],
[0, "손익", null, 0, null, 67, 78, 27, 0, 184, 204, null, null],
[0, "손례", null, 0, null, 78, 81, 67, 0, 180, 250, null, null],
[0, "태사자", null, 19, "건업", 90, 93, 69, 1, 166, 206, null, null],
[0, "대래동주", null, 0, null, 51, 53, 54, 0, 195, 249, null, null],
[0, "대릉", null, 0, null, 70, 75, 39, 0, 199, 258, null, null],
[0, "타사대왕", null, 0, null, 62, 59, 70, 0, 186, 225, null, null],
[0, "담웅", null, 0, null, 58, 73, 14, 0, 188, 221, null, null],
[0, "장윤", null, 12, "양양", 72, 67, 42, 1, 163, 208, null, null],
[0, "조운", null, 4, "북평", 96, 96, 77, 1, 168, 229, null, null],
[0, "장위", null, 13, "한중", 74, 66, 45, 1, 172, 228, null, null, "쌀 다섯말만 가지고 오시오~ 모두 고쳐드리리다."],
[0, "장영", null, 0, null, 75, 74, 41, 0, 154, 196, null, null],
[0, "장연", null, 14, "진양", 76, 81, 57, 12, 153, 210, null, null],
[0, "장횡", null, 0, null, 59, 70, 23, 0, 178, 211, null, null],
[0, "장온", null, 0, null, 32, 10, 72, 0, 193, 231, null, null],
[0, "장개", null, 0, null, 34, 66, 8, 0, 155, 194, null, null],
[0, "장각", null, 0, null, 87, 25, 86, 0, 140, 184, null, null],
[0, "장기", null, 0, null, 74, 35, 76, 0, 170, 223, null, null],
[0, "장의", null, 16, "남피", 79, 72, 75, 1, 153, 215, null, null],
[0, "장훈", null, 7, "수춘", 72, 68, 41, 1, 156, 206, null, null],
[0, "장굉", null, 19, "건업", 24, 22, 86, 1, 153, 212, null, null],
[0, "장합", null, 16, "평원", 89, 89, 73, 1, 167, 231, null, null],
[0, "조홍", null, 0, null, 66, 72, 28, 0, 156, 184, null, null],
[0, "장제1", null, 1, "홍농", 70, 66, 55, 1, 144, 196, null, null],
[0, "장수", null, 5, "완", 80, 73, 64, 12, 154, 207, null, null],
[0, "장소 자포", null, 19, "건업", 33, 3, 84, 1, 156, 236, null, null],
[0, "장송", null, 0, null, 25, 6, 88, 0, 170, 212, null, null],
[0, "장임", null, 6, "성도", 84, 84, 78, 1, 169, 214, null, null],
[0, "장제", null, 0, null, 67, 43, 80, 0, 236, 280, null, null],
[0, "장막", null, 0, null, 52, 53, 71, 0, 155, 195, null, null],
[0, "조범", null, 0, null, 28, 21, 32, 0, 168, 218, null, null],
[0, "장비", null, 8, "소패", 94, 98, 30, 1, 165, 221, null, null],
[0, "장포", null, 0, null, 78, 87, 48, 0, 198, 219, null, null],
[0, "장보", null, 0, null, 83, 71, 81, 0, 148, 184, null, null],
[0, "장만성", null, 0, null, 75, 81, 45, 0, 143, 184, null, null],
[0, "장양", null, 0, null, 72, 70, 66, 0, 151, 195, null, null],
[0, "장익", null, 0, null, 75, 74, 76, 0, 188, 264, null, null],
[0, "장료", null, 3, "서주", 95, 92, 78, 1, 169, 222, null, null],
[0, "장량", null, 0, null, 78, 80, 74, 0, 153, 184, null, null],
[0, "조루", null, 0, null, 70, 43, 68, 0, 183, 219, null, null],
[0, "장로", null, 13, "한중", 51, 26, 74, 12, 163, 216, null, null],
[0, "진횡", null, 0, null, 64, 63, 26, 0, 161, 196, null, null],
[0, "진응", null, 0, null, 62, 72, 45, 0, 172, 208, null, null],
[0, "진기", null, 7, "수춘", 58, 65, 43, 1, 165, 198, null, null],
[0, "진궁", null, 3, "하비", 84, 55, 89, 11, 154, 198, null, null],
[0, "진교", null, 0, null, 61, 27, 77, 0, 175, 237, null, null],
[0, "진군", null, 2, "진류", 32, 14, 75, 1, 167, 236, null, null],
[0, "진규", null, 3, "서주", 30, 4, 82, 1, 132, 206, null, null],
[0, "진식", null, 0, null, 70, 71, 25, 0, 191, 230, null, null],
[0, "진진", null, 16, "업", 46, 46, 69, 1, 170, 235, null, null],
[0, "진태", null, 0, null, 84, 77, 86, 0, 210, 260, null, null],
[0, "진등", null, 3, "하비", 79, 64, 81, 1, 169, 208, null, null],
[0, "진도", null, 0, null, 76, 71, 67, 0, 171, 237, null, null],
[0, "진무", null, 0, null, 76, 87, 43, 0, 176, 215, null, null],
[0, "진란", null, 7, "여강", 66, 69, 40, 1, 157, 204, null, null],
[0, "진림", null, 16, "남피", 25, 9, 75, 1, 160, 217, null, null],
[0, "정욱", null, 2, "진류", 70, 49, 90, 1, 141, 220, null, null],
[0, "정원지", null, 0, null, 69, 74, 17, 0, 145, 184, null, null],
[0, "정은", null, 9, "서량", 69, 73, 40, 1, 184, 220, null, null],
[0, "정원", null, 0, null, 70, 76, 35, 0, 137, 189, null, null],
[0, "정보", null, 19, "건업", 84, 79, 79, 1, 151, 216, null, null],
[0, "정봉승연", null, 0, null, 81, 80, 75, 0, 190, 271, null, null],
[0, "전위", null, 0, null, 72, 95, 35, 0, 160, 197, null, null],
[0, "전해", null, 4, "북평", 68, 65, 58, 1, 154, 199, null, null],
[0, "전주", null, 0, null, 66, 66, 73, 0, 169, 214, null, null],
[0, "전풍", null, 16, "남피", 72, 29, 93, 11, 162, 200, null, null],
[0, "전예", null, 4, "역경", 80, 72, 80, 1, 171, 252, null, null],
[0, "동윤", null, 0, null, 47, 28, 79, 0, 192, 246, null, null],
[0, "동화", null, 0, null, 57, 34, 75, 0, 168, 219, null, null],
[0, "등애", null, 0, null, 93, 87, 89, 0, 197, 264, null, null],
[0, "도겸", null, 0, null, 51, 27, 64, 0, 132, 194, null, null],
[0, "등현", null, 0, null, 61, 73, 45, 0, 188, 248, null, null],
[0, "등지", null, 0, null, 73, 52, 81, 0, 178, 251, null, null],
[0, "동습", null, 0, null, 72, 85, 50, 0, 169, 215, null, null],
[0, "동승", null, 2, "허창", 56, 53, 65, 1, 154, 200, null, null],
[0, "동소", null, 0, null, 34, 25, 80, 0, 156, 236, null, null],
[0, "동탁", null, 0, null, 85, 87, 73, 0, 139, 192, null, null, "크하하, 천하는 이제 나의 것이다!"],
[0, "동도나", null, 0, null, 68, 73, 31, 0, 189, 225, null, null],
[0, "동민", null, 0, null, 49, 60, 25, 0, 149, 192, null, null],
[0, "등무", null, 0, null, 61, 75, 29, 0, 147, 184, null, null],
[0, "두기", null, 0, null, 66, 32, 75, 0, 163, 224, null, null],
[0, "두예", null, 0, null, 84, 30, 85, 0, 222, 284, null, null],
[0, "배원소", null, 0, null, 49, 65, 25, 0, 169, 200, null, null],
[0, "마완", null, 0, null, 71, 74, 16, 0, 170, 211, null, null],
[0, "마휴", null, 9, "서량", 68, 73, 48, 1, 178, 212, null, null],
[0, "파재", null, 0, null, 74, 74, 55, 0, 145, 184, null, null],
[0, "마준", null, 0, null, 38, 52, 31, 0, 196, 230, null, null],
[0, "마속", null, 0, null, 61, 67, 87, 0, 190, 228, null, null],
[0, "마대", null, 0, null, 79, 85, 62, 0, 183, 246, null, null],
[0, "마충", null, 0, null, 78, 72, 68, 0, 187, 249, null, null],
[0, "마초", null, 9, "서량", 93, 97, 44, 1, 176, 222, null, null],
[0, "마철", null, 9, "서량", 70, 62, 58, 1, 179, 212, null, null],
[0, "마등", null, 9, "서량", 82, 80, 52, 12, 149, 212, null, null],
[0, "마량", null, 0, null, 53, 23, 88, 0, 187, 222, null, null],
[0, "반준", null, 0, null, 61, 18, 83, 0, 174, 239, null, null],
[0, "반장", null, 0, null, 76, 80, 74, 0, 177, 234, null, null],
[0, "번조", null, 0, null, 66, 73, 31, 0, 149, 192, null, null],
[0, "번능", null, 0, null, 69, 61, 36, 0, 158, 195, null, null],
[0, "반봉", null, 0, null, 56, 77, 4, 0, 155, 190, null, null],
[0, "비의", null, 0, null, 77, 30, 83, 0, 193, 253, null, null],
[0, "비연", null, 0, null, 60, 66, 21, 0, 196, 238, null, null],
[0, "비시", null, 0, null, 18, 28, 65, 0, 176, 240, null, null],
[0, "미축", null, 8, "소패", 33, 29, 78, 1, 165, 220, null, null],
[0, "미방", null, 8, "소패", 54, 61, 32, 1, 169, 226, null, null],
[0, "비요", null, 0, null, 70, 66, 73, 0, 192, 228, null, null],
[0, "무안국", null, 0, null, 70, 83, 34, 0, 156, 193, null, null],
[0, "풍습", null, 0, null, 72, 71, 39, 0, 182, 222, null, null],
[0, "부사인", null, 0, null, 46, 63, 37, 0, 182, 225, null, null],
[0, "부첨", null, 0, null, 73, 85, 76, 0, 216, 263, null, null],
[0, "부손", null, 0, null, 29, 13, 70, 0, 162, 230, null, null],
[0, "문앙", null, 0, null, 76, 93, 65, 0, 238, 291, null, null],
[0, "문흠", null, 0, null, 74, 83, 43, 0, 200, 258, null, null],
[0, "문추", null, 16, "남피", 89, 93, 47, 1, 169, 200, null, null],
[0, "문빙", null, 0, null, 80, 82, 69, 0, 178, 237, null, null],
[0, "변희", null, 0, null, 56, 70, 62, 0, 169, 200, null, null],
[0, "망아장", null, 0, null, 45, 79, 3, 0, 191, 225, null, null],
[0, "봉기", null, 16, "남피", 43, 21, 84, 1, 153, 202, null, null],
[0, "방희", null, 0, null, 60, 38, 69, 0, 152, 192, null, null],
[0, "법정", null, 0, null, 82, 47, 94, 0, 176, 220, null, null],
[0, "방통", null, 0, null, 85, 34, 97, 0, 178, 213, null, null],
[0, "방덕", null, 9, "서량", 89, 94, 75, 11, 170, 219, null, null],
[0, "포륭", null, 0, null, 58, 76, 49, 0, 174, 208, null, null],
[0, "목순", null, 0, null, 52, 77, 11, 0, 157, 190, null, null],
[0, "목록대왕", null, 0, null, 65, 71, 39, 0, 184, 225, null, null],
[0, "보즐", null, 0, null, 72, 51, 84, 0, 177, 247, null, null],
[0, "만총", null, 0, null, 84, 64, 82, 0, 170, 242, null, null],
[0, "모개", null, 0, null, 63, 39, 60, 0, 161, 216, null, null],
[0, "맹획", null, 0, null, 87, 87, 42, 0, 186, 245, null, null],
[0, "맹달", null, 0, null, 75, 73, 75, 0, 172, 228, null, null],
[0, "맹우", null, 0, null, 50, 68, 22, 0, 190, 243, null, null],
[0, "유섭", null, 0, null, 62, 79, 24, 0, 158, 190, null, null],
[0, "양부2", null, 0, null, 62, 68, 68, 0, 167, 212, null, null],
[0, "옹개", null, 0, null, 73, 75, 57, 0, 188, 225, null, null],
[0, "양의", null, 0, null, 68, 40, 82, 0, 190, 235, null, null],
[0, "양호", null, 0, null, 90, 64, 84, 0, 221, 278, null, null],
[0, "양홍", null, 7, "수춘", 33, 15, 77, 1, 152, 199, null, null],
[0, "양앙", null, 13, "한중", 68, 72, 38, 1, 172, 215, null, null],
[0, "양추1", null, 0, null, 52, 65, 40, 0, 159, 199, null, null],
[0, "양수", null, 0, null, 25, 4, 83, 0, 175, 219, null, null],
[0, "양추2", null, 0, null, 67, 64, 60, 0, 172, 238, null, null],
[0, "양송", null, 0, null, 1, 5, 28, 0, 167, 215, null, null],
[0, "양임", null, 13, "한중", 70, 78, 56, 1, 170, 215, null, null],
[0, "양조", null, 0, null, 53, 61, 36, 0, 223, 286, null, null],
[0, "양백", null, 13, "한중", 44, 45, 19, 1, 171, 214, null, null],
[0, "양부1", null, 0, null, 67, 50, 83, 0, 178, 239, null, null],
[0, "양봉1", null, 0, null, 66, 65, 31, 0, 153, 197, null, null],
[0, "양봉2", null, 0, null, 54, 62, 53, 0, 191, 252, null, null],
[0, "뇌동", null, 0, null, 69, 78, 51, 0, 172, 218, null, null],
[0, "뇌박", null, 7, "수춘", 62, 70, 36, 1, 157, 206, null, null],
[0, "이이", null, 0, null, 63, 77, 19, 0, 187, 222, null, null],
[0, "이회", null, 0, null, 79, 65, 79, 0, 175, 231, null, null],
[0, "이각", null, 1, "장안", 69, 72, 24, 12, 148, 198, null, null],
[0, "육항", null, 0, null, 91, 63, 87, 0, 226, 274, null, null],
[0, "육적", null, 0, null, 20, 7, 72, 0, 187, 219, null, null],
[0, "육손", null, 0, null, 94, 69, 95, 0, 183, 245, null, null],
[0, "이엄", null, 0, null, 83, 84, 76, 0, 172, 234, null, null],
[0, "이유", null, 0, null, 61, 26, 93, 0, 150, 192, null, null, "장안으로 천도를 하는것이 어떻겠습니까?"],
[0, "이숙", null, 0, null, 46, 69, 61, 0, 156, 192, null, null],
[0, "이통", null, 2, "초", 73, 83, 62, 1, 168, 209, null, null],
[0, "이전", null, 2, "초", 78, 77, 79, 1, 181, 216, null, null],
[0, "이풍", null, 7, "수춘", 69, 74, 50, 1, 158, 199, null, null],
[0, "유언", null, 0, null, 53, 38, 80, 0, 132, 194, null, null],
[0, "유괴", null, 6, "성도", 71, 73, 67, 1, 165, 214, null, null],
[0, "유기", null, 12, "양양", 52, 12, 63, 1, 174, 210, null, null],
[0, "유우", null, 0, null, 55, 33, 70, 0, 145, 193, null, null],
[0, "유훈", null, 7, "여강", 47, 63, 35, 1, 163, 216, null, null],
[0, "유현", null, 0, null, 54, 66, 51, 0, 188, 252, null, null],
[0, "유순", null, 0, null, 63, 46, 41, 0, 172, 255, null, null],
[0, "유장", null, 6, "성도", 31, 5, 34, 12, 162, 219, null, null],
[0, "유심", null, 0, null, 60, 62, 70, 0, 238, 264, null, null],
[0, "유선", null, 0, null, 3, 5, 9, 0, 208, 270, null, null],
[0, "유종", null, 0, null, 24, 22, 65, 0, 195, 220, null, null],
[0, "유도", null, 0, null, 25, 23, 26, 0, 168, 214, null, null],
[0, "유파", null, 0, null, 29, 22, 75, 0, 186, 222, null, null],
[0, "유반", null, 0, null, 69, 76, 47, 0, 168, 210, null, null],
[0, "유비", null, 8, "하비", 81, 77, 80, 12, 161, 223, null, null],
[0, "유표1", null, 12, "양양", 48, 31, 72, 12, 142, 208, null, null, "강하 팔준에서 제일가는 이 유표에게로 오시오!"],
[0, "유복", null, 0, null, 64, 49, 74, 0, 164, 208, null, null],
[0, "유벽", null, 20, "여남", 70, 72, 47, 12, 145, 201, null, null],
[0, "유봉", null, 0, null, 75, 79, 44, 0, 188, 220, null, null],
[0, "유엽", null, 7, "여강", 56, 32, 92, 1, 176, 235, null, null],
[0, "유요", null, 0, null, 62, 67, 46, 0, 156, 198, null, null],
[0, "여위황", null, 16, "남피", 58, 63, 29, 1, 159, 200, null, null],
[0, "요화", null, 0, null, 73, 76, 69, 0, 168, 264, null, null],
[0, "양흥", null, 9, "서량", 61, 65, 19, 1, 169, 211, null, null],
[0, "양습", null, 0, null, 73, 40, 74, 0, 168, 230, null, null],
[0, "양서", null, 0, null, 56, 62, 66, 0, 198, 260, null, null],
[0, "능조", null, 0, null, 75, 81, 42, 0, 168, 203, null, null],
[0, "능통", null, 0, null, 77, 89, 60, 0, 189, 217, null, null],
[0, "여개", null, 0, null, 53, 30, 67, 0, 194, 227, null, null],
[0, "여건", null, 2, "진류", 57, 70, 62, 1, 173, 238, null, null],
[0, "여광", null, 16, "북해", 56, 70, 13, 1, 162, 207, null, null],
[0, "여상", null, 16, "북해", 54, 71, 12, 1, 164, 207, null, null],
[0, "여대", null, 0, null, 75, 71, 70, 0, 161, 256, null, null],
[0, "여범", null, 19, "건업", 73, 63, 75, 1, 169, 228, null, null],
[0, "여포", null, 3, "하비", 97, 100, 26, 12, 156, 198, null, null, "크하하하 다 부숴 버리겠다!"],
[0, "여몽", null, 0, null, 82, 81, 20, 0, 178, 219, null, null],
[0, "윤직", null, 0, null, 46, 42, 73, 0, 196, 237, null, null],
[0, "냉포", null, 0, null, 71, 82, 61, 0, 176, 214, null, null],
[0, "진취", null, 0, null, 56, 65, 48, 0, 174, 208, null, null],
[0, "노숙", null, 0, null, 84, 56, 92, 0, 172, 217, null, null],
[0, "노식", null, 0, null, 86, 63, 82, 0, 139, 192, null, null],
[0, "범강", null, 0, null, 49, 50, 36, 0, 174, 222, null, null],
[0, "장달", null, 0, null, 43, 56, 34, 0, 175, 222, null, null],
[0, "규람", null, 0, null, 55, 70, 58, 0, 165, 204, null, null],
[0, "대원", null, 0, null, 38, 32, 68, 0, 166, 204, null, null],
[0, "왕기", null, 0, null, 77, 72, 86, 0, 190, 261, null, null],
[0, "왕상", null, 0, null, 23, 19, 68, 0, 180, 268, null, null],
[0, "왕돈", null, 0, null, 60, 66, 46, 0, 198, 256, null, null],
[0, "악침", null, 0, null, 73, 75, 43, 0, 196, 257, null, null],
[0, "하제", null, 19, "회계", 83, 70, 82, 1, 171, 227, null, null],
[0, "환범", null, 0, null, 40, 11, 78, 0, 199, 249, null, null],
[0, "견초", null, 16, "업", 72, 79, 73, 1, 168, 244, null, null],
[0, "고당륭", null, 0, null, 35, 24, 76, 0, 190, 244, null, null],
[0, "오찬", null, 0, null, 68, 41, 78, 0, 181, 245, null, null],
[0, "호질", null, 0, null, 73, 46, 74, 0, 192, 250, null, null],
[0, "오질", null, 0, null, 16, 29, 68, 0, 177, 230, null, null],
[0, "호준", null, 0, null, 79, 76, 62, 0, 200, 256, null, null],
[0, "고담", null, 0, null, 53, 23, 77, 0, 203, 244, null, null],
[0, "최림", null, 0, null, 32, 22, 66, 0, 187, 244, null, null],
[0, "사마망", null, 0, null, 78, 58, 83, 0, 205, 271, null, null],
[0, "주이", null, 0, null, 70, 73, 61, 0, 201, 257, null, null],
[0, "전단", null, 0, null, 67, 64, 39, 0, 204, 261, null, null],
[0, "조우", null, 0, null, 50, 43, 37, 0, 199, 278, null, null],
[0, "조상", null, 0, null, 39, 33, 30, 0, 207, 249, null, null],
[0, "조방", null, 0, null, 20, 14, 27, 0, 232, 274, null, null],
[0, "태사향", null, 0, null, 57, 66, 48, 0, 189, 246, null, null],
[0, "장휴", null, 0, null, 63, 27, 74, 0, 204, 244, null, null],
[0, "장호", null, 0, null, 75, 74, 51, 0, 195, 240, null, null],
[0, "조광", null, 0, null, 67, 71, 53, 0, 210, 263, null, null],
[0, "장집", null, 0, null, 76, 29, 80, 0, 196, 254, null, null],
[0, "장승", null, 0, null, 77, 70, 75, 0, 178, 244, null, null],
[0, "장소", null, 0, null, 23, 56, 31, 0, 202, 264, null, null],
[0, "조통", null, 0, null, 68, 67, 61, 0, 209, 260, null, null],
[0, "진표", null, 0, null, 66, 42, 74, 0, 207, 237, null, null],
[0, "정무", null, 0, null, 56, 35, 75, 0, 201, 265, null, null],
[0, "정봉", null, 0, null, 66, 66, 53, 0, 198, 266, null, null],
[0, "전만", null, 2, "허창", 51, 73, 39, 1, 181, 235, null, null],
[0, "마균", null, 0, null, 22, 17, 71, 0, 200, 259, null, null],
[0, "방회", null, 0, null, 69, 75, 49, 0, 205, 272, null, null],
[0, "서구", null, 0, null, 69, 42, 70, 0, 149, 208, null, null],
[0, "육개", null, 0, null, 65, 61, 79, 0, 198, 269, null, null],
[0, "유찬", null, 0, null, 78, 81, 64, 0, 172, 255, null, null],
[0, "유소", null, 0, null, 68, 53, 74, 0, 195, 264, null, null],
[0, "요립", null, 0, null, 32, 15, 76, 0, 181, 250, null, null],
[0, "여거", null, 0, null, 78, 69, 71, 0, 196, 256, null, null],
[0, "제갈첨", null, 0, null, 70, 57, 76, 0, 227, 263, null, null],
[0, "손휴", null, 0, null, 57, 42, 78, 0, 235, 264, null, null],
[0, "극정", null, 0, null, 42, 23, 68, 0, 208, 278, null, null],
[0, "호분", null, 0, null, 71, 76, 50, 0, 222, 288, null, null],
[0, "손량", null, 0, null, 32, 26, 70, 0, 243, 260, null, null],
[0, "마막", null, 0, null, 34, 12, 44, 0, 221, 266, null, null],
[0, "손호", null, 0, null, 41, 73, 71, 0, 242, 284, null, null],
[0, "조모", null, 0, null, 54, 61, 59, 0, 241, 260, null, null],
[0, "조환", null, 0, null, 30, 28, 30, 0, 246, 302, null, null],
[0, "사마유", null, 0, null, 71, 68, 75, 0, 248, 283, null, null],
[0, "제갈상", null, 0, null, 64, 79, 62, 0, 246, 263, null, null],
[0, "손화", null, 0, null, 31, 39, 68, 0, 224, 253, null, null],
[0, "염우", null, 0, null, 52, 61, 51, 0, 209, 264, null, null],
[0, "왕경", null, 0, null, 67, 63, 71, 0, 206, 260, null, null],
[0, "왕혼", null, 0, null, 74, 71, 63, 0, 223, 297, null, null],
[0, "곽혁", null, 0, null, 33, 29, 70, 0, 187, 225, null, null],
[0, "가범", null, 0, null, 60, 62, 73, 0, 202, 237, null, null],
[0, "서질", null, 0, null, 68, 83, 24, 0, 207, 253, null, null],
[0, "손준", null, 0, null, 64, 70, 65, 0, 219, 256, null, null],
[0, "손침", null, 0, null, 58, 55, 65, 0, 231, 258, null, null],
[0, "우사", null, 0, null, 61, 34, 74, 0, 217, 273, null, null],
[0, "진건", null, 0, null, 72, 71, 65, 0, 214, 292, null, null],
[0, "동궐", null, 0, null, 65, 59, 76, 0, 204, 271, null, null],
[0, "당자", null, 0, null, 61, 71, 50, 0, 196, 265, null, null],
[0, "등충", null, 0, null, 76, 86, 69, 0, 230, 264, null, null],
[0, "황숭", null, 0, null, 67, 63, 72, 0, 208, 263, null, null],
[0, "화핵", null, 0, null, 20, 24, 71, 0, 217, 278, null, null],
[0, "허의", null, 0, null, 51, 74, 15, 0, 213, 263, null, null],
[0, "송겸", null, 0, null, 66, 78, 42, 0, 175, 227, null, null],
[0, "호제", null, 0, null, 57, 39, 68, 0, 207, 264, null, null],
[0, "나헌", null, 0, null, 85, 70, 77, 0, 218, 270, null, null],
[0, "아들노숙", null, 0, null, 73, 53, 74, 0, 217, 272, null, null],
[0, "구성", null, 0, null, 63, 70, 38, 0, 157, 187, null, null],
[0, "어부라", null, 0, null, 72, 68, 21, 0, 150, 195, null, null],
[0, "아하소과", null, 0, null, 61, 76, 13, 0, 204, 253, null, null],
[0, "가비능", null, 0, null, 77, 69, 52, 0, 172, 235, null, null],
[0, "구력거", null, 0, null, 80, 68, 56, 0, 152, 193, null, null],
[0, "강단", null, 0, null, 65, 83, 48, 0, 168, 234, null, null],
[0, "황란", null, 0, null, 63, 75, 44, 0, 200, 264, null, null],
[0, "호주천", null, 0, null, 70, 71, 40, 0, 169, 230, null, null],
[0, "종리목", null, 0, null, 80, 72, 73, 0, 214, 269, null, null],
[0, "제갈교", null, 0, null, 62, 27, 75, 0, 204, 228, null, null],
[0, "답돈", null, 0, null, 84, 82, 61, 0, 158, 207, null, null],
[0, "반임", null, 0, null, 66, 79, 38, 0, 168, 225, null, null],
[0, "보도근", null, 0, null, 64, 73, 50, 0, 170, 233, null, null],
[0, "미당대왕", null, 0, null, 59, 69, 21, 0, 202, 260, null, null],
[0, "유표(흉노)", null, 0, null, 73, 74, 48, 0, 173, 252, null, null],
[0, "루반", null, 0, null, 65, 76, 39, 0, 178, 207, null, null],
[0, "손관", null, 0, null, 72, 78, 51, 0, 166, 217, null, null],
[0, "곽석", null, 0, null, 59, 71, 48, 0, 158, 187, null, null],
[0, "주조", null, 0, null, 63, 68, 26, 0, 152, 187, null, null],
[0, "장거", null, 0, null, 79, 75, 56, 0, 150, 188, null, null],
[0, "장순", null, 0, null, 73, 81, 60, 0, 152, 188, null, null],
[0, "해니", null, 0, null, 62, 78, 35, 0, 191, 233, null, null],
[0, "토안", null, 0, null, 53, 82, 30, 0, 191, 233, null, null],
[0, "유주", null, 0, null, 67, 78, 42, 0, 172, 233, null, null],
[0, "비잔", null, 0, null, 60, 71, 51, 0, 181, 216, null, null],
[0, "월길", null, 0, null, 81, 88, 26, 0, 190, 227, null, null],
[0, "아단", null, 0, null, 72, 65, 78, 0, 186, 259, null, null],
[0, "철리길", null, 0, null, 77, 70, 52, 0, 179, 259, null, null],
[0, "주삭", null, 0, null, 54, 60, 50, 0, 174, 253, null, null],
[0, "왕이", null, 0, null, 87, 59, 77, 0, 171, 230, null, null],
[0, "왕원희", null, 0, null, 53, 37, 73, 0, 217, 268, null, null],
[0, "곽씨", null, 0, null, 42, 4, 55, 0, 184, 235, null, null],
[0, "하후씨", null, 0, null, 34, 13, 42, 0, 188, 243, null, null],
[0, "하후령녀", null, 0, null, 22, 33, 60, 0, 207, 257, null, null],
[0, "하씨", null, 0, null, 51, 14, 67, 0, 150, 189, null, null],
[0, "관은병", null, 0, null, 87, 84, 75, 0, 204, 271, null, null],
[0, "감씨", null, 8, "소패", 14, 10, 44, 1, 175, 210, null, null],
[0, "황월영", null, 0, null, 62, 33, 90, 0, 186, 235, null, null],
[0, "채염", null, 0, null, 53, 14, 80, 0, 168, 224, null, null],
[0, "채씨", null, 12, "양양", 38, 7, 70, 1, 159, 212, null, null],
[0, "소교", null, 0, null, 40, 3, 70, 0, 178, 212, null, null],
[0, "서씨", null, 0, null, 48, 16, 80, 0, 183, 232, null, null],
[0, "신헌영", null, 0, null, 48, 28, 84, 0, 191, 269, null, null],
[0, "견씨", null, 16, "업", 42, 18, 74, 1, 182, 221, null, null],
[0, "추씨", null, 5, "완", 4, 9, 66, 1, 165, 200, null, null],
[0, "조절", null, 0, null, 32, 33, 79, 0, 190, 260, null, null],
[0, "손씨", null, 0, null, 32, 14, 55, 0, 188, 250, null, null],
[0, "손상향", null, 0, null, 77, 82, 55, 0, 193, 222, null, null],
[0, "손노육", null, 0, null, 52, 10, 66, 0, 204, 253, null, null],
[0, "손노반", null, 0, null, 17, 15, 80, 0, 202, 258, null, null],
[0, "대교", null, 0, null, 33, 30, 66, 0, 177, 215, null, null],
[0, "장씨", null, 0, null, 55, 35, 66, 0, 207, 237, null, null],
[0, "장춘화", null, 0, null, 66, 29, 77, 0, 179, 234, null, null],
[0, "초선", null, 3, "하비", 42, 18, 81, 1, 176, 230, null, null],
[0, "번씨", null, 0, null, 6, 12, 50, 0, 183, 225, null, null],
[0, "미씨", null, 8, "소패", 13, 6, 72, 1, 176, 208, null, null],
[0, "변씨", null, 2, "허창", 30, 23, 55, 1, 160, 230, null, null],
[0, "보련사", null, 0, null, 45, 30, 77, 0, 198, 248, null, null],
[0, "유씨", null, 16, "업", 8, 8, 44, 1, 164, 215, null, null],
[0, "화만", null, 0, null, 85, 92, 40, 0, 191, 233, null, null],
[0, "포삼낭", null, 0, null, 87, 83, 36, 0, 191, 240, null, null],
[0, "성렴", null, 3, "서주", 66, 72, 43, 1, 168, 199, null, null],
[0, "위월", null, 3, "서주", 68, 76, 39, 1, 170, 199, null, null],
[0, "진의록", null, 3, "하비", 46, 43, 17, 1, 168, 199, null, null],
[0, "채옹", null, 0, null, 27, 16, 81, 0, 133, 192, null, null],
[0, "지양군", null, 0, null, 13, 8, 55, 0, 103, 192, null, null],
[0, "위소", null, 0, null, 21, 23, 65, 0, 204, 273, null, null],
[0, "위강", null, 0, null, 58, 35, 56, 0, 168, 213, null, null],
[0, "원요", null, 0, null, 28, 41, 50, 0, 177, 206, null, null],
[0, "왕기2", null, 0, null, 69, 67, 61, 0, 217, 281, null, null],
[0, "원환", null, 0, null, 30, 17, 72, 0, 165, 225, null, null],
[0, "우전", null, 0, null, 64, 76, 40, 0, 204, 258, null, null],
[0, "왕광", null, 0, null, 33, 65, 55, 0, 150, 190, null, null],
[0, "왕업", null, 0, null, 33, 6, 66, 0, 220, 280, null, null],
[0, "왕융", null, 0, null, 40, 57, 68, 0, 234, 305, null, null],
[0, "왕충", null, 2, "진류", 46, 39, 57, 1, 152, 214, null, null],
[0, "위풍", null, 0, null, 52, 23, 72, 0, 182, 219, null, null],
[0, "구건", null, 0, null, 39, 52, 65, 0, 239, 272, null, null],
[0, "구본", null, 0, null, 50, 41, 67, 0, 232, 269, null, null],
[0, "동백", null, 0, null, 12, 7, 52, 0, 173, 192, null, null],
[0, "마운", null, 0, null, 78, 88, 53, 0, 183, 225, null, null],
[0, "사섭", null, 17, "교지", 53, 31, 76, 12, 137, 226, null, null],
[0, "사지", null, 17, "교지", 58, 51, 52, 1, 163, 227, null, null],
[0, "사휘", null, 17, "남해", 69, 64, 44, 1, 165, 227, null, null],
[0, "사일", null, 17, "남해", 48, 36, 67, 1, 153, 230, null, null],
[0, "사광", null, 17, "교지", 58, 45, 64, 1, 175, 235, null, null],
[0, "후음", null, 0, null, 76, 72, 45, 0, 184, 219, null, null],
[0, "공주", null, 0, null, 26, 16, 68, 0, 151, 191, null, null],
[0, "고담륭", null, 0, null, 35, 24, 76, 0, 190, 251, null, null],
[0, "국연", null, 0, null, 50, 19, 77, 0, 160, 219, null, null],
[0, "오언", null, 0, null, 74, 72, 77, 0, 235, 297, null, null],
[0, "오강", null, 0, null, 48, 38, 65, 0, 216, 275, null, null],
[0, "최염", null, 16, "업", 18, 55, 77, 1, 162, 216, null, null],
[0, "좌혁", null, 0, null, 62, 66, 51, 0, 232, 280, null, null],
[0, "차주", null, 2, "정도", 49, 49, 40, 1, 164, 199, null, null],
[0, "주태", null, 0, null, 71, 64, 71, 0, 207, 261, null, null],
[0, "북궁백옥", null, 0, null, 66, 72, 49, 0, 146, 187, null, null],
[0, "변장", null, 0, null, 69, 56, 47, 0, 133, 187, null, null],
[0, "순의", null, 0, null, 16, 13, 72, 0, 207, 274, null, null],
[0, "서진순욱", null, 0, null, 8, 19, 77, 0, 225, 289, null, null],
[0, "사마준", null, 0, null, 85, 82, 80, 0, 232, 286, null, null],
[0, "종육", null, 0, null, 32, 12, 71, 0, 223, 263, null, null],
[0, "초이", null, 0, null, 62, 69, 63, 0, 219, 266, null, null],
[0, "제갈정", null, 0, null, 58, 63, 66, 0, 246, 300, null, null],
[0, "보협", null, 0, null, 62, 49, 53, 0, 216, 264, null, null],
[0, "복양흥", null, 0, null, 32, 70, 65, 0, 224, 264, null, null],
[0, "보천", null, 0, null, 71, 60, 71, 0, 222, 272, null, null],
[0, "유대연주", null, 0, null, 53, 32, 55, 0, 148, 192, null, null],
[0, "유대", null, 2, "진류", 63, 58, 30, 1, 155, 202, null, null],
[0, "유승", null, 0, null, 45, 65, 33, 0, 215, 258, null, null],
[0, "여영기", null, 3, "하비", 79, 88, 37, 1, 182, 198, null, null],
[0, "독발수기능", null, 0, null, 89, 93, 77, 0, 232, 279, null, null],
[0, "진수", null, 0, null, 12, 22, 68, 0, 233, 297, null, null],
[0, "마륭", null, 0, null, 84, 75, 76, 0, 231, 296, null, null],
[0, "도황", null, 0, null, 76, 68, 72, 0, 232, 290, null, null],
[0, "진온", null, 0, null, 60, 38, 48, 0, 167, 192, null, null],
[0, "교모", null, 0, null, 54, 45, 69, 0, 137, 190, null, null],
[0, "교국로", null, 19, "건업", 38, 17, 55, 1, 150, 220, null, null],
[0, "포신", null, 0, null, 77, 67, 81, 0, 152, 192, null, null],
[0, "포훈", null, 2, "복양", 41, 35, 75, 1, 180, 226, null, null],
[0, "포도", null, 0, null, 57, 70, 43, 0, 159, 190, null, null],
[0, "위자", null, 0, null, 58, 38, 62, 0, 150, 190, null, null],
[0, "유화", null, 16, "남피", 21, 16, 59, 1, 165, 216, null, null],
[0, "이이자", null, 4, "북평", 32, 18, 48, 1, 157, 199, null, null],
[0, "선우보", null, 0, null, 74, 69, 65, 0, 161, 229, null, null],
[0, "원유", null, 0, null, 57, 39, 73, 0, 150, 193, null, null],
[0, "사마휘", null, 0, null, 21, 8, 92, 0, 173, 208, "은둔", null, "좋지~좋아"],
[0, "화타", null, 0, null, 8, 7, 68, 0, 173, 207, "은둔", "의술"],
[0, "관로", null, 0, null, 13, 9, 72, 0, 200, 233, "은둔", null],
[0, "예형", null, 0, null, 13, 4, 90, 0, 173, 199, null, null],
[0, "원혁", null, 7, "수춘", 52, 18, 18, 1, 180, 246, null, null],
[0, "헌제", null, 2, "낙양", 23, 17, 66, 1, 184, 234, null, null, "….."],
[0, "황완", null, 0, null, 40, 34, 71, 0, 141, 192, null, null],
[0, "마일제", null, 0, null, 43, 25, 70, 0, 130, 194, null, null],
[0, "유총", null, 0, null, 82, 45, 60, 0, 151, 197, null, null],
[0, "낙준", null, 0, null, 51, 37, 66, 0, 152, 197, null, null],
[0, "낙통", null, 0, null, 76, 57, 73, 0, 193, 228, null, null],
[0, "허소", null, 0, null, 46, 11, 82, 0, 150, 196, null, null],
[0, "허사", null, 3, "하비", 24, 20, 60, 1, 163, 199, null, null],
[0, "장초", null, 0, null, 61, 32, 60, 0, 168, 196, null, null],
[0, "양표", null, 2, "낙양", 24, 20, 60, 1, 142, 225, null, null],
[0, "왕필", null, 2, "낙양", 53, 44, 59, 1, 170, 228, null, null],
[0, "사환", null, 2, "진류", 70, 71, 45, 1, 173, 209, null, null],
[0, "정비", null, 2, "진류", 34, 30, 57, 1, 158, 214, null, null],
[0, "두씨", null, 3, "하비", 26, 41, 52, 1, 172, 236, null, null],
[0, "누규", null, 12, "양양", 58, 40, 87, 1, 143, 212, null, null],
[0, "단외", null, 1, "장안", 55, 48, 55, 1, 148, 209, null, null],
[0, "원사", null, 2, "초", 65, 43, 78, 1, 159, 210, null, null],
[0, "사의관", null, 7, "수춘", 22, 12, 67, 1, 168, 199, null, null],
[0, "송건", null, 0, null, 66, 77, 40, 0, 164, 214, null, null],
[0, "곽원", null, 16, "업", 66, 73, 36, 1, 162, 205, null, null],
[0, "소유", null, 16, "업", 51, 59, 48, 1, 167, 210, null, null],
[0, "주한", null, 16, "남피", 49, 51, 26, 1, 162, 204, null, null],
[0, "뇌서", null, 0, null, 68, 65, 34, 0, 170, 212, null, null],
[0, "장홍", null, 3, "복양", 72, 81, 65, 1, 164, 196, null, null],
[0, "유위대", null, 4, "북평", 53, 44, 62, 1, 152, 199, null, null],
[0, "문칙", null, 4, "계", 59, 53, 32, 1, 164, 199, null, null],
[0, "습진", null, 0, null, 64, 68, 51, 0, 189, 221, null, null],
[0, "습정", null, 0, null, 49, 29, 70, 0, 181, 229, null, null],
[0, "이리", null, 1, "장안", 65, 72, 37, 1, 171, 198, null, null]
],
"general_ex":[
],
"cities":[
],
"history":[
"<C>●</>197년 1월:<L><b>【역사모드4-2】</b>황제 원술</>",
"<C>●</>197년 1월:<L><b>【이벤트】</b></>원술이 황제가 되고 반원술 연합이 결성되다"
],
"initialEvents":[
[
true,
["ChangeCity", "free", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80
}],
["ChangeCity", "occupied", {
"pop":"70%",
"agri":"70%",
"comm":"70%",
"secu":"70%",
"trust":80,
"def":"70%",
"wall":"70%"
}]
]
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
}

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