Compare commits

...
44 Commits
Author SHA1 Message Date
sars 4f087754e2 참가중일때만 토너먼트 액티브 설정 2022-03-16 20:24:12 -07:00
sars 520dbb23f2 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2022-03-16 12:12:46 -07:00
sars e8f2538510 토너먼트와 베팅장 하이라이트하기. (모바일에서 dropdown-item에서는 아직 적용 못함) 2022-03-16 12:09:29 -07:00
Hide_D fa6b271994 refac: schema.sql COLLATE, json_valid 지정 2022-03-16 23:44:12 +09:00
Hide_D c4aa6b4ffc game: 조기 은퇴 커맨드 추가 2022-03-16 01:30:47 +09:00
Hide_D 4bb1bac5d1 game: 유저장 자동 금쌀매매 기준 추가 변경 2022-03-16 00:38:18 +09:00
Hide_D 79815f99fc game: 유저장 자동 금쌀매매 기준 변경
- 3번 전멸하는 동안 필요한 금쌀을 모두 가지고 있을 경우 군량매매하지 않음
2022-03-16 00:02:38 +09:00
Hide_D 1342fb5cc1 game: 천통국 결정 시 자동으로 임관 금지 설정 2022-03-15 23:43:43 +09:00
Hide_D eae488b44f feat: BlockScoutAction Action 추가
- 모든 국가의 임관 설정을 임의 설정하는 이벤트 액션
2022-03-15 23:20:28 +09:00
sars 72200683fe serverNameWithCount를 serverName과 serverCnt로 나눔 2022-03-14 19:39:35 -07:00
sars c506d608c2 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2022-03-14 14:07:01 -07:00
sars 69348680d5 서버 이름과 횟수를 printStaticValue에 추가 2022-03-14 14:06:08 -07:00
Hide_D f6b359955d game,fix: 백이병 vs 정란, 벽력거 공격 상성 관련 문제 수정 2022-03-14 22:27:13 +09:00
Hide_D 0d4a68daea misc: gitignore update 2022-03-14 22:13:06 +09:00
sars dfff94f319 동결상태를 isLocked로 printStaticValue에 추가 2022-03-14 03:42:04 -07:00
sars 8cff55b5ed lastExecuted를 printStaticValues에 추가 2022-03-14 03:07:16 -07:00
Hide_D d61143c2ad misc: README 변경 2022-03-13 21:40:53 +09:00
Hide_D 1afe999beb Merge pull request 'feat: php vendor를 동적으로 구성하도록 변경' (#209) from no_php_vendor_code into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/209
2022-03-13 21:15:42 +09:00
Hide_D 0dd3def0d5 fix: composer 준비 전에도 j_install_status가 응답해야함 2022-03-13 21:03:39 +09:00
Hide_D 0a1d81be76 fix: Web UI로 초기 install이 불가능한 버그 수정 2022-03-13 20:16:54 +09:00
Hide_D 91ea0d1c2a build: 빌드 환경 재 설정
- lock에 따라 npm ci로 변경
- webpack build를 서버 내에서 하므로 dev dependency가 거의 없음
- webpack build에서 gateway build를 별도로 작성
2022-03-13 19:47:24 +09:00
Hide_D 5fe9136aa1 fix: 초기 index.php에서 vendor/autoload.php 검사 2022-03-13 19:06:31 +09:00
Hide_D 3ef91d3617 feat: install에서 composer update도 수행. update 기준 변경
- lock file을 git에 추가하였으므로, 이에 따름
2022-03-13 18:56:29 +09:00
Hide_D 0aa73c2f62 dep: vendor directory 제거 2022-03-13 18:33:09 +09:00
Hide_D d8ad26f83c dep: composer update 2022-03-13 16:55:04 +09:00
Hide_D 85a9f127bd fix: oauth_kakao에서 누락된 userID 반영 2022-03-13 13:46:13 +09:00
Hide_D edd5248d50 fix: COMPRESSED 타입 table 제거 2022-03-13 13:42:40 +09:00
Hide_D 892d13212d dep: npm package update. package-lock.json 해제 2022-03-13 01:59:55 +09:00
Hide_D 0ab485f122 feat: 해시 기반 간이 DRBG, 그에 기반한 RandUtil (#208)
기존의 Util 내의 함수는 mt_rand에 기반하고 있어서 일반적으론 충분하지만,
게임 내부에서 랜덤 값을 정교하게 제어하고 싶은 경우에는 적절하지 않았음.

따라서 직접 seed를 제어할 수 있는 난수생성기를 추가.
SHA512(seed || blockIdx) 의 형태로 동작하는 DRBG이며, FIPS 표준을 따르는 RNG는 아니지만 암호학적으로 안전한 형태로 구현함.

PHP, TS 두가지 형태로 구현.

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/208
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2022-03-12 23:53:16 +09:00
Hide_D c220b3d511 game: 정란 상성 공격력 상향, 차병 비용 절감 2022-03-12 20:11:36 +09:00
Hide_D 57bb22497e game: 이세계무쌍- 유저무쌍 멀티 유니버스 수정 2022-03-10 23:12:47 +09:00
Hide_D 1ae95ba4bc feat: NPC 추방,몰수, 고유메시지 빈도를 GameConst에서 조절 2022-03-10 23:11:56 +09:00
Hide_D 90b3684cdb game: 이세계무쌍 비급 시나리오 추가 2022-03-08 22:07:19 +09:00
Hide_D 15d6c427eb game: 이세계무쌍 시나리오 등록 2022-03-08 21:58:23 +09:00
Hide_D c68a428bf5 feat: 유닛테스트 준비 2022-03-03 00:16:01 +09:00
Hide_D a289b192e4 dep: typescript test 기반 추가 2022-03-02 23:31:32 +09:00
Hide_D 356f3af919 dep: phpunit 추가 2022-03-02 23:29:09 +09:00
Hide_D a660ec4cca fix: 커맨드 실행 조건 강제 탈출 조건을 잘못 작성하는 버그 수정 2022-03-01 12:29:21 +09:00
sars 4c9ddcb272 $general->getVar('nation')로 수정 2022-02-25 20:19:56 -08:00
sars 5131a36e20 general -> $general, 오타수정 2022-02-25 20:16:48 -08:00
sars 87c055563d 급하게 도기 코드 수정, 냐섭에서 테스트할 예정 2022-02-25 20:09:03 -08:00
sars 124c27cf17 동결풀기위해 도기템을 임시로 일단 주석처리함 2022-02-25 19:41:10 -08:00
Hide_D 4f0dbf0f92 feat: api.php 호출에서 path를 경로로 지정하는 방식 추가 2022-02-25 01:54:22 +09:00
Hide_D 6e24ca230d fix: 연감 static var 출력 버그 수정 2022-02-25 01:24:02 +09:00
3942 changed files with 24733 additions and 563404 deletions
+4 -7
View File
@@ -5,8 +5,6 @@
!.vscode/extensions.json !.vscode/extensions.json
/node_modules /node_modules
package-lock.json
# 체섭 ignore # 체섭 ignore
*.log *.log
@@ -19,10 +17,7 @@ sess_*
*/logs/*/*.txt */logs/*/*.txt
*/logs/preserved */logs/preserved
err.txt err.txt
che/.htaccess
kwe/.htaccess
pwe/.htaccess
twe/.htaccess
hwe/.htaccess hwe/.htaccess
d_shared d_shared
@@ -59,8 +54,10 @@ test.*
/pya /pya
/twe /twe
/hwe/data
/vendor
phpinfo.php phpinfo.php
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
*.sqlite3 *.sqlite3
ingame/js/* ingame/js/*
+12
View File
@@ -0,0 +1,12 @@
{
"extension": ["ts"],
"spec": "hwe/test-ts/**/*.test.ts",
"require": [
"ts-node/register",
"tsconfig-paths/register"
],
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"
]
}
+1 -1
View File
@@ -28,5 +28,5 @@
"cSpell.words": [ "cSpell.words": [
"josa", "josa",
"sammo" "sammo"
], ]
} }
+4 -4
View File
@@ -26,20 +26,20 @@ Docker를 이용한 설치도 제공하고 있습니다.
## Docker를 이용한 설치 ## Docker를 이용한 설치
https://storage.hided.net/gogs/devsam/docker 를 참고해 주세요. https://storage.hided.net/gitea/devsam/docker 를 참고해 주세요.
## 수동 설치 ## 수동 설치
본 게임은 <code>git</code>을 이용한 업그레이드 시스템을 구현하였으므로, <code>git</code>이 필요합니다. 본 게임은 <code>git</code>을 이용한 업그레이드 시스템을 구현하였으므로, <code>git</code>이 필요합니다.
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>, <code>apache</code>)에게 디렉토리 권한이 주어져야합니다. 또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>)에게 디렉토리 권한이 주어져야합니다.
### 다운로드 ### 다운로드
웹 데몬 user가 <code>www-data</code>인 경우 다음과 같이 입력하여 최신 배포버전과 이미지 파일을 얻을 수 있습니다. 웹 데몬 user가 <code>www-data</code>인 경우 다음과 같이 입력하여 최신 배포버전과 이미지 파일을 얻을 수 있습니다.
``` ```
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/core.git sudo -u www-data git clone https://storage.hided.net/gitea/devsam/core.git
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/image.git sudo -u www-data git clone https://storage.hided.net/gitea/devsam/image.git
``` ```
> 이미지는 hook/git_hook.php을 통해 동기화되며, 서버 설치 과정에 이미지 갱신 키를 지정하는 것으로 '훼' 서버 업데이트 시 동기화됩니다. 이미지 서버가 게임 서버와 별개여도 동작하나, php와 git을 지원해야합니다. > 이미지는 hook/git_hook.php을 통해 동기화되며, 서버 설치 과정에 이미지 갱신 키를 지정하는 것으로 '훼' 서버 업데이트 시 동기화됩니다. 이미지 서버가 게임 서버와 별개여도 동작하나, php와 git을 지원해야합니다.
+1 -1
View File
@@ -9,4 +9,4 @@ if (!class_exists('\\sammo\\RootDB')) {
Json::dieWithReason('No DB'); Json::dieWithReason('No DB');
} }
APIHelper::launch(dirname(__FILE__)); APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
+5 -4
View File
@@ -35,21 +35,22 @@
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"sammo\\": [ "sammo\\": [
"d_setting",
"src/sammo" "src/sammo"
], ],
"kakao\\": [ "kakao\\": [
"d_setting",
"src/kakao" "src/kakao"
] ]
}, },
"classmap": [
"d_setting/"
],
"exclude-from-classmap": [ "exclude-from-classmap": [
"**/*.orig.php" "**/*.orig.php"
], ],
"files":[ "files":[
"f_config/config.php" "f_config/config.php"
] ]
},
"require-dev": {
"phpunit/phpunit": "^9.5"
} }
} }
Generated
+1799 -2
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "1983b89436fd8017db508592ddf542e4", "content-hash": "2b7ec5f1a1a908310f3d032f294eacec",
"packages": [ "packages": [
{ {
"name": "brandonwamboldt/utilphp", "name": "brandonwamboldt/utilphp",
@@ -4228,7 +4228,1804 @@
"time": "2019-08-07T17:19:21+00:00" "time": "2019-08-07T17:19:21+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [
{
"name": "doctrine/instantiator",
"version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^8.0",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com",
"homepage": "https://ocramius.github.io/"
}
],
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
"constructor",
"instantiate"
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
"type": "tidelift"
}
],
"time": "2020-11-10T18:47:58+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.10.2",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"replace": {
"myclabs/deep-copy": "self.version"
},
"require-dev": {
"doctrine/collections": "^1.0",
"doctrine/common": "^2.6",
"phpunit/phpunit": "^7.1"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2020-11-13T09:40:50+00:00"
},
{
"name": "nikic/php-parser",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-30T19:35:32+00:00"
},
{
"name": "phar-io/manifest",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
},
"time": "2021-07-20T11:28:43+00:00"
},
{
"name": "phar-io/version",
"version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/phar-io/version.git",
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Library for handling version information and constraints",
"support": {
"issues": "https://github.com/phar-io/version/issues",
"source": "https://github.com/phar-io/version/tree/3.2.1"
},
"time": "2022-02-21T01:04:05+00:00"
},
{
"name": "phpspec/prophecy",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.2",
"php": "^7.2 || ~8.0, <8.2",
"phpdocumentor/reflection-docblock": "^5.2",
"sebastian/comparator": "^3.0 || ^4.0",
"sebastian/recursion-context": "^3.0 || ^4.0"
},
"require-dev": {
"phpspec/phpspec": "^6.0 || ^7.0",
"phpunit/phpunit": "^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com",
"homepage": "http://everzet.com"
},
{
"name": "Marcello Duarte",
"email": "marcello.duarte@gmail.com"
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"fake",
"mock",
"spy",
"stub"
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
},
"time": "2021-12-08T12:19:24+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.14",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.13.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
"sebastian/code-unit-reverse-lookup": "^2.0.2",
"sebastian/complexity": "^2.0",
"sebastian/environment": "^5.1.2",
"sebastian/lines-of-code": "^1.0.3",
"sebastian/version": "^3.0.1",
"theseer/tokenizer": "^1.2.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcov": "*",
"ext-xdebug": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.2-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
"coverage",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.14"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-28T12:38:02+00:00"
},
{
"name": "phpunit/php-file-iterator",
"version": "3.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
"keywords": [
"filesystem",
"iterator"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-12-02T12:48:52+00:00"
},
{
"name": "phpunit/php-invoker",
"version": "3.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"ext-pcntl": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcntl": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Invoke callables with a timeout",
"homepage": "https://github.com/sebastianbergmann/php-invoker/",
"keywords": [
"process"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:58:55+00:00"
},
{
"name": "phpunit/php-text-template",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
"template"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T05:33:50+00:00"
},
{
"name": "phpunit/php-timer",
"version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Utility class for timing",
"homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
"timer"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
"source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:16:10+00:00"
},
{
"name": "phpunit/phpunit",
"version": "9.5.16",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.3.1",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.10.1",
"phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2",
"php": ">=7.3",
"phpspec/prophecy": "^1.12.1",
"phpunit/php-code-coverage": "^9.2.13",
"phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.3",
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^2.3.4",
"sebastian/version": "^3.0.2"
},
"require-dev": {
"ext-pdo": "*",
"phpspec/prophecy-phpunit": "^2.0.1"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"bin": [
"phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.5-dev"
}
},
"autoload": {
"files": [
"src/Framework/Assert/Functions.php"
],
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
"homepage": "https://phpunit.de/",
"keywords": [
"phpunit",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16"
},
"funding": [
{
"url": "https://phpunit.de/sponsors.html",
"type": "custom"
},
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-23T17:10:58+00:00"
},
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for parsing CLI options",
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:08:49+00:00"
},
{
"name": "sebastian/code-unit",
"version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the PHP code units",
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
"source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:08:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:30:19+00:00"
},
{
"name": "sebastian/comparator",
"version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/diff": "^4.0",
"sebastian/exporter": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
}
],
"description": "Provides the functionality to compare PHP values for equality",
"homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:49:45+00:00"
},
{
"name": "sebastian/complexity",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.7",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for calculating the complexity of PHP code units",
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:52:27+00:00"
},
{
"name": "sebastian/diff",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Kore Nordmann",
"email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
"diff",
"udiff",
"unidiff",
"unified diff"
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:10:38+00:00"
},
{
"name": "sebastian/environment",
"version": "5.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
"homepage": "http://www.github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
"hhvm"
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:52:38+00:00"
},
{
"name": "sebastian/exporter",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-mbstring": "*",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
"homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-11-11T14:18:36+00:00"
},
{
"name": "sebastian/global-state",
"version": "5.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-dom": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-uopz": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Snapshotting of global state",
"homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-14T08:28:10+00:00"
},
{
"name": "sebastian/lines-of-code",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.6",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for counting the lines of code in PHP source code",
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-11-28T06:42:11+00:00"
},
{
"name": "sebastian/object-enumerator",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:12:34+00:00"
},
{
"name": "sebastian/object-reflector",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:14:26+00:00"
},
{
"name": "sebastian/recursion-context",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
}
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:17:30+00:00"
},
{
"name": "sebastian/resource-operations",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
"issues": "https://github.com/sebastianbergmann/resource-operations/issues",
"source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:45:17+00:00"
},
{
"name": "sebastian/type",
"version": "2.3.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.3-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the types of the PHP type system",
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-06-15T12:49:02+00:00"
},
{
"name": "sebastian/version",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
"reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
"reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
"source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:39:44+00:00"
},
{
"name": "theseer/tokenizer",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
}
],
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.1"
},
"funding": [
{
"url": "https://github.com/theseer",
"type": "github"
}
],
"time": "2021-07-28T10:34:58+00:00"
}
],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [], "stability-flags": [],
Executable → Regular
BIN
View File
Binary file not shown.
+5
View File
@@ -2,6 +2,11 @@
namespace sammo; namespace sammo;
if(!file_exists(__DIR__ . '/../vendor/autoload.php')){
http_response_code(503);
die('not_ready');
}
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/autoload.php');
if (!class_exists('\\sammo\\RootDB')) { if (!class_exists('\\sammo\\RootDB')) {
+16 -11
View File
@@ -31,8 +31,8 @@ CREATE TABLE `member` (
`NAME` VARCHAR(64) NOT NULL, `NAME` VARCHAR(64) NOT NULL,
`PICTURE` VARCHAR(64) NULL DEFAULT 'default.jpg', `PICTURE` VARCHAR(64) NULL DEFAULT 'default.jpg',
`IMGSVR` INT(1) NULL DEFAULT '0', `IMGSVR` INT(1) NULL DEFAULT '0',
`acl` TEXT NOT NULL DEFAULT '{}' COMMENT 'json', `acl` TEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`penalty` TEXT NOT NULL DEFAULT '{}' COMMENT 'json', `penalty` TEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`GRADE` INT(1) NULL DEFAULT '1', `GRADE` INT(1) NULL DEFAULT '1',
`REG_NUM` INT(3) NULL DEFAULT '0', `REG_NUM` INT(3) NULL DEFAULT '0',
`REG_DATE` DATETIME NOT NULL, `REG_DATE` DATETIME NOT NULL,
@@ -43,9 +43,12 @@ CREATE TABLE `member` (
UNIQUE INDEX `ID` (`ID`), UNIQUE INDEX `ID` (`ID`),
UNIQUE INDEX `EMAIL` (`EMAIL`), UNIQUE INDEX `EMAIL` (`EMAIL`),
UNIQUE INDEX `kauth_id` (`oauth_id`), UNIQUE INDEX `kauth_id` (`oauth_id`),
INDEX `delete_after` (`delete_after`) INDEX `delete_after` (`delete_after`),
CONSTRAINT `json1` CHECK (json_valid(`acl`)),
CONSTRAINT `json2` CHECK (json_valid(`penalty`))
) )
ENGINE=Aria DEFAULT CHARSET=utf8mb4; COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
-- 로그인 로그 테이블 -- 로그인 로그 테이블
CREATE TABLE `member_log` ( CREATE TABLE `member_log` (
@@ -53,12 +56,14 @@ CREATE TABLE `member_log` (
`member_no` INT(11) NOT NULL, `member_no` INT(11) NOT NULL,
`date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`action_type` ENUM('reg','try_login','login','logout','oauth','change_pw','make_general','access_server','delete') NOT NULL, `action_type` ENUM('reg','try_login','login','logout','oauth','change_pw','make_general','access_server','delete') NOT NULL,
`action` TEXT NULL DEFAULT NULL COMMENT 'JSON', `action` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `action` (`member_no`, `action_type`, `date`), INDEX `action` (`member_no`, `action_type`, `date`),
INDEX `member` (`member_no`, `date`) INDEX `member` (`member_no`, `date`),
CONSTRAINT `json` CHECK (json_valid(`action`))
) )
ENGINE=Aria DEFAULT CHARSET=utf8mb4; COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
################### ###################
# KV storage # KV storage
@@ -69,9 +74,10 @@ CREATE TABLE if not exists `storage` (
`key` VARCHAR(40) NOT NULL, `key` VARCHAR(40) NOT NULL,
`value` TEXT NOT NULL, `value` TEXT NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `key` (`namespace`, `key`) UNIQUE INDEX `key` (`namespace`, `key`),
CONSTRAINT `json` CHECK (json_valid(`value`))
) )
COLLATE='utf8mb4_general_ci' COLLATE='utf8mb4_bin'
ENGINE=Aria; ENGINE=Aria;
CREATE TABLE `login_token` ( CREATE TABLE `login_token` (
@@ -86,5 +92,4 @@ CREATE TABLE `login_token` (
INDEX `by_date` (`user_id`, `expire_date`) INDEX `by_date` (`user_id`, `expire_date`)
) )
COLLATE='utf8mb4_general_ci' COLLATE='utf8mb4_general_ci'
ENGINE=Aria ENGINE=Aria;
;
+1 -1
View File
@@ -118,7 +118,7 @@ $nations = $history['nations'];
var lastMonth = <?= $e_month ?>; var lastMonth = <?= $e_month ?>;
var selectYear = <?= $year ?>; var selectYear = <?= $year ?>;
var selectMonth = <?= $month ?>; var selectMonth = <?= $month ?>;
var nations = <?= $nations ? $history['nations'] : '{}' ?>; var nations = <?= $nations ? JSON::encode($history['nations']) : '{}' ?>;
</script> </script>
</head> </head>
+1 -1
View File
@@ -5,4 +5,4 @@ namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
APIHelper::launch(dirname(__FILE__)); APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
+16
View File
@@ -167,6 +167,20 @@ function commandButton(array $opts = [])
$templates = new \League\Plates\Engine(__DIR__ . '/templates'); $templates = new \League\Plates\Engine(__DIR__ . '/templates');
$showSecret = false; $showSecret = false;
$permission = checkSecretPermission($me); $permission = checkSecretPermission($me);
$btnClassForTournament = $opts['btnClass'];
if ($opts['isTournamentActive']) {
if ($btnClassForTournament != 'dropdown-item') {
$btnClassForTournament = 'toolbarButton2';
}
}
$btnClassForBetting = $opts['btnClass'];
if ($opts['isBettingActive']) {
if ($btnClassForTournament != 'dropdown-item') {
$btnClassForBetting = 'toolbarButton2';
}
}
if ($permission >= 1) { if ($permission >= 1) {
$showSecret = true; $showSecret = true;
} else if ($me['officer_level'] == 0) { } else if ($me['officer_level'] == 0) {
@@ -180,6 +194,8 @@ function commandButton(array $opts = [])
'nationLevel' => $nation['level'], 'nationLevel' => $nation['level'],
'showSecret' => $showSecret, 'showSecret' => $showSecret,
'permission' => $permission, 'permission' => $permission,
'btnClassForTournament' => $btnClassForTournament,
'btnClassForBetting' => $btnClassForBetting,
], $opts)); ], $opts));
} }
+18 -14
View File
@@ -47,7 +47,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
], 'owner=%i', $userID); ], 'owner=%i', $userID);
} }
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1'); $plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
$con = checkLimit($me['con']); $con = checkLimit($me['con']);
if ($con >= 2) { if ($con >= 2) {
@@ -88,6 +88,8 @@ $serverName = UniqueConst::$serverName;
$serverCnt = $gameStor->server_cnt; $serverCnt = $gameStor->server_cnt;
$auctionCount = $db->queryFirstField('SELECT count(`no`) FROM auction'); $auctionCount = $db->queryFirstField('SELECT count(`no`) FROM auction');
$isTournamentActive = $gameStor->tournament == 1;
$isBettingActive = $gameStor->tournament == 6;
$myNationStatic = getNationStaticInfo($generalObj->getNationID()); $myNationStatic = getNationStaticInfo($generalObj->getNationID());
$nationColorType = substr($myNationStatic['color'] ?? '#000000', 1); $nationColorType = substr($myNationStatic['color'] ?? '#000000', 1);
@@ -123,6 +125,8 @@ if (!$otherTextInfo) {
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" /> <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?> <?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printStaticValues([ <?= WebUtil::printStaticValues([
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(), 'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID, 'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn, 'maxTurn' => GameConst::$maxTurn,
@@ -130,6 +134,10 @@ if (!$otherTextInfo) {
'commandList' => getCommandTable($generalObj), 'commandList' => getCommandTable($generalObj),
'serverNow' => TimeUtil::now(false), 'serverNow' => TimeUtil::now(false),
'baseColor2' => GameConst::$basecolor2, 'baseColor2' => GameConst::$basecolor2,
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive
]) ?> ]) ?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
</head> </head>
@@ -165,19 +173,15 @@ if (!$otherTextInfo) {
<div class="s-border-t col py-2 col-4 col-md-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div> <div class="s-border-t col py-2 col-4 col-md-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div> <div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div> <div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
<div class="s-border-t py-2 col col-6 col-md-4"><?php if ($gameStor->tournament == 0) : ?> <div class="s-border-t py-2 col col-6 col-md-4">
<span style='color:magenta'>현재 토너먼트 경기 없음</span> <?php if ($isTournamentActive) : ?>
<?php else : ?> ↑<span style='color:cyan'><?=(['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
↑<span style='color:cyan'><?= <?php else : ?>
([ <span style='color:magenta'>현재 토너먼트 경기 없음</span>
'전력전', '통솔전', '일기토', '설전', <?php endif; ?>
])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
<?php endif; ?>
</div> </div>
<div class="s-border-t py-2 col col-6 col-md-2"> <div class="s-border-t py-2 col col-6 col-md-2">
<div style="display:inline-block;"><?= !$plock ? ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div> <div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
</div> </div>
<div class="s-border-t py-2 col col-6 col-md-2"> <div class="s-border-t py-2 col col-6 col-md-2">
<?php if ($auctionCount > 0) : ?> <?php if ($auctionCount > 0) : ?>
@@ -253,7 +257,7 @@ if (!$otherTextInfo) {
<div id="nation-position"><?php myNationInfo($generalObj); ?></div> <div id="nation-position"><?php myNationInfo($generalObj); ?></div>
<div id="general-position"><?php generalInfo($generalObj); ?></div> <div id="general-position"><?php generalInfo($generalObj); ?></div>
<div id="generalCommandButton" class="row gx-0"> <div id="generalCommandButton" class="row gx-0">
<div class="buttonPlate bg2"><?= commandButton(['btnClass' => 'btn btn-sammo-nation']) ?></div> <div class="buttonPlate bg2"><?= commandButton(['btnClass' => 'btn btn-sammo-nation', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?></div>
</div> </div>
</div> </div>
</div> </div>
@@ -353,7 +357,7 @@ if (!$otherTextInfo) {
국가 메뉴 국가 메뉴
</div> </div>
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems"> <ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
<?= commandButton(['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item']) ?> <?= commandButton(['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?>
</ul> </ul>
</li> </li>
<li class="nav-item dropup"> <li class="nav-item dropup">
+1 -1
View File
@@ -241,7 +241,7 @@ function do추방(General $general, int $myOfficerLevel):?string{
} }
$general->setVar('troop', 0); $general->setVar('troop', 0);
if($general->getNPCType() >= 2 && ($env['scenario'] < 100 || Util::randBool(0.01))) { if($general->getNPCType() >= 2 && Util::randBool(GameConst::$npcBanMessageProb)) {
$str = Util::choiceRandom([ $str = Util::choiceRandom([
'날 버리다니... 곧 전장에서 복수해주겠다...', '날 버리다니... 곧 전장에서 복수해주겠다...',
+5
View File
@@ -47,6 +47,11 @@ class SetBlockScout extends \sammo\BaseAPI
return "권한이 부족합니다."; return "권한이 부족합니다.";
} }
$gameStor = new KVStorage($db, 'game_env');
$blockChangeScout = $gameStor->getValue('block_change_scout')??false;
if ($blockChangeScout){
return "임관 설정을 바꿀 수 없도록 설정되어 있습니다.";
}
$nationID = $me['nation']; $nationID = $me['nation'];
+6 -2
View File
@@ -44,9 +44,13 @@ class che_보물_도기 extends \sammo\BaseItem
['쌀', 'rice'] ['쌀', 'rice']
]); ]);
$db->update('nation', [ $nationId = $general->getVar('nation');
if ($nationId != 0) {
$db->update('nation', [
$resKey => $db->sqleval('%b + %i', $resKey, $score) $resKey => $db->sqleval('%b + %i', $resKey, $score)
]); ], 'nation=%i', $nationId);
}
$score = Util::round($score); $score = Util::round($score);
$scoreText = number_format($score, 0); $scoreText = number_format($score, 0);
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace sammo\Command\General;
use \sammo\{
DB, Util, JosaUtil,
General,
ActionLogger,
GameConst, GameUnitConst,
LastTurn,
Command
};
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
use function sammo\tryRollbackInheritUniqueItem;
use function sammo\tryUniqueItemLottery;
class che_은퇴 extends Command\GeneralCommand{
static protected $actionName = '은퇴';
static protected $reqAge = 60;
protected function argTest():bool{
$this->arg = null;
return true;
}
protected function init(){
$general = $this->generalObj;
$this->setNation();
$reqAge = static::$reqAge;
$this->fullConditionConstraints=[
ConstraintHelper::ReqGeneralValue('age', '나이', '>=', $reqAge, "나이가 {$reqAge}세 이상이어야 합니다.")
];
}
public function getCommandDetailTitle(): string
{
$name = $this->getName();
$reqAge = static::$reqAge;
return "{$name}({$reqAge}세 이상, 2턴)";
}
public function getCost():array{
return [0, 0];
}
public function getPreReqTurn():int{
return 1;
}
public function getPostReqTurn():int{
return 0;
}
public function run():bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$date = $general->getTurnTime($general::TURNTIME_HM);
$logger = $general->getLogger();
$general->rebirth();
$logger->pushGeneralActionLog("은퇴하였습니다. <1>$date</>");
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
tryUniqueItemLottery($general);
$general->applyDB($db);
return true;
}
}
+1 -1
View File
@@ -168,7 +168,7 @@ class che_몰수 extends Command\NationCommand
); );
$amountText = number_format($amount, 0); $amountText = number_format($amount, 0);
if ($destGeneral->getNPCType() >= 2 && Util::randBool(0.01)) { if ($destGeneral->getNPCType() >= 2 && Util::randBool(GameConst::$npcSeizureMessageProb)) {
$npcTexts = [ $npcTexts = [
'몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...', '몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...',
'사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요...', '사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요...',
@@ -102,7 +102,7 @@ class che_물자원조 extends Command\NationCommand
$limit = $this->nation['level'] * GameConst::$coefAidAmount; $limit = $this->nation['level'] * GameConst::$coefAidAmount;
if ($goldAmount > $limit || $riceAmount > $limit) { if ($goldAmount > $limit || $riceAmount > $limit) {
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')]; $this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')];
return; return;
} }
+1 -1
View File
@@ -69,7 +69,7 @@ class che_천도 extends Command\NationCommand
[$reqGold, $reqRice] = $this->getCost(); [$reqGold, $reqRice] = $this->getCost();
if ($this->getDistance() === null) { if ($this->getDistance() === null) {
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')]; $this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')];
return; return;
} }
@@ -0,0 +1,25 @@
<?php
namespace sammo\Event\Action;
use sammo\Util;
use sammo\DB;
use sammo\KVStorage;
class BlockScoutAction extends \sammo\Event\Action{
public function __construct(private ?bool $blockChangeScout = null){
}
public function run(array $env){
$db = DB::db();
$db->update('nation', [
'scout'=>1
], true);
if($this->blockChangeScout !== null){
$gameStor = new KVStorage($db, 'game_env');
$gameStor->setValue('block_change_scout', $this->blockChangeScout);
}
return [__CLASS__, $db->affectedRows()];
}
}
+2
View File
@@ -252,6 +252,8 @@ class RaiseInvader extends \sammo\Event\Action
$logger->pushGlobalHistoryLog("<L><b>【이벤트】</b></>이민족의 기세는 그 누구도 막을 수 없을듯 합니다!"); $logger->pushGlobalHistoryLog("<L><b>【이벤트】</b></>이민족의 기세는 그 누구도 막을 수 없을듯 합니다!");
$logger->flush(); $logger->flush();
$gameStor->setValue('block_change_scout', false);
$db->update('plock', [ $db->update('plock', [
'plock' => 0 'plock' => 0
], true); ], true);
@@ -0,0 +1,26 @@
<?php
namespace sammo\Event\Action;
use sammo\Util;
use sammo\DB;
use sammo\KVStorage;
class UnblockScoutAction extends \sammo\Event\Action{
public function __construct(private ?bool $blockChangeScout = null){
}
public function run(array $env){
$db = DB::db();
$db->update('nation', [
'scout'=>0
]);
if($this->blockChangeScout !== null){
$gameStor = new KVStorage($db, 'game_env');
$gameStor->setValue('block_change_scout', $this->blockChangeScout);
}
return [__CLASS__, $db->affectedRows()];
}
}
+5
View File
@@ -327,6 +327,7 @@ class GameConstBase
'che_증여', 'che_증여',
'che_헌납', 'che_헌납',
'che_하야', 'che_하야',
'che_은퇴',
'che_거병', 'che_거병',
'che_건국', 'che_건국',
'che_선양', 'che_선양',
@@ -394,4 +395,8 @@ class GameConstBase
'임', '정', '제', '조', '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', '임', '정', '제', '조', '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해',
'혁', '현', '화', '환', '회', '횡', '후', '훈', '휴', '흠', '흥' '혁', '현', '화', '환', '회', '횡', '후', '훈', '휴', '흠', '흥'
]; ];
public static $npcBanMessageProb = 0.01;
public static $npcSeizureMessageProb = 0.01;
public static $npcMessageFreqByDay = 4;
} }
+7 -7
View File
@@ -311,16 +311,16 @@ class GameUnitConstBase{
[ [
1500, self::T_SIEGE, '정란', 1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 15, 5, 100, 100, 6, 0, 0, 14, 5,
0, null, null, 3, 0, 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.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['높은 구조물 위에서 공격합니다.'], ['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null ['che_성벽부상무효'], null
], ],
[ [
1501, self::T_SIEGE, '충차', 1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5, 150, 100, 6, 0, 0, 18, 5,
1000, null, null, 3, 1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
@@ -329,16 +329,16 @@ class GameUnitConstBase{
], ],
[ [
1502, self::T_SIEGE, '벽력거', 1502, self::T_SIEGE, '벽력거',
200, 100, 6, 10, 0, 25, 5, 200, 100, 6, 10, 0, 18, 5,
3000, ['업'], null, 0, 3000, ['업'], null, 0,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8], [self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833], [self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833, 1106=>0.909],
['상대에게 돌덩이를 날립니다.'], ['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], null ['che_성벽부상무효'], null
], ],
[ [
1503, self::T_SIEGE, '목우', 1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 30, 5, 50, 200, 5, 0, 0, 18, 5,
3000, ['성도'], null, 0, 3000, ['성도'], null, 0,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8], [self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
+6 -2
View File
@@ -2004,6 +2004,7 @@ class GeneralAI
//수도와 연결된 도시 탐색 //수도와 연결된 도시 탐색
while (!$queue->isEmpty()) { while (!$queue->isEmpty()) {
/** @var int */
$cityID = $queue->dequeue(); $cityID = $queue->dequeue();
foreach (array_keys(CityConst::byID($cityID)->path) as $nextCityID) { foreach (array_keys(CityConst::byID($cityID)->path) as $nextCityID) {
@@ -2377,6 +2378,9 @@ class GeneralAI
} }
$tryBuying = false; $tryBuying = false;
if ($general->getNPCType() < 2 && $relGold >= $goldCost * 3 && $relRice >= $riceCost * 3){
return null;
}
if ($this->generalPolicy->can상인무시) { if ($this->generalPolicy->can상인무시) {
if ($relRice * 1.5 < $relGold && $relRice < $riceCost * 2) { if ($relRice * 1.5 < $relGold && $relRice < $riceCost * 2) {
$tryBuying = true; $tryBuying = true;
@@ -3643,9 +3647,9 @@ class GeneralAI
$npcType = $general->getNPCType(); $npcType = $general->getNPCType();
$nationID = $general->getNationID(); $nationID = $general->getNationID();
//특별 메세지 있는 경우 출력 하루 4번 //특별 메세지 있는 경우 출력
$term = $this->env['turnterm']; $term = $this->env['turnterm'];
if ($general->getVar('npcmsg') && Util::randBool($term / (6 * 60))) { if ($general->getVar('npcmsg') && Util::randBool(GameConst::$npcMessageFreqByDay * $term / (60 * 24))) {
$src = new MessageTarget( $src = new MessageTarget(
$general->getID(), $general->getID(),
$general->getVar('name'), $general->getVar('name'),
+11 -1
View File
@@ -4,7 +4,8 @@
"history":[ "history":[
], ],
"const": { "const": {
"joinRuinedNPCProp":0 "joinRuinedNPCProp":0,
"npcBanMessageProb":1
}, },
"events":[ "events":[
[ [
@@ -34,6 +35,15 @@
], ],
["OpenNationBetting", 1, 1000], ["OpenNationBetting", 1, 1000],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+11 -1
View File
@@ -7,7 +7,8 @@
"history":[ "history":[
], ],
"const": { "const": {
"joinRuinedNPCProp":0 "joinRuinedNPCProp":0,
"npcBanMessageProb":1
}, },
"events":[ "events":[
[ [
@@ -37,6 +38,15 @@
], ],
["OpenNationBetting", 1, 1000], ["OpenNationBetting", 1, 1000],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+9 -1
View File
@@ -727,6 +727,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -873,6 +873,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -798,6 +798,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -775,6 +775,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -750,6 +750,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -756,6 +756,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -763,6 +763,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -749,6 +749,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -741,6 +741,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -744,6 +744,15 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -741,6 +741,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -763,6 +763,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+11 -1
View File
@@ -11,7 +11,8 @@
"expandCityDevelIncreaseAmount": 1350, "expandCityDevelIncreaseAmount": 1350,
"expandCityWallIncreaseAmount": 1600, "expandCityWallIncreaseAmount": 1600,
"defaultMaxGeneral":300, "defaultMaxGeneral":300,
"joinRuinedNPCProp":0 "joinRuinedNPCProp":0,
"npcBanMessageProb":1
}, },
"events":[ "events":[
[ [
@@ -41,6 +42,15 @@
], ],
["OpenNationBetting", 1, 1000], ["OpenNationBetting", 1, 1000],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+9 -1
View File
@@ -701,6 +701,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -709,6 +709,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -712,6 +712,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -711,6 +711,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -109,6 +109,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -702,6 +702,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -110,6 +110,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -268,6 +268,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -265,6 +265,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -420,6 +420,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -251,6 +251,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9 -1
View File
@@ -707,6 +707,14 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -710,6 +710,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -713,6 +713,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -380,6 +380,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -711,6 +711,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -715,6 +715,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -272,5 +272,14 @@
"initialActions":[ "initialActions":[
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -289,5 +289,14 @@
"initialActions":[ "initialActions":[
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -394,6 +394,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -333,6 +333,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -388,6 +388,15 @@
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -768,5 +768,20 @@
[0, "플랑크톤", null, 0, null, 60, 33, 81, 0, 160, 300, null, "발명"], [0, "플랑크톤", null, 0, null, 60, 33, 81, 0, 160, 300, null, "발명"],
[0, "퐁퐁부인", null, 0, null, 71, 47, 84, 0, 160, 300, null, null], [0, "퐁퐁부인", null, 0, null, 71, 47, 84, 0, 160, 300, null, null],
[0, "사이타마", null, 0, null, 83, 105, 74, 0, 160, 300, null, "무쌍", "압도적인 힘이라는 건 참 시시한 거야."] [0, "사이타마", null, 0, null, 83, 105, 74, 0, 160, 300, null, "무쌍", "압도적인 힘이라는 건 참 시시한 거야."]
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -598,5 +598,20 @@
[999, "프란체스카", null, 0, null, 1, 1, 1, 0, -15, 300, null, null], [999, "프란체스카", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "하모니트", null, 0, null, 1, 1, 1, 0, -15, 300, null, null], [999, "하모니트", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "후지와라", null, 0, null, 1, 1, 1, 0, -15, 300, null, null] [999, "후지와라", null, 0, null, 1, 1, 1, 0, -15, 300, null, null]
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -786,5 +786,20 @@
[0, "장선", null, 0, null, 72, 71, 48, 0, 160, 300, null, null], [0, "장선", null, 0, null, 72, 71, 48, 0, 160, 300, null, null],
[0, "뇌서", null, 0, null, 76, 74, 61, 0, 160, 300, null, null], [0, "뇌서", null, 0, null, 76, 74, 61, 0, 160, 300, null, null],
[0, "번궁", null, 0, null, 71, 67, 58, 0, 160, 300, null, null] [0, "번궁", null, 0, null, 71, 67, 58, 0, 160, 300, null, null]
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -661,5 +661,20 @@
], ],
"general_ex":[ "general_ex":[
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -661,5 +661,20 @@
], ],
"general_ex":[ "general_ex":[
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -505,5 +505,20 @@
], ],
"general_ex":[ "general_ex":[
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -224,5 +224,20 @@
[0, "국화", null, 0, "석영고원", 83, 87, 88, 0, 1973, 2100, null, "환술"], [0, "국화", null, 0, "석영고원", 83, 87, 88, 0, 1973, 2100, null, "환술"],
[0, "목호", null, 0, "석영고원", 94, 73, 94, 0, 1973, 2100, null, null], [0, "목호", null, 0, "석영고원", 94, 73, 94, 0, 1973, 2100, null, null],
[0, "로켓단", null, 0, null, 85, 85, 85, 0, 1973, 2100, null, null, "우리가 그렇게 궁금하시다면 대답해 드리는게 인지상정\n이 세계의 파괴를 막기 위해! 이 세계의 평화를 지키기 위해! \n사랑과 진실, 어둠을 뿌리고 다니는...! \n포켓몬의 감초 귀"] [0, "로켓단", null, 0, null, 85, 85, 85, 0, 1973, 2100, null, null, "우리가 그렇게 궁금하시다면 대답해 드리는게 인지상정\n이 세계의 파괴를 막기 위해! 이 세계의 평화를 지키기 위해! \n사랑과 진실, 어둠을 뿌리고 다니는...! \n포켓몬의 감초 귀"]
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+15
View File
@@ -659,5 +659,20 @@
], ],
"general_ex":[ "general_ex":[
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+9
View File
@@ -841,6 +841,15 @@
"trade":100 "trade":100
}], }],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+9
View File
@@ -109,6 +109,15 @@
["Date", "==", 181, 1], ["Date", "==", 181, 1],
["RaiseNPCNation"], ["RaiseNPCNation"],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
+692
View File
@@ -0,0 +1,692 @@
{
"title": "【가상모드24】 유저무쌍 멀티 유니버스!",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드24】</b>유저무쌍 멀티 유니버스!</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"iconPath": ".",
"fiction": 1,
"nation":[
],
"const": {
"npcBanMessageProb":0,
"npcSeizureMessageProb":0,
"npcMessageFreqByDay":8
},
"diplomacy":[],
"general":[
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
],
"general_ex":[
],
"initialEvents":[
],
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
}
+868
View File
@@ -0,0 +1,868 @@
{
"title": "【가상모드24-b】 유저무쌍 멀티 유니버스!(천지비급)",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드24-b】</b>유저무쌍 멀티 유니버스!(비급)</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"const": {
"npcBanMessageProb":0,
"npcSeizureMessageProb":0,
"npcMessageFreqByDay":8,
"availableSpecialWar": [
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
"che_보병", "che_궁병", "che_기병", "che_공성",
"che_돌격", "che_무쌍", "che_견고", "che_위압",
"che_저격", "che_필살", "che_징병", "che_의술", "che_격노", "che_척사"
],
"allItems": {
"horse": {
"che_명마_01_노기": 0,
"che_명마_02_조랑": 0,
"che_명마_03_노새": 0,
"che_명마_04_나귀": 0,
"che_명마_05_갈색마": 0,
"che_명마_06_흑색마": 0,
"che_명마_07_백마" : 2,
"che_명마_07_기주마" : 2,
"che_명마_07_오환마" : 2,
"che_명마_07_백상" : 2,
"che_명마_08_양주마" : 2,
"che_명마_08_흉노마" : 2,
"che_명마_09_과하마" : 2,
"che_명마_09_의남백마" : 2,
"che_명마_10_대완마" : 2,
"che_명마_10_옥추마" : 2,
"che_명마_11_서량마" : 2,
"che_명마_11_화종마" : 2,
"che_명마_12_사륜거" : 2,
"che_명마_12_옥란백용구": 2,
"che_명마_13_절영" : 2,
"che_명마_13_적로" : 2,
"che_명마_14_적란마" : 2,
"che_명마_14_조황비전" : 2,
"che_명마_15_한혈마" : 2,
"che_명마_15_적토마" : 2
},
"weapon": {
"che_무기_01_단도": 0,
"che_무기_02_단궁": 0,
"che_무기_03_단극": 0,
"che_무기_04_목검": 0,
"che_무기_05_죽창": 0,
"che_무기_06_소부": 0,
"che_무기_07_동추": 2,
"che_무기_07_철편": 2,
"che_무기_07_철쇄": 2,
"che_무기_07_맥궁": 2,
"che_무기_08_유성추": 2,
"che_무기_08_철질여골": 2,
"che_무기_09_쌍철극": 2,
"che_무기_09_동호비궁": 2,
"che_무기_10_삼첨도": 2,
"che_무기_10_대부": 2,
"che_무기_11_고정도": 2,
"che_무기_11_이광궁": 2,
"che_무기_12_철척사모": 2,
"che_무기_12_칠성검": 2,
"che_무기_13_사모": 2,
"che_무기_13_양유기궁": 2,
"che_무기_14_언월도": 2,
"che_무기_14_방천화극": 2,
"che_무기_15_청홍검": 2,
"che_무기_15_의천검": 2
},
"book": {
"che_서적_01_효경전": 0,
"che_서적_02_회남자": 0,
"che_서적_03_변도론": 0,
"che_서적_04_건상역주": 0,
"che_서적_05_여씨춘추": 0,
"che_서적_06_사민월령": 0,
"che_서적_07_위료자": 2,
"che_서적_07_사마법": 2,
"che_서적_07_한서": 2,
"che_서적_07_논어": 2,
"che_서적_08_전론": 2,
"che_서적_08_사기": 2,
"che_서적_09_장자": 2,
"che_서적_09_역경": 2,
"che_서적_10_시경": 2,
"che_서적_10_구국론": 2,
"che_서적_11_상군서": 2,
"che_서적_11_춘추전": 2,
"che_서적_12_산해경": 2,
"che_서적_12_맹덕신서": 2,
"che_서적_13_관자": 2,
"che_서적_13_병법24편": 2,
"che_서적_14_한비자": 2,
"che_서적_14_오자병법": 2,
"che_서적_15_노자": 2,
"che_서적_15_손자병법": 2
},
"item": {
"che_치료_환약": 0,
"che_저격_수극": 0,
"che_사기_탁주": 0,
"che_훈련_청주": 0,
"che_계략_이추": 0,
"che_계략_향낭": 0,
"event_전투특기_격노": 0,
"event_전투특기_견고": 0,
"event_전투특기_공성": 0,
"event_전투특기_궁병": 0,
"event_전투특기_귀병": 0,
"event_전투특기_기병": 0,
"event_전투특기_돌격": 0,
"event_전투특기_무쌍": 0,
"event_전투특기_반계": 0,
"event_전투특기_보병": 0,
"event_전투특기_신산": 0,
"event_전투특기_신중": 0,
"event_전투특기_위압": 0,
"event_전투특기_의술": 0,
"event_전투특기_저격": 0,
"event_전투특기_집중": 0,
"event_전투특기_징병": 0,
"event_전투특기_척사": 0,
"event_전투특기_필살": 0,
"event_전투특기_환술": 0
}
}
},
"iconPath": ".",
"fiction": 1,
"nation":[
],
"diplomacy":[],
"general":[
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
],
"general_ex":[
],
"initialEvents":[
[
true,
["ChangeCity", "all", {
"trade":100
}]
]
],
"events":[
[
"month", 1000,
["Date", "==", 180, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 180, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
}
+12 -1
View File
@@ -11,6 +11,9 @@
"history": [ "history": [
"<C>●</>180년 1월:<L><b>【이벤트】</b></>병기로 싸운다! 최고의 충차 지휘관을 가린다" "<C>●</>180년 1월:<L><b>【이벤트】</b></>병기로 싸운다! 최고의 충차 지휘관을 가린다"
], ],
"const": {
"npcBanMessageProb":1
},
"initialEvents":[ "initialEvents":[
[ [
true, true,
@@ -33,6 +36,14 @@
] ]
], ],
"events":[ "events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
] ]
} }
+14 -2
View File
@@ -8,6 +8,18 @@
], ],
"const": { "const": {
"expandCityDefaultCost": 30000, "expandCityDefaultCost": 30000,
"expandCityCostCoef": 250 "expandCityCostCoef": 250,
} "npcBanMessageProb":1
},
"events":[
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
]
]
} }
+10
View File
@@ -8,6 +8,7 @@
], ],
"const": { "const": {
"joinRuinedNPCProp":0, "joinRuinedNPCProp":0,
"npcBanMessageProb":1,
"availableSpecialWar":[ "availableSpecialWar":[
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계", "che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
"che_보병", "che_궁병", "che_기병", "che_공성", "che_보병", "che_궁병", "che_기병", "che_공성",
@@ -79,6 +80,15 @@
"trade":100 "trade":100
}], }],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+12
View File
@@ -9,6 +9,9 @@
"history": [ "history": [
"<C>●</>180년 1월:<L><b>【이벤트】</b></>29기까지 내로라 하는 모든 장수들이 모였다!" "<C>●</>180년 1월:<L><b>【이벤트】</b></>29기까지 내로라 하는 모든 장수들이 모였다!"
], ],
"const": {
"npcBanMessageProb":1
},
"events": [ "events": [
[ [
"month", 1000, "month", 1000,
@@ -24,6 +27,15 @@
"agri": "+1200", "agri": "+1200",
"comm": "+1200" "comm": "+1200"
}] }]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
+10
View File
@@ -9,6 +9,7 @@
], ],
"const": { "const": {
"joinRuinedNPCProp":0, "joinRuinedNPCProp":0,
"npcBanMessageProb":1,
"availableGeneralCommand": { "availableGeneralCommand": {
"": [ "": [
"휴식", "휴식",
@@ -179,6 +180,15 @@
], ],
["OpenNationBetting", 1, 1000], ["OpenNationBetting", 1, 1000],
["DeleteEvent"] ["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
] ]
] ]
} }
-1
View File
@@ -321,7 +321,6 @@ body {
font-size: 14px; font-size: 14px;
} }
.toolbarButton2 { .toolbarButton2 {
@extend .btn; @extend .btn;
@extend .btn-sammo-base2; @extend .btn-sammo-base2;
+237 -252
View File
@@ -1,7 +1,6 @@
############################################################################ ##############################
## ##
############################################################################ ##############################
CREATE TABLE `general` ( CREATE TABLE `general` (
`no` INT(11) NOT NULL AUTO_INCREMENT, `no` INT(11) NOT NULL AUTO_INCREMENT,
`owner` INT(11) NOT NULL DEFAULT '0', `owner` INT(11) NOT NULL DEFAULT '0',
@@ -40,7 +39,7 @@ CREATE TABLE `general` (
`dex5` INT(8) NOT NULL DEFAULT '0', `dex5` INT(8) NOT NULL DEFAULT '0',
`officer_level` INT(2) NOT NULL DEFAULT '0', `officer_level` INT(2) NOT NULL DEFAULT '0',
`officer_city` INT(4) NOT NULL DEFAULT '0', `officer_city` INT(4) NOT NULL DEFAULT '0',
`permission` ENUM('normal','auditor','ambassador') NULL DEFAULT 'normal', `permission` ENUM('normal', 'auditor', 'ambassador') NULL DEFAULT 'normal',
`gold` INT(6) NOT NULL DEFAULT '1000', `gold` INT(6) NOT NULL DEFAULT '1000',
`rice` INT(6) NOT NULL DEFAULT '1000', `rice` INT(6) NOT NULL DEFAULT '1000',
`crew` INT(5) NOT NULL DEFAULT '0', `crew` INT(5) NOT NULL DEFAULT '0',
@@ -76,9 +75,9 @@ CREATE TABLE `general` (
`tournament` INT(1) NULL DEFAULT '0', `tournament` INT(1) NULL DEFAULT '0',
`vote` INT(1) NULL DEFAULT '0', `vote` INT(1) NULL DEFAULT '0',
`newvote` INT(1) NULL DEFAULT '0', `newvote` INT(1) NULL DEFAULT '0',
`last_turn` TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`last_turn`)), `last_turn` TEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`aux` LONGTEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`aux`)), `aux` LONGTEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`penalty` TEXT NULL DEFAULT '', `penalty` TEXT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
INDEX `nation` (`nation`, `npc`), INDEX `nation` (`nation`, `npc`),
INDEX `city` (`city`), INDEX `city` (`city`),
@@ -89,30 +88,25 @@ CREATE TABLE `general` (
INDEX `officer_level` (`nation`, `officer_level`), INDEX `officer_level` (`nation`, `officer_level`),
INDEX `officer_city` (`officer_city`, `officer_level`), INDEX `officer_city` (`officer_city`, `officer_level`),
INDEX `name` (`name`), INDEX `name` (`name`),
INDEX `last_refresh` (`lastrefresh`) INDEX `last_refresh` (`lastrefresh`),
) CONSTRAINT `json1` CHECK (json_valid(`last_turn`)),
DEFAULT CHARSET=utf8mb4 CONSTRAINT `json2` CHECK (json_valid(`aux`)),
ENGINE=Aria; CONSTRAINT `json3` CHECK (json_valid(`penalty`))
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
CREATE TABLE `general_turn` ( CREATE TABLE `general_turn` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`general_id` INT(11) NOT NULL, `general_id` INT(11) NOT NULL,
`turn_idx` INT(4) NOT NULL, `turn_idx` INT(4) NOT NULL,
`action` VARCHAR(20) NOT NULL, `action` VARCHAR(20) NOT NULL,
`arg` TEXT NULL DEFAULT NULL, `arg` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`brief` TEXT NULL DEFAULT NULL, `brief` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `general_id` (`general_id`, `turn_idx`), UNIQUE INDEX `general_id` (`general_id`, `turn_idx`),
INDEX `action` (`action`, `turn_idx`, `general_id`) INDEX `action` (`action`, `turn_idx`, `general_id`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ##############################
ENGINE=Aria
;
###########################################################################
## ##
########################################################################### ##############################
CREATE TABLE `nation` ( CREATE TABLE `nation` (
`nation` INT(6) NOT NULL AUTO_INCREMENT, `nation` INT(6) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL COLLATE 'utf8mb4_bin', `name` VARCHAR(64) NOT NULL COLLATE 'utf8mb4_bin',
@@ -133,29 +127,35 @@ CREATE TABLE `nation` (
`surlimit` INT(4) NULL DEFAULT '72', `surlimit` INT(4) NULL DEFAULT '72',
`tech` float NULL DEFAULT '0', `tech` float NULL DEFAULT '0',
`power` INT(8) NULL DEFAULT '0', `power` INT(8) NULL DEFAULT '0',
`spy` TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`spy`)), `spy` TEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`level` INT(1) NULL DEFAULT '0', `level` INT(1) NULL DEFAULT '0',
`type` VARCHAR(20) NOT NULL DEFAULT 'che_중립', `type` VARCHAR(20) NOT NULL DEFAULT 'che_중립',
`aux` LONGTEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`aux`)), `aux` LONGTEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`nation`) PRIMARY KEY (`nation`),
) CONSTRAINT `json1` CHECK (json_valid(`spy`)),
ENGINE=Aria DEFAULT CHARSET=utf8mb4; CONSTRAINT `json2` CHECK (json_valid(`aux`))
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
CREATE TABLE `nation_turn` ( CREATE TABLE `nation_turn` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`nation_id` INT(11) NOT NULL, `nation_id` INT(11) NOT NULL,
`officer_level` INT(4) NOT NULL, `officer_level` INT(4) NOT NULL,
`turn_idx` INT(4) NOT NULL, `turn_idx` INT(4) NOT NULL,
`action` VARCHAR(16) NOT NULL, `action` VARCHAR(16) NOT NULL COLLATE 'utf8mb4_bin',
`arg` TEXT NULL DEFAULT NULL CHECK (json_valid(`arg`)), `arg` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`brief` TEXT NULL DEFAULT NULL, `brief` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `nation` (`nation_id`, `officer_level`, `turn_idx`), UNIQUE INDEX `nation` (`nation_id`, `officer_level`, `turn_idx`),
INDEX `action` (`action`, `turn_idx`, `nation_id`, `officer_level`) INDEX `action` (
) `action`,
ENGINE=Aria DEFAULT CHARSET=utf8mb4; `turn_idx`,
`nation_id`,
## `officer_level`
),
CONSTRAINT `json` CHECK (json_valid(`arg`))
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
##
##############################
CREATE TABLE `board` ( CREATE TABLE `board` (
`no` INT(11) NOT NULL AUTO_INCREMENT, `no` INT(11) NOT NULL AUTO_INCREMENT,
`nation_no` INT(11) NOT NULL, `nation_no` INT(11) NOT NULL,
@@ -168,9 +168,7 @@ CREATE TABLE `board` (
`text` TEXT NOT NULL, `text` TEXT NOT NULL,
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
INDEX `nation_no` (`nation_no`, `is_secret`, `date`) INDEX `nation_no` (`nation_no`, `is_secret`, `date`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
CREATE TABLE `comment` ( CREATE TABLE `comment` (
`no` INT(11) NOT NULL AUTO_INCREMENT, `no` INT(11) NOT NULL AUTO_INCREMENT,
`nation_no` INT(11) NOT NULL, `nation_no` INT(11) NOT NULL,
@@ -183,12 +181,10 @@ CREATE TABLE `comment` (
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
INDEX `nation_no` (`nation_no`, `is_secret`, `date`), INDEX `nation_no` (`nation_no`, `is_secret`, `date`),
INDEX `document_no` (`document_no`, `date`) INDEX `document_no` (`document_no`, `date`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
ENGINE=Aria DEFAULT CHARSET=utf8mb4; ##############################
###########################################################################
## ##
########################################################################### ##############################
## trade 100 ## trade 100
CREATE TABLE `city` ( CREATE TABLE `city` (
`city` INT(6) NOT NULL AUTO_INCREMENT, `city` INT(6) NOT NULL AUTO_INCREMENT,
@@ -216,26 +212,23 @@ CREATE TABLE `city` (
`state` INT(2) NOT NULL DEFAULT '0', `state` INT(2) NOT NULL DEFAULT '0',
`region` INT(2) NOT NULL, `region` INT(2) NOT NULL,
`term` INT(1) NOT NULL DEFAULT '0', `term` INT(1) NOT NULL DEFAULT '0',
`conflict` TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`conflict`)), `conflict` TEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`city`), PRIMARY KEY (`city`),
INDEX `nation` (`nation`) INDEX `nation` (`nation`),
) ENGINE=Aria DEFAULT CHARSET=utf8mb4; CONSTRAINT `json` CHECK (json_valid(`conflict`))
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
########################################################################### ##############################
## ##
########################################################################### ##############################
CREATE TABLE `troop` ( CREATE TABLE `troop` (
`troop_leader` INT(6) NOT NULL, `troop_leader` INT(6) NOT NULL,
`nation` INT(6) NOT NULL, `nation` INT(6) NOT NULL,
`name` VARCHAR(50) NOT NULL, `name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`troop_leader`) PRIMARY KEY (`troop_leader`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb4; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
##########################################################################
## ##
########################################################################## ##############################
CREATE TABLE `plock` ( CREATE TABLE `plock` (
`no` INT(11) NOT NULL AUTO_INCREMENT, `no` INT(11) NOT NULL AUTO_INCREMENT,
`type` ENUM('GAME', 'ETC', 'TOURNAMENT') NOT NULL DEFAULT 'GAME', `type` ENUM('GAME', 'ETC', 'TOURNAMENT') NOT NULL DEFAULT 'GAME',
@@ -243,33 +236,26 @@ CREATE TABLE `plock` (
`locktime` DATETIME(6) NOT NULL, `locktime` DATETIME(6) NOT NULL,
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
UNIQUE INDEX `type` (`type`) UNIQUE INDEX `type` (`type`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ##############################
ENGINE=Aria
;
###########################################################################
## ##
########################################################################### ##############################
CREATE TABLE `message` ( CREATE TABLE `message` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`mailbox` INT(11) NOT NULL COMMENT '9999 == public, >= 9000 national', `mailbox` INT(11) NOT NULL COMMENT '9999 == public, >= 9000 national',
`type` ENUM('private','national','public','diplomacy') NOT NULL, `type` ENUM('private', 'national', 'public', 'diplomacy') NOT NULL,
`src` INT(11) NOT NULL, `src` INT(11) NOT NULL,
`dest` INT(11) NOT NULL, `dest` INT(11) NOT NULL,
`time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`valid_until` DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59', `valid_until` DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59',
`message` TEXT NOT NULL CHECK (json_valid(`message`)), `message` TEXT NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `by_mailbox` (`mailbox`, `type`, `id`) INDEX `by_mailbox` (`mailbox`, `type`, `id`),
) CONSTRAINT `json` CHECK (json_valid(`message`))
DEFAULT CHARSET=utf8mb4 ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
ENGINE=Aria; ##############################
###########################################################################
## ##
########################################################################### ##############################
CREATE TABLE IF NOT EXISTS `hall` ( CREATE TABLE IF NOT EXISTS `hall` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NOT NULL, `server_id` CHAR(20) NOT NULL,
@@ -279,20 +265,17 @@ CREATE TABLE IF NOT EXISTS `hall` (
`type` VARCHAR(20) NOT NULL, `type` VARCHAR(20) NOT NULL,
`value` DOUBLE NOT NULL, `value` DOUBLE NOT NULL,
`owner` INT(11) NULL DEFAULT NULL, `owner` INT(11) NULL DEFAULT NULL,
`aux` LONGTEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`aux`)), `aux` LONGTEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `server_general` (`server_id`, `type`, `general_no`), UNIQUE INDEX `server_general` (`server_id`, `type`, `general_no`),
UNIQUE INDEX `owner` (`owner`, `server_id`, `type`), UNIQUE INDEX `owner` (`owner`, `server_id`, `type`),
INDEX `server_show` (`server_id`, `type`, `value`), INDEX `server_show` (`server_id`, `type`, `value`),
INDEX `scenario` (`season`, `scenario`, `type`, `value`) INDEX `scenario` (`season`, `scenario`, `type`, `value`),
) CONSTRAINT `json` CHECK (json_valid(`aux`))
ENGINE=Aria DEFAULT CHARSET=utf8mb4; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ()
########################################################################### ##############################
##
###########################################################################
CREATE TABLE IF NOT EXISTS `ng_games` ( CREATE TABLE IF NOT EXISTS `ng_games` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NOT NULL, `server_id` CHAR(20) NOT NULL,
@@ -302,24 +285,28 @@ CREATE TABLE IF NOT EXISTS `ng_games` (
`season` INT(11) NOT NULL, `season` INT(11) NOT NULL,
`scenario` INT(11) NOT NULL, `scenario` INT(11) NOT NULL,
`scenario_name` TEXT NOT NULL, `scenario_name` TEXT NOT NULL,
`env` TEXT NOT NULL CHECK (json_valid(`env`)), `env` TEXT NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `server_id` (`server_id`), UNIQUE INDEX `server_id` (`server_id`),
INDEX `date` (`date`) INDEX `date` (`date`),
) CONSTRAINT `json` CHECK (json_valid(`env`))
ENGINE=Aria DEFAULT CHARSET=utf8mb4; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ()
##############################
CREATE TABLE IF NOT EXISTS `ng_old_nations` ( CREATE TABLE IF NOT EXISTS `ng_old_nations` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NOT NULL DEFAULT '0', `server_id` CHAR(20) NOT NULL DEFAULT '0',
`nation` INT(11) NOT NULL DEFAULT '0', `nation` INT(11) NOT NULL DEFAULT '0',
`data` LONGTEXT NOT NULL DEFAULT '{}' CHECK (json_valid(`data`)), `data` LONGTEXT NOT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `server_id` (`server_id`, `nation`) INDEX `server_id` (`server_id`, `nation`),
) CONSTRAINT `json` CHECK (json_valid(`data`))
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ()
##############################
CREATE TABLE IF NOT EXISTS `ng_old_generals` ( CREATE TABLE IF NOT EXISTS `ng_old_generals` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NOT NULL, `server_id` CHAR(20) NOT NULL,
@@ -328,14 +315,16 @@ CREATE TABLE IF NOT EXISTS `ng_old_generals` (
`name` VARCHAR(32) NOT NULL, `name` VARCHAR(32) NOT NULL,
`last_yearmonth` INT(11) NOT NULL, `last_yearmonth` INT(11) NOT NULL,
`turntime` DATETIME(6) NOT NULL, `turntime` DATETIME(6) NOT NULL,
`data` MEDIUMTEXT NOT NULL, `data` MEDIUMTEXT NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `by_no` (`server_id`, `general_no`), UNIQUE INDEX `by_no` (`server_id`, `general_no`),
INDEX `by_name` (`server_id`, `name`), INDEX `by_name` (`server_id`, `name`),
INDEX `owner` (`owner`, `server_id`) INDEX `owner` (`owner`, `server_id`),
) CONSTRAINT `json` CHECK (json_valid(`data`))
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ()
##############################
CREATE TABLE IF NOT EXISTS `emperior` ( CREATE TABLE IF NOT EXISTS `emperior` (
`no` INT(6) NOT NULL AUTO_INCREMENT, `no` INT(6) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NULL DEFAULT '', `server_id` CHAR(20) NULL DEFAULT '',
@@ -377,48 +366,59 @@ CREATE TABLE IF NOT EXISTS `emperior` (
`tiger` VARCHAR(128) NULL DEFAULT '', `tiger` VARCHAR(128) NULL DEFAULT '',
`eagle` VARCHAR(128) NULL DEFAULT '', `eagle` VARCHAR(128) NULL DEFAULT '',
`gen` TEXT NULL DEFAULT '', `gen` TEXT NULL DEFAULT '',
`history` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)), `history` MEDIUMTEXT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
`aux` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)), `aux` MEDIUMTEXT NULL DEFAULT '{}' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`no`) PRIMARY KEY (`no`),
) ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4; CONSTRAINT `json1` CHECK (json_valid(`history`)),
CONSTRAINT `json2` CHECK (json_valid(`aux`))
########################################################################### ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ##
########################################################################### ##############################
create table diplomacy ( create table diplomacy (
`no` INT(6) NOT NULL AUTO_INCREMENT, `no` INT(6) NOT NULL AUTO_INCREMENT,
`me` INT(6) NOT NULL, `me` INT(6) NOT NULL,
`you` INT(6) NOT NULL, `you` INT(6) NOT NULL,
`state` INT(6) NULL DEFAULT '0', `state` INT(6) NULL DEFAULT '0',
`term` INT(6) NULL DEFAULT '0', `term` INT(6) NULL DEFAULT '0',
`dead` INT(8) NULL DEFAULT '0', `dead` INT(8) NULL DEFAULT '0',
`showing` DATETIME NULL DEFAULT NULL, `showing` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`no`),
PRIMARY KEY (`no`), UNIQUE INDEX `me` (`me`, `you`)
UNIQUE INDEX `me` (`me`, `you`) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
) ENGINE=Aria DEFAULT CHARSET=utf8mb4; ##############################
##
##############################
CREATE TABLE `ng_diplomacy` ( CREATE TABLE `ng_diplomacy` (
`no` INT(11) NOT NULL AUTO_INCREMENT, `no` INT(11) NOT NULL AUTO_INCREMENT,
`src_nation_id` INT(11) NOT NULL, `src_nation_id` INT(11) NOT NULL,
`dest_nation_id` INT(11) NOT NULL, `dest_nation_id` INT(11) NOT NULL,
`prev_no` INT(11) NULL DEFAULT NULL, `prev_no` INT(11) NULL DEFAULT NULL,
`state` ENUM('proposed','activated','cancelled','replaced') NOT NULL DEFAULT 'proposed', `state` ENUM('proposed', 'activated', 'cancelled', 'replaced') NOT NULL DEFAULT 'proposed',
`text_brief` TEXT NOT NULL, `text_brief` TEXT NOT NULL,
`text_detail` TEXT NOT NULL, `text_detail` TEXT NOT NULL,
`date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_signer` INT(11) NOT NULL, `src_signer` INT(11) NOT NULL,
`dest_signer` INT(11) NULL DEFAULT NULL, `dest_signer` INT(11) NULL DEFAULT NULL,
`aux` TEXT NULL DEFAULT NULL CHECK (json_valid(`aux`)), `aux` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
INDEX `by_nation_src` (`src_nation_id`, `dest_nation_id`, `state`, `date`), INDEX `by_nation_src` (
INDEX `by_nation_dest` (`dest_nation_id`, `src_nation_id`, `state`, `date`) `src_nation_id`,
) `dest_nation_id`,
ENGINE=Aria DEFAULT CHARSET=utf8mb4; `state`,
`date`
########################################################################### ),
INDEX `by_nation_dest` (
`dest_nation_id`,
`src_nation_id`,
`state`,
`date`
),
CONSTRAINT `json` CHECK (json_valid(`aux`))
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
## ##
########################################################################### ##############################
CREATE TABLE `tournament` ( CREATE TABLE `tournament` (
`seq` INT(6) NOT NULL AUTO_INCREMENT, `seq` INT(6) NOT NULL AUTO_INCREMENT,
`no` INT(6) NULL DEFAULT 0, `no` INT(6) NULL DEFAULT 0,
@@ -440,32 +440,27 @@ CREATE TABLE `tournament` (
`prmt` INT(1) NULL DEFAULT 0, `prmt` INT(1) NULL DEFAULT 0,
PRIMARY KEY (`seq`), PRIMARY KEY (`seq`),
INDEX `grp` (`grp`, `grp_no`) INDEX `grp` (`grp`, `grp_no`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
COLLATE='utf8mb4_general_ci' ##############################
ENGINE=Aria;
###########################################################################
## ##
########################################################################### ##############################
create table auction ( create table `auction` (
no int(6) not null auto_increment, `no` int(6) not null auto_increment,
type int(6) default 0, `type` int(6) default 0,
no1 int(6) default 0, `no1` int(6) default 0,
name1 varchar(64) default '-', `name1` varchar(64) default '-',
amount int(6) default 0, `amount` int(6) default 0,
cost int(6) default 0, `cost` int(6) default 0,
value int(6) default 0, `value` int(6) default 0,
topv int(6) default 0, `topv` int(6) default 0,
no2 int(6) default 0, `no2` int(6) default 0,
name2 varchar(64) default '-', `name2` varchar(64) default '-',
expire datetime, `expire` datetime,
PRIMARY KEY (`no`)
PRIMARY KEY (no) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
) ENGINE=Aria DEFAULT CHARSET=utf8mb4; ##############################
###########################################################################
## ##
########################################################################### ##############################
CREATE TABLE `statistic` ( CREATE TABLE `statistic` (
`no` INT(6) NOT NULL AUTO_INCREMENT, `no` INT(6) NOT NULL AUTO_INCREMENT,
`year` INT(4) NULL DEFAULT '0', `year` INT(4) NULL DEFAULT '0',
@@ -479,48 +474,46 @@ CREATE TABLE `statistic` (
`power_hist` TEXT NULL DEFAULT '', `power_hist` TEXT NULL DEFAULT '',
`crewtype` TEXT NULL DEFAULT '', `crewtype` TEXT NULL DEFAULT '',
`etc` TEXT NULL DEFAULT '', `etc` TEXT NULL DEFAULT '',
`aux` TEXT NULL DEFAULT NULL CHECK (json_valid(`aux`)), `aux` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`no`) PRIMARY KEY (`no`),
) CONSTRAINT `json` CHECK (json_valid(`aux`))
ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4; ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
##############################
###########################################################################
## ##
########################################################################### ##############################
CREATE TABLE IF NOT EXISTS `ng_history` ( CREATE TABLE IF NOT EXISTS `ng_history` (
`no` INT(6) NOT NULL AUTO_INCREMENT, `no` INT(6) NOT NULL AUTO_INCREMENT,
`server_id` CHAR(20) NOT NULL, `server_id` CHAR(20) NOT NULL,
`year` INT(4) NULL, `year` INT(4) NULL,
`month` INT(2) NULL, `month` INT(2) NULL,
`map` MEDIUMTEXT NULL DEFAULT NULL CHECK (json_valid(`map`)), `map` MEDIUMTEXT NULL DEFAULT NULL,
`global_history` MEDIUMTEXT NULL DEFAULT NULL CHECK (json_valid(`global_history`)), `global_history` MEDIUMTEXT NULL DEFAULT NULL,
`global_action` MEDIUMTEXT NULL DEFAULT NULL CHECK (json_valid(`global_action`)), `global_action` MEDIUMTEXT NULL DEFAULT NULL,
`nations` MEDIUMTEXT NULL DEFAULT NULL CHECK (json_valid(`nations`)), `nations` MEDIUMTEXT NULL DEFAULT NULL,
PRIMARY KEY (`no`), PRIMARY KEY (`no`),
INDEX `server_id` (`server_id`, `year`, `month`) INDEX `server_id` (`server_id`, `year`, `month`),
) CONSTRAINT `json1` CHECK (json_valid(`map`)),
ENGINE=Aria DEFAULT CHARSET=utf8mb4; CONSTRAINT `json2` CHECK (json_valid(`global_history`)),
CONSTRAINT `json3` CHECK (json_valid(`global_action`)),
########################################################################### CONSTRAINT `json4` CHECK (json_valid(`nations`))
) COLLATE = 'utf8mb4_bin' ENGINE = Aria;
##############################
## ##
########################################################################### ##############################
CREATE TABLE `event` ( CREATE TABLE `event` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`target` ENUM('MONTH','OCCUPY_CITY','DESTROY_NATION') NOT NULL DEFAULT 'MONTH', `target` ENUM('MONTH', 'OCCUPY_CITY', 'DESTROY_NATION') NOT NULL DEFAULT 'MONTH',
`priority` INT(11) NOT NULL DEFAULT '1000', `priority` INT(11) NOT NULL DEFAULT '1000',
`condition` MEDIUMTEXT NOT NULL, `condition` MEDIUMTEXT NOT NULL COLLATE 'utf8mb4_bin',
`action` MEDIUMTEXT NOT NULL, `action` MEDIUMTEXT NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `target` (`target`, `priority`, `id`), INDEX `target` (`target`, `priority`, `id`),
CONSTRAINT `condition` CHECK (json_valid(`condition`)), CONSTRAINT `json1` CHECK (json_valid(`condition`)),
CONSTRAINT `action` CHECK (json_valid(`action`)) CONSTRAINT `json2` CHECK (json_valid(`action`))
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ##############################
ENGINE=Aria; ##
##############################
##
CREATE TABLE `world_history` ( CREATE TABLE `world_history` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`nation_id` INT(11) NOT NULL, `nation_id` INT(11) NOT NULL,
@@ -530,57 +523,50 @@ CREATE TABLE `world_history` (
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `date` (`nation_id`, `year`, `month`, `id`), INDEX `date` (`nation_id`, `year`, `month`, `id`),
INDEX `plain` (`nation_id`, `id`) INDEX `plain` (`nation_id`, `id`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ############################
ENGINE=Aria ##
; ##############################
##
CREATE TABLE `general_record` ( CREATE TABLE `general_record` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`general_id` INT(11) NOT NULL, `general_id` INT(11) NOT NULL,
`log_type` ENUM('action','battle_brief','battle', 'history') NOT NULL, `log_type` ENUM('action', 'battle_brief', 'battle', 'history') NOT NULL,
`year` INT(4) NOT NULL, `year` INT(4) NOT NULL,
`month` INT(2) NOT NULL, `month` INT(2) NOT NULL,
`text` TEXT NOT NULL, `text` TEXT NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `date` (`general_id`, `log_type`, `year`, `month`, `id`), INDEX `date` (`general_id`, `log_type`, `year`, `month`, `id`),
INDEX `plain` (`general_id`, `log_type`, `id`) INDEX `plain` (`general_id`, `log_type`, `id`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ##############################
ENGINE=Aria ##
; ##############################
######
#
CREATE TABLE IF NOT EXISTS `reserved_open` ( CREATE TABLE IF NOT EXISTS `reserved_open` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`options` TEXT NULL DEFAULT NULL CHECK (json_valid(`options`)), `options` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`date` DATETIME NULL DEFAULT NULL, `date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `date` (`date`) INDEX `date` (`date`),
) CONSTRAINT `json` CHECK (json_valid(`options`))
DEFAULT CHARSET=utf8mb4 ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
ENGINE=Aria; ##############################
##
###### ##############################
#
CREATE TABLE `select_npc_token` ( CREATE TABLE `select_npc_token` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`owner` INT(11) NOT NULL, `owner` INT(11) NOT NULL,
`valid_until` DATETIME NOT NULL, `valid_until` DATETIME NOT NULL,
`pick_more_from` DATETIME NOT NULL, `pick_more_from` DATETIME NOT NULL,
`pick_result` TEXT NOT NULL CHECK (json_valid(`pick_result`)), `pick_result` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`nonce` INT(11) NOT NULL, `nonce` INT(11) NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `owner` (`owner`), UNIQUE INDEX `owner` (`owner`),
INDEX `valid_until` (`valid_until`) INDEX `valid_until` (`valid_until`),
) CONSTRAINT `json` CHECK (json_valid(`pick_result`))
DEFAULT CHARSET=utf8mb4 ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
ENGINE=Aria; ##############################
##
###### ##############################
#
CREATE TABLE `select_pool` ( CREATE TABLE `select_pool` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`unique_name` VARCHAR(20) NOT NULL, `unique_name` VARCHAR(20) NOT NULL,
@@ -593,36 +579,32 @@ CREATE TABLE `select_pool` (
UNIQUE INDEX `general_id` (`general_id`), UNIQUE INDEX `general_id` (`general_id`),
INDEX `owner` (`owner`), INDEX `owner` (`owner`),
INDEX `reserved_until` (`reserved_until`, `general_id`) INDEX `reserved_until` (`reserved_until`, `general_id`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
COLLATE='utf8mb4_general_ci' ##############################
ENGINE=Aria ## KV storage
; ##############################
###################
# KV storage
###################
CREATE TABLE IF NOT EXISTS `storage` ( CREATE TABLE IF NOT EXISTS `storage` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`namespace` VARCHAR(40) NOT NULL, `namespace` VARCHAR(40) NOT NULL,
`key` VARCHAR(40) NOT NULL, `key` VARCHAR(40) NOT NULL,
`value` LONGTEXT NOT NULL CHECK (json_valid(`value`)), `value` LONGTEXT NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `key` (`namespace`, `key`) UNIQUE INDEX `key` (`namespace`, `key`),
) CONSTRAINT `json` CHECK (json_valid(`value`))
COLLATE='utf8mb4_general_ci' ) COLLATE = 'utf8mb4_bin' ENGINE = Aria;
ENGINE=Aria;
CREATE TABLE IF NOT EXISTS `nation_env` ( CREATE TABLE IF NOT EXISTS `nation_env` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`namespace` INT(11) NOT NULL, #storage와 ! `namespace` INT(11) NOT NULL,
##storage와 !
`key` VARCHAR(40) NOT NULL, `key` VARCHAR(40) NOT NULL,
`value` LONGTEXT NOT NULL CHECK (json_valid(`value`)), `value` LONGTEXT NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `key` (`namespace`, `key`) UNIQUE INDEX `key` (`namespace`, `key`),
) CONSTRAINT `json` CHECK (json_valid(`value`))
COLLATE='utf8mb4_general_ci' ) COLLATE = 'utf8mb4_bin' ENGINE = Aria;
ENGINE=Aria; ##############################
##
##############################
CREATE TABLE IF NOT EXISTS `betting` ( CREATE TABLE IF NOT EXISTS `betting` (
`general_id` INT(11) NOT NULL, `general_id` INT(11) NOT NULL,
`bet0` INT(11) NOT NULL DEFAULT 0, `bet0` INT(11) NOT NULL DEFAULT 0,
@@ -642,9 +624,10 @@ CREATE TABLE IF NOT EXISTS `betting` (
`bet14` INT(11) NOT NULL DEFAULT 0, `bet14` INT(11) NOT NULL DEFAULT 0,
`bet15` INT(11) NOT NULL DEFAULT 0, `bet15` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`general_id`) PRIMARY KEY (`general_id`)
) ) ENGINE = Aria;
ENGINE=Aria; ##############################
##
##############################
CREATE TABLE `rank_data` ( CREATE TABLE `rank_data` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`nation_id` INT(11) NOT NULL DEFAULT 0, `nation_id` INT(11) NOT NULL DEFAULT 0,
@@ -655,11 +638,10 @@ CREATE TABLE `rank_data` (
UNIQUE INDEX `by_general` (`general_id`, `type`), UNIQUE INDEX `by_general` (`general_id`, `type`),
INDEX `by_type` (`type`, `value`), INDEX `by_type` (`type`, `value`),
INDEX `by_nation` (`nation_id`, `type`, `value`) INDEX `by_nation` (`nation_id`, `type`, `value`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
COLLATE='utf8mb4_general_ci' ##############################
ENGINE=Aria ##
; ##############################
CREATE TABLE IF NOT EXISTS `user_record` ( CREATE TABLE IF NOT EXISTS `user_record` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL, `user_id` INT(11) NOT NULL,
@@ -670,29 +652,32 @@ CREATE TABLE IF NOT EXISTS `user_record` (
`date` DATETIME NULL DEFAULT NULL, `date` DATETIME NULL DEFAULT NULL,
`text` TEXT NOT NULL, `text` TEXT NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `date1` (`user_id`, `server_id`, `log_type`, `year`, `month`, `id`), INDEX `date1` (
`user_id`,
`server_id`,
`log_type`,
`year`,
`month`,
`id`
),
INDEX `date2` (`user_id`, `server_id`, `log_type`, `date`, `id`), INDEX `date2` (`user_id`, `server_id`, `log_type`, `date`, `id`),
INDEX `date3` (`server_id`, `date`), INDEX `date3` (`server_id`, `date`),
INDEX `date4` (`server_id`, `year`, `month`, `date`), INDEX `date4` (`server_id`, `year`, `month`, `date`),
INDEX `plain` (`user_id`, `log_type`, `id`) INDEX `plain` (`user_id`, `log_type`, `id`)
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4 ##############################
ENGINE=Aria ##
; ##############################
CREATE TABLE `ng_betting` ( CREATE TABLE `ng_betting` (
`id` INT(11) NOT NULL AUTO_INCREMENT, `id` INT(11) NOT NULL AUTO_INCREMENT,
`betting_id` INT(11) NOT NULL, `betting_id` INT(11) NOT NULL,
`general_id` INT(11) NOT NULL, `general_id` INT(11) NOT NULL,
`user_id` INT(11) NULL DEFAULT NULL, `user_id` INT(11) NULL DEFAULT NULL,
`betting_type` VARCHAR(100) NOT NULL COMMENT 'JSON', `betting_type` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_bin',
`amount` INT(11) NOT NULL, `amount` INT(11) NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE INDEX `by_general` (`general_id`, `betting_id`, `betting_type`), UNIQUE INDEX `by_general` (`general_id`, `betting_id`, `betting_type`),
UNIQUE INDEX `by_bet` (`betting_id`, `betting_type`, `general_id`), UNIQUE INDEX `by_bet` (`betting_id`, `betting_type`, `general_id`),
INDEX `by_user` (`user_id`, `betting_id`, `betting_type`), INDEX `by_user` (`user_id`, `betting_id`, `betting_type`),
CONSTRAINT `type_json` CHECK (json_valid(`betting_type`)) CONSTRAINT `json` CHECK (json_valid(`betting_type`))
) ) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
DEFAULT CHARSET=utf8mb4
ENGINE=Aria
;
+2 -2
View File
@@ -7,7 +7,7 @@
<?=$btnBegin??''?><a href='v_chiefCenter.php' class='commandButton <?= $showSecret ? '' : 'disabled' ?> <?=$btnClass??""?>'>사 령 부</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='v_chiefCenter.php' class='commandButton <?= $showSecret ? '' : 'disabled' ?> <?=$btnClass??""?>'>사 령 부</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='v_NPCControl.php' class='commandButton <?= $showSecret ? '' : 'disabled' ?> <?=$btnClass??""?>'>NPC 정책</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='v_NPCControl.php' class='commandButton <?= $showSecret ? '' : 'disabled' ?> <?=$btnClass??""?>'>NPC 정책</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_genList.php' target='_blank' class='open-window commandButton <?=$btnClass??""?> <?= $showSecret ? '' : 'disabled' ?>'>암 행 부</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_genList.php' target='_blank' class='open-window commandButton <?=$btnClass??""?> <?= $showSecret ? '' : 'disabled' ?>'>암 행 부</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_tournament.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>토 너 먼 트</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_tournament.php' target='_blank' class='open-window <?=$btnClassForTournament??""?>'>토 너 먼 트</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_myKingdomInfo.php' class='commandButton <?=$btnClass??""?> <?= $meLevel >= 1 ? '' : 'disabled' ?>'>세력 정보</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_myKingdomInfo.php' class='commandButton <?=$btnClass??""?> <?= $meLevel >= 1 ? '' : 'disabled' ?>'>세력 정보</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_myCityInfo.php' class='commandButton <?=$btnClass??""?> <?= ($meLevel >= 1 && $nationLevel >= 1) ? '' : 'disabled' ?>'>세력 도시</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_myCityInfo.php' class='commandButton <?=$btnClass??""?> <?= ($meLevel >= 1 && $nationLevel >= 1) ? '' : 'disabled' ?>'>세력 도시</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_myGenInfo.php' class='commandButton <?=$btnClass??""?> <?= $meLevel >= 1 ? '' : 'disabled' ?>'>세력 장수</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_myGenInfo.php' class='commandButton <?=$btnClass??""?> <?= $meLevel >= 1 ? '' : 'disabled' ?>'>세력 장수</a><?=$btnEnd??''?>
@@ -17,4 +17,4 @@
<?=$btnBegin??''?><a href='v_inheritPoint.php' class='commandButton <?=$btnClass??""?>'>유산 관리</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='v_inheritPoint.php' class='commandButton <?=$btnClass??""?>'>유산 관리</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_myPage.php' class='commandButton <?=$btnClass??""?>'>내 정보&amp;설정</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_myPage.php' class='commandButton <?=$btnClass??""?>'>내 정보&amp;설정</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_auction.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>거 래 장</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_auction.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>거 래 장</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_betting.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>베 팅 장</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_betting.php' target='_blank' class='open-window <?=$btnClassForBetting??""?>'>베 팅 장</a><?=$btnEnd??''?>
+7
View File
@@ -0,0 +1,7 @@
import { assert } from 'chai';
describe('hello', ()=>{
it('hello1', ()=>{
assert.equal(2, 1+1);
});
});
+370
View File
@@ -0,0 +1,370 @@
import chai, { assert } from 'chai';
import chaiBytes from 'chai-bytes';
import { bufferByteSize, LiteHashDRBG } from '../ts/util/LiteHashDRBG';
import { RandUtil } from '../ts/util/RandUtil';
import { convertBytesLikeToArrayBuffer } from '../ts/util/convertBytesLikeToArrayBuffer';
import { convertBytesLikeToUint8Array as toBytes } from '../ts/util/convertBytesLikeToUint8Array';
import _ from 'lodash';
chai.use(chaiBytes);
type Bytes = ArrayBuffer | DataView | Uint8Array;
type MaybeBytes = Bytes | string;
function fillBlock(body: MaybeBytes, filler: MaybeBytes = '\0', length = bufferByteSize): Uint8Array {
const u8Body = toBytes(body);
const u8Filler = toBytes(filler, false);
if (u8Filler.byteLength < 1) {
throw new Error('filler must have length');
}
const buffer = new Uint8Array(length);
buffer.set(u8Body, 0);
let bufferIdx = u8Body.byteLength;
while (bufferIdx + u8Filler.byteLength < length) {
buffer.set(u8Filler, bufferIdx);
bufferIdx += u8Filler.byteLength;
}
if (bufferIdx < length) {
const slice = new Uint8Array(u8Filler.buffer, u8Filler.byteOffset, length - bufferIdx);
buffer.set(slice, bufferIdx);
}
return buffer;
}
class DummyBlockRNG extends LiteHashDRBG {
private repeatBlockCnt: number;
private repeatBlock: ArrayBuffer[];
public constructor(repeatBlock: MaybeBytes[], stateIdx = 0) {
super('x');
this.repeatBlock = [];
for (const rawBlock of repeatBlock) {
const block = convertBytesLikeToArrayBuffer(rawBlock);
if (block.byteLength !== bufferByteSize) {
throw new Error;
}
this.repeatBlock.push(block);
}
this.repeatBlockCnt = this.repeatBlock.length;
this.stateIdx = stateIdx;
this.bufferIdx = 0;
this.genNextBlock();
}
protected genNextBlock() {
if (!this.repeatBlock) {
return;
}
this.buffer = this.repeatBlock[this.stateIdx];
this.bufferIdx = 0;
this.stateIdx = (this.stateIdx + 1) % this.repeatBlockCnt;
}
}
const fixedKey = 'HelloWorld';
describe('RNGtestDummy', () => {
const rng = new DummyBlockRNG([
fillBlock('', "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff")
]);
it('BasicConvert', () => {
assert.equal(toBytes("\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff", false).length, 16);
});
it('SimpleByte', () => {
assert.equalBytes(toBytes("\x00", false), rng.nextBytes(1), 'b1');
assert.equalBytes(toBytes("\x11\x22", false), rng.nextBytes(2), 'b2');
assert.equalBytes(toBytes("\x33\x44\x55", false), rng.nextBytes(3), 'b3');
assert.equalBytes(toBytes("\x66\x77\x88\x99", false), rng.nextBytes(4), 'b4');
});
it('OverflowBlock', () => {
for (const idx in _.range(16)) {
assert.equalBytes(
toBytes("\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", false),
rng.nextBytes(16)
);
}
});
it('MultiBlock', () => {
assert.equalBytes(
fillBlock('', "\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", bufferByteSize * 2),
rng.nextBytes(bufferByteSize * 2)
);
});
it('bitTest', () => {
assert.equalBytes(toBytes("\x00", false), rng.nextBits(1)); //aa
assert.equalBytes(toBytes("\x01", false), rng.nextBits(1)); //bb
assert.equalBytes(toBytes("\xcc", false), rng.nextBits(8)); //cc
assert.equalBytes(toBytes("\xdd\x02", false), rng.nextBits(10)); //ddee
assert.equalBytes(toBytes("\x7f", false), rng.nextBits(7)); //ff
assert.equalBytes(toBytes("\x00\x11\x22\x33\x44\x55\x06", false), rng.nextBits(53));
});
it('int', () => {
assert.equal(0x77, rng.nextInt(0xff));
assert.equal(0x9988, rng.nextInt((1 << 16) - 1));
assert.equal(0xddccbbaa, rng.nextInt(0xffffffff));
assert.equal(0x0433221100ffee, rng.nextInt());
assert.equal(0x05, rng.nextInt(0x0f)); //55
assert.equal(0x06, rng.nextInt(0x12)); //66
assert.equal(0x08, rng.nextInt(99)); //77(119 -> 7bit) -> 88(136 -> 8bit -> 8)
assert.equal(0x99, rng.nextInt(0x99)); //99
assert.equal(0xaa, rng.nextInt(0xaa)); //aa (fit Max)
});
it('float', () => {
const floatMax = 2 ** 53;
const fa = rng.nextFloat1();
assert.equal(0x1100ffeeddccbb / floatMax, fa);
assert.isTrue(0.5313720384 > fa);
assert.isTrue(0.5313720383 < fa);
const fb = rng.nextFloat1();
assert.equal(0x08776655443322 / floatMax, fb);
});
});
describe('RandUtilDummy', () => {
it('shuffle', () => {
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
const randUtil = new RandUtil(rng);
/**
* 7, [7,1,2,3,4,5,6,0]
* 6, [7,0,2,3,4,5,6,1]
* 5, [7,0,1,3,4,5,6,2]
* 4, [7,0,1,2,4,5,6,3]
* 3, [7,0,1,2,3,5,6,4]
* 2, [7,0,1,2,3,4,6,5]
* 1, [7,0,1,2,3,4,5,6]
*/
assert.deepEqual(
randUtil.shuffle(Array.from(_.range(8))),
[7, 0, 1, 2, 3, 4, 5, 6]
);
/**
* 0, [0,1,2,3,4,5,6,7,8,9]
* 7, [0,8,2,3,4,5,6,7,1,9]
* 6, [0,8,1,3,4,5,6,7,2,9]
* 5, [0,8,1,2,4,5,6,7,3,9]
* 4, [0,8,1,2,3,5,6,7,4,9]
* 3, [0,8,1,2,3,4,6,7,5,9]
* 2, [0,8,1,2,3,4,5,7,6,9]
* 1, [0,8,1,2,3,4,5,6,7,9]
* 0, [0,8,1,2,3,4,5,6,7,9]
*/
assert.deepEqual(
randUtil.shuffle(Array.from(_.range(10))),
[0, 8, 1, 2, 3, 4, 5, 6, 7, 9]
);
});
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
const randUtil = new RandUtil(rng);
it('choice', () => {
//0x17(7), 0x16(6)
assert.equal(randUtil.choice([0, 1, 2, 3, 4, 5]), 5);
//0x15(5), Set 순서 유지
assert.equal(randUtil.choice(new Set([5, 3, 1, 2, 8, 0])), 8);
//0x14(4), 정렬 순서상 숫자(소-대) > 문자열(삽입순) > 심볼 순서
assert.equal(randUtil.choice({ c: 'c', a: 'a', b: 'b', 4: 'x', 2: 't', '3': 'q' }), 'c');
});
it('choiceUsingWeight', () => {
//0.6275740099377194 * 38.1 = 23.91
assert.equal(randUtil.choiceUsingWeight({
a: 0.1,
b: 10,
tt: 2,
x: -1,
c: 20,
d: 0,
e: 6
}), 'c');
//0.658946544056166
assert.equal(randUtil.choiceUsingWeightPair([
['xx', 10],
]), 'xx');
//0.6903152783785083 * 27.3 = 18.84560709973328
assert.equal(randUtil.choiceUsingWeightPair([
['e', 10],
['d', 4],
['c', 0.1],
['baba', 0.2],
['q', 9],
['xt', 4]
]), 'q');
});
});
describe('RNGexpectedError', () => {
const rng = new LiteHashDRBG(fixedKey);
it('nextBits0', () => {
assert.throw(() => rng.nextBits(0));
});
it('nextBits-1', () => {
assert.throw(() => rng.nextBits(-1));
});
it('nextBytes0', () => {
assert.throw(() => rng.nextBytes(0));
});
it('nextBytes-1', () => {
assert.throw(() => rng.nextBytes(-1));
});
const randUtil = new RandUtil(rng);
it('utilEmptyChoice', () => {
assert.throw(() => randUtil.choice([]));
});
it('utilEmptyChoiceUsingWeight', () => {
assert.throw(() => randUtil.choiceUsingWeight({}));
});
it('utilEmptyChoiceUsingWeightPair', () => {
assert.throw(() => randUtil.choiceUsingWeightPair([]));
});
});
describe('RNGAcceptable', () => {
const rng = new LiteHashDRBG(fixedKey);
it('RNG', () => {
rng.nextInt(0);
rng.nextInt(2 ** 53 - 1);
rng.nextBytes(65);
rng.nextBits(512);
});
const randUtil = new RandUtil(rng);
it('RandUtil', () => {
randUtil.choice([0, 0, 0]);
randUtil.choiceUsingWeight({
0: 0,
1: -1
});
randUtil.choiceUsingWeightPair([
[0, 0],
[1, 0],
[2, -2]
]);
randUtil.nextBool(1.1);
randUtil.nextBool(-0.1);
randUtil.shuffle([]);
randUtil.shuffle([1]);
randUtil.nextRange(0, 0);
randUtil.nextRangeInt(0, 0);
randUtil.nextRange(1, -1);
randUtil.nextRangeInt(1, -1);
})
it('RNGLong', () => {
const longKey = fixedKey;
for(const _a of _.range(8)){
longKey.concat(longKey);
}
const rngLong = new LiteHashDRBG(longKey);
for(const _a of _.range(10)){
rngLong.nextBytes(16);
}
})
});
/* Python TestVector
import hashlib
import struct
fixedKey = 'HelloWorld'.encode('utf-8')
def hash(key, idx):
idxV = struct.pack("<I", idx)
return hashlib.sha512(key + idxV).digest()
for idx in range(5):
print(hash(fixedKey, idx).hex())
*/
describe('RNG', () => {
//JS - PHP 일치 확인 정도로.
const testVector = Buffer.from([
'24d9ccd648556255fd0ee9f5b29918de90617341958b3b354d572167e4dee02b757816a2bbe0b502c52413ffd384381a9d7b4e193df6f4345d6a95e111d661c4',
'2e9264512f6f4b080cf1376b74fab6878ecf4a6e185942d2e5b22cf923885b9952d40601a414225d6901417fd4ce9368ac77e4a63d3fc9b58ab952bb8c33f165',
'8e2ebf5af6283a1b18f4c044c86c20d02be3890613c4cc8b7c6b7b35581263b972a82630df69a9289988422d7c3a9be5edf78d5de16fabd01e5dd4e458068d8a',
'398596047ba547bfe371ec863a3e019ab0dbc4bb3b27e9077685aae4283ff6bbccfd981d92f9358f7efffbb72a940414802d98466d132e2ad0a16a12946d5f47',
'b3606fe9b18c4aa7315e78bb9e47cb51cc4e203fcc2e631f0405c1b872c8e1cb5b6415ea74bbb77fffaaadb002b47cb4f4628dc0709634365b187667f5c708cb',
].join(''), 'hex');
it('bytes', ()=>{
const rng = new LiteHashDRBG(fixedKey);
let offset = 0;
assert.equalBytes(rng.nextBytes(10), testVector.slice(offset, offset + 10), '1');
offset += 10;
assert.equalBytes(rng.nextBytes(32), testVector.slice(offset, offset + 32), '2');
offset += 32;
assert.equalBytes(rng.nextBytes(1), testVector.slice(offset, offset + 1), '3');
offset += 1;
assert.equalBytes(rng.nextBytes(64), testVector.slice(offset, offset + 64), '4');
offset += 64;
assert.equalBytes(rng.nextBytes(5), testVector.slice(offset, offset + 5), '5');
offset += 5;
const lastA = rng.nextBytes(16, 18);
const lastB = new Uint8Array(18);
lastB.set(testVector.slice(offset, offset + 16));
assert.equalBytes(lastA, lastB);
});
it('bits', ()=>{
const rng = new LiteHashDRBG(fixedKey);
let offset = 0;
const testBits = [10, 4, 15, 32, 7, 99, 512, 1, 2, 3];
for(const bits of testBits){
const bytes = Math.ceil(bits / 8)
const A = rng.nextBits(bits);
const B = new Uint8Array(testVector.slice(offset, offset + bytes));
offset += bytes;
if(bits % 8 != 0){
const bitMask = 0xff >> (8 - (bits % 8));
B[bytes - 1] &= bitMask;
}
assert.equalBytes(A, B);
}
});
it('float', ()=>{
const rng = new LiteHashDRBG(fixedKey);
const rng2 = new DummyBlockRNG([
new Uint8Array(testVector.slice(bufferByteSize * 0, bufferByteSize * 1)),
new Uint8Array(testVector.slice(bufferByteSize * 1, bufferByteSize * 2)),
new Uint8Array(testVector.slice(bufferByteSize * 2, bufferByteSize * 3)),
new Uint8Array(testVector.slice(bufferByteSize * 3, bufferByteSize * 4)),
new Uint8Array(testVector.slice(bufferByteSize * 4, bufferByteSize * 5)),
]);
for(const idx of _.range(18)){
assert.equal(rng.nextFloat1(), rng2.nextFloat1(), `float${idx}`);
}
});
});
+3 -3
View File
@@ -260,7 +260,7 @@ function setupAdminForm() {
} }
}, },
} }
const validator = new JQValidateForm($('#db_form'), descriptor); const validator = new JQValidateForm($('#admin_form'), descriptor);
validator.installChangeHandler(); validator.installChangeHandler();
$('#admin_form').on('submit', async function (e) { $('#admin_form').on('submit', async function (e) {
@@ -278,7 +278,7 @@ function setupAdminForm() {
let result: InvalidResponse; let result: InvalidResponse;
try { try {
const response = await axios({ const response = await axios({
url: 'j_setup_db.php', url: 'j_create_admin.php',
method: 'post', method: 'post',
responseType: 'json', responseType: 'json',
data: convertFormData({ data: convertFormData({
@@ -299,7 +299,7 @@ function setupAdminForm() {
return; return;
} }
alert('RootDB.php가 생성되었습니다. 관리자 계정 생성을 진행합니다.'); alert('관리자 계정 생성되었습니다.');
await changeInstallMode(); await changeInstallMode();
}); });
} }
+2
View File
@@ -0,0 +1,2 @@
export type Bytes = ArrayBuffer | DataView | Uint8Array;
export type BytesLike = Bytes | string;
+232
View File
@@ -0,0 +1,232 @@
import { RNG } from "./RNG";
import { sha512 } from 'js-sha512';
import { convertBytesLikeToUint8Array } from "./convertBytesLikeToUint8Array";
import { BytesLike } from "./BytesLike";
const maxRngSupportBit = 53;
const maxInt = 0x1f_ffff_ffff_ffff; // NOTE: b 0, 10000110011, 11...11
const maxIntMore1 = 0x20_0000_0000_0000n; //NOTE: b 0, 10000110100, 00...00
const maxIntMore1f = Number(maxIntMore1);
export const bufferByteSize = 512 / 8; //SHA512
const intBitMapMask = new Map([
[0x1n, 1],
[0x3n, 2],
[0x7n, 3],
[0xfn, 4],
[0x1fn, 5],
[0x3fn, 6],
[0x7fn, 7],
[0xffn, 8],
[0x1ffn, 9],
[0x3ffn, 10],
[0x7ffn, 11],
[0xfffn, 12],
[0x1fffn, 13],
[0x3fffn, 14],
[0x7fffn, 15],
[0xffffn, 16],
[0x1ffffn, 17],
[0x3ffffn, 18],
[0x7ffffn, 19],
[0xfffffn, 20],
[0x1fffffn, 21],
[0x3fffffn, 22],
[0x7fffffn, 23],
[0xffffffn, 24],
[0x1ffffffn, 25],
[0x3ffffffn, 26],
[0x7ffffffn, 27],
[0xfffffffn, 28],
[0x1fffffffn, 29],
[0x3fffffffn, 30],
[0x7fffffffn, 31],
[0xffffffffn, 32],
[0x1ffffffffn, 33],
[0x3ffffffffn, 34],
[0x7ffffffffn, 35],
[0xfffffffffn, 36],
[0x1fffffffffn, 37],
[0x3fffffffffn, 38],
[0x7fffffffffn, 39],
[0xffffffffffn, 40],
[0x1ffffffffffn, 41],
[0x3ffffffffffn, 42],
[0x7ffffffffffn, 43],
[0xfffffffffffn, 44],
[0x1fffffffffffn, 45],
[0x3fffffffffffn, 46],
[0x7fffffffffffn, 47],
[0xffffffffffffn, 48],
[0x1ffffffffffffn, 49],
[0x3ffffffffffffn, 50],
[0x7ffffffffffffn, 51],
[0xfffffffffffffn, 52],
[0x1fffffffffffffn, 53],
]);
function calcBitMask(n: bigint): bigint {
n |= n >> 1n;
n |= n >> 2n;
n |= n >> 4n;
n |= n >> 8n;
n |= n >> 16n;
n |= n >> 32n;
return n;
}
export class LiteHashDRBG implements RNG {
protected buffer!: ArrayBuffer;
protected bufferIdx!: number;
protected hq: DataView;
protected hqIdxPos: number;
public constructor(protected seed: BytesLike, protected stateIdx = 0, bufferIdx = 0) {
if(bufferIdx < 0){
throw new Error(`bufferIdx ${bufferIdx} < 0`);
}
if(bufferIdx >= bufferByteSize){
throw new Error(`bufferidx ${bufferIdx} >= ${bufferByteSize}`);
}
if(stateIdx < 0){
throw new Error(`stateIdx ${stateIdx} < 0`);
}
const seedU8 = convertBytesLikeToUint8Array(seed);
const hqBuffer = new ArrayBuffer(seedU8.byteLength + 4);
const hqU8 = new Uint8Array(hqBuffer);
hqU8.set(seedU8, 0);
this.hq = new DataView(hqBuffer);
this.hqIdxPos = seedU8.byteLength;
this.genNextBlock();
this.bufferIdx = bufferIdx;
}
protected genNextBlock(): void {
this.hq.setUint32(this.hqIdxPos, this.stateIdx, true);
const digest = sha512.arrayBuffer(this.hq.buffer);
this.buffer = digest;
this.bufferIdx = 0;
this.stateIdx += 1;
}
public getMaxInt(): number {
return maxInt;
}
public nextBytes(bytes: number, baseBytes?: number): Uint8Array {
bytes |= 0;
if (bytes <= 0) {
throw new Error(`${bytes} <= 0`);
}
if (this.bufferIdx + bytes <= bufferByteSize) {
if(baseBytes === undefined || bytes >= baseBytes){
const result = this.buffer.slice(this.bufferIdx, this.bufferIdx + bytes);
this.bufferIdx += bytes;
if (this.bufferIdx === bufferByteSize) {
this.genNextBlock();
}
return new Uint8Array(result);
}
const resultBuffer = new ArrayBuffer(Math.max(bytes, baseBytes));
const result = new Uint8Array(resultBuffer);
result.set(new Uint8Array(this.buffer, this.bufferIdx, bytes));
this.bufferIdx += bytes;
if( this.bufferIdx === bufferByteSize){
this.genNextBlock();
}
return result;
}
const resultBuffer = new ArrayBuffer(baseBytes ? Math.max(bytes, baseBytes) : bytes);
const result = new Uint8Array(resultBuffer);
result.set(new Uint8Array(this.buffer, this.bufferIdx));
let offset = bufferByteSize - this.bufferIdx;
let remain = bytes - offset;
while (remain > bufferByteSize) {
this.genNextBlock();
result.set(new Uint8Array(this.buffer), offset);
offset += bufferByteSize;
remain -= bufferByteSize;
}
this.genNextBlock();
if (remain === 0) {
return result;
}
result.set(new Uint8Array(this.buffer, 0, remain), offset);
this.bufferIdx = remain;
return result;
}
public nextBits(bits: number, baseBytes?: number): Uint8Array {
bits |= 0;
const bytes = (bits + 7) >> 3;
const headBits = bits & 0x7;
const result = this.nextBytes(bytes, baseBytes);
if (headBits === 0) {
return result;
}
result[bytes - 1] &= 0xff >> (8 - headBits);
return result;
}
protected _nextInt(bits: number): bigint{
const buffer = this.nextBits(bits, 8);
const dataView = new DataView(buffer.buffer);
return dataView.getBigUint64(0, true);
}
public nextInt(max?: number): number {
if (max === undefined || max === maxInt) {
return Number(this._nextInt(maxRngSupportBit));
}
if (max > maxInt) {
throw new Error('Over max int');
}
if (max === 0) {
return 0;
}
if (max < 0) {
return -this.nextInt(-max);
}
const mask = calcBitMask(BigInt(max));
const bits = intBitMapMask.get(mask) as number;
let n = Number(this._nextInt(bits));
while (n > max){
n = Number(this._nextInt(bits));
}
return n;
}
public nextFloat1(): number {
// eslint-disable-next-line no-constant-condition
while(true){
const nInt = this._nextInt(maxRngSupportBit + 1);
if(nInt < maxIntMore1){
return Number(nInt) / maxIntMore1f;
}
if(nInt === maxIntMore1){
return 1;
}
}
}
public static build(seed: BytesLike, stateIdx = 0): LiteHashDRBG{
return new LiteHashDRBG(seed, stateIdx);
}
}
+13
View File
@@ -0,0 +1,13 @@
export interface RNG {
/**
* nextInt()
*/
getMaxInt(): number;
nextBytes(bytes: number): Uint8Array;
nextBits(bits: number): Uint8Array;
nextInt(max?: number): number;
nextFloat1(): number;
}
+138
View File
@@ -0,0 +1,138 @@
import { RNG } from './RNG';
export class RandUtil {
constructor(protected rng: RNG) {
}
public nextFloat1(): number {
return this.rng.nextFloat1();
}
public nextRange(min: number, max: number): number {
const range = max - min;
return this.nextFloat1() * (range) + min;
}
public nextRangeInt(min: number, max: number): number {
const range = max - min;
return this.rng.nextInt(range) + min;
}
public nextInt(max?: number): number {
return this.rng.nextInt(max);
}
public nextBit(): boolean {
const view = new DataView(this.rng.nextBits(1));
return view.getUint8(0) != 0;
}
public nextBool(prob = 0.5): boolean {
if (prob >= 1) {
return true;
}
return this.nextFloat1() < prob;
}
public shuffle<T>(srcArray: T[]): T[] {
const cnt = srcArray.length;
if(cnt === 0){
return [];
}
if (cnt > this.rng.getMaxInt()) {
throw 'Invalid random int range';
}
const result: T[] = Array.from(srcArray);
for (let srcIdx = 0; srcIdx < cnt; srcIdx += 1) {
const destIdx = this.rng.nextInt(cnt - srcIdx - 1) + srcIdx;
if(srcIdx === destIdx){
continue;
}
[result[srcIdx], result[destIdx]] = [result[destIdx], result[srcIdx]];
}
return result;
}
//Object는 integer key에 예외가 있어 shuffleAssoc은 없음
public choice<T>(items: T[] | Record<string | number, T> | Set<T>): T {
if (items instanceof Array) {
if(items.length === 0){
throw new Error('Empty items');
}
const idx = this.rng.nextInt(items.length - 1);
return items[idx];
}
if (items instanceof Set) {
return this.choice(Array.from(items.values()));
}
return items[this.choice(Array.from(Object.keys(items)))];
}
public choiceUsingWeight(items: Record<string | number, number>): string | number {
if(Object.keys(items).length === 0){
throw new Error('Empty items');
}
let sum = 0;
for (const value of Object.values(items)) {
if (value <= 0) {
continue;
}
sum += value;
}
let rd = this.nextFloat1() * sum;
for (const [item, value] of Object.entries(items)) {
if (value <= 0) {
if (rd <= 0) {
return item;
}
continue;
}
if (rd <= value) {
return item;
}
rd -= value;
}
throw new Error('Unreacheable');
}
public choiceUsingWeightPair<T>(items: [T, number][]): T {
if(items.length === 0){
throw new Error('Empty items');
}
let sum = 0;
for (const [, value] of items) {
if (value <= 0) {
continue;
}
sum += value;
}
let rd = this.nextFloat1() * sum;
for (const [item, value] of items) {
if (value <= 0) {
if (rd <= 0) {
return item;
}
continue;
}
if (rd <= value) {
return item;
}
rd -= value;
}
throw new Error('Unreacheable');
}
}
+2 -5
View File
@@ -16,13 +16,10 @@ export async function callSammoAPI<ResultType extends ValidResponse, ErrorType e
} }
const response = await axios({ const response = await axios({
url: "api.php", url: `api.php?path=${path}`,
method: "post", method: "post",
responseType: "json", responseType: "json",
data: { data: args
path,
args,
},
}); });
const result: ErrorType | ResultType = response.data; const result: ErrorType | ResultType = response.data;
if (!result.result) { if (!result.result) {
@@ -0,0 +1,17 @@
import { BytesLike } from "./BytesLike";
export function convertBytesLikeToArrayBuffer(data: BytesLike, encodeUTF8 = true): ArrayBuffer{
if (data instanceof ArrayBuffer) {
return data;
}
if (data instanceof Uint8Array) {
return data.buffer;
}
if (typeof(data) === 'string'){
if(encodeUTF8){
return (new TextEncoder()).encode(data);
}
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
}
return data.buffer;
}
@@ -0,0 +1,17 @@
import { BytesLike } from "./BytesLike";
export function convertBytesLikeToUint8Array(data: BytesLike, encodeUTF8 = true): Uint8Array {
if (data instanceof Uint8Array) {
return data;
}
if (data instanceof ArrayBuffer) {
return new Uint8Array(data);
}
if (typeof (data) === 'string') {
if(encodeUTF8){
return (new TextEncoder()).encode(data);
}
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
}
return new Uint8Array(data.buffer);
}
+4
View File
@@ -2,6 +2,10 @@
namespace sammo; namespace sammo;
if (!file_exists(__DIR__ . '/vendor/autoload.php')){
header('Location:install.php');
die();
}
require(__DIR__ . '/vendor/autoload.php'); require(__DIR__ . '/vendor/autoload.php');
if (!class_exists('\\sammo\\RootDB')) { if (!class_exists('\\sammo\\RootDB')) {
+107 -22
View File
@@ -3,27 +3,39 @@ namespace sammo;
set_time_limit(600); set_time_limit(600);
function tryNpmInstall()
class Json
{ {
$npmResultPath = 'npm_recent.json.log'; /** @return never */
$packageJsonPath = 'package.json'; public static function die($value)
$packageJsonLockPath = 'package-lock.json'; {
if (!headers_sent()) {
header('Expires: Wed, 01 Jan 2014 00:00:00 GMT');
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
}
header('Content-Type: application/json');
die(json_encode($value));
}
}
function tryComposerInstall()
{
$resultPath = 'composer_result.json.log';
$lockPath = 'composer.lock';
$runCode = "php composer.phar install";
$packageJsonHash = hash_file('sha512', $packageJsonPath);
$timestamp = time(); $timestamp = time();
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) { if (file_exists($resultPath) && file_exists($lockPath)) {
do { do {
$result = json_decode(file_get_contents($npmResultPath)); $result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->packageJsonHash; $oldJsonHash = $result->lockHash;
$oldTimestamp = $result->updateTimestamp; $lockHash = hash_file('sha512', $lockPath);
//1. package.json 파일이 다르면 업데이트. if ($lockHash != $oldJsonHash) {
if ($packageJsonHash != $oldJsonHash) {
break;
}
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
if($oldTimestamp + 60*60*24*14 < $timestamp){
break; break;
} }
@@ -32,32 +44,105 @@ function tryNpmInstall()
} while (0); } while (0);
} }
exec("npm install", $output, $result_code); exec($runCode, $output, $result_code);
if ($result_code != 0) { if ($result_code != 0) {
Json::die([ Json::die([
'result' => false, 'result' => false,
'reason' => $output 'reason' => $output,
'state' => 'composer',
]); ]);
} }
file_put_contents($npmResultPath, json_encode([ if (!file_exists($lockPath)){
'packageJsonHash'=>$packageJsonHash, Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp, 'updateTimestamp'=>$timestamp,
])); ]));
return true; return true;
} }
function tryNpmInstall()
{
$resultPath = 'npm_recent.json.log';
$lockPath = 'package-lock.json';
$runCode = "npm ci";
$runAltCode = "npm install";
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
if ($lockHash != $oldJsonHash) {
break;
}
//그것도 아니라면 업데이트하지 않겠다.
return false;
} while (0);
}
if(file_exists($lockPath)){
exec($runCode, $output, $result_code);
}
else{
exec($runAltCode, $output, $result_code);
}
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output,
'state' => 'npm ci',
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
]));
return true;
}
function genJS() function genJS()
{ {
$command = "./node_modules/.bin/webpack build"; $command = sprintf("./node_modules/.bin/webpack build --env target=gateway");
exec(($command), $output, $result_code); exec(($command), $output, $result_code);
if ($result_code != 0) { if ($result_code != 0) {
Json::die([ Json::die([
'result' => false, 'result' => false,
'reason' => $output 'reason' => $output,
'state' => 'webpack build',
]); ]);
} }
} }
if(tryComposerInstall()){
header('location:install.php');
die();
}
if(tryNpmInstall()){ if(tryNpmInstall()){
genJS(); genJS();
} }
+80 -22
View File
@@ -66,27 +66,20 @@ function genJS($server)
} }
} }
function tryNpmInstall() function tryComposerInstall()
{ {
$npmResultPath = './npm_recent.json.log'; $resultPath = 'composer_result.json.log';
$packageJsonPath = './package.json'; $lockPath = 'composer.lock';
$packageJsonLockPath = './package-lock.json'; $runCode = "php composer.phar install";
$packageJsonHash = hash_file('sha512', $packageJsonPath);
$timestamp = time(); $timestamp = time();
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) { if (file_exists($resultPath) && file_exists($lockPath)) {
do { do {
$result = json_decode(file_get_contents($npmResultPath)); $result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->packageJsonHash; $oldJsonHash = $result->lockHash;
$oldTimestamp = $result->updateTimestamp; $lockHash = hash_file('sha512', $lockPath);
//1. package.json 파일이 다르면 업데이트. if ($lockHash != $oldJsonHash) {
if ($packageJsonHash != $oldJsonHash) {
break;
}
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
if ($oldTimestamp + 60 * 60 * 24 * 14 < $timestamp) {
break; break;
} }
@@ -95,7 +88,7 @@ function tryNpmInstall()
} while (0); } while (0);
} }
exec("npm install", $output, $result_code); exec($runCode, $output, $result_code);
if ($result_code != 0) { if ($result_code != 0) {
Json::die([ Json::die([
'result' => false, 'result' => false,
@@ -103,16 +96,80 @@ function tryNpmInstall()
]); ]);
} }
file_put_contents($npmResultPath, json_encode([ if (!file_exists($lockPath)){
'packageJsonHash' => $packageJsonHash, Json::die([
'updateTimestamp' => $timestamp, 'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
])); ]));
return true; return true;
} }
//묻고 따지지 않고 일단 npm install은 시도한다.
function tryNpmInstall()
{
$resultPath = 'npm_recent.json.log';
$lockPath = 'package-lock.json';
$runCode = "npm ci";
$runAltCode = "npm install";
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
if ($lockHash != $oldJsonHash) {
break;
}
//그것도 아니라면 업데이트하지 않겠다.
return false;
} while (0);
}
if(file_exists($lockPath)){
exec($runCode, $output, $result_code);
}
else{
exec($runAltCode, $output, $result_code);
}
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
]));
return true;
}
//묻고 따지지 않고 일단 composer install, npm install은 시도한다.
//hwe 업데이트인 경우에만 한번 더 부른다. //hwe 업데이트인 경우에만 한번 더 부른다.
tryComposerInstall();
if (tryNpmInstall()) { if (tryNpmInstall()) {
genJS(Util::array_last_key(ServConfig::getServerList())); genJS(Util::array_last_key(ServConfig::getServerList()));
} }
@@ -268,7 +325,8 @@ if ($server == $baseServerName) {
])); ]));
} }
//git 업데이트했는데, package.json이 바뀌면 곤란하니까 //git 업데이트했는데, package 바뀌면 곤란하니까
tryComposerInstall();
tryNpmInstall(); tryNpmInstall();
genJS($server); genJS($server);
+9 -7
View File
@@ -138,12 +138,13 @@ if (!$userInfo) {
'aux' => $session->tmpx, 'aux' => $session->tmpx,
]); ]);
} }
$userID = $userInfo['no'];
if ($userInfo['delete_after']) { if ($userInfo['delete_after']) {
if ($userInfo['delete_after'] < $now) { if ($userInfo['delete_after'] < $now) {
$restAPI->unlink(); $restAPI->unlink();
$session->access_token = null; $session->access_token = null;
$RootDB->delete('member', 'no=%i', $userInfo['no']); $RootDB->delete('member', 'no=%i', $userID);
Json::die([ Json::die([
'result' => false, 'result' => false,
'reqOTP' => false, 'reqOTP' => false,
@@ -170,20 +171,20 @@ if ($refresh_token) {
RootDB::db()->update('member', [ RootDB::db()->update('member', [
'oauth_info' => Json::encode($oauthInfo) 'oauth_info' => Json::encode($oauthInfo)
], 'no=%i', $userInfo['no']); ], 'no=%i', $userID);
$tokenValidUntil = $userInfo['token_valid_until']; $tokenValidUntil = $userInfo['token_valid_until'];
if (!$tokenValidUntil || $tokenValidUntil < $now) { if (!$tokenValidUntil || $tokenValidUntil < $now) {
if (!createOTPbyUserNO($userInfo['no'])) { if (!createOTPbyUserNO($userID)) {
Json::die([ Json::die([
'result' => false, 'result' => false,
'reqOTP' => false, 'reqOTP' => false,
'reason' => '인증 코드를 보내는데 실패했습니다.' 'reason' => '인증 코드를 보내는데 실패했습니다.'
]); ]);
} }
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}')); $session->login($userID, $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
Json::die([ Json::die([
'result' => false, 'result' => false,
'reqOTP' => true, 'reqOTP' => true,
@@ -192,8 +193,9 @@ if (!$tokenValidUntil || $tokenValidUntil < $now) {
} }
$RootDB->insert('member_log', [ $RootDB->insert('member_log', [
'member_no' => $userInfo['no'], 'member_no' => $userID,
'action_type' => 'login', 'action_type' => 'login',
'action' => Json::encode([ 'action' => Json::encode([
'ip' => Util::get_client_ip(true), 'ip' => Util::get_client_ip(true),
@@ -225,7 +227,7 @@ $RootDB->query(
); );
$token = Util::randomStr(20); $token = Util::randomStr(20);
$RootDB->insert('login_token', [ $RootDB->insert('login_token', [
'user_id' => $userInfo['no'], 'user_id' => $userID,
'base_token' => $token, 'base_token' => $token,
'reg_ip' => Util::get_client_ip(true), 'reg_ip' => Util::get_client_ip(true),
'reg_date' => $nowDate, 'reg_date' => $nowDate,
@@ -233,7 +235,7 @@ $RootDB->insert('login_token', [
]); ]);
$tokenID = $RootDB->insertId(); $tokenID = $RootDB->insertId();
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}')); $session->login($userID, $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
+16227
View File
File diff suppressed because it is too large Load Diff
+50 -43
View File
@@ -4,7 +4,9 @@
"description": "", "description": "",
"main": "js/index.js", "main": "js/index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "npm-run-all test-php-gateway test-ts",
"test-php-gateway": "vendor/bin/phpunit --bootstrap vendor/autoload.php tests",
"test-ts": "mocha",
"build": "webpack", "build": "webpack",
"buildDev": "webpack --mode=development", "buildDev": "webpack --mode=development",
"watch": "webpack watch --mode=development", "watch": "webpack watch --mode=development",
@@ -20,7 +22,11 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.2", "@babel/cli": "^7.17.6",
"@babel/core": "^7.17.5",
"@babel/preset-env": "^7.16.11",
"@babel/preset-typescript": "^7.16.7",
"@popperjs/core": "^2.11.3",
"@tiptap/extension-color": "^2.0.0-beta.9", "@tiptap/extension-color": "^2.0.0-beta.9",
"@tiptap/extension-image": "^2.0.0-beta.27", "@tiptap/extension-image": "^2.0.0-beta.27",
"@tiptap/extension-link": "^2.0.0-beta.36", "@tiptap/extension-link": "^2.0.0-beta.36",
@@ -30,70 +36,71 @@
"@tiptap/starter-kit": "^2.0.0-beta.183", "@tiptap/starter-kit": "^2.0.0-beta.183",
"@tiptap/vue-3": "^2.0.0-beta.90", "@tiptap/vue-3": "^2.0.0-beta.90",
"@types/bootstrap": "^5.1.9", "@types/bootstrap": "^5.1.9",
"@types/chai": "^4.3.0",
"@types/downloadjs": "^1.4.3", "@types/downloadjs": "^1.4.3",
"@types/jquery": "^3.5.14",
"@types/linkifyjs": "^2.1.4", "@types/linkifyjs": "^2.1.4",
"@types/lodash": "^4.14.179",
"@types/mocha": "^9.1.0",
"@types/node": "^17.0.21",
"@types/react": "file:hwe/ts/@types/types__react",
"@types/select2": "^4.0.55", "@types/select2": "^4.0.55",
"@types/uuid": "^8.3.4", "@types/uuid": "^8.3.4",
"@typescript-eslint/eslint-plugin": "^5.14.0",
"@typescript-eslint/parser": "^5.14.0",
"@vue/compiler-sfc": "^3.2.31",
"@vue/eslint-config-typescript": "^10.0.0",
"async-validator": "^4.0.7", "async-validator": "^4.0.7",
"axios": "^0.26.0", "autoprefixer": "^10.4.2",
"axios": "^0.26.1",
"babel-plugin-lodash": "^3.3.4",
"babel-preset-modern-browsers": "^15.0.2",
"bootstrap": "^5.1.3", "bootstrap": "^5.1.3",
"bootstrap-vue-3": "^0.1.6", "bootstrap-vue-3": "=0.1.6",
"bootswatch": "^5.1.3",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"chai": "^4.3.6",
"chai-bytes": "^0.1.2",
"clean-terminal-webpack-plugin": "^3.0.0",
"core-js": "^3.21.1", "core-js": "^3.21.1",
"css-loader": "^6.7.1",
"cssnano": "^5.1.3",
"date-fns": "^2.28.0", "date-fns": "^2.28.0",
"downloadjs": "^1.4.7", "downloadjs": "^1.4.7",
"esbuild-loader": "^2.18.0",
"eslint": "^8.11.0",
"eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-vue": "^8.5.0",
"file-loader": "^6.2.0",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"js-sha512": "^0.8.0", "js-sha512": "^0.8.0",
"linkifyjs": "^3.0", "linkifyjs": "^3.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"query-string": "^7.1.1", "mini-css-extract-plugin": "^2.6.0",
"select2": "^4.0", "mocha": "^9.2.2",
"uuid": "^8.3.2", "npm-run-all": "^4.1.5",
"vue": "^3.2.31", "postcss-discard-duplicates": "^5.1.0",
"vue-multiselect": "^3.0.0-alpha.2",
"vue-types": "^4.1.1",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@babel/cli": "^7.17.3",
"@babel/core": "^7.17.5",
"@babel/preset-env": "^7.16.11",
"@babel/preset-typescript": "^7.16.7",
"@types/jquery": "^3.5.13",
"@types/lodash": "^4.14.178",
"@types/node": "^17.0.18",
"@types/react": "file:hwe/ts/@types/types__react",
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"@vue/compiler-sfc": "^3.2.31",
"@vue/eslint-config-typescript": "^10.0.0",
"autoprefixer": "^10.4.2",
"babel-plugin-lodash": "^3.3.4",
"babel-preset-modern-browsers": "^15.0.2",
"bootswatch": "^5.1.3",
"clean-terminal-webpack-plugin": "^3.0.0",
"css-loader": "^6.6.0",
"cssnano": "^5.0.17",
"esbuild-loader": "^2.18.0",
"eslint": "^8.9.0",
"eslint-plugin-vue": "^8.4.1",
"file-loader": "^6.2.0",
"mini-css-extract-plugin": "^2.5.3",
"postcss-discard-duplicates": "^5.0.3",
"postcss-import": "^14.0.2", "postcss-import": "^14.0.2",
"postcss-loader": "^6.2.1", "postcss-loader": "^6.2.1",
"pre-commit": "^1.2.2", "pre-commit": "^1.2.2",
"sass": "^1.49.8", "query-string": "^7.1.1",
"sass": "^1.49.9",
"sass-loader": "^12.6.0", "sass-loader": "^12.6.0",
"select2": "^4.0",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"ts-node": "^10.5.0", "ts-node": "^10.7.0",
"typescript": "^4.5.5", "tsconfig-paths": "^3.13.0",
"typescript": "^4.6.2",
"url-loader": "^4.1.1", "url-loader": "^4.1.1",
"vue-eslint-parser": "^8.2.0", "uuid": "^8.3.2",
"vue": "^3.2.31",
"vue-eslint-parser": "^8.3.0",
"vue-loader": "^17.0.0", "vue-loader": "^17.0.0",
"vue-multiselect": "^3.0.0-alpha.2",
"vue-style-loader": "^4.1.3", "vue-style-loader": "^4.1.3",
"webpack": "^5.69.1", "vue-types": "^4.1.1",
"vuedraggable": "^4.1.0",
"webpack": "^5.70.0",
"webpack-bundle-analyzer": "^4.5.0", "webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.2" "webpack-cli": "^4.9.2"
}, },

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