Compare commits

..
76 Commits
Author SHA1 Message Date
Hide_D 77a496baa7 암행부 추가 확장 2018-07-28 02:38:19 +09:00
Hide_D 86e863de09 암행부 너비 추가 수정 2018-07-28 02:33:42 +09:00
Hide_D c2cfd217c2 암행부 턴 표기 수정 2018-07-28 02:02:50 +09:00
Hide_D f2366a61b0 IE11 모병창 UI 버그 수정 2018-07-28 01:58:35 +09:00
Hide_D 9959393dee IE 메인페이지 깨짐 일부 수정 2018-07-28 01:38:53 +09:00
Hide_D 16facf98f1 submit_btn 버그 수정 2018-07-28 01:32:00 +09:00
Hide_D bc8ce8832a 모/징병 페이지 변경 2018-07-28 01:24:23 +09:00
Hide_D 20bcf960ef 로그인 페이지를 모바일에서도 조금 더 잘보이게 변경 2018-07-27 18:56:01 +09:00
Hide_D 5cecd3e995 로그인 페이지가 약관 등에 가리지 않도록 변경 2018-07-27 18:47:48 +09:00
Hide_D d7ead25ea4 1턴에 어쩌다 휴식턴이 입력되는 버그 수정 2018-07-27 18:14:16 +09:00
Hide_D 75c0c375d1 장수 호칭 변경 2018-07-27 03:03:25 +09:00
Hide_D 5db4913292 세력일람 장수 표기순 변경 2018-07-27 02:39:26 +09:00
Hide_D a6a53b1d0d Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-27 02:34:02 +09:00
Hide_D 81a0c0e120 세력일람 업데이트 2018-07-27 02:33:56 +09:00
Hide_D 0dae71a644 회피 디버그 수정 2018-07-26 17:13:27 +09:00
Hide_D f8eedaa3ea 전투 디버그 2018-07-26 15:40:46 +09:00
Hide_D ce2d97a7e7 전투 회피 코드 디버깅 적용 2018-07-26 15:39:34 +09:00
Hide_D 2cb570eaca foreach reference loop 버그 2018-07-26 00:12:12 +09:00
Hide_D c8c4352957 기존 도시/암행부 스크립트 통합. 2018-07-25 23:58:58 +09:00
Hide_D a311db4555 서버 관리 창에 에러 로그 보기 버튼 추가 2018-07-23 23:44:48 +09:00
Hide_D 05c515b2da j_map_history에서 fallback arg 제거 2018-07-23 23:30:53 +09:00
Hide_D c1acf2b0fe Trace의 모든 내용이 나오도록 수정 2018-07-23 23:26:32 +09:00
Hide_D 803a2407eb 에러 로그 보기 기능 추가 2018-07-23 23:19:39 +09:00
Hide_D a87945d1fb 에러 로그 업데이트 2018-07-23 22:54:06 +09:00
Hide_D 30793e68df 에러 로그용 클래스 설정 2018-07-23 22:50:22 +09:00
Hide_D 9c666bf7a9 FileDB 클래스 추가 2018-07-23 22:37:30 +09:00
Hide_D eff1dd7c34 라이브러리 업데이트 catfan/medoo 추가 2018-07-23 21:27:26 +09:00
Hide_D e79a33ebb0 NPC 군주의 호전성 추가(?) 2018-07-23 02:56:33 +09:00
Hide_D cb0adfdeaf npc attackable 보완 2018-07-23 02:50:58 +09:00
Hide_D 6b135c343c NPC의 선포 대상을 '국력'이 낮은 국가에 더 잘 하도록 변경 2018-07-23 01:49:43 +09:00
Hide_D 6c92db524b 선포 코드를 조금더 직관적으로 수정 2018-07-23 01:28:34 +09:00
Hide_D b8dfd1c041 징,모병시 민심이 떨어지지 않는 버그 수정 2018-07-22 15:39:53 +09:00
Hide_D 54d6347c1d 사령부 휴식 커맨드가 제대로 안보이는 문제 해결 2018-07-22 15:10:37 +09:00
Hide_D 4ea6e90600 연감에 serverID가 잘못된 경우 해결 2018-07-22 03:37:14 +09:00
Hide_D 4c7628a247 부대편성의 '집합' 확인 코드가 하드코딩인 부분 수정 2018-07-22 03:28:10 +09:00
revofpla 6c7334155a 필살확률 무조건 최소 50%인 버그 픽스 2018-07-21 13:49:15 +09:00
revofpla 480e3ea974 체섭 버그로 인한 핫픽스 1차
- 징병 숙련 100배 문제
 - 모병 비용 2배로 계산 안되는 문제
