forked from devsam/core
Compare commits
91
Commits
v0.8.0-pre
...
v0.8.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77a496baa7 | ||
|
|
86e863de09 | ||
|
|
c2cfd217c2 | ||
|
|
f2366a61b0 | ||
|
|
9959393dee | ||
|
|
16facf98f1 | ||
|
|
bc8ce8832a | ||
|
|
20bcf960ef | ||
|
|
5cecd3e995 | ||
|
|
d7ead25ea4 | ||
|
|
75c0c375d1 | ||
|
|
5db4913292 | ||
|
|
a6a53b1d0d | ||
|
|
81a0c0e120 | ||
|
|
0dae71a644 | ||
|
|
f8eedaa3ea | ||
|
|
ce2d97a7e7 | ||
|
|
2cb570eaca | ||
|
|
c8c4352957 | ||
|
|
a311db4555 | ||
|
|
05c515b2da | ||
|
|
c1acf2b0fe | ||
|
|
803a2407eb | ||
|
|
a87945d1fb | ||
|
|
30793e68df | ||
|
|
9c666bf7a9 | ||
|
|
eff1dd7c34 | ||
|
|
e79a33ebb0 | ||
|
|
cb0adfdeaf | ||
|
|
6b135c343c | ||
|
|
6c92db524b | ||
|
|
b8dfd1c041 | ||
|
|
54d6347c1d | ||
|
|
4ea6e90600 | ||
|
|
4c7628a247 | ||
|
|
6c7334155a | ||
|
|
480e3ea974 | ||
|
|
1f639a5bc6 | ||
|
|
ccf3b07c3a | ||
|
|
d8508f2b72 | ||
|
|
5e13961ec8 | ||
|
|
80b1139371 | ||
|
|
635b41765c | ||
|
|
4b03686aa2 | ||
|
|
bfb0d8d639 | ||
|
|
93d4a0211d | ||
|
|
cd31bc69ef | ||
|
|
4a7b84d6de | ||
|
|
3142714c11 | ||
|
|
7ea10416a9 | ||
|
|
3e427db0f1 | ||
|
|
9f7b18d294 | ||
|
|
9af0e351b8 | ||
|
|
5c6aa2340d | ||
|
|
4424ec48cf | ||
|
|
61be34581e | ||
|
|
731978356d | ||
|
|
d5223ad1ab | ||
|
|
7cfdfab198 | ||
|
|
eb70e51ac1 | ||
|
|
1d48e7c7ae | ||
|
|
d6fc9fc8c3 | ||
|
|
8ada0976fe | ||
|
|
389ff5e9a4 | ||
|
|
5179e0228c | ||
|
|
2268526314 | ||
|
|
db4bc0eafe | ||
|
|
6edaf79df1 | ||
|
|
79cead3b59 | ||
|
|
db1b12b85c | ||
|
|
9360b7675a | ||
|
|
9c82fd17fe | ||
|
|
3a4665e473 | ||
|
|
b34f4648ee | ||
|
|
0de786d2ea | ||
|
|
ec7aafa1ff | ||
|
|
30c219716d | ||
|
|
5dd47cb89b | ||
|
|
abe856bd3f | ||
|
|
6ecb009466 | ||
|
|
3b4b2383a8 | ||
|
|
4ddd46c4a2 | ||
|
|
69ec2469b4 | ||
|
|
5789af801a | ||
|
|
7171b6302b | ||
|
|
51d4818b1e | ||
|
|
1c2875e7fc | ||
|
|
5048a88310 | ||
|
|
aef37f4362 | ||
|
|
d04641041b | ||
|
|
67b2ccea86 |
@@ -45,3 +45,4 @@ test.php
|
||||
|
||||
phpinfo.php
|
||||
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
|
||||
*.sqlite3
|
||||
|
||||
+2
-1
@@ -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
@@ -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",
|
||||
|
||||
@@ -61,6 +61,7 @@ a.just_link {
|
||||
}
|
||||
|
||||
button.with_skin {
|
||||
padding:0 4px;
|
||||
background-color: black; color: white;
|
||||
font-family: '맑은 고딕';
|
||||
font-size: 13px;
|
||||
|
||||
@@ -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
@@ -1,7 +1,7 @@
|
||||
@charset "utf-8";
|
||||
|
||||
#user_info_container{
|
||||
width:500px;
|
||||
width:550px;
|
||||
position:absolute;
|
||||
left:50%;
|
||||
margin-left:-250px;
|
||||
|
||||
+67
-21
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
);
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -225,7 +225,7 @@ if ($budgetricediff > 0) {
|
||||
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 & 임관 권유 메시지</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>예 산 & 정 책</td></tr>
|
||||
<tr>
|
||||
|
||||
+6
-2
@@ -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
@@ -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 "
|
||||
$k : $turn[$i] <br>";
|
||||
$turntext[] = " $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>
|
||||
|
||||
@@ -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
@@ -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 .= " $m : 집합<br>";
|
||||
} else {
|
||||
$turn .= " $m : ∼<br>";
|
||||
|
||||
+19
-2
@@ -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']}'";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
@@ -94,6 +108,19 @@
|
||||
background:transparent;
|
||||
}
|
||||
|
||||
.world_map .city_detail_name{
|
||||
background-color:rgba(0,0,0,0.5);
|
||||
font-size:10px;
|
||||
position:absolute;
|
||||
white-space:nowrap;
|
||||
left:70%;
|
||||
bottom:-10px;
|
||||
color:white;
|
||||
}
|
||||
|
||||
.world_map.hide_cityname .city_detail_name{
|
||||
display:none;
|
||||
}
|
||||
|
||||
.city_base{
|
||||
position:absolute;
|
||||
@@ -338,6 +365,8 @@
|
||||
|
||||
/* Basic */
|
||||
|
||||
|
||||
|
||||
.world_map.map_basic .city_filler{
|
||||
position:absolute;
|
||||
width:100%;
|
||||
|
||||
+20
-16
@@ -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("====== 인 사 ======");
|
||||
@@ -2304,55 +2305,55 @@ function checkAbilityEx(int $generalID, ActionLogger $actLog){
|
||||
}
|
||||
|
||||
if($general['leader2'] < 0){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'leader2'=>$db->sqleval('leader2 + %i', GameConst::$upgradeLimit),
|
||||
'leader'=>$db->sqleval('leader - 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>통솔</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['power2'] < 0){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'power2'=>$db->sqleval('power2 + %i', GameConst::$upgradeLimit),
|
||||
'power'=>$db->sqleval('power - 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>무력</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['intel2'] < 0){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'intel2'=>$db->sqleval('intel2 + %i', GameConst::$upgradeLimit),
|
||||
'intel'=>$db->sqleval('intel - 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>지력</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['leader2'] >= GameConst::$upgradeLimit){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'leader2'=>$db->sqleval('leader2 - %i', GameConst::$upgradeLimit),
|
||||
'leader'=>$db->sqleval('leader + 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>통솔</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['power2'] >= GameConst::$upgradeLimit){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'power2'=>$db->sqleval('power2 - %i', GameConst::$upgradeLimit),
|
||||
'power'=>$db->sqleval('power + 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>무력</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['intel2'] >= GameConst::$upgradeLimit){
|
||||
$general->updqte('general',[
|
||||
$db->update('general',[
|
||||
'intel2'=>$db->sqleval('intel2 - %i', GameConst::$upgradeLimit),
|
||||
'intel'=>$db->sqleval('intel + 1')
|
||||
]);
|
||||
], 'no=%i', $generalID);
|
||||
$actLog->pushGeneralActionLog('<R>지력</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
|
||||
return;
|
||||
}
|
||||
@@ -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 = [];
|
||||
|
||||
+31
-21
@@ -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) {
|
||||
@@ -615,7 +625,7 @@ function getDexLog($dex1, $dex2) {
|
||||
}
|
||||
|
||||
|
||||
function getWeapName($weap) : string {
|
||||
function getWeapName($weap) : ?string {
|
||||
switch($weap) {
|
||||
case 0: $weapname = '-'; break;
|
||||
case 1: $weapname = '단도(+1)'; break;
|
||||
@@ -649,7 +659,7 @@ function getWeapName($weap) : string {
|
||||
return $weapname;
|
||||
}
|
||||
|
||||
function getWeapEff($weap) : int{
|
||||
function getWeapEff($weap) : ?int{
|
||||
switch($weap) {
|
||||
case 7: $weap = 7; break;
|
||||
case 8: $weap = 7; break;
|
||||
@@ -676,7 +686,7 @@ function getWeapEff($weap) : int{
|
||||
return $weap;
|
||||
}
|
||||
|
||||
function getBookName($book) : string {
|
||||
function getBookName($book) : ?string {
|
||||
switch($book) {
|
||||
case 0: $bookname = '-'; break;
|
||||
case 1: $bookname = '효경전(+1)'; break;
|
||||
@@ -710,7 +720,7 @@ function getBookName($book) : string {
|
||||
return $bookname;
|
||||
}
|
||||
|
||||
function getBookEff($book) : int {
|
||||
function getBookEff($book) : ?int {
|
||||
switch($book) {
|
||||
case 7: $book = 7; break;
|
||||
case 8: $book = 7; break;
|
||||
@@ -737,7 +747,7 @@ function getBookEff($book) : int {
|
||||
return $book;
|
||||
}
|
||||
|
||||
function getHorseName($horse) : string {
|
||||
function getHorseName($horse) : ?string {
|
||||
switch($horse) {
|
||||
case 0: $horsename = '-'; break;
|
||||
case 1: $horsename = '노기(+1)'; break;
|
||||
@@ -771,7 +781,7 @@ function getHorseName($horse) : string {
|
||||
return $horsename;
|
||||
}
|
||||
|
||||
function getHorseEff($horse) : int {
|
||||
function getHorseEff($horse) : ?int {
|
||||
switch($horse) {
|
||||
case 7: $horse = 7; break;
|
||||
case 8: $horse = 7; break;
|
||||
|
||||
@@ -116,7 +116,7 @@ function getSpecial2($leader, $power, $intel, $nodex=1, $dex0=0, $dex10=0, $dex2
|
||||
|
||||
function getGenDex($general, $type) {
|
||||
//XXX: 지금은 동작하지만.. 병종 구성이 보궁기귀차 에서 바뀌면...
|
||||
$ntype = GameUnitCons::byId($type)->armType * 10;
|
||||
$ntype = GameUnitConst::byId($type)->armType * 10;
|
||||
return $general["dex{$ntype}"]??0;
|
||||
}
|
||||
|
||||
|
||||
+39
-35
@@ -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) {
|
||||
//평시이거나 선포있어도 초반이면
|
||||
|
||||
+15
-11
@@ -872,7 +872,7 @@ function process_11(&$general, $type) {
|
||||
$defaulttrain = GameConst::$defaultTrainHigh;
|
||||
}
|
||||
|
||||
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear, year, month']);
|
||||
[$startyear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
|
||||
|
||||
$actLog = new ActionLogger($general['no'], $general['nation'], $year, $month);
|
||||
|
||||
@@ -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']));
|
||||
|
||||
@@ -942,19 +944,21 @@ function process_11(&$general, $type) {
|
||||
|
||||
if($general['gold'] < $cost){
|
||||
$actLog->pushGeneralActionLog("자금이 모자랍니다. $dtype 실패. <1>$date</>");
|
||||
return;
|
||||
}
|
||||
|
||||
if($general['rice'] < $crew) {
|
||||
if($general['rice'] < $crew / 100) {
|
||||
$actLog->pushGeneralActionLog("군량이 모자랍니다. $dtype 실패. <1>$date</>");
|
||||
return;
|
||||
}
|
||||
|
||||
$ownCities = [];
|
||||
$ownRegions = [];
|
||||
foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i', $me['nation']) as $ownCity){
|
||||
foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i', $general['nation']) as $ownCity){
|
||||
$ownCities[$ownCity] = 1;
|
||||
$ownRegions[CityConst::byId($ownCity)->region] = 1;
|
||||
}
|
||||
$valid = $crewTypeObj->isValid($ownCities, $ownRegions, $admin['year'] - $admin['startyear'], $tech);
|
||||
$valid = $crewTypeObj->isValid($ownCities, $ownRegions, $year - $startyear, $tech);
|
||||
|
||||
if(!$valid) {
|
||||
$actLog->pushGeneralActionLog("현재 $dtype 할 수 없는 병종입니다. $dtype 실패. <1>$date</>");
|
||||
@@ -974,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']);
|
||||
@@ -986,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']++;
|
||||
@@ -1786,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
@@ -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, 드래그로 복수선택 가능 반복&수정<b>→</b></font>
|
||||
<td style='width:650px;' align=right>
|
||||
<font color=cyan><b>←</b> Ctrl, Shift, 드래그로 복수선택 가능 반복&수정<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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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>');
|
||||
});
|
||||
|
||||
|
||||
|
||||
+86
-1
@@ -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;
|
||||
}
|
||||
|
||||
@@ -276,6 +290,9 @@ function reloadWorldMap(option){
|
||||
}
|
||||
$imgObj.append($flagObj);
|
||||
}
|
||||
|
||||
var $nameObj = $('<span class="city_detail_name">{0}</span>'.format(city.name));
|
||||
$imgObj.append($nameObj);
|
||||
|
||||
|
||||
$map_body.append($cityObj);
|
||||
@@ -336,6 +353,8 @@ function reloadWorldMap(option){
|
||||
$imgObj.append($capitalObj);
|
||||
}
|
||||
|
||||
var $nameObj = $('<span class="city_detail_name">{0}</span>'.format(city.name));
|
||||
$imgObj.append($nameObj);
|
||||
|
||||
$map_body.append($cityObj);
|
||||
});
|
||||
@@ -415,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');
|
||||
}
|
||||
@@ -446,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
@@ -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(){
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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%만 소모
|
||||
|
||||
+30
-16
@@ -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;
|
||||
@@ -205,12 +211,19 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
);
|
||||
|
||||
[$nationLevel, $tech] = $db->queryFirstList('SELECT level,tech FROM nation WHERE nation=%i', $me['nation']);
|
||||
if(!$nationLevel){
|
||||
$nationLevel = 0;
|
||||
}
|
||||
|
||||
$lbonus = setLeadershipBonus($general, $nationLevel);
|
||||
if(!$tech){
|
||||
$tech = 0;
|
||||
}
|
||||
|
||||
$lbonus = setLeadershipBonus($me, $nationLevel);
|
||||
|
||||
$ownCities = [];
|
||||
$ownRegions = [];
|
||||
[$year, $startYear] = $gameStor->getValuesAsArray(['year','startyear']);
|
||||
[$year, $startyear] = $gameStor->getValuesAsArray(['year','startyear']);
|
||||
|
||||
$relativeYear = $year - $startyear;
|
||||
|
||||
@@ -219,9 +232,9 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
$ownRegions[$city['region']] = 1;
|
||||
}
|
||||
|
||||
$leader = getGeneralLeadership($general, true, true, true);
|
||||
$maxCrew = $leader - Util::round($me['crew']/100);
|
||||
$abil = getTechAbil($nation['tech']);
|
||||
$leader = getGeneralLeadership($me, true, true, true);
|
||||
$fullLeader = getGeneralLeadership($me, false, true, true);
|
||||
$abil = getTechAbil($tech);
|
||||
|
||||
$armTypes = [];
|
||||
|
||||
@@ -229,7 +242,7 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
$armTypeCrews = [];
|
||||
|
||||
foreach(GameUnitConst::byType($armType) as $unit){
|
||||
$crewObj = new stdClass;
|
||||
$crewObj = new \stdClass;
|
||||
if(!$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech)){
|
||||
continue; //TODO: 불가능한 병종도 보여줄 필요가 있음.
|
||||
}
|
||||
@@ -244,7 +257,7 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
}
|
||||
|
||||
$crewObj->baseRice = $unit->rice * getTechCost($tech);
|
||||
$crewObj->baseCost = CharCost($unit->getTechCost($tech), $me['personal']);
|
||||
$crewObj->baseCost = CharCost($unit->costWithTech($tech), $me['personal']);
|
||||
|
||||
$armType = $unit->armType;
|
||||
if($me['special2'] == 50 && $armType == GameUnitConst::T_FOOTMAN){
|
||||
@@ -275,7 +288,7 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
$crewObj->img = ServConfig::$sharedIconPath."/default.jpg";
|
||||
}
|
||||
else{
|
||||
$crewObj->img = ServConfig::$gameImagePath."/weap{$unit->id}.png";
|
||||
$crewObj->img = ServConfig::$gameImagePath."/weap".$unit->id.".png";
|
||||
}
|
||||
|
||||
$crewObj->baseRiceShort = round($crewObj->baseRice, 1);
|
||||
@@ -304,10 +317,11 @@ function command_11($turn, $command, bool $is모병 = false) {
|
||||
'techLevelText'=>getTechCall($tech),
|
||||
'tech'=>$tech,
|
||||
'leader'=>$leader,
|
||||
'crewTypeName'=>GameUnitConst::byId($general['crewtype'])->name,
|
||||
'crew'=>$general['crew'],
|
||||
'maxCrew'=>$maxCrew,
|
||||
'gold'=>$general['gold'],
|
||||
'fullLeader'=>$fullLeader,
|
||||
'crewType'=>GameUnitConst::byId($me['crewtype'])->id,
|
||||
'crewTypeName'=>GameUnitConst::byId($me['crewtype'])->name,
|
||||
'crew'=>$me['crew'],
|
||||
'gold'=>$me['gold'],
|
||||
'turn'=>$turn,
|
||||
'armTypes'=>$armTypes,
|
||||
]);
|
||||
@@ -694,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>
|
||||
|
||||
@@ -109,7 +109,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->generalHistoryLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->generalActionLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->generalBattleResultLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->generalBattleDetailLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->nationalHistoryLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->globalActionLog[] = $text;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ class ActionLogger{
|
||||
return;
|
||||
}
|
||||
|
||||
$text = $this->formatText($formatType);
|
||||
$text = $this->formatText($text, $formatType);
|
||||
$this->globalHistoryLog[] = $text;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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],
|
||||
['엄청난 위력으로 성벽을 부수어버립니다.']
|
||||
@@ -451,6 +451,7 @@ class GameUnitConstBase{
|
||||
static::$constName = $constName;
|
||||
static::$constCity = $constCity;
|
||||
static::$constRegion = $constRegion;
|
||||
static::$constType = $constType;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -39,6 +39,7 @@ class GameUnitDetail{
|
||||
array $defenceCoef,
|
||||
array $info
|
||||
){
|
||||
$this->id = $id;
|
||||
$this->name = $name;
|
||||
$this->armType = $armType;
|
||||
$this->attack = $attack;
|
||||
@@ -151,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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,5 +1,5 @@
|
||||
{
|
||||
"title":"【공백지】 공백지",
|
||||
"title":"【공백지】 일반",
|
||||
"startYear":180,
|
||||
"history":[
|
||||
]
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"title":"【공백지】 소형",
|
||||
"startYear":180,
|
||||
"map":{
|
||||
"mapName":"miniche"
|
||||
},
|
||||
"history":[
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"title":"【가상모드1b】 영웅 난무 220",
|
||||
"title":"【가상모드1b】 영웅 난무 (220)",
|
||||
"life":1,
|
||||
"fiction":1,
|
||||
"nation":[
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"title":"【가상모드1c】 영웅 난무 220, Mini",
|
||||
"title":"【가상모드1c】 영웅 난무 (220, 소형)",
|
||||
"life":1,
|
||||
"fiction":1,
|
||||
"nation":[
|
||||
|
||||
@@ -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":[
|
||||
|
||||
]
|
||||
}
|
||||
@@ -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
@@ -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`)
|
||||
)
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,25 +1,3 @@
|
||||
<script>
|
||||
var currentTech = <?=$tech?>;
|
||||
var leadership = <?=$leadership?>;
|
||||
var currentCrewType = <?=$crewType?>;
|
||||
var currentCrew = <?=$crew?>
|
||||
var currentGold = <?=$gold?>;
|
||||
var is모병 = <?=($commandName=='모병')?'true':'false'?>;
|
||||
|
||||
function calc(id) {
|
||||
var $obj = $('#crewType{0}'.format(id));
|
||||
var crew = $obj.find('.form_double').val();
|
||||
var baseCost = $obj.data('cost');
|
||||
var $cost = $obj.find('.form_cost');
|
||||
|
||||
var cost = crew * baseCost.val();
|
||||
if(is모병){
|
||||
cost *= 2;
|
||||
}
|
||||
$cost.val(Math.round(cost));
|
||||
}
|
||||
</script>
|
||||
|
||||
<font size=2>병사를 모집합니다.
|
||||
<?php if($commandName=='징병'): ?>
|
||||
훈련과 사기치는 낮지만 가격이 저렴합니다.<br>
|
||||
@@ -34,12 +12,12 @@ function calc(id) {
|
||||
<table class='tb_layout' style='margin:auto;'>
|
||||
<thead>
|
||||
<?php if($commandName=='모병'): ?>
|
||||
<tr><td align=center colspan=10>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
|
||||
<tr><td align=center colspan=11>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
|
||||
<?php endif; ?>
|
||||
<tr>
|
||||
<td colspan=10 align=center class='bg2'>
|
||||
<td colspan=11 align=center class='bg2'>
|
||||
현재 기술력 : <?=$techLevelText?>
|
||||
현재 통솔 : <?=$leader?>
|
||||
현재 통솔 : <?=$leader?><?=($leader!=$fullLeader)?"({$fullLeader})":''?>
|
||||
현재 병종 : <?=$crewTypeName?>
|
||||
현재 병사 : <?=$crew?>
|
||||
현재 자금 : <?=$gold?>
|
||||
@@ -52,14 +30,16 @@ function calc(id) {
|
||||
<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=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?>"
|
||||
@@ -67,30 +47,135 @@ function calc(id) {
|
||||
data-rice="<?=$crewObj->baseRice?>"
|
||||
data-cost="<?=$crewObj->baseCost?>"
|
||||
>
|
||||
<td style='background-no-repeat center url("<?=$crewObj->img?>;backround-size:64px;background-color:#222222;'></td>
|
||||
<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>
|
||||
<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>원 <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>
|
||||
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>
|
||||
</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?>;
|
||||
var is모병 = <?=($commandName=='모병')?'true':'false'?>;
|
||||
|
||||
window.calc = function(id) {
|
||||
var $obj = $('#crewType{0}'.format(id));
|
||||
var crew = $obj.find('.form_double').val();
|
||||
var baseCost = $obj.data('cost');
|
||||
var $cost = $obj.find('.form_cost');
|
||||
|
||||
var cost = crew * baseCost;
|
||||
if(is모병){
|
||||
cost *= 2;
|
||||
}
|
||||
$cost.val(Math.round(cost));
|
||||
}
|
||||
|
||||
$(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());
|
||||
|
||||
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>
|
||||
@@ -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;">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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="카카오톡으로 가입&로그인"></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="카카오톡으로 가입&로그인"></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> & <a href="terms.1.html">이용약관</a><br>© 2018 • HideD
|
||||
<br>크롬과 파이어폭스에 최적화되어있습니다.</div></div>
|
||||
|
||||
@@ -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
@@ -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(){
|
||||
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
Vendored
+21
@@ -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.
|
||||
Vendored
+100
@@ -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)
|
||||
Vendored
+33
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+1553
@@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
Vendored
+1
@@ -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'),
|
||||
|
||||
Vendored
+5
@@ -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',
|
||||
|
||||
Vendored
+73
-12
@@ -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
@@ -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
@@ -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
@@ -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__);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user