2018-07-21 13:12:52 +09:00
Hide_D 1f639a5bc6 애니집결 시나리오 번호 변경 2018-07-20 19:53:21 +09:00
Hide_D ccf3b07c3a 애니집결 업데이트 2018-07-20 19:51:11 +09:00
Hide_D d8508f2b72 충차가 1등급 되기만 하면 쓸 수 있던 버그 수정 2018-07-20 10:44:14 +09:00
Hide_D 5e13961ec8 protected인 자료에 접근해서 발생하는 문제 수정 2018-07-20 10:05:08 +09:00
Hide_D 80b1139371 버튼 너비 수정 2018-07-20 09:12:37 +09:00
Hide_D 635b41765c 계정 관리 창 살짝 넓힘 2018-07-20 09:08:04 +09:00
Hide_D 4b03686aa2 숙련 단련 버그 수정 2018-07-20 09:01:50 +09:00
Hide_D bfb0d8d639 message 템플릿 버그 수정 2018-07-20 00:06:03 +09:00
Hide_D 93d4a0211d 등용장의 경우에도 누를수 없는 경우 수정 2018-07-19 23:59:27 +09:00
Hide_D cd31bc69ef 추방 버그 수정 2018-07-19 23:13:05 +09:00
Hide_D 4a7b84d6de 외교 서신 레벨 지정 2018-07-19 22:19:26 +09:00
Hide_D 3142714c11 리셋 첫 해에는 추방해도 제약 없음 2018-07-19 21:25:00 +09:00
Hide_D 7ea10416a9 임관 권유 메시지 창 2018-07-19 21:03:42 +09:00
Hide_D 3e427db0f1 relativeYear에 음수 불가 2018-07-19 20:53:46 +09:00
Hide_D 9f7b18d294 시작 시 develcost가 0인 버그 해결 2018-07-19 20:50:29 +09:00
Hide_D 9af0e351b8 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-19 20:06:51 +09:00
Hide_D 5c6aa2340d 공백지 시나리오에 특기 연령 문제 해결 2018-07-19 20:06:39 +09:00
Hide_D 4424ec48cf 전투시 병종 명 버그 수정 2018-07-19 10:59:01 +09:00
Hide_D 61be34581e 반복 버튼 키움 2018-07-19 02:33:59 +09:00
Hide_D 731978356d Credit 양식 추가 2018-07-19 02:29:03 +09:00
Hide_D d5223ad1ab 리셋 시 사령부 Command encode가 제대로 이뤄지지 않았던 버그 수정 2018-07-19 01:42:16 +09:00
Hide_D 7cfdfab198 연감에서도 비교적 빠르게 동작하도록 설정 2018-07-19 01:31:13 +09:00
Hide_D eb70e51ac1 실시간 맵은 캐싱하도록 처리 2018-07-19 01:21:00 +09:00
Hide_D 1d48e7c7ae 영웅 난무 220 제목 변경 2018-07-19 00:51:47 +09:00
Hide_D d6fc9fc8c3 지도가 들어간 곳에 부트스트랩 추가 2018-07-19 00:46:15 +09:00
Hide_D 8ada0976fe 연감에 부트스트랩 없는 문제 해결 2018-07-19 00:44:01 +09:00
Hide_D 389ff5e9a4 지도에 도시명 켬끔 추가 2018-07-19 00:39:05 +09:00
Hide_D 5179e0228c 최대 스탯 표기 변경 2018-07-18 23:44:41 +09:00
Hide_D 2268526314 내 정보 페이지 툴팁 안나오는 문제 2018-07-18 23:14:52 +09:00
Hide_D db4bc0eafe 도시 좌표 업데이트 2018-07-18 23:11:02 +09:00
Hide_D 6edaf79df1 출력 병종 에러 2018-07-18 22:26:15 +09:00
Hide_D 79cead3b59 도시 css contain 2018-07-18 22:24:22 +09:00
Hide_D db1b12b85c 훈련에서 사기 하락 문구 삭제 2018-07-18 16:54:25 +09:00
Hide_D 9360b7675a 천인 강림 극 소형맵 2018-07-18 14:23:12 +09:00
Hide_D 9c82fd17fe 훈련시 사기 감소하지 않음 2018-07-18 11:18:33 +09:00
Hide_D 3a4665e473 맵 업데이트 2018-07-18 10:46:33 +09:00
Hide_D b34f4648ee 호로->사수, 몇몇 소성들 다시 진,수로 롤백 2018-07-18 10:41:06 +09:00
Hide_D 0de786d2ea 쿼리 받아오는 것 수정 2018-07-18 09:28:53 +09:00
Hide_D ec7aafa1ff history 받아오는 버그 수정 2018-07-18 09:28:10 +09:00
74 changed files with 4224 additions and 682 deletions
+1
View File
@@ -45,3 +45,4 @@ test.php
phpinfo.php
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
*.sqlite3
+2 -1
View File
@@ -19,7 +19,8 @@
"pguardiario/phpuri": "^1.0",
"symfony/lock": "^4.1",
"ezyang/htmlpurifier": "^4.10",
"xemlock/htmlpurifier-html5": "^0.1.7"
"xemlock/htmlpurifier-html5": "^0.1.7",
"catfan/medoo": "^1.5"
},
"autoload": {
"psr-4": {
Generated
+70 -11
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "43da7d5e9d8441faa4311f32b16ee1c0",
"content-hash": "3fceaf3c2925068c7e757ab12036e29e",
"packages": [
{
"name": "brandonwamboldt/utilphp",
@@ -52,6 +52,65 @@
],
"time": "2015-02-02T17:56:14+00:00"
},
{
"name": "catfan/medoo",
"version": "v1.5.7",
"source": {
"type": "git",
"url": "https://github.com/catfan/Medoo.git",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"shasum": ""
},
"require": {
"ext-pdo": "*",
"php": ">=5.4"
},
"suggest": {
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
"ext-pdo_mysql": "For MySQL or MariaDB database",
"ext-pdo_oci": "For Oracle database",
"ext-pdo_oci8": "For Oracle version 8 database",
"ext-pdo_pqsql": "For PostgreSQL database",
"ext-pdo_sqlite": "For SQLite database",
"ext-pdo_sqlsrv": "For MSSQL database"
},
"type": "framework",
"autoload": {
"psr-4": {
"Medoo\\": "/src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Angel Lai",
"email": "angel@catfan.me"
}
],
"description": "The lightest PHP database framework to accelerate development",
"homepage": "https://medoo.in",
"keywords": [
"database",
"lightweight",
"mariadb",
"mssql",
"mysql",
"oracle",
"php framework",
"postgresql",
"sql",
"sqlite"
],
"time": "2018-06-14T18:59:08+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
@@ -318,16 +377,16 @@
},
{
"name": "leafo/scssphp",
"version": "v0.7.6",
"version": "v0.7.7",
"source": {
"type": "git",
"url": "https://github.com/leafo/scssphp.git",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794"
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/585f6ae84de62ffecf69c23805f25d78d7e4b794",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"shasum": ""
},
"require": {
@@ -366,7 +425,7 @@
"scss",
"stylesheet"
],
"time": "2018-05-24T02:18:53+00:00"
"time": "2018-07-22T01:22:08+00:00"
},
{
"name": "league/plates",
@@ -751,16 +810,16 @@
},
{
"name": "symfony/lock",
"version": "v4.1.0",
"version": "v4.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a"
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/a1df50492e927ad00ca271f29adb2949a14f2a5a",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a",
"url": "https://api.github.com/repos/symfony/lock/zipball/d508b5dd92272cb74300396ecaadde969d0f7976",
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976",
"shasum": ""
},
"require": {
@@ -808,7 +867,7 @@
"redlock",
"semaphore"
],
"time": "2018-05-30T07:26:09+00:00"
"time": "2018-06-21T11:15:46+00:00"
},
{
"name": "vlucas/valitron",
+1
View File
@@ -61,6 +61,7 @@ a.just_link {
}
button.with_skin {
padding:0 4px;
background-color: black; color: white;
font-family: '맑은 고딕';
font-size: 13px;
+11
View File
@@ -87,6 +87,17 @@ input::-webkit-input-placeholder {
align-items: center;
}
.full-content {
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
margin:0;
padding:0;
z-index:800;
}
#btn_kakao_login{
cursor: pointer;
height:46px;
+1 -1
View File
@@ -1,7 +1,7 @@
@charset "utf-8";
#user_info_container{
width:500px;
width:550px;
position:absolute;
left:50%;
margin-left:-250px;
+67 -21
View File
@@ -49,40 +49,86 @@ function getFriendlyErrorType($type)
return "{$type}";
}
function getExceptionTraceAsString($exception) {
//https://gist.github.com/abtris/1437966
$rtn = "";
$count = 0;
$rtn = [];
foreach ($exception->getTrace() as $frame) {
$args = "";
if (isset($frame['args'])) {
$args = array();
foreach ($frame['args'] as $arg) {
if (is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (is_array($arg)) {
$args[] = "Array";
} elseif (is_null($arg)) {
$args[] = 'NULL';
} elseif (is_bool($arg)) {
$args[] = ($arg) ? "true" : "false";
} elseif (is_object($arg)) {
$args[] = get_class($arg);
} elseif (is_resource($arg)) {
$args[] = get_resource_type($arg);
} else {
$args[] = $arg;
}
}
$args = join(", ", $args);
}
$rtn[] = sprintf( "#%s %s(%s): %s(%s)",
$count,
isset($frame['file']) ? $frame['file'] : 'unknown file',
isset($frame['line']) ? $frame['line'] : 'unknown line',
(isset($frame['class'])) ? $frame['class'].$frame['type'].$frame['function'] : $frame['function'],
$args );
$count++;
}
return $rtn;
}
function logError(string $err, string $errstr, array $trace){
$fdb = FileDB::db(ROOT.'/d_log/err_log.sqlite3', ROOT.'/f_install/sql/err_log.sql');
$date = date("Ymd_His");
$trace = array_map(function(string $text){
return str_replace(ROOT, '{ROOT}', $text);
}, $trace);
$fdb->insert('err_log', [
'date'=>$date,
'err'=>$err,
'errstr'=>$errstr,
'trace'=>Json::encode($trace)
]);
}
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext){
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
$date = date("Ymd_His");
$e = new \Exception();
$data = Json::encode([
'date'=>$date,
'err'=>getFriendlyErrorType($errno),
'errstr'=>$errstr,
'trace'=>explode("\n", $e->getTraceAsString())
], Json::PRETTY);
file_put_contents(ROOT.'/d_log/err_log.txt',"$data\n", FILE_APPEND);
logError(
getFriendlyErrorType($errno),
$errstr,
getExceptionTraceAsString($e)
);
}
set_error_handler("\sammo\logErrorByCustomHandler");
function logExceptionByCustomHandler(\Throwable $e){
$date = date("Ymd_His");
$data = Json::encode([
'date'=>$date,
'err'=>get_class($e),
'errstr'=>$e->getMessage(),
'trace'=>explode("\n", $e->getTraceAsString())
], Json::PRETTY);
file_put_contents(ROOT.'/d_log/err_log.txt',"$data\n", FILE_APPEND);
logError(
get_class($e),
$e->getMessage(),
getExceptionTraceAsString($e)
);
echo $e->getTraceAsString();
throw $e;
}
+10
View File
@@ -0,0 +1,10 @@
CREATE TABLE IF NOT EXISTS `err_log` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`date` TEXT NOT NULL,
`err` TEXT NOT NULL,
`errstr` TEXT NOT NULL,
`trace` TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS `date` ON `err_log` (
`date` DESC
);
+5
View File
@@ -65,20 +65,25 @@
/*미니체 지도*/
.map_theme_miniche.map_spring .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_spring.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_summer .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_summer.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_fall .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_fall.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_winter .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_winter.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche .map_bgroad{
background: url('_tK_gameImagePath_/map/che/miniche_road.png') no-repeat;
background-size: 700px 500px;
}
+2
View File
@@ -6,6 +6,8 @@ include "func.php";
$btn = Util::getReq('btn');
$weap = Util::getReq('weap', 'int');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg', 'string');
extractMissingPostToGlobals();
+27 -20
View File
@@ -85,22 +85,22 @@ foreach (getAllNationStaticInfo() as $nation) {
}
switch ($type) { //FIXME: $query 처리 조심.
case 1: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by nation"; break;
case 2: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by leader desc"; break;
case 3: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by power desc"; break;
case 4: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by intel desc"; break;
case 5: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 6: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by dedication desc"; break;
case 7: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by level desc"; break;
case 8: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by killturn"; break;
case 1: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by nation"; break;
case 2: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by leader desc"; break;
case 3: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by power desc"; break;
case 4: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by intel desc"; break;
case 5: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 6: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by dedication desc"; break;
case 7: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by level desc"; break;
case 8: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by killturn"; break;
default:
case 9: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by connect desc"; break;
case 10: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 11: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by personal"; break;
case 12: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special desc"; break;
case 13: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special2 desc"; break;
case 14: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by age desc"; break;
case 15: $query = "select picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by npc desc"; break;
case 9: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by connect desc"; break;
case 10: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 11: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by personal"; break;
case 12: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special desc"; break;
case 13: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special2 desc"; break;
case 14: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by age desc"; break;
case 15: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by npc desc"; break;
}
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($genresult);
@@ -136,20 +136,20 @@ for ($j=0; $j < $gencount; $j++) {
$lbonus = 0;
}
if ($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
$lbonus = "";
$lbonusText = "";
}
if ($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
$leader = "<font color=red>{$leader}</font>{$lbonus}";
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonus}";
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$intel = "{$general['intel']}";
}
@@ -166,7 +166,14 @@ for ($j=0; $j < $gencount; $j++) {
$imageTemp = GetImageURL($general['imgsvr']);
echo "
<tr>
<tr data-general-id='{$general['no']}'
data-general-wounded='{$general['injury']}'
data-general-leadership='{$general['leader']}'
data-general-leadership-bonus='{$lbonus}'
data-general-power='{$general['power']}'
data-general-intel='{$general['intel']}'
data-is-npc='".($general['npc']>=2?'true':'false')."'
>
<td align=center><img width='64' height='64' src={$imageTemp}/{$general['picture']}></img></td>
<td align=center>$name</td>
<td align=center>{$general['age']}세</td>
+15 -6
View File
@@ -15,7 +15,6 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
if(!$serverID){
$serverID = UniqueConst::$serverID;
@@ -27,9 +26,7 @@ if($serverID === UniqueConst::$serverID){
$admin = $gameStor->getValues(['startyear','year','month','map_theme']);
$query = "select con,turntime from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -42,11 +39,16 @@ if ($con >= 2) {
[$s_year, $s_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year ASC, month ASC LIMIT 1', $serverID);
$s = $s_year * 12 + $s_month;
if($s_year === null){
echo '인자 에러';
exit();
}
[$e_year, $e_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year DESC, month DESC LIMIT 1', $serverID);
$e = $e_year * 12 + $e_month;
if($serverID !== UniqueConst::$serverID){
$mapTheme = $db->queryFirstColumn('SELECT map FROM ng_games WHERE server_id=%s', $serverID)??'che';
$mapTheme = $db->queryFirstField('SELECT map FROM ng_games WHERE server_id=%s', $serverID)?:'che';
}
else{
$mapTheme = $admin['map_theme']??'che';
@@ -96,11 +98,13 @@ if ($month <= 0) {
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 연감</title>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS("js/map/theme_{$mapTheme}.js")?>
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/map.css')?>
@@ -165,10 +169,15 @@ $history = $db->queryFirstRow('SELECT log,genlog,nation,power,gen,city FROM hist
<tr><td><?=banner()?> </td></tr>
</table>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
reloadWorldMap({
targetJson:'j_map_history.php?year=<?=$year?>&month=<?=$month?>&serverID=<?=$serverID?>',
showMe:false,
neutralView:true
neutralView:true,
useCachedMap:false,
year:<?=$year?>,
month:<?=$month?>,
});
</script>
</body>
+6 -1
View File
@@ -31,20 +31,25 @@ if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 세력도</title>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('d_shared/base_map.js')?>
<?=WebUtil::printJS('js/map.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
neutralView:true,
showMe:true
showMe:true,
useCachedMap:true
});
});
</script>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/normalize.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+158 -77
View File
@@ -170,7 +170,7 @@ if($valid == 0 && $session->userGrade < 5) {
$city = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $citylist);
$nation = getNationStaticInfo($city['nation']);
$cityNation = getNationStaticInfo($city['nation']);
//태수, 군사, 시중
$gen1 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $city['gen1']);
@@ -180,81 +180,7 @@ $gen3 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $cit
if($city['trade'] == 0) {
$city['trade'] = "- ";
}
?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
</table>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=12 align=center style=color:"<?=newColor($nation['color'])?>"; bgcolor=<?=$nation['color']?>>【 <?=CityConst::$regionMap[$city['region']]?> | <?=CityConst::$levelMap[$city['level']]?> 】 <?=$city['name']?></td>
</tr>
<tr>
<td align=center width=46 class=bg1>주민</td>
<td align=center width=140><?=$city['pop']?>/<?=$city['pop2']?></td>
<td align=center width=46 class=bg1>농업</td>
<td align=center width=140><?=$city['agri']?>/<?=$city['agri2']?></td>
<td align=center width=46 class=bg1>상업</td>
<td align=center width=140><?=$city['comm']?>/<?=$city['comm2']?></td>
<td align=center width=46 class=bg1>치안</td>
<td align=center width=140><?=$city['secu']?>/<?=$city['secu2']?></td>
<td align=center width=46 class=bg1>수비</td>
<td align=center width=140><?=$city['def']?>/<?=$city['def2']?></td>
<td align=center width=46 class=bg1>성벽</td>
<td align=center width=140><?=$city['wall']?>/<?=$city['wall2']?></td>
</tr>
<tr>
<td align=center class=bg1>민심</td>
<td align=center><?=$city['rate']?></td>
<td align=center class=bg1>시세</td>
<td align=center><?=$city['trade']?>%</td>
<td align=center class=bg1>인구</td>
<td align=center><?=round($city['pop']/$city['pop2']*100, 2)?>%</td>
<td align=center class=bg1>태수</td>
<td align=center><?=$gen1['name']??'-'?></td>
<td align=center class=bg1>군사</td>
<td align=center><?=$gen2['name']??'-'?></td>
<td align=center class=bg1>시중</td>
<td align=center><?=$gen3['name']??'-'?></td>
</tr>
<tr>
<td align=center class=bg1>장수</td>
<td colspan=11>
<?php
$query = "select name, npc from general where city='{$city['city']}' and nation='{$city['nation']}'"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
if($gencount == 0) echo "-";
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($genresult);
echo "{$general['name']}, ";
}
?>
</td>
</tr>
</table>
<br>
<table align=center class='tb_layout bg0'>
<thead>
<tr>
<td width=64 align=center class=bg1>얼 굴</td>
<td width=128 align=center class=bg1>이 름</td>
<td width=48 align=center class=bg1>통솔</td>
<td width=48 align=center class=bg1>무력</td>
<td width=48 align=center class=bg1>지력</td>
<td width=78 align=center class=bg1>관 직</td>
<td width=28 align=center class=bg1>守</td>
<td width=78 align=center class=bg1>병 종</td>
<td width=78 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=280 align=center class=bg1>명 령</td>
</tr></thead><tbody class='bg0' id='general_list'>
<?php
$query = "select npc,mode,no,picture,imgsvr,name,injury,leader,power,intel,level,nation,crewtype,crew,train,atmos,term,turn0,turn1,turn2,turn3,turn4,turn5 from general where city='{$city['city']}' order by dedication desc"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -266,6 +192,9 @@ foreach(getAllNationStaticInfo() as $nation){
$nationlevel[$nation['nation']] = $nation['level'];
}
//도시명 오 적군 0/0(0) 병장(총) 0/0(4) 90병장 0/0 60병장 0/0 수비○ 0/0
$generalsFormat = [];
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
@@ -340,7 +269,7 @@ for($j=0; $j < $gencount; $j++) {
$turnText = '';
}
echo $templates->render('cityGeneral', [
$generalsFormat[] = [
'ourGeneral'=>$ourGeneral,
'isNPC'=>$isNPC,
'wounded'=>$wounded,
@@ -366,7 +295,159 @@ for($j=0; $j < $gencount; $j++) {
'nation'=>$nation,
'nationName'=>$nationName,
'turnText'=>$turnText
]);
];
}
$generalsName = array_map(function($gen){return $gen['name'];}, $generalsFormat);
$enemyCrew = 0;
$enemyCnt = 0;
$enemyArmedCnt = 0;
$crew90 = 0;
$gen90 = 0;
$crew80 = 0;
$gen80 = 0;
$crew60 = 0;
$gen60 = 0;
$crewDef = 0;
$genDef = 0 ;
$crewTotal = 0;
$armedGenTotal = 0;
$genTotal = 0;
foreach($generalsFormat as $general){
if($general['nation'] == 0){
continue;
}
if($general['nation'] != $myNation['nation']){
$enemyCnt += 1;
$enemyCrew += $general['crew'];
if($general['crew'] > 0){
$enemyArmedCnt += 1;
}
continue;
}
$crewTotal += $general['crew'];
$genTotal += 1;
if($general['crew'] == 0){
continue;
}
$armedGenTotal += 1;
if($general['train'] >= 90 && $general['atmos'] >= 90){
$crew90 += $general['crew'];
$gen90 += 1;
}
$chkDef = false;
if($general['train'] >= 80 && $general['atmos'] >= 80){
$crew80 += $general['crew'];
$gen80 += 1;
if($general['defenceMode'] == 2){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
if($general['train'] >= 60 && $general['atmos'] >= 60){
$crew60 += $general['crew'];
$gen60 += 1;
if($general['defenceMode'] == 1 && !$chkDef){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
}
?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
</table>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=11 align=center style='color:<?=newColor($cityNation['color'])?>; background:<?=$cityNation['color']?>'>【 <?=CityConst::$regionMap[$city['region']]?> | <?=CityConst::$levelMap[$city['level']]?> 】 <?=$city['name']?></td>
<td style='color:<?=newColor($cityNation['color'])?>; background:<?=$cityNation['color']?>' class='center'><?=date('m-d H:i:s')?></td>
</tr>
<tr>
<td align=center width=48 class=bg1>주민</td>
<td align=center width=112><?=$city['pop']?>/<?=$city['pop2']?></td>
<td align=center width=48 class=bg1>농업</td>
<td align=center width=108><?=$city['agri']?>/<?=$city['agri2']?></td>
<td align=center width=48 class=bg1>상업</td>
<td align=center width=108><?=$city['comm']?>/<?=$city['comm2']?></td>
<td align=center width=48 class=bg1>치안</td>
<td align=center width=108><?=$city['secu']?>/<?=$city['secu2']?></td>
<td align=center width=48 class=bg1>수비</td>
<td align=center width=108><?=$city['def']?>/<?=$city['def2']?></td>
<td align=center width=48 class=bg1>성벽</td>
<td align=center width=108><?=$city['wall']?>/<?=$city['wall2']?></td>
</tr>
<tr>
<td align=center class=bg1>민심</td>
<td align=center><?=$city['rate']?></td>
<td align=center class=bg1>시세</td>
<td align=center><?=$city['trade']?>%</td>
<td align=center class=bg1>인구</td>
<td align=center><?=round($city['pop']/$city['pop2']*100, 2)?>%</td>
<td align=center class=bg1>태수</td>
<td align=center><?=$gen1['name']??'-'?></td>
<td align=center class=bg1>군사</td>
<td align=center><?=$gen2['name']??'-'?></td>
<td align=center class=bg1>시중</td>
<td align=center><?=$gen3['name']??'-'?></td>
</tr>
<tr>
<td align=center class=bg1>도시명</td>
<td align=center><?=$city['name']?></td>
<td align=center class=bg1>적군</td>
<td align=center><?=number_format($enemyCrew)?>/<?=number_format($enemyArmedCnt)?>(<?=number_format($enemyCnt)?>)</td>
<td align=center class=bg1>병장(총)</td>
<td align=center><?=number_format($crewTotal)?>/<?=number_format($armedGenTotal)?>(<?=number_format($genTotal)?>)</td>
<td align=center class=bg1>90병장</td>
<td align=center><?=number_format($crew90)?>/<?=number_format($gen90)?></td>
<td align=center class=bg1>60병장</td>
<td align=center><?=number_format($crew60)?>/<?=number_format($gen60)?></td>
<td align=center class=bg1>수비○</td>
<td align=center><?=number_format($crewDef)?>/<?=number_format($genDef)?></td>
</tr>
<tr>
<td align=center class=bg1>장수</td>
<td colspan=11><?=join(', ', $generalsName)?></td>
</tr>
</table>
<br>
<table align=center class='tb_layout bg0'>
<thead>
<tr>
<td width=64 align=center class=bg1>얼 굴</td>
<td width=128 align=center class=bg1>이 름</td>
<td width=48 align=center class=bg1>통솔</td>
<td width=48 align=center class=bg1>무력</td>
<td width=48 align=center class=bg1>지력</td>
<td width=78 align=center class=bg1>관 직</td>
<td width=28 align=center class=bg1>守</td>
<td width=78 align=center class=bg1>병 종</td>
<td width=78 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=280 align=center class=bg1>명 령</td>
</tr></thead>
<tbody class='bg0' id='general_list'>
<?php
foreach($generalsFormat as $general){
echo $templates->render('cityGeneral', $general);
}
?>
</tbody>
+1 -1
View File
@@ -225,7 +225,7 @@ if ($budgetricediff > 0) {
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 &amp; 임관 권유 메시지</td></tr>
<tr><td colspan=2 class=bg1>국가 방침 <textarea <?=$read?> maxlength=16000 rows="5" style="color:white;background-color:black;width:830px;" name=msg><?=$nation['msg']?></textarea><input type=<?=$btn?> name=btn value=국가방침></td></tr>
<tr><td colspan=2 class=bg1>임관 권유 <input type=text <?=$read?> maxlength=1000 style=color:white;background-color:black;width:830px; name=scoutmsg value='<?=$nation['scoutmsg']?>'><input type=<?=$btn?> name=btn value=임관권유></td></tr>
<tr><td colspan=2>870 x 200px 넘는 크기를 점유할 시 통보없이 제한될 수 있습니다.</td></tr>
<tr><td colspan=2>870px x 200px어서는 내용은 표시되지 않습니다.</td></tr>
<tr><td colspan=2 height=10></td></tr>
<tr><td colspan=2 align=center bgcolor=green>예 산 &amp; 정 책</td></tr>
<tr>
+6 -2
View File
@@ -80,21 +80,25 @@ foreach ($db->queryAllLists('SELECT city, `name`, conflict FROM city WHERE confl
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 중원 정보</title>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('d_shared/base_map.js')?>
<?=WebUtil::printJS('js/map.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
neutralView:true,
showMe:true
showMe:true,
useCachedMap:true
});
});
</script>
<?=WebUtil::printCSS('css/normalize.css')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/map.css')?>
+108 -87
View File
@@ -9,8 +9,6 @@ if ($type <= 0 || $type > 8) {
$type = 7;
}
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
@@ -19,7 +17,7 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("암행부", 2);
increaseRefresh("암행부", 1);
$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
@@ -43,6 +41,8 @@ if ($me['level'] == 0 || ($me['level'] == 1 && $me['belong'] < $nation['secretli
$sel = [];
$sel[$type] = "selected";
$templates = new \League\Plates\Engine('templates');
?>
<!DOCTYPE html>
<html>
@@ -65,7 +65,7 @@ $sel[$type] = "selected";
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td>암 행 부<br><?=closeButton()?></td></tr>
<tr><td><form name=form1 method=post>정렬순서 :
<tr><td><form name=form1 method=get>정렬순서 :
<select name=type size=1>
<option <?=$sel[1]??''?> value=1>자금</option>
<option <?=$sel[2]??''?> value=2>군량</option>
@@ -80,54 +80,28 @@ $sel[$type] = "selected";
</td></tr>
</table>
<?php
$query = "select troop,name from troop where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$troopCount = MYDB_num_rows($result);
$troopName = [];
for ($i=0; $i < $troopCount; $i++) {
$troop = MYDB_fetch_array($result);
$troopName[$troop['troop']] = $troop['name'];
foreach($db->queryAllLists('SELECT troop, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){
$troopName[$troopID] = $tName;
}
$orderSQL = '';
switch ($type) {
case 1: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by gold desc"; break;
case 2: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by rice desc"; break;
case 3: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by city"; break;
case 4: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by crewtype desc"; break;
case 5: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by crew desc"; break;
case 6: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by killturn"; break;
case 7: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by turntime"; break;
case 8: $query = "select npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general where nation='{$me['nation']}' order by troop desc"; break;
case 1: $orderSQL = "order by gold desc"; break;
case 2: $orderSQL = "order by rice desc"; break;
case 3: $orderSQL = "order by city"; break;
case 4: $orderSQL = "order by crewtype desc"; break;
case 5: $orderSQL = "order by crew desc"; break;
case 6: $orderSQL = "order by killturn"; break;
case 7: $orderSQL = "order by turntime"; break;
case 8: $orderSQL = "order by troop desc"; break;
}
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($genresult);
?>
<table align=center id='general_list' class='tb_layout bg0'>
<thead>
<tr>
<td width=98 align=center class=bg1>이 름</td>
<td width=98 align=center class=bg1>통무지</td>
<td width=98 align=center class=bg1>부 대</td>
<td width=58 align=center class=bg1>자 금</td>
<td width=58 align=center class=bg1>군 량</td>
<td width=48 align=center class=bg1>도시</td>
<td width=28 align=center class=bg1>守</td>
<td width=58 align=center class=bg1>병 종</td>
<td width=68 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=148 align=center class=bg1>명 령</td>
<td width=58 align=center class=bg1>삭턴</td>
<td width=58 align=center class=bg1>턴</td>
</tr>
</thead>
<tbody>
<?php
for ($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$city = CityConst::byID($general['city'])->name;
$troop = $troopName[$general['troop']]??'-';
$generals = $db->query('SELECT npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general WHERE nation = %i %l', $me['nation'], $orderSQL);
foreach ($generals as &$general) {
$general['cityText'] = CityConst::byID($general['city'])->name;
$general['troopText'] = $troopName[$general['troop']]??'-';
if ($general['level'] == 12) {
$lbonus = $nation['level'] * 2;
@@ -137,81 +111,128 @@ for ($j=0; $j < $gencount; $j++) {
$lbonus = 0;
}
if ($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
$lbonus = "";
$lbonusText = "";
}
$general['lbonus'] = $lbonus;
$general['lbonusText'] = $lbonusText;
if ($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
$leader = "<font color=red>{$leader}</font>{$lbonus}";
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonus}";
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$intel = "{$general['intel']}";
}
$general['leaderText'] = $leader;
$general['powerText'] = $power;
$general['intelText'] = $intel;
$general['expLevelText'] = getExpLevel($general['experience']);
if ($general['npc'] >= 2) {
$name = "<font color=cyan>{$general['name']}</font>";
} elseif ($general['npc'] == 1) {
$name = "<font color=skyblue>{$general['name']}</font>";
} else {
$name = "{$general['name']}";
$name = $general['name'];
}
//TODO: npc 코드를 일원화
$general['nameText'] = $name;
switch ($general['mode']) {
case 0: $mode = "×"; break;
case 1: $mode = "○"; break;
case 2: $mode = "◎"; break;
case 0: $mode = "×"; break;
case 1: $mode = "○"; break;
case 2: $mode = "◎"; break;
}
$general['modeText'] = $mode;
$general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name;
echo "
<tr>
<td class='i_name' align=center><span class='t_name'>$name</span><br>Lv <span class='t_explevel'>".getExpLevel($general['experience'])."</span></td>
<td class='i_stat' align=center>{$leader}∥{$power}∥{$intel}</td>
<td class='i_troop' align=center>$troop</td>
<td class='i_gold' align=center>{$general['gold']}</td>
<td class='i_rice' align=center>{$general['rice']}</td>
<td class='i_city' align=center>$city</td>
<td align=center>$mode</td>
<td class='i_crewtype' align=center>".GameUnitConst::byId($general['crewtype'])->name."</td>
<td class='i_crew' align=center>{$general['crew']}</td>
<td class='i_train' align=center>{$general['train']}</td>
<td class='i_atmos' align=center>{$general['atmos']}</td>";
if ($general['npc'] >= 2) {
echo "
<td class='i_action'>
<font size=3>NPC 장수";
} else {
echo "
<td class='i_action'>
<font size=1>";
if ($general['npc'] < 2) {
$turntext = [];
$turn = getTurn($general, 1, 0);
for ($i=0; $i < 5; $i++) {
$turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 20);
$turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 41);
$k = $i+1;
echo "
&nbsp;$k : $turn[$i] <br>";
$turntext[] = "&nbsp;$k : $turn[$i]";
}
$general['turntext'] = join("<br>\n", $turntext);
}
echo "
</font>
</td>
<td align=center>{$general['killturn']}</td>
<td class='i_turntime' align=center>".substr($general['turntime'], 14, 5)."</td>
</tr>";
}
echo "
unset($general);
$genCnt = count($generals);
$totalGold = 0;
$totalRice = 0;
$crew90 = 0;
$gen90 = 0;
$crew80 = 0;
$gen80 = 0;
$crew60 = 0;
$gen60 = 0;
$crewTotal = 0;
//$genTotal = 0;
foreach($generals as $general){
$totalGold += $general['gold'];
$totalRice += $general['rice'];
$crewTotal += $general['crew'];
if($general['crew'] == 0){
continue;
}
if($general['train'] >= 90 && $general['atmos'] >= 90){
$crew90 += $general['crew'];
$gen90 += 1;
}
if($general['train'] >= 80 && $general['atmos'] >= 80){
$crew80 += $general['crew'];
$gen80 += 1;
}
if($general['train'] >= 60 && $general['atmos'] >= 60){
$crew60 += $general['crew'];
$gen60 += 1;
}
}
?>
<table style='width:1000px;margin:5px auto' class='tb_layout bg0'>
<thead>
<colgroup>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
</colgroup>
</thead>
<tbody>
<tr>
<td class='bg1'>전체 금</td><td><?=number_format($totalGold)?></td>
<td class='bg1'>전체 쌀</td><td><?=number_format($totalRice)?></td>
<td class='bg1'>평균 금</td><td><?=number_format($totalGold/$genCnt, 2)?></td>
<td class='bg1'>평균 쌀</td><td><?=number_format($totalRice/$genCnt, 2)?></td>
</tr>
<tr>
<td class='bg1'>전체 병력/장수</td><td><?=number_format($crewTotal)?>/<?=number_format($genCnt)?></td>
<td class='bg1'>훈사 90 병력/장수</td><td><?=number_format($crew90)?>/<?=number_format($gen90)?></td>
<td class='bg1'>훈사 80 병력/장수</td><td><?=number_format($crew80)?>/<?=number_format($gen80)?></td>
<td class='bg1'>훈사 60 병력/장수</td><td><?=number_format($crew60)?>/<?=number_format($gen60)?></td>
</tr>
</tbody>
</table>
";
?>
<?=$templates->render('generalList', ['generals'=>$generals])?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=closeButton()?></td></tr>
+4
View File
@@ -81,6 +81,10 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 내정보</title>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+2 -1
View File
@@ -74,7 +74,8 @@ for($i=0; $i < $troopcount; $i++) {
$turn = "";
for($k=0; $k < 5; $k++) {
$m = $k+1;
if($general["turn{$k}"] == 26) {
$turnK = DecodeCommand($general["turn{$k}"]);
if($turnK[0] == 26) {
$turn .= "&nbsp;$m : 집합<br>";
} else {
$turn .= "&nbsp;$m : <br>";
+19 -2
View File
@@ -134,8 +134,25 @@ if($btn == "추방") {
$log[] = "<C>●</><D><b>{$nation['name']}</b></>에서 <R>추방</>당하였습니다.";
// 재야로, 국가 무소속으로, 명성/공헌 N*10%감소
$query = "update general set level=0,nation=0,belong=0,betray=betray+1,makelimit='12',gold='{$general['gold']}',rice='{$general['rice']}',dedication=dedication*(1-0.1*betray),experience=experience*(1-0.1*betray) where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($admin['year'] <= $admin['startyear'] && $general['npc'] < 2){
$db->update('general', [
'level'=>0,
'nation'=>0,
'belong'=>0,
], 'no=%i', $general['no']);
}
else{
$db->update('general', [
'level'=>0,
'nation'=>0,
'belong'=>0,
'betray'=>$db->sqleval('betray + 1'),
'makelimit'=>12,
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'dedication'=>$db->sqleval('dedication * (1 - 0.1*betray)'),
], 'no=%i', $general['no']);
}
}
// 부대 처리
$query = "select no from troop where troop='{$general['troop']}'";
+7
View File
@@ -195,3 +195,10 @@ div.bar_out div.bar_in{
.tooltiptext {
display: none;
}
.btn-group-xs > .btn, .btn-xs {
padding : .25rem .4rem;
font-size : .875rem;
line-height : .5;
border-radius : .2rem;
}
+18
View File
@@ -51,6 +51,20 @@
top:0;
}
.map_body .map_button_stack{
position:absolute;
right:0;
bottom:0;
}
.map_body .map_toggle_cityname::after{
content: "끄기"
}
.map_body .map_toggle_cityname.active::after{
content: "켜기"
}
.world_map .city_tooltip{
position: absolute;
z-index:6;
@@ -104,6 +118,10 @@
color:white;
}
.world_map.hide_cityname .city_detail_name{
display:none;
}
.city_base{
position:absolute;
width:40px;
+8 -4
View File
@@ -424,7 +424,7 @@ function addCommand($typename, $value, $valid = 1, $color=0) {
function commandGroup($typename, $type=0) {
if($type == 0) {
echo "
<optgroup label='{$typename}' style=color:skyblue;background-color:black;>";
<optgroup label='{$typename}' style='color:skyblue;background-color:black;'>";
} else {
echo "
</optgroup>";
@@ -524,7 +524,7 @@ function commandTable() {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31);
addCommand("징병(통솔경험)", 11);
addCommand("모병(통솔경험, 자금x2)", 12);
addCommand("훈련(통솔경험, 사기↓)", 13);
addCommand("훈련(통솔경험)", 13);
addCommand("사기진작(통솔경험, 자금↓)", 14);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15);
addCommand("출병", 16);
@@ -532,7 +532,7 @@ function commandTable() {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31, 0);
addCommand("징병(통솔경험)", 11, 0);
addCommand("모병(통솔경험, 자금x2)", 12, 0);
addCommand("훈련(통솔경험, 사기↓)", 13, 0);
addCommand("훈련(통솔경험)", 13, 0);
addCommand("사기진작(통솔경험, 자금↓)", 14, 0);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15, 0);
addCommand("출병", 16, 0);
@@ -699,7 +699,8 @@ function CoreCommandTable() {
if($city['supply'] == 0) { $valid = 0; }
echo "
<select name=commandtype size=1 style='height:20px;color:white;background-color:black;font-size:13px;>";
<select name=commandtype size=1 style='height:20px;color:white;background-color:black;font-size:13px;'>";
commandGroup("====== 휴 식 ======");
addCommand("휴 식", 99);
commandGroup("", 1);
commandGroup("====== 인 사 ======");
@@ -2664,6 +2665,9 @@ function searchDistance(int $from, int $maxDist=99, bool $distForm = false) {
}
function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) {
if($nation1 === $nation2){
return false;
}
$db = DB::db();
$nation1Cities = [];
+25 -15
View File
@@ -355,22 +355,32 @@ function getLevel($level, $nlevel=8) {
function getCall($leader, $power, $intel) {
$call = '평범';
if($leader >= GameConst::$chiefStatMin && $power >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '만능';
} elseif($leader >= GameConst::$chiefStatMin && $power >= GameConst::$chiefStatMin) {
$call = '용장';
} elseif($leader >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '지장';
} elseif($power >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '명장';
} elseif($leader >= GameConst::$chiefStatMin) {
$call = '사';
} elseif($power >= GameConst::$chiefStatMin) {
$call = '용맹';
} elseif($intel >= GameConst::$chiefStatMin) {
$call = '현명';
if($leader < 40){
if($power + $intel < $leader){
return '아둔';
}
if($intel >= GameConst::$chiefStatMin && $power < $intel * 0.8){
return '학자';
}
if($power >= GameConst::$chiefStatMin && $intel < $power * 0.8){
return '사';
}
return '명사';
}
return $call;
$maxStat = max($leader, $power, $intel);
$sum2Stat = min($leader+$power, $power+$intel, $intel+$leader);
if($maxStat >= GameConst::$chiefStatMin + GameConst::$statGradeLevel && $sum2Stat >= $maxStat * 1.7){
return '만능';
}
if($power >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $intel < $power * 0.8){
return '용장';
}
if($intel >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power < $intel * 0.8){
return '명장';
}
return '평범';
}
function getDed($dedication) {
+39 -35
View File
@@ -210,12 +210,9 @@ function processAI($no) {
$coreCommand = MYDB_fetch_array($result);
}
$attackable = 0;
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front=1";
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
$cityCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND supply=1 AND front=1', $general['nation']);
// 공격가능도시 있으면 1
if($cityCount > 0) { $attackable = 1; }
$attackable = $cityCount > 0;
$dipState = 0;
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term>8";
@@ -379,7 +376,7 @@ function processAI($no) {
//군주가 할일
if($general['level'] == 12) {
//오랑캐인데 공격 못하면 바로 방랑/해산
if($general['npc'] == 5 && $dipState == 0 && $attackable == 0) {
if($general['npc'] == 5 && $dipState == 0 && !$attackable) {
//방랑군이냐 아니냐
if($nation['level'] == 0) {
// 해산
@@ -445,37 +442,44 @@ function processAI($no) {
}
} else {
//외교 평시에 선포
if($dipState == 0 && $attackable == 0) {
//전방 체크 먼저
do{
if($dipState != 0){
break;
}
if($attackable){
break;
}
SetNationFront($nation['nation']);
$query = "select city from city where nation='{$general['nation']}' and front=1 limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI02 ".MYDB_error($connect),"");
$frontCount = MYDB_num_rows($result);
//근접 공백지 없을때
if($frontCount == 0) {
$query = "select (sum(pop/10)+sum(agri)+sum(comm)+sum(secu)+sum(def)+sum(wall))/(sum(pop2/10)+sum(agri2)+sum(comm2)+sum(secu2)+sum(def2)+sum(wall2))*100 as dev from city where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$devRate = MYDB_fetch_array($result);
//내정이 80% 이상일때
if($devRate['dev'] > 80) {
$query = "select nation from nation where level>0 order by rand()";
$result = MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
$nationCount = MYDB_num_rows($result);
for($i=0; $i < $nationCount; $i++) {
$youNation = MYDB_fetch_array($result);
if(isNeighbor($general['nation'], $youNation['nation'])) {
$command = EncodeCommand(0, 0, $youNation['nation'], 62);
$query = "update nation set l12turn0='$command' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
$rulerCommand = 1;
break;
}
}
}
$frontCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND front=1', $general['nation']);
if($frontCount > 0){
break;
}
}
$devRate = $db->queryFirstField('SELECT (sum(pop/10)+sum(agri)+sum(comm)+sum(secu)+sum(def)+sum(wall))/(sum(pop2/10)+sum(agri2)+sum(comm2)+sum(secu2)+sum(def2)+sum(wall2)) from city where nation=%i', $general['nation']);
if($devRate < 0.8){
break;
}
$nations = [];
foreach ($db->queryAllLists('SELECT nation, power FROM nation WHERE level>0') as [$youNationID, $youNationPower]) {
if(!isNeighbor($general['nation'], $youNationID)){
continue;
}
$nations[$youNationID] = 1/sqrt($youNationPower+1);
}
if(!$nations){
break;
}
$youNationID = Util::choiceRandomUsingWeight($nations);
$command = EncodeCommand(0, 0, $youNationID, 62);
$db->update('nation', [
'l12turn0'=>$command
], 'nation=%i', $general['nation']);
$rulerCommand = 1;
}while(false);
}
}
@@ -584,7 +588,7 @@ function processAI($no) {
$target = array();
// 평시거나 초반아니면서 공격가능 없으면서 병사 있으면 해제(25%)
if($dipState == 0 && $isStart == 0 && $attackable == 0 && $general['crew'] > 0 && rand()% 100 < 25) {
if($dipState == 0 && $isStart == 0 && !$attackable && $general['crew'] > 0 && rand()% 100 < 25) {
$command = EncodeCommand(0, 0, 0, 17); //소집해제
} elseif($dipState <= 1 || $isStart == 1) {
//평시이거나 선포있어도 초반이면
+9 -7
View File
@@ -917,8 +917,7 @@ function process_11(&$general, $type) {
$lbonus = setLeadershipBonus($general, $nationLevel);
//NOTE: 입력 변수는 100명 단위임
$crew = $rawCrew * 100;
$crew = $rawCrew * 100;
if($crew + $general['crew'] > getGeneralLeadership($general, true, true, true)*100) {
$crew = max(0, getGeneralLeadership($general, true, true, true) * 100 - $general['crew']);
}
@@ -929,6 +928,9 @@ function process_11(&$general, $type) {
}
$cost = $crewTypeObj->costWithTech($tech, $crew);
if($type === '모병') {
$cost *= 2;
}
//성격 보정
$cost = Util::round(CharCost($cost, $general['personal']));
@@ -976,7 +978,7 @@ function process_11(&$general, $type) {
$exp = Util::round($crew / 100);
$ded = Util::round($crew / 100);
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $crewType, $crew);
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $crewType, $crew/100);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
@@ -988,17 +990,17 @@ function process_11(&$general, $type) {
$general['gold'] -= $cost;
// 주민수 감소 // 민심 감소
if($type === '징병') {
$city['rate'] -= Util::round($crew / $city['pop']);
$city['rate'] -= Util::round(($crew / $city['pop'])*100);
}
else {
$city['rate'] -= Util::round($crew / 2 / $city['pop']);
$city['rate'] -= Util::round(($crew / 2 / $city['pop'])*100);
}
if($city['rate'] < 0) { $city['rate'] = 0; }
$db->update('city', [
'pop'=>$db->sqleval('pop-%i', $crew),
'rate'=>$city['rate']
], 'city = %i',$general['city']);
], 'city = %i', $general['city']);
// 통솔경험, 병종 변경, 병사수 변경, 훈련치 변경, 사기치 변경, 자금 군량 하락, 공헌도, 명성 상승
$general['leader2']++;
@@ -1788,7 +1790,7 @@ function process_41(&$general) {
} elseif($crewexp == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 모자랍니다. 단련 실패. <1>$date</>";
} else {
$crewstr = GameUnitConst::$typeData[GameUnitConst::byID($general['crewtype']->armType)];
$crewstr = GameUnitConst::allType()[GameUnitConst::byID($general['crewtype'])->armType];
if($ratio < 33) {
// 숙련도 증가
+9 -6
View File
@@ -95,9 +95,12 @@ $mapTheme = $admin['map_theme'];
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printJS('js/msg.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
hrefTemplate:'b_currentCity.php?citylist={0}'
hrefTemplate:'b_currentCity.php?citylist={0}',
useCachedMap:true
});
setInterval(function(){
@@ -237,11 +240,11 @@ else if($session->userGrade == 4){
<form name=form2 action=preprocessing.php method=post target=commandlist>
<tr>
<td rowspan=3 width=50 valign=top><?=turnTable()?></td>
<td width=646 style="border:none;text-align:center;"><?php cityInfo(); ?></td>
<td style="width:650px;border:none;text-align:center;"><?php cityInfo(); ?></td>
</tr>
<tr>
<td width=646 align=right>
<font color=cyan><b>←</b> Ctrl, Shift, 드래그로 복수선택 가능     반복&amp;수정<b>→</b></font>
<td style='width:650px;' align=right>
<font color=cyan><b>←</b> Ctrl, Shift, 드래그로 복수선택 가능  반복&amp;수정<b>→</b></font>
<select name=sel size=1 style=color:white;background-color:black;font-size:13px;>
<option value=1>1턴</option>
<option value=2>2턴</option>
@@ -255,11 +258,11 @@ else if($session->userGrade == 4){
<option value=10>10턴</option>
<option value=11>11턴</option>
<option value=12>12턴</option>
</select><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:50px;font-size:13px; value='반복' onclick='refreshing(this, 2,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▼미루기' onclick='refreshing(this, 2,1)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▲당기기' onclick='refreshing(this, 2,2)'>
</select><input type=button style='background-color:<?=GameConst::$basecolor2?>;color:white;width:70px;font-size:13px;margin-left:1ch;margin-right:2ch;' value='반복' onclick='refreshing(this, 2,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▼미루기' onclick='refreshing(this, 2,1)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▲당기기' onclick='refreshing(this, 2,2)'>
</td>
</tr>
<tr>
<td width=646 align=right style="border:none;">
<td align=right style="'width:650px;border:none;">
<?php commandTable(); ?>
<input id="mainBtnSubmit" type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='실 행' onclick='refreshing(this, 3,form2)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='갱 신' onclick='refreshing(this, 0,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;font-size:13px; value='로비로' onclick=location.replace('../')><br>
</td>
-2
View File
@@ -19,8 +19,6 @@ $username = Util::getReq('db_id');
$password = Util::getReq('db_pw');
$dbName = Util::getReq('db_name');
extractMissingPostToGlobals();
if(!$host || !$port || !$username || !$password || !$dbName){
Json::die([
'result'=>false,
-2
View File
@@ -8,8 +8,6 @@ $year = Util::getReq('year', 'int');
$month = Util::getReq('month', 'int');
$serverID = Util::getReq('serverID', 'string', null);
extractMissingPostToGlobals();
$url = '/a_history.php';
if(!strpos($_SERVER['HTTP_REFERER'], $url)) {
+1 -1
View File
@@ -170,7 +170,7 @@ $special = 0;
$admin = $gameStor->getValues(['scenario', 'turnterm', 'show_img_level']);
if ($admin['scenario'] > 0) {
if ($admin['scenario'] >= 1000) {
$specage2 = $age + 3;
$specage = $age + 3;
}
+52 -28
View File
@@ -9,19 +9,33 @@ $(function(){
var getUserType = function(,,){
var = ++;
if( < *0.2) {
if( < 40){
if(+ < ){
return "무능";
}
return "무지";
}else if( < *0.2) {
return "지";
}else if( < *0.2) {
return "무";
}else{
}
var 최대능력치 = Math.max(, , );
var 능력치2합 = Math.min(+, +, +);
if(최대능력치 >= 70 && 능력치2합 >= 최대능력치 * 1.7){
return "만능";
}
if( >= 60 && < *0.8){
return "무";
}
if( >= 60 && < *0.8){
return "지";
}
return "평범";
};
function formatScore(x) {
console.log(x);
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
@@ -53,27 +67,31 @@ $(function(){
var 장수명 = $.trim($tds.eq(1).text());
var 국가 = $.trim($tds.eq(6).text());
var 부상 = $this.data('general-wounded');
장수.html = $this.clone();
장수.장수명 = 장수명;
장수.국가 = 국가;
장수.벌점 = parseInt($tds.eq(-1).text());
장수. = parseInt($tds.eq(10).text().split('+')[0]);
장수. = parseInt($tds.eq(11).text().split('+')[0]);
장수. = parseInt($tds.eq(12).text().split('+')[0]);
장수. = parseInt($this.data('general-leadership'));
장수. = parseInt($this.data('general-power'));
장수. = parseInt($this.data('general-intel'));
장수.삭턴 = parseInt($tds.eq(-2).text());
장수.종류 = getUserType(장수., 장수., 장수.);
장수.의병 = 장수명[0]=="ⓜ" || 장수명[0]=="ⓖ";
장수.NPC = $this.data('is-npc');
if(!(국가 in 국가별)){
국가별[국가] = {};
국가별[국가].만능 = [];
국가별[국가]. = [];
국가별[국가]. = [];
국가별[국가].충차 = [];
국가별[국가].평범 = [];
국가별[국가].무지 = [];
국가별[국가]. = [];
//국가별[국가].의병 = [];
국가별[국가]. = [];
//국가별[국가].NPC = [];
}
//if(장수.의병) 국가별[국가].의병.push(장수);
//if(장수.NPC) 국가별[국가].NPC.push(장수);
국가별[국가][장수.종류].push(장수);
장수.html.hide();
@@ -93,8 +111,11 @@ $(function(){
var total = 0;
var 전투유저장수 = 0;
var 삭턴장수 = 0;
var 통솔합 = 0;
var 삭턴장수 = 0;
var 전투N장수 = 0;
var N장통솔합 = 0;
$td.html('<p class="sum" style="margin:0;font-weight:bold;color:yellow;text-align:center"></p>');
$td.css('text-indent','-5.8em').css('padding-left','5.8em');
for(var 종류명 in 국가정보){
@@ -130,15 +151,18 @@ $(function(){
$.each(테이블,function(idx,val){
var 종능 = val. + val. + val.;
if(종류명 == '무' || 종류명 == '지' || 종류명 == '충차'){
if(val.삭턴 >= 80 && !val.의병){
전투유저장수+=1;
console.log(val);
if(종류명 != '무능' && 종류명 != '무지'){
if(val.삭턴 >= 80 && !val.NPC){
전투유저장수 += 1;
if(종능 > 150) 통솔합 += val.;
else if(종능/0.75 >= 150)통솔합 += parseInt(val./0.75);
else if(종능/0.55 >= 150)통솔합 += parseInt(val./0.55);
else if(종능/0.35 >= 150)통솔합 += parseInt(val./0.35);
else if(종능/0.15 >= 150)통솔합 += parseInt(val./0.15);
통솔합 += val.;
}
if(val.삭턴 > 5 && val.NPC){
전투N장수 += 1;
N장통솔합 += val.;
}
}
@@ -146,11 +170,11 @@ $(function(){
var $obj2 = $('<span></span>');
$obj.html(val.장수명);
if(!val.의병 && val.삭턴 < 80){
if(!val.NPC && val.삭턴 < 80){
$obj.css('text-decoration','line-through');
삭턴장수+=1;
}
if(val.의병){
if(val.NPC){
$obj.css('color','cyan');
}
if(val.벌점 >= 1500) $obj.css('color','yellow');
@@ -179,7 +203,7 @@ $(function(){
$td.append($p);
}
var result = "* 총("+total+"), 전투장("+전투유저장수+", 약 "+formatScore(통솔합*100)+"명), 삭턴장("+삭턴장수+") *";
var result = "* 총("+total+"), 전투장("+전투유저장수+", 약 "+formatScore(통솔합*100)+"명), 전투N장("+전투N장수+", 약 "+formatScore(N장통솔합*100)+"명), 삭턴장("+삭턴장수+") *";
$tbl.find('.sum').html(result);
@@ -226,7 +250,7 @@ $(function(){
$btn.prop("disabled",true);
var $tr0 = $('table:eq(0) tr:eq(0)');
$tr0.append('<td><strong>*벌점 순 정렬*</strong><br><span style="color:yellow">벌점 1500점 이상</span>, <span style="color:lightgreen">벌점 200점 이상</span>, '+
'<span style="text-decoration:line-through">삭턴 장</span>, <span style="color:cyan">ⓝ장</span>'+'<br><strong>전투장 :</strong> 무장 + 지장 + 충차장 - 삭턴자(무,지,) </td>');
'<span style="text-decoration:line-through">삭턴장</span>, <span style="color:cyan">ⓝ장</span>'+'<br><strong>전투장 :</strong> 만능장 + 무장 + 지장 + 평범장 - 삭턴자(만능, 무, 지, 평범) </td>');
});
+81 -1
View File
@@ -13,6 +13,7 @@ function reloadWorldMap(option){
clickableAll:false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
selectCallback:null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
hrefTemplate:'#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
useCachedMap:false, //맵 캐시를 사용
//아래부터는 post query에 들어갈 녀석
year:null, //year값, 연감등에 사용
@@ -20,11 +21,15 @@ function reloadWorldMap(option){
aux:null, //기타 넣고 싶은 값을 입력
neutralView:false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
showMe:true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
targetJson:'j_map.php'
targetJson:'j_map.php',
//기타 보조 값
startYear:null,
};
option = $.extend(defaultOption, option);
var useCachedMap = option.useCachedMap;
var isDetailMap = option.isDetailMap;
var clickableAll = option.clickableAll;
var selectCallback = option.selectCallback;
@@ -32,6 +37,8 @@ function reloadWorldMap(option){
var cityPosition = getCityPosition();
var storedOldMapKey = 'sam.{0}.map'.format(serverNick);
var storedStartYear = 'sam.{0}.startYear'.format(serverNick);
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
function checkReturnObject(obj){
@@ -50,6 +57,13 @@ function reloadWorldMap(option){
return obj.promise();
}
if(useCachedMap){
localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj]));
localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear));
}
$world_map.removeClass('draw_required');
return obj;
}
@@ -420,6 +434,25 @@ function reloadWorldMap(option){
return obj;
}
var $hideCityNameBtn = $world_map.find('.map_toggle_cityname');
if(localStorage.getItem('sam.hideMapCityName') == 'yes'){
$world_map.addClass('hide_cityname');
$hideCityNameBtn.addClass('active').attr('aria-pressed', 'true');
}
$hideCityNameBtn.click(function(){
//이전 상태 확인
var state = !$hideCityNameBtn.hasClass('active');
if(state){
$world_map.addClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'yes');
}
else{
$world_map.removeClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'no');
}
});
if(isDetailMap){
$world_map.addClass('map_detail');
}
@@ -451,5 +484,52 @@ function reloadWorldMap(option){
.then(setMouseWork)
.then(setCityClickable)
.then(saveCityInfo);
if($world_map.hasClass('draw_required')){
if(useCachedMap){
//일단 불러옴
do{
var storedMap = localStorage.getItem(storedOldMapKey);
if(!storedMap){
break;
}
storedMap = JSON.parse(storedMap);
var storedServerID = storedMap[0];
if(storedServerID != serverID){
break;
}
storedMap = storedMap[1];
storedMap = setMapBackground(storedMap);
storedMap = convertCityObjs(storedMap);
if(isDetailMap){
storedMap = drawDetailWorldMap(storedMap);
}
else{
storedMap = drawBasicWorldMap(storedMap);
}
storedMap = setMouseWork(storedMap);
storedMap = setCityClickable(storedMap);
storedMap = saveCityInfo(storedMap);
}while(false);
}
else if(option.year && option.month){
var startYear = localStorage.getItem(storedStartYear);
if(startYear){
startYear = JSON.parse(startYear);
}
else{
startYear = option.year;
}
var tmp = {
year : option.year,
month : option.month,
startYear : startYear
};
setMapBackground(tmp);
}
}
}
File diff suppressed because one or more lines are too long
+11 -5
View File
@@ -150,6 +150,12 @@ function redrawMsg(deferred){
msg.defaultIcon = pathConfig.sharedIcon+'/default.jpg';
if(msgType == 'diplomacy'){
msg.allowButton = myGeneralLevel>4;
}
else{
msg.allowButton = true;
}
var msgHtml = TemplateEngine(messageTemplate, msg);
@@ -331,18 +337,18 @@ function refreshMailboxList(obj){
function registerGlobal(basicInfo){
myNation = {
window.myNation = {
'id':basicInfo.myNationID,
'mailbox':basicInfo.myNationID+9000,
'color':'#000000',
'nation':'재야'
};
lastMsg = {
window.lastMsg = {
id : basicInfo.lastContact
};
myGeneralID = basicInfo.generalID;
isChief = basicInfo.isChief;
myGeneralLevel = basicInfo.generalLevel;
window.myGeneralID = basicInfo.generalID;
window.isChief = basicInfo.isChief;
window.myGeneralLevel = basicInfo.generalLevel;
}
function activateMessageForm(){
+1 -1
View File
@@ -42,5 +42,5 @@
<div class="msg_content"><%e(text)%></div>
<%if(this.option && this.option.action) {%>
<div class="msg_prompt">
<button class="prompt_yes btn_prompt">수락</button> <button class="prompt_no btn_prompt">거절</button>
<button class="prompt_yes btn_prompt" <%allowButton?'':'disabled="disabled"'%>>>수락</button> <button class="prompt_no btn_prompt" <%allowButton?'':'disabled="disabled"'%>>거절</button>
</div><%} %></div></div>
+1 -1
View File
@@ -54,7 +54,7 @@ function MessageBox($str)
function LogText($prefix, $variable)
{
$text = sprintf('%s : %s'."\n", $prefix, var_export($variable, true));
$text = sprintf('%s : %s'."\r\n", $prefix, var_export($variable, true));
file_put_contents(ROOT.'/d_log/dbg_logs.txt', $text, FILE_APPEND);
}
+1 -3
View File
@@ -14,11 +14,9 @@ $turn = Util::getReq('turn', 'array_int');
$sel = Util::getReq('sel', 'int');
$commandtype = Util::getReq('commandtype', 'int');
extractMissingPostToGlobals();
increaseRefresh("턴입력", 1);
if(!$turn || $commandtype === null){
if(!$turn || $commandtype === null || $sel === null){
header('location:commandlist.php');
die();
}
+15 -9
View File
@@ -298,12 +298,14 @@ function processWar($general, $city) {
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 궁병
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
LogText('avoid0', [date("Ymd_His"), $generalCrewType->id, $general['train'], $ratio2]);
if($ratio < $ratio2 && $avoid == 1) {
LogText('avoid0', true);
$batlog[] = "<C>●</><C>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
$avoid = 0;
@@ -527,13 +529,13 @@ function processWar($general, $city) {
$opposeCrewType = GameUnitConst::byId($oppose['crewtype']);
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$josaWa = JosaUtil::pick($opposeCrewType->name, '와');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 ".$opposeCrewType->name."{$josaWa} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaYi} 대결합니다.";
$josaWa = JosaUtil::pick($generalCrewType->name, '와');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 ".$generalCrewType->name."{$josaWa} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaYi} 대결합니다.";
$josaUl = JosaUtil::pick($opposeCrewType->name, '을');
$josaRo = JosaUtil::pick($opposeCrewType->name, '로');
$log[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>공격</>합니다.";
$josaUl = JosaUtil::pick($opposeCrewType->name, '을');
$opplog[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$general['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>수비</>합니다.";
$josaRo = JosaUtil::pick($generalCrewType->name, '로');
$log[] = "<C>●</>".$generalCrewType->name."{$josaRo} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>공격</>합니다.";
$josaUl = JosaUtil::pick($generalCrewType->name, '을');
$opplog[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$general['name']}</>의 ".$generalCrewType->name."{$josaUl} <M>수비</>합니다.";
$oppAtmos = 0;
if($oppose['item'] == 3) {
@@ -1066,12 +1068,13 @@ function processWar($general, $city) {
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 돌격, 궁병
if($oppose['special2'] == 60) { $ratio2 -= 100; }
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
LogText('avoid1', [date("Ymd_His"), $generalCrewType->id, $general['train'], $ratio2]);
if($ratio < $ratio2 && $myAvoid == 1) {
// 특기보정 : 격노
if($oppose['special2'] == 74 && rand() % 100 < 50) {
@@ -1080,6 +1083,7 @@ function processWar($general, $city) {
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
} else {
LogText('avoid1', true);
$batlog[] = "<C>●</><C>회피</>했다!</>";
$oppbatlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
@@ -1089,12 +1093,13 @@ function processWar($general, $city) {
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $opposeCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $oppose['train'] / 100); //훈련 반영
$ratio2 = Util::round($ratio2 * $oppose['train'] / 100); //훈련 반영
// 특기보정 : 돌격, 궁병
if($general['special2'] == 60) { $ratio2 -= 100; }
if($oppose['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($oppose['item'] == 26 || $oppose['item'] == 25) { $ratio2 += 20; }
LogText('avoid2', [date("Ymd_His"), $opposeCrewType->id, $oppose['train'], $ratio2]);
if($ratio < $ratio2 && $opAvoid == 1) {
// 특기보정 : 격노
if($general['special2'] == 74 && rand() % 100 < 33) {
@@ -1109,6 +1114,7 @@ function processWar($general, $city) {
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
} else {
LogText('avoid2', true);
$oppbatlog[] = "<C>●</><C>회피</>했다!</>";
$batlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$opCrew /= 5; // 20%만 소모
+12 -6
View File
@@ -5,10 +5,13 @@ include "lib.php";
include "func.php";
//로그인 검사
$commandtype = Util::getReq('commandtype', 'int', 0);
$turn = Util::getReq('turn', 'array_int', [0]);
$commandtype = Util::getReq('commandtype', 'int');
$turn = Util::getReq('turn', 'array_int');
extractMissingPostToGlobals();
if(!$turn || $commandtype === null){
header('location:commandlist.php');
die();
}
$session = Session::requireGameLogin()->setReadOnly();
@@ -131,6 +134,8 @@ function starter($name, $type=0) {
<?=WebUtil::printJS('d_shared/base_map.js')?>
<?=WebUtil::printJS('js/map.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
var $target = $("form[name=form1] select[name=double]");
console.log($target);
@@ -138,6 +143,7 @@ $(function(){
isDetailMap:false,
clickableAll:true,
neutralView:true,
useCachedMap:true,
selectCallback:function(city){
$target.val(city.id);
return false;
@@ -227,7 +233,7 @@ function command_11($turn, $command, bool $is모병 = false) {
}
$leader = getGeneralLeadership($me, true, true, true);
$maxCrew = $leader - Util::round($me['crew']/100);
$fullLeader = getGeneralLeadership($me, false, true, true);
$abil = getTechAbil($tech);
$armTypes = [];
@@ -311,10 +317,10 @@ function command_11($turn, $command, bool $is모병 = false) {
'techLevelText'=>getTechCall($tech),
'tech'=>$tech,
'leader'=>$leader,
'fullLeader'=>$fullLeader,
'crewType'=>GameUnitConst::byId($me['crewtype'])->id,
'crewTypeName'=>GameUnitConst::byId($me['crewtype'])->name,
'crew'=>$me['crew'],
'maxCrew'=>$maxCrew,
'gold'=>$me['gold'],
'turn'=>$turn,
'armTypes'=>$armTypes,
@@ -702,7 +708,7 @@ function command_25($turn, $command) {
!!!는 방랑군을 포함한 랜덤임관입니다. 유니크를 기대하신다면!<br>
???는 방랑군을 제외한 랜덤임관입니다. 유니크 혜택은 없습니다.<br>
임관 금지이거나 초기 제한중인 국가는 붉은색 배경으로 표시됩니다.<br>
870px x 200px 넘는 높이를 점유할 시 통보없이 제한될 수 있습니다.<br>
870px x 200px어서는 내용은 표시되지 않습니다.<br>
<form name=form1 action=c_double.php method=post>
<select name=double size=1 style=color:white;background-color:black>
<option value=99 style=color:white;background-color:black;>!!!</option>
+4 -2
View File
@@ -6,7 +6,7 @@ class GameConstBase
/** @var string 버전 */
public static $title = "삼국지 모의전투 PHP HiDCHe";
/** @var string 코드 아래에 붙는 설명 코드 */
public static $banner = "KOEI의 이미지를 사용, 응용하였습니다 / 제작 : HideD(hided62@gmail.com) / <a href='https://sam.hided.net/wiki/hidche/credit' target='_blank'>Credit</a>";
public static $banner = "KOEI의 이미지를 사용, 응용하였습니다 / 제작 : HideD(hided62@gmail.com) / <a href='https://sam.hided.net/wiki/hidche/credit' target='_blank' style='color:white;text-decoration: underline;'>Credit</a>";
/** @var string mapName 사용중인 지도명 */
public static $mapName = 'che';
/** @var string unitSet 사용중인 유닛셋 */
@@ -38,7 +38,7 @@ class GameConstBase
/** @var int 풀징병시 훈련 1회 상승량*/
public static $atmosDelta = 30;
/** @var float 훈련시 사기 감소율*/
public static $atmosSideEffectByTraining = 0.98;
public static $atmosSideEffectByTraining = 1;
/** @var float 계략 기본 성공률*/
public static $sabotageDefaultProb = 0.25;
/** @var int 계략시 확률 가중치(수치가 클수록 변화가 적음 : (지력차/$firing + $basefiring)*/
@@ -84,4 +84,6 @@ class GameConstBase
/** @var int 최대 턴(현재는 DB상 24턴으로 고정) */
public static $maxTurn = 24;
public static $statGradeLevel = 5;
}
+1 -1
View File
@@ -278,7 +278,7 @@ class GameUnitConstBase{
[
41, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 0,
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=>1.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.']
+4 -1
View File
@@ -152,10 +152,13 @@ class GameUnitDetail{
$ratio = max($mainstat - 65, 0);
$ratio *= $coef;
return max(50, $ratio);
return min(50, $ratio);
}
public function isValid($ownCities, $ownRegions, $relativeYear, $tech){
//음수 없음
$relativeYear = max(0, $relativeYear);
if($relativeYear < $this->reqYear){
return false;
}
+2 -1
View File
@@ -180,7 +180,7 @@ class ResetHelper{
$killturn = 4800 / $turnterm;
if($npcmode == 1) { $killturn = intdiv($killturn, 3); }
$develcost = ($year - $startyear + 10) * 2;
$env = [
'scenario'=>$scenario,
@@ -196,6 +196,7 @@ class ResetHelper{
'conlimit'=>300,
'gold_rate'=>100,
'rice_rate'=>100,
'develcost'=>$develcost,
'turntime'=>$turntime,
'starttime'=>$starttime,
'turnterm'=>$turnterm,
+63 -63
View File
@@ -5,83 +5,83 @@ namespace sammo;
class CityConst extends CityConstBase{
protected static $initCity = [
//id, 도시, 규모, 인구, 농, 상, 치, 성, 수,(x100)지역, x, y, 연결도시
[1, '낙양', '특', 8357,117,120,100,121,124, '중원', 279, 176, ['하내', '홍농', '사수']],
[2, '성도', '특', 6525,123,125,100,125,123, '서촉', 28, 288, ['덕양', '강주']],
[1, '낙양', '특', 8357,117,120,100,121,124, '중원', 285, 176, ['하내', '홍농', '호로']],
[2, '성도', '특', 6525,123,125,100,125,123, '서촉', 30, 285, ['덕양', '강주']],
[3, '건업', '특', 6386,116,123,100,115,119, '오월', 507, 303, ['광릉', '합비', '오']],
[4, '업', '특', 6205,125,113,100,117,122, '하북', 347, 131, ['하내', '거록', '남피', '제남', '진류']],
[4, '업', '특', 6205,125,113,100,117,122, '하북', 355, 135, ['하내', '거록', '남피', '제남', '진류']],
[5, '장안', '특', 5923,116,123,100,120,118, '서북', 162, 173, ['안정', '오장원', '한중', '홍농']],
[6, '허창', '특', 5876,121,124,100,117,125, '중원', 317, 218, ['사수', '진류', '초', '여남', '완']],
[7, '양양', '특', 5837,120,126,100,115,117, '초', 259, 287, ['신야', '강릉', '강하']],
[8, '시상', '대', 5252, 98,100, 80, 99, 96, '오월', 350, 367, ['적벽', '여강', '단양', '상동', '장사']],
[9, '수춘', '대', 5143, 99, 96, 80, 99, 95, '중원', 381, 270, ['여남', '초', '하비', '합비']],
[6, '허창', '특', 5876,121,124,100,117,125, '중원', 325, 218, ['호로', '진류', '초', '여남', '완']],
[7, '양양', '특', 5837,120,126,100,115,117, '초', 259, 295, ['신야', '강릉', '강하']],
[8, '시상', '대', 5252, 98,100, 80, 99, 96, '오월', 357, 357, ['적벽', '여강', '단양', '상동', '장사']],
[9, '수춘', '대', 5143, 99, 96, 80, 99, 95, '중원', 385, 270, ['여남', '초', '하비', '합비']],
[10, '한중', '대', 5137, 96,101, 80,102,103, '서촉', 130, 218, ['무도', '오장원', '장안', '상용', '자동']],
[11, '남피', '대', 5032, 99,101, 80,101,105, '하북', 405, 93, ['계', '북평', '평원', '업', '거록']],
[12, '위례', '대', 4926,100, 93, 80, 98,103, '동이', 615, 143, ['평양', '북해', '웅진', '계림']],
[11, '남피', '대', 5032, 99,101, 80,101,105, '하북', 410, 93, ['계', '북평', '평원', '업', '거록']],
[12, '위례', '대', 4926,100, 93, 80, 98,103, '동이', 618, 140, ['평양', '북해', '웅진', '계림']],
[13, '북평', '대', 4862,102, 95, 80,103, 99, '하북', 442, 53, ['계', '요동', '남피']],
[14, '강릉', '대', 4850,105, 96, 80, 95, 96, '초', 243, 336, ['이릉', '양양', '적벽', '장사', '무릉']],
[15, '완', '대', 4724,103,100, 80,101, 99, '중원', 270, 236, ['허창', '여남', '신야']],
[14, '강릉', '대', 4850,105, 96, 80, 95, 96, '초', 245, 330, ['이릉', '양양', '적벽', '장사', '무릉']],
[15, '완', '대', 4724,103,100, 80,101, 99, '중원', 275, 235, ['허창', '여남', '신야']],
[16, '장사', '대', 4710, 97, 99, 80,100,105, '초', 258, 373, ['강릉', '시상', '계양', '무릉']],
[17, '오', '중', 4355, 77, 81, 60, 77, 76, '오월', 512, 345, ['건업', '단양', '회계', '탐라']],
[18, '하비', '중', 4278, 85, 83, 60, 82, 78, '중원', 451, 245, ['패', '북해', '광릉', '수춘']],
[19, '복양', '중', 4185, 80, 83, 60, 82, 80, '중원', 412, 175, ['제남', '진류', '패']],
[20, '웅진', '중', 4157, 77, 79, 60, 78, 80, '동이', 619, 205, ['위례', '계림', '탐라']],
[21, '강주', '중', 4126, 79, 80, 60, 84, 81, '서촉', 73, 311, ['성도', '덕양', '영안', '주제', '월수']],
[22, '무도', '중', 4027, 77, 84, 60, 80, 85, '서촉', 50, 191, ['저', '한중', '자동']],
[17, '오', '중', 4355, 77, 81, 60, 77, 76, '오월', 515, 340, ['건업', '단양', '회계', '탐라']],
[18, '하비', '중', 4278, 85, 83, 60, 82, 78, '중원', 460, 240, ['패', '북해', '광릉', '수춘']],
[19, '복양', '중', 4185, 80, 83, 60, 82, 80, '중원', 412, 170, ['제남', '진류', '패']],
[20, '웅진', '중', 4157, 77, 79, 60, 78, 80, '동이', 615, 205, ['위례', '계림', '탐라']],
[21, '강주', '중', 4126, 79, 80, 60, 84, 81, '서촉', 75, 305, ['성도', '덕양', '영안', '주제', '월수']],
[22, '무도', '중', 4027, 77, 84, 60, 80, 85, '서촉', 55, 191, ['저', '한중', '자동']],
[23, '국내', '중', 3982, 78, 80, 60, 83, 78, '동이', 596, 48, ['요동', '오환', '평양']],
[24, '진류', '중', 3957, 82, 80, 60, 80, 83, '중원', 365, 178, ['업', '복양', '패', '초', '허창', '사수']],
[25, '계양', '중', 3955, 83, 80, 60, 81, 77, '초', 232, 418, ['영릉', '장사', '상동']],
[26, '계림', '중', 3911, 80, 74, 60, 81, 78, '동이', 656, 198, ['위례', '웅진', '왜']],
[24, '진류', '중', 3957, 82, 80, 60, 80, 83, '중원', 370, 175, ['업', '복양', '패', '초', '허창', '호로']],
[25, '계양', '중', 3955, 83, 80, 60, 81, 77, '초', 242, 408, ['영릉', '장사', '상동']],
[26, '계림', '중', 3911, 80, 74, 60, 81, 78, '동이', 660, 195, ['위례', '웅진', '왜']],
[27, '계', '중', 3885, 75, 80, 60, 78, 81, '하북', 386, 55, ['진양', '북평', '남피']],
[28, '무위', '중', 3874, 77, 79, 60, 83, 80, '서북', 53, 81, ['강', '안정', '천수', '저']],
[28, '무위', '중', 3874, 77, 79, 60, 83, 80, '서북', 56, 76, ['강', '안정', '천수', '저']],
[29, '제남', '중', 3831, 77, 81, 60, 84, 77, '하북', 402, 132, ['업', '평원', '복양']],
[30, '남해', '중', 3803, 82, 76, 60, 80, 81, '오월', 259, 474, ['상동', '산월', '교지']],
[30, '남해', '중', 3803, 82, 76, 60, 80, 81, '오월', 270, 474, ['상동', '산월', '교지']],
[31, '덕양', '중', 3803, 81, 84, 60, 79, 77, '서촉', 73, 276, ['자동', '영안', '강주', '성도']],
[32, '하내', '중', 3736, 77, 81, 60, 81, 80, '하북', 291, 140, ['진양', '업', '낙양', '하동']],
[33, '상용', '중', 3687, 78, 76, 60, 77, 81, '서촉', 188, 226, ['한중', '신야']],
[34, '초', '소', 3286, 60, 62, 40, 62, 57, '중원', 372, 233, ['허창', '진류', '패', '수춘', '여남']],
[35, '운남', '소', 3258, 62, 60, 40, 64, 61, '남중', 33, 413, ['월수', '건녕', '남만']],
[36, '대', '소', 3256, 60, 62, 40, 57, 60, '오월', 446, 472, ['산월', '회계', '왜']],
[37, '하동', '소', 3208, 60, 60, 40, 62, 55, '서북', 231, 140, ['흉노', '진양', '하내', '홍농']],
[38, '무릉', '소', 3196, 58, 63, 40, 63, 58, '초', 200, 357, ['강릉', '장사', '영릉']],
[39, '교지', '소', 3195, 58, 59, 40, 58, 59, '남중', 136, 472, ['남만', '남해']],
[40, '단양', '소', 3183, 62, 64, 40, 58, 57, '오월', 432, 354, ['여강', '오', '건안', '시상']],
[41, '영안', '소', 3153, 62, 59, 40, 58, 59, '서촉', 116, 287, ['덕양', '이릉', '강주']],
[42, '북해', '소', 3146, 55, 63, 40, 63, 58, '하북', 466, 155, ['평원', '위례', '하비']],
[43, '합비', '', 3144, 60, 59, 40, 62, 56, '중원', 413, 294, ['수춘', '건업', '여강']],
[44, '이릉', '', 3139, 61, 57, 40, 57, 57, '초', 188, 282, ['영안', '강릉']],
[45, '건녕', '소', 3082, 58, 59, 40, 63, 56, '남중', 75, 396, ['주제', '장가', '운남']],
[46, '강하', '소', 3074, 55, 56, 40, 57, 60, '초', 316, 303, ['양양', '적벽', '여강']],
[47, '진양', '소', 3074, 56, 59, 40, 64, 59, '하북', 310, 79, ['흉노', '하동', '하내', '거록', '계']],
[48, '평원', '소', 3074, 62, 65, 40, 61, 63, '하북', 444, 118, ['남피', '제남', '북해']],
[49, '회계', '소', 3005, 64, 59, 40, 62, 64, '오월', 480, 394, ['오', '건안', '대']],
[50, '천수', '소', 2985, 59, 64, 40, 60, 58, '서북', 76, 145, ['무위', '안정', '오장원', '저']],
[51, '평양', '소', 2939, 55, 59, 40, 60, 58, '동이', 596, 97, ['국내', '위례']],
[52, '요동', '소', 2937, 63, 59, 40, 59, 63, '동이', 543, 26, ['북평', '오환', '국내']],
[53, '거록', '소', 2936, 61, 57, 40, 64, 58, '하북', 355, 100, ['진양', '남피', '업']],
[54, '여강', '소', 2905, 56, 58, 40, 60, 55, '오월', 392, 331, ['합비', '단양', '시상', '강하']],
[55, '패', '소', 2877, 64, 58, 40, 58, 59, '중원', 429, 220, ['진류', '복양', '하비', '초']],
[56, '자동', '소', 2870, 57, 55, 40, 60, 58, '서촉', 62, 245, ['무도', '한중', '덕양']],
[57, '광릉', '소', 2867, 61, 55, 40, 60, 62, '오월', 474, 273, ['하비', '건업']],
[58, '장가', '소', 2853, 59, 62, 40, 58, 57, '남중', 136, 403, ['건녕', '영릉', '남만']],
[59, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 192, 394, ['무릉', '계양', '장가']],
[32, '하내', '중', 3736, 77, 81, 60, 81, 80, '하북', 295, 140, ['진양', '업', '낙양', '하동']],
[33, '상용', '중', 3687, 78, 76, 60, 77, 81, '서촉', 190, 220, ['한중', '신야']],
[34, '초', '소', 3286, 60, 62, 40, 62, 57, '중원', 375, 225, ['허창', '진류', '패', '수춘', '여남']],
[35, '운남', '소', 3258, 62, 60, 40, 64, 61, '남중', 45, 405, ['월수', '건녕', '남만']],
[36, '대', '소', 3256, 60, 62, 40, 57, 60, '오월', 450, 470, ['산월', '회계', '왜']],
[37, '하동', '소', 3208, 60, 60, 40, 62, 55, '서북', 240, 140, ['흉노', '진양', '하내', '홍농']],
[38, '무릉', '소', 3196, 58, 63, 40, 63, 58, '초', 195, 352, ['강릉', '장사', '영릉']],
[39, '교지', '소', 3195, 58, 59, 40, 58, 59, '남중', 136, 480, ['남만', '남해']],
[40, '단양', '소', 3183, 62, 64, 40, 58, 57, '오월', 440, 350, ['여강', '오', '건안', '시상']],
[41, '영안', '소', 3153, 62, 59, 40, 58, 59, '서촉', 116, 282, ['덕양', '이릉', '강주']],
[42, '북해', '소', 3146, 55, 63, 40, 63, 58, '하북', 470, 150, ['평원', '위례', '하비']],
[43, '합비', '', 998, 20, 19, 20, 39, 41, '중원', 420, 294, ['수춘', '건업', '여강']],
[44, '이릉', '', 968, 18, 19, 20, 39, 41, '초', 188, 275, ['영안', '강릉']],
[45, '건녕', '소', 3082, 58, 59, 40, 63, 56, '남중', 85, 390, ['주제', '장가', '운남']],
[46, '강하', '소', 3074, 55, 56, 40, 57, 60, '초', 320, 299, ['양양', '적벽', '여강']],
[47, '진양', '소', 3074, 56, 59, 40, 64, 59, '하북', 310, 75, ['흉노', '하동', '하내', '거록', '계']],
[48, '평원', '소', 3074, 62, 65, 40, 61, 63, '하북', 445, 110, ['남피', '제남', '북해']],
[49, '회계', '소', 3005, 64, 59, 40, 62, 64, '오월', 485, 390, ['오', '건안', '대']],
[50, '천수', '소', 2985, 59, 64, 40, 60, 58, '서북', 76, 140, ['무위', '안정', '오장원', '저']],
[51, '평양', '소', 2939, 55, 59, 40, 60, 58, '동이', 606, 97, ['국내', '위례']],
[52, '요동', '소', 2937, 63, 59, 40, 59, 63, '동이', 549, 26, ['북평', '오환', '국내']],
[53, '거록', '소', 2936, 61, 57, 40, 64, 58, '하북', 355, 95, ['진양', '남피', '업']],
[54, '여강', '소', 2905, 56, 58, 40, 60, 55, '오월', 392, 325, ['합비', '단양', '시상', '강하']],
[55, '패', '소', 2877, 64, 58, 40, 58, 59, '중원', 425, 210, ['진류', '복양', '하비', '초']],
[56, '자동', '소', 2870, 57, 55, 40, 60, 58, '서촉', 62, 240, ['무도', '한중', '덕양']],
[57, '광릉', '소', 2867, 61, 55, 40, 60, 62, '오월', 478, 270, ['하비', '건업']],
[58, '장가', '소', 2853, 59, 62, 40, 58, 57, '남중', 136, 395, ['건녕', '영릉', '남만']],
[59, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 197, 390, ['무릉', '계양', '장가']],
[60, '월수', '소', 2828, 60, 59, 40, 58, 63, '남중', 39, 349, ['강주', '주제', '운남']],
[61, '건안', '소', 2802, 57, 62, 40, 58, 63, '오월', 435, 427, ['단양', '회계', '산월']],
[62, '신야', '소', 2786, 60, 62, 40, 58, 55, '초', 240, 262, ['상용', '완', '양양']],
[63, '탐라', '', 2772, 60, 55, 40, 63, 62, '동이', 614, 264, ['웅진', '왜', '오']],
[64, '상동', '소', 2767, 58, 59, 40, 62, 58, '초', 285, 411, ['계양', '시상', '남해']],
[65, '안정', '소', 2764, 57, 59, 40, 57, 62, '서북', 130, 131, ['강', '무위', '천수', '장안']],
[66, '여남', '소', 2749, 63, 56, 40, 64, 64, '중원', 330, 259, ['완', '허창', '초', '수춘']],
[67, '홍농', '소', 2748, 57, 63, 40, 58, 63, '서북', 213, 175, ['하동', '낙양', '장안']],
[61, '건안', '소', 2802, 57, 62, 40, 58, 63, '오월', 440, 420, ['단양', '회계', '산월']],
[62, '신야', '소', 2786, 60, 62, 40, 58, 55, '초', 245, 255, ['상용', '완', '양양']],
[63, '탐라', '', 1130, 22, 21, 20, 43, 41, '동이', 614, 259, ['웅진', '왜', '오']],
[64, '상동', '소', 2767, 58, 59, 40, 62, 58, '초', 285, 405, ['계양', '시상', '남해']],
[65, '안정', '소', 2764, 57, 59, 40, 57, 62, '서북', 135, 130, ['강', '무위', '천수', '장안']],
[66, '여남', '소', 2749, 63, 56, 40, 64, 64, '중원', 335, 255, ['완', '허창', '초', '수춘']],
[67, '홍농', '소', 2748, 57, 63, 40, 58, 63, '서북', 220, 170, ['하동', '낙양', '장안']],
[68, '주제', '소', 2746, 58, 61, 40, 61, 58, '남중', 93, 357, ['강주', '월수', '건녕']],
[69, '남만', '이', 2378, 40, 42, 20, 43, 45, '남중', 83, 454, ['운남', '장가', '교지']],
[69, '남만', '이', 2378, 40, 42, 20, 43, 45, '남중', 90, 454, ['운남', '장가', '교지']],
[70, '산월', '이', 2275, 40, 37, 20, 43, 38, '오월', 373, 447, ['건안', '대', '남해']],
[71, '오환', '이', 2153, 42, 37, 20, 43, 40, '동이', 628, 19, ['요동', '국내']],
[72, '강', '이', 2095, 40, 42, 20, 43, 40, '서북', 154, 77, ['무위', '안정']],
[72, '강', '이', 2095, 40, 42, 20, 43, 40, '서북', 154, 70, ['무위', '안정']],
[73, '왜', '이', 2065, 39, 37, 20, 43, 41, '동이', 681, 292, ['계림', '탐라', '대']],
[74, '흉노', '이', 2064, 40, 41, 20, 40, 38, '서북', 227, 79, ['진양', '하동']],
[75, '저', '이', 1957, 40, 42, 20, 43, 42, '서북', 21, 123, ['무위', '천수', '무도']],
[76, '사수', '관', 958, 17, 19, 20, 95, 96, '중원', 317, 182, ['낙양', '진류', '허창']],
[77, '오장원','진',1005, 19, 18, 20, 41, 40, '서북', 104, 180, ['천수', '장안', '한중']],
[78, '적벽', '수', 1117, 23, 21, 20, 42, 41, '오월', 329, 335, ['강하', '강릉', '시상']],
[75, '저', '이', 1957, 40, 42, 20, 43, 42, '서북', 24, 123, ['무위', '천수', '무도']],
[76, '호로', '관', 958, 17, 19, 20, 95, 96, '중원', 317, 182, ['낙양', '진류', '허창']],
[77, '오장원','진',1005, 19, 18, 20, 41, 40, '서북', 104, 175, ['천수', '장안', '한중']],
[78, '적벽', '수', 1117, 23, 21, 20, 42, 41, '오월', 335, 330, ['강하', '강릉', '시상']],
];
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【공백지】 공백지",
"title":"【공백지】 일반",
"startYear":180,
"history":[
]
+9
View File
@@ -0,0 +1,9 @@
{
"title":"【공백지】 소형",
"startYear":180,
"map":{
"mapName":"miniche"
},
"history":[
]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【가상모드1b】 영웅 난무 220",
"title":"【가상모드1b】 영웅 난무 (220)",
"life":1,
"fiction":1,
"nation":[
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【가상모드1c】 영웅 난무 220, Mini",
"title":"【가상모드1c】 영웅 난무 (220, 소형)",
"life":1,
"fiction":1,
"nation":[
+713
View File
@@ -0,0 +1,713 @@
{
"title":"【가상모드10-c】 천인 강림·극 (소형)",
"life":1,
"fiction":1,
"nation":[
],
"diplomacy":[
],
"stat":{
"total":260,
"min":40,
"max":120,
"npcMax":65,
"chiefMin":55
},
"map":{
"mapName":"miniche"
},
"general":[
[ 1, "소제1", 1001, 0, null, 18, 7, 48, 0, 160, 300, "유지", null],
[ 1, "헌제", 1002, 0, null, 15, 7, 61, 0, 160, 300, "안전", null],
[999, "사마휘", 1003, 0, null, 47, 7, 69, 0, 160, 300, "은둔", "신산", "좋지, 좋아~"],
[999, "우길", 1004, 0, null, 15, 7, 69, 0, 160, 300, "은둔", "신산"],
[999, "화타", 1005, 0, null, 41, 11, 54, 0, 160, 300, "은둔", "의술", "아픈 사람들은 모두 내게 오시오. 껄껄껄."],
[999, "길평", 1006, 0, null, 26, 8, 67, 0, 160, 300, "은둔", "의술"],
[ 29, "가규", 1007, 0, null, 41, 21, 56, 0, 160, 300, "재간", null],
[136, "가범", 1008, 0, null, 42, 19, 55, 0, 160, 300, "유지", null],
[ 49, "가비능", 1009, 0, null, 42, 61, 14, 0, 160, 300, "정복", null],
[ 31, "가충", 1010, 0, null, 40, 11, 64, 0, 160, 300, "출세", null],
[ 20, "가후", 1011, 0, null, 46, 13, 68, 0, 160, 300, "할거", "귀병"],
[ 73, "간옹", 1012, 0, null, 30, 14, 67, 0, 160, 300, "안전", "경작"],
[129, "감녕", 1013, 0, null, 49, 69, 27, 0, 160, 300, "출세", "무쌍"],
[127, "감택", 1014, 0, null, 44, 18, 59, 0, 160, 300, "유지", null],
[ 60, "강단", 1015, 0, null, 37, 67, 17, 0, 160, 300, "재간", null],
[ 73, "강유", 1016, 0, null, 55, 33, 68, 0, 160, 300, "왕좌", "집중", "갈고 닦은 무예와 승상께 배운 책략을 발휘해 보이겠다!"],
[102, "고간", 1017, 0, null, 43, 46, 20, 0, 160, 300, "유지", null],
[ 27, "고람", 1018, 0, null, 47, 52, 23, 0, 160, 300, "출세", "기병"],
[ 69, "고상", 1019, 0, null, 37, 40, 16, 0, 160, 300, "재간", null],
[144, "고순", 1020, 0, null, 49, 61, 25, 0, 160, 300, "의협", "기병"],
[ 7, "고승", 1021, 0, null, 37, 67, 11, 0, 160, 300, "출세", null],
[120, "고옹", 1022, 0, null, 42, 10, 59, 0, 160, 300, "출세", null],
[ 63, "고정", 1023, 0, null, 45, 51, 21, 0, 160, 300, "정복", null],
[ 53, "고패", 1024, 0, null, 41, 45, 12, 0, 160, 300, "유지", null],
[ 74, "공도", 1025, 0, null, 25, 67, 9, 0, 160, 300, "재간", null],
[142, "공손강", 1026, 0, null, 44, 55, 23, 0, 160, 300, "정복", null],
[142, "공손공", 1027, 0, null, 46, 17, 57, 0, 160, 300, "정복", null],
[142, "공손도", 1028, 0, null, 44, 55, 17, 0, 160, 300, "정복", "기병"],
[ 65, "공손범", 1029, 0, null, 43, 52, 23, 0, 160, 300, "출세", null],
[ 65, "공손속", 1030, 0, null, 43, 57, 17, 0, 160, 300, "정복", null],
[ 10, "공손연", 1031, 0, null, 48, 59, 24, 0, 160, 300, "패권", "돌격"],
[ 65, "공손월", 1032, 0, null, 39, 63, 18, 0, 160, 300, "정복", null],
[ 65, "공손찬", 1033, 0, null, 43, 64, 25, 0, 160, 300, "패권", "기병"],
[ 43, "공융", 1034, 0, null, 44, 19, 63, 0, 160, 300, "왕좌", "경작"],
[ 35, "공주", 1035, 0, null, 44, 15, 58, 0, 160, 300, "재간", null],
[ 83, "공지", 1036, 0, null, 42, 21, 50, 0, 160, 300, "대의", null],
[ 26, "곽가", 1037, 0, null, 39, 11, 70, 0, 160, 300, "패권", "귀모"],
[111, "곽도", 1038, 0, null, 44, 25, 60, 0, 160, 300, "재간", null],
[ 2, "곽사", 1039, 0, null, 42, 52, 13, 0, 160, 300, "패권", null],
[ 80, "곽유지", 1040, 0, null, 35, 10, 67, 0, 160, 300, "재간", "상재"],
[ 67, "곽익", 1041, 0, null, 45, 23, 52, 0, 160, 300, "재간", null],
[ 67, "곽준", 1042, 0, null, 48, 26, 55, 0, 160, 300, "출세", null],
[ 27, "곽혁", 1043, 0, null, 36, 13, 68, 0, 160, 300, "안전", null],
[ 20, "곽회", 1044, 0, null, 49, 57, 27, 0, 160, 300, "정복", null],
[ 39, "관구검", 1045, 0, null, 47, 26, 58, 0, 160, 300, "대의", null],
[ 76, "관색", 1046, 0, null, 46, 63, 25, 0, 160, 300, "의협", "징병"],
[ 76, "관우", 1047, 0, null, 55, 70, 30, 0, 160, 300, "의협", "위압", "나의 청룡 언월도를 과연 막아낼 수 있겠소?"],
[ 76, "관이", 1048, 0, null, 39, 60, 22, 0, 160, 300, "안전", null],
[ 76, "관통", 1049, 0, null, 39, 63, 23, 0, 160, 300, "대의", null],
[ 76, "관평", 1050, 0, null, 49, 60, 26, 0, 160, 300, "의협", "보병"],
[ 7, "관해", 1051, 0, null, 45, 66, 15, 0, 160, 300, "출세", null],
[ 76, "관흥", 1052, 0, null, 46, 62, 27, 0, 160, 300, "의협", "돌격"],
[ 40, "괴량", 1053, 0, null, 37, 12, 69, 0, 160, 300, "안전", "신중"],
[ 40, "괴월", 1054, 0, null, 25, 13, 69, 0, 160, 300, "유지", "귀병"],
[ 98, "교모", 1055, 0, null, 43, 22, 48, 0, 160, 300, "안전", null],
[ 98, "교현", 1056, 0, null, 40, 9, 48, 0, 160, 300, "재간", null],
[ 6, "구역거", 1057, 0, null, 40, 55, 19, 0, 160, 300, "안전", null],
[ 80, "극정", 1058, 0, null, 36, 11, 68, 0, 160, 300, "유지", null],
[ 46, "금선", 1059, 0, null, 41, 41, 15, 0, 160, 300, "할거", null],
[ 62, "금환삼결", 1060, 0, null, 38, 68, 9, 0, 160, 300, "출세", null],
[141, "기령", 1061, 0, null, 48, 60, 14, 0, 160, 300, "대의", "무쌍"],
[122, "낙통", 1062, 0, null, 42, 18, 53, 0, 160, 300, "유지", null],
[124, "노숙1", 1063, 0, null, 53, 17, 68, 0, 160, 300, "왕좌", "상재"],
[ 75, "노식", 1064, 0, null, 53, 21, 60, 0, 160, 300, "왕좌", "징병"],
[ 59, "뇌동", 1065, 0, null, 46, 58, 18, 0, 160, 300, "출세", "궁병"],
[142, "뇌박", 1066, 0, null, 41, 44, 14, 0, 160, 300, "유지", null],
[127, "능조", 1067, 0, null, 45, 60, 18, 0, 160, 300, "재간", "공성"],
[127, "능통", 1068, 0, null, 47, 58, 22, 0, 160, 300, "의협", "궁병"],
[ 64, "단경", 1069, 0, null, 46, 23, 52, 0, 160, 300, "정복", null],
[132, "담웅", 1070, 0, null, 40, 58, 9, 0, 160, 300, "출세", null],
[ 99, "답둔", 1071, 0, null, 43, 54, 13, 0, 160, 300, "유지", null],
[132, "당자", 1072, 0, null, 43, 45, 18, 0, 160, 300, "안전", null],
[ 60, "대래동주", 1073, 0, null, 36, 65, 11, 0, 160, 300, "안전", null],
[ 82, "도겸", 1074, 0, null, 40, 14, 48, 0, 160, 300, "할거", "인덕"],
[120, "도준", 1075, 0, null, 44, 46, 20, 0, 160, 300, "안전", null],
[ 73, "동궐", 1076, 0, null, 45, 20, 57, 0, 160, 300, "대의", null],
[ 62, "동다나", 1077, 0, null, 40, 54, 12, 0, 160, 300, "유지", null],
[ 2, "동민", 1078, 0, null, 40, 51, 19, 0, 160, 300, "안전", null],
[ 21, "동소", 1079, 0, null, 38, 18, 62, 0, 160, 300, "패권", null],
[127, "동습", 1080, 0, null, 41, 50, 14, 0, 160, 300, "출세", null],
[ 89, "동승", 1081, 0, null, 48, 51, 25, 0, 160, 300, "왕좌", null],
[ 78, "동윤", 1082, 0, null, 44, 12, 58, 0, 160, 300, "왕좌", null],
[ 2, "동탁", 1083, 0, null, 52, 66, 21, 0, 160, 300, "패권", "기병"],
[ 66, "동화", 1084, 0, null, 39, 64, 21, 0, 160, 300, "대의", null],
[ 32, "두예", 1085, 0, null, 52, 30, 62, 0, 160, 300, "정복", null],
[ 7, "등무", 1086, 0, null, 37, 68, 9, 0, 160, 300, "정복", null],
[ 41, "등애", 1087, 0, null, 54, 30, 67, 0, 160, 300, "패권", "신산"],
[116, "등윤", 1088, 0, null, 34, 17, 66, 0, 160, 300, "안전", null],
[ 73, "등지", 1089, 0, null, 48, 20, 60, 0, 160, 300, "할거", "경작"],
[ 41, "등충", 1090, 0, null, 43, 61, 21, 0, 160, 300, "출세", null],
[ 54, "등현", 1091, 0, null, 45, 23, 48, 0, 160, 300, "출세", null],
[ 29, "마균", 1092, 0, null, 33, 16, 68, 0, 160, 300, "안전", null],
[ 71, "마대", 1093, 0, null, 49, 59, 19, 0, 160, 300, "대의", "기병"],
[ 70, "마등", 1094, 0, null, 50, 64, 22, 0, 160, 300, "왕좌", "기병"],
[ 80, "마속", 1095, 0, null, 47, 24, 61, 0, 160, 300, "패권", "집중"],
[ 77, "마량", 1096, 0, null, 42, 11, 64, 0, 160, 300, "왕좌", null],
[ 48, "마완", 1097, 0, null, 39, 64, 12, 0, 160, 300, "안전", "기병"],
[ 19, "마준", 1098, 0, null, 38, 63, 24, 0, 160, 300, "안전", null],
[ 71, "마철", 1099, 0, null, 47, 48, 13, 0, 160, 300, "대의", "기병"],
[ 70, "마초", 1100, 0, null, 49, 70, 16, 0, 160, 300, "대의", "기병", "금마초 나가신닷!"],
[131, "마충1", 1101, 0, null, 45, 49, 20, 0, 160, 300, "재간", null],
[ 69, "마충2", 1102, 0, null, 43, 52, 20, 0, 160, 300, "출세", null],
[ 71, "마휴", 1103, 0, null, 47, 48, 14, 0, 160, 300, "대의", "기병"],
[116, "만총", 1104, 0, null, 49, 16, 58, 0, 160, 300, "할거", "신중"],
[ 51, "망아장", 1105, 0, null, 28, 64, 10, 0, 160, 300, "출세", null],
[ 44, "맹달", 1106, 0, null, 46, 25, 55, 0, 160, 300, "할거", "귀병"],
[ 60, "맹우", 1107, 0, null, 44, 59, 12, 0, 160, 300, "정복", null],
[ 60, "맹획", 1108, 0, null, 49, 67, 20, 0, 160, 300, "왕좌", "격노"],
[ 29, "모개", 1109, 0, null, 38, 56, 22, 0, 160, 300, "대의", null],
[ 51, "목록대왕", 1110, 0, null, 42, 54, 25, 0, 160, 300, "재간", "척사"],
[ 96, "목순", 1111, 0, null, 15, 10, 66, 0, 160, 300, "왕좌", null],
[ 43, "무안국", 1112, 0, null, 40, 55, 9, 0, 160, 300, "재간", null],
[ 28, "문빙", 1113, 0, null, 46, 58, 17, 0, 160, 300, "유지", null],
[ 38, "문앙", 1114, 0, null, 47, 66, 18, 0, 160, 300, "대의", null],
[102, "문추", 1115, 0, null, 47, 68, 11, 0, 160, 300, "출세", "무쌍"],
[ 38, "문흠", 1116, 0, null, 48, 58, 17, 0, 160, 300, "대의", null],
[ 49, "미당대왕", 1117, 0, null, 44, 57, 14, 0, 160, 300, "유지", null],
[108, "미방", 1118, 0, null, 42, 51, 15, 0, 160, 300, "패권", "징병"],
[ 77, "미축", 1119, 0, null, 25, 13, 65, 0, 160, 300, "왕좌", "상재"],
[ 94, "반봉", 1120, 0, null, 43, 57, 9, 0, 160, 300, "출세", null],
[ 44, "반준", 1121, 0, null, 37, 10, 66, 0, 160, 300, "안전", null],
[ 65, "방덕", 1122, 0, null, 48, 66, 25, 0, 160, 300, "의협", "기병"],
[ 73, "방통", 1123, 0, null, 52, 17, 70, 0, 160, 300, "패권", "반계"],
[ 65, "방회", 1124, 0, null, 24, 14, 59, 0, 160, 300, "안전", null],
[ 68, "배원소", 1125, 0, null, 38, 67, 14, 0, 160, 300, "재간", null],
[ 78, "번건", 1126, 0, null, 27, 13, 66, 0, 160, 300, "대의", null],
[149, "번주", 1127, 0, null, 45, 58, 10, 0, 160, 300, "할거", null],
[ 72, "법정", 1128, 0, null, 50, 13, 67, 0, 160, 300, "패권", "신산"],
[ 8, "변희", 1129, 0, null, 45, 51, 12, 0, 160, 300, "안전", null],
[121, "보질", 1130, 0, null, 42, 12, 58, 0, 160, 300, "유지", null],
[113, "복양흥", 1131, 0, null, 42, 20, 54, 0, 160, 300, "유지", null],
[110, "봉기", 1132, 0, null, 46, 20, 60, 0, 160, 300, "패권", "집중"],
[ 74, "부동", 1133, 0, null, 42, 26, 26, 0, 160, 300, "대의", null],
[108, "부사인", 1134, 0, null, 41, 47, 20, 0, 160, 300, "출세", null],
[ 38, "부손", 1135, 0, null, 23, 17, 66, 0, 160, 300, "안전", null],
[ 74, "부첨", 1136, 0, null, 43, 56, 18, 0, 160, 300, "대의", null],
[ 66, "비시", 1137, 0, null, 16, 15, 61, 0, 160, 300, "재간", null],
[141, "비연", 1138, 0, null, 45, 51, 21, 0, 160, 300, "출세", null],
[ 77, "비위", 1139, 0, null, 47, 12, 55, 0, 160, 300, "대의", null],
[144, "사광", 1140, 0, null, 42, 19, 51, 0, 160, 300, "안전", null],
[ 71, "사마가", 1141, 0, null, 43, 63, 9, 0, 160, 300, "정복", "돌격"],
[ 20, "사마랑", 1142, 0, null, 24, 14, 63, 0, 160, 300, "대의", null],
[ 24, "사마망", 1143, 0, null, 47, 23, 51, 0, 160, 300, "정복", null],
[ 24, "사마부", 1144, 0, null, 41, 13, 55, 0, 160, 300, "대의", null],
[ 31, "사마사", 1145, 0, null, 52, 24, 66, 0, 160, 300, "정복", null],
[ 31, "사마소", 1146, 0, null, 54, 24, 62, 0, 160, 300, "정복", null],
[ 31, "사마염", 1147, 0, null, 54, 58, 27, 0, 160, 300, "패권", null],
[ 30, "사마유", 1148, 0, null, 44, 18, 59, 0, 160, 300, "왕좌", null],
[ 31, "사마의", 1149, 0, null, 56, 25, 70, 0, 160, 300, "패권", "반계"],
[139, "사섭", 1150, 0, null, 44, 23, 54, 0, 160, 300, "안전", null],
[139, "사일", 1151, 0, null, 43, 18, 52, 0, 160, 300, "유지", null],
[132, "사정", 1152, 0, null, 45, 54, 10, 0, 160, 300, "안전", null],
[146, "사지", 1153, 0, null, 43, 19, 54, 0, 160, 300, "안전", null],
[144, "사휘", 1154, 0, null, 45, 54, 23, 0, 160, 300, "유지", null],
[ 35, "서막", 1155, 0, null, 42, 17, 55, 0, 160, 300, "유지", null],
[ 76, "서서", 1156, 0, null, 53, 26, 69, 0, 160, 300, "의협", "귀병"],
[124, "서성", 1157, 0, null, 51, 28, 61, 0, 160, 300, "대의", null],
[142, "서영", 1158, 0, null, 39, 63, 14, 0, 160, 300, "안전", null],
[ 23, "서질", 1159, 0, null, 41, 55, 14, 0, 160, 300, "재간", null],
[ 23, "서황", 1160, 0, null, 49, 65, 26, 0, 160, 300, "의협", "필살"],
[ 32, "석포", 1161, 0, null, 47, 49, 23, 0, 160, 300, "정복", null],
[131, "설영", 1162, 0, null, 38, 11, 64, 0, 160, 300, "유지", null],
[128, "설종", 1163, 0, null, 26, 14, 66, 0, 160, 300, "유지", null],
[ 69, "성의", 1164, 0, null, 38, 64, 10, 0, 160, 300, "재간", null],
[129, "소비", 1165, 0, null, 45, 49, 19, 0, 160, 300, "대의", null],
[ 76, "손건", 1166, 0, null, 37, 14, 67, 0, 160, 300, "대의", "거상"],
[125, "손견", 1167, 0, null, 55, 69, 28, 0, 160, 300, "왕좌", "무쌍"],
[126, "손광", 1168, 0, null, 44, 21, 46, 0, 160, 300, "유지", null],
[125, "손권", 1169, 0, null, 53, 29, 61, 0, 160, 300, "할거", "수비"],
[126, "손랑", 1170, 0, null, 26, 54, 12, 0, 160, 300, "안전", null],
[126, "손등", 1171, 0, null, 40, 16, 58, 0, 160, 300, "할거", null],
[125, "손량", 1172, 0, null, 23, 11, 68, 0, 160, 300, "할거", null],
[ 20, "손례", 1173, 0, null, 44, 24, 53, 0, 160, 300, "안전", null],
[124, "손소", 1174, 0, null, 48, 60, 26, 0, 160, 300, "정복", null],
[130, "손수", 1175, 0, null, 45, 22, 47, 0, 160, 300, "안전", null],
[126, "손유", 1176, 0, null, 49, 23, 52, 0, 160, 300, "정복", null],
[122, "손이", 1177, 0, null, 42, 49, 22, 0, 160, 300, "안전", null],
[126, "손정", 1178, 0, null, 43, 22, 49, 0, 160, 300, "유지", null],
[115, "손준", 1179, 0, null, 43, 53, 20, 0, 160, 300, "정복", null],
[ 7, "손중", 1180, 0, null, 41, 49, 11, 0, 160, 300, "안전", null],
[125, "손책", 1181, 0, null, 55, 69, 29, 0, 160, 300, "패권", "필살", "소패왕 손책이 나가신다! 길을 비켜라!"],
[115, "손침", 1182, 0, null, 39, 67, 16, 0, 160, 300, "패권", null],
[114, "손호", 1183, 0, null, 18, 68, 25, 0, 160, 300, "패권", null],
[126, "손화", 1184, 0, null, 35, 11, 67, 0, 160, 300, "왕좌", null],
[127, "손환", 1185, 0, null, 49, 25, 54, 0, 160, 300, "정복", null],
[126, "손휴", 1186, 0, null, 44, 17, 50, 0, 160, 300, "정복", null],
[117, "손흠", 1187, 0, null, 45, 49, 14, 0, 160, 300, "정복", null],
[147, "송헌", 1188, 0, null, 37, 63, 17, 0, 160, 300, "안전", null],
[ 95, "순우경", 1189, 0, null, 47, 52, 23, 0, 160, 300, "할거", null],
[ 22, "순욱1", 1190, 0, null, 41, 13, 70, 0, 160, 300, "왕좌", "집중"],
[ 22, "순유", 1191, 0, null, 47, 17, 66, 0, 160, 300, "대의", "신중"],
[ 29, "신비", 1192, 0, null, 39, 12, 68, 0, 160, 300, "재간", null],
[ 37, "신의", 1193, 0, null, 41, 48, 20, 0, 160, 300, "출세", null],
[ 37, "신탐", 1194, 0, null, 42, 46, 22, 0, 160, 300, "출세", null],
[ 85, "신평", 1195, 0, null, 46, 20, 57, 0, 160, 300, "왕좌", null],
[102, "심배", 1196, 0, null, 48, 25, 52, 0, 160, 300, "패권", "귀병"],
[126, "심영", 1197, 0, null, 41, 55, 20, 0, 160, 300, "재간", null],
[ 47, "아하소과", 1198, 0, null, 41, 57, 8, 0, 160, 300, "안전", "척사"],
[ 62, "아회남", 1199, 0, null, 40, 56, 13, 0, 160, 300, "출세", "척사"],
[ 23, "악진", 1200, 0, null, 47, 52, 22, 0, 160, 300, "대의", "돌격"],
[ 23, "악침", 1201, 0, null, 38, 52, 14, 0, 160, 300, "대의", null],
[ 63, "악환", 1202, 0, null, 41, 61, 21, 0, 160, 300, "재간", null],
[102, "안량", 1203, 0, null, 47, 67, 15, 0, 160, 300, "출세", "위압"],
[ 14, "양백", 1204, 0, null, 41, 44, 21, 0, 160, 300, "안전", null],
[ 92, "양봉1", 1205, 0, null, 42, 50, 15, 0, 160, 300, "유지", null],
[ 91, "양봉2", 1206, 0, null, 44, 58, 23, 0, 160, 300, "정복", null],
[ 13, "양송", 1207, 0, null, 13, 35, 14, 0, 160, 300, "안전", null],
[ 43, "양수", 1208, 0, null, 16, 13, 70, 0, 160, 300, "재간", "귀병"],
[ 61, "양의", 1209, 0, null, 45, 22, 54, 0, 160, 300, "유지", null],
[141, "양조1", 1210, 0, null, 46, 21, 48, 0, 160, 300, "출세", null],
[ 9, "양추1", 1211, 0, null, 40, 52, 8, 0, 160, 300, "정복", null],
[ 31, "양호", 1212, 0, null, 53, 26, 60, 0, 160, 300, "패권", null],
[ 53, "양회", 1213, 0, null, 43, 52, 16, 0, 160, 300, "출세", null],
[141, "양흥", 1214, 0, null, 40, 52, 9, 0, 160, 300, "안전", null],
[ 6, "어부라", 1215, 0, null, 49, 60, 23, 0, 160, 300, "정복", null],
[ 64, "엄강", 1216, 0, null, 42, 51, 18, 0, 160, 300, "재간", null],
[ 10, "엄백호", 1217, 0, null, 39, 66, 13, 0, 160, 300, "할거", null],
[ 10, "엄여", 1218, 0, null, 35, 66, 11, 0, 160, 300, "할거", null],
[ 69, "엄안", 1219, 0, null, 47, 62, 25, 0, 160, 300, "왕좌", null],
[ 7, "엄정", 1220, 0, null, 30, 66, 19, 0, 160, 300, "출세", null],
[121, "엄준", 1221, 0, null, 38, 11, 67, 0, 160, 300, "재간", null],
[ 71, "여개", 1222, 0, null, 40, 17, 52, 0, 160, 300, "유지", null],
[ 29, "여건", 1223, 0, null, 38, 66, 13, 0, 160, 300, "출세", null],
[107, "여광", 1224, 0, null, 43, 52, 12, 0, 160, 300, "유지", null],
[124, "여몽", 1225, 0, null, 54, 29, 67, 0, 160, 300, "패권", "궁병"],
[123, "여범", 1226, 0, null, 37, 14, 67, 0, 160, 300, "할거", null],
[107, "여상", 1227, 0, null, 44, 52, 12, 0, 160, 300, "유지", null],
[105, "여위황", 1228, 0, null, 37, 62, 16, 0, 160, 300, "정복", null],
[145, "여포", 1229, 0, null, 48, 72, 13, 0, 160, 300, "패권", "돌격", "다 죽여버리겠다! 으하하."],
[ 50, "염우", 1230, 0, null, 42, 42, 9, 0, 160, 300, "출세", null],
[ 40, "염유", 1231, 0, null, 43, 57, 20, 0, 160, 300, "출세", null],
[ 18, "염포", 1232, 0, null, 33, 15, 68, 0, 160, 300, "유지", null],
[ 40, "예형", 1233, 0, null, 49, 13, 69, 0, 160, 300, "은둔", "통찰"],
[133, "오강", 1234, 0, null, 39, 15, 61, 0, 160, 300, "안전", null],
[ 59, "오란", 1235, 0, null, 45, 57, 17, 0, 160, 300, "재간", null],
[ 72, "오반", 1236, 0, null, 46, 51, 18, 0, 160, 300, "재간", null],
[128, "오언", 1237, 0, null, 47, 48, 20, 0, 160, 300, "재간", null],
[126, "오연", 1238, 0, null, 35, 67, 13, 0, 160, 300, "정복", null],
[ 69, "오의", 1239, 0, null, 48, 27, 56, 0, 160, 300, "유지", null],
[ 19, "오질", 1240, 0, null, 37, 15, 67, 0, 160, 300, "출세", null],
[ 51, "올돌골", 1241, 0, null, 49, 67, 8, 0, 160, 300, "출세", "척사"],
[ 52, "옹개", 1242, 0, null, 42, 52, 20, 0, 160, 300, "안전", null],
[ 20, "왕경", 1243, 0, null, 41, 19, 51, 0, 160, 300, "재간", null],
[ 97, "왕광", 1244, 0, null, 47, 52, 21, 0, 160, 300, "유지", null],
[ 30, "왕기1", 1245, 0, null, 48, 24, 54, 0, 160, 300, "유지", null],
[ 34, "왕랑", 1246, 0, null, 39, 13, 51, 0, 160, 300, "할거", null],
[ 57, "왕루", 1247, 0, null, 36, 12, 68, 0, 160, 300, "유지", null],
[ 76, "왕보", 1248, 0, null, 39, 14, 68, 0, 160, 300, "대의", null],
[ 86, "왕수", 1249, 0, null, 34, 14, 66, 0, 160, 300, "재간", null],
[ 26, "왕쌍", 1250, 0, null, 42, 65, 8, 0, 160, 300, "정복", "보병"],
[ 46, "왕위", 1251, 0, null, 43, 23, 52, 0, 160, 300, "안전", null],
[ 92, "왕윤", 1252, 0, null, 14, 9, 68, 0, 160, 300, "왕좌", null],
[ 40, "왕융", 1253, 0, null, 44, 17, 58, 0, 160, 300, "재간", null],
[ 32, "왕준", 1254, 0, null, 50, 61, 28, 0, 160, 300, "대의", null],
[ 30, "왕찬", 1255, 0, null, 27, 12, 68, 0, 160, 300, "안전", null],
[ 33, "왕창", 1256, 0, null, 48, 46, 20, 0, 160, 300, "정복", null],
[ 69, "왕평", 1257, 0, null, 49, 57, 27, 0, 160, 300, "재간", null],
[ 71, "왕항", 1258, 0, null, 40, 17, 48, 0, 160, 300, "대의", null],
[ 33, "왕혼", 1259, 0, null, 46, 14, 47, 0, 160, 300, "정복", null],
[ 71, "요립", 1260, 0, null, 45, 17, 62, 0, 160, 300, "출세", null],
[ 74, "요화", 1261, 0, null, 45, 22, 48, 0, 160, 300, "의협", null],
[ 22, "우금1", 1262, 0, null, 50, 56, 27, 0, 160, 300, "정복", null],
[ 27, "우금2", 1263, 0, null, 44, 58, 15, 0, 160, 300, "대의", null],
[122, "우번", 1264, 0, null, 22, 17, 67, 0, 160, 300, "유지", null],
[126, "우전", 1265, 0, null, 44, 45, 17, 0, 160, 300, "안전", null],
[ 86, "원담", 1266, 0, null, 45, 47, 21, 0, 160, 300, "왕좌", null],
[101, "원상", 1267, 0, null, 41, 55, 26, 0, 160, 300, "패권", null],
[101, "원소", 1268, 0, null, 51, 25, 57, 0, 160, 300, "패권", "위압"],
[140, "원술", 1269, 0, null, 49, 23, 54, 0, 160, 300, "패권", "축성"],
[140, "원윤", 1270, 0, null, 37, 14, 60, 0, 160, 300, "패권", null],
[101, "원희", 1271, 0, null, 46, 22, 55, 0, 160, 300, "할거", null],
[131, "위소", 1272, 0, null, 36, 11, 69, 0, 160, 300, "재간", null],
[147, "위속", 1273, 0, null, 42, 47, 17, 0, 160, 300, "안전", null],
[ 81, "위연", 1274, 0, null, 49, 68, 24, 0, 160, 300, "패권", "보병"],
[ 96, "위유", 1275, 0, null, 41, 26, 54, 0, 160, 300, "재간", null],
[ 76, "유기", 1276, 0, null, 42, 9, 55, 0, 160, 300, "왕좌", null],
[ 36, "유대", 1277, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
[134, "유도", 1278, 0, null, 35, 14, 66, 0, 160, 300, "재간", null],
[ 46, "유벽", 1279, 0, null, 44, 54, 11, 0, 160, 300, "출세", null],
[ 75, "유봉", 1280, 0, null, 43, 51, 24, 0, 160, 300, "출세", null],
[ 75, "유비", 1281, 0, null, 51, 57, 26, 0, 160, 300, "왕좌", "인덕"],
[ 75, "유선1", 1282, 0, null, 23, 17, 24, 0, 160, 300, "대의", null],
[ 55, "유순", 1283, 0, null, 45, 48, 21, 0, 160, 300, "출세", null],
[ 75, "유심", 1284, 0, null, 44, 18, 54, 0, 160, 300, "왕좌", null],
[129, "유약", 1285, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
[ 55, "유언", 1286, 0, null, 43, 16, 56, 0, 160, 300, "할거", null],
[ 27, "유엽", 1287, 0, null, 36, 13, 68, 0, 160, 300, "유지", null],
[ 11, "유요", 1288, 0, null, 22, 10, 48, 0, 160, 300, "안전", "발명"],
[ 96, "유우", 1289, 0, null, 46, 14, 55, 0, 160, 300, "왕좌", null],
[ 55, "유장", 1290, 0, null, 36, 13, 63, 0, 160, 300, "할거", "수비"],
[ 45, "유종", 1291, 0, null, 20, 12, 61, 0, 160, 300, "할거", null],
[ 56, "유파", 1292, 0, null, 39, 14, 67, 0, 160, 300, "대의", null],
[ 45, "유표1", 1293, 0, null, 47, 22, 54, 0, 160, 300, "할거", null],
[ 27, "유표2", 1294, 0, null, 48, 21, 54, 0, 160, 300, "안전", null],
[134, "유현", 1295, 0, null, 31, 56, 21, 0, 160, 300, "안전", null],
[122, "육개", 1296, 0, null, 45, 13, 55, 0, 160, 300, "재간", null],
[122, "육손", 1297, 0, null, 56, 26, 70, 0, 160, 300, "왕좌", "귀병"],
[121, "육적", 1298, 0, null, 38, 13, 67, 0, 160, 300, "안전", null],
[122, "육항", 1299, 0, null, 55, 26, 68, 0, 160, 300, "왕좌", null],
[ 38, "윤대목", 1300, 0, null, 44, 19, 53, 0, 160, 300, "재간", null],
[ 80, "윤묵", 1301, 0, null, 17, 12, 67, 0, 160, 300, "대의", null],
[ 72, "윤상", 1302, 0, null, 29, 14, 42, 0, 160, 300, "대의", null],
[136, "윤직", 1303, 0, null, 38, 58, 49, 0, 160, 300, "재간", null],
[ 2, "이각", 1304, 0, null, 42, 58, 17, 0, 160, 300, "패권", null],
[146, "이숙", 1305, 0, null, 26, 18, 66, 0, 160, 300, "재간", null],
[ 71, "이엄", 1306, 0, null, 50, 62, 30, 0, 160, 300, "패권", null],
[ 2, "이유", 1307, 0, null, 44, 10, 66, 0, 160, 300, "패권", "귀모"],
[132, "이이", 1308, 0, null, 41, 57, 10, 0, 160, 300, "정복", null],
[ 77, "이적", 1309, 0, null, 41, 12, 58, 0, 160, 300, "할거", null],
[ 22, "이전", 1310, 0, null, 48, 26, 61, 0, 160, 300, "왕좌", null],
[ 71, "이풍1", 1311, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
[ 66, "이회", 1312, 0, null, 45, 20, 59, 0, 160, 300, "유지", null],
[114, "잠혼", 1313, 0, null, 13, 8, 44, 0, 160, 300, "할거", null],
[ 7, "장각", 1314, 0, null, 54, 11, 67, 0, 160, 300, "패권", "환술"],
[ 34, "장간", 1315, 0, null, 17, 10, 67, 0, 160, 300, "재간", null],
[ 7, "장개", 1316, 0, null, 39, 67, 9, 0, 160, 300, "안전", null],
[122, "장굉", 1317, 0, null, 24, 10, 69, 0, 160, 300, "왕좌", null],
[ 7, "장량", 1318, 0, null, 46, 60, 26, 0, 160, 300, "정복", "환술"],
[ 15, "장로", 1319, 0, null, 48, 18, 60, 0, 160, 300, "유지", "축성"],
[ 23, "장료", 1320, 0, null, 53, 67, 31, 0, 160, 300, "의협", "견고"],
[ 7, "장보", 1321, 0, null, 49, 60, 28, 0, 160, 300, "패권", "환술"],
[ 76, "장비", 1322, 0, null, 49, 71, 19, 0, 160, 300, "의협", "무쌍", "어쭈. 해보자 이거냐?"],
[ 62, "장서", 1323, 0, null, 38, 48, 15, 0, 160, 300, "출세", null],
[120, "장소1", 1324, 0, null, 37, 11, 70, 0, 160, 300, "안전", null],
[ 78, "장소2", 1325, 0, null, 40, 18, 54, 0, 160, 300, "재간", null],
[ 72, "장송", 1326, 0, null, 39, 12, 70, 0, 160, 300, "할거", "통찰"],
[148, "장수", 1327, 0, null, 47, 55, 26, 0, 160, 300, "할거", null],
[145, "장양1", 1328, 0, null, 44, 51, 25, 0, 160, 300, "출세", null],
[ 8, "장연", 1329, 0, null, 49, 51, 19, 0, 160, 300, "안전", null],
[ 11, "장영", 1330, 0, null, 41, 51, 16, 0, 160, 300, "재간", null],
[118, "장온", 1331, 0, null, 19, 13, 67, 0, 160, 300, "할거", null],
[ 78, "장완", 1332, 0, null, 46, 21, 63, 0, 160, 300, "할거", "상재"],
[ 15, "장위", 1333, 0, null, 45, 54, 13, 0, 160, 300, "대의", null],
[ 36, "장윤", 1334, 0, null, 45, 23, 48, 0, 160, 300, "정복", null],
[104, "장의거", 1335, 0, null, 46, 47, 14, 0, 160, 300, "대의", null],
[ 68, "장익", 1336, 0, null, 48, 52, 24, 0, 160, 300, "유지", null],
[ 56, "장임", 1337, 0, null, 51, 61, 28, 0, 160, 300, "대의", "견고"],
[148, "장제1", 1338, 0, null, 46, 51, 23, 0, 160, 300, "할거", null],
[ 32, "장제2", 1339, 0, null, 29, 14, 69, 0, 160, 300, "유지", null],
[126, "장제3", 1340, 0, null, 48, 19, 48, 0, 160, 300, "할거", null],
[ 17, "장패", 1341, 0, null, 38, 68, 17, 0, 160, 300, "할거", null],
[ 76, "장포1", 1342, 0, null, 46, 63, 19, 0, 160, 300, "재간", "징병"],
[113, "장포2", 1343, 0, null, 44, 51, 20, 0, 160, 300, "유지", null],
[ 27, "장합", 1344, 0, null, 51, 66, 24, 0, 160, 300, "출세", "궁병"],
[ 23, "장호", 1345, 0, null, 42, 49, 21, 0, 160, 300, "정복", null],
[ 31, "장화", 1346, 0, null, 39, 11, 69, 0, 160, 300, "유지", null],
[ 48, "장횡", 1347, 0, null, 41, 52, 11, 0, 160, 300, "재간", null],
[141, "장훈", 1348, 0, null, 45, 48, 23, 0, 160, 300, "안전", null],
[120, "장휴", 1349, 0, null, 37, 15, 67, 0, 160, 300, "재간", null],
[126, "장흠", 1350, 0, null, 44, 25, 52, 0, 160, 300, "대의", "저격"],
[ 96, "저수", 1351, 0, null, 50, 21, 64, 0, 160, 300, "할거", "반계"],
[130, "전단", 1352, 0, null, 44, 55, 23, 0, 160, 300, "출세", null],
[ 42, "전속", 1353, 0, null, 45, 46, 19, 0, 160, 300, "안전", null],
[ 26, "전위1", 1354, 0, null, 43, 69, 14, 0, 160, 300, "의협", "필살"],
[130, "전위2", 1355, 0, null, 48, 53, 24, 0, 160, 300, "출세", null],
[128, "전종", 1356, 0, null, 49, 58, 28, 0, 160, 300, "패권", null],
[ 42, "전주", 1357, 0, null, 46, 52, 20, 0, 160, 300, "의협", null],
[ 96, "전풍", 1358, 0, null, 50, 17, 69, 0, 160, 300, "왕좌", null],
[ 24, "정무", 1359, 0, null, 41, 16, 56, 0, 160, 300, "출세", null],
[119, "정병", 1360, 0, null, 20, 11, 66, 0, 160, 300, "유지", null],
[126, "정보", 1361, 0, null, 50, 24, 57, 0, 160, 300, "패권", null],
[123, "정봉1", 1362, 0, null, 46, 58, 24, 0, 160, 300, "패권", null],
[ 24, "정욱", 1363, 0, null, 50, 16, 66, 0, 160, 300, "패권", "신중"],
[ 88, "정원", 1364, 0, null, 44, 58, 22, 0, 160, 300, "왕좌", "기병"],
[ 7, "정원지", 1365, 0, null, 37, 68, 16, 0, 160, 300, "출세", null],
[ 69, "정은", 1366, 0, null, 41, 49, 12, 0, 160, 300, "재간", null],
[121, "제갈각", 1367, 0, null, 43, 21, 67, 0, 160, 300, "왕좌", null],
[ 76, "제갈균", 1368, 0, null, 43, 18, 56, 0, 160, 300, "안전", "상재"],
[121, "제갈근", 1369, 0, null, 43, 17, 64, 0, 160, 300, "왕좌", "경작"],
[ 76, "제갈량", 1370, 0, null, 55, 21, 72, 0, 160, 300, "왕좌", "집중", "슬슬 나의 지모를 발휘해 보겠습니다..."],
[ 76, "제갈상", 1371, 0, null, 40, 57, 27, 0, 160, 300, "대의", null],
[135, "제갈정", 1372, 0, null, 42, 46, 21, 0, 160, 300, "안전", null],
[ 76, "제갈첨", 1373, 0, null, 47, 20, 57, 0, 160, 300, "대의", null],
[135, "제갈탄", 1374, 0, null, 49, 59, 27, 0, 160, 300, "패권", null],
[ 76, "조광", 1375, 0, null, 45, 52, 21, 0, 160, 300, "재간", null],
[ 74, "조루", 1376, 0, null, 39, 15, 60, 0, 160, 300, "대의", null],
[ 24, "조모", 1377, 0, null, 41, 31, 13, 0, 160, 300, "할거", null],
[127, "조무", 1378, 0, null, 47, 26, 54, 0, 160, 300, "의협", null],
[ 26, "조방", 1379, 0, null, 40, 10, 30, 0, 160, 300, "정복", null],
[ 83, "조범", 1380, 0, null, 42, 16, 49, 0, 160, 300, "유지", null],
[ 26, "조비", 1381, 0, null, 47, 26, 57, 0, 160, 300, "패권", "징병"],
[ 19, "조상", 1382, 0, null, 46, 49, 13, 0, 160, 300, "패권", null],
[147, "조성", 1383, 0, null, 38, 67, 20, 0, 160, 300, "안전", null],
[ 26, "조순", 1384, 0, null, 45, 22, 55, 0, 160, 300, "정복", null],
[ 25, "조식", 1385, 0, null, 17, 9, 70, 0, 160, 300, "왕좌", "귀모"],
[ 25, "조앙", 1386, 0, null, 38, 65, 24, 0, 160, 300, "왕좌", null],
[ 25, "조예", 1387, 0, null, 42, 21, 61, 0, 160, 300, "정복", null],
[ 26, "조우", 1388, 0, null, 45, 21, 52, 0, 160, 300, "대의", null],
[ 76, "조운", 1389, 0, null, 55, 70, 32, 0, 160, 300, "왕좌", "무쌍", "창술의 달인 상산 조자룡 여기 있소!"],
[ 25, "조웅", 1390, 0, null, 43, 12, 38, 0, 160, 300, "안전", null],
[ 26, "조인", 1391, 0, null, 48, 59, 24, 0, 160, 300, "패권", "보병"],
[ 25, "조조", 1392, 0, null, 56, 30, 69, 0, 160, 300, "패권", "반계"],
[ 26, "조진", 1393, 0, null, 50, 52, 25, 0, 160, 300, "정복", null],
[ 25, "조창", 1394, 0, null, 48, 64, 15, 0, 160, 300, "정복", "돌격"],
[ 76, "조통", 1395, 0, null, 45, 50, 21, 0, 160, 300, "재간", null],
[ 84, "조표", 1396, 0, null, 34, 67, 8, 0, 160, 300, "안전", null],
[ 7, "조홍1", 1397, 0, null, 40, 51, 17, 0, 160, 300, "유지", null],
[ 24, "조홍2", 1398, 0, null, 47, 53, 18, 0, 160, 300, "패권", null],
[ 26, "조환", 1399, 0, null, 34, 11, 42, 0, 160, 300, "정복", null],
[ 19, "조훈", 1400, 0, null, 45, 49, 13, 0, 160, 300, "출세", null],
[ 26, "조휴", 1401, 0, null, 48, 54, 26, 0, 160, 300, "패권", null],
[ 19, "조희", 1402, 0, null, 44, 22, 54, 0, 160, 300, "대의", null],
[ 22, "종요", 1403, 0, null, 14, 10, 68, 0, 160, 300, "유지", null],
[ 20, "종회", 1404, 0, null, 51, 22, 67, 0, 160, 300, "패권", null],
[128, "주거", 1405, 0, null, 47, 27, 55, 0, 160, 300, "유지", null],
[118, "주방", 1406, 0, null, 42, 15, 57, 0, 160, 300, "할거", null],
[126, "주연", 1407, 0, null, 47, 55, 20, 0, 160, 300, "할거", null],
[126, "주유", 1408, 0, null, 55, 27, 70, 0, 160, 300, "패권", "신산"],
[128, "주이", 1409, 0, null, 43, 21, 48, 0, 160, 300, "안전", null],
[ 88, "주준", 1410, 0, null, 50, 57, 25, 0, 160, 300, "왕좌", null],
[ 32, "주지", 1411, 0, null, 40, 58, 19, 0, 160, 300, "안전", null],
[ 76, "주창", 1412, 0, null, 37, 68, 13, 0, 160, 300, "의협", "궁병"],
[126, "주치", 1413, 0, null, 42, 21, 45, 0, 160, 300, "안전", null],
[ 41, "주태1", 1414, 0, null, 44, 21, 48, 0, 160, 300, "안전", null],
[126, "주태2", 1415, 0, null, 48, 64, 23, 0, 160, 300, "정복", "필살"],
[128, "주환", 1416, 0, null, 51, 63, 28, 0, 160, 300, "정복", null],
[ 29, "진건", 1417, 0, null, 44, 54, 24, 0, 160, 300, "정복", null],
[ 29, "진교", 1418, 0, null, 19, 11, 66, 0, 160, 300, "유지", null],
[ 28, "진군", 1419, 0, null, 43, 16, 64, 0, 160, 300, "대의", null],
[143, "진궁", 1420, 0, null, 49, 20, 66, 0, 160, 300, "할거", "신중"],
[ 79, "진규", 1421, 0, null, 20, 9, 67, 0, 160, 300, "할거", null],
[ 72, "진도", 1422, 0, null, 47, 63, 26, 0, 160, 300, "대의", null],
[ 79, "진등", 1423, 0, null, 44, 24, 54, 0, 160, 300, "할거", null],
[ 37, "진림", 1424, 0, null, 40, 12, 61, 0, 160, 300, "재간", null],
[124, "진무", 1425, 0, null, 44, 56, 23, 0, 160, 300, "재간", null],
[ 66, "진복", 1426, 0, null, 35, 12, 68, 0, 160, 300, "재간", null],
[ 50, "진수", 1427, 0, null, 24, 13, 69, 0, 160, 300, "대의", null],
[ 81, "진식", 1428, 0, null, 39, 66, 20, 0, 160, 300, "출세", null],
[ 79, "진진", 1429, 0, null, 42, 16, 50, 0, 160, 300, "재간", null],
[ 28, "진태", 1430, 0, null, 49, 57, 26, 0, 160, 300, "대의", null],
[ 11, "진횡", 1431, 0, null, 36, 58, 19, 0, 160, 300, "출세", null],
[ 21, "차주", 1432, 0, null, 41, 51, 24, 0, 160, 300, "안전", null],
[ 11, "착융", 1433, 0, null, 44, 47, 10, 0, 160, 300, "출세", null],
[ 36, "채모", 1434, 0, null, 49, 53, 26, 0, 160, 300, "정복", "궁병"],
[ 36, "채중", 1435, 0, null, 42, 17, 45, 0, 160, 300, "출세", null],
[ 36, "채화", 1436, 0, null, 42, 19, 41, 0, 160, 300, "안전", null],
[ 66, "초주", 1437, 0, null, 20, 12, 69, 0, 160, 300, "대의", null],
[ 20, "최염", 1438, 0, null, 37, 54, 52, 0, 160, 300, "대의", null],
[ 60, "축융", 1439, 0, null, 43, 64, 11, 0, 160, 300, "정복", "척사"],
[ 60, "타사대왕", 1440, 0, null, 43, 55, 25, 0, 160, 300, "출세", "척사"],
[124, "태사자", 1441, 0, null, 47, 70, 25, 0, 160, 300, "대의", "무쌍"],
[124, "태사향", 1442, 0, null, 40, 53, 20, 0, 160, 300, "재간", null],
[ 12, "포륭", 1443, 0, null, 41, 56, 10, 0, 160, 300, "안전", null],
[ 74, "풍습", 1444, 0, null, 35, 64, 18, 0, 160, 300, "재간", null],
[ 7, "하의", 1445, 0, null, 39, 66, 11, 0, 160, 300, "출세", null],
[121, "하제", 1446, 0, null, 48, 55, 24, 0, 160, 300, "재간", null],
[ 90, "하진", 1447, 0, null, 39, 67, 15, 0, 160, 300, "왕좌", null],
[ 24, "하후덕", 1448, 0, null, 45, 50, 16, 0, 160, 300, "출세", null],
[ 26, "하후돈", 1449, 0, null, 52, 67, 27, 0, 160, 300, "의협", "돌격", "다 나오거라! 상대해 주마!"],
[ 19, "하후무", 1450, 0, null, 36, 33, 34, 0, 160, 300, "안전", null],
[ 24, "하후상", 1451, 0, null, 45, 24, 54, 0, 160, 300, "출세", null],
[ 26, "하후연", 1452, 0, null, 49, 66, 22, 0, 160, 300, "패권", "궁병", "궁술로 날 당해낼 자가 있을까? 후후."],
[ 26, "하후위", 1453, 0, null, 47, 57, 27, 0, 160, 300, "정복", null],
[ 26, "하후은", 1454, 0, null, 39, 51, 16, 0, 160, 300, "안전", null],
[ 23, "하후패", 1455, 0, null, 49, 64, 26, 0, 160, 300, "대의", null],
[ 20, "하후현", 1456, 0, null, 42, 11, 57, 0, 160, 300, "유지", null],
[ 26, "하후혜", 1457, 0, null, 48, 25, 58, 0, 160, 300, "정복", null],
[ 26, "하후화", 1458, 0, null, 49, 23, 60, 0, 160, 300, "정복", null],
[ 22, "학소", 1459, 0, null, 53, 30, 63, 0, 160, 300, "대의", "견고"],
[126, "한당", 1460, 0, null, 46, 52, 24, 0, 160, 300, "할거", null],
[ 93, "한복", 1461, 0, null, 45, 47, 17, 0, 160, 300, "안전", null],
[ 8, "한섬", 1462, 0, null, 36, 62, 15, 0, 160, 300, "출세", null],
[ 48, "한수", 1463, 0, null, 45, 28, 58, 0, 160, 300, "대의", "기병"],
[ 40, "한숭", 1464, 0, null, 19, 11, 67, 0, 160, 300, "재간", null],
[ 7, "한충", 1465, 0, null, 37, 66, 13, 0, 160, 300, "안전", null],
[ 9, "한현", 1466, 0, null, 37, 61, 10, 0, 160, 300, "유지", null],
[ 27, "한호", 1467, 0, null, 43, 55, 18, 0, 160, 300, "유지", null],
[ 79, "향랑", 1468, 0, null, 40, 10, 58, 0, 160, 300, "대의", null],
[ 79, "향총", 1469, 0, null, 48, 17, 55, 0, 160, 300, "왕좌", null],
[139, "허공", 1470, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
[ 21, "허유", 1471, 0, null, 39, 47, 46, 0, 160, 300, "재간", null],
[ 23, "허의", 1472, 0, null, 30, 68, 19, 0, 160, 300, "출세", null],
[ 26, "허저", 1473, 0, null, 42, 70, 12, 0, 160, 300, "정복", "무쌍"],
[ 87, "허정", 1474, 0, null, 16, 13, 68, 0, 160, 300, "재간", null],
[ 12, "형도영", 1475, 0, null, 39, 68, 11, 0, 160, 300, "출세", null],
[148, "호거아", 1476, 0, null, 35, 68, 23, 0, 160, 300, "안전", null],
[ 76, "호반", 1477, 0, null, 43, 46, 18, 0, 160, 300, "재간", null],
[ 20, "호분", 1478, 0, null, 47, 23, 48, 0, 160, 300, "할거", null],
[ 27, "호주천", 1479, 0, null, 49, 57, 25, 0, 160, 300, "정복", null],
[ 20, "호준", 1480, 0, null, 45, 48, 18, 0, 160, 300, "재간", null],
[ 2, "화웅", 1481, 0, null, 46, 64, 11, 0, 160, 300, "출세", "돌격"],
[131, "화핵", 1482, 0, null, 35, 12, 68, 0, 160, 300, "안전", null],
[ 10, "화흠", 1483, 0, null, 16, 17, 68, 0, 160, 300, "출세", null],
[ 21, "환범", 1484, 0, null, 18, 11, 69, 0, 160, 300, "유지", null],
[127, "황개", 1485, 0, null, 49, 63, 26, 0, 160, 300, "왕좌", "징병"],
[ 56, "황권", 1486, 0, null, 48, 18, 58, 0, 160, 300, "대의", null],
[ 41, "황란", 1487, 0, null, 28, 67, 11, 0, 160, 300, "재간", null],
[ 88, "황보숭", 1488, 0, null, 51, 24, 55, 0, 160, 300, "왕좌", null],
[ 72, "황충", 1489, 0, null, 51, 68, 25, 0, 160, 300, "왕좌", "궁병"],
[ 50, "황호", 1490, 0, null, 13, 9, 48, 0, 160, 300, "안전", null],
[147, "후성", 1491, 0, null, 42, 49, 14, 0, 160, 300, "정복", null]
],
"general_ex":[
[123, "가화", 1492, 0, null, 40, 51, 16, 0, 160, 300, null, null],
[999, "건석", 1493, 0, null, 19, 7, 61, 0, 160, 300, null, null],
[999, "견씨", 1494, 0, null, 35, 11, 58, 0, 160, 300, null, null],
[ 40, "견홍", 1495, 0, null, 48, 55, 25, 0, 160, 300, null, null],
[120, "고담", 1496, 0, null, 33, 10, 67, 0, 160, 300, null, null],
[101, "고유", 1497, 0, null, 42, 18, 55, 0, 160, 300, null, null],
[132, "곽마", 1498, 0, null, 46, 54, 19, 0, 160, 300, null, null],
[ 39, "관구수", 1499, 0, null, 42, 49, 15, 0, 160, 300, null, null],
[ 39, "관구전", 1500, 0, null, 44, 22, 52, 0, 160, 300, null, null],
[999, "관로", 1501, 0, null, 44, 10, 57, 0, 160, 300, null, null],
[ 65, "관정", 1502, 0, null, 35, 20, 67, 0, 160, 300, null, null],
[137, "교수", 1503, 0, null, 45, 53, 16, 0, 160, 300, null, null],
[ 33, "구건", 1504, 0, null, 37, 56, 53, 0, 160, 300, null, null],
[ 41, "구본", 1505, 0, null, 40, 17, 54, 0, 160, 300, null, null],
[ 12, "구성", 1506, 0, null, 42, 54, 13, 0, 160, 300, null, null],
[ 21, "국연", 1507, 0, null, 40, 10, 54, 0, 160, 300, null, null],
[ 99, "국의", 1508, 0, null, 51, 59, 20, 0, 160, 300, null, null],
[ 34, "금의", 1509, 0, null, 16, 16, 63, 0, 160, 300, null, null],
[ 76, "나헌", 1510, 0, null, 52, 25, 57, 0, 160, 300, null, null],
[999, "남두", 1511, 0, null, 35, 11, 54, 0, 160, 300, null, null],
[ 54, "냉포", 1512, 0, null, 46, 61, 26, 0, 160, 300, null, null],
[124, "노숙2", 1513, 0, null, 46, 21, 57, 0, 160, 300, null, null],
[ 42, "누규", 1514, 0, null, 41, 9, 64, 0, 160, 300, null, null],
[ 6, "누반", 1515, 0, null, 45, 57, 16, 0, 160, 300, null, null],
[130, "누현", 1516, 0, null, 22, 10, 66, 0, 160, 300, null, null],
[ 40, "당균", 1517, 0, null, 33, 9, 69, 0, 160, 300, null, null],
[ 32, "당빈", 1518, 0, null, 46, 56, 24, 0, 160, 300, null, null],
[999, "대교", 1519, 0, null, 37, 6, 54, 0, 160, 300, null, null],
[ 28, "대릉", 1520, 0, null, 44, 57, 18, 0, 160, 300, null, null],
[129, "동조", 1521, 0, null, 14, 8, 51, 0, 160, 300, null, null],
[114, "등수", 1522, 0, null, 35, 10, 44, 0, 160, 300, null, null],
[ 50, "마막", 1523, 0, null, 20, 17, 5, 0, 160, 300, null, null],
[116, "만욱", 1524, 0, null, 18, 9, 66, 0, 160, 300, null, null],
[120, "맹종", 1525, 0, null, 39, 19, 66, 0, 160, 300, null, null],
[ 38, "문호", 1526, 0, null, 45, 56, 18, 0, 160, 300, null, null],
[999, "미씨", 1527, 0, null, 43, 8, 52, 0, 160, 300, null, null],
[ 39, "반림", 1528, 0, null, 45, 59, 6, 0, 160, 300, null, null],
[129, "반장", 1529, 0, null, 49, 58, 26, 0, 160, 300, null, null],
[ 94, "방열", 1530, 0, null, 42, 61, 12, 0, 160, 300, null, null],
[ 55, "방희", 1531, 0, null, 43, 16, 53, 0, 160, 300, null, null],
[ 30, "배수", 1532, 0, null, 7, 7, 68, 0, 160, 300, null, null],
[ 8, "번능", 1533, 0, null, 46, 48, 19, 0, 160, 300, null, null],
[999, "번씨", 1534, 0, null, 31, 9, 45, 0, 160, 300, null, null],
[ 49, "보도근", 1535, 0, null, 44, 55, 20, 0, 160, 300, null, null],
[129, "보천", 1536, 0, null, 46, 23, 55, 0, 160, 300, null, null],
[121, "보협", 1537, 0, null, 47, 21, 57, 0, 160, 300, null, null],
[ 28, "부하", 1538, 0, null, 38, 15, 69, 0, 160, 300, null, null],
[ 26, "비요", 1539, 0, null, 46, 25, 55, 0, 160, 300, null, null],
[ 31, "사마주", 1540, 0, null, 44, 21, 49, 0, 160, 300, null, null],
[ 41, "사찬", 1541, 0, null, 43, 54, 21, 0, 160, 300, null, null],
[128, "설후", 1542, 0, null, 14, 8, 67, 0, 160, 300, null, null],
[ 36, "성공영", 1543, 0, null, 47, 22, 60, 0, 160, 300, null, null],
[126, "성만", 1544, 0, null, 43, 53, 25, 0, 160, 300, null, null],
[999, "소교", 1545, 0, null, 42, 11, 51, 0, 160, 300, null, null],
[ 46, "소유", 1546, 0, null, 40, 48, 19, 0, 160, 300, null, null],
[ 31, "소제2", 1547, 0, null, 20, 8, 68, 0, 160, 300, null, null],
[126, "손교", 1548, 0, null, 49, 23, 53, 0, 160, 300, null, null],
[116, "손기", 1549, 0, null, 44, 51, 20, 0, 160, 300, null, null],
[999, "손상향", 1550, 0, null, 47, 49, 17, 0, 160, 300, null, null],
[125, "손익", 1551, 0, null, 46, 57, 12, 0, 160, 300, null, null],
[125, "손진", 1552, 0, null, 44, 54, 19, 0, 160, 300, null, null],
[123, "송겸", 1553, 0, null, 43, 40, 18, 0, 160, 300, null, null],
[ 85, "순심", 1554, 0, null, 18, 10, 68, 0, 160, 300, null, null],
[ 31, "순욱2", 1555, 0, null, 7, 8, 68, 0, 160, 300, null, null],
[ 31, "순의", 1556, 0, null, 14, 7, 67, 0, 160, 300, null, null],
[129, "시삭", 1557, 0, null, 35, 66, 18, 0, 160, 300, null, null],
[ 29, "신창", 1558, 0, null, 40, 13, 39, 0, 160, 300, null, null],
[999, "악신", 1559, 0, null, 41, 7, 39, 0, 160, 300, null, null],
[138, "악취", 1560, 0, null, 42, 52, 22, 0, 160, 300, null, null],
[138, "양강", 1561, 0, null, 44, 54, 17, 0, 160, 300, null, null],
[ 21, "양부", 1562, 0, null, 46, 21, 63, 0, 160, 300, null, null],
[ 72, "양서", 1563, 0, null, 42, 24, 51, 0, 160, 300, null, null],
[ 34, "양습", 1564, 0, null, 45, 19, 55, 0, 160, 300, null, null],
[ 16, "양앙", 1565, 0, null, 45, 54, 16, 0, 160, 300, null, null],
[ 17, "양임", 1566, 0, null, 47, 58, 22, 0, 160, 300, null, null],
[ 32, "양제", 1567, 0, null, 46, 24, 54, 0, 160, 300, null, null],
[ 33, "양조2", 1568, 0, null, 45, 23, 52, 0, 160, 300, null, null],
[ 48, "양추2", 1569, 0, null, 45, 52, 23, 0, 160, 300, null, null],
[140, "양홍", 1570, 0, null, 17, 9, 68, 0, 160, 300, null, null],
[ 31, "양혼", 1571, 0, null, 43, 52, 24, 0, 160, 300, null, null],
[123, "여거", 1572, 0, null, 47, 22, 53, 0, 160, 300, null, null],
[130, "여대", 1573, 0, null, 51, 55, 26, 0, 160, 300, null, null],
[136, "염상", 1574, 0, null, 28, 12, 67, 0, 160, 300, null, null],
[ 36, "염행", 1575, 0, null, 46, 63, 16, 0, 160, 300, null, null],
[ 73, "영수", 1576, 0, null, 46, 26, 56, 0, 160, 300, null, null],
[ 39, "오거", 1577, 0, null, 39, 63, 14, 0, 160, 300, null, null],
[126, "오경", 1578, 0, null, 47, 48, 22, 0, 160, 300, null, null],
[999, "오국태", 1579, 0, null, 30, 7, 60, 0, 160, 300, null, null],
[126, "오찬", 1580, 0, null, 46, 17, 58, 0, 160, 300, null, null],
[ 23, "온회", 1581, 0, null, 37, 16, 68, 0, 160, 300, null, null],
[ 21, "왕기2", 1582, 0, null, 46, 51, 24, 0, 160, 300, null, null],
[ 32, "왕도", 1583, 0, null, 39, 18, 67, 0, 160, 300, null, null],
[123, "왕돈", 1584, 0, null, 43, 51, 17, 0, 160, 300, null, null],
[ 34, "왕릉", 1585, 0, null, 47, 23, 54, 0, 160, 300, null, null],
[ 63, "왕문", 1586, 0, null, 44, 52, 14, 0, 160, 300, null, null],
[ 32, "왕상", 1587, 0, null, 24, 9, 65, 0, 160, 300, null, null],
[ 34, "왕숙", 1588, 0, null, 35, 10, 68, 0, 160, 300, null, null],
[ 33, "왕업", 1589, 0, null, 31, 5, 46, 0, 160, 300, null, null],
[ 35, "왕충", 1590, 0, null, 37, 58, 10, 0, 160, 300, null, null],
[ 1, "우보", 1591, 0, null, 37, 63, 7, 0, 160, 300, null, null],
[122, "우사", 1592, 0, null, 46, 14, 59, 0, 160, 300, null, null],
[138, "원요", 1593, 0, null, 38, 42, 39, 0, 160, 300, null, null],
[ 95, "원유", 1594, 0, null, 42, 16, 55, 0, 160, 300, null, null],
[ 31, "위관", 1595, 0, null, 46, 18, 60, 0, 160, 300, null, null],
[129, "위막", 1596, 0, null, 42, 49, 23, 0, 160, 300, null, null],
[ 55, "유괴", 1597, 0, null, 48, 55, 25, 0, 160, 300, null, null],
[129, "유략", 1598, 0, null, 47, 52, 23, 0, 160, 300, null, null],
[ 45, "유반", 1599, 0, null, 48, 59, 19, 0, 160, 300, null, null],
[ 29, "유복", 1600, 0, null, 41, 20, 55, 0, 160, 300, null, null],
[ 78, "유선2", 1601, 0, null, 6, 10, 39, 0, 160, 300, null, null],
[139, "유섭", 1602, 0, null, 44, 59, 12, 0, 160, 300, null, null],
[ 28, "유소", 1603, 0, null, 45, 20, 55, 0, 160, 300, null, null],
[128, "유승", 1604, 0, null, 38, 67, 13, 0, 160, 300, null, null],
[129, "유찬", 1605, 0, null, 48, 57, 25, 0, 160, 300, null, null],
[129, "유평", 1606, 0, null, 45, 54, 25, 0, 160, 300, null, null],
[138, "유훈", 1607, 0, null, 40, 50, 20, 0, 160, 300, null, null],
[ 48, "이감", 1608, 0, null, 43, 52, 14, 0, 160, 300, null, null],
[ 19, "이승", 1609, 0, null, 11, 26, 31, 0, 160, 300, null, null],
[ 22, "이통", 1610, 0, null, 48, 62, 20, 0, 160, 300, null, null],
[138, "이풍2", 1611, 0, null, 47, 58, 20, 0, 160, 300, null, null],
[ 20, "이풍3", 1612, 0, null, 22, 11, 67, 0, 160, 300, null, null],
[ 29, "장구", 1613, 0, null, 46, 54, 19, 0, 160, 300, null, null],
[ 21, "장기", 1614, 0, null, 49, 15, 59, 0, 160, 300, null, null],
[ 74, "장남", 1615, 0, null, 47, 50, 16, 0, 160, 300, null, null],
[100, "장막", 1616, 0, null, 41, 20, 54, 0, 160, 300, null, null],
[ 7, "장만성", 1617, 0, null, 47, 61, 19, 0, 160, 300, null, null],
[135, "장반", 1618, 0, null, 42, 55, 25, 0, 160, 300, null, null],
[ 78, "장빈", 1619, 0, null, 29, 12, 66, 0, 160, 300, null, null],
[124, "장승", 1620, 0, null, 48, 26, 57, 0, 160, 300, null, null],
[999, "장양2", 1621, 0, null, 42, 42, 19, 0, 160, 300, null, null],
[ 68, "장억", 1622, 0, null, 50, 60, 21, 0, 160, 300, null, null],
[ 75, "장준", 1623, 0, null, 45, 52, 25, 0, 160, 300, null, null],
[ 20, "장집", 1624, 0, null, 30, 12, 68, 0, 160, 300, null, null],
[ 39, "장특", 1625, 0, null, 47, 21, 56, 0, 160, 300, null, null],
[ 96, "저곡", 1626, 0, null, 42, 21, 52, 0, 160, 300, null, null],
[128, "전기", 1627, 0, null, 40, 53, 21, 0, 160, 300, null, null],
[ 23, "전만", 1628, 0, null, 40, 56, 16, 0, 160, 300, null, null],
[128, "전상", 1629, 0, null, 2, 5, 11, 0, 160, 300, null, null],
[130, "전역", 1630, 0, null, 43, 49, 15, 0, 160, 300, null, null],
[ 75, "전예", 1631, 0, null, 50, 24, 61, 0, 160, 300, null, null],
[ 64, "전해", 1632, 0, null, 47, 49, 22, 0, 160, 300, null, null],
[123, "정봉2", 1633, 0, null, 45, 52, 20, 0, 160, 300, null, null],
[ 22, "정의", 1634, 0, null, 15, 4, 66, 0, 160, 300, null, null],
[ 81, "제갈교", 1635, 0, null, 41, 9, 58, 0, 160, 300, null, null],
[ 40, "제갈서", 1636, 0, null, 38, 43, 12, 0, 160, 300, null, null],
[ 25, "조충", 1637, 0, null, 12, 5, 68, 0, 160, 300, null, null],
[121, "종리목", 1638, 0, null, 51, 26, 57, 0, 160, 300, null, null],
[ 22, "종육", 1639, 0, null, 26, 7, 67, 0, 160, 300, null, null],
[122, "좌혁", 1640, 0, null, 43, 51, 20, 0, 160, 300, null, null],
[ 36, "주령", 1641, 0, null, 49, 54, 26, 0, 160, 300, null, null],
[115, "주앙", 1642, 0, null, 48, 24, 24, 0, 160, 300, null, null],
[ 52, "주포", 1643, 0, null, 43, 55, 7, 0, 160, 300, null, null],
[ 11, "주흔", 1644, 0, null, 45, 21, 58, 0, 160, 300, null, null],
[140, "진기", 1645, 0, null, 42, 52, 18, 0, 160, 300, null, null],
[142, "진란", 1646, 0, null, 45, 54, 17, 0, 160, 300, null, null],
[ 25, "진랑", 1647, 0, null, 42, 54, 16, 0, 160, 300, null, null],
[ 12, "진응", 1648, 0, null, 44, 53, 19, 0, 160, 300, null, null],
[124, "진표", 1649, 0, null, 44, 19, 56, 0, 160, 300, null, null],
[999, "채염", 1650, 0, null, 36, 10, 64, 0, 160, 300, null, null],
[999, "초선", 1651, 0, null, 45, 8, 55, 0, 160, 300, null, null],
[135, "초이", 1652, 0, null, 41, 51, 21, 0, 160, 300, null, null],
[ 65, "추단", 1653, 0, null, 44, 54, 15, 0, 160, 300, null, null],
[999, "추씨", 1654, 0, null, 35, 7, 54, 0, 160, 300, null, null],
[ 71, "추정", 1655, 0, null, 45, 25, 51, 0, 160, 300, null, null],
[145, "파재", 1656, 0, null, 46, 57, 20, 0, 160, 300, null, null],
[ 22, "포신", 1657, 0, null, 49, 23, 61, 0, 160, 300, null, null],
[114, "하식", 1658, 0, null, 16, 38, 13, 0, 160, 300, null, null],
[ 36, "하안", 1659, 0, null, 3, 12, 67, 0, 160, 300, null, null],
[999, "하후씨", 1660, 0, null, 28, 8, 47, 0, 160, 300, null, null],
[ 5, "학맹", 1661, 0, null, 42, 51, 17, 0, 160, 300, null, null],
[ 98, "한거자", 1662, 0, null, 41, 47, 13, 0, 160, 300, null, null],
[ 19, "한덕", 1663, 0, null, 44, 59, 11, 0, 160, 300, null, null],
[140, "한윤", 1664, 0, null, 26, 11, 66, 0, 160, 300, null, null],
[999, "허소", 1665, 0, null, 41, 12, 48, 0, 160, 300, null, null],
[ 30, "호열", 1666, 0, null, 49, 26, 57, 0, 160, 300, null, null],
[ 76, "호제", 1667, 0, null, 42, 17, 52, 0, 160, 300, null, null],
[149, "호진", 1668, 0, null, 45, 58, 7, 0, 160, 300, null, null],
[ 29, "호질", 1669, 0, null, 47, 20, 57, 0, 160, 300, null, null],
[ 7, "환계", 1670, 0, null, 9, 11, 66, 0, 160, 300, null, null],
[ 56, "황숭", 1671, 0, null, 46, 24, 56, 0, 160, 300, null, null],
[999, "황승언", 1672, 0, null, 46, 9, 60, 0, 160, 300, null, null],
[999, "황월영", 1673, 0, null, 42, 8, 57, 0, 160, 300, null, null],
[ 45, "황조", 1674, 0, null, 48, 51, 22, 0, 160, 300, null, null],
[ 48, "후선", 1675, 0, null, 42, 51, 15, 0, 160, 300, null, null],
[ 8, "휴고", 1676, 0, null, 43, 55, 16, 0, 160, 300, null, null],
[ 98, "휴원진", 1677, 0, null, 41, 49, 16, 0, 160, 300, null, null],
[ 22, "희지재", 1678, 0, null, 23, 5, 69, 0, 160, 300, null, null]
],
"cities":[
],
"history":[
"<C>●</>180년 1월:<L><b>【이벤트】</b></>차원이 다른 존재들이 나타납니다."
],
"initialEvents":[
],
"events":[
]
}
+64 -36
View File
@@ -13,6 +13,9 @@
"npcMax": 95
},
"iconPath": "애니집결",
"map": {
"mapName": "miniche"
},
"fiction": 1,
"nation":[
@@ -22,14 +25,14 @@
[0, "기타노시오리", null, 0, null, 96, 92, 93, 0, 160, 333, "왕좌", null],
[0, "마도카", null, 0, null, 86, 50, 77, 0, 160, 300, null, "집중", "친구들에겐 비밀이야★"],
[0, "마미", null, 0, null, 70, 74, 60, 0, 165, 240, null, null, "이젠 아무것도 두렵지 않아"],
[0, "호무라", null, 0, null, 76, 64, 80, 0, 160, 333, null, "집중", "이게바로…사랑이야.."],
[0, "호무라", null, 0, null, 76, 64, 80, 0, 160, 333, null, "집중", "이게바로…사랑이야.."],
[0, "쿄코", null, 0, null, 68, 77, 54, 0, 160, 240, null, null],
[0, "미키사야카", null, 0, null, 80, 77, 62, 0, 160, 240, null, null, "나는 정말…바보"],
[0, "나기사", null, 0, null, 72, 80, 70, 0, 160, 240, null, null, "나기사는 단지 치즈가 먹고싶엇던것 뿐이에요!"],
[0, "오리코", null, 0, null, 65, 33, 94, 0, 160, 240, null, null],
[0, "오리코", null, 0, null, 65, 33, 94, 0, 160, 240, null, null, "이세계에 최악의 절망을."],
[0, "쿠레키리카", null, 0, null, 50, 80, 50, 0, 160, 240, null, null],
[0, "유마", null, 0, null, 69, 74, 70, 0, 160, 333, null, null],
[0, "큐베", null, 0, null, 22, 14, 4, 0, 160, 333, null, null, "나랑 계약해서 마녀가 되어줘!"],
[0, "큐베", null, 0, null, 22, 14, 64, 0, 160, 333, null, null, "나랑 계약해서 마녀가 되어줘!"],
[0, "사사", null, 0, null, 64, 78, 72, 0, 160, 333, null, null],
[0, "코이토", null, 0, null, 65, 70, 74, 0, 160, 333, null, null],
[0, "코마키", null, 0, null, 80, 75, 49, 0, 160, 333, null, null],
@@ -38,10 +41,10 @@
[0, "프흐레", null, 0, null, 84, 25, 100, 0, 160, 333, null, "집중", "괜찮아...... 그리고 데류지 에게 전달해 줘...... 원하는 나의 요구"],
[0, "섀도게일", null, 0, null, 52, 75, 74, 0, 160, 333, null, null],
[0, "7753.0", null, 0, null, 64, 19, 84, 0, 160, 333, null, null, "전 인사부문소속의 7753이라고 합니다"],
[0, "인페르노", null, 0, null, 79, 85, 60, 0, 160, 399, null, null, "저녀석해버려줘…마법소녀,,,사냥,,,"],
[0, "인페르노", null, 0, null, 79, 85, 60, 0, 160, 399, null, null, "저녀석..해버려줘,,,,마법소녀…사냥….그럼….가.."],
[0, "룰러", null, 0, null, 70, 30, 80, 0, 160, 333, null, null, "룰러의 이름으로 명한다"],
[0, "네무링", null, 0, null, 71, 63, 58, 0, 160, 333, null, null, "공주님이 되어버리면 되는거야."],
[0, "크랑테일", null, 0, null, 75, 86, 72, 0, 160, 333, null, null],
[0, "크랑테일", null, 0, null, 75, 86, 72, 0, 160, 333, null, null, "라즐리느와 페치카가 살려준 난...... 못 죽어"],
[0, "리플", null, 0, null, 59, 81, 70, 0, 160, 299, null, null],
[0, "글라시아네", null, 0, null, 42, 20, 85, 0, 160, 333, null, null, "죽이지마! 죽고싶지 않아!!"],
[0, "페치카", null, 0, null, 71, 33, 75, 0, 160, 333, null, null, "그래도…이번엔 누군가를 구할수있어서..행복해요…"],
@@ -49,7 +52,7 @@
[0, "타마", null, 0, null, 66, 81, 27, 0, 160, 300, null, null],
[0, "파르", null, 0, null, 30, 10, 74, 0, 160, 300, null, null, "게임마스터와 마스코트간에 규칙소통의 차이가 있엇퐁."],
[0, "나노하", null, 0, null, 85, 105, 85, 0, 160, 300, "패권", "위압", "잠깐 머리좀 식힐까?"],
[0, "페이트", null, 0, null, 70, 77, 73, 0, 160, 300, null, null],
[0, "페이트", null, 0, null, 75, 89, 73, 0, 160, 300, null, null],
[0, "비비오", null, 0, null, 75, 70, 70, 0, 160, 300, null, null, "엄마를 돌려줘!!"],
[0, "린디", null, 0, null, 78, 50, 50, 0, 160, 300, null, null],
[0, "크로노", null, 0, null, 73, 27, 58, 0, 160, 300, null, null],
@@ -86,9 +89,9 @@
[0, "로드 엘멜로이", null, 0, null, 75, 43, 90, 0, 160, 300, null, null, "아니,나는 그의 신하다"],
[0, "클라나기사", null, 0, null, 85, 30, 85, 0, 160, 300, null, null, "경단~ 경단~ 경단 경단 경단 경단 대가족~"],
[0, "토모야", null, 0, null, 85, 84, 75, 0, 160, 300, null, null],
[0, "후지바야시쿄", null, 0, null, 80, 70, 69, 0, 160, 300, null, "무쌍", "요헤이! 또 그러는 거야??"],
[0, "후지바야시쿄", null, 0, null, 80, 85, 69, 0, 160, 300, null, "무쌍", "요헤이! 또 그러는 거야??"],
[0, "후지바야시료", null, 0, null, 74, 30, 77, 0, 160, 300, null, null],
[0, "토모요", null, 0, null, 80, 72, 65, 0, 160, 300, null, "무쌍"],
[0, "토모요", null, 0, null, 80, 85, 65, 0, 160, 300, null, "무쌍"],
[0, "캇페이", null, 0, null, 75, 55, 18, 0, 160, 300, null, null],
[0, "요헤이", null, 0, null, 69, 60, 30, 0, 160, 300, null, "견고", "우오오오오오오!!!"],
[0, "스노하라메이", null, 0, null, 70, 70, 70, 0, 160, 300, null, null, "저희 못난 오빠떔에 고생이 많으십니다"],
@@ -128,7 +131,6 @@
[0, "쥰매니저", null, 0, null, 75, 65, 75, 0, 160, 300, null, null],
[0, "미스터K", null, 0, null, 55, 20, 70, 0, 160, 300, null, null],
[0, "아세치킨타로", null, 0, null, 11, 22, 78, 0, 160, 300, null, null],
[0, "세레나", null, 0, null, 78, 50, 82, 0, 160, 300, null, "상재"],
[0, "카논", null, 0, null, 79, 50, 81, 0, 160, 300, null, null],
[0, "카나메", null, 0, null, 73, 23, 92, 0, 160, 300, null, null],
[0, "소나타", null, 0, null, 70, 35, 84, 0, 160, 300, null, null],
@@ -172,8 +174,8 @@
[0, "키르", null, 0, null, 64, 77, 63, 0, 150, 300, null, null],
[0, "버본", null, 0, null, 84, 83, 80, 0, 160, 300, null, null],
[0, "Rum", null, 0, null, 80, 30, 80, 0, 160, 300, null, null],
[0, "헤이지", null, 0, null, 78, 78, 95, 0, 160, 300, null, null],
[0, "카즈하", null, 0, null, 76, 30, 90, 0, 160, 300, null, null],
[0, "헤이지", null, 0, null, 85, 83, 95, 0, 160, 300, null, null],
[0, "카즈하", null, 0, null, 87, 79, 74, 0, 160, 300, null, null],
[0, "메구레경부", null, 0, null, 94, 79, 88, 0, 160, 300, null, null],
[0, "타카기형사", null, 0, null, 67, 80, 79, 0, 160, 300, null, null],
[0, "미와코", null, 0, null, 70, 83, 82, 0, 160, 300, null, null],
@@ -265,7 +267,7 @@
[0, "타케다쿠미코", null, 0, null, 80, 60, 80, 0, 160, 300, null, null],
[0, "니얀다카멘", null, 0, null, 88, 96, 88, 0, 160, 300, null, "무쌍", "난다! 난다! 니얀다 카멘!"],
[0, "냐고", null, 0, null, 37, 46, 42, 0, 160, 300, "유지", null],
[0, "니얀다카렌", null, 0, null, 77, 90, 75, 0, 160, 300, null, null],
[0, "니얀다카렌", null, 0, null, 77, 90, 75, 0, 160, 300, null, null, "난다! 난다! 니얀다 카렌!"],
[0, "미코", null, 0, null, 49, 21, 84, 0, 160, 300, null, null],
[0, "냐온", null, 0, null, 72, 30, 90, 0, 160, 300, "패권", "발명"],
[0, "콩", null, 0, null, 62, 60, 75, 0, 160, 300, null, null],
@@ -289,19 +291,19 @@
[0, "츄츄", null, 0, null, 64, 70, 30, 0, 160, 300, null, null],
[0, "모모", null, 0, null, 78, 70, 75, 0, 160, 300, null, null],
[0, "쥐선인", null, 0, null, 90, 43, 94, 0, 160, 300, null, "환술", "고양이들에게 속지마라..!"],
[0, "로로나", null, 0, null, 92, 89, 94, 0, 160, 300, null, null, "나는 로로라이나 프릭셀이야!"],
[0, "로리 로로나", null, 0, null, 86, 80, 78, 0, 160, 300, null, null, "토토리짱 나 모르겟어? 로로나야 로로나!"],
[0, "토토리", null, 0, null, 85, 86, 93, 0, 160, 300, null, null, "역시.. 키가 작으시네요 쿠데리아상"],
[0, "메루루", null, 0, null, 87, 75, 92, 0, 160, 300, null, null],
[0, "쿠데리아", null, 0, null, 75, 68, 79, 0, 160, 300, null, "상재", "그렇게 부르지 말랬지!!"],
[0, "스테르크", null, 0, null, 80, 102, 81, 0, 160, 300, null, "무쌍", "자 따라해봐 로.로.나"],
[0, "아스트리드", null, 0, null, 39, 78, 96, 0, 160, 300, "유지", null],
[0, "아스트리드", null, 0, null, 39, 78, 96, 0, 160, 300, "유지", null, "에에고 자시고 이아는 로로나가 맞다."],
[0, "미미", null, 0, null, 78, 82, 76, 0, 160, 300, null, null],
[0, "지노 크나프", null, 0, null, 72, 84, 70, 0, 160, 300, null, null],
[0, "에스카", null, 0, null, 84, 75, 91, 0, 160, 300, null, null],
[0, "로직스", null, 0, null, 80, 85, 79, 0, 160, 300, null, null],
[0, "소피", null, 0, null, 97, 94, 99, 0, 160, 300, null, "집중"],
[0, "소피", null, 0, null, 97, 94, 99, 0, 160, 300, null, "집중", "피리스, 연금술 해보지 않을래?"],
[0, "플라흐타", null, 0, null, 79, 80, 101, 0, 160, 300, null, "환술"],
[0, "피리스", null, 0, null, 81, 66, 80, 0, 160, 300, null, "반계"],
[0, "피리스", null, 0, null, 81, 66, 80, 0, 160, 300, null, "반계", "소피선생님..! 플라흐타상!!"],
[0, "일메리아", null, 0, null, 90, 64, 85, 0, 160, 300, null, null],
[0, "리디", null, 0, null, 77, 79, 82, 0, 160, 300, null, null],
[0, "수르", null, 0, null, 79, 77, 84, 0, 160, 300, null, null],
@@ -313,7 +315,7 @@
[0, "쿠루미", null, 0, null, 86, 88, 83, 0, 160, 300, null, null],
[0, "타카미야마나", null, 0, null, 81, 90, 83, 0, 160, 300, null, null],
[0, "소노가미린네", null, 0, null, 90, 93, 84, 0, 160, 300, null, null, "시도..! 시도!"],
[0, "카구야", null, 0, null, 72, 90, 34, 0, 160, 300, null, null],
[0, "카구야", null, 0, null, 72, 90, 34, 0, 160, 300, null, null, "훗 이몸의 종이 되거라 시도."],
[0, "유즈루", null, 0, null, 72, 90, 75, 0, 160, 300, null, null],
[0, "이자요이미쿠", null, 0, null, 87, 82, 70, 0, 160, 300, null, null],
[0, "마유리", null, 0, null, 81, 81, 81, 0, 160, 300, null, null],
@@ -363,7 +365,7 @@
[0, "레모네이드", null, 0, null, 84, 87, 66, 0, 160, 300, null, null],
[0, "민트", null, 0, null, 80, 75, 77, 0, 160, 300, null, null],
[0, "아쿠아", null, 0, null, 83, 80, 76, 0, 160, 300, null, null],
[0, "밀키로즈", null, 0, null, 84, 97, 72, 0, 160, 300, null, null],
[0, "밀키로즈", null, 0, null, 84, 97, 72, 0, 160, 300, null, null, "밀키로즈 메탈 블리자드..!!!"],
[0, "분비", null, 0, null, 88, 98, 80, 0, 160, 300, null, "견고", "이렇게 죽긴 싫은데..!!"],
[0, "가마오", null, 0, null, 42, 84, 36, 0, 160, 300, null, null],
[0, "큐어블로섬", null, 0, null, 86, 75, 84, 0, 160, 300, null, null],
@@ -373,7 +375,7 @@
[0, "큐어멜로디", null, 0, null, 80, 85, 49, 0, 160, 300, null, null],
[0, "큐어리듬", null, 0, null, 77, 85, 88, 0, 160, 300, null, null],
[0, "큐어비트", null, 0, null, 80, 84, 80, 0, 160, 300, null, null],
[0, "하미", null, 0, null, 56, 50, 77, 0, 160, 300, null, null],
[0, "하미", null, 0, null, 56, 50, 77, 0, 160, 300, null, null, "큰일이다냥!! 지금 자고있을떄가 아니다냥!"],
[0, "큐어뮤즈", null, 0, null, 86, 92, 81, 0, 160, 300, null, null],
[0, "큐어하트", null, 0, null, 93, 90, 95, 0, 160, 300, null, "위압"],
[0, "다이아몬드", null, 0, null, 86, 88, 90, 0, 160, 300, null, null],
@@ -389,24 +391,24 @@
[0, "사츠키", null, 0, null, 72, 77, 70, 0, 160, 300, null, null],
[0, "넵튠", null, 0, null, 71, 55, 30, 0, 160, 300, null, null, "난 플라네튠의 여신 넵튠이야!"],
[0, "퍼플하트", null, 0, null, 86, 88, 77, 0, 160, 300, null, "돌격"],
[0, "네프기어", null, 0, null, 84, 87, 80, 0, 160, 300, null, null],
[0, "네프기어", null, 0, null, 84, 87, 80, 0, 160, 300, null, null, "에? 에!? 오네짱이다!! 보고싶었어!!"],
[0, "느와르", null, 0, null, 85, 88, 80, 0, 160, 300, null, null],
[0, "유니", null, 0, null, 73, 80, 75, 0, 160, 300, null, "저격"],
[0, "블랑", null, 0, null, 80, 88, 69, 0, 160, 300, null, "격노"],
[0, "롬", null, 0, null, 69, 77, 60, 0, 160, 300, null, null],
[0, "람", null, 0, null, 70, 60, 77, 0, 160, 300, null, null],
[0, "그린하트", null, 0, null, 81, 88, 83, 0, 160, 300, null, null],
[0, "마제콘느", null, 0, null, 85, 88, 75, 0, 160, 300, null, null],
[0, "마제콘느", null, 0, null, 85, 88, 75, 0, 160, 300, null, null, "아아. 마제콘느야.(모두들:애애애액!!)"],
[0, "프루루트", null, 0, null, 68, 94, 30, 0, 160, 300, null, "위압"],
[0, "피셰", null, 0, null, 70, 61, 69, 0, 160, 300, null, null],
[0, "비샤", null, 0, null, 75, 86, 75, 0, 160, 300, null, null],
[0, "우즈메", null, 0, null, 78, 88, 82, 0, 160, 300, null, null],
[0, "미나즈키하루카", null, 0, null, 83, 86, 70, 0, 160, 300, null, null],
[0, "칸나즈키아오이", null, 0, null, 86, 84, 88, 0, 160, 300, null, null],
[0, "하즈키쿠루미", null, 0, null, 75, 84, 80, 0, 160, 300, null, null],
[0, "테슬라바이올렛", null, 0, null, 69, 85, 77, 0, 160, 300, null, null],
[0, "하즈키쿠루미", null, 0, null, 75, 84, 80, 0, 160, 300, null, null, "설령… 다시한번 세상이 트윈엔젤을 필요로 한다고 해도. 우리는 함께 있으니 괜찮겠죠?"],
[0, "테슬라바이올렛", null, 0, null, 69, 85, 77, 0, 160, 300, null, null, "이 에로고양이가!!!"],
[0, "나인바이올렛", null, 0, null, 73, 84, 79, 0, 160, 300, null, null],
[0, "나폴레옹정령", null, 0, null, 60, 60, 50, 0, 160, 300, null, null],
[0, "나폴레옹정령", null, 0, null, 60, 60, 50, 0, 160, 300, null, null, "변태가 아냐!! 신사다!"],
[0, "사이죠세츠코", null, 0, null, 77, 67, 81, 0, 160, 300, null, null],
[0, "블랙트레이더", null, 0, null, 86, 95, 78, 0, 160, 300, null, null],
[0, "엘리스", null, 0, null, 77, 91, 80, 0, 160, 300, null, null],
@@ -422,10 +424,10 @@
[0, "미요시카린", null, 0, null, 85, 93, 80, 0, 160, 300, null, null],
[0, "노기소노코", null, 0, null, 79, 84, 78, 0, 160, 300, null, null],
[0, "미노와긴", null, 0, null, 83, 87, 81, 0, 160, 300, null, null],
[0, "아키선생님", null, 0, null, 85, 39, 88, 0, 160, 300, null, null],
[0, "신수", null, 0, null, 97, 69, 99, 0, 160, 300, null, "견고"],
[0, "아키선생님", null, 0, null, 85, 39, 88, 0, 160, 300, null, "귀모"],
[0, "신수", null, 0, null, 97, 69, 99, 0, 160, 300, null, "집증"],
[0, "노기와카바", null, 0, null, 87, 85, 79, 0, 160, 300, null, null],
[0, "우에사토", null, 0, null, 80, 19, 85, 0, 160, 300, null, "귀모"],
[0, "우에사토히나타", null, 0, null, 80, 19, 85, 0, 160, 300, null, "귀모"],
[0, "이요지마안즈", null, 0, null, 76, 88, 86, 0, 160, 295, null, "저격"],
[0, "도이타마코", null, 0, null, 72, 89, 37, 0, 160, 300, null, "견고"],
[0, "코오리치카게", null, 0, null, 67, 90, 83, 0, 160, 300, null, null],
@@ -477,7 +479,7 @@
[0, "로니에", null, 0, null, 80, 76, 52, 0, 160, 300, null, null],
[0, "벡터", null, 0, null, 81, 55, 77, 0, 160, 300, null, null],
[0, "최고사제", null, 0, null, 57, 19, 95, 0, 160, 300, null, null],
[0, "호노카", null, 0, null, 88, 55, 64, 0, 160, 300, null, null],
[0, "호노카", null, 0, null, 88, 55, 64, 0, 160, 300, null, null, "비야 멈춰라~~~~~~!"],
[0, "우미", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "럽라코토리", null, 0, null, 76, 54, 80, 0, 160, 300, null, null],
[0, "니코", null, 0, null, 78, 52, 66, 0, 160, 300, null, "인덕", "닛코 닛코~니~ 아나타노 하토니 니코니코니"],
@@ -556,7 +558,7 @@
[0, "미츠루", null, 0, null, 70, 69, 60, 0, 160, 300, null, null],
[0, "코지로", null, 0, null, 76, 64, 79, 0, 160, 300, null, "상재"],
[0, "무사시", null, 0, null, 75, 80, 60, 0, 160, 300, null, "무쌍"],
[0, "에스자와쿠루미", null, 0, null, 72, 88, 59, 0, 160, 300, null, "무쌍"],
[0, "에스자와쿠루미", null, 0, null, 72, 88, 59, 0, 160, 300, null, "무쌍"],
[0, "타케야유키", null, 0, null, 73, 39, 29, 0, 160, 300, null, null],
[0, "와카사유리", null, 0, null, 77, 33, 90, 0, 160, 300, null, null],
[0, "이케다미키", null, 0, null, 74, 66, 75, 0, 160, 300, null, null],
@@ -572,8 +574,8 @@
[0, "츠루코", null, 0, null, 73, 52, 88, 0, 160, 300, null, null, "진땅 그러면 안되!"],
[0, "공백소라", null, 0, null, 71, 50, 95, 0, 160, 300, null, null],
[0, "공백시로", null, 0, null, 72, 50, 97, 0, 160, 300, null, null],
[0, "지브릴", null, 0, null, 75, 82, 77, 0, 160, 300, null, null],
[0, "스테파니도라", null, 0, null, 76, 27, 77, 0, 160, 300, null, null],
[0, "지브릴", null, 0, null, 75, 82, 77, 0, 160, 300, null, null, "목은 못얻고 부품은 날아가고 게다가 힘을 다써서 이런모습… 이래서는 뭐하나 수지에 안맞는다고요~~ㅠ"],
[0, "스테파니도라", null, 0, null, 76, 27, 77, 0, 160, 300, null, null, "열라리 힘들어 죽겠는데, 이럴 때 언제까지 자리를 비우고 있을 거냐고요 이놈의 임금님들은~!!!\""],
[0, "무녀님", null, 0, null, 70, 40, 91, 0, 160, 300, null, null],
[0, "이즈냥", null, 0, null, 76, 74, 67, 0, 160, 300, null, null],
[0, "기타노유키코", null, 0, null, 85, 23, 95, 0, 160, 300, null, null, "모두들 잘부탁해!"],
@@ -581,7 +583,7 @@
[0, "고길동", null, 0, null, 74, 88, 70, 0, 160, 300, null, null],
[0, "이그드라실", null, 0, null, 15, 82, 97, 0, 160, 300, null, null],
[0, "마츠다타카토", null, 0, null, 72, 56, 74, 0, 160, 300, null, null],
[0, "0.0", null, 0, null, 77, 63, 77, 0, 160, 300, null, null],
[0, "마키노루키", null, 0, null, 77, 63, 77, 0, 160, 300, null, null],
[0, "리젠랴", null, 0, null, 72, 70, 77, 0, 160, 300, null, null],
[0, "리슈촌", null, 0, null, 67, 43, 52, 0, 160, 300, null, null],
[0, "쿠도타이키", null, 0, null, 82, 55, 80, 0, 160, 300, null, null],
@@ -624,7 +626,7 @@
[0, "큐어러블리", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "큐어프린세스", null, 0, null, 76, 85, 55, 0, 160, 300, null, null],
[0, "큐어허니", null, 0, null, 83, 86, 67, 0, 160, 300, null, null],
[0, "큐어포춘", null, 0, null, 82, 90, 80, 0, 160, 300, null, null],
[0, "큐어포춘", null, 0, "`", 82, 90, 80, 0, 160, 300, null, null],
[0, "블루", null, 0, null, 41, 29, 17, 0, 160, 210, null, null],
[0, "큐어텐더", null, 0, null, 82, 94, 77, 0, 160, 300, null, null],
[0, "큐어플로라", null, 0, null, 81, 87, 69, 0, 160, 300, null, null],
@@ -658,7 +660,7 @@
[0, "타무라마나미", null, 0, null, 82, 50, 80, 0, 160, 300, null, null, "남매끼리 연애? 말이된다고 생각해?"],
[0, "아라가키아야셰", null, 0, null, 75, 59, 77, 0, 160, 300, null, null],
[0, "보보보", null, 0, null, 67, 99, 50, 0, 160, 300, null, null, "코털진권 옥의!"],
[0, "젤라티노", null, 0, null, 60, 75, 60, 0, 160, 300, null, null],
[0, "젤라티노", null, 0, null, 60, 85, 60, 0, 160, 300, null, null, "기어오르지 마라 카츠. 이것이 대장인 나와 부대장인 너의 차이다"],
[0, "돈벼락", null, 0, null, 64, 85, 49, 0, 160, 300, null, null],
[0, "뀌리", null, 0, null, 72, 78, 68, 0, 160, 300, null, null],
[0, "뷰티", null, 0, null, 77, 33, 90, 0, 160, 300, null, null],
@@ -666,7 +668,7 @@
[0, "노야마아즈사", null, 0, null, 82, 30, 72, 0, 160, 300, null, null],
[0, "강영웅", null, 0, null, 86, 39, 90, 0, 160, 300, null, null],
[0, "마츠오카유이치", null, 0, null, 84, 36, 72, 0, 160, 300, null, null],
[0, "타카야나기켄", null, 0, null, 82, 28, 80, 0, 160, 300, null, null],
[0, "타카야나기켄", "`", 0, null, 82, 28, 80, 0, 160, 300, null, null],
[0, "니시노카오루", null, 0, null, 86, 34, 85, 0, 160, 300, null, null],
[0, "코다마미노리", null, 0, null, 75, 30, 82, 0, 160, 300, null, null],
[0, "사카키바라요코", null, 0, null, 85, 35, 77, 0, 160, 300, null, null],
@@ -703,7 +705,33 @@
[0, "큐어앙주", null, 0, null, 80, 74, 88, 0, 160, 300, null, null],
[0, "큐어에투알", null, 0, null, 84, 79, 83, 0, 160, 300, null, null],
[0, "큐어마셰리", null, 0, null, 82, 65, 82, 0, 160, 300, null, null],
[0, "유메노코토", null, 0, null, 81, 39, 80, 0, 160, 300, null, null, "혼노~ 스코시~ 이지와루나~ 뎅와노 키리카타오~ 시타노~ 다앗테 큐우니 신켄~나~오에데하나시 다스노~ 즈루이~ 스키타요토~ 이와세테아 게나이 다앗테 히카세테아게나이~"]
[0, "유메노코토", null, 0, null, 81, 39, 80, 0, 160, 300, null, null, "혼노~ 스코시~ 이지와루나~ 뎅와노 키리카타오~ 시타노~ 다앗테 큐우니 신켄~나오에데하나시 다스노~ 즈루이~ 스키타요토~ 이와세테아 게나이 다앗테 히카세테아게나이"],
[0, "쿠로미", null, 0, null, 80, 49, 80, 0, 160, 300, null, null, "쿠로미 사건일지 XXX호!!"],
[0, "바쿠", null, 0, null, 55, 55, 50, 0, 160, 300, null, null],
[0, "쿠로미파이브", null, 0, null, 59, 67, 60, 0, 160, 300, null, null],
[0, "나빛나", null, 0, null, 87, 49, 83, 0, 160, 300, null, null],
[0, "아이리스", null, 0, null, 83, 50, 86, 0, 160, 300, null, null],
[0, "세레나", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "시트론", null, 0, null, 79, 41, 92, 0, 160, 300, null, "발명"],
[0, "야가미라이토", null, 0, null, 80, 87, 95, 0, 160, 300, null, null],
[0, "난천", null, 0, null, 84, 53, 87, 0, 160, 300, null, null],
[0, "루자미네", null, 0, null, 80, 40, 92, 0, 160, 300, null, null],
[0, "릴리에", null, 0, null, 82, 64, 69, 0, 160, 300, null, null],
[0, "비트마", null, 0, null, 78, 90, 55, 0, 160, 300, null, null],
[0, "비트마ex", null, 0, null, 77, 95, 55, 0, 160, 300, null, null],
[0, "토마", null, 0, null, 79, 52, 75, 0, 160, 300, null, null],
[0, "와이버스트", null, 0, null, 75, 85, 50, 0, 160, 300, null, null],
[0, "몰리", null, 0, null, 82, 78, 45, 0, 160, 300, null, null],
[0, "나카가와노리코", null, 0, null, 81, 19, 72, 0, 160, 300, null, null, "알고있엇니?? 20년간 전쟁이 지속된 이 땅에도 이렇게 아름다운 봄이 온다는 것을. 돌아오지 않는 계절은 없어 놀라워"],
[0, "오다토시노리", null, 0, null, 56, 40, 81, 0, 160, 300, null, null, "이게임에서 살아남는건 위대하신 이몸이라는 것이다!!!!!!!!!!!!!!!"],
[0, "나나하라슈야", null, 0, null, 85, 55, 74, 0, 160, 300, null, null, "메리크리스마스 와일드 세븐 나나하라슈야"],
[0, "어른로로나", null, 0, null, 92, 89, 94, 0, 160, 300, null, null, "에. 여러분들은 누구시죠..?"],
[0, "푸크푹", null, 0, null, 92, 79, 80, 0, 160, 300, null, null, "어서와 섀도게일 언니"],
[0, "그림하트", null, 0, null, 77, 51, 49, 0, 160, 300, null, null, "그자의 목을 쳐라."],
[0, "마왕팜", null, 0, null, 72, 94, 50, 0, 160, 300, null, null],
[0, "피티프레데리카", null, 0, null, 84, 33, 86, 0, 160, 300, null, null],
[0, "데어라팬텀", null, 0, null, 82, 48, 88, 0, 160, 300, null, null],
[0, "웨딘", null, 0, null, 86, 40, 85, 0, 160, 300, null, null, "마법나라'잖아요! 꿈과 판타지잖아요! 당신들, 바보 아녜요? 어떻게 일이 잘 안풀린다고 남까지 말려들게 해서 몽땅 죽여 버리겠다는 결론을 낼 수있는거죠?"]
],
"general_ex":[
+96 -96
View File
@@ -330,106 +330,106 @@ CREATE TABLE `nation` (
`l11term` INT(4) NULL DEFAULT '0',
`l10term` INT(4) NULL DEFAULT '0',
`l9term` INT(4) NULL DEFAULT '0',
`l12turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l12turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l11turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l10turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l9turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8term` INT(4) NULL DEFAULT '0',
`l7term` INT(4) NULL DEFAULT '0',
`l6term` INT(4) NULL DEFAULT '0',
`l5term` INT(4) NULL DEFAULT '0',
`l8turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn0` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn1` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn2` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn3` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn4` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn5` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn6` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn7` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn8` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn9` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn10` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l8turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l7turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l6turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`l5turn11` VARCHAR(30) NULL DEFAULT '[99,0,0,0]',
`aux` TEXT NOT NULL DEFAULT '{}',
PRIMARY KEY (`nation`)
)
+64
View File
@@ -0,0 +1,64 @@
<table align='center' id='general_list' class='tb_layout bg0'>
<thead>
<tr>
<td width=98 class='bg1 center'> </td>
<td width=98 class='bg1 center'>통무지</td>
<td width=98 class='bg1 center'> </td>
<td width=53 class='bg1 center'> </td>
<td width=53 class='bg1 center'> </td>
<td width=48 class='bg1 center'>도시</td>
<td width=28 class='bg1 center'></td>
<td width=58 class='bg1 center'> </td>
<td width=63 class='bg1 center'> </td>
<td width=38 class='bg1 center'>훈련</td>
<td width=38 class='bg1 center'>사기</td>
<td width=213 class='bg1 center'> </td>
<td width=38 class='bg1 center'>삭턴</td>
<td width=48 class='bg1 center'></td>
</tr>
</thead>
<tbody>
<?php foreach($generals as $general): ?>
<tr class='general_id_<?=$general['no']?>'
data-general-id="<?=$general['no']?>"
data-is-npc="<?=$general['npc']>=2?'true':'false'?>"
data-general-wounded="<?=$general['injury']?>"
data-general-name="<?=$general['name']?>"
data-general-leadership="<?=$general['leader']?>"
data-general-power="<?=$general['power']?>"
data-general-intel="<?=$general['intel']?>"
data-general-level="<?=$general['expLevelText']?>"
data-general-leadership-bonus="<?=$general['lbonus']?>"
data-general-defence-mode="<?=$general['mode']?>"
data-general-crew-type="<?=$general['crewtype']?>"
data-general-crew="<?=$general['crew']?>"
data-general-train="<?=$general['train']?>"
data-general-atmos="<?=$general['atmos']?>"
>
<td class='i_name center'><span class='t_name'><?=$general['nameText']?></span><br
>Lv <span class='t_explevel'><?=$general['expLevelText']?></span></td>
<td class='i_stat center'><?=$general['leaderText']?>∥<?=$general['powerText']?>∥<?=$general['intelText']?></td>
<td class='i_troop center'><?=$general['troopText']?></td>
<td class='i_gold center'><?=$general['gold']?></td>
<td class='i_rice center'><?=$general['rice']?></td>
<td class='i_city center'><?=$general['cityText']?></td>
<td class='center'><?=$general['modeText']?></td>
<td class='i_crewtype center'><?=$general['crewtypeText']?></td>
<td class='i_crew center'><?=$general['crew']?></td>
<td class='i_train center'><?=$general['train']?></td>
<td class='i_atmos center'><?=$general['atmos']?></td>
<td class='i_action'>
<?php if($general['npc'] >= 2): ?>
<font size=3>NPC 장수</font>
<?php else: ?>
<font size=1>
<?=$general['turntext']?>
</font>
<?php endif; ?>
</td>
<td class='center'><?=$general['killturn']?></td>
<td class='i_turntime center'><?=substr($general['turntime'], 14, 5)?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
+6 -2
View File
@@ -1,4 +1,4 @@
<div class="world_map map_theme_<?=$mapTheme?>">
<div class="world_map map_theme_<?=$mapTheme?> draw_required">
<div class="map_title">
<span class="map_title_text">
</span>
@@ -7,6 +7,11 @@
<div class="map_bglayer1"></div>
<div class="map_bglayer2"></div>
<div class="map_bgroad"></div>
<div class="map_button_stack">
<button type="button" class="btn btn-primary map_toggle_cityname btn-xs" data-toggle="button" aria-pressed="false" autocomplete="off">
도시명 표기
</button>
</div>
<div class="city_tooltip">
<div class="city_name">
@@ -15,6 +20,5 @@
</div>
</div>
</div>
</div>
+159 -75
View File
@@ -1,6 +1,94 @@
<font size=2>병사를 모집합니다.
<?php if($commandName=='징병'): ?>
훈련과 사기치는 낮지만 가격이 저렴합니다.<br>
<?php else: ?>
훈련과 사기치는 높지만 자금이 많이 듭니다.
<?php endif; ?>
가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.<br>
이미 병사가 있는 경우 추가<?=$commandName?>되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.<br>
현재 <?=$commandName?> 가능한 병종은 <font color=green>녹색</font>으로 표시되며,<br>
현재 <?=$commandName?> 가능한 특수병종은 <font color=limegreen>초록색</font>으로 표시됩니다.<br>
<table class='tb_layout' style='margin:auto;'>
<thead>
<?php if($commandName=='모병'): ?>
<tr><td align=center colspan=11>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
<?php endif; ?>
<tr>
<td colspan=11 align=center class='bg2'>
현재 기술력 : <?=$techLevelText?>
현재 통솔 : <?=$leader?><?=($leader!=$fullLeader)?"({$fullLeader})":''?>
현재 병종 : <?=$crewTypeName?>
현재 병사 : <?=$crew?>
현재 자금 : <?=$gold?>
</td>
</tr>
<tr>
<td width=64 align=center class='bg1'>사진</td>
<td width=64 align=center class='bg1'>병종</td>
<td width=40 align=center class='bg1'>공격</td>
<td width=40 align=center class='bg1'>방어</td>
<td width=40 align=center class='bg1'>기동</td>
<td width=40 align=center class='bg1'>회피</td>
<td width=40 align=center class='bg1'>가격</td>
<td width=40 align=center class='bg1'>군량</td>
<td width=180 align=center class='bg1'>병사수</td>
<td width=50 align=center class='bg1'>행동</td>
<td width=300 align=center class='bg1'>특징</td>
</tr>
</thead>
<tbody>
<?php foreach($armTypes as [$armName,$armTypeCrews]): ?>
<tr><td colspan=11><?=$armName?> 계열</td></tr>
<?php foreach($armTypeCrews as $crewObj): ?>
<tr
id="crewType<?=$crewObj->id?>"
style='height:64px;background-color:<?=$crewObj->bgcolor?>'
data-rice="<?=$crewObj->baseRice?>"
data-cost="<?=$crewObj->baseCost?>"
>
<td style='background:#222222 no-repeat center url("<?=$crewObj->img?>");background-size:64px'></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->name?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->attack?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->defence?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->speed?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->avoid?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseCostShort?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseRiceShort?></td>
<td style='text-align:center;vertical-align:middle;' class='input_form' data-crewtype='<?=$crewObj->id?>'>
<input type=button value='절반' class='btn_half'
><input type=button value='채우기' class='btn_fill'
><input type=button value='가득' class='btn_full'
><br>
<input type=text data-crewtype='<?=$crewObj->id?>' class=form_double name=double maxlength=3 size=3
style=text-align:right;color:white;background-color:black
>00
<input type=text class=form_cost name=cost maxlength=5 size=5 readonly
style=text-align:right;color:white;background-color:black>
</td>
<td style='position:relative;height:64px;'><input
type=submit value='<?=$commandName?>' class='submit_btn'
style='width:100%;height:44px;margin:10px 0;display:block;position: absolute;left:0;top:0;'
></td>
<td><?=$crewObj->info?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</tbody>
</table>
<form id='post_form' action='c_double.php' type='post'>
<input type='hidden' name='double' class='form_amount' value='1'>
<input type='hidden' name='third' class='form_crewtype' value='<?=$crewObj->id?>'>
<input type='hidden' name='command' value='<?=$command?>'>
<?php foreach($turn as $turnItem) : ?>
<input type=hidden name='turn[]' value='<?=$turnItem?>'>
<?php endforeach; ?>
</form>
<script>
var currentTech = <?=$tech?>;
var leader = <?=$leader?>;
var fullLeader = <?=$fullLeader?>;
var currentCrewType = <?=$crewType?>;
var currentCrew = <?=$crew?>;
var currentGold = <?=$gold?>;
@@ -18,80 +106,76 @@ window.calc = function(id) {
}
$cost.val(Math.round(cost));
}
</script>
<font size=2>병사를 모집합니다.
<?php if($commandName=='징병'): ?>
훈련과 사기치는 낮지만 가격이 저렴합니다.<br>
<?php else: ?>
훈련과 사기치는 높지만 자금이 많이 듭니다.
<?php endif; ?>
가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.<br>
이미 병사가 있는 경우 추가<?=$commandName?>되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.<br>
현재 <?=$commandName?> 가능한 병종은 <font color=green>녹색</font>으로 표시되며,<br>
현재 <?=$commandName?> 가능한 특수병종은 <font color=limegreen>초록색</font>으로 표시됩니다.<br>
$(function(){
var $postForm = $('#post_form');
var $formAmount = $postForm.find('.form_amount');
var $formCrewtype = $postForm.find('.form_crewtype');
$('.form_double').on('keyup change',function(e){
var $this = $(this);
var $parent = $this.parents('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
calc(crewtype);
$formCrewtype.val(crewtype);
$formAmount.val($this.val());
<table class='tb_layout' style='margin:auto;'>
<thead>
<?php if($commandName=='모병'): ?>
<tr><td align=center colspan=10>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
<?php endif; ?>
<tr>
<td colspan=10 align=center class='bg2'>
현재 기술력 : <?=$techLevelText?>
현재 통솔 : <?=$leader?>
현재 병종 : <?=$crewTypeName?>
현재 병사 : <?=$crew?>
현재 자금 : <?=$gold?>
</td>
</tr>
<tr>
<td width=64 align=center class='bg1'>사진</td>
<td width=64 align=center class='bg1'>병종</td>
<td width=40 align=center class='bg1'>공격</td>
<td width=40 align=center class='bg1'>방어</td>
<td width=40 align=center class='bg1'>기동</td>
<td width=40 align=center class='bg1'>회피</td>
<td width=40 align=center class='bg1'>군량</td>
<td width=40 align=center class='bg1'>가격</td>
<td width=130 align=center class='bg1'>병사수</td>
<td width=300 align=center class='bg1'>특징</td>
</tr>
</thead>
<tbody>
<?php foreach($armTypes as [$armName,$armTypeCrews]): ?>
<tr><td colspan=10><?=$armName?> 계열</td></tr>
<?php foreach($armTypeCrews as $crewObj): ?>
<tr
id="crewType<?=$crewObj->id?>"
style='height:64px;background-color:<?=$crewObj->bgcolor?>'
data-rice="<?=$crewObj->baseRice?>"
data-cost="<?=$crewObj->baseCost?>"
>
<td style='background:#222222 no-repeat center url("<?=$crewObj->img?>");background-size:64px'></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->name?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->attack?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->defence?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->speed?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->avoid?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseRiceShort?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseCostShort?></td>
<td style='text-align:center;vertical-align:middle;'><form action=c_double.php>
<input type=text class=form_double name=double maxlength=3 size=3
value=<?=$maxCrew?> style=text-align:right;color:white;background-color:black
>00<input type=button value=계산 onclick='calc(<?=$crewObj->id?>)'><br>
<input type=text class=form_cost name=cost maxlength=5 size=5 readonly
style=text-align:right;color:white;background-color:black> <input type=submit value='<?=$commandName?>'>
<input type=hidden name=third value='<?=$crewObj->id?>'>
<input type=hidden name=command value='<?=$command?>'>
<?php for($j=0; $j < count($turn); $j++) : ?>
<input type=hidden name='turn[]' value='<?=$turn[$j]?>'>
<?php endfor; ?>
</form></td>
<td><?=$crewObj->info?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</tbody>
</table>
if(e.which === 13){
$postForm.submit();
}
return false;
});
$('.btn_half').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = Math.round(leader / 2);
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.btn_fill').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = Math.ceil((leader*100 - currentCrew)/100);
if(crewtype != currentCrewType){
fillValue = leader;
}
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.btn_full').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = fullLeader + 15;
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.submit_btn').click(function(){
var $this = $(this);
var $parent = $this.closest('tr').find('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double');
$formCrewtype.val(crewtype);
$formAmount.val($input.val());
$postForm.submit();
});
$('.btn_fill').click();
});
</script>
+4 -1
View File
@@ -1,5 +1,8 @@
<table id="server_admin_table">
<caption class="bg2 section_title with_border"> </caption>
<caption class="bg2 section_title with_border">
<a id="showErrorLog" href="../showErrorLog.php" style="display:none;" class="btn btn-primary btn-sm" role="button">에러 로그 확인</a>
</caption>
<colgroup>
<col style="width:65px;">
<col style="width:135px;">
+6 -6
View File
@@ -46,12 +46,12 @@ require(__dir__.'/../vendor/autoload.php');
<a href="entrance.php"><button id="btn_back1" class="with_skin">돌아가기</button></a>
</caption>
<colgroup>
<col style="width:80px;min-width:80px;" />
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="min-width:80px;"/>
<col style="width:90px;min-width:90px;" />
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="min-width:90px;"/>
</colgroup>
<thead>
<tr>
+8 -6
View File
@@ -120,6 +120,7 @@ function postOAuthResult(result){
</ul>
</div>
</nav>
<div class="full-content">
<div class="vertical-center">
<div class="container">
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe</h1>
@@ -133,8 +134,8 @@ function postOAuthResult(result){
<form id="main_form" method="post" action="#">
<div class="form-group row">
<label for="username" class="col-sm-4 col-form-label">계정명</label>
<div class="col-sm-8">
<label for="username" class="col-5 col-md-4 col-form-label">계정명</label>
<div class="col-7 col-md-8">
<input autocomplete="username" type="text" class="form-control"
name="username" id="username" autofocus="autofocus" placeholder="계정명"/>
</div>
@@ -142,8 +143,8 @@ function postOAuthResult(result){
<div class="form-group row">
<label for="password" class="col-sm-4 col-form-label">비밀번호</label>
<div class="col-sm-8">
<label for="password" class="col-5 col-md-4 col-form-label">비밀번호</label>
<div class="col-7 col-md-8">
<input autocomplete="current-password" type="password"
class="form-control" name="password" id="password" placeholder="비밀번호"/>
</div>
@@ -151,8 +152,8 @@ function postOAuthResult(result){
<input type="hidden" id="global_salt" name="global_salt" value="<?=RootDB::getGlobalSalt()?>">
<div class="form-group row">
<div class="col-sm-4" style="position:relative;"><button type="button" onclick="getOAuthToken('login');" id="btn_kakao_login" title="카카오톡으로 가입&amp;로그인"></button></div>
<div class="col-sm-8">
<div class="col-5 col-md-4 " style="position:relative;"><button type="button" onclick="getOAuthToken('login');" id="btn_kakao_login" title="카카오톡으로 가입&amp;로그인"></button></div>
<div class="col-7 col-md-8">
<button type="submit" class="btn btn-primary btn-lg btn-block login-button">로그인</button>
</div>
</div>
@@ -171,6 +172,7 @@ function postOAuthResult(result){
</div>
</div>
</div>
</div>
<div id="bottom_box">
<div class="container"><a href="terms.2.html">개인정보처리방침</a> &amp; <a href="terms.1.html">이용약관</a><br>© 2018 HideD
<br>크롬과 파이어폭스에 최적화되어있습니다.</div></div>
+9
View File
@@ -77,6 +77,11 @@ function serverUpdate(caller){
function drawServerAdminList(serverList){
var $table = $('#server_admin_list');
var $showErrorLog = $('#showErrorLog');
if(serverList.grade >= 5){
$showErrorLog.show();
}
$.each(serverList.server, function(idx, server){
console.log(server);
var status = '';
@@ -103,7 +108,10 @@ function drawServerAdminList(serverList){
$tr.find('.valid_if_installed').prop('disabled', true);
}
var aclByServer = serverList.acl[server.name];
$.each(aclByServer, function(idx, action){
console.log(action);
if(action == 'update' || action == 'fullUpdate'){
@@ -111,6 +119,7 @@ function drawServerAdminList(serverList){
return true;
}
$tr.find('.serv_act_update').prop('disabled', false);
$showErrorLog.show();
}
else if(action == 'openClose'){
if(!server.valid){
+1 -1
View File
@@ -47,7 +47,7 @@ var serverReservedTemplate = "\
<td colspan='4' class='server_reserved'>\
- 오픈 일시 : <%openDatetime%> - <br>\
<span style='color:orange;'><%scenarioName%></span> <span style='color:limegreen;'><%turnterm%> </span><br>\
(상성 설정:<%fictionMode%>), (빙의 여부:<%npcMode%>), (최대 스탯:<%gameConf.statTotal%>)</td>\
(상성 설정:<%fictionMode%>), (빙의 여부:<%npcMode%>), (최대 스탯:<%gameConf.defaultStatTotal%>)</td>\
";
$(function(){
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace sammo;
require(__dir__.'/vendor/autoload.php');
$session = Session::requireLogin('./')->setReadOnly();
$allowUpdate = false;
foreach($session->acl as $eachAcl){
if(in_array('fullUpdate', $eachAcl)){
$allowUpdate = true;
break;
}
if(in_array('update', $eachAcl)){
$allowUpdate = true;
break;
}
}
$allowUpdate |= $session->userGrade >= 5;
if(!$allowUpdate){
header('Location:./');
}
$fdb = FileDB::db(ROOT.'/d_log/err_log.sqlite3', ROOT.'/f_install/sql/err_log.sql');
$err_logs = $fdb->select('err_log', [
'date',
'err',
'errstr',
'trace'
], [
'ORDER'=>['id'=>'DESC'],
'LIMIT'=>100
]);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title>에러 로그</title>
<!-- 스타일 -->
<?=WebUtil::printCSS('e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('d_shared/common.css')?>
<?=WebUtil::printJS('e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('d_shared/common_path.js')?>
<?=WebUtil::printJS('e_lib/bootstrap.bundle.min.js')?>
</head>
<body>
<div class="container">
<?php foreach($err_logs as $err): ?>
<div class="card">
<div class="card-header">
<?=htmlspecialchars($err['err'])?> - <?=$err['date']?>
</div>
<div class="card-body">
<div class="card-title"><?=htmlspecialchars($err['errstr'])?></div>
<ul class="list-group list-group-flush">
<?php foreach(Json::decode($err['trace']) as $trace): ?>
<li class="list-group-item"><?=htmlspecialchars($trace)?></li>
<?php endforeach; ?>
</ul>
</div>
</div>
<?php endforeach; ?>
</div>
</body>
</html>
+20
View File
@@ -0,0 +1,20 @@
<?php
namespace sammo;
//SQLite + catfan\Medoo
use \Medoo\Medoo;
class FileDB{
public static function db(string $path, ?string $schemaPath = null) : Medoo{
//Note: reference count 적용. MySQL의 것과 다르게 동작함.
$db = new Medoo([
'database_type' => 'sqlite',
'database_file' => $path
]);
if($schemaPath){
$db->query(\file_get_contents($schemaPath));
}
return $db;
}
}
+22
View File
@@ -0,0 +1,22 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
+216
View File
@@ -0,0 +1,216 @@
#################
## Eclipse
#################
*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
#################
## Visual Studio
#################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
*.pubxml
*.publishproj
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#############
## Windows detritus
#############
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
#############
## Python
#############
*.py[cod]
# Packages
*.egg
*.egg-info
dist/
build/
eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
#Translations
*.mo
#Mr Developer
.mr.developer.cfg
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Angel Lai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+100
View File
@@ -0,0 +1,100 @@
<p align="center">
<a href="https://medoo.in" target="_blank"><img src="https://cloud.githubusercontent.com/assets/1467904/19835326/ca62bc36-9ebd-11e6-8b37-7240d76319cd.png"></a>
</p>
<p align="center">
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Total Downloads" src="https://poser.pugx.org/catfan/medoo/downloads"></a>
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Latest Stable Version" src="https://poser.pugx.org/catfan/medoo/v/stable"></a>
<a href="https://packagist.org/packages/catfan/medoo"><img alt="License" src="https://poser.pugx.org/catfan/medoo/license"></a>
</p>
> The Lightest PHP database framework to accelerate development
## Features
* **Lightweight** - Less than 100 KB, portable with only one file
* **Easy** - Extremely easy to learn and use, friendly construction
* **Powerful** - Supports various common and complex SQL queries, data mapping, and prevent SQL injection
* **Compatible** - Supports all SQL databases, including MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle and more
* **Friendly** - Works well with every PHP frameworks, like Laravel, Codeigniter, Yii, Slim, and framework which supports singleton extension or composer
* **Free** - Under MIT license, you can use it anywhere whatever you want
## Requirement
PHP 5.4+ and PDO extension installed
## Get Started
### Install via composer
Add Medoo to composer.json configuration file.
```
$ composer require catfan/Medoo
```
And update the composer
```
$ composer update
```
```php
// If you installed via composer, just use this code to requrie autoloader on the top of your projects.
require 'vendor/autoload.php';
// Using Medoo namespace
use Medoo\Medoo;
// Initialize
$database = new Medoo([
'database_type' => 'mysql',
'database_name' => 'name',
'server' => 'localhost',
'username' => 'your_username',
'password' => 'your_password'
]);
// Enjoy
$database->insert('account', [
'user_name' => 'foo',
'email' => 'foo@bar.com'
]);
$data = $database->select('account', [
'user_name',
'email'
], [
'user_id' => 50
]);
echo json_encode($data);
// [
// {
// "user_name" : "foo",
// "email" : "foo@bar.com",
// }
// ]
```
## Contribution Guides
For most of time, Medoo is using develop branch for adding feature and fixing bug, and the branch will be merged into master branch while releasing a public version. For contribution, submit your code to the develop branch, and start a pull request into it.
On develop branch, each commits are started with `[fix]`, `[feature]` or `[update]` tag to indicate the change.
Keep it simple and keep it clear.
## License
Medoo is under the MIT license.
## Links
* Official website: [https://medoo.in](https://medoo.in)
* Documentation: [https://medoo.in/doc](https://medoo.in/doc)
+33
View File
@@ -0,0 +1,33 @@
{
"name": "catfan/medoo",
"type": "framework",
"description": "The lightest PHP database framework to accelerate development",
"keywords": ["database", "lightweight", "PHP framework", "SQL", "MySQL", "MSSQL", "SQLite", "PostgreSQL", "MariaDB", "Oracle"],
"homepage": "https://medoo.in",
"license": "MIT",
"support": {
"issues": "https://github.com/catfan/Medoo/issues",
"source": "https://github.com/catfan/Medoo"
},
"authors": [
{"name": "Angel Lai", "email": "angel@catfan.me"}
],
"require": {
"php": ">=5.4",
"ext-pdo": "*"
},
"suggest": {
"ext-pdo_mysql": "For MySQL or MariaDB database",
"ext-pdo_sqlsrv": "For MSSQL database",
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
"ext-pdo_oci": "For Oracle database",
"ext-pdo_oci8": "For Oracle version 8 database",
"ext-pdo_pqsql": "For PostgreSQL database",
"ext-pdo_sqlite": "For SQLite database"
},
"autoload": {
"psr-4": {
"Medoo\\": "/src"
}
}
}
+1553
View File
@@ -0,0 +1,1553 @@
<?php
/*!
* Medoo database framework
* https://medoo.in
* Version 1.5.7
*
* Copyright 2018, Angel Lai
* Released under the MIT license
*/
namespace Medoo;
use PDO;
use Exception;
use PDOException;
class Raw {
public $map;
public $value;
}
class Medoo
{
public $pdo;
protected $type;
protected $prefix;
protected $statement;
protected $option = [];
protected $logs = [];
protected $logging = false;
protected $debug_mode = false;
protected $guid = 0;
public function __construct($options = null)
{
if (!is_array($options))
{
return false;
}
if (isset($options[ 'database_type' ]))
{
$this->type = strtolower($options[ 'database_type' ]);
}
if (isset($options[ 'prefix' ]))
{
$this->prefix = $options[ 'prefix' ];
}
if (isset($options[ 'option' ]))
{
$this->option = $options[ 'option' ];
}
if (isset($options[ 'logging' ]) && is_bool($options[ 'logging' ]))
{
$this->logging = $options[ 'logging' ];
}
if (isset($options[ 'command' ]) && is_array($options[ 'command' ]))
{
$commands = $options[ 'command' ];
}
else
{
$commands = [];
}
if (isset($options[ 'dsn' ]))
{
if (is_array($options[ 'dsn' ]) && isset($options[ 'dsn' ][ 'driver' ]))
{
$attr = $options[ 'dsn' ];
}
else
{
return false;
}
}
else
{
if (
isset($options[ 'port' ]) &&
is_int($options[ 'port' ] * 1)
)
{
$port = $options[ 'port' ];
}
$is_port = isset($port);
switch ($this->type)
{
case 'mariadb':
case 'mysql':
$attr = [
'driver' => 'mysql',
'dbname' => $options[ 'database_name' ]
];
if (isset($options[ 'socket' ]))
{
$attr[ 'unix_socket' ] = $options[ 'socket' ];
}
else
{
$attr[ 'host' ] = $options[ 'server' ];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
}
// Make MySQL using standard quoted identifier
$commands[] = 'SET SQL_MODE=ANSI_QUOTES';
break;
case 'pgsql':
$attr = [
'driver' => 'pgsql',
'host' => $options[ 'server' ],
'dbname' => $options[ 'database_name' ]
];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
break;
case 'sybase':
$attr = [
'driver' => 'dblib',
'host' => $options[ 'server' ],
'dbname' => $options[ 'database_name' ]
];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
break;
case 'oracle':
$attr = [
'driver' => 'oci',
'dbname' => $options[ 'server' ] ?
'//' . $options[ 'server' ] . ($is_port ? ':' . $port : ':1521') . '/' . $options[ 'database_name' ] :
$options[ 'database_name' ]
];
if (isset($options[ 'charset' ]))
{
$attr[ 'charset' ] = $options[ 'charset' ];
}
break;
case 'mssql':
if (isset($options[ 'driver' ]) && $options[ 'driver' ] === 'dblib')
{
$attr = [
'driver' => 'dblib',
'host' => $options[ 'server' ] . ($is_port ? ':' . $port : ''),
'dbname' => $options[ 'database_name' ]
];
}
else
{
$attr = [
'driver' => 'sqlsrv',
'Server' => $options[ 'server' ] . ($is_port ? ',' . $port : ''),
'Database' => $options[ 'database_name' ]
];
}
// Keep MSSQL QUOTED_IDENTIFIER is ON for standard quoting
$commands[] = 'SET QUOTED_IDENTIFIER ON';
// Make ANSI_NULLS is ON for NULL value
$commands[] = 'SET ANSI_NULLS ON';
break;
case 'sqlite':
$attr = [
'driver' => 'sqlite',
$options[ 'database_file' ]
];
break;
}
}
$driver = $attr[ 'driver' ];
unset($attr[ 'driver' ]);
$stack = [];
foreach ($attr as $key => $value)
{
$stack[] = is_int($key) ? $value : $key . '=' . $value;
}
$dsn = $driver . ':' . implode($stack, ';');
if (
in_array($this->type, ['mariadb', 'mysql', 'pgsql', 'sybase', 'mssql']) &&
isset($options[ 'charset' ])
)
{
$commands[] = "SET NAMES '" . $options[ 'charset' ] . "'";
}
try {
$this->pdo = new PDO(
$dsn,
isset($options[ 'username' ]) ? $options[ 'username' ] : null,
isset($options[ 'password' ]) ? $options[ 'password' ] : null,
$this->option
);
foreach ($commands as $value)
{
$this->pdo->exec($value);
}
}
catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
public function __call($name, $arguments)
{
$aggregation = ['avg', 'count', 'max', 'min', 'sum'];
if (in_array($name, $aggregation))
{
array_unshift($arguments, $name);
return call_user_func_array([$this, 'aggregate'], $arguments);
}
}
public function query($query, $map = [])
{
$raw = $this->raw($query, $map);
$query = $this->buildRaw($raw, $map);
return $this->exec($query, $map);
}
public function exec($query, $map = [])
{
if ($this->debug_mode)
{
echo $this->generate($query, $map);
$this->debug_mode = false;
return false;
}
if ($this->logging)
{
$this->logs[] = [$query, $map];
}
else
{
$this->logs = [[$query, $map]];
}
$statement = $this->pdo->prepare($query);
if ($statement)
{
foreach ($map as $key => $value)
{
$statement->bindValue($key, $value[ 0 ], $value[ 1 ]);
}
$statement->execute();
$this->statement = $statement;
return $statement;
}
return false;
}
protected function generate($query, $map)
{
$identifier = [
'mysql' => '`$1`',
'mariadb' => '`$1`',
'mssql' => '[$1]'
];
$query = preg_replace(
'/"([a-zA-Z0-9_]+)"/i',
isset($identifier[ $this->type ]) ? $identifier[ $this->type ] : '"$1"',
$query
);
foreach ($map as $key => $value)
{
if ($value[ 1 ] === PDO::PARAM_STR)
{
$replace = $this->quote($value[ 0 ]);
}
elseif ($value[ 1 ] === PDO::PARAM_NULL)
{
$replace = 'NULL';
}
elseif ($value[ 1 ] === PDO::PARAM_LOB)
{
$replace = '{LOB_DATA}';
}
else
{
$replace = $value[ 0 ];
}
$query = str_replace($key, $replace, $query);
}
return $query;
}
public static function raw($string, $map = [])
{
$raw = new Raw();
$raw->map = $map;
$raw->value = $string;
return $raw;
}
protected function isRaw($object)
{
return $object instanceof Raw;
}
protected function buildRaw($raw, &$map)
{
if (!$this->isRaw($raw))
{
return false;
}
$query = preg_replace_callback(
'/((FROM|TABLE|INTO|UPDATE)\s*)?\<([a-zA-Z0-9_\.]+)\>/i',
function ($matches)
{
if (!empty($matches[ 2 ]))
{
return $matches[ 2 ] . ' ' . $this->tableQuote($matches[ 3 ]);
}
return $this->columnQuote($matches[ 3 ]);
},
$raw->value);
$raw_map = $raw->map;
if (!empty($raw_map))
{
foreach ($raw_map as $key => $value)
{
$map[ $key ] = $this->typeMap($value, gettype($value));
}
}
return $query;
}
public function quote($string)
{
return $this->pdo->quote($string);
}
protected function tableQuote($table)
{
return '"' . $this->prefix . $table . '"';
}
protected function mapKey()
{
return ':MeDoO_' . $this->guid++ . '_mEdOo';
}
protected function typeMap($value, $type)
{
$map = [
'NULL' => PDO::PARAM_NULL,
'integer' => PDO::PARAM_INT,
'double' => PDO::PARAM_STR,
'boolean' => PDO::PARAM_BOOL,
'string' => PDO::PARAM_STR,
'object' => PDO::PARAM_STR,
'resource' => PDO::PARAM_LOB
];
if ($type === 'boolean')
{
$value = ($value ? '1' : '0');
}
elseif ($type === 'NULL')
{
$value = null;
}
return [$value, $map[ $type ]];
}
protected function columnQuote($string)
{
if (strpos($string, '.') !== false)
{
return '"' . $this->prefix . str_replace('.', '"."', $string) . '"';
}
return '"' . $string . '"';
}
protected function columnPush(&$columns, &$map)
{
if ($columns === '*')
{
return $columns;
}
$stack = [];
if (is_string($columns))
{
$columns = [$columns];
}
foreach ($columns as $key => $value)
{
if (is_array($value))
{
$stack[] = $this->columnPush($value, $map);
}
elseif (!is_int($key) && $raw = $this->buildRaw($value, $map))
{
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $match);
$stack[] = $raw . ' AS ' . $this->columnQuote( $match[ 'column' ] );
}
elseif (is_int($key) && is_string($value))
{
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $match);
if (!empty($match[ 'alias' ]))
{
$stack[] = $this->columnQuote( $match[ 'column' ] ) . ' AS ' . $this->columnQuote( $match[ 'alias' ] );
$columns[ $key ] = $match[ 'alias' ];
if (!empty($match[ 'type' ]))
{
$columns[ $key ] .= ' [' . $match[ 'type' ] . ']';
}
}
else
{
$stack[] = $this->columnQuote( $match[ 'column' ] );
}
}
}
return implode($stack, ',');
}
protected function arrayQuote($array)
{
$stack = [];
foreach ($array as $value)
{
$stack[] = is_int($value) ? $value : $this->pdo->quote($value);
}
return implode($stack, ',');
}
protected function innerConjunct($data, $map, $conjunctor, $outer_conjunctor)
{
$stack = [];
foreach ($data as $value)
{
$stack[] = '(' . $this->dataImplode($value, $map, $conjunctor) . ')';
}
return implode($outer_conjunctor . ' ', $stack);
}
protected function dataImplode($data, &$map, $conjunctor)
{
$stack = [];
foreach ($data as $key => $value)
{
$type = gettype($value);
if (
$type === 'array' &&
preg_match("/^(AND|OR)(\s+#.*)?$/", $key, $relation_match)
)
{
$relationship = $relation_match[ 1 ];
$stack[] = $value !== array_keys(array_keys($value)) ?
'(' . $this->dataImplode($value, $map, ' ' . $relationship) . ')' :
'(' . $this->innerConjunct($value, $map, ' ' . $relationship, $conjunctor) . ')';
continue;
}
$map_key = $this->mapKey();
if (
is_int($key) &&
preg_match('/([a-zA-Z0-9_\.]+)\[(?<operator>\>\=?|\<\=?|\!?\=)\]([a-zA-Z0-9_\.]+)/i', $value, $match)
)
{
$stack[] = $this->columnQuote($match[ 1 ]) . ' ' . $match[ 'operator' ] . ' ' . $this->columnQuote($match[ 3 ]);
}
else
{
preg_match('/([a-zA-Z0-9_\.]+)(\[(?<operator>\>\=?|\<\=?|\!|\<\>|\>\<|\!?~|REGEXP)\])?/i', $key, $match);
$column = $this->columnQuote($match[ 1 ]);
if (isset($match[ 'operator' ]))
{
$operator = $match[ 'operator' ];
if (in_array($operator, ['>', '>=', '<', '<=']))
{
$condition = $column . ' ' . $operator . ' ';
if (is_numeric($value))
{
$condition .= $map_key;
$map[ $map_key ] = [$value, PDO::PARAM_INT];
}
elseif ($raw = $this->buildRaw($value, $map))
{
$condition .= $raw;
}
else
{
$condition .= $map_key;
$map[ $map_key ] = [$value, PDO::PARAM_STR];
}
$stack[] = $condition;
}
elseif ($operator === '!')
{
switch ($type)
{
case 'NULL':
$stack[] = $column . ' IS NOT NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item)
{
$placeholders[] = $map_key . $index . '_i';
$map[ $map_key . $index . '_i' ] = $this->typeMap($item, gettype($item));
}
$stack[] = $column . ' NOT IN (' . implode(', ', $placeholders) . ')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map))
{
$stack[] = $column . ' != ' . $raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column . ' != ' . $map_key;
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
elseif ($operator === '~' || $operator === '!~')
{
if ($type !== 'array')
{
$value = [ $value ];
}
$connector = ' OR ';
$data = array_values($value);
if (is_array($data[ 0 ]))
{
if (isset($value[ 'AND' ]) || isset($value[ 'OR' ]))
{
$connector = ' ' . array_keys($value)[ 0 ] . ' ';
$value = $data[ 0 ];
}
}
$like_clauses = [];
foreach ($value as $index => $item)
{
$item = strval($item);
if (!preg_match('/(\[.+\]|_|%.+|.+%)/', $item))
{
$item = '%' . $item . '%';
}
$like_clauses[] = $column . ($operator === '!~' ? ' NOT' : '') . ' LIKE ' . $map_key . 'L' . $index;
$map[ $map_key . 'L' . $index ] = [$item, PDO::PARAM_STR];
}
$stack[] = '(' . implode($connector, $like_clauses) . ')';
}
elseif ($operator === '<>' || $operator === '><')
{
if ($type === 'array')
{
if ($operator === '><')
{
$column .= ' NOT';
}
$stack[] = '(' . $column . ' BETWEEN ' . $map_key . 'a AND ' . $map_key . 'b)';
$data_type = (is_numeric($value[ 0 ]) && is_numeric($value[ 1 ])) ? PDO::PARAM_INT : PDO::PARAM_STR;
$map[ $map_key . 'a' ] = [$value[ 0 ], $data_type];
$map[ $map_key . 'b' ] = [$value[ 1 ], $data_type];
}
}
elseif ($operator === 'REGEXP')
{
$stack[] = $column . ' REGEXP ' . $map_key;
$map[ $map_key ] = [$value, PDO::PARAM_STR];
}
}
else
{
switch ($type)
{
case 'NULL':
$stack[] = $column . ' IS NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item)
{
$placeholders[] = $map_key . $index . '_i';
$map[ $map_key . $index . '_i' ] = $this->typeMap($item, gettype($item));
}
$stack[] = $column . ' IN (' . implode(', ', $placeholders) . ')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map))
{
$stack[] = $column . ' = ' . $raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column . ' = ' . $map_key;
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
}
return implode($conjunctor . ' ', $stack);
}
protected function whereClause($where, &$map)
{
$where_clause = '';
if (is_array($where))
{
$where_keys = array_keys($where);
$conditions = array_diff_key($where, array_flip(
['GROUP', 'ORDER', 'HAVING', 'LIMIT', 'LIKE', 'MATCH']
));
if (!empty($conditions))
{
$where_clause = ' WHERE ' . $this->dataImplode($conditions, $map, ' AND');
}
if (isset($where[ 'MATCH' ]))
{
$MATCH = $where[ 'MATCH' ];
if (is_array($MATCH) && isset($MATCH[ 'columns' ], $MATCH[ 'keyword' ]))
{
$mode = '';
$mode_array = [
'natural' => 'IN NATURAL LANGUAGE MODE',
'natural+query' => 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
'boolean' => 'IN BOOLEAN MODE',
'query' => 'WITH QUERY EXPANSION'
];
if (isset($MATCH[ 'mode' ], $mode_array[ $MATCH[ 'mode' ] ]))
{
$mode = ' ' . $mode_array[ $MATCH[ 'mode' ] ];
}
$columns = implode(array_map([$this, 'columnQuote'], $MATCH[ 'columns' ]), ', ');
$map_key = $this->mapKey();
$map[ $map_key ] = [$MATCH[ 'keyword' ], PDO::PARAM_STR];
$where_clause .= ($where_clause !== '' ? ' AND ' : ' WHERE') . ' MATCH (' . $columns . ') AGAINST (' . $map_key . $mode . ')';
}
}
if (isset($where[ 'GROUP' ]))
{
$GROUP = $where[ 'GROUP' ];
if (is_array($GROUP))
{
$stack = [];
foreach ($GROUP as $column => $value)
{
$stack[] = $this->columnQuote($value);
}
$where_clause .= ' GROUP BY ' . implode($stack, ',');
}
elseif ($raw = $this->buildRaw($GROUP, $map))
{
$where_clause .= ' GROUP BY ' . $raw;
}
else
{
$where_clause .= ' GROUP BY ' . $this->columnQuote($GROUP);
}
if (isset($where[ 'HAVING' ]))
{
if ($raw = $this->buildRaw($where[ 'HAVING' ], $map))
{
$where_clause .= ' HAVING ' . $raw;
}
else
{
$where_clause .= ' HAVING ' . $this->dataImplode($where[ 'HAVING' ], $map, ' AND');
}
}
}
if (isset($where[ 'ORDER' ]))
{
$ORDER = $where[ 'ORDER' ];
if (is_array($ORDER))
{
$stack = [];
foreach ($ORDER as $column => $value)
{
if (is_array($value))
{
$stack[] = 'FIELD(' . $this->columnQuote($column) . ', ' . $this->arrayQuote($value) . ')';
}
elseif ($value === 'ASC' || $value === 'DESC')
{
$stack[] = $this->columnQuote($column) . ' ' . $value;
}
elseif (is_int($column))
{
$stack[] = $this->columnQuote($value);
}
}
$where_clause .= ' ORDER BY ' . implode($stack, ',');
}
elseif ($raw = $this->buildRaw($ORDER, $map))
{
$where_clause .= ' ORDER BY ' . $raw;
}
else
{
$where_clause .= ' ORDER BY ' . $this->columnQuote($ORDER);
}
if (
isset($where[ 'LIMIT' ]) &&
in_array($this->type, ['oracle', 'mssql'])
)
{
$LIMIT = $where[ 'LIMIT' ];
if (is_numeric($LIMIT))
{
$LIMIT = [0, $LIMIT];
}
if (
is_array($LIMIT) &&
is_numeric($LIMIT[ 0 ]) &&
is_numeric($LIMIT[ 1 ])
)
{
$where_clause .= ' OFFSET ' . $LIMIT[ 0 ] . ' ROWS FETCH NEXT ' . $LIMIT[ 1 ] . ' ROWS ONLY';
}
}
}
if (isset($where[ 'LIMIT' ]) && !in_array($this->type, ['oracle', 'mssql']))
{
$LIMIT = $where[ 'LIMIT' ];
if (is_numeric($LIMIT))
{
$where_clause .= ' LIMIT ' . $LIMIT;
}
elseif (
is_array($LIMIT) &&
is_numeric($LIMIT[ 0 ]) &&
is_numeric($LIMIT[ 1 ])
)
{
$where_clause .= ' LIMIT ' . $LIMIT[ 1 ] . ' OFFSET ' . $LIMIT[ 0 ];
}
}
}
elseif ($raw = $this->buildRaw($where, $map))
{
$where_clause .= ' ' . $raw;
}
return $where_clause;
}
protected function selectContext($table, &$map, $join, &$columns = null, $where = null, $column_fn = null)
{
preg_match('/(?<table>[a-zA-Z0-9_]+)\s*\((?<alias>[a-zA-Z0-9_]+)\)/i', $table, $table_match);
if (isset($table_match[ 'table' ], $table_match[ 'alias' ]))
{
$table = $this->tableQuote($table_match[ 'table' ]);
$table_query = $table . ' AS ' . $this->tableQuote($table_match[ 'alias' ]);
}
else
{
$table = $this->tableQuote($table);
$table_query = $table;
}
$join_key = is_array($join) ? array_keys($join) : null;
if (
isset($join_key[ 0 ]) &&
strpos($join_key[ 0 ], '[') === 0
)
{
$table_join = [];
$join_array = [
'>' => 'LEFT',
'<' => 'RIGHT',
'<>' => 'FULL',
'><' => 'INNER'
];
foreach($join as $sub_table => $relation)
{
preg_match('/(\[(?<join>\<\>?|\>\<?)\])?(?<table>[a-zA-Z0-9_]+)\s?(\((?<alias>[a-zA-Z0-9_]+)\))?/', $sub_table, $match);
if ($match[ 'join' ] !== '' && $match[ 'table' ] !== '')
{
if (is_string($relation))
{
$relation = 'USING ("' . $relation . '")';
}
if (is_array($relation))
{
// For ['column1', 'column2']
if (isset($relation[ 0 ]))
{
$relation = 'USING ("' . implode($relation, '", "') . '")';
}
else
{
$joins = [];
foreach ($relation as $key => $value)
{
$joins[] = (
strpos($key, '.') > 0 ?
// For ['tableB.column' => 'column']
$this->columnQuote($key) :
// For ['column1' => 'column2']
$table . '."' . $key . '"'
) .
' = ' .
$this->tableQuote(isset($match[ 'alias' ]) ? $match[ 'alias' ] : $match[ 'table' ]) . '."' . $value . '"';
}
$relation = 'ON ' . implode($joins, ' AND ');
}
}
$table_name = $this->tableQuote($match[ 'table' ]) . ' ';
if (isset($match[ 'alias' ]))
{
$table_name .= 'AS ' . $this->tableQuote($match[ 'alias' ]) . ' ';
}
$table_join[] = $join_array[ $match[ 'join' ] ] . ' JOIN ' . $table_name . $relation;
}
}
$table_query .= ' ' . implode($table_join, ' ');
}
else
{
if (is_null($columns))
{
if (
!is_null($where) ||
(is_array($join) && isset($column_fn))
)
{
$where = $join;
$columns = null;
}
else
{
$where = null;
$columns = $join;
}
}
else
{
$where = $columns;
$columns = $join;
}
}
if (isset($column_fn))
{
if ($column_fn === 1)
{
$column = '1';
if (is_null($where))
{
$where = $columns;
}
}
else
{
if (empty($columns) || $this->isRaw($columns))
{
$columns = '*';
$where = $join;
}
$column = $column_fn . '(' . $this->columnPush($columns, $map) . ')';
}
}
else
{
$column = $this->columnPush($columns, $map);
}
return 'SELECT ' . $column . ' FROM ' . $table_query . $this->whereClause($where, $map);
}
protected function columnMap($columns, &$stack)
{
if ($columns === '*')
{
return $stack;
}
foreach ($columns as $key => $value)
{
if (is_int($key))
{
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $key_match);
$column_key = !empty($key_match[ 'alias' ]) ?
$key_match[ 'alias' ] :
$key_match[ 'column' ];
if (isset($key_match[ 'type' ]))
{
$stack[ $value ] = [$column_key, $key_match[ 'type' ]];
}
else
{
$stack[ $value ] = [$column_key, 'String'];
}
}
elseif ($this->isRaw($value))
{
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $key_match);
$column_key = $key_match[ 'column' ];
if (isset($key_match[ 'type' ]))
{
$stack[ $key ] = [$column_key, $key_match[ 'type' ]];
}
else
{
$stack[ $key ] = [$column_key, 'String'];
}
}
elseif (!is_int($key) && is_array($value))
{
$this->columnMap($value, $stack);
}
}
return $stack;
}
protected function dataMap($data, $columns, $column_map, &$stack)
{
foreach ($columns as $key => $value)
{
$isRaw = $this->isRaw($value);
if (is_int($key) || $isRaw)
{
$map = $column_map[ $isRaw ? $key : $value ];
$column_key = $map[ 0 ];
$result = $data[ $column_key ];
if (isset($map[ 1 ]))
{
if ($isRaw && in_array($map[ 1 ], ['Object', 'JSON']))
{
continue;
}
if (is_null($result))
{
$stack[ $column_key ] = null;
continue;
}
switch ($map[ 1 ])
{
case 'Number':
$stack[ $column_key ] = (double) $result;
break;
case 'Int':
$stack[ $column_key ] = (int) $result;
break;
case 'Bool':
$stack[ $column_key ] = (bool) $result;
break;
case 'Object':
$stack[ $column_key ] = unserialize($result);
break;
case 'JSON':
$stack[ $column_key ] = json_decode($result, true);
break;
case 'String':
$stack[ $column_key ] = $result;
break;
}
}
else
{
$stack[ $column_key ] = $result;
}
}
else
{
$current_stack = [];
$this->dataMap($data, $value, $column_map, $current_stack);
$stack[ $key ] = $current_stack;
}
}
}
public function select($table, $join, $columns = null, $where = null)
{
$map = [];
$stack = [];
$column_map = [];
$index = 0;
$column = $where === null ? $join : $columns;
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where), $map);
$this->columnMap($columns, $column_map);
if (!$query)
{
return false;
}
if ($columns === '*')
{
return $query->fetchAll(PDO::FETCH_ASSOC);
}
if ($is_single)
{
return $query->fetchAll(PDO::FETCH_COLUMN);
}
while ($data = $query->fetch(PDO::FETCH_ASSOC))
{
$current_stack = [];
$this->dataMap($data, $columns, $column_map, $current_stack);
$stack[ $index ] = $current_stack;
$index++;
}
return $stack;
}
public function insert($table, $datas)
{
$stack = [];
$columns = [];
$fields = [];
$map = [];
if (!isset($datas[ 0 ]))
{
$datas = [$datas];
}
foreach ($datas as $data)
{
foreach ($data as $key => $value)
{
$columns[] = $key;
}
}
$columns = array_unique($columns);
foreach ($datas as $data)
{
$values = [];
foreach ($columns as $key)
{
if ($raw = $this->buildRaw($data[ $key ], $map))
{
$values[] = $raw;
continue;
}
$map_key =$this->mapKey();
$values[] = $map_key;
if (!isset($data[ $key ]))
{
$map[ $map_key ] = [null, PDO::PARAM_NULL];
}
else
{
$value = $data[ $key ];
$type = gettype($value);
switch ($type)
{
case 'array':
$map[ $map_key ] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR
];
break;
case 'object':
$value = serialize($value);
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
$stack[] = '(' . implode($values, ', ') . ')';
}
foreach ($columns as $key)
{
$fields[] = $this->columnQuote(preg_replace("/(\s*\[JSON\]$)/i", '', $key));
}
return $this->exec('INSERT INTO ' . $this->tableQuote($table) . ' (' . implode(', ', $fields) . ') VALUES ' . implode(', ', $stack), $map);
}
public function update($table, $data, $where = null)
{
$fields = [];
$map = [];
foreach ($data as $key => $value)
{
$column = $this->columnQuote(preg_replace("/(\s*\[(JSON|\+|\-|\*|\/)\]$)/i", '', $key));
if ($raw = $this->buildRaw($value, $map))
{
$fields[] = $column . ' = ' . $raw;
continue;
}
$map_key = $this->mapKey();
preg_match('/(?<column>[a-zA-Z0-9_]+)(\[(?<operator>\+|\-|\*|\/)\])?/i', $key, $match);
if (isset($match[ 'operator' ]))
{
if (is_numeric($value))
{
$fields[] = $column . ' = ' . $column . ' ' . $match[ 'operator' ] . ' ' . $value;
}
}
else
{
$fields[] = $column . ' = ' . $map_key;
$type = gettype($value);
switch ($type)
{
case 'array':
$map[ $map_key ] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR
];
break;
case 'object':
$value = serialize($value);
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $fields) . $this->whereClause($where, $map), $map);
}
public function delete($table, $where)
{
$map = [];
return $this->exec('DELETE FROM ' . $this->tableQuote($table) . $this->whereClause($where, $map), $map);
}
public function replace($table, $columns, $where = null)
{
if (!is_array($columns) || empty($columns))
{
return false;
}
$map = [];
$stack = [];
foreach ($columns as $column => $replacements)
{
if (is_array($replacements))
{
foreach ($replacements as $old => $new)
{
$map_key = $this->mapKey();
$stack[] = $this->columnQuote($column) . ' = REPLACE(' . $this->columnQuote($column) . ', ' . $map_key . 'a, ' . $map_key . 'b)';
$map[ $map_key . 'a' ] = [$old, PDO::PARAM_STR];
$map[ $map_key . 'b' ] = [$new, PDO::PARAM_STR];
}
}
}
if (!empty($stack))
{
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $stack) . $this->whereClause($where, $map), $map);
}
return false;
}
public function get($table, $join = null, $columns = null, $where = null)
{
$map = [];
$stack = [];
$column_map = [];
if ($where === null)
{
$column = $join;
unset($columns[ 'LIMIT' ]);
}
else
{
$column = $columns;
unset($where[ 'LIMIT' ]);
}
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where) . ' LIMIT 1', $map);
if ($query)
{
$data = $query->fetchAll(PDO::FETCH_ASSOC);
if (isset($data[ 0 ]))
{
if ($column === '*')
{
return $data[ 0 ];
}
$this->columnMap($columns, $column_map);
$this->dataMap($data[ 0 ], $columns, $column_map, $stack);
if ($is_single)
{
return $stack[ $column_map[ $column ][ 0 ] ];
}
return $stack;
}
return false;
}
return false;
}
public function has($table, $join, $where = null)
{
$map = [];
$column = null;
$query = $this->exec('SELECT EXISTS(' . $this->selectContext($table, $map, $join, $column, $where, 1) . ')', $map);
if ($query)
{
$result = $query->fetchColumn();
return $result === '1' || $result === true;
}
return false;
}
private function aggregate($type, $table, $join = null, $column = null, $where = null)
{
$map = [];
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, strtoupper($type)), $map);
if ($query)
{
$number = $query->fetchColumn();
return is_numeric($number) ? $number + 0 : $number;
}
return false;
}
public function action($actions)
{
if (is_callable($actions))
{
$this->pdo->beginTransaction();
try {
$result = $actions($this);
if ($result === false)
{
$this->pdo->rollBack();
}
else
{
$this->pdo->commit();
}
}
catch (Exception $e) {
$this->pdo->rollBack();
throw $e;
}
return $result;
}
return false;
}
public function id()
{
$type = $this->type;
if ($type === 'oracle')
{
return 0;
}
elseif ($type === 'mssql')
{
return $this->pdo->query('SELECT SCOPE_IDENTITY()')->fetchColumn();
}
elseif ($type === 'pgsql')
{
return $this->pdo->query('SELECT LASTVAL()')->fetchColumn();
}
return $this->pdo->lastInsertId();
}
public function debug()
{
$this->debug_mode = true;
return $this;
}
public function error()
{
return $this->statement ? $this->statement->errorInfo() : null;
}
public function last()
{
$log = end($this->logs);
return $this->generate($log[ 0 ], $log[ 1 ]);
}
public function log()
{
return array_map(function ($log)
{
return $this->generate($log[ 0 ], $log[ 1 ]);
},
$this->logs
);
}
public function info()
{
$output = [
'server' => 'SERVER_INFO',
'driver' => 'DRIVER_NAME',
'client' => 'CLIENT_VERSION',
'version' => 'SERVER_VERSION',
'connection' => 'CONNECTION_STATUS'
];
foreach ($output as $key => $value)
{
$output[ $key ] = @$this->pdo->getAttribute(constant('PDO::ATTR_' . $value));
}
return $output;
}
}
?>
+1
View File
@@ -15,6 +15,7 @@ return array(
'PhpExtended\\Tail\\' => array($vendorDir . '/php-extended/php-tail/src'),
'PhpExtended\\System\\' => array($vendorDir . '/php-extended/php-system/src'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'Medoo\\' => array($vendorDir . '/catfan/medoo/src'),
'League\\Plates\\' => array($vendorDir . '/league/plates/src'),
'Leafo\\ScssPhp\\' => array($vendorDir . '/leafo/scssphp/src'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
+5
View File
@@ -42,6 +42,7 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
'M' =>
array (
'Monolog\\' => 8,
'Medoo\\' => 6,
),
'L' =>
array (
@@ -93,6 +94,10 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
array (
0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
),
'Medoo\\' =>
array (
0 => __DIR__ . '/..' . '/catfan/medoo/src',
),
'League\\Plates\\' =>
array (
0 => __DIR__ . '/..' . '/league/plates/src',
+73 -12
View File
@@ -47,6 +47,67 @@
"utility"
]
},
{
"name": "catfan/medoo",
"version": "v1.5.7",
"version_normalized": "1.5.7.0",
"source": {
"type": "git",
"url": "https://github.com/catfan/Medoo.git",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"shasum": ""
},
"require": {
"ext-pdo": "*",
"php": ">=5.4"
},
"suggest": {
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
"ext-pdo_mysql": "For MySQL or MariaDB database",
"ext-pdo_oci": "For Oracle database",
"ext-pdo_oci8": "For Oracle version 8 database",
"ext-pdo_pqsql": "For PostgreSQL database",
"ext-pdo_sqlite": "For SQLite database",
"ext-pdo_sqlsrv": "For MSSQL database"
},
"time": "2018-06-14T18:59:08+00:00",
"type": "framework",
"installation-source": "dist",
"autoload": {
"psr-4": {
"Medoo\\": "/src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Angel Lai",
"email": "angel@catfan.me"
}
],
"description": "The lightest PHP database framework to accelerate development",
"homepage": "https://medoo.in",
"keywords": [
"database",
"lightweight",
"mariadb",
"mssql",
"mysql",
"oracle",
"php framework",
"postgresql",
"sql",
"sqlite"
]
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
@@ -323,17 +384,17 @@
},
{
"name": "leafo/scssphp",
"version": "v0.7.6",
"version_normalized": "0.7.6.0",
"version": "v0.7.7",
"version_normalized": "0.7.7.0",
"source": {
"type": "git",
"url": "https://github.com/leafo/scssphp.git",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794"
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/585f6ae84de62ffecf69c23805f25d78d7e4b794",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"shasum": ""
},
"require": {
@@ -343,7 +404,7 @@
"phpunit/phpunit": "~4.6",
"squizlabs/php_codesniffer": "~2.5"
},
"time": "2018-05-24T02:18:53+00:00",
"time": "2018-07-22T01:22:08+00:00",
"bin": [
"bin/pscss"
],
@@ -774,17 +835,17 @@
},
{
"name": "symfony/lock",
"version": "v4.1.0",
"version_normalized": "4.1.0.0",
"version": "v4.1.1",
"version_normalized": "4.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a"
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/a1df50492e927ad00ca271f29adb2949a14f2a5a",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a",
"url": "https://api.github.com/repos/symfony/lock/zipball/d508b5dd92272cb74300396ecaadde969d0f7976",
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976",
"shasum": ""
},
"require": {
@@ -794,7 +855,7 @@
"require-dev": {
"predis/predis": "~1.0"
},
"time": "2018-05-30T07:26:09+00:00",
"time": "2018-06-21T11:15:46+00:00",
"type": "library",
"extra": {
"branch-alias": {
+44 -12
View File
@@ -3655,7 +3655,7 @@ class Compiler
return false;
}
list($sorted, $kwargs) = $this->sortArgs($prototype, $args);
@list($sorted, $kwargs) = $this->sortArgs($prototype, $args);
if ($name !== 'if' && $name !== 'call') {
foreach ($sorted as &$val) {
@@ -3714,7 +3714,7 @@ class Compiler
$key = $key[1];
if (empty($key)) {
$posArgs[] = $value;
$posArgs[] = empty($arg[2]) ? $value : $arg;
} else {
$keyArgs[$key] = $value;
}
@@ -4266,20 +4266,38 @@ class Compiler
{
$name = $this->compileStringContent($this->coerceString($this->reduce(array_shift($args), true)));
$args = array_map(
function ($a) {
return [null, $a, false];
},
$args
);
$posArgs = [];
foreach ($args as $arg) {
if (empty($arg[0])) {
if ($arg[2] === true) {
$tmp = $this->reduce($arg[1]);
if ($tmp[0] === Type::T_LIST) {
foreach ($tmp[2] as $item) {
$posArgs[] = [null, $item, false];
}
} else {
$posArgs[] = [null, $tmp, true];
}
continue;
}
$posArgs[] = [null, $this->reduce($arg), false];
continue;
}
$posArgs[] = [null, $arg, false];
}
if (count($kwargs)) {
foreach ($kwargs as $key => $value) {
$args[] = [[Type::T_VARIABLE, $key], $value, false];
$posArgs[] = [[Type::T_VARIABLE, $key], $value, false];
}
}
return $this->reduce([Type::T_FUNCTION_CALL, $name, $args]);
return $this->reduce([Type::T_FUNCTION_CALL, $name, $posArgs]);
}
protected static $libIf = ['condition', 'if-true', 'if-false'];
@@ -4838,7 +4856,7 @@ class Compiler
if (null === $unit) {
$unit = $number[2];
$originalUnit = $item->unitStr();
} elseif ($unit !== $number[2]) {
} elseif ($number[1] && $unit !== $number[2]) {
$this->throwError('Incompatible units: "%s" and "%s".', $originalUnit, $item->unitStr());
break;
}
@@ -4985,7 +5003,21 @@ class Compiler
$map1 = $this->assertMap($args[0]);
$map2 = $this->assertMap($args[1]);
return [Type::T_MAP, array_merge($map1[1], $map2[1]), array_merge($map1[2], $map2[2])];
foreach ($map2[1] as $i2 => $key2) {
$key = $this->compileStringContent($this->coerceString($key2));
foreach ($map1[1] as $i1 => $key1) {
if ($key === $this->compileStringContent($this->coerceString($key1))) {
$map1[2][$i1] = $map2[2][$i2];
continue 2;
}
}
$map1[1][] = $map2[1][$i2];
$map1[2][] = $map2[2][$i2];
}
return $map1;
}
protected static $libKeywords = ['args'];
+3 -3
View File
@@ -79,12 +79,12 @@ class FlockStore implements StoreInterface
// Silence error reporting
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
if (!$handle = fopen($fileName, 'r')) {
if (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) {
if ($handle = fopen($fileName, 'x')) {
chmod($fileName, 0444);
} elseif (!$handle = fopen($fileName, 'r')) {
} elseif (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) {
usleep(100); // Give some time for chmod() to complete
$handle = fopen($fileName, 'r');
$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r');
}
}
restore_error_handler();
+9 -3
View File
@@ -64,8 +64,14 @@ class SemaphoreStore implements StoreInterface
return;
}
$resource = sem_get(crc32($key));
$acquired = sem_acquire($resource, !$blocking);
$keyId = crc32($key);
$resource = sem_get($keyId);
$acquired = @sem_acquire($resource, !$blocking);
while ($blocking && !$acquired) {
$resource = sem_get($keyId);
$acquired = @sem_acquire($resource);
}
if (!$acquired) {
throw new LockConflictedException();
@@ -86,7 +92,7 @@ class SemaphoreStore implements StoreInterface
$resource = $key->getState(__CLASS__);
sem_release($resource);
sem_remove($resource);
$key->removeState(__CLASS__);
}
+28
View File
@@ -11,6 +11,7 @@
namespace Symfony\Component\Lock\Tests\Store;
use Symfony\Component\Lock\Key;
use Symfony\Component\Lock\Store\SemaphoreStore;
/**
@@ -29,4 +30,31 @@ class SemaphoreStoreTest extends AbstractStoreTest
{
return new SemaphoreStore();
}
public function testResourceRemoval()
{
$initialCount = $this->getOpenedSemaphores();
$store = new SemaphoreStore();
$key = new Key(uniqid(__METHOD__, true));
$store->waitAndSave($key);
$this->assertGreaterThan($initialCount, $this->getOpenedSemaphores(), 'Semaphores should have been created');
$store->delete($key);
$this->assertEquals($initialCount, $this->getOpenedSemaphores(), 'All semaphores should be removed');
}
private function getOpenedSemaphores()
{
$lines = explode(PHP_EOL, trim(`ipcs -su`));
if ('------ Semaphore Status --------' !== $lines[0]) {
throw new \Exception('Failed to extract list of opend semaphores. Expect a Semaphore status, got '.implode(PHP_EOL, $lines));
}
list($key, $value) = explode(' = ', $lines[1]);
if ('used arrays' !== $key) {
throw new \Exception('Failed to extract list of opend semaphores. Expect a used arrays key, got '.implode(PHP_EOL, $lines));
}
return (int) $value;
}
}