Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
923cac5408 | ||
|
|
23505326c7 | ||
|
|
5f1a48f523 | ||
|
|
a607d39030 | ||
|
|
96d108729e | ||
|
|
ef15adaaf8 | ||
|
|
f190b74a7e | ||
|
|
edbc2b88b6 | ||
|
|
dc000cecf1 | ||
|
|
7c95a483df | ||
|
|
27e5d73da1 | ||
|
|
6306dae92d | ||
|
|
a427ddff83 | ||
|
|
b62ee6e820 | ||
|
|
3c18666080 | ||
|
|
40968b301a | ||
|
|
05904d31fd | ||
|
|
75aeaf4ee7 | ||
|
|
ff4e67a9f6 | ||
|
|
5f672d5bd1 | ||
|
|
5cb39eba8b | ||
|
|
4d8c3c75d6 | ||
|
|
8bdd19fc06 | ||
|
|
0ec99d8ba1 | ||
|
|
929d2db5a5 | ||
|
|
a7ad77f433 | ||
|
|
9cd47d5deb | ||
|
|
3cb5691aae | ||
|
|
dce63919fa | ||
|
|
1cdbedcb96 | ||
|
|
1586712ce5 | ||
|
|
f059186494 | ||
|
|
0af0be57b0 | ||
|
|
dad2b03212 | ||
|
|
b6e307660f | ||
|
|
c21c14825a | ||
|
|
39f9c986e9 | ||
|
|
393683aebc | ||
|
|
a87fcb44a6 | ||
|
|
0a6496ddfb | ||
|
|
fa2841fac6 | ||
|
|
861e45419b | ||
|
|
15fd943456 | ||
|
|
b538bfc27e | ||
|
|
e0f32eddc4 | ||
|
|
75a704c196 | ||
|
|
6565fdbe7e | ||
|
|
6248d72852 | ||
|
|
00d1797b96 | ||
|
|
911194eba8 | ||
|
|
0fad3ae31d | ||
|
|
b6988d866a | ||
|
|
e30959a656 | ||
|
|
52eeff3466 | ||
|
|
a06ded552d | ||
|
|
e9b8a84243 | ||
|
|
1fc3cfd1f2 | ||
|
|
188b57ed7a | ||
|
|
c8620390ac | ||
|
|
b3f8ed2335 | ||
|
|
54bf504eb4 | ||
|
|
c6f3bf856b | ||
|
|
8b33a7926e | ||
|
|
a38cb90cbf | ||
|
|
1500e8e54f | ||
|
|
94fd8d5e9d | ||
|
|
373e0a2155 | ||
|
|
267298f341 | ||
|
|
359d46e94d | ||
|
|
11f5540099 | ||
|
|
680e1afcfd | ||
|
|
e4322e60cc | ||
|
|
82f2eecfe8 | ||
|
|
3e3c3c559d | ||
|
|
65f5e8e964 | ||
|
|
c5fbe93890 | ||
|
|
307d8b6165 | ||
|
|
bf08eb2f8b | ||
|
|
a569c1dfaf | ||
|
|
e48db0d231 | ||
|
|
1a5b5dbb45 | ||
|
|
56f21cabe5 | ||
|
|
7ac5afe05b | ||
|
|
b3db97f4a8 | ||
|
|
6d1a06a9d9 | ||
|
|
088643df6c | ||
|
|
fc00a0a363 | ||
|
|
7a48fdd246 | ||
|
|
89be493882 | ||
|
|
5947abf83d | ||
|
|
962db6821f | ||
|
|
f6a3df7858 | ||
|
|
090aaed3f4 | ||
|
|
71cb5aa9e4 | ||
|
|
043b29ef33 | ||
|
|
d81cf4aec3 | ||
|
|
7cb46eeb82 | ||
|
|
c3b4d54414 | ||
|
|
8b9acf2d3d | ||
|
|
08548181ed | ||
|
|
45f883c98b | ||
|
|
5f39229e47 | ||
|
|
8c5bdc2a4b | ||
|
|
7b7602bce2 | ||
|
|
a145792fac | ||
|
|
667a550f4c | ||
|
|
53e1ad8991 | ||
|
|
429c949d1f | ||
|
|
1548577d65 | ||
|
|
82e59b297f | ||
|
|
1f9c994425 | ||
|
|
fc0c7a5004 | ||
|
|
a2d0309c79 | ||
|
|
6d01fbb6e8 | ||
|
|
be270df088 | ||
|
|
88fd94e1cc | ||
|
|
e460392368 | ||
|
|
249cda99f4 | ||
|
|
327fce822a | ||
|
|
58931354a4 | ||
|
|
c8993e9832 | ||
|
|
4ee2e023aa | ||
|
|
22fa1b121e | ||
|
|
cbc6e526c3 | ||
|
|
96041faefd | ||
|
|
894c912e19 | ||
|
|
7b406a945f | ||
|
|
6ff5cc90f1 | ||
|
|
f66e56f4b5 | ||
|
|
8f09aab0ea | ||
|
|
b248b9ca2c | ||
|
|
5a6a31fefa | ||
|
|
1e485a3883 | ||
|
|
fed3246c84 | ||
|
|
daff4a9786 | ||
|
|
6e88b0c701 | ||
|
|
808f674173 | ||
|
|
ba377c9aac | ||
|
|
bb8909f552 | ||
|
|
5a4d9ffcfc | ||
|
|
5ed24a98cb | ||
|
|
6d17675ee7 | ||
|
|
e0b8bfdeae | ||
|
|
0db2009e65 | ||
|
|
5f016d74a1 | ||
|
|
02b9832750 | ||
|
|
18a888b9d4 | ||
|
|
7f20e981d2 | ||
|
|
d64e08f3c4 | ||
|
|
8bb5324896 | ||
|
|
8f2ebc6409 | ||
|
|
371318f62f | ||
|
|
6e94403dc6 | ||
|
|
c35f6905bb | ||
|
|
4eebbb3e81 | ||
|
|
8ddfc8fb4a | ||
|
|
14d2661be8 | ||
|
|
ec71bf29b8 |
@@ -35,6 +35,8 @@ d_setting/*.php
|
|||||||
*/d_setting/*.php
|
*/d_setting/*.php
|
||||||
*/d_setting/templates/*.php
|
*/d_setting/templates/*.php
|
||||||
|
|
||||||
|
*/data/file_cache
|
||||||
|
|
||||||
**/old/*
|
**/old/*
|
||||||
test.php
|
test.php
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -51,10 +51,8 @@ return [
|
|||||||
'hwe/b_tournament.php',
|
'hwe/b_tournament.php',
|
||||||
'hwe/b_troop.php',
|
'hwe/b_troop.php',
|
||||||
'hwe/c_auction.php',
|
'hwe/c_auction.php',
|
||||||
'hwe/c_die_immediately.php',
|
|
||||||
'hwe/c_dipcenter.php',
|
'hwe/c_dipcenter.php',
|
||||||
'hwe/c_tournament.php',
|
'hwe/c_tournament.php',
|
||||||
'hwe/c_vacation.php',
|
|
||||||
'hwe/c_vote.php',
|
'hwe/c_vote.php',
|
||||||
'hwe/func.php',
|
'hwe/func.php',
|
||||||
'hwe/func_auction.php',
|
'hwe/func_auction.php',
|
||||||
@@ -83,6 +81,7 @@ return [
|
|||||||
'hwe/j_board_comment_add.php',
|
'hwe/j_board_comment_add.php',
|
||||||
'hwe/j_board_get_articles.php',
|
'hwe/j_board_get_articles.php',
|
||||||
'hwe/j_chief_turn.php',
|
'hwe/j_chief_turn.php',
|
||||||
|
'hwe/j_die_immediately.php',
|
||||||
'hwe/j_diplomacy_destroy_letter.php',
|
'hwe/j_diplomacy_destroy_letter.php',
|
||||||
'hwe/j_diplomacy_get_letter.php',
|
'hwe/j_diplomacy_get_letter.php',
|
||||||
'hwe/j_diplomacy_respond_letter.php',
|
'hwe/j_diplomacy_respond_letter.php',
|
||||||
@@ -115,6 +114,7 @@ return [
|
|||||||
'hwe/j_set_general_command.php',
|
'hwe/j_set_general_command.php',
|
||||||
'hwe/j_simulate_battle.php',
|
'hwe/j_simulate_battle.php',
|
||||||
'hwe/j_troop.php',
|
'hwe/j_troop.php',
|
||||||
|
'hwe/j_vacation.php',
|
||||||
'hwe/lib.php',
|
'hwe/lib.php',
|
||||||
'hwe/process_war.php',
|
'hwe/process_war.php',
|
||||||
'hwe/select_npc.php',
|
'hwe/select_npc.php',
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>닫혀 있습니다.</title>
|
||||||
|
<script>
|
||||||
|
setTimeout(function(){
|
||||||
|
window.location = window.location+'/../';
|
||||||
|
}, 5000);
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
html, body{
|
||||||
|
background-color:black;
|
||||||
|
color:yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
서버가 닫혀있습니다.<br>
|
||||||
|
잠시 뒤에 입구로 이동합니다.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+3
-1
@@ -26,7 +26,9 @@
|
|||||||
"ezyang/htmlpurifier": "^4.10",
|
"ezyang/htmlpurifier": "^4.10",
|
||||||
"xemlock/htmlpurifier-html5": "^0.1.7",
|
"xemlock/htmlpurifier-html5": "^0.1.7",
|
||||||
"catfan/medoo": "^1.5",
|
"catfan/medoo": "^1.5",
|
||||||
"phan/phan": "^2.7"
|
"phan/phan": "^2.7",
|
||||||
|
"erusev/parsedown-extra": "^0.8.1",
|
||||||
|
"nette/caching": "^3.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|||||||
Generated
+300
-77
@@ -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": "7343763bee946f23e755edecd14d6b2c",
|
"content-hash": "ab1175c8592ba7f7756d5f02a3aa051c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "brandonwamboldt/utilphp",
|
"name": "brandonwamboldt/utilphp",
|
||||||
@@ -215,13 +215,100 @@
|
|||||||
"Xdebug",
|
"Xdebug",
|
||||||
"performance"
|
"performance"
|
||||||
],
|
],
|
||||||
"funding": [
|
"time": "2020-03-01T12:26:26+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "erusev/parsedown",
|
||||||
|
"version": "1.7.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/erusev/parsedown.git",
|
||||||
|
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
|
||||||
|
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Parsedown": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
{
|
{
|
||||||
"url": "https://packagist.com",
|
"name": "Emanuil Rusev",
|
||||||
"type": "custom"
|
"email": "hello@erusev.com",
|
||||||
|
"homepage": "http://erusev.com"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2020-03-01T12:26:26+00:00"
|
"description": "Parser for Markdown.",
|
||||||
|
"homepage": "http://parsedown.org",
|
||||||
|
"keywords": [
|
||||||
|
"markdown",
|
||||||
|
"parser"
|
||||||
|
],
|
||||||
|
"time": "2019-12-30T22:54:17+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "erusev/parsedown-extra",
|
||||||
|
"version": "0.8.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/erusev/parsedown-extra.git",
|
||||||
|
"reference": "91ac3ff98f0cea243bdccc688df43810f044dcef"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef",
|
||||||
|
"reference": "91ac3ff98f0cea243bdccc688df43810f044dcef",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"erusev/parsedown": "^1.7.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"ParsedownExtra": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Emanuil Rusev",
|
||||||
|
"email": "hello@erusev.com",
|
||||||
|
"homepage": "http://erusev.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An extension of Parsedown that adds support for Markdown Extra.",
|
||||||
|
"homepage": "https://github.com/erusev/parsedown-extra",
|
||||||
|
"keywords": [
|
||||||
|
"markdown",
|
||||||
|
"markdown extra",
|
||||||
|
"parsedown",
|
||||||
|
"parser"
|
||||||
|
],
|
||||||
|
"time": "2019-12-30T23:20:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ezyang/htmlpurifier",
|
"name": "ezyang/htmlpurifier",
|
||||||
@@ -756,6 +843,213 @@
|
|||||||
"description": "Map nested JSON structures onto PHP classes",
|
"description": "Map nested JSON structures onto PHP classes",
|
||||||
"time": "2020-04-16T18:48:43+00:00"
|
"time": "2020-04-16T18:48:43+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/caching",
|
||||||
|
"version": "v3.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/caching.git",
|
||||||
|
"reference": "b9ecbf920f240bd1ab14900d9a77876924ad7fb4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/caching/zipball/b9ecbf920f240bd1ab14900d9a77876924ad7fb4",
|
||||||
|
"reference": "b9ecbf920f240bd1ab14900d9a77876924ad7fb4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/finder": "^2.4 || ^3.0",
|
||||||
|
"nette/utils": "^2.4 || ^3.0",
|
||||||
|
"php": ">=7.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"latte/latte": "^2.4",
|
||||||
|
"nette/di": "^v3.0",
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"tracy/tracy": "^2.4"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "⏱ Nette Caching: library with easy-to-use API and many cache backends.",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"keywords": [
|
||||||
|
"cache",
|
||||||
|
"journal",
|
||||||
|
"memcached",
|
||||||
|
"nette",
|
||||||
|
"sqlite"
|
||||||
|
],
|
||||||
|
"time": "2019-11-19T18:41:40+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/finder",
|
||||||
|
"version": "v2.5.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/finder.git",
|
||||||
|
"reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/finder/zipball/4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
|
||||||
|
"reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/utils": "^2.4 || ^3.0",
|
||||||
|
"php": ">=7.1"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"phpstan/phpstan": "^0.12",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.5-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "🔍 Nette Finder: find files and directories with an intuitive API.",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"keywords": [
|
||||||
|
"filesystem",
|
||||||
|
"glob",
|
||||||
|
"iterator",
|
||||||
|
"nette"
|
||||||
|
],
|
||||||
|
"time": "2020-01-03T20:35:40+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/utils",
|
||||||
|
"version": "v3.1.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/utils.git",
|
||||||
|
"reference": "488f58378bba71767e7831c83f9e0fa808bf83b9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/utils/zipball/488f58378bba71767e7831c83f9e0fa808bf83b9",
|
||||||
|
"reference": "488f58378bba71767e7831c83f9e0fa808bf83b9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "~2.0",
|
||||||
|
"phpstan/phpstan": "^0.12",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "to use Image",
|
||||||
|
"ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
|
||||||
|
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
|
||||||
|
"ext-json": "to use Nette\\Utils\\Json",
|
||||||
|
"ext-mbstring": "to use Strings::lower() etc...",
|
||||||
|
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
|
||||||
|
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.1-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0-only",
|
||||||
|
"GPL-3.0-only"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"keywords": [
|
||||||
|
"array",
|
||||||
|
"core",
|
||||||
|
"datetime",
|
||||||
|
"images",
|
||||||
|
"json",
|
||||||
|
"nette",
|
||||||
|
"paginator",
|
||||||
|
"password",
|
||||||
|
"slugify",
|
||||||
|
"string",
|
||||||
|
"unicode",
|
||||||
|
"utf-8",
|
||||||
|
"utility",
|
||||||
|
"validation"
|
||||||
|
],
|
||||||
|
"time": "2020-05-27T09:58:51+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "pguardiario/phpuri",
|
"name": "pguardiario/phpuri",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
@@ -1510,20 +1804,6 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Console Component",
|
"description": "Symfony Console Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2020-03-30T11:42:42+00:00"
|
"time": "2020-03-30T11:42:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1648,20 +1928,6 @@
|
|||||||
"polyfill",
|
"polyfill",
|
||||||
"portable"
|
"portable"
|
||||||
],
|
],
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2020-02-27T09:26:54+00:00"
|
"time": "2020-02-27T09:26:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1721,20 +1987,6 @@
|
|||||||
"portable",
|
"portable",
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2020-03-09T19:04:49+00:00"
|
"time": "2020-03-09T19:04:49+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1790,20 +2042,6 @@
|
|||||||
"portable",
|
"portable",
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2020-02-27T09:26:54+00:00"
|
"time": "2020-02-27T09:26:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1862,20 +2100,6 @@
|
|||||||
"portable",
|
"portable",
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2020-02-27T09:26:54+00:00"
|
"time": "2020-02-27T09:26:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2095,6 +2319,5 @@
|
|||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"platform-overrides": {
|
"platform-overrides": {
|
||||||
"php": "7.3"
|
"php": "7.3"
|
||||||
},
|
}
|
||||||
"plugin-api-version": "1.1.0"
|
|
||||||
}
|
}
|
||||||
|
|||||||
+75
-74
@@ -1,131 +1,132 @@
|
|||||||
body, html{
|
body,
|
||||||
|
html {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
.main{
|
.main {
|
||||||
margin-top: 70px;
|
margin-top: 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1.title {
|
h1.title {
|
||||||
font-size: 50px;
|
font-size: 50px;
|
||||||
font-family: 'Passion One', cursive;
|
font-family: 'Passion One', cursive;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr{
|
hr {
|
||||||
width: 10%;
|
width: 10%;
|
||||||
/*color: #fff;*/
|
/*color: #fff;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-group{
|
.form-group {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
label{
|
label {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input,
|
input,
|
||||||
input::-webkit-input-placeholder {
|
input::-webkit-input-placeholder {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-login{
|
.main-login {
|
||||||
/*background-color: #fff;*/
|
/*background-color: #fff;*/
|
||||||
/* shadows and rounded borders */
|
/* shadows and rounded borders */
|
||||||
-moz-border-radius: 2px;
|
-moz-border-radius: 2px;
|
||||||
-webkit-border-radius: 2px;
|
-webkit-border-radius: 2px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
-moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
-moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
||||||
-webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
-webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
||||||
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-center{
|
.main-center {
|
||||||
margin-top: 30px;
|
margin-top: 30px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
max-width: 330px;
|
max-width: 330px;
|
||||||
padding: 40px 40px;
|
padding: 40px 40px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.login_btn_group{
|
.login_btn_group {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-register{
|
.login-register {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.col-form-label {
|
||||||
.col-form-label{
|
text-align: center;
|
||||||
text-align:center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.terms{
|
.terms {
|
||||||
max-height: 200px; overflow-y: auto;
|
max-height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.terms pre{
|
.terms pre {
|
||||||
width:100%;
|
width: 100%;
|
||||||
white-space: pre-wrap; /* Since CSS 2.1 */
|
white-space: pre-wrap;
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
/* Since CSS 2.1 */
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
white-space: -moz-pre-wrap;
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
/* Mozilla, since 1999 */
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
white-space: -pre-wrap;
|
||||||
|
/* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap;
|
||||||
|
/* Opera 7 */
|
||||||
|
word-wrap: break-word;
|
||||||
|
/* Internet Explorer 5.5+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
.vertical-center {
|
.vertical-center {
|
||||||
min-height: 100%; /* Fallback for browsers do NOT support vh unit */
|
min-height: 100%;
|
||||||
min-height: 100vh; /* These two lines are counted as one :-) */
|
/* Fallback for browsers do NOT support vh unit */
|
||||||
|
min-height: 100vh;
|
||||||
|
/* These two lines are counted as one :-) */
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.full-content {
|
#login_card {
|
||||||
position:fixed;
|
z-index: 801;
|
||||||
left:0;
|
|
||||||
top:0;
|
|
||||||
width:100%;
|
|
||||||
height:100%;
|
|
||||||
margin:0;
|
|
||||||
padding:0;
|
|
||||||
z-index:800;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#login_card{
|
#btn_kakao_login {
|
||||||
z-index:801;
|
|
||||||
}
|
|
||||||
|
|
||||||
#btn_kakao_login{
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
height:46px;
|
height: 46px;
|
||||||
width:116px;
|
width: 116px;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color:transparent;
|
color: transparent;
|
||||||
border:0;
|
border: 0;
|
||||||
background-size: 100%; /* To fill the dimensions of container (button), or */
|
background-size: 100%;
|
||||||
|
/* To fill the dimensions of container (button), or */
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: bottom center;
|
background-position: bottom center;
|
||||||
margin-top:5px;
|
margin-top: 5px;
|
||||||
background-image:url('../oauth_kakao/kakao_login_join.png');
|
background-image: url('../oauth_kakao/kakao_login_join.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
#btn_kakao_login:hover {
|
#btn_kakao_login:hover {
|
||||||
background-image:url('../oauth_kakao/kakao_login_join_ov.png');
|
background-image: url('../oauth_kakao/kakao_login_join_ov.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
#bottom_box{
|
#bottom_box .container {
|
||||||
position:fixed;
|
text-align: center;
|
||||||
bottom:0;
|
|
||||||
width:100%;
|
|
||||||
left:0;
|
|
||||||
}
|
}
|
||||||
#bottom_box .container{
|
|
||||||
text-align:center;
|
.btn-group-xs>.btn,
|
||||||
|
.btn-xs {
|
||||||
|
padding: .25rem .4rem;
|
||||||
|
font-size: .875rem;
|
||||||
|
line-height: .5;
|
||||||
|
border-radius: .2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#running_map {
|
||||||
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
Vendored
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
|
||||||
|
|
||||||
(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})();
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}();
|
||||||
Vendored
+551
-186
@@ -1,188 +1,553 @@
|
|||||||
/* select2-bootstrap4 with Darkly */
|
/* select2-bootstrap4 with Darkly */
|
||||||
.select2-container--bootstrap4 { color: black; }
|
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection { background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; color: #495057; font-size: 1rem; outline: 0; }
|
.select2-container--bootstrap4 {
|
||||||
|
color: black;
|
||||||
.select2-container--bootstrap4 .select2-selection.form-control { border-radius: 0.25rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-search--dropdown .select2-search__field { background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; color: #495057; font-size: 1rem; }
|
.select2-container--bootstrap4 .select2-selection {
|
||||||
|
background-color: #fff;
|
||||||
.select2-container--bootstrap4 .select2-search__field { outline: 0; }
|
border: 1px solid #ced4da;
|
||||||
|
border-radius: 0.25rem;
|
||||||
.select2-container--bootstrap4 .select2-search__field::-webkit-input-placeholder { color: #6c757d; }
|
color: #495057;
|
||||||
|
font-size: 1rem;
|
||||||
.select2-container--bootstrap4 .select2-search__field:-moz-placeholder { color: #6c757d; }
|
outline: 0;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-search__field::-moz-placeholder { color: #6c757d; opacity: 1; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection.form-control {
|
||||||
.select2-container--bootstrap4 .select2-search__field:-ms-input-placeholder { color: #6c757d; }
|
border-radius: 0.25rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-results__option { padding: 0.75rem 0.375rem; font-size: 1rem; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-search--dropdown .select2-search__field {
|
||||||
.select2-container--bootstrap4 .select2-results__option[role=group] { padding: 0; }
|
background-color: #fff;
|
||||||
|
border: 1px solid #ced4da;
|
||||||
.select2-container--bootstrap4 .select2-results__option[aria-disabled=true] { color: #6c757d; cursor: not-allowed; }
|
border-radius: 0.25rem;
|
||||||
|
color: #495057;
|
||||||
.select2-container--bootstrap4 .select2-results__option[aria-selected=true] { background-color: #f8f9fa; color: #16181b; }
|
font-size: 1rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-results__option--highlighted[aria-selected] { background-color: #007bff; color: #fff; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-search__field {
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option { padding: 0.75rem 0.375rem; }
|
outline: 0;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-search__field::-webkit-input-placeholder {
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option { margin-left: -0.375rem; padding-left: 0.75rem; }
|
color: #6c757d;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -0.75rem; padding-left: 1.125rem; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-search__field:-moz-placeholder {
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.125rem; padding-left: 1.5rem; }
|
color: #6c757d;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.5rem; padding-left: 1.875rem; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-search__field::-moz-placeholder {
|
||||||
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.875rem; padding-left: 2.25rem; }
|
color: #6c757d;
|
||||||
|
opacity: 1;
|
||||||
.select2-container--bootstrap4 .select2-results__group { color: #6c757d; display: block; padding: 0.75rem 0.375rem; font-size: 75%; line-height: 1; white-space: nowrap; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4.select2-container--focus .select2-selection, .select2-container--bootstrap4.select2-container--open .select2-selection { transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; border-color: #80bdff; }
|
.select2-container--bootstrap4 .select2-search__field:-ms-input-placeholder {
|
||||||
|
color: #6c757d;
|
||||||
@media screen and (prefers-reduced-motion: reduce) { .select2-container--bootstrap4.select2-container--focus .select2-selection, .select2-container--bootstrap4.select2-container--open .select2-selection { transition: none; } }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4.select2-container--open .select2-selection .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.25rem 0.25rem 0.25rem; }
|
.select2-container--bootstrap4 .select2-results__option {
|
||||||
|
padding: 0.75rem 0.375rem;
|
||||||
.select2-container--bootstrap4.select2-container--open.select2-container--below .select2-selection { border-bottom-right-radius: 0; border-bottom-left-radius: 0; border-bottom-color: transparent; }
|
font-size: 1rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4.select2-container--open.select2-container--above .select2-selection { border-top-left-radius: 0; border-top-right-radius: 0; border-top-color: transparent; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__option[role=group] {
|
||||||
.select2-container--bootstrap4 .select2-selection__clear { color: #6c757d; cursor: pointer; float: right; font-weight: bold; margin-right: 10px; }
|
padding: 0;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-selection__clear:hover { color: #343a40; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__option[aria-disabled=true] {
|
||||||
.select2-container--bootstrap4.select2-container--disabled .select2-selection { border-color: #ced4da; }
|
color: #6c757d;
|
||||||
|
cursor: not-allowed;
|
||||||
.select2-container--bootstrap4.select2-container--disabled .select2-selection, .select2-container--bootstrap4.select2-container--disabled .select2-search__field { cursor: not-allowed; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4.select2-container--disabled .select2-selection, .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice { background-color: #e9ecef; }
|
.select2-container--bootstrap4 .select2-results__option[aria-selected=true] {
|
||||||
|
background-color: #f8f9fa;
|
||||||
.select2-container--bootstrap4.select2-container--disabled .select2-selection__clear, .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove { display: none; }
|
color: #16181b;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-dropdown { border-color: #80bdff; border-width: 1px; overflow-x: hidden; margin-top: -1px; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__option--highlighted[aria-selected] {
|
||||||
.select2-container--bootstrap4 .select2-dropdown--above { margin-top: 1px; }
|
background-color: #007bff;
|
||||||
|
color: #fff;
|
||||||
.select2-container--bootstrap4 .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--single { height: calc(2.25rem + 2px); line-height: 1; padding: 0.75rem 1.125rem 0.75rem 0.375rem; }
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option {
|
||||||
|
padding: 0.75rem 0.375rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow { position: absolute; bottom: 0; right: 0.375rem; top: 0; width: 0.25rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { border-color: #6c757d transparent transparent transparent; border-style: solid; border-width: 0.25rem 0.25rem 0 0.25rem; height: 0; left: 0; margin-left: -0.25rem; margin-top: -0.125rem; position: absolute; top: 50%; width: 0; }
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__group {
|
||||||
|
padding-left: 0;
|
||||||
.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered { color: #495057; padding: 0; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder { color: #6c757d; }
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option {
|
||||||
|
margin-left: -0.375rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(2.25rem + 2px); padding: 0; height: auto; }
|
padding-left: 0.75rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; display: block; line-height: 1; list-style: none; margin: 0; overflow: hidden; padding: 0.75rem 0.375rem 0 0.75rem; width: 100%; text-overflow: ellipsis; white-space: nowrap; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__placeholder { color: #6c757d; float: left; margin-top: 5px; }
|
margin-left: -0.75rem;
|
||||||
|
padding-left: 1.125rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { color: #495057; background: transparent; border: 1px solid #343a40; border-radius: 0.25rem; cursor: default; float: left; margin: -0.25rem 0 0 0.1875rem; padding: 0 0.75rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { background: transparent; padding: 0 0.375rem; height: calc(2.25rem + 2px)-2; line-height: 1; margin-top: 0; min-width: 5em; }
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||||
|
margin-left: -1.125rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove { color: #6c757d; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 0.375rem; }
|
padding-left: 1.5rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover { color: #343a40; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 0.75rem; }
|
margin-left: -1.5rem;
|
||||||
|
padding-left: 1.875rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--single.input-sm, .input-group-sm .select2-container--bootstrap4 .select2-selection--single, .form-group-sm .select2-container--bootstrap4 .select2-selection--single { border-radius: 0.2rem; font-size: 75%; height: calc(1.8125rem + 2px); line-height: 1; padding: 0.5rem 1rem 0.5rem 0.25rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--single.input-sm .select2-selection__arrow b, .input-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b, .form-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { margin-left: -0.5rem; }
|
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||||
|
margin-left: -1.875rem;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-sm, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(1.8125rem + 2px); border-radius: 0.2rem; }
|
padding-left: 2.25rem;
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__rendered, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered { padding: 0.5rem 0.25rem 0 0.5rem; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-results__group {
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__choice, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { font-size: 75%; line-height: 1; margin: 0 0 0 0.125rem; padding: 0 0.5rem; }
|
color: #6c757d;
|
||||||
|
display: block;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { padding: 0 0.25rem; font-size: 75%; height: calc(1.8125rem + 2px)-2; line-height: 1; }
|
padding: 0.75rem 0.375rem;
|
||||||
|
font-size: 75%;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__clear, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 0.5rem; }
|
line-height: 1;
|
||||||
|
white-space: nowrap;
|
||||||
.select2-container--bootstrap4 .select2-selection--single.input-lg, .input-group-lg .select2-container--bootstrap4 .select2-selection--single, .form-group-lg .select2-container--bootstrap4 .select2-selection--single { border-radius: 0.3rem; font-size: 1.25rem; height: calc(2.875rem + 2px); line-height: 1; padding: 1rem 1.4375rem 1rem 0.5rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow, .input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow, .form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow { width: 0.3125rem; }
|
.select2-container--bootstrap4.select2-container--focus .select2-selection,
|
||||||
|
.select2-container--bootstrap4.select2-container--open .select2-selection {
|
||||||
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow b, .input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b, .form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { border-width: 0.3125rem 0.3125rem 0 0.3125rem; margin-left: -0.3125rem; margin-left: -1rem; margin-top: -0.15625rem; }
|
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||||
|
border-color: #80bdff;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-lg, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(2.875rem + 2px); border-radius: 0.3rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__choice, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { font-size: 1.25rem; line-height: 1; border-radius: 0.25rem; margin: 0rem 0 0 0.25rem; padding: 0 1rem; }
|
@media screen and (prefers-reduced-motion: reduce) {
|
||||||
|
.select2-container--bootstrap4.select2-container--focus .select2-selection,
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { padding: 0 0.5rem; font-size: 1.25rem; height: calc(2.875rem + 2px)-2; line-height: 1; }
|
.select2-container--bootstrap4.select2-container--open .select2-selection {
|
||||||
|
transition: none;
|
||||||
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__clear, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 1rem; }
|
}
|
||||||
|
}
|
||||||
.select2-container--bootstrap4 .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.3125rem 0.3125rem 0.3125rem; }
|
|
||||||
|
.select2-container--bootstrap4.select2-container--open .select2-selection .select2-selection__arrow b {
|
||||||
.input-group-lg .select2-container--bootstrap4 .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.3125rem 0.3125rem 0.3125rem; }
|
border-color: transparent transparent #6c757d transparent;
|
||||||
|
border-width: 0 0.25rem 0.25rem 0.25rem;
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single { padding-left: 1.125rem; padding-right: 0.375rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 0; padding-left: 0; text-align: right; }
|
.select2-container--bootstrap4.select2-container--open.select2-container--below .select2-selection {
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; }
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-color: transparent;
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 0.375rem; right: auto; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow b { margin-left: 0; }
|
.select2-container--bootstrap4.select2-container--open.select2-container--above .select2-selection {
|
||||||
|
border-top-left-radius: 0;
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; }
|
border-top-right-radius: 0;
|
||||||
|
border-top-color: transparent;
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 0; margin-right: 0.1875rem; }
|
}
|
||||||
|
|
||||||
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; }
|
.select2-container--bootstrap4 .select2-selection__clear {
|
||||||
|
color: #6c757d;
|
||||||
.has-warning .select2-dropdown, .has-warning .select2-selection { border-color: #ffc107; }
|
cursor: pointer;
|
||||||
|
float: right;
|
||||||
.has-warning .select2-container--focus .select2-selection, .has-warning .select2-container--open .select2-selection { border-color: #d39e00; }
|
font-weight: bold;
|
||||||
|
margin-right: 10px;
|
||||||
.has-warning.select2-drop-active { border-color: #d39e00; }
|
}
|
||||||
|
|
||||||
.has-warning.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #d39e00; }
|
.select2-container--bootstrap4 .select2-selection__clear:hover {
|
||||||
|
color: #343a40;
|
||||||
.has-error .select2-dropdown, .has-error .select2-selection { border-color: #dc3545; }
|
}
|
||||||
|
|
||||||
.has-error .select2-container--focus .select2-selection, .has-error .select2-container--open .select2-selection { border-color: #bd2130; }
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection {
|
||||||
|
border-color: #ced4da;
|
||||||
.has-error.select2-drop-active { border-color: #bd2130; }
|
}
|
||||||
|
|
||||||
.has-error.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #bd2130; }
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection,
|
||||||
|
.select2-container--bootstrap4.select2-container--disabled .select2-search__field {
|
||||||
.has-success .select2-dropdown, .has-success .select2-selection { border-color: #28a745; }
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
.has-success .select2-container--focus .select2-selection, .has-success .select2-container--open .select2-selection { border-color: #1e7e34; }
|
|
||||||
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection,
|
||||||
.has-success.select2-drop-active { border-color: #1e7e34; }
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice {
|
||||||
|
background-color: #e9ecef;
|
||||||
.has-success.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #1e7e34; }
|
}
|
||||||
|
|
||||||
.input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap4 > .selection > .select2-selection, .input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap4 > .selection > .select2-selection.form-control { border-top-right-radius: 0; border-bottom-right-radius: 0; }
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection__clear,
|
||||||
|
.select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove {
|
||||||
.input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection, .input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection.form-control { border-radius: 0; }
|
display: none;
|
||||||
|
}
|
||||||
.input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection, .input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection.form-control { border-top-left-radius: 0; border-bottom-left-radius: 0; }
|
|
||||||
|
.select2-container--bootstrap4 .select2-dropdown {
|
||||||
.input-group > .select2-container--bootstrap4 { display: table; table-layout: fixed; position: relative; z-index: 2; width: 100%; margin-bottom: 0; }
|
border-color: #80bdff;
|
||||||
|
border-width: 1px;
|
||||||
.input-group > .select2-container--bootstrap4 > .selection > .select2-selection.form-control { float: none; }
|
overflow-x: hidden;
|
||||||
|
margin-top: -1px;
|
||||||
.input-group > .select2-container--bootstrap4.select2-container--open, .input-group > .select2-container--bootstrap4.select2-container--focus { z-index: 3; }
|
}
|
||||||
|
|
||||||
.input-group > .select2-container--bootstrap4, .input-group > .select2-container--bootstrap4 .input-group-btn, .input-group > .select2-container--bootstrap4 .input-group-btn .btn { vertical-align: top; }
|
.select2-container--bootstrap4 .select2-dropdown--above {
|
||||||
|
margin-top: 1px;
|
||||||
.form-control.select2-hidden-accessible { position: absolute !important; width: 1px !important; }
|
}
|
||||||
|
|
||||||
@media (min-width: 576px) { .form-inline .select2-container--bootstrap4 { display: inline-block; } }
|
.select2-container--bootstrap4 .select2-results>.select2-results__options {
|
||||||
|
max-height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single {
|
||||||
|
height: calc(2.25rem + 2px);
|
||||||
|
line-height: 1;
|
||||||
|
padding: 0.75rem 1.125rem 0.75rem 0.375rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0.375rem;
|
||||||
|
top: 0;
|
||||||
|
width: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
|
||||||
|
border-color: #6c757d transparent transparent transparent;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0.25rem 0.25rem 0 0.25rem;
|
||||||
|
height: 0;
|
||||||
|
left: 0;
|
||||||
|
margin-left: -0.25rem;
|
||||||
|
margin-top: -0.125rem;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered {
|
||||||
|
color: #495057;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder {
|
||||||
|
color: #6c757d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple {
|
||||||
|
min-height: calc(2.25rem + 2px);
|
||||||
|
padding: 0;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered {
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: block;
|
||||||
|
line-height: 1;
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0.75rem 0.375rem 0 0.75rem;
|
||||||
|
width: 100%;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__placeholder {
|
||||||
|
color: #6c757d;
|
||||||
|
float: left;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
|
||||||
|
color: #495057;
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid #343a40;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
cursor: default;
|
||||||
|
float: left;
|
||||||
|
margin: -0.25rem 0 0 0.1875rem;
|
||||||
|
padding: 0 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
|
||||||
|
background: transparent;
|
||||||
|
padding: 0 0.375rem;
|
||||||
|
height: calc(2.25rem + 2px)-2;
|
||||||
|
line-height: 1;
|
||||||
|
margin-top: 0;
|
||||||
|
min-width: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove {
|
||||||
|
color: #6c757d;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 0.375rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover {
|
||||||
|
color: #343a40;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
|
||||||
|
margin-top: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single.input-sm,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--single,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--single {
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
font-size: 75%;
|
||||||
|
height: calc(1.8125rem + 2px);
|
||||||
|
line-height: 1;
|
||||||
|
padding: 0.5rem 1rem 0.5rem 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single.input-sm .select2-selection__arrow b,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
|
||||||
|
margin-left: -0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-sm,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple {
|
||||||
|
min-height: calc(1.8125rem + 2px);
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__rendered,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered {
|
||||||
|
padding: 0.5rem 0.25rem 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__choice,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 1;
|
||||||
|
margin: 0 0 0 0.125rem;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
|
||||||
|
padding: 0 0.25rem;
|
||||||
|
font-size: 75%;
|
||||||
|
height: calc(1.8125rem + 2px)-2;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__clear,
|
||||||
|
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear,
|
||||||
|
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single.input-lg,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--single,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--single {
|
||||||
|
border-radius: 0.3rem;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
height: calc(2.875rem + 2px);
|
||||||
|
line-height: 1;
|
||||||
|
padding: 1rem 1.4375rem 1rem 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow {
|
||||||
|
width: 0.3125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow b,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
|
||||||
|
border-width: 0.3125rem 0.3125rem 0 0.3125rem;
|
||||||
|
margin-left: -0.3125rem;
|
||||||
|
margin-left: -1rem;
|
||||||
|
margin-top: -0.15625rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-lg,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple {
|
||||||
|
min-height: calc(2.875rem + 2px);
|
||||||
|
border-radius: 0.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__choice,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
line-height: 1;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
margin: 0rem 0 0 0.25rem;
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
height: calc(2.875rem + 2px)-2;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__clear,
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear,
|
||||||
|
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4 .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
||||||
|
border-color: transparent transparent #6c757d transparent;
|
||||||
|
border-width: 0 0.3125rem 0.3125rem 0.3125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group-lg .select2-container--bootstrap4 .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
||||||
|
border-color: transparent transparent #6c757d transparent;
|
||||||
|
border-width: 0 0.3125rem 0.3125rem 0.3125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single {
|
||||||
|
padding-left: 1.125rem;
|
||||||
|
padding-right: 0.375rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__rendered {
|
||||||
|
padding-right: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__clear {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow {
|
||||||
|
left: 0.375rem;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow b {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice,
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0.1875rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
|
||||||
|
margin-left: 2px;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-warning .select2-dropdown,
|
||||||
|
.has-warning .select2-selection {
|
||||||
|
border-color: #ffc107;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-warning .select2-container--focus .select2-selection,
|
||||||
|
.has-warning .select2-container--open .select2-selection {
|
||||||
|
border-color: #d39e00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-warning.select2-drop-active {
|
||||||
|
border-color: #d39e00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-warning.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #d39e00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-error .select2-dropdown,
|
||||||
|
.has-error .select2-selection {
|
||||||
|
border-color: #dc3545;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-error .select2-container--focus .select2-selection,
|
||||||
|
.has-error .select2-container--open .select2-selection {
|
||||||
|
border-color: #bd2130;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-error.select2-drop-active {
|
||||||
|
border-color: #bd2130;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-error.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #bd2130;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-success .select2-dropdown,
|
||||||
|
.has-success .select2-selection {
|
||||||
|
border-color: #28a745;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-success .select2-container--focus .select2-selection,
|
||||||
|
.has-success .select2-container--open .select2-selection {
|
||||||
|
border-color: #1e7e34;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-success.select2-drop-active {
|
||||||
|
border-color: #1e7e34;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-success.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #1e7e34;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap4>.selection>.select2-selection,
|
||||||
|
.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap4>.selection>.select2-selection.form-control {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap4:not(:last-child)>.selection>.select2-selection,
|
||||||
|
.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap4:not(:last-child)>.selection>.select2-selection.form-control {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap4:last-child>.selection>.select2-selection,
|
||||||
|
.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap4:last-child>.selection>.select2-selection.form-control {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-container--bootstrap4 {
|
||||||
|
display: table;
|
||||||
|
table-layout: fixed;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-container--bootstrap4>.selection>.select2-selection.form-control {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-container--bootstrap4.select2-container--open,
|
||||||
|
.input-group>.select2-container--bootstrap4.select2-container--focus {
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group>.select2-container--bootstrap4,
|
||||||
|
.input-group>.select2-container--bootstrap4 .input-group-btn,
|
||||||
|
.input-group>.select2-container--bootstrap4 .input-group-btn .btn {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control.select2-hidden-accessible {
|
||||||
|
position: absolute !important;
|
||||||
|
width: 1px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 576px) {
|
||||||
|
.form-inline .select2-container--bootstrap4 {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+8
-11
@@ -118,12 +118,14 @@
|
|||||||
.select2-hidden-accessible {
|
.select2-hidden-accessible {
|
||||||
border: 0 !important;
|
border: 0 !important;
|
||||||
clip: rect(0 0 0 0) !important;
|
clip: rect(0 0 0 0) !important;
|
||||||
|
-webkit-clip-path: inset(50%) !important;
|
||||||
|
clip-path: inset(50%) !important;
|
||||||
height: 1px !important;
|
height: 1px !important;
|
||||||
margin: -1px !important;
|
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
position: absolute !important;
|
position: absolute !important;
|
||||||
width: 1px !important; }
|
width: 1px !important;
|
||||||
|
white-space: nowrap !important; }
|
||||||
|
|
||||||
.select2-container--default .select2-selection--single {
|
.select2-container--default .select2-selection--single {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
@@ -186,16 +188,13 @@
|
|||||||
width: 100%; }
|
width: 100%; }
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
|
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
|
||||||
list-style: none; }
|
list-style: none; }
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
|
|
||||||
color: #999;
|
|
||||||
margin-top: 5px;
|
|
||||||
float: left; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__clear {
|
.select2-container--default .select2-selection--multiple .select2-selection__clear {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
float: right;
|
float: right;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
margin-right: 10px; }
|
margin-right: 10px;
|
||||||
|
padding: 1px; }
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__choice {
|
.select2-container--default .select2-selection--multiple .select2-selection__choice {
|
||||||
background-color: #e4e4e4;
|
background-color: #e4e4e4;
|
||||||
border: 1px solid #aaa;
|
border: 1px solid #aaa;
|
||||||
@@ -214,7 +213,7 @@
|
|||||||
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
|
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
|
||||||
color: #333; }
|
color: #333; }
|
||||||
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||||
float: right; }
|
float: right; }
|
||||||
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||||
@@ -420,9 +419,7 @@
|
|||||||
color: #555; }
|
color: #555; }
|
||||||
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||||
float: right; }
|
float: right;
|
||||||
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
margin-right: auto; }
|
margin-right: auto; }
|
||||||
|
|
||||||
|
|||||||
Vendored
+583
-220
@@ -1,11 +1,11 @@
|
|||||||
/*!
|
/*!
|
||||||
* Select2 4.0.5
|
* Select2 4.0.13
|
||||||
* https://select2.github.io
|
* https://select2.github.io
|
||||||
*
|
*
|
||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* https://github.com/select2/select2/blob/master/LICENSE.md
|
* https://github.com/select2/select2/blob/master/LICENSE.md
|
||||||
*/
|
*/
|
||||||
(function (factory) {
|
;(function (factory) {
|
||||||
if (typeof define === 'function' && define.amd) {
|
if (typeof define === 'function' && define.amd) {
|
||||||
// AMD. Register as an anonymous module.
|
// AMD. Register as an anonymous module.
|
||||||
define(['jquery'], factory);
|
define(['jquery'], factory);
|
||||||
@@ -574,10 +574,10 @@ S2.define('select2/utils',[
|
|||||||
DecoratedClass.prototype = new ctr();
|
DecoratedClass.prototype = new ctr();
|
||||||
|
|
||||||
for (var m = 0; m < superMethods.length; m++) {
|
for (var m = 0; m < superMethods.length; m++) {
|
||||||
var superMethod = superMethods[m];
|
var superMethod = superMethods[m];
|
||||||
|
|
||||||
DecoratedClass.prototype[superMethod] =
|
DecoratedClass.prototype[superMethod] =
|
||||||
SuperClass.prototype[superMethod];
|
SuperClass.prototype[superMethod];
|
||||||
}
|
}
|
||||||
|
|
||||||
var calledMethod = function (methodName) {
|
var calledMethod = function (methodName) {
|
||||||
@@ -772,6 +772,70 @@ S2.define('select2/utils',[
|
|||||||
$element.append($nodes);
|
$element.append($nodes);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Cache objects in Utils.__cache instead of $.data (see #4346)
|
||||||
|
Utils.__cache = {};
|
||||||
|
|
||||||
|
var id = 0;
|
||||||
|
Utils.GetUniqueElementId = function (element) {
|
||||||
|
// Get a unique element Id. If element has no id,
|
||||||
|
// creates a new unique number, stores it in the id
|
||||||
|
// attribute and returns the new id.
|
||||||
|
// If an id already exists, it simply returns it.
|
||||||
|
|
||||||
|
var select2Id = element.getAttribute('data-select2-id');
|
||||||
|
if (select2Id == null) {
|
||||||
|
// If element has id, use it.
|
||||||
|
if (element.id) {
|
||||||
|
select2Id = element.id;
|
||||||
|
element.setAttribute('data-select2-id', select2Id);
|
||||||
|
} else {
|
||||||
|
element.setAttribute('data-select2-id', ++id);
|
||||||
|
select2Id = id.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return select2Id;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.StoreData = function (element, name, value) {
|
||||||
|
// Stores an item in the cache for a specified element.
|
||||||
|
// name is the cache key.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (!Utils.__cache[id]) {
|
||||||
|
Utils.__cache[id] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.__cache[id][name] = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.GetData = function (element, name) {
|
||||||
|
// Retrieves a value from the cache by its key (name)
|
||||||
|
// name is optional. If no name specified, return
|
||||||
|
// all cache items for the specified element.
|
||||||
|
// and for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (name) {
|
||||||
|
if (Utils.__cache[id]) {
|
||||||
|
if (Utils.__cache[id][name] != null) {
|
||||||
|
return Utils.__cache[id][name];
|
||||||
|
}
|
||||||
|
return $(element).data(name); // Fallback to HTML5 data attribs.
|
||||||
|
}
|
||||||
|
return $(element).data(name); // Fallback to HTML5 data attribs.
|
||||||
|
} else {
|
||||||
|
return Utils.__cache[id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.RemoveData = function (element) {
|
||||||
|
// Removes all cached items for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (Utils.__cache[id] != null) {
|
||||||
|
delete Utils.__cache[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
element.removeAttribute('data-select2-id');
|
||||||
|
};
|
||||||
|
|
||||||
return Utils;
|
return Utils;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -791,7 +855,7 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
Results.prototype.render = function () {
|
Results.prototype.render = function () {
|
||||||
var $results = $(
|
var $results = $(
|
||||||
'<ul class="select2-results__options" role="tree"></ul>'
|
'<ul class="select2-results__options" role="listbox"></ul>'
|
||||||
);
|
);
|
||||||
|
|
||||||
if (this.options.get('multiple')) {
|
if (this.options.get('multiple')) {
|
||||||
@@ -814,7 +878,7 @@ S2.define('select2/results',[
|
|||||||
this.hideLoading();
|
this.hideLoading();
|
||||||
|
|
||||||
var $message = $(
|
var $message = $(
|
||||||
'<li role="treeitem" aria-live="assertive"' +
|
'<li role="alert" aria-live="assertive"' +
|
||||||
' class="select2-results__option"></li>'
|
' class="select2-results__option"></li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -907,7 +971,7 @@ S2.define('select2/results',[
|
|||||||
$options.each(function () {
|
$options.each(function () {
|
||||||
var $option = $(this);
|
var $option = $(this);
|
||||||
|
|
||||||
var item = $.data(this, 'data');
|
var item = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
// id needs to be converted to a string when comparing
|
// id needs to be converted to a string when comparing
|
||||||
var id = '' + item.id;
|
var id = '' + item.id;
|
||||||
@@ -948,11 +1012,16 @@ S2.define('select2/results',[
|
|||||||
option.className = 'select2-results__option';
|
option.className = 'select2-results__option';
|
||||||
|
|
||||||
var attrs = {
|
var attrs = {
|
||||||
'role': 'treeitem',
|
'role': 'option',
|
||||||
'aria-selected': 'false'
|
'aria-selected': 'false'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (data.disabled) {
|
var matches = window.Element.prototype.matches ||
|
||||||
|
window.Element.prototype.msMatchesSelector ||
|
||||||
|
window.Element.prototype.webkitMatchesSelector;
|
||||||
|
|
||||||
|
if ((data.element != null && matches.call(data.element, ':disabled')) ||
|
||||||
|
(data.element == null && data.disabled)) {
|
||||||
delete attrs['aria-selected'];
|
delete attrs['aria-selected'];
|
||||||
attrs['aria-disabled'] = 'true';
|
attrs['aria-disabled'] = 'true';
|
||||||
}
|
}
|
||||||
@@ -1012,7 +1081,7 @@ S2.define('select2/results',[
|
|||||||
this.template(data, option);
|
this.template(data, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
$.data(option, 'data', data);
|
Utils.StoreData(option, 'data', data);
|
||||||
|
|
||||||
return option;
|
return option;
|
||||||
};
|
};
|
||||||
@@ -1053,7 +1122,10 @@ S2.define('select2/results',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.setClasses();
|
self.setClasses();
|
||||||
self.highlightFirstItem();
|
|
||||||
|
if (self.options.get('scrollAfterSelect')) {
|
||||||
|
self.highlightFirstItem();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('unselect', function () {
|
container.on('unselect', function () {
|
||||||
@@ -1062,7 +1134,10 @@ S2.define('select2/results',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.setClasses();
|
self.setClasses();
|
||||||
self.highlightFirstItem();
|
|
||||||
|
if (self.options.get('scrollAfterSelect')) {
|
||||||
|
self.highlightFirstItem();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
@@ -1098,7 +1173,7 @@ S2.define('select2/results',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlighted.data('data');
|
var data = Utils.GetData($highlighted[0], 'data');
|
||||||
|
|
||||||
if ($highlighted.attr('aria-selected') == 'true') {
|
if ($highlighted.attr('aria-selected') == 'true') {
|
||||||
self.trigger('close', {});
|
self.trigger('close', {});
|
||||||
@@ -1116,8 +1191,9 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
var currentIndex = $options.index($highlighted);
|
var currentIndex = $options.index($highlighted);
|
||||||
|
|
||||||
// If we are already at te top, don't move further
|
// If we are already at the top, don't move further
|
||||||
if (currentIndex === 0) {
|
// If no options, currentIndex will be -1
|
||||||
|
if (currentIndex <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1210,7 +1286,7 @@ S2.define('select2/results',[
|
|||||||
function (evt) {
|
function (evt) {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
|
|
||||||
var data = $this.data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
if ($this.attr('aria-selected') === 'true') {
|
if ($this.attr('aria-selected') === 'true') {
|
||||||
if (self.options.get('multiple')) {
|
if (self.options.get('multiple')) {
|
||||||
@@ -1233,7 +1309,7 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
||||||
function (evt) {
|
function (evt) {
|
||||||
var data = $(this).data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
self.getHighlightedResults()
|
self.getHighlightedResults()
|
||||||
.removeClass('select2-results__option--highlighted');
|
.removeClass('select2-results__option--highlighted');
|
||||||
@@ -1348,14 +1424,15 @@ S2.define('select2/selection/base',[
|
|||||||
|
|
||||||
this._tabindex = 0;
|
this._tabindex = 0;
|
||||||
|
|
||||||
if (this.$element.data('old-tabindex') != null) {
|
if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
|
||||||
this._tabindex = this.$element.data('old-tabindex');
|
this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
|
||||||
} else if (this.$element.attr('tabindex') != null) {
|
} else if (this.$element.attr('tabindex') != null) {
|
||||||
this._tabindex = this.$element.attr('tabindex');
|
this._tabindex = this.$element.attr('tabindex');
|
||||||
}
|
}
|
||||||
|
|
||||||
$selection.attr('title', this.$element.attr('title'));
|
$selection.attr('title', this.$element.attr('title'));
|
||||||
$selection.attr('tabindex', this._tabindex);
|
$selection.attr('tabindex', this._tabindex);
|
||||||
|
$selection.attr('aria-disabled', 'false');
|
||||||
|
|
||||||
this.$selection = $selection;
|
this.$selection = $selection;
|
||||||
|
|
||||||
@@ -1365,7 +1442,6 @@ S2.define('select2/selection/base',[
|
|||||||
BaseSelection.prototype.bind = function (container, $container) {
|
BaseSelection.prototype.bind = function (container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var id = container.id + '-container';
|
|
||||||
var resultsId = container.id + '-results';
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
this.container = container;
|
this.container = container;
|
||||||
@@ -1408,17 +1484,19 @@ S2.define('select2/selection/base',[
|
|||||||
self.$selection.removeAttr('aria-activedescendant');
|
self.$selection.removeAttr('aria-activedescendant');
|
||||||
self.$selection.removeAttr('aria-owns');
|
self.$selection.removeAttr('aria-owns');
|
||||||
|
|
||||||
self.$selection.focus();
|
self.$selection.trigger('focus');
|
||||||
|
|
||||||
self._detachCloseHandler(container);
|
self._detachCloseHandler(container);
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('enable', function () {
|
container.on('enable', function () {
|
||||||
self.$selection.attr('tabindex', self._tabindex);
|
self.$selection.attr('tabindex', self._tabindex);
|
||||||
|
self.$selection.attr('aria-disabled', 'false');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('disable', function () {
|
container.on('disable', function () {
|
||||||
self.$selection.attr('tabindex', '-1');
|
self.$selection.attr('tabindex', '-1');
|
||||||
|
self.$selection.attr('aria-disabled', 'true');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1441,7 +1519,6 @@ S2.define('select2/selection/base',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
BaseSelection.prototype._attachCloseHandler = function (container) {
|
BaseSelection.prototype._attachCloseHandler = function (container) {
|
||||||
var self = this;
|
|
||||||
|
|
||||||
$(document.body).on('mousedown.select2.' + container.id, function (e) {
|
$(document.body).on('mousedown.select2.' + container.id, function (e) {
|
||||||
var $target = $(e.target);
|
var $target = $(e.target);
|
||||||
@@ -1451,13 +1528,11 @@ S2.define('select2/selection/base',[
|
|||||||
var $all = $('.select2.select2-container--open');
|
var $all = $('.select2.select2-container--open');
|
||||||
|
|
||||||
$all.each(function () {
|
$all.each(function () {
|
||||||
var $this = $(this);
|
|
||||||
|
|
||||||
if (this == $select[0]) {
|
if (this == $select[0]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $element = $this.data('element');
|
var $element = Utils.GetData(this, 'element');
|
||||||
|
|
||||||
$element.select2('close');
|
$element.select2('close');
|
||||||
});
|
});
|
||||||
@@ -1481,6 +1556,27 @@ S2.define('select2/selection/base',[
|
|||||||
throw new Error('The `update` method must be defined in child classes.');
|
throw new Error('The `update` method must be defined in child classes.');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "enabled" (not "disabled") state of this
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @return {true} if the instance is not disabled.
|
||||||
|
* @return {false} if the instance is disabled.
|
||||||
|
*/
|
||||||
|
BaseSelection.prototype.isEnabled = function () {
|
||||||
|
return !this.isDisabled();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "disabled" state of this object.
|
||||||
|
*
|
||||||
|
* @return {true} if the disabled option is true.
|
||||||
|
* @return {false} if the disabled option is false.
|
||||||
|
*/
|
||||||
|
BaseSelection.prototype.isDisabled = function () {
|
||||||
|
return this.options.get('disabled');
|
||||||
|
};
|
||||||
|
|
||||||
return BaseSelection;
|
return BaseSelection;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1518,7 +1614,10 @@ S2.define('select2/selection/single',[
|
|||||||
|
|
||||||
var id = container.id + '-container';
|
var id = container.id + '-container';
|
||||||
|
|
||||||
this.$selection.find('.select2-selection__rendered').attr('id', id);
|
this.$selection.find('.select2-selection__rendered')
|
||||||
|
.attr('id', id)
|
||||||
|
.attr('role', 'textbox')
|
||||||
|
.attr('aria-readonly', 'true');
|
||||||
this.$selection.attr('aria-labelledby', id);
|
this.$selection.attr('aria-labelledby', id);
|
||||||
|
|
||||||
this.$selection.on('mousedown', function (evt) {
|
this.$selection.on('mousedown', function (evt) {
|
||||||
@@ -1542,17 +1641,15 @@ S2.define('select2/selection/single',[
|
|||||||
|
|
||||||
container.on('focus', function (evt) {
|
container.on('focus', function (evt) {
|
||||||
if (!container.isOpen()) {
|
if (!container.isOpen()) {
|
||||||
self.$selection.focus();
|
self.$selection.trigger('focus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('selection:update', function (params) {
|
|
||||||
self.update(params.data);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SingleSelection.prototype.clear = function () {
|
SingleSelection.prototype.clear = function () {
|
||||||
this.$selection.find('.select2-selection__rendered').empty();
|
var $rendered = this.$selection.find('.select2-selection__rendered');
|
||||||
|
$rendered.empty();
|
||||||
|
$rendered.removeAttr('title'); // clear tooltip on empty
|
||||||
};
|
};
|
||||||
|
|
||||||
SingleSelection.prototype.display = function (data, container) {
|
SingleSelection.prototype.display = function (data, container) {
|
||||||
@@ -1578,7 +1675,14 @@ S2.define('select2/selection/single',[
|
|||||||
var formatted = this.display(selection, $rendered);
|
var formatted = this.display(selection, $rendered);
|
||||||
|
|
||||||
$rendered.empty().append(formatted);
|
$rendered.empty().append(formatted);
|
||||||
$rendered.prop('title', selection.title || selection.text);
|
|
||||||
|
var title = selection.title || selection.text;
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
$rendered.attr('title', title);
|
||||||
|
} else {
|
||||||
|
$rendered.removeAttr('title');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return SingleSelection;
|
return SingleSelection;
|
||||||
@@ -1623,14 +1727,14 @@ S2.define('select2/selection/multiple',[
|
|||||||
'.select2-selection__choice__remove',
|
'.select2-selection__choice__remove',
|
||||||
function (evt) {
|
function (evt) {
|
||||||
// Ignore the event if it is disabled
|
// Ignore the event if it is disabled
|
||||||
if (self.options.get('disabled')) {
|
if (self.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $remove = $(this);
|
var $remove = $(this);
|
||||||
var $selection = $remove.parent();
|
var $selection = $remove.parent();
|
||||||
|
|
||||||
var data = $selection.data('data');
|
var data = Utils.GetData($selection[0], 'data');
|
||||||
|
|
||||||
self.trigger('unselect', {
|
self.trigger('unselect', {
|
||||||
originalEvent: evt,
|
originalEvent: evt,
|
||||||
@@ -1641,7 +1745,9 @@ S2.define('select2/selection/multiple',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
MultipleSelection.prototype.clear = function () {
|
MultipleSelection.prototype.clear = function () {
|
||||||
this.$selection.find('.select2-selection__rendered').empty();
|
var $rendered = this.$selection.find('.select2-selection__rendered');
|
||||||
|
$rendered.empty();
|
||||||
|
$rendered.removeAttr('title');
|
||||||
};
|
};
|
||||||
|
|
||||||
MultipleSelection.prototype.display = function (data, container) {
|
MultipleSelection.prototype.display = function (data, container) {
|
||||||
@@ -1679,9 +1785,14 @@ S2.define('select2/selection/multiple',[
|
|||||||
var formatted = this.display(selection, $selection);
|
var formatted = this.display(selection, $selection);
|
||||||
|
|
||||||
$selection.append(formatted);
|
$selection.append(formatted);
|
||||||
$selection.prop('title', selection.title || selection.text);
|
|
||||||
|
|
||||||
$selection.data('data', selection);
|
var title = selection.title || selection.text;
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
$selection.attr('title', title);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.StoreData($selection[0], 'data', selection);
|
||||||
|
|
||||||
$selections.push($selection);
|
$selections.push($selection);
|
||||||
}
|
}
|
||||||
@@ -1746,8 +1857,9 @@ S2.define('select2/selection/placeholder',[
|
|||||||
|
|
||||||
S2.define('select2/selection/allowClear',[
|
S2.define('select2/selection/allowClear',[
|
||||||
'jquery',
|
'jquery',
|
||||||
'../keys'
|
'../keys',
|
||||||
], function ($, KEYS) {
|
'../utils'
|
||||||
|
], function ($, KEYS, Utils) {
|
||||||
function AllowClear () { }
|
function AllowClear () { }
|
||||||
|
|
||||||
AllowClear.prototype.bind = function (decorated, container, $container) {
|
AllowClear.prototype.bind = function (decorated, container, $container) {
|
||||||
@@ -1776,7 +1888,7 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
AllowClear.prototype._handleClear = function (_, evt) {
|
AllowClear.prototype._handleClear = function (_, evt) {
|
||||||
// Ignore the event if it is disabled
|
// Ignore the event if it is disabled
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1789,10 +1901,22 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
|
|
||||||
var data = $clear.data('data');
|
var data = Utils.GetData($clear[0], 'data');
|
||||||
|
|
||||||
|
var previousVal = this.$element.val();
|
||||||
|
this.$element.val(this.placeholder.id);
|
||||||
|
|
||||||
|
var unselectData = {
|
||||||
|
data: data
|
||||||
|
};
|
||||||
|
this.trigger('clear', unselectData);
|
||||||
|
if (unselectData.prevented) {
|
||||||
|
this.$element.val(previousVal);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (var d = 0; d < data.length; d++) {
|
for (var d = 0; d < data.length; d++) {
|
||||||
var unselectData = {
|
unselectData = {
|
||||||
data: data[d]
|
data: data[d]
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1802,11 +1926,12 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
// If the event was prevented, don't clear it out.
|
// If the event was prevented, don't clear it out.
|
||||||
if (unselectData.prevented) {
|
if (unselectData.prevented) {
|
||||||
|
this.$element.val(previousVal);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element.val(this.placeholder.id).trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
this.trigger('toggle', {});
|
this.trigger('toggle', {});
|
||||||
};
|
};
|
||||||
@@ -1829,12 +1954,14 @@ S2.define('select2/selection/allowClear',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var removeAll = this.options.get('translations').get('removeAllItems');
|
||||||
|
|
||||||
var $remove = $(
|
var $remove = $(
|
||||||
'<span class="select2-selection__clear">' +
|
'<span class="select2-selection__clear" title="' + removeAll() +'">' +
|
||||||
'×' +
|
'×' +
|
||||||
'</span>'
|
'</span>'
|
||||||
);
|
);
|
||||||
$remove.data('data', data);
|
Utils.StoreData($remove[0], 'data', data);
|
||||||
|
|
||||||
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
||||||
};
|
};
|
||||||
@@ -1856,7 +1983,7 @@ S2.define('select2/selection/search',[
|
|||||||
'<li class="select2-search select2-search--inline">' +
|
'<li class="select2-search select2-search--inline">' +
|
||||||
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
||||||
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
||||||
' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
|
' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
|
||||||
'</li>'
|
'</li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[
|
|||||||
Search.prototype.bind = function (decorated, container, $container) {
|
Search.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
|
self.$search.attr('aria-controls', resultsId);
|
||||||
self.$search.trigger('focus');
|
self.$search.trigger('focus');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
self.$search.val('');
|
self.$search.val('');
|
||||||
|
self.$search.removeAttr('aria-controls');
|
||||||
self.$search.removeAttr('aria-activedescendant');
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
self.$search.trigger('focus');
|
self.$search.trigger('focus');
|
||||||
});
|
});
|
||||||
@@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
container.on('results:focus', function (params) {
|
container.on('results:focus', function (params) {
|
||||||
self.$search.attr('aria-activedescendant', params.id);
|
if (params.data._resultId) {
|
||||||
|
self.$search.attr('aria-activedescendant', params.data._resultId);
|
||||||
|
} else {
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
|
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
|
||||||
@@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[
|
|||||||
.prev('.select2-selection__choice');
|
.prev('.select2-selection__choice');
|
||||||
|
|
||||||
if ($previousChoice.length > 0) {
|
if ($previousChoice.length > 0) {
|
||||||
var item = $previousChoice.data('data');
|
var item = Utils.GetData($previousChoice[0], 'data');
|
||||||
|
|
||||||
self.searchRemoveChoice(item);
|
self.searchRemoveChoice(item);
|
||||||
|
|
||||||
@@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.$selection.on('click', '.select2-search--inline', function (evt) {
|
||||||
|
if (self.$search.val()) {
|
||||||
|
evt.stopPropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Try to detect the IE version should the `documentMode` property that
|
// Try to detect the IE version should the `documentMode` property that
|
||||||
// is stored on the document. This is only implemented in IE and is
|
// is stored on the document. This is only implemented in IE and is
|
||||||
// slightly cleaner than doing a user agent check.
|
// slightly cleaner than doing a user agent check.
|
||||||
@@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[
|
|||||||
|
|
||||||
this.resizeSearch();
|
this.resizeSearch();
|
||||||
if (searchHadFocus) {
|
if (searchHadFocus) {
|
||||||
this.$search.focus();
|
this.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[
|
|||||||
var width = '';
|
var width = '';
|
||||||
|
|
||||||
if (this.$search.attr('placeholder') !== '') {
|
if (this.$search.attr('placeholder') !== '') {
|
||||||
width = this.$selection.find('.select2-selection__rendered').innerWidth();
|
width = this.$selection.find('.select2-selection__rendered').width();
|
||||||
} else {
|
} else {
|
||||||
var minimumWidth = this.$search.val().length + 1;
|
var minimumWidth = this.$search.val().length + 1;
|
||||||
|
|
||||||
@@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[
|
|||||||
'open', 'opening',
|
'open', 'opening',
|
||||||
'close', 'closing',
|
'close', 'closing',
|
||||||
'select', 'selecting',
|
'select', 'selecting',
|
||||||
'unselect', 'unselecting'
|
'unselect', 'unselecting',
|
||||||
|
'clear', 'clearing'
|
||||||
];
|
];
|
||||||
|
|
||||||
var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
|
var preventableEvents = [
|
||||||
|
'opening', 'closing', 'selecting', 'unselecting', 'clearing'
|
||||||
|
];
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
@@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[
|
|||||||
'\u019F': 'O',
|
'\u019F': 'O',
|
||||||
'\uA74A': 'O',
|
'\uA74A': 'O',
|
||||||
'\uA74C': 'O',
|
'\uA74C': 'O',
|
||||||
|
'\u0152': 'OE',
|
||||||
'\u01A2': 'OI',
|
'\u01A2': 'OI',
|
||||||
'\uA74E': 'OO',
|
'\uA74E': 'OO',
|
||||||
'\u0222': 'OU',
|
'\u0222': 'OU',
|
||||||
@@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[
|
|||||||
'\uA74B': 'o',
|
'\uA74B': 'o',
|
||||||
'\uA74D': 'o',
|
'\uA74D': 'o',
|
||||||
'\u0275': 'o',
|
'\u0275': 'o',
|
||||||
|
'\u0153': 'oe',
|
||||||
'\u01A3': 'oi',
|
'\u01A3': 'oi',
|
||||||
'\u0223': 'ou',
|
'\u0223': 'ou',
|
||||||
'\uA74F': 'oo',
|
'\uA74F': 'oo',
|
||||||
@@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[
|
|||||||
'\u03CD': '\u03C5',
|
'\u03CD': '\u03C5',
|
||||||
'\u03CB': '\u03C5',
|
'\u03CB': '\u03C5',
|
||||||
'\u03B0': '\u03C5',
|
'\u03B0': '\u03C5',
|
||||||
'\u03C9': '\u03C9',
|
'\u03CE': '\u03C9',
|
||||||
'\u03C2': '\u03C3'
|
'\u03C2': '\u03C3',
|
||||||
|
'\u2019': '\''
|
||||||
};
|
};
|
||||||
|
|
||||||
return diacritics;
|
return diacritics;
|
||||||
@@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[
|
|||||||
if ($(data.element).is('option')) {
|
if ($(data.element).is('option')) {
|
||||||
data.element.selected = true;
|
data.element.selected = true;
|
||||||
|
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.$element.val(val);
|
self.$element.val(val);
|
||||||
self.$element.trigger('change');
|
self.$element.trigger('input').trigger('change');
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var val = data.id;
|
var val = data.id;
|
||||||
|
|
||||||
this.$element.val(val);
|
this.$element.val(val);
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[
|
|||||||
if ($(data.element).is('option')) {
|
if ($(data.element).is('option')) {
|
||||||
data.element.selected = false;
|
data.element.selected = false;
|
||||||
|
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[
|
|||||||
|
|
||||||
self.$element.val(val);
|
self.$element.val(val);
|
||||||
|
|
||||||
self.$element.trigger('change');
|
self.$element.trigger('input').trigger('change');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[
|
|||||||
// Remove anything added to child elements
|
// Remove anything added to child elements
|
||||||
this.$element.find('*').each(function () {
|
this.$element.find('*').each(function () {
|
||||||
// Remove any custom data set by Select2
|
// Remove any custom data set by Select2
|
||||||
$.removeData(this, 'data');
|
Utils.RemoveData(this);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[
|
|||||||
normalizedData.element = option;
|
normalizedData.element = option;
|
||||||
|
|
||||||
// Override the option's data with the combined data
|
// Override the option's data with the combined data
|
||||||
$.data(option, 'data', normalizedData);
|
Utils.StoreData(option, 'data', normalizedData);
|
||||||
|
|
||||||
return $option;
|
return $option;
|
||||||
};
|
};
|
||||||
@@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[
|
|||||||
SelectAdapter.prototype.item = function ($option) {
|
SelectAdapter.prototype.item = function ($option) {
|
||||||
var data = {};
|
var data = {};
|
||||||
|
|
||||||
data = $.data($option[0], 'data');
|
data = Utils.GetData($option[0], 'data');
|
||||||
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
return data;
|
return data;
|
||||||
@@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[
|
|||||||
data = this._normalizeItem(data);
|
data = this._normalizeItem(data);
|
||||||
data.element = $option[0];
|
data.element = $option[0];
|
||||||
|
|
||||||
$.data($option[0], 'data', data);
|
Utils.StoreData($option[0], 'data', data);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
SelectAdapter.prototype._normalizeItem = function (item) {
|
SelectAdapter.prototype._normalizeItem = function (item) {
|
||||||
if (!$.isPlainObject(item)) {
|
if (item !== Object(item)) {
|
||||||
item = {
|
item = {
|
||||||
id: item,
|
id: item,
|
||||||
text: item
|
text: item
|
||||||
@@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[
|
|||||||
'jquery'
|
'jquery'
|
||||||
], function (SelectAdapter, Utils, $) {
|
], function (SelectAdapter, Utils, $) {
|
||||||
function ArrayAdapter ($element, options) {
|
function ArrayAdapter ($element, options) {
|
||||||
var data = options.get('data') || [];
|
this._dataToConvert = options.get('data') || [];
|
||||||
|
|
||||||
ArrayAdapter.__super__.constructor.call(this, $element, options);
|
ArrayAdapter.__super__.constructor.call(this, $element, options);
|
||||||
|
|
||||||
this.addOptions(this.convertToOptions(data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.Extend(ArrayAdapter, SelectAdapter);
|
Utils.Extend(ArrayAdapter, SelectAdapter);
|
||||||
|
|
||||||
|
ArrayAdapter.prototype.bind = function (container, $container) {
|
||||||
|
ArrayAdapter.__super__.bind.call(this, container, $container);
|
||||||
|
|
||||||
|
this.addOptions(this.convertToOptions(this._dataToConvert));
|
||||||
|
};
|
||||||
|
|
||||||
ArrayAdapter.prototype.select = function (data) {
|
ArrayAdapter.prototype.select = function (data) {
|
||||||
var $option = this.$element.find('option').filter(function (i, elm) {
|
var $option = this.$element.find('option').filter(function (i, elm) {
|
||||||
return elm.value == data.id.toString();
|
return elm.value == data.id.toString();
|
||||||
@@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[
|
|||||||
}, function () {
|
}, function () {
|
||||||
// Attempt to detect if a request was aborted
|
// Attempt to detect if a request was aborted
|
||||||
// Only works if the transport exposes a status property
|
// Only works if the transport exposes a status property
|
||||||
if ($request.status && $request.status === '0') {
|
if ('status' in $request &&
|
||||||
|
($request.status === 0 || $request.status === '0')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Tags.prototype._removeOldTags = function (_) {
|
Tags.prototype._removeOldTags = function (_) {
|
||||||
var tag = this._lastTag;
|
|
||||||
|
|
||||||
var $options = this.$element.find('option[data-select2-tag]');
|
var $options = this.$element.find('option[data-select2-tag]');
|
||||||
|
|
||||||
$options.each(function () {
|
$options.each(function () {
|
||||||
@@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[
|
|||||||
// Replace the search term if we have the search box
|
// Replace the search term if we have the search box
|
||||||
if (this.$search.length) {
|
if (this.$search.length) {
|
||||||
this.$search.val(tokenData.term);
|
this.$search.val(tokenData.term);
|
||||||
this.$search.focus();
|
this.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
|
|
||||||
params.term = tokenData.term;
|
params.term = tokenData.term;
|
||||||
@@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[
|
|||||||
decorated.call(this, $e, options);
|
decorated.call(this, $e, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MaximumSelectionLength.prototype.bind =
|
||||||
|
function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('select', function () {
|
||||||
|
self._checkIfMaximumSelected();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
MaximumSelectionLength.prototype.query =
|
MaximumSelectionLength.prototype.query =
|
||||||
function (decorated, params, callback) {
|
function (decorated, params, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
this._checkIfMaximumSelected(function () {
|
||||||
|
decorated.call(self, params, callback);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
MaximumSelectionLength.prototype._checkIfMaximumSelected =
|
||||||
|
function (_, successCallback) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
this.current(function (currentData) {
|
this.current(function (currentData) {
|
||||||
var count = currentData != null ? currentData.length : 0;
|
var count = currentData != null ? currentData.length : 0;
|
||||||
if (self.maximumSelectionLength > 0 &&
|
if (self.maximumSelectionLength > 0 &&
|
||||||
@@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
decorated.call(self, params, callback);
|
|
||||||
|
if (successCallback) {
|
||||||
|
successCallback();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Dropdown.prototype.position = function ($dropdown, $container) {
|
Dropdown.prototype.position = function ($dropdown, $container) {
|
||||||
// Should be implmented in subclasses
|
// Should be implemented in subclasses
|
||||||
};
|
};
|
||||||
|
|
||||||
Dropdown.prototype.destroy = function () {
|
Dropdown.prototype.destroy = function () {
|
||||||
@@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[
|
|||||||
'<span class="select2-search select2-search--dropdown">' +
|
'<span class="select2-search select2-search--dropdown">' +
|
||||||
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
||||||
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
||||||
' spellcheck="false" role="textbox" />' +
|
' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
|
||||||
'</span>'
|
'</span>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[
|
|||||||
Search.prototype.bind = function (decorated, container, $container) {
|
Search.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
this.$search.on('keydown', function (evt) {
|
this.$search.on('keydown', function (evt) {
|
||||||
@@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[
|
|||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
self.$search.attr('tabindex', 0);
|
self.$search.attr('tabindex', 0);
|
||||||
|
self.$search.attr('aria-controls', resultsId);
|
||||||
|
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
|
|
||||||
window.setTimeout(function () {
|
window.setTimeout(function () {
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
}, 0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
self.$search.attr('tabindex', -1);
|
self.$search.attr('tabindex', -1);
|
||||||
|
self.$search.removeAttr('aria-controls');
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
|
||||||
self.$search.val('');
|
self.$search.val('');
|
||||||
|
self.$search.trigger('blur');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('focus', function () {
|
container.on('focus', function () {
|
||||||
if (!container.isOpen()) {
|
if (!container.isOpen()) {
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
container.on('results:focus', function (params) {
|
||||||
|
if (params.data._resultId) {
|
||||||
|
self.$search.attr('aria-activedescendant', params.data._resultId);
|
||||||
|
} else {
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Search.prototype.handleSearch = function (evt) {
|
Search.prototype.handleSearch = function (evt) {
|
||||||
@@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
|
|
||||||
if (this.showLoadingMore(data)) {
|
if (this.showLoadingMore(data)) {
|
||||||
this.$results.append(this.$loadingMore);
|
this.$results.append(this.$loadingMore);
|
||||||
|
this.loadMoreIfNeeded();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
self.loading = true;
|
self.loading = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$results.on('scroll', function () {
|
this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
|
||||||
var isLoadMoreVisible = $.contains(
|
};
|
||||||
document.documentElement,
|
|
||||||
self.$loadingMore[0]
|
|
||||||
);
|
|
||||||
|
|
||||||
if (self.loading || !isLoadMoreVisible) {
|
InfiniteScroll.prototype.loadMoreIfNeeded = function () {
|
||||||
return;
|
var isLoadMoreVisible = $.contains(
|
||||||
}
|
document.documentElement,
|
||||||
|
this.$loadingMore[0]
|
||||||
|
);
|
||||||
|
|
||||||
var currentOffset = self.$results.offset().top +
|
if (this.loading || !isLoadMoreVisible) {
|
||||||
self.$results.outerHeight(false);
|
return;
|
||||||
var loadingMoreOffset = self.$loadingMore.offset().top +
|
}
|
||||||
self.$loadingMore.outerHeight(false);
|
|
||||||
|
|
||||||
if (currentOffset + 50 >= loadingMoreOffset) {
|
var currentOffset = this.$results.offset().top +
|
||||||
self.loadMore();
|
this.$results.outerHeight(false);
|
||||||
}
|
var loadingMoreOffset = this.$loadingMore.offset().top +
|
||||||
});
|
this.$loadingMore.outerHeight(false);
|
||||||
|
|
||||||
|
if (currentOffset + 50 >= loadingMoreOffset) {
|
||||||
|
this.loadMore();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
InfiniteScroll.prototype.loadMore = function () {
|
InfiniteScroll.prototype.loadMore = function () {
|
||||||
@@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
var $option = $(
|
var $option = $(
|
||||||
'<li ' +
|
'<li ' +
|
||||||
'class="select2-results__option select2-results__option--load-more"' +
|
'class="select2-results__option select2-results__option--load-more"' +
|
||||||
'role="treeitem" aria-disabled="true"></li>'
|
'role="option" aria-disabled="true"></li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
var message = this.options.get('translations').get('loadingMore');
|
var message = this.options.get('translations').get('loadingMore');
|
||||||
@@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
'../utils'
|
'../utils'
|
||||||
], function ($, Utils) {
|
], function ($, Utils) {
|
||||||
function AttachBody (decorated, $element, options) {
|
function AttachBody (decorated, $element, options) {
|
||||||
this.$dropdownParent = options.get('dropdownParent') || $(document.body);
|
this.$dropdownParent = $(options.get('dropdownParent') || document.body);
|
||||||
|
|
||||||
decorated.call(this, $element, options);
|
decorated.call(this, $element, options);
|
||||||
}
|
}
|
||||||
@@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
AttachBody.prototype.bind = function (decorated, container, $container) {
|
AttachBody.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var setupResultsEvents = false;
|
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
self._showDropdown();
|
self._showDropdown();
|
||||||
self._attachPositioningHandler(container);
|
self._attachPositioningHandler(container);
|
||||||
|
|
||||||
if (!setupResultsEvents) {
|
// Must bind after the results handlers to ensure correct sizing
|
||||||
setupResultsEvents = true;
|
self._bindContainerResultHandlers(container);
|
||||||
|
|
||||||
container.on('results:all', function () {
|
|
||||||
self._positionDropdown();
|
|
||||||
self._resizeDropdown();
|
|
||||||
});
|
|
||||||
|
|
||||||
container.on('results:append', function () {
|
|
||||||
self._positionDropdown();
|
|
||||||
self._resizeDropdown();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
@@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
this.$dropdownContainer.detach();
|
this.$dropdownContainer.detach();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AttachBody.prototype._bindContainerResultHandlers =
|
||||||
|
function (decorated, container) {
|
||||||
|
|
||||||
|
// These should only be bound once
|
||||||
|
if (this._containerResultsHandlersBound) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
container.on('results:all', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('results:append', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('results:message', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('select', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('unselect', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
this._containerResultsHandlersBound = true;
|
||||||
|
};
|
||||||
|
|
||||||
AttachBody.prototype._attachPositioningHandler =
|
AttachBody.prototype._attachPositioningHandler =
|
||||||
function (decorated, container) {
|
function (decorated, container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
@@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
|
|
||||||
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
||||||
$watchers.each(function () {
|
$watchers.each(function () {
|
||||||
$(this).data('select2-scroll-position', {
|
Utils.StoreData(this, 'select2-scroll-position', {
|
||||||
x: $(this).scrollLeft(),
|
x: $(this).scrollLeft(),
|
||||||
y: $(this).scrollTop()
|
y: $(this).scrollTop()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$watchers.on(scrollEvent, function (ev) {
|
$watchers.on(scrollEvent, function (ev) {
|
||||||
var position = $(this).data('select2-scroll-position');
|
var position = Utils.GetData(this, 'select2-scroll-position');
|
||||||
$(this).scrollTop(position.y);
|
$(this).scrollTop(position.y);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
top: container.bottom
|
top: container.bottom
|
||||||
};
|
};
|
||||||
|
|
||||||
// Determine what the parent element is to use for calciulating the offset
|
// Determine what the parent element is to use for calculating the offset
|
||||||
var $offsetParent = this.$dropdownParent;
|
var $offsetParent = this.$dropdownParent;
|
||||||
|
|
||||||
// For statically positoned elements, we need to get the element
|
// For statically positioned elements, we need to get the element
|
||||||
// that is determining the offset
|
// that is determining the offset
|
||||||
if ($offsetParent.css('position') === 'static') {
|
if ($offsetParent.css('position') === 'static') {
|
||||||
$offsetParent = $offsetParent.offsetParent();
|
$offsetParent = $offsetParent.offsetParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentOffset = $offsetParent.offset();
|
var parentOffset = {
|
||||||
|
top: 0,
|
||||||
|
left: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
if (
|
||||||
|
$.contains(document.body, $offsetParent[0]) ||
|
||||||
|
$offsetParent[0].isConnected
|
||||||
|
) {
|
||||||
|
parentOffset = $offsetParent.offset();
|
||||||
|
}
|
||||||
|
|
||||||
css.top -= parentOffset.top;
|
css.top -= parentOffset.top;
|
||||||
css.left -= parentOffset.left;
|
css.left -= parentOffset.left;
|
||||||
@@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
S2.define('select2/dropdown/selectOnClose',[
|
S2.define('select2/dropdown/selectOnClose',[
|
||||||
|
'../utils'
|
||||||
], function () {
|
], function (Utils) {
|
||||||
function SelectOnClose () { }
|
function SelectOnClose () { }
|
||||||
|
|
||||||
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
||||||
@@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlightedResults.data('data');
|
var data = Utils.GetData($highlightedResults[0], 'data');
|
||||||
|
|
||||||
// Don't re-select already selected resulte
|
// Don't re-select already selected resulte
|
||||||
if (
|
if (
|
||||||
@@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|||||||
var originalEvent = evt.originalEvent;
|
var originalEvent = evt.originalEvent;
|
||||||
|
|
||||||
// Don't close if the control key is being held
|
// Don't close if the control key is being held
|
||||||
if (originalEvent && originalEvent.ctrlKey) {
|
if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () {
|
|||||||
},
|
},
|
||||||
searching: function () {
|
searching: function () {
|
||||||
return 'Searching…';
|
return 'Searching…';
|
||||||
|
},
|
||||||
|
removeAllItems: function () {
|
||||||
|
return 'Remove all items';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
// If the defaults were not previously applied from an element, it is
|
||||||
// Check if the language is specified with a region
|
// possible for the language option to have not been resolved
|
||||||
if (options.language.indexOf('-') > 0) {
|
options.language = this._resolveLanguage(options.language);
|
||||||
// Extract the region information if it is included
|
|
||||||
var languageParts = options.language.split('-');
|
|
||||||
var baseLanguage = languageParts[0];
|
|
||||||
|
|
||||||
options.language = [options.language, baseLanguage];
|
// Always fall back to English since it will always be complete
|
||||||
} else {
|
options.language.push('en');
|
||||||
options.language = [options.language];
|
|
||||||
|
var uniqueLanguages = [];
|
||||||
|
|
||||||
|
for (var l = 0; l < options.language.length; l++) {
|
||||||
|
var language = options.language[l];
|
||||||
|
|
||||||
|
if (uniqueLanguages.indexOf(language) === -1) {
|
||||||
|
uniqueLanguages.push(language);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($.isArray(options.language)) {
|
options.language = uniqueLanguages;
|
||||||
var languages = new Translation();
|
|
||||||
options.language.push('en');
|
|
||||||
|
|
||||||
var languageNames = options.language;
|
options.translations = this._processTranslations(
|
||||||
|
options.language,
|
||||||
for (var l = 0; l < languageNames.length; l++) {
|
options.debug
|
||||||
var name = languageNames[l];
|
);
|
||||||
var language = {};
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Try to load it with the original name
|
|
||||||
language = Translation.loadPath(name);
|
|
||||||
} catch (e) {
|
|
||||||
try {
|
|
||||||
// If we couldn't load it, check if it wasn't the full path
|
|
||||||
name = this.defaults.amdLanguageBase + name;
|
|
||||||
language = Translation.loadPath(name);
|
|
||||||
} catch (ex) {
|
|
||||||
// The translation could not be loaded at all. Sometimes this is
|
|
||||||
// because of a configuration problem, other times this can be
|
|
||||||
// because of how Select2 helps load all possible translation files.
|
|
||||||
if (options.debug && window.console && console.warn) {
|
|
||||||
console.warn(
|
|
||||||
'Select2: The language file for "' + name + '" could not be ' +
|
|
||||||
'automatically loaded. A fallback will be used instead.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
languages.extend(language);
|
|
||||||
}
|
|
||||||
|
|
||||||
options.translations = languages;
|
|
||||||
} else {
|
|
||||||
var baseTranslation = Translation.loadPath(
|
|
||||||
this.defaults.amdLanguageBase + 'en'
|
|
||||||
);
|
|
||||||
var customTranslation = new Translation(options.language);
|
|
||||||
|
|
||||||
customTranslation.extend(baseTranslation);
|
|
||||||
|
|
||||||
options.translations = customTranslation;
|
|
||||||
}
|
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
};
|
};
|
||||||
@@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[
|
|||||||
debug: false,
|
debug: false,
|
||||||
dropdownAutoWidth: false,
|
dropdownAutoWidth: false,
|
||||||
escapeMarkup: Utils.escapeMarkup,
|
escapeMarkup: Utils.escapeMarkup,
|
||||||
language: EnglishTranslation,
|
language: {},
|
||||||
matcher: matcher,
|
matcher: matcher,
|
||||||
minimumInputLength: 0,
|
minimumInputLength: 0,
|
||||||
maximumInputLength: 0,
|
maximumInputLength: 0,
|
||||||
maximumSelectionLength: 0,
|
maximumSelectionLength: 0,
|
||||||
minimumResultsForSearch: 0,
|
minimumResultsForSearch: 0,
|
||||||
selectOnClose: false,
|
selectOnClose: false,
|
||||||
|
scrollAfterSelect: false,
|
||||||
sorter: function (data) {
|
sorter: function (data) {
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
@@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Defaults.prototype.applyFromElement = function (options, $element) {
|
||||||
|
var optionLanguage = options.language;
|
||||||
|
var defaultLanguage = this.defaults.language;
|
||||||
|
var elementLanguage = $element.prop('lang');
|
||||||
|
var parentLanguage = $element.closest('[lang]').prop('lang');
|
||||||
|
|
||||||
|
var languages = Array.prototype.concat.call(
|
||||||
|
this._resolveLanguage(elementLanguage),
|
||||||
|
this._resolveLanguage(optionLanguage),
|
||||||
|
this._resolveLanguage(defaultLanguage),
|
||||||
|
this._resolveLanguage(parentLanguage)
|
||||||
|
);
|
||||||
|
|
||||||
|
options.language = languages;
|
||||||
|
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
|
||||||
|
Defaults.prototype._resolveLanguage = function (language) {
|
||||||
|
if (!language) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.isEmptyObject(language)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.isPlainObject(language)) {
|
||||||
|
return [language];
|
||||||
|
}
|
||||||
|
|
||||||
|
var languages;
|
||||||
|
|
||||||
|
if (!$.isArray(language)) {
|
||||||
|
languages = [language];
|
||||||
|
} else {
|
||||||
|
languages = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
var resolvedLanguages = [];
|
||||||
|
|
||||||
|
for (var l = 0; l < languages.length; l++) {
|
||||||
|
resolvedLanguages.push(languages[l]);
|
||||||
|
|
||||||
|
if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
|
||||||
|
// Extract the region information if it is included
|
||||||
|
var languageParts = languages[l].split('-');
|
||||||
|
var baseLanguage = languageParts[0];
|
||||||
|
|
||||||
|
resolvedLanguages.push(baseLanguage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolvedLanguages;
|
||||||
|
};
|
||||||
|
|
||||||
|
Defaults.prototype._processTranslations = function (languages, debug) {
|
||||||
|
var translations = new Translation();
|
||||||
|
|
||||||
|
for (var l = 0; l < languages.length; l++) {
|
||||||
|
var languageData = new Translation();
|
||||||
|
|
||||||
|
var language = languages[l];
|
||||||
|
|
||||||
|
if (typeof language === 'string') {
|
||||||
|
try {
|
||||||
|
// Try to load it with the original name
|
||||||
|
languageData = Translation.loadPath(language);
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
// If we couldn't load it, check if it wasn't the full path
|
||||||
|
language = this.defaults.amdLanguageBase + language;
|
||||||
|
languageData = Translation.loadPath(language);
|
||||||
|
} catch (ex) {
|
||||||
|
// The translation could not be loaded at all. Sometimes this is
|
||||||
|
// because of a configuration problem, other times this can be
|
||||||
|
// because of how Select2 helps load all possible translation files
|
||||||
|
if (debug && window.console && console.warn) {
|
||||||
|
console.warn(
|
||||||
|
'Select2: The language file for "' + language + '" could ' +
|
||||||
|
'not be automatically loaded. A fallback will be used instead.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ($.isPlainObject(language)) {
|
||||||
|
languageData = new Translation(language);
|
||||||
|
} else {
|
||||||
|
languageData = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
translations.extend(languageData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return translations;
|
||||||
|
};
|
||||||
|
|
||||||
Defaults.prototype.set = function (key, value) {
|
Defaults.prototype.set = function (key, value) {
|
||||||
var camelKey = $.camelCase(key);
|
var camelKey = $.camelCase(key);
|
||||||
|
|
||||||
@@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[
|
|||||||
|
|
||||||
var convertedData = Utils._convertData(data);
|
var convertedData = Utils._convertData(data);
|
||||||
|
|
||||||
$.extend(this.defaults, convertedData);
|
$.extend(true, this.defaults, convertedData);
|
||||||
};
|
};
|
||||||
|
|
||||||
var defaults = new Defaults();
|
var defaults = new Defaults();
|
||||||
@@ -4937,6 +5226,10 @@ S2.define('select2/options',[
|
|||||||
this.fromElement($element);
|
this.fromElement($element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($element != null) {
|
||||||
|
this.options = Defaults.applyFromElement(this.options, $element);
|
||||||
|
}
|
||||||
|
|
||||||
this.options = Defaults.apply(this.options);
|
this.options = Defaults.apply(this.options);
|
||||||
|
|
||||||
if ($element && $element.is('input')) {
|
if ($element && $element.is('input')) {
|
||||||
@@ -4960,14 +5253,6 @@ S2.define('select2/options',[
|
|||||||
this.options.disabled = $e.prop('disabled');
|
this.options.disabled = $e.prop('disabled');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.options.language == null) {
|
|
||||||
if ($e.prop('lang')) {
|
|
||||||
this.options.language = $e.prop('lang').toLowerCase();
|
|
||||||
} else if ($e.closest('[lang]').prop('lang')) {
|
|
||||||
this.options.language = $e.closest('[lang]').prop('lang');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.dir == null) {
|
if (this.options.dir == null) {
|
||||||
if ($e.prop('dir')) {
|
if ($e.prop('dir')) {
|
||||||
this.options.dir = $e.prop('dir');
|
this.options.dir = $e.prop('dir');
|
||||||
@@ -4981,7 +5266,7 @@ S2.define('select2/options',[
|
|||||||
$e.prop('disabled', this.options.disabled);
|
$e.prop('disabled', this.options.disabled);
|
||||||
$e.prop('multiple', this.options.multiple);
|
$e.prop('multiple', this.options.multiple);
|
||||||
|
|
||||||
if ($e.data('select2Tags')) {
|
if (Utils.GetData($e[0], 'select2Tags')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
||||||
@@ -4990,11 +5275,11 @@ S2.define('select2/options',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.data('data', $e.data('select2Tags'));
|
Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
|
||||||
$e.data('tags', true);
|
Utils.StoreData($e[0], 'tags', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e.data('ajaxUrl')) {
|
if (Utils.GetData($e[0], 'ajaxUrl')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
||||||
@@ -5003,21 +5288,45 @@ S2.define('select2/options',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.attr('ajax--url', $e.data('ajaxUrl'));
|
$e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
$e.data('ajax--url', $e.data('ajaxUrl'));
|
Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var dataset = {};
|
var dataset = {};
|
||||||
|
|
||||||
|
function upperCaseLetter(_, letter) {
|
||||||
|
return letter.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pre-load all of the attributes which are prefixed with `data-`
|
||||||
|
for (var attr = 0; attr < $e[0].attributes.length; attr++) {
|
||||||
|
var attributeName = $e[0].attributes[attr].name;
|
||||||
|
var prefix = 'data-';
|
||||||
|
|
||||||
|
if (attributeName.substr(0, prefix.length) == prefix) {
|
||||||
|
// Get the contents of the attribute after `data-`
|
||||||
|
var dataName = attributeName.substring(prefix.length);
|
||||||
|
|
||||||
|
// Get the data contents from the consistent source
|
||||||
|
// This is more than likely the jQuery data helper
|
||||||
|
var dataValue = Utils.GetData($e[0], dataName);
|
||||||
|
|
||||||
|
// camelCase the attribute name to match the spec
|
||||||
|
var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
|
||||||
|
|
||||||
|
// Store the data attribute contents into the dataset since
|
||||||
|
dataset[camelDataName] = dataValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Prefer the element's `dataset` attribute if it exists
|
// Prefer the element's `dataset` attribute if it exists
|
||||||
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
||||||
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
||||||
dataset = $.extend(true, {}, $e[0].dataset, $e.data());
|
dataset = $.extend(true, {}, $e[0].dataset, dataset);
|
||||||
} else {
|
|
||||||
dataset = $e.data();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $.extend(true, {}, dataset);
|
// Prefer our internal data cache if it exists
|
||||||
|
var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
|
||||||
|
|
||||||
data = Utils._convertData(data);
|
data = Utils._convertData(data);
|
||||||
|
|
||||||
@@ -5054,8 +5363,8 @@ S2.define('select2/core',[
|
|||||||
'./keys'
|
'./keys'
|
||||||
], function ($, Options, Utils, KEYS) {
|
], function ($, Options, Utils, KEYS) {
|
||||||
var Select2 = function ($element, options) {
|
var Select2 = function ($element, options) {
|
||||||
if ($element.data('select2') != null) {
|
if (Utils.GetData($element[0], 'select2') != null) {
|
||||||
$element.data('select2').destroy();
|
Utils.GetData($element[0], 'select2').destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element = $element;
|
this.$element = $element;
|
||||||
@@ -5071,7 +5380,7 @@ S2.define('select2/core',[
|
|||||||
// Set up the tabindex
|
// Set up the tabindex
|
||||||
|
|
||||||
var tabindex = $element.attr('tabindex') || 0;
|
var tabindex = $element.attr('tabindex') || 0;
|
||||||
$element.data('old-tabindex', tabindex);
|
Utils.StoreData($element[0], 'old-tabindex', tabindex);
|
||||||
$element.attr('tabindex', '-1');
|
$element.attr('tabindex', '-1');
|
||||||
|
|
||||||
// Set up containers and adapters
|
// Set up containers and adapters
|
||||||
@@ -5132,6 +5441,9 @@ S2.define('select2/core',[
|
|||||||
// Synchronize any monitored attributes
|
// Synchronize any monitored attributes
|
||||||
this._syncAttributes();
|
this._syncAttributes();
|
||||||
|
|
||||||
|
Utils.StoreData($element[0], 'select2', this);
|
||||||
|
|
||||||
|
// Ensure backwards compatibility with $element.data('select2').
|
||||||
$element.data('select2', this);
|
$element.data('select2', this);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5208,6 +5520,12 @@ S2.define('select2/core',[
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (method == 'computedstyle') {
|
||||||
|
var computedStyle = window.getComputedStyle($element[0]);
|
||||||
|
|
||||||
|
return computedStyle.width;
|
||||||
|
}
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5248,8 +5566,8 @@ S2.define('select2/core',[
|
|||||||
|
|
||||||
if (observer != null) {
|
if (observer != null) {
|
||||||
this._observer = new observer(function (mutations) {
|
this._observer = new observer(function (mutations) {
|
||||||
$.each(mutations, self._syncA);
|
self._syncA();
|
||||||
$.each(mutations, self._syncS);
|
self._syncS(null, mutations);
|
||||||
});
|
});
|
||||||
this._observer.observe(this.$element[0], {
|
this._observer.observe(this.$element[0], {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
@@ -5371,7 +5689,7 @@ S2.define('select2/core',[
|
|||||||
if (self.isOpen()) {
|
if (self.isOpen()) {
|
||||||
if (key === KEYS.ESC || key === KEYS.TAB ||
|
if (key === KEYS.ESC || key === KEYS.TAB ||
|
||||||
(key === KEYS.UP && evt.altKey)) {
|
(key === KEYS.UP && evt.altKey)) {
|
||||||
self.close();
|
self.close(evt);
|
||||||
|
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
} else if (key === KEYS.ENTER) {
|
} else if (key === KEYS.ENTER) {
|
||||||
@@ -5405,7 +5723,7 @@ S2.define('select2/core',[
|
|||||||
Select2.prototype._syncAttributes = function () {
|
Select2.prototype._syncAttributes = function () {
|
||||||
this.options.set('disabled', this.$element.prop('disabled'));
|
this.options.set('disabled', this.$element.prop('disabled'));
|
||||||
|
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
if (this.isOpen()) {
|
if (this.isOpen()) {
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
@@ -5416,7 +5734,7 @@ S2.define('select2/core',[
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype._syncSubtree = function (evt, mutations) {
|
Select2.prototype._isChangeMutation = function (evt, mutations) {
|
||||||
var changed = false;
|
var changed = false;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
@@ -5444,7 +5762,22 @@ S2.define('select2/core',[
|
|||||||
}
|
}
|
||||||
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
||||||
changed = true;
|
changed = true;
|
||||||
|
} else if ($.isArray(mutations)) {
|
||||||
|
$.each(mutations, function(evt, mutation) {
|
||||||
|
if (self._isChangeMutation(evt, mutation)) {
|
||||||
|
// We've found a change mutation.
|
||||||
|
// Let's escape from the loop and continue
|
||||||
|
changed = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
return changed;
|
||||||
|
};
|
||||||
|
|
||||||
|
Select2.prototype._syncSubtree = function (evt, mutations) {
|
||||||
|
var changed = this._isChangeMutation(evt, mutations);
|
||||||
|
var self = this;
|
||||||
|
|
||||||
// Only re-pull the data if we think there is a change
|
// Only re-pull the data if we think there is a change
|
||||||
if (changed) {
|
if (changed) {
|
||||||
@@ -5466,7 +5799,8 @@ S2.define('select2/core',[
|
|||||||
'open': 'opening',
|
'open': 'opening',
|
||||||
'close': 'closing',
|
'close': 'closing',
|
||||||
'select': 'selecting',
|
'select': 'selecting',
|
||||||
'unselect': 'unselecting'
|
'unselect': 'unselecting',
|
||||||
|
'clear': 'clearing'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (args === undefined) {
|
if (args === undefined) {
|
||||||
@@ -5494,7 +5828,7 @@ S2.define('select2/core',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.toggleDropdown = function () {
|
Select2.prototype.toggleDropdown = function () {
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5510,15 +5844,40 @@ S2.define('select2/core',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.isDisabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.trigger('query', {});
|
this.trigger('query', {});
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.close = function () {
|
Select2.prototype.close = function (evt) {
|
||||||
if (!this.isOpen()) {
|
if (!this.isOpen()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.trigger('close', {});
|
this.trigger('close', { originalEvent : evt });
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "enabled" (not "disabled") state of this
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @return {true} if the instance is not disabled.
|
||||||
|
* @return {false} if the instance is disabled.
|
||||||
|
*/
|
||||||
|
Select2.prototype.isEnabled = function () {
|
||||||
|
return !this.isDisabled();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "disabled" state of this object.
|
||||||
|
*
|
||||||
|
* @return {true} if the disabled option is true.
|
||||||
|
* @return {false} if the disabled option is false.
|
||||||
|
*/
|
||||||
|
Select2.prototype.isDisabled = function () {
|
||||||
|
return this.options.get('disabled');
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.isOpen = function () {
|
Select2.prototype.isOpen = function () {
|
||||||
@@ -5595,7 +5954,7 @@ S2.define('select2/core',[
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element.val(newVal).trigger('change');
|
this.$element.val(newVal).trigger('input').trigger('change');
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.destroy = function () {
|
Select2.prototype.destroy = function () {
|
||||||
@@ -5621,10 +5980,12 @@ S2.define('select2/core',[
|
|||||||
this._syncS = null;
|
this._syncS = null;
|
||||||
|
|
||||||
this.$element.off('.select2');
|
this.$element.off('.select2');
|
||||||
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
this.$element.attr('tabindex',
|
||||||
|
Utils.GetData(this.$element[0], 'old-tabindex'));
|
||||||
|
|
||||||
this.$element.removeClass('select2-hidden-accessible');
|
this.$element.removeClass('select2-hidden-accessible');
|
||||||
this.$element.attr('aria-hidden', 'false');
|
this.$element.attr('aria-hidden', 'false');
|
||||||
|
Utils.RemoveData(this.$element[0]);
|
||||||
this.$element.removeData('select2');
|
this.$element.removeData('select2');
|
||||||
|
|
||||||
this.dataAdapter.destroy();
|
this.dataAdapter.destroy();
|
||||||
@@ -5652,7 +6013,7 @@ S2.define('select2/core',[
|
|||||||
|
|
||||||
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
||||||
|
|
||||||
$container.data('element', this.$element);
|
Utils.StoreData($container[0], 'element', this.$element);
|
||||||
|
|
||||||
return $container;
|
return $container;
|
||||||
};
|
};
|
||||||
@@ -5862,8 +6223,9 @@ S2.define('select2/compat/initSelection',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
S2.define('select2/compat/inputData',[
|
S2.define('select2/compat/inputData',[
|
||||||
'jquery'
|
'jquery',
|
||||||
], function ($) {
|
'../utils'
|
||||||
|
], function ($, Utils) {
|
||||||
function InputData (decorated, $element, options) {
|
function InputData (decorated, $element, options) {
|
||||||
this._currentData = [];
|
this._currentData = [];
|
||||||
this._valueSeparator = options.get('valueSeparator') || ',';
|
this._valueSeparator = options.get('valueSeparator') || ',';
|
||||||
@@ -5927,13 +6289,13 @@ S2.define('select2/compat/inputData',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.$element.val(data.id);
|
this.$element.val(data.id);
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
} else {
|
} else {
|
||||||
var value = this.$element.val();
|
var value = this.$element.val();
|
||||||
value += this._valueSeparator + data.id;
|
value += this._valueSeparator + data.id;
|
||||||
|
|
||||||
this.$element.val(value);
|
this.$element.val(value);
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5956,7 +6318,7 @@ S2.define('select2/compat/inputData',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.$element.val(values.join(self._valueSeparator));
|
self.$element.val(values.join(self._valueSeparator));
|
||||||
self.$element.trigger('change');
|
self.$element.trigger('input').trigger('change');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5980,7 +6342,7 @@ S2.define('select2/compat/inputData',[
|
|||||||
|
|
||||||
InputData.prototype.addOptions = function (_, $options) {
|
InputData.prototype.addOptions = function (_, $options) {
|
||||||
var options = $.map($options, function ($option) {
|
var options = $.map($options, function ($option) {
|
||||||
return $.data($option[0], 'data');
|
return Utils.GetData($option[0], 'data');
|
||||||
});
|
});
|
||||||
|
|
||||||
this._currentData.push.apply(this._currentData, options);
|
this._currentData.push.apply(this._currentData, options);
|
||||||
@@ -6383,8 +6745,9 @@ S2.define('jquery.select2',[
|
|||||||
'jquery-mousewheel',
|
'jquery-mousewheel',
|
||||||
|
|
||||||
'./select2/core',
|
'./select2/core',
|
||||||
'./select2/defaults'
|
'./select2/defaults',
|
||||||
], function ($, _, Select2, Defaults) {
|
'./select2/utils'
|
||||||
|
], function ($, _, Select2, Defaults, Utils) {
|
||||||
if ($.fn.select2 == null) {
|
if ($.fn.select2 == null) {
|
||||||
// All methods that should return the element
|
// All methods that should return the element
|
||||||
var thisMethods = ['open', 'close', 'destroy'];
|
var thisMethods = ['open', 'close', 'destroy'];
|
||||||
@@ -6405,7 +6768,7 @@ S2.define('jquery.select2',[
|
|||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
var instance = $(this).data('select2');
|
var instance = Utils.GetData(this, 'select2');
|
||||||
|
|
||||||
if (instance == null && window.console && console.error) {
|
if (instance == null && window.console && console.error) {
|
||||||
console.error(
|
console.error(
|
||||||
|
|||||||
Vendored
+2
-1
File diff suppressed because one or more lines are too long
Vendored
+576
-214
@@ -1,11 +1,11 @@
|
|||||||
/*!
|
/*!
|
||||||
* Select2 4.0.5
|
* Select2 4.0.13
|
||||||
* https://select2.github.io
|
* https://select2.github.io
|
||||||
*
|
*
|
||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* https://github.com/select2/select2/blob/master/LICENSE.md
|
* https://github.com/select2/select2/blob/master/LICENSE.md
|
||||||
*/
|
*/
|
||||||
(function (factory) {
|
;(function (factory) {
|
||||||
if (typeof define === 'function' && define.amd) {
|
if (typeof define === 'function' && define.amd) {
|
||||||
// AMD. Register as an anonymous module.
|
// AMD. Register as an anonymous module.
|
||||||
define(['jquery'], factory);
|
define(['jquery'], factory);
|
||||||
@@ -574,10 +574,10 @@ S2.define('select2/utils',[
|
|||||||
DecoratedClass.prototype = new ctr();
|
DecoratedClass.prototype = new ctr();
|
||||||
|
|
||||||
for (var m = 0; m < superMethods.length; m++) {
|
for (var m = 0; m < superMethods.length; m++) {
|
||||||
var superMethod = superMethods[m];
|
var superMethod = superMethods[m];
|
||||||
|
|
||||||
DecoratedClass.prototype[superMethod] =
|
DecoratedClass.prototype[superMethod] =
|
||||||
SuperClass.prototype[superMethod];
|
SuperClass.prototype[superMethod];
|
||||||
}
|
}
|
||||||
|
|
||||||
var calledMethod = function (methodName) {
|
var calledMethod = function (methodName) {
|
||||||
@@ -772,6 +772,70 @@ S2.define('select2/utils',[
|
|||||||
$element.append($nodes);
|
$element.append($nodes);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Cache objects in Utils.__cache instead of $.data (see #4346)
|
||||||
|
Utils.__cache = {};
|
||||||
|
|
||||||
|
var id = 0;
|
||||||
|
Utils.GetUniqueElementId = function (element) {
|
||||||
|
// Get a unique element Id. If element has no id,
|
||||||
|
// creates a new unique number, stores it in the id
|
||||||
|
// attribute and returns the new id.
|
||||||
|
// If an id already exists, it simply returns it.
|
||||||
|
|
||||||
|
var select2Id = element.getAttribute('data-select2-id');
|
||||||
|
if (select2Id == null) {
|
||||||
|
// If element has id, use it.
|
||||||
|
if (element.id) {
|
||||||
|
select2Id = element.id;
|
||||||
|
element.setAttribute('data-select2-id', select2Id);
|
||||||
|
} else {
|
||||||
|
element.setAttribute('data-select2-id', ++id);
|
||||||
|
select2Id = id.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return select2Id;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.StoreData = function (element, name, value) {
|
||||||
|
// Stores an item in the cache for a specified element.
|
||||||
|
// name is the cache key.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (!Utils.__cache[id]) {
|
||||||
|
Utils.__cache[id] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.__cache[id][name] = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.GetData = function (element, name) {
|
||||||
|
// Retrieves a value from the cache by its key (name)
|
||||||
|
// name is optional. If no name specified, return
|
||||||
|
// all cache items for the specified element.
|
||||||
|
// and for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (name) {
|
||||||
|
if (Utils.__cache[id]) {
|
||||||
|
if (Utils.__cache[id][name] != null) {
|
||||||
|
return Utils.__cache[id][name];
|
||||||
|
}
|
||||||
|
return $(element).data(name); // Fallback to HTML5 data attribs.
|
||||||
|
}
|
||||||
|
return $(element).data(name); // Fallback to HTML5 data attribs.
|
||||||
|
} else {
|
||||||
|
return Utils.__cache[id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.RemoveData = function (element) {
|
||||||
|
// Removes all cached items for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (Utils.__cache[id] != null) {
|
||||||
|
delete Utils.__cache[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
element.removeAttribute('data-select2-id');
|
||||||
|
};
|
||||||
|
|
||||||
return Utils;
|
return Utils;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -791,7 +855,7 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
Results.prototype.render = function () {
|
Results.prototype.render = function () {
|
||||||
var $results = $(
|
var $results = $(
|
||||||
'<ul class="select2-results__options" role="tree"></ul>'
|
'<ul class="select2-results__options" role="listbox"></ul>'
|
||||||
);
|
);
|
||||||
|
|
||||||
if (this.options.get('multiple')) {
|
if (this.options.get('multiple')) {
|
||||||
@@ -814,7 +878,7 @@ S2.define('select2/results',[
|
|||||||
this.hideLoading();
|
this.hideLoading();
|
||||||
|
|
||||||
var $message = $(
|
var $message = $(
|
||||||
'<li role="treeitem" aria-live="assertive"' +
|
'<li role="alert" aria-live="assertive"' +
|
||||||
' class="select2-results__option"></li>'
|
' class="select2-results__option"></li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -907,7 +971,7 @@ S2.define('select2/results',[
|
|||||||
$options.each(function () {
|
$options.each(function () {
|
||||||
var $option = $(this);
|
var $option = $(this);
|
||||||
|
|
||||||
var item = $.data(this, 'data');
|
var item = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
// id needs to be converted to a string when comparing
|
// id needs to be converted to a string when comparing
|
||||||
var id = '' + item.id;
|
var id = '' + item.id;
|
||||||
@@ -948,11 +1012,16 @@ S2.define('select2/results',[
|
|||||||
option.className = 'select2-results__option';
|
option.className = 'select2-results__option';
|
||||||
|
|
||||||
var attrs = {
|
var attrs = {
|
||||||
'role': 'treeitem',
|
'role': 'option',
|
||||||
'aria-selected': 'false'
|
'aria-selected': 'false'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (data.disabled) {
|
var matches = window.Element.prototype.matches ||
|
||||||
|
window.Element.prototype.msMatchesSelector ||
|
||||||
|
window.Element.prototype.webkitMatchesSelector;
|
||||||
|
|
||||||
|
if ((data.element != null && matches.call(data.element, ':disabled')) ||
|
||||||
|
(data.element == null && data.disabled)) {
|
||||||
delete attrs['aria-selected'];
|
delete attrs['aria-selected'];
|
||||||
attrs['aria-disabled'] = 'true';
|
attrs['aria-disabled'] = 'true';
|
||||||
}
|
}
|
||||||
@@ -1012,7 +1081,7 @@ S2.define('select2/results',[
|
|||||||
this.template(data, option);
|
this.template(data, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
$.data(option, 'data', data);
|
Utils.StoreData(option, 'data', data);
|
||||||
|
|
||||||
return option;
|
return option;
|
||||||
};
|
};
|
||||||
@@ -1053,7 +1122,10 @@ S2.define('select2/results',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.setClasses();
|
self.setClasses();
|
||||||
self.highlightFirstItem();
|
|
||||||
|
if (self.options.get('scrollAfterSelect')) {
|
||||||
|
self.highlightFirstItem();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('unselect', function () {
|
container.on('unselect', function () {
|
||||||
@@ -1062,7 +1134,10 @@ S2.define('select2/results',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.setClasses();
|
self.setClasses();
|
||||||
self.highlightFirstItem();
|
|
||||||
|
if (self.options.get('scrollAfterSelect')) {
|
||||||
|
self.highlightFirstItem();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
@@ -1098,7 +1173,7 @@ S2.define('select2/results',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlighted.data('data');
|
var data = Utils.GetData($highlighted[0], 'data');
|
||||||
|
|
||||||
if ($highlighted.attr('aria-selected') == 'true') {
|
if ($highlighted.attr('aria-selected') == 'true') {
|
||||||
self.trigger('close', {});
|
self.trigger('close', {});
|
||||||
@@ -1116,8 +1191,9 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
var currentIndex = $options.index($highlighted);
|
var currentIndex = $options.index($highlighted);
|
||||||
|
|
||||||
// If we are already at te top, don't move further
|
// If we are already at the top, don't move further
|
||||||
if (currentIndex === 0) {
|
// If no options, currentIndex will be -1
|
||||||
|
if (currentIndex <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1210,7 +1286,7 @@ S2.define('select2/results',[
|
|||||||
function (evt) {
|
function (evt) {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
|
|
||||||
var data = $this.data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
if ($this.attr('aria-selected') === 'true') {
|
if ($this.attr('aria-selected') === 'true') {
|
||||||
if (self.options.get('multiple')) {
|
if (self.options.get('multiple')) {
|
||||||
@@ -1233,7 +1309,7 @@ S2.define('select2/results',[
|
|||||||
|
|
||||||
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
||||||
function (evt) {
|
function (evt) {
|
||||||
var data = $(this).data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
self.getHighlightedResults()
|
self.getHighlightedResults()
|
||||||
.removeClass('select2-results__option--highlighted');
|
.removeClass('select2-results__option--highlighted');
|
||||||
@@ -1348,14 +1424,15 @@ S2.define('select2/selection/base',[
|
|||||||
|
|
||||||
this._tabindex = 0;
|
this._tabindex = 0;
|
||||||
|
|
||||||
if (this.$element.data('old-tabindex') != null) {
|
if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
|
||||||
this._tabindex = this.$element.data('old-tabindex');
|
this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
|
||||||
} else if (this.$element.attr('tabindex') != null) {
|
} else if (this.$element.attr('tabindex') != null) {
|
||||||
this._tabindex = this.$element.attr('tabindex');
|
this._tabindex = this.$element.attr('tabindex');
|
||||||
}
|
}
|
||||||
|
|
||||||
$selection.attr('title', this.$element.attr('title'));
|
$selection.attr('title', this.$element.attr('title'));
|
||||||
$selection.attr('tabindex', this._tabindex);
|
$selection.attr('tabindex', this._tabindex);
|
||||||
|
$selection.attr('aria-disabled', 'false');
|
||||||
|
|
||||||
this.$selection = $selection;
|
this.$selection = $selection;
|
||||||
|
|
||||||
@@ -1365,7 +1442,6 @@ S2.define('select2/selection/base',[
|
|||||||
BaseSelection.prototype.bind = function (container, $container) {
|
BaseSelection.prototype.bind = function (container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var id = container.id + '-container';
|
|
||||||
var resultsId = container.id + '-results';
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
this.container = container;
|
this.container = container;
|
||||||
@@ -1408,17 +1484,19 @@ S2.define('select2/selection/base',[
|
|||||||
self.$selection.removeAttr('aria-activedescendant');
|
self.$selection.removeAttr('aria-activedescendant');
|
||||||
self.$selection.removeAttr('aria-owns');
|
self.$selection.removeAttr('aria-owns');
|
||||||
|
|
||||||
self.$selection.focus();
|
self.$selection.trigger('focus');
|
||||||
|
|
||||||
self._detachCloseHandler(container);
|
self._detachCloseHandler(container);
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('enable', function () {
|
container.on('enable', function () {
|
||||||
self.$selection.attr('tabindex', self._tabindex);
|
self.$selection.attr('tabindex', self._tabindex);
|
||||||
|
self.$selection.attr('aria-disabled', 'false');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('disable', function () {
|
container.on('disable', function () {
|
||||||
self.$selection.attr('tabindex', '-1');
|
self.$selection.attr('tabindex', '-1');
|
||||||
|
self.$selection.attr('aria-disabled', 'true');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1441,7 +1519,6 @@ S2.define('select2/selection/base',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
BaseSelection.prototype._attachCloseHandler = function (container) {
|
BaseSelection.prototype._attachCloseHandler = function (container) {
|
||||||
var self = this;
|
|
||||||
|
|
||||||
$(document.body).on('mousedown.select2.' + container.id, function (e) {
|
$(document.body).on('mousedown.select2.' + container.id, function (e) {
|
||||||
var $target = $(e.target);
|
var $target = $(e.target);
|
||||||
@@ -1451,13 +1528,11 @@ S2.define('select2/selection/base',[
|
|||||||
var $all = $('.select2.select2-container--open');
|
var $all = $('.select2.select2-container--open');
|
||||||
|
|
||||||
$all.each(function () {
|
$all.each(function () {
|
||||||
var $this = $(this);
|
|
||||||
|
|
||||||
if (this == $select[0]) {
|
if (this == $select[0]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $element = $this.data('element');
|
var $element = Utils.GetData(this, 'element');
|
||||||
|
|
||||||
$element.select2('close');
|
$element.select2('close');
|
||||||
});
|
});
|
||||||
@@ -1481,6 +1556,27 @@ S2.define('select2/selection/base',[
|
|||||||
throw new Error('The `update` method must be defined in child classes.');
|
throw new Error('The `update` method must be defined in child classes.');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "enabled" (not "disabled") state of this
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @return {true} if the instance is not disabled.
|
||||||
|
* @return {false} if the instance is disabled.
|
||||||
|
*/
|
||||||
|
BaseSelection.prototype.isEnabled = function () {
|
||||||
|
return !this.isDisabled();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "disabled" state of this object.
|
||||||
|
*
|
||||||
|
* @return {true} if the disabled option is true.
|
||||||
|
* @return {false} if the disabled option is false.
|
||||||
|
*/
|
||||||
|
BaseSelection.prototype.isDisabled = function () {
|
||||||
|
return this.options.get('disabled');
|
||||||
|
};
|
||||||
|
|
||||||
return BaseSelection;
|
return BaseSelection;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1518,7 +1614,10 @@ S2.define('select2/selection/single',[
|
|||||||
|
|
||||||
var id = container.id + '-container';
|
var id = container.id + '-container';
|
||||||
|
|
||||||
this.$selection.find('.select2-selection__rendered').attr('id', id);
|
this.$selection.find('.select2-selection__rendered')
|
||||||
|
.attr('id', id)
|
||||||
|
.attr('role', 'textbox')
|
||||||
|
.attr('aria-readonly', 'true');
|
||||||
this.$selection.attr('aria-labelledby', id);
|
this.$selection.attr('aria-labelledby', id);
|
||||||
|
|
||||||
this.$selection.on('mousedown', function (evt) {
|
this.$selection.on('mousedown', function (evt) {
|
||||||
@@ -1542,17 +1641,15 @@ S2.define('select2/selection/single',[
|
|||||||
|
|
||||||
container.on('focus', function (evt) {
|
container.on('focus', function (evt) {
|
||||||
if (!container.isOpen()) {
|
if (!container.isOpen()) {
|
||||||
self.$selection.focus();
|
self.$selection.trigger('focus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('selection:update', function (params) {
|
|
||||||
self.update(params.data);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SingleSelection.prototype.clear = function () {
|
SingleSelection.prototype.clear = function () {
|
||||||
this.$selection.find('.select2-selection__rendered').empty();
|
var $rendered = this.$selection.find('.select2-selection__rendered');
|
||||||
|
$rendered.empty();
|
||||||
|
$rendered.removeAttr('title'); // clear tooltip on empty
|
||||||
};
|
};
|
||||||
|
|
||||||
SingleSelection.prototype.display = function (data, container) {
|
SingleSelection.prototype.display = function (data, container) {
|
||||||
@@ -1578,7 +1675,14 @@ S2.define('select2/selection/single',[
|
|||||||
var formatted = this.display(selection, $rendered);
|
var formatted = this.display(selection, $rendered);
|
||||||
|
|
||||||
$rendered.empty().append(formatted);
|
$rendered.empty().append(formatted);
|
||||||
$rendered.prop('title', selection.title || selection.text);
|
|
||||||
|
var title = selection.title || selection.text;
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
$rendered.attr('title', title);
|
||||||
|
} else {
|
||||||
|
$rendered.removeAttr('title');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return SingleSelection;
|
return SingleSelection;
|
||||||
@@ -1623,14 +1727,14 @@ S2.define('select2/selection/multiple',[
|
|||||||
'.select2-selection__choice__remove',
|
'.select2-selection__choice__remove',
|
||||||
function (evt) {
|
function (evt) {
|
||||||
// Ignore the event if it is disabled
|
// Ignore the event if it is disabled
|
||||||
if (self.options.get('disabled')) {
|
if (self.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $remove = $(this);
|
var $remove = $(this);
|
||||||
var $selection = $remove.parent();
|
var $selection = $remove.parent();
|
||||||
|
|
||||||
var data = $selection.data('data');
|
var data = Utils.GetData($selection[0], 'data');
|
||||||
|
|
||||||
self.trigger('unselect', {
|
self.trigger('unselect', {
|
||||||
originalEvent: evt,
|
originalEvent: evt,
|
||||||
@@ -1641,7 +1745,9 @@ S2.define('select2/selection/multiple',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
MultipleSelection.prototype.clear = function () {
|
MultipleSelection.prototype.clear = function () {
|
||||||
this.$selection.find('.select2-selection__rendered').empty();
|
var $rendered = this.$selection.find('.select2-selection__rendered');
|
||||||
|
$rendered.empty();
|
||||||
|
$rendered.removeAttr('title');
|
||||||
};
|
};
|
||||||
|
|
||||||
MultipleSelection.prototype.display = function (data, container) {
|
MultipleSelection.prototype.display = function (data, container) {
|
||||||
@@ -1679,9 +1785,14 @@ S2.define('select2/selection/multiple',[
|
|||||||
var formatted = this.display(selection, $selection);
|
var formatted = this.display(selection, $selection);
|
||||||
|
|
||||||
$selection.append(formatted);
|
$selection.append(formatted);
|
||||||
$selection.prop('title', selection.title || selection.text);
|
|
||||||
|
|
||||||
$selection.data('data', selection);
|
var title = selection.title || selection.text;
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
$selection.attr('title', title);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.StoreData($selection[0], 'data', selection);
|
||||||
|
|
||||||
$selections.push($selection);
|
$selections.push($selection);
|
||||||
}
|
}
|
||||||
@@ -1746,8 +1857,9 @@ S2.define('select2/selection/placeholder',[
|
|||||||
|
|
||||||
S2.define('select2/selection/allowClear',[
|
S2.define('select2/selection/allowClear',[
|
||||||
'jquery',
|
'jquery',
|
||||||
'../keys'
|
'../keys',
|
||||||
], function ($, KEYS) {
|
'../utils'
|
||||||
|
], function ($, KEYS, Utils) {
|
||||||
function AllowClear () { }
|
function AllowClear () { }
|
||||||
|
|
||||||
AllowClear.prototype.bind = function (decorated, container, $container) {
|
AllowClear.prototype.bind = function (decorated, container, $container) {
|
||||||
@@ -1776,7 +1888,7 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
AllowClear.prototype._handleClear = function (_, evt) {
|
AllowClear.prototype._handleClear = function (_, evt) {
|
||||||
// Ignore the event if it is disabled
|
// Ignore the event if it is disabled
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1789,10 +1901,22 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
|
|
||||||
var data = $clear.data('data');
|
var data = Utils.GetData($clear[0], 'data');
|
||||||
|
|
||||||
|
var previousVal = this.$element.val();
|
||||||
|
this.$element.val(this.placeholder.id);
|
||||||
|
|
||||||
|
var unselectData = {
|
||||||
|
data: data
|
||||||
|
};
|
||||||
|
this.trigger('clear', unselectData);
|
||||||
|
if (unselectData.prevented) {
|
||||||
|
this.$element.val(previousVal);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (var d = 0; d < data.length; d++) {
|
for (var d = 0; d < data.length; d++) {
|
||||||
var unselectData = {
|
unselectData = {
|
||||||
data: data[d]
|
data: data[d]
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1802,11 +1926,12 @@ S2.define('select2/selection/allowClear',[
|
|||||||
|
|
||||||
// If the event was prevented, don't clear it out.
|
// If the event was prevented, don't clear it out.
|
||||||
if (unselectData.prevented) {
|
if (unselectData.prevented) {
|
||||||
|
this.$element.val(previousVal);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element.val(this.placeholder.id).trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
this.trigger('toggle', {});
|
this.trigger('toggle', {});
|
||||||
};
|
};
|
||||||
@@ -1829,12 +1954,14 @@ S2.define('select2/selection/allowClear',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var removeAll = this.options.get('translations').get('removeAllItems');
|
||||||
|
|
||||||
var $remove = $(
|
var $remove = $(
|
||||||
'<span class="select2-selection__clear">' +
|
'<span class="select2-selection__clear" title="' + removeAll() +'">' +
|
||||||
'×' +
|
'×' +
|
||||||
'</span>'
|
'</span>'
|
||||||
);
|
);
|
||||||
$remove.data('data', data);
|
Utils.StoreData($remove[0], 'data', data);
|
||||||
|
|
||||||
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
||||||
};
|
};
|
||||||
@@ -1856,7 +1983,7 @@ S2.define('select2/selection/search',[
|
|||||||
'<li class="select2-search select2-search--inline">' +
|
'<li class="select2-search select2-search--inline">' +
|
||||||
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
||||||
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
||||||
' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
|
' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
|
||||||
'</li>'
|
'</li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[
|
|||||||
Search.prototype.bind = function (decorated, container, $container) {
|
Search.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
|
self.$search.attr('aria-controls', resultsId);
|
||||||
self.$search.trigger('focus');
|
self.$search.trigger('focus');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
self.$search.val('');
|
self.$search.val('');
|
||||||
|
self.$search.removeAttr('aria-controls');
|
||||||
self.$search.removeAttr('aria-activedescendant');
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
self.$search.trigger('focus');
|
self.$search.trigger('focus');
|
||||||
});
|
});
|
||||||
@@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
container.on('results:focus', function (params) {
|
container.on('results:focus', function (params) {
|
||||||
self.$search.attr('aria-activedescendant', params.id);
|
if (params.data._resultId) {
|
||||||
|
self.$search.attr('aria-activedescendant', params.data._resultId);
|
||||||
|
} else {
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
|
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
|
||||||
@@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[
|
|||||||
.prev('.select2-selection__choice');
|
.prev('.select2-selection__choice');
|
||||||
|
|
||||||
if ($previousChoice.length > 0) {
|
if ($previousChoice.length > 0) {
|
||||||
var item = $previousChoice.data('data');
|
var item = Utils.GetData($previousChoice[0], 'data');
|
||||||
|
|
||||||
self.searchRemoveChoice(item);
|
self.searchRemoveChoice(item);
|
||||||
|
|
||||||
@@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.$selection.on('click', '.select2-search--inline', function (evt) {
|
||||||
|
if (self.$search.val()) {
|
||||||
|
evt.stopPropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Try to detect the IE version should the `documentMode` property that
|
// Try to detect the IE version should the `documentMode` property that
|
||||||
// is stored on the document. This is only implemented in IE and is
|
// is stored on the document. This is only implemented in IE and is
|
||||||
// slightly cleaner than doing a user agent check.
|
// slightly cleaner than doing a user agent check.
|
||||||
@@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[
|
|||||||
|
|
||||||
this.resizeSearch();
|
this.resizeSearch();
|
||||||
if (searchHadFocus) {
|
if (searchHadFocus) {
|
||||||
this.$search.focus();
|
this.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[
|
|||||||
var width = '';
|
var width = '';
|
||||||
|
|
||||||
if (this.$search.attr('placeholder') !== '') {
|
if (this.$search.attr('placeholder') !== '') {
|
||||||
width = this.$selection.find('.select2-selection__rendered').innerWidth();
|
width = this.$selection.find('.select2-selection__rendered').width();
|
||||||
} else {
|
} else {
|
||||||
var minimumWidth = this.$search.val().length + 1;
|
var minimumWidth = this.$search.val().length + 1;
|
||||||
|
|
||||||
@@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[
|
|||||||
'open', 'opening',
|
'open', 'opening',
|
||||||
'close', 'closing',
|
'close', 'closing',
|
||||||
'select', 'selecting',
|
'select', 'selecting',
|
||||||
'unselect', 'unselecting'
|
'unselect', 'unselecting',
|
||||||
|
'clear', 'clearing'
|
||||||
];
|
];
|
||||||
|
|
||||||
var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
|
var preventableEvents = [
|
||||||
|
'opening', 'closing', 'selecting', 'unselecting', 'clearing'
|
||||||
|
];
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
@@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[
|
|||||||
'\u019F': 'O',
|
'\u019F': 'O',
|
||||||
'\uA74A': 'O',
|
'\uA74A': 'O',
|
||||||
'\uA74C': 'O',
|
'\uA74C': 'O',
|
||||||
|
'\u0152': 'OE',
|
||||||
'\u01A2': 'OI',
|
'\u01A2': 'OI',
|
||||||
'\uA74E': 'OO',
|
'\uA74E': 'OO',
|
||||||
'\u0222': 'OU',
|
'\u0222': 'OU',
|
||||||
@@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[
|
|||||||
'\uA74B': 'o',
|
'\uA74B': 'o',
|
||||||
'\uA74D': 'o',
|
'\uA74D': 'o',
|
||||||
'\u0275': 'o',
|
'\u0275': 'o',
|
||||||
|
'\u0153': 'oe',
|
||||||
'\u01A3': 'oi',
|
'\u01A3': 'oi',
|
||||||
'\u0223': 'ou',
|
'\u0223': 'ou',
|
||||||
'\uA74F': 'oo',
|
'\uA74F': 'oo',
|
||||||
@@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[
|
|||||||
'\u03CD': '\u03C5',
|
'\u03CD': '\u03C5',
|
||||||
'\u03CB': '\u03C5',
|
'\u03CB': '\u03C5',
|
||||||
'\u03B0': '\u03C5',
|
'\u03B0': '\u03C5',
|
||||||
'\u03C9': '\u03C9',
|
'\u03CE': '\u03C9',
|
||||||
'\u03C2': '\u03C3'
|
'\u03C2': '\u03C3',
|
||||||
|
'\u2019': '\''
|
||||||
};
|
};
|
||||||
|
|
||||||
return diacritics;
|
return diacritics;
|
||||||
@@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[
|
|||||||
if ($(data.element).is('option')) {
|
if ($(data.element).is('option')) {
|
||||||
data.element.selected = true;
|
data.element.selected = true;
|
||||||
|
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.$element.val(val);
|
self.$element.val(val);
|
||||||
self.$element.trigger('change');
|
self.$element.trigger('input').trigger('change');
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var val = data.id;
|
var val = data.id;
|
||||||
|
|
||||||
this.$element.val(val);
|
this.$element.val(val);
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[
|
|||||||
if ($(data.element).is('option')) {
|
if ($(data.element).is('option')) {
|
||||||
data.element.selected = false;
|
data.element.selected = false;
|
||||||
|
|
||||||
this.$element.trigger('change');
|
this.$element.trigger('input').trigger('change');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[
|
|||||||
|
|
||||||
self.$element.val(val);
|
self.$element.val(val);
|
||||||
|
|
||||||
self.$element.trigger('change');
|
self.$element.trigger('input').trigger('change');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[
|
|||||||
// Remove anything added to child elements
|
// Remove anything added to child elements
|
||||||
this.$element.find('*').each(function () {
|
this.$element.find('*').each(function () {
|
||||||
// Remove any custom data set by Select2
|
// Remove any custom data set by Select2
|
||||||
$.removeData(this, 'data');
|
Utils.RemoveData(this);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[
|
|||||||
normalizedData.element = option;
|
normalizedData.element = option;
|
||||||
|
|
||||||
// Override the option's data with the combined data
|
// Override the option's data with the combined data
|
||||||
$.data(option, 'data', normalizedData);
|
Utils.StoreData(option, 'data', normalizedData);
|
||||||
|
|
||||||
return $option;
|
return $option;
|
||||||
};
|
};
|
||||||
@@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[
|
|||||||
SelectAdapter.prototype.item = function ($option) {
|
SelectAdapter.prototype.item = function ($option) {
|
||||||
var data = {};
|
var data = {};
|
||||||
|
|
||||||
data = $.data($option[0], 'data');
|
data = Utils.GetData($option[0], 'data');
|
||||||
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
return data;
|
return data;
|
||||||
@@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[
|
|||||||
data = this._normalizeItem(data);
|
data = this._normalizeItem(data);
|
||||||
data.element = $option[0];
|
data.element = $option[0];
|
||||||
|
|
||||||
$.data($option[0], 'data', data);
|
Utils.StoreData($option[0], 'data', data);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
SelectAdapter.prototype._normalizeItem = function (item) {
|
SelectAdapter.prototype._normalizeItem = function (item) {
|
||||||
if (!$.isPlainObject(item)) {
|
if (item !== Object(item)) {
|
||||||
item = {
|
item = {
|
||||||
id: item,
|
id: item,
|
||||||
text: item
|
text: item
|
||||||
@@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[
|
|||||||
'jquery'
|
'jquery'
|
||||||
], function (SelectAdapter, Utils, $) {
|
], function (SelectAdapter, Utils, $) {
|
||||||
function ArrayAdapter ($element, options) {
|
function ArrayAdapter ($element, options) {
|
||||||
var data = options.get('data') || [];
|
this._dataToConvert = options.get('data') || [];
|
||||||
|
|
||||||
ArrayAdapter.__super__.constructor.call(this, $element, options);
|
ArrayAdapter.__super__.constructor.call(this, $element, options);
|
||||||
|
|
||||||
this.addOptions(this.convertToOptions(data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.Extend(ArrayAdapter, SelectAdapter);
|
Utils.Extend(ArrayAdapter, SelectAdapter);
|
||||||
|
|
||||||
|
ArrayAdapter.prototype.bind = function (container, $container) {
|
||||||
|
ArrayAdapter.__super__.bind.call(this, container, $container);
|
||||||
|
|
||||||
|
this.addOptions(this.convertToOptions(this._dataToConvert));
|
||||||
|
};
|
||||||
|
|
||||||
ArrayAdapter.prototype.select = function (data) {
|
ArrayAdapter.prototype.select = function (data) {
|
||||||
var $option = this.$element.find('option').filter(function (i, elm) {
|
var $option = this.$element.find('option').filter(function (i, elm) {
|
||||||
return elm.value == data.id.toString();
|
return elm.value == data.id.toString();
|
||||||
@@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[
|
|||||||
}, function () {
|
}, function () {
|
||||||
// Attempt to detect if a request was aborted
|
// Attempt to detect if a request was aborted
|
||||||
// Only works if the transport exposes a status property
|
// Only works if the transport exposes a status property
|
||||||
if ($request.status && $request.status === '0') {
|
if ('status' in $request &&
|
||||||
|
($request.status === 0 || $request.status === '0')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Tags.prototype._removeOldTags = function (_) {
|
Tags.prototype._removeOldTags = function (_) {
|
||||||
var tag = this._lastTag;
|
|
||||||
|
|
||||||
var $options = this.$element.find('option[data-select2-tag]');
|
var $options = this.$element.find('option[data-select2-tag]');
|
||||||
|
|
||||||
$options.each(function () {
|
$options.each(function () {
|
||||||
@@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[
|
|||||||
// Replace the search term if we have the search box
|
// Replace the search term if we have the search box
|
||||||
if (this.$search.length) {
|
if (this.$search.length) {
|
||||||
this.$search.val(tokenData.term);
|
this.$search.val(tokenData.term);
|
||||||
this.$search.focus();
|
this.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
|
|
||||||
params.term = tokenData.term;
|
params.term = tokenData.term;
|
||||||
@@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[
|
|||||||
decorated.call(this, $e, options);
|
decorated.call(this, $e, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MaximumSelectionLength.prototype.bind =
|
||||||
|
function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('select', function () {
|
||||||
|
self._checkIfMaximumSelected();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
MaximumSelectionLength.prototype.query =
|
MaximumSelectionLength.prototype.query =
|
||||||
function (decorated, params, callback) {
|
function (decorated, params, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
this._checkIfMaximumSelected(function () {
|
||||||
|
decorated.call(self, params, callback);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
MaximumSelectionLength.prototype._checkIfMaximumSelected =
|
||||||
|
function (_, successCallback) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
this.current(function (currentData) {
|
this.current(function (currentData) {
|
||||||
var count = currentData != null ? currentData.length : 0;
|
var count = currentData != null ? currentData.length : 0;
|
||||||
if (self.maximumSelectionLength > 0 &&
|
if (self.maximumSelectionLength > 0 &&
|
||||||
@@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
decorated.call(self, params, callback);
|
|
||||||
|
if (successCallback) {
|
||||||
|
successCallback();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Dropdown.prototype.position = function ($dropdown, $container) {
|
Dropdown.prototype.position = function ($dropdown, $container) {
|
||||||
// Should be implmented in subclasses
|
// Should be implemented in subclasses
|
||||||
};
|
};
|
||||||
|
|
||||||
Dropdown.prototype.destroy = function () {
|
Dropdown.prototype.destroy = function () {
|
||||||
@@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[
|
|||||||
'<span class="select2-search select2-search--dropdown">' +
|
'<span class="select2-search select2-search--dropdown">' +
|
||||||
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
||||||
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
||||||
' spellcheck="false" role="textbox" />' +
|
' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
|
||||||
'</span>'
|
'</span>'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[
|
|||||||
Search.prototype.bind = function (decorated, container, $container) {
|
Search.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
var resultsId = container.id + '-results';
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
this.$search.on('keydown', function (evt) {
|
this.$search.on('keydown', function (evt) {
|
||||||
@@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[
|
|||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
self.$search.attr('tabindex', 0);
|
self.$search.attr('tabindex', 0);
|
||||||
|
self.$search.attr('aria-controls', resultsId);
|
||||||
|
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
|
|
||||||
window.setTimeout(function () {
|
window.setTimeout(function () {
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
}, 0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
self.$search.attr('tabindex', -1);
|
self.$search.attr('tabindex', -1);
|
||||||
|
self.$search.removeAttr('aria-controls');
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
|
||||||
self.$search.val('');
|
self.$search.val('');
|
||||||
|
self.$search.trigger('blur');
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('focus', function () {
|
container.on('focus', function () {
|
||||||
if (!container.isOpen()) {
|
if (!container.isOpen()) {
|
||||||
self.$search.focus();
|
self.$search.trigger('focus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
container.on('results:focus', function (params) {
|
||||||
|
if (params.data._resultId) {
|
||||||
|
self.$search.attr('aria-activedescendant', params.data._resultId);
|
||||||
|
} else {
|
||||||
|
self.$search.removeAttr('aria-activedescendant');
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Search.prototype.handleSearch = function (evt) {
|
Search.prototype.handleSearch = function (evt) {
|
||||||
@@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
|
|
||||||
if (this.showLoadingMore(data)) {
|
if (this.showLoadingMore(data)) {
|
||||||
this.$results.append(this.$loadingMore);
|
this.$results.append(this.$loadingMore);
|
||||||
|
this.loadMoreIfNeeded();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
self.loading = true;
|
self.loading = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$results.on('scroll', function () {
|
this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
|
||||||
var isLoadMoreVisible = $.contains(
|
};
|
||||||
document.documentElement,
|
|
||||||
self.$loadingMore[0]
|
|
||||||
);
|
|
||||||
|
|
||||||
if (self.loading || !isLoadMoreVisible) {
|
InfiniteScroll.prototype.loadMoreIfNeeded = function () {
|
||||||
return;
|
var isLoadMoreVisible = $.contains(
|
||||||
}
|
document.documentElement,
|
||||||
|
this.$loadingMore[0]
|
||||||
|
);
|
||||||
|
|
||||||
var currentOffset = self.$results.offset().top +
|
if (this.loading || !isLoadMoreVisible) {
|
||||||
self.$results.outerHeight(false);
|
return;
|
||||||
var loadingMoreOffset = self.$loadingMore.offset().top +
|
}
|
||||||
self.$loadingMore.outerHeight(false);
|
|
||||||
|
|
||||||
if (currentOffset + 50 >= loadingMoreOffset) {
|
var currentOffset = this.$results.offset().top +
|
||||||
self.loadMore();
|
this.$results.outerHeight(false);
|
||||||
}
|
var loadingMoreOffset = this.$loadingMore.offset().top +
|
||||||
});
|
this.$loadingMore.outerHeight(false);
|
||||||
|
|
||||||
|
if (currentOffset + 50 >= loadingMoreOffset) {
|
||||||
|
this.loadMore();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
InfiniteScroll.prototype.loadMore = function () {
|
InfiniteScroll.prototype.loadMore = function () {
|
||||||
@@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|||||||
var $option = $(
|
var $option = $(
|
||||||
'<li ' +
|
'<li ' +
|
||||||
'class="select2-results__option select2-results__option--load-more"' +
|
'class="select2-results__option select2-results__option--load-more"' +
|
||||||
'role="treeitem" aria-disabled="true"></li>'
|
'role="option" aria-disabled="true"></li>'
|
||||||
);
|
);
|
||||||
|
|
||||||
var message = this.options.get('translations').get('loadingMore');
|
var message = this.options.get('translations').get('loadingMore');
|
||||||
@@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
'../utils'
|
'../utils'
|
||||||
], function ($, Utils) {
|
], function ($, Utils) {
|
||||||
function AttachBody (decorated, $element, options) {
|
function AttachBody (decorated, $element, options) {
|
||||||
this.$dropdownParent = options.get('dropdownParent') || $(document.body);
|
this.$dropdownParent = $(options.get('dropdownParent') || document.body);
|
||||||
|
|
||||||
decorated.call(this, $element, options);
|
decorated.call(this, $element, options);
|
||||||
}
|
}
|
||||||
@@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
AttachBody.prototype.bind = function (decorated, container, $container) {
|
AttachBody.prototype.bind = function (decorated, container, $container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var setupResultsEvents = false;
|
|
||||||
|
|
||||||
decorated.call(this, container, $container);
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
container.on('open', function () {
|
container.on('open', function () {
|
||||||
self._showDropdown();
|
self._showDropdown();
|
||||||
self._attachPositioningHandler(container);
|
self._attachPositioningHandler(container);
|
||||||
|
|
||||||
if (!setupResultsEvents) {
|
// Must bind after the results handlers to ensure correct sizing
|
||||||
setupResultsEvents = true;
|
self._bindContainerResultHandlers(container);
|
||||||
|
|
||||||
container.on('results:all', function () {
|
|
||||||
self._positionDropdown();
|
|
||||||
self._resizeDropdown();
|
|
||||||
});
|
|
||||||
|
|
||||||
container.on('results:append', function () {
|
|
||||||
self._positionDropdown();
|
|
||||||
self._resizeDropdown();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
container.on('close', function () {
|
container.on('close', function () {
|
||||||
@@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
this.$dropdownContainer.detach();
|
this.$dropdownContainer.detach();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AttachBody.prototype._bindContainerResultHandlers =
|
||||||
|
function (decorated, container) {
|
||||||
|
|
||||||
|
// These should only be bound once
|
||||||
|
if (this._containerResultsHandlersBound) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
container.on('results:all', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('results:append', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('results:message', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('select', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.on('unselect', function () {
|
||||||
|
self._positionDropdown();
|
||||||
|
self._resizeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
this._containerResultsHandlersBound = true;
|
||||||
|
};
|
||||||
|
|
||||||
AttachBody.prototype._attachPositioningHandler =
|
AttachBody.prototype._attachPositioningHandler =
|
||||||
function (decorated, container) {
|
function (decorated, container) {
|
||||||
var self = this;
|
var self = this;
|
||||||
@@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
|
|
||||||
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
||||||
$watchers.each(function () {
|
$watchers.each(function () {
|
||||||
$(this).data('select2-scroll-position', {
|
Utils.StoreData(this, 'select2-scroll-position', {
|
||||||
x: $(this).scrollLeft(),
|
x: $(this).scrollLeft(),
|
||||||
y: $(this).scrollTop()
|
y: $(this).scrollTop()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$watchers.on(scrollEvent, function (ev) {
|
$watchers.on(scrollEvent, function (ev) {
|
||||||
var position = $(this).data('select2-scroll-position');
|
var position = Utils.GetData(this, 'select2-scroll-position');
|
||||||
$(this).scrollTop(position.y);
|
$(this).scrollTop(position.y);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[
|
|||||||
top: container.bottom
|
top: container.bottom
|
||||||
};
|
};
|
||||||
|
|
||||||
// Determine what the parent element is to use for calciulating the offset
|
// Determine what the parent element is to use for calculating the offset
|
||||||
var $offsetParent = this.$dropdownParent;
|
var $offsetParent = this.$dropdownParent;
|
||||||
|
|
||||||
// For statically positoned elements, we need to get the element
|
// For statically positioned elements, we need to get the element
|
||||||
// that is determining the offset
|
// that is determining the offset
|
||||||
if ($offsetParent.css('position') === 'static') {
|
if ($offsetParent.css('position') === 'static') {
|
||||||
$offsetParent = $offsetParent.offsetParent();
|
$offsetParent = $offsetParent.offsetParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentOffset = $offsetParent.offset();
|
var parentOffset = {
|
||||||
|
top: 0,
|
||||||
|
left: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
if (
|
||||||
|
$.contains(document.body, $offsetParent[0]) ||
|
||||||
|
$offsetParent[0].isConnected
|
||||||
|
) {
|
||||||
|
parentOffset = $offsetParent.offset();
|
||||||
|
}
|
||||||
|
|
||||||
css.top -= parentOffset.top;
|
css.top -= parentOffset.top;
|
||||||
css.left -= parentOffset.left;
|
css.left -= parentOffset.left;
|
||||||
@@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[
|
|||||||
});
|
});
|
||||||
|
|
||||||
S2.define('select2/dropdown/selectOnClose',[
|
S2.define('select2/dropdown/selectOnClose',[
|
||||||
|
'../utils'
|
||||||
], function () {
|
], function (Utils) {
|
||||||
function SelectOnClose () { }
|
function SelectOnClose () { }
|
||||||
|
|
||||||
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
||||||
@@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlightedResults.data('data');
|
var data = Utils.GetData($highlightedResults[0], 'data');
|
||||||
|
|
||||||
// Don't re-select already selected resulte
|
// Don't re-select already selected resulte
|
||||||
if (
|
if (
|
||||||
@@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|||||||
var originalEvent = evt.originalEvent;
|
var originalEvent = evt.originalEvent;
|
||||||
|
|
||||||
// Don't close if the control key is being held
|
// Don't close if the control key is being held
|
||||||
if (originalEvent && originalEvent.ctrlKey) {
|
if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () {
|
|||||||
},
|
},
|
||||||
searching: function () {
|
searching: function () {
|
||||||
return 'Searching…';
|
return 'Searching…';
|
||||||
|
},
|
||||||
|
removeAllItems: function () {
|
||||||
|
return 'Remove all items';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
// If the defaults were not previously applied from an element, it is
|
||||||
// Check if the language is specified with a region
|
// possible for the language option to have not been resolved
|
||||||
if (options.language.indexOf('-') > 0) {
|
options.language = this._resolveLanguage(options.language);
|
||||||
// Extract the region information if it is included
|
|
||||||
var languageParts = options.language.split('-');
|
|
||||||
var baseLanguage = languageParts[0];
|
|
||||||
|
|
||||||
options.language = [options.language, baseLanguage];
|
// Always fall back to English since it will always be complete
|
||||||
} else {
|
options.language.push('en');
|
||||||
options.language = [options.language];
|
|
||||||
|
var uniqueLanguages = [];
|
||||||
|
|
||||||
|
for (var l = 0; l < options.language.length; l++) {
|
||||||
|
var language = options.language[l];
|
||||||
|
|
||||||
|
if (uniqueLanguages.indexOf(language) === -1) {
|
||||||
|
uniqueLanguages.push(language);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($.isArray(options.language)) {
|
options.language = uniqueLanguages;
|
||||||
var languages = new Translation();
|
|
||||||
options.language.push('en');
|
|
||||||
|
|
||||||
var languageNames = options.language;
|
options.translations = this._processTranslations(
|
||||||
|
options.language,
|
||||||
for (var l = 0; l < languageNames.length; l++) {
|
options.debug
|
||||||
var name = languageNames[l];
|
);
|
||||||
var language = {};
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Try to load it with the original name
|
|
||||||
language = Translation.loadPath(name);
|
|
||||||
} catch (e) {
|
|
||||||
try {
|
|
||||||
// If we couldn't load it, check if it wasn't the full path
|
|
||||||
name = this.defaults.amdLanguageBase + name;
|
|
||||||
language = Translation.loadPath(name);
|
|
||||||
} catch (ex) {
|
|
||||||
// The translation could not be loaded at all. Sometimes this is
|
|
||||||
// because of a configuration problem, other times this can be
|
|
||||||
// because of how Select2 helps load all possible translation files.
|
|
||||||
if (options.debug && window.console && console.warn) {
|
|
||||||
console.warn(
|
|
||||||
'Select2: The language file for "' + name + '" could not be ' +
|
|
||||||
'automatically loaded. A fallback will be used instead.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
languages.extend(language);
|
|
||||||
}
|
|
||||||
|
|
||||||
options.translations = languages;
|
|
||||||
} else {
|
|
||||||
var baseTranslation = Translation.loadPath(
|
|
||||||
this.defaults.amdLanguageBase + 'en'
|
|
||||||
);
|
|
||||||
var customTranslation = new Translation(options.language);
|
|
||||||
|
|
||||||
customTranslation.extend(baseTranslation);
|
|
||||||
|
|
||||||
options.translations = customTranslation;
|
|
||||||
}
|
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
};
|
};
|
||||||
@@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[
|
|||||||
debug: false,
|
debug: false,
|
||||||
dropdownAutoWidth: false,
|
dropdownAutoWidth: false,
|
||||||
escapeMarkup: Utils.escapeMarkup,
|
escapeMarkup: Utils.escapeMarkup,
|
||||||
language: EnglishTranslation,
|
language: {},
|
||||||
matcher: matcher,
|
matcher: matcher,
|
||||||
minimumInputLength: 0,
|
minimumInputLength: 0,
|
||||||
maximumInputLength: 0,
|
maximumInputLength: 0,
|
||||||
maximumSelectionLength: 0,
|
maximumSelectionLength: 0,
|
||||||
minimumResultsForSearch: 0,
|
minimumResultsForSearch: 0,
|
||||||
selectOnClose: false,
|
selectOnClose: false,
|
||||||
|
scrollAfterSelect: false,
|
||||||
sorter: function (data) {
|
sorter: function (data) {
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
@@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Defaults.prototype.applyFromElement = function (options, $element) {
|
||||||
|
var optionLanguage = options.language;
|
||||||
|
var defaultLanguage = this.defaults.language;
|
||||||
|
var elementLanguage = $element.prop('lang');
|
||||||
|
var parentLanguage = $element.closest('[lang]').prop('lang');
|
||||||
|
|
||||||
|
var languages = Array.prototype.concat.call(
|
||||||
|
this._resolveLanguage(elementLanguage),
|
||||||
|
this._resolveLanguage(optionLanguage),
|
||||||
|
this._resolveLanguage(defaultLanguage),
|
||||||
|
this._resolveLanguage(parentLanguage)
|
||||||
|
);
|
||||||
|
|
||||||
|
options.language = languages;
|
||||||
|
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
|
||||||
|
Defaults.prototype._resolveLanguage = function (language) {
|
||||||
|
if (!language) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.isEmptyObject(language)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.isPlainObject(language)) {
|
||||||
|
return [language];
|
||||||
|
}
|
||||||
|
|
||||||
|
var languages;
|
||||||
|
|
||||||
|
if (!$.isArray(language)) {
|
||||||
|
languages = [language];
|
||||||
|
} else {
|
||||||
|
languages = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
var resolvedLanguages = [];
|
||||||
|
|
||||||
|
for (var l = 0; l < languages.length; l++) {
|
||||||
|
resolvedLanguages.push(languages[l]);
|
||||||
|
|
||||||
|
if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
|
||||||
|
// Extract the region information if it is included
|
||||||
|
var languageParts = languages[l].split('-');
|
||||||
|
var baseLanguage = languageParts[0];
|
||||||
|
|
||||||
|
resolvedLanguages.push(baseLanguage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolvedLanguages;
|
||||||
|
};
|
||||||
|
|
||||||
|
Defaults.prototype._processTranslations = function (languages, debug) {
|
||||||
|
var translations = new Translation();
|
||||||
|
|
||||||
|
for (var l = 0; l < languages.length; l++) {
|
||||||
|
var languageData = new Translation();
|
||||||
|
|
||||||
|
var language = languages[l];
|
||||||
|
|
||||||
|
if (typeof language === 'string') {
|
||||||
|
try {
|
||||||
|
// Try to load it with the original name
|
||||||
|
languageData = Translation.loadPath(language);
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
// If we couldn't load it, check if it wasn't the full path
|
||||||
|
language = this.defaults.amdLanguageBase + language;
|
||||||
|
languageData = Translation.loadPath(language);
|
||||||
|
} catch (ex) {
|
||||||
|
// The translation could not be loaded at all. Sometimes this is
|
||||||
|
// because of a configuration problem, other times this can be
|
||||||
|
// because of how Select2 helps load all possible translation files
|
||||||
|
if (debug && window.console && console.warn) {
|
||||||
|
console.warn(
|
||||||
|
'Select2: The language file for "' + language + '" could ' +
|
||||||
|
'not be automatically loaded. A fallback will be used instead.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ($.isPlainObject(language)) {
|
||||||
|
languageData = new Translation(language);
|
||||||
|
} else {
|
||||||
|
languageData = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
translations.extend(languageData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return translations;
|
||||||
|
};
|
||||||
|
|
||||||
Defaults.prototype.set = function (key, value) {
|
Defaults.prototype.set = function (key, value) {
|
||||||
var camelKey = $.camelCase(key);
|
var camelKey = $.camelCase(key);
|
||||||
|
|
||||||
@@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[
|
|||||||
|
|
||||||
var convertedData = Utils._convertData(data);
|
var convertedData = Utils._convertData(data);
|
||||||
|
|
||||||
$.extend(this.defaults, convertedData);
|
$.extend(true, this.defaults, convertedData);
|
||||||
};
|
};
|
||||||
|
|
||||||
var defaults = new Defaults();
|
var defaults = new Defaults();
|
||||||
@@ -4937,6 +5226,10 @@ S2.define('select2/options',[
|
|||||||
this.fromElement($element);
|
this.fromElement($element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($element != null) {
|
||||||
|
this.options = Defaults.applyFromElement(this.options, $element);
|
||||||
|
}
|
||||||
|
|
||||||
this.options = Defaults.apply(this.options);
|
this.options = Defaults.apply(this.options);
|
||||||
|
|
||||||
if ($element && $element.is('input')) {
|
if ($element && $element.is('input')) {
|
||||||
@@ -4960,14 +5253,6 @@ S2.define('select2/options',[
|
|||||||
this.options.disabled = $e.prop('disabled');
|
this.options.disabled = $e.prop('disabled');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.options.language == null) {
|
|
||||||
if ($e.prop('lang')) {
|
|
||||||
this.options.language = $e.prop('lang').toLowerCase();
|
|
||||||
} else if ($e.closest('[lang]').prop('lang')) {
|
|
||||||
this.options.language = $e.closest('[lang]').prop('lang');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.dir == null) {
|
if (this.options.dir == null) {
|
||||||
if ($e.prop('dir')) {
|
if ($e.prop('dir')) {
|
||||||
this.options.dir = $e.prop('dir');
|
this.options.dir = $e.prop('dir');
|
||||||
@@ -4981,7 +5266,7 @@ S2.define('select2/options',[
|
|||||||
$e.prop('disabled', this.options.disabled);
|
$e.prop('disabled', this.options.disabled);
|
||||||
$e.prop('multiple', this.options.multiple);
|
$e.prop('multiple', this.options.multiple);
|
||||||
|
|
||||||
if ($e.data('select2Tags')) {
|
if (Utils.GetData($e[0], 'select2Tags')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
||||||
@@ -4990,11 +5275,11 @@ S2.define('select2/options',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.data('data', $e.data('select2Tags'));
|
Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
|
||||||
$e.data('tags', true);
|
Utils.StoreData($e[0], 'tags', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e.data('ajaxUrl')) {
|
if (Utils.GetData($e[0], 'ajaxUrl')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
||||||
@@ -5003,21 +5288,45 @@ S2.define('select2/options',[
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.attr('ajax--url', $e.data('ajaxUrl'));
|
$e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
$e.data('ajax--url', $e.data('ajaxUrl'));
|
Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var dataset = {};
|
var dataset = {};
|
||||||
|
|
||||||
|
function upperCaseLetter(_, letter) {
|
||||||
|
return letter.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pre-load all of the attributes which are prefixed with `data-`
|
||||||
|
for (var attr = 0; attr < $e[0].attributes.length; attr++) {
|
||||||
|
var attributeName = $e[0].attributes[attr].name;
|
||||||
|
var prefix = 'data-';
|
||||||
|
|
||||||
|
if (attributeName.substr(0, prefix.length) == prefix) {
|
||||||
|
// Get the contents of the attribute after `data-`
|
||||||
|
var dataName = attributeName.substring(prefix.length);
|
||||||
|
|
||||||
|
// Get the data contents from the consistent source
|
||||||
|
// This is more than likely the jQuery data helper
|
||||||
|
var dataValue = Utils.GetData($e[0], dataName);
|
||||||
|
|
||||||
|
// camelCase the attribute name to match the spec
|
||||||
|
var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
|
||||||
|
|
||||||
|
// Store the data attribute contents into the dataset since
|
||||||
|
dataset[camelDataName] = dataValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Prefer the element's `dataset` attribute if it exists
|
// Prefer the element's `dataset` attribute if it exists
|
||||||
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
||||||
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
||||||
dataset = $.extend(true, {}, $e[0].dataset, $e.data());
|
dataset = $.extend(true, {}, $e[0].dataset, dataset);
|
||||||
} else {
|
|
||||||
dataset = $e.data();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $.extend(true, {}, dataset);
|
// Prefer our internal data cache if it exists
|
||||||
|
var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
|
||||||
|
|
||||||
data = Utils._convertData(data);
|
data = Utils._convertData(data);
|
||||||
|
|
||||||
@@ -5054,8 +5363,8 @@ S2.define('select2/core',[
|
|||||||
'./keys'
|
'./keys'
|
||||||
], function ($, Options, Utils, KEYS) {
|
], function ($, Options, Utils, KEYS) {
|
||||||
var Select2 = function ($element, options) {
|
var Select2 = function ($element, options) {
|
||||||
if ($element.data('select2') != null) {
|
if (Utils.GetData($element[0], 'select2') != null) {
|
||||||
$element.data('select2').destroy();
|
Utils.GetData($element[0], 'select2').destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element = $element;
|
this.$element = $element;
|
||||||
@@ -5071,7 +5380,7 @@ S2.define('select2/core',[
|
|||||||
// Set up the tabindex
|
// Set up the tabindex
|
||||||
|
|
||||||
var tabindex = $element.attr('tabindex') || 0;
|
var tabindex = $element.attr('tabindex') || 0;
|
||||||
$element.data('old-tabindex', tabindex);
|
Utils.StoreData($element[0], 'old-tabindex', tabindex);
|
||||||
$element.attr('tabindex', '-1');
|
$element.attr('tabindex', '-1');
|
||||||
|
|
||||||
// Set up containers and adapters
|
// Set up containers and adapters
|
||||||
@@ -5132,6 +5441,9 @@ S2.define('select2/core',[
|
|||||||
// Synchronize any monitored attributes
|
// Synchronize any monitored attributes
|
||||||
this._syncAttributes();
|
this._syncAttributes();
|
||||||
|
|
||||||
|
Utils.StoreData($element[0], 'select2', this);
|
||||||
|
|
||||||
|
// Ensure backwards compatibility with $element.data('select2').
|
||||||
$element.data('select2', this);
|
$element.data('select2', this);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5208,6 +5520,12 @@ S2.define('select2/core',[
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (method == 'computedstyle') {
|
||||||
|
var computedStyle = window.getComputedStyle($element[0]);
|
||||||
|
|
||||||
|
return computedStyle.width;
|
||||||
|
}
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5248,8 +5566,8 @@ S2.define('select2/core',[
|
|||||||
|
|
||||||
if (observer != null) {
|
if (observer != null) {
|
||||||
this._observer = new observer(function (mutations) {
|
this._observer = new observer(function (mutations) {
|
||||||
$.each(mutations, self._syncA);
|
self._syncA();
|
||||||
$.each(mutations, self._syncS);
|
self._syncS(null, mutations);
|
||||||
});
|
});
|
||||||
this._observer.observe(this.$element[0], {
|
this._observer.observe(this.$element[0], {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
@@ -5371,7 +5689,7 @@ S2.define('select2/core',[
|
|||||||
if (self.isOpen()) {
|
if (self.isOpen()) {
|
||||||
if (key === KEYS.ESC || key === KEYS.TAB ||
|
if (key === KEYS.ESC || key === KEYS.TAB ||
|
||||||
(key === KEYS.UP && evt.altKey)) {
|
(key === KEYS.UP && evt.altKey)) {
|
||||||
self.close();
|
self.close(evt);
|
||||||
|
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
} else if (key === KEYS.ENTER) {
|
} else if (key === KEYS.ENTER) {
|
||||||
@@ -5405,7 +5723,7 @@ S2.define('select2/core',[
|
|||||||
Select2.prototype._syncAttributes = function () {
|
Select2.prototype._syncAttributes = function () {
|
||||||
this.options.set('disabled', this.$element.prop('disabled'));
|
this.options.set('disabled', this.$element.prop('disabled'));
|
||||||
|
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
if (this.isOpen()) {
|
if (this.isOpen()) {
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
@@ -5416,7 +5734,7 @@ S2.define('select2/core',[
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype._syncSubtree = function (evt, mutations) {
|
Select2.prototype._isChangeMutation = function (evt, mutations) {
|
||||||
var changed = false;
|
var changed = false;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
@@ -5444,7 +5762,22 @@ S2.define('select2/core',[
|
|||||||
}
|
}
|
||||||
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
||||||
changed = true;
|
changed = true;
|
||||||
|
} else if ($.isArray(mutations)) {
|
||||||
|
$.each(mutations, function(evt, mutation) {
|
||||||
|
if (self._isChangeMutation(evt, mutation)) {
|
||||||
|
// We've found a change mutation.
|
||||||
|
// Let's escape from the loop and continue
|
||||||
|
changed = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
return changed;
|
||||||
|
};
|
||||||
|
|
||||||
|
Select2.prototype._syncSubtree = function (evt, mutations) {
|
||||||
|
var changed = this._isChangeMutation(evt, mutations);
|
||||||
|
var self = this;
|
||||||
|
|
||||||
// Only re-pull the data if we think there is a change
|
// Only re-pull the data if we think there is a change
|
||||||
if (changed) {
|
if (changed) {
|
||||||
@@ -5466,7 +5799,8 @@ S2.define('select2/core',[
|
|||||||
'open': 'opening',
|
'open': 'opening',
|
||||||
'close': 'closing',
|
'close': 'closing',
|
||||||
'select': 'selecting',
|
'select': 'selecting',
|
||||||
'unselect': 'unselecting'
|
'unselect': 'unselecting',
|
||||||
|
'clear': 'clearing'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (args === undefined) {
|
if (args === undefined) {
|
||||||
@@ -5494,7 +5828,7 @@ S2.define('select2/core',[
|
|||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.toggleDropdown = function () {
|
Select2.prototype.toggleDropdown = function () {
|
||||||
if (this.options.get('disabled')) {
|
if (this.isDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5510,15 +5844,40 @@ S2.define('select2/core',[
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.isDisabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.trigger('query', {});
|
this.trigger('query', {});
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.close = function () {
|
Select2.prototype.close = function (evt) {
|
||||||
if (!this.isOpen()) {
|
if (!this.isOpen()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.trigger('close', {});
|
this.trigger('close', { originalEvent : evt });
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "enabled" (not "disabled") state of this
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @return {true} if the instance is not disabled.
|
||||||
|
* @return {false} if the instance is disabled.
|
||||||
|
*/
|
||||||
|
Select2.prototype.isEnabled = function () {
|
||||||
|
return !this.isDisabled();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to abstract the "disabled" state of this object.
|
||||||
|
*
|
||||||
|
* @return {true} if the disabled option is true.
|
||||||
|
* @return {false} if the disabled option is false.
|
||||||
|
*/
|
||||||
|
Select2.prototype.isDisabled = function () {
|
||||||
|
return this.options.get('disabled');
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.isOpen = function () {
|
Select2.prototype.isOpen = function () {
|
||||||
@@ -5595,7 +5954,7 @@ S2.define('select2/core',[
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element.val(newVal).trigger('change');
|
this.$element.val(newVal).trigger('input').trigger('change');
|
||||||
};
|
};
|
||||||
|
|
||||||
Select2.prototype.destroy = function () {
|
Select2.prototype.destroy = function () {
|
||||||
@@ -5621,10 +5980,12 @@ S2.define('select2/core',[
|
|||||||
this._syncS = null;
|
this._syncS = null;
|
||||||
|
|
||||||
this.$element.off('.select2');
|
this.$element.off('.select2');
|
||||||
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
this.$element.attr('tabindex',
|
||||||
|
Utils.GetData(this.$element[0], 'old-tabindex'));
|
||||||
|
|
||||||
this.$element.removeClass('select2-hidden-accessible');
|
this.$element.removeClass('select2-hidden-accessible');
|
||||||
this.$element.attr('aria-hidden', 'false');
|
this.$element.attr('aria-hidden', 'false');
|
||||||
|
Utils.RemoveData(this.$element[0]);
|
||||||
this.$element.removeData('select2');
|
this.$element.removeData('select2');
|
||||||
|
|
||||||
this.dataAdapter.destroy();
|
this.dataAdapter.destroy();
|
||||||
@@ -5652,7 +6013,7 @@ S2.define('select2/core',[
|
|||||||
|
|
||||||
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
||||||
|
|
||||||
$container.data('element', this.$element);
|
Utils.StoreData($container[0], 'element', this.$element);
|
||||||
|
|
||||||
return $container;
|
return $container;
|
||||||
};
|
};
|
||||||
@@ -5672,8 +6033,9 @@ S2.define('jquery.select2',[
|
|||||||
'jquery-mousewheel',
|
'jquery-mousewheel',
|
||||||
|
|
||||||
'./select2/core',
|
'./select2/core',
|
||||||
'./select2/defaults'
|
'./select2/defaults',
|
||||||
], function ($, _, Select2, Defaults) {
|
'./select2/utils'
|
||||||
|
], function ($, _, Select2, Defaults, Utils) {
|
||||||
if ($.fn.select2 == null) {
|
if ($.fn.select2 == null) {
|
||||||
// All methods that should return the element
|
// All methods that should return the element
|
||||||
var thisMethods = ['open', 'close', 'destroy'];
|
var thisMethods = ['open', 'close', 'destroy'];
|
||||||
@@ -5694,7 +6056,7 @@ S2.define('jquery.select2',[
|
|||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
var instance = $(this).data('select2');
|
var instance = Utils.GetData(this, 'select2');
|
||||||
|
|
||||||
if (instance == null && window.console && console.error) {
|
if (instance == null && window.console && console.error) {
|
||||||
console.error(
|
console.error(
|
||||||
|
|||||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-1
File diff suppressed because one or more lines are too long
@@ -204,7 +204,15 @@ $result = Util::generateFileUsingSimpleTemplate(
|
|||||||
'sharedIconPath' => $sharedIconPath,
|
'sharedIconPath' => $sharedIconPath,
|
||||||
'gameImagePath' => $gameImagePath,
|
'gameImagePath' => $gameImagePath,
|
||||||
'imageRequestPath' => $imageRequestPath,
|
'imageRequestPath' => $imageRequestPath,
|
||||||
'imageRequestKey' => $imageRequestKey
|
'imageRequestKey' => $imageRequestKey,
|
||||||
|
'serverList' => [
|
||||||
|
['che', '체', 'white'],
|
||||||
|
['kwe', '퀘', 'yellow'],
|
||||||
|
['pwe', '풰', 'orange'],
|
||||||
|
['twe', '퉤', 'magenta'],
|
||||||
|
['nya', '냐', '#e67e22'],
|
||||||
|
['pya', '퍄', '#9b59b6']
|
||||||
|
]
|
||||||
],
|
],
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ class ServConfig
|
|||||||
public static $gameImagePath = "_tK_gameImagePath_";
|
public static $gameImagePath = "_tK_gameImagePath_";
|
||||||
public static $imageRequestPath = "_tK_imageRequestPath_";
|
public static $imageRequestPath = "_tK_imageRequestPath_";
|
||||||
public static $imageRequestKey = '_tK_imageRequestKey_';
|
public static $imageRequestKey = '_tK_imageRequestKey_';
|
||||||
|
private static $serverList = null;
|
||||||
|
|
||||||
public static function getSharedIconPath(string $filepath = ''): string
|
public static function getSharedIconPath(string $filepath = ''): string
|
||||||
{
|
{
|
||||||
@@ -42,6 +43,24 @@ class ServConfig
|
|||||||
return static::$imageRequestPath . "?req={$req_hash}&time={$now}";
|
return static::$imageRequestPath . "?req={$req_hash}&time={$now}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 서버 설정 반환
|
||||||
|
*
|
||||||
|
* @return \sammo\Setting[]
|
||||||
|
*/
|
||||||
|
public static function getServerList(): array{
|
||||||
|
$servKeyList = [/*_tK_serverList_*/];
|
||||||
|
$servKeyList[] = ['hwe', '훼', 'red'];
|
||||||
|
|
||||||
|
if (self::$serverList === null) {
|
||||||
|
self::$serverList = [];
|
||||||
|
foreach($servKeyList as [$servKey, $servNick, $servColor]){
|
||||||
|
self::$serverList[$servKey] = new Setting(ROOT.'/'.$servKey, $servNick, $servColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self::$serverList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 서버 주소 반환. 서버의 경로가 하부 디렉토리인 경우에 하부 디렉토리까지 포함
|
* 서버 주소 반환. 서버의 경로가 하부 디렉토리인 경우에 하부 디렉토리까지 포함
|
||||||
|
|||||||
+1
-1
@@ -38,7 +38,7 @@ $admin = getAdmin();
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td width=110 align=right>시작시간변경</td>
|
<td width=110 align=right>시작시간변경</td>
|
||||||
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=$admin['starttime']?>'><input type=submit name=btn value=변경1></td>
|
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
|
||||||
<td width=110 align=right>현재도시훈사</td>
|
<td width=110 align=right>현재도시훈사</td>
|
||||||
<td width=285><?=$admin['city_rate']?></td>
|
<td width=285><?=$admin['city_rate']?></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ $types = [
|
|||||||
}
|
}
|
||||||
return $v;
|
return $v;
|
||||||
}],
|
}],
|
||||||
|
["점 령", "int", function($v){$v['value'] = $v['occupied']; return $v; }],
|
||||||
["사 살", "int", function($v){$v['value'] = $v['killcrew']; return $v; }],
|
["사 살", "int", function($v){$v['value'] = $v['killcrew']; return $v; }],
|
||||||
["살 상 률", "percent", function($v){
|
["살 상 률", "percent", function($v){
|
||||||
if($v['warnum'] < 10){
|
if($v['warnum'] < 10){
|
||||||
@@ -101,6 +102,16 @@ $types = [
|
|||||||
}
|
}
|
||||||
return $v;
|
return $v;
|
||||||
}],
|
}],
|
||||||
|
["대 인 사 살", "int", function($v){$v['value'] = $v['killcrew_person']; return $v; }],
|
||||||
|
["대 인 살 상 률", "percent", function($v){
|
||||||
|
if($v['warnum'] < 10){
|
||||||
|
$v['value'] = 0;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$v['value'] = $v['killcrew_person'] / max(1, $v['deathcrew_person']);
|
||||||
|
}
|
||||||
|
return $v;
|
||||||
|
}],
|
||||||
["보 병 숙 련 도", "int", function($v){$v['value'] = $v['dex1']; return $v; }],
|
["보 병 숙 련 도", "int", function($v){$v['value'] = $v['dex1']; return $v; }],
|
||||||
["궁 병 숙 련 도", "int", function($v){$v['value'] = $v['dex2']; return $v; }],
|
["궁 병 숙 련 도", "int", function($v){$v['value'] = $v['dex2']; return $v; }],
|
||||||
["기 병 숙 련 도", "int", function($v){$v['value'] = $v['dex3']; return $v; }],
|
["기 병 숙 련 도", "int", function($v){$v['value'] = $v['dex3']; return $v; }],
|
||||||
|
|||||||
@@ -90,8 +90,11 @@ $types = [
|
|||||||
'warnum'=>['전 투 횟 수', 'int'],
|
'warnum'=>['전 투 횟 수', 'int'],
|
||||||
'killnum'=>['승 리', 'int'],
|
'killnum'=>['승 리', 'int'],
|
||||||
'winrate'=>['승 률', 'percent'],
|
'winrate'=>['승 률', 'percent'],
|
||||||
|
'occupied'=>['점 령', 'int'],
|
||||||
'killcrew'=>['사 살', 'int'],
|
'killcrew'=>['사 살', 'int'],
|
||||||
'killrate'=>['살 상 률', 'percent'],
|
'killrate'=>['살 상 률', 'percent'],
|
||||||
|
'killcrew_person'=>['대 인 사 살', 'int'],
|
||||||
|
'killrate_person'=>['대 인 살 상 률', 'percent'],
|
||||||
'dex1'=>['보 병 숙 련 도', 'int'],
|
'dex1'=>['보 병 숙 련 도', 'int'],
|
||||||
'dex2'=>['궁 병 숙 련 도', 'int'],
|
'dex2'=>['궁 병 숙 련 도', 'int'],
|
||||||
'dex3'=>['기 병 숙 련 도', 'int'],
|
'dex3'=>['기 병 숙 련 도', 'int'],
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ var maxChiefTurn = <?=GameConst::$maxChiefTurn?>;
|
|||||||
></div
|
></div
|
||||||
><div
|
><div
|
||||||
><?=chiefCommandTable($generalObj)
|
><?=chiefCommandTable($generalObj)
|
||||||
?><input type='button' id='setCommand' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='실 행'
|
?><br><input type='button' id='setCommand' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='실 행'
|
||||||
></div
|
></div
|
||||||
></div
|
></div
|
||||||
></div
|
></div
|
||||||
|
|||||||
+1
-1
@@ -93,7 +93,7 @@ switch ($type) {
|
|||||||
case 5: $orderSQL = "order by crew desc"; break;
|
case 5: $orderSQL = "order by crew desc"; break;
|
||||||
case 6: $orderSQL = "order by killturn"; break;
|
case 6: $orderSQL = "order by killturn"; break;
|
||||||
case 7: $orderSQL = "order by turntime"; break;
|
case 7: $orderSQL = "order by turntime"; break;
|
||||||
case 8: $orderSQL = "order by troop_leader desc"; break;
|
case 8: $orderSQL = "order by troop desc"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$generals = $db->query(
|
$generals = $db->query(
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ $level = Util::convertArrayToDict(
|
|||||||
|
|
||||||
$tigers = $db->query('SELECT value, name
|
$tigers = $db->query('SELECT value, name
|
||||||
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
|
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
|
||||||
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
|
WHERE rank_data.nation_id = %i AND rank_data.type = "killnum" AND value > 0 ORDER BY value DESC LIMIT 5',
|
||||||
$nationID
|
$nationID
|
||||||
);// 오호장군
|
);// 오호장군
|
||||||
$tigerstr = join(', ', array_map(function($arr){
|
$tigerstr = join(', ', array_map(function($arr){
|
||||||
@@ -506,7 +506,7 @@ foreach($db->query('SELECT city,name,level,region,officer_set from city where na
|
|||||||
<?php if(key_exists($officerLevel, $cityOfficerList)):
|
<?php if(key_exists($officerLevel, $cityOfficerList)):
|
||||||
$officer = $cityOfficerList[$officerLevel];
|
$officer = $cityOfficerList[$officerLevel];
|
||||||
?>
|
?>
|
||||||
<td><?=$officer['name']?>(<?=$officer['belong']?>년) 【<?=CityConst::byID($officer['city'])->name?>】</td>
|
<td style="color:<?=isOfficerSet($city['officer_set'], $officerLevel)?'orange':'white'?>;"><?=$officer['name']?>(<?=$officer['belong']?>년) 【<?=CityConst::byID($officer['city'])->name?>】</td>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<td>-</td>
|
<td>-</td>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|||||||
+38
-90
@@ -4,29 +4,9 @@ namespace sammo;
|
|||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
$btn = Util::getPost('btn');
|
|
||||||
$defence_train = Util::getPost('defence_train', 'int', 2);
|
|
||||||
$tnmt = Util::getPost('tnmt', 'int', 1);
|
|
||||||
//$detachNPC = Util::getPost('detachNPC', 'bool');
|
|
||||||
$detachNPC = false;
|
|
||||||
|
|
||||||
$showDieImmediatelyBtn = false;
|
$showDieImmediatelyBtn = false;
|
||||||
$availableDieImmediately = false;
|
$availableDieImmediately = false;
|
||||||
|
|
||||||
if ($defence_train <= 60) {
|
|
||||||
$defence_train = 60;
|
|
||||||
}
|
|
||||||
else if($defence_train <= 80){
|
|
||||||
$defence_train = 80;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$defence_train = 999;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($tnmt < 0 || $tnmt > 1){
|
|
||||||
$tnmt = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//로그인 검사
|
//로그인 검사
|
||||||
$session = Session::requireGameLogin()->setReadOnly();
|
$session = Session::requireGameLogin()->setReadOnly();
|
||||||
$userID = Session::getUserID();
|
$userID = Session::getUserID();
|
||||||
@@ -34,6 +14,7 @@ $generalID = $session->generalID;
|
|||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
$gameStor->cacheValues(['turntime', 'opentime', 'autorun_user']);
|
||||||
|
|
||||||
increaseRefresh("내정보", 1);
|
increaseRefresh("내정보", 1);
|
||||||
|
|
||||||
@@ -41,61 +22,24 @@ $me = General::createGeneralObjFromDB($generalID);
|
|||||||
|
|
||||||
$myset = $me->getVar('myset');
|
$myset = $me->getVar('myset');
|
||||||
if ($myset > 0) {
|
if ($myset > 0) {
|
||||||
$submit = 'submit';
|
$submit = 'button';
|
||||||
} else {
|
} else {
|
||||||
$submit = 'hidden';
|
$submit = 'hidden';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($btn == "설정저장" || $detachNPC) && $myset > 0) {
|
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2);
|
||||||
if ($myset > 1) {
|
|
||||||
$submit = 'submit';
|
|
||||||
} else {
|
|
||||||
$submit = 'hidden';
|
|
||||||
}
|
|
||||||
|
|
||||||
if($defence_train != $me->getVar('defence_train')){
|
|
||||||
if($defence_train == 999){
|
|
||||||
$me->increaseVar('myset', -1);
|
|
||||||
$me->setVar('defence_train', $defence_train);
|
|
||||||
$me->increaseVar('train', -3);
|
|
||||||
$me->increaseVar('atmos', -3);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$me->increaseVar('myset', -1);
|
|
||||||
$me->setVar('defence_train', $defence_train);
|
|
||||||
}
|
|
||||||
$myset -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($me->getVar('tnmt') != $tnmt){
|
|
||||||
$me->setVar('tnmt', $tnmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($me->getNPCType() == 1 && $detachNPC){
|
|
||||||
$turnterm = $gameStor->turnterm;
|
|
||||||
|
|
||||||
if($turnterm < 10){
|
|
||||||
$targetKillTurn = 30 / $turnterm;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$targetKillTurn = 60 / $turnterm;
|
|
||||||
}
|
|
||||||
$me->setVar('killturn', $targetKillTurn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$me->applyDB($db);
|
|
||||||
|
|
||||||
if($gameStor->turntime <= $gameStor->opentime){
|
if($gameStor->turntime <= $gameStor->opentime){
|
||||||
//서버 가오픈시 할 수 있는 행동
|
//서버 가오픈시 할 수 있는 행동
|
||||||
|
|
||||||
if($me->getNPCType() == 0){
|
if($me->getNPCType() == 0){
|
||||||
$showDieImmediatelyBtn = true;
|
$showDieImmediatelyBtn = true;
|
||||||
if(addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2) <= TimeUtil::now()){
|
if($targetTime <= TimeUtil::now()){
|
||||||
$availableDieImmediately = true;
|
$availableDieImmediately = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$use_treatment = $me->getAuxVar('use_treatment')??10;
|
||||||
|
$use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn')??1;
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@@ -104,6 +48,9 @@ if($gameStor->turntime <= $gameStor->opentime){
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=1024" />
|
<meta name="viewport" content="width=1024" />
|
||||||
<title><?=UniqueConst::$serverName?>: 내정보</title>
|
<title><?=UniqueConst::$serverName?>: 내정보</title>
|
||||||
|
<script>
|
||||||
|
var availableDieImmediately = <?=$availableDieImmediately?'true':'false'?>;
|
||||||
|
</script>
|
||||||
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
|
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
|
||||||
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
|
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
|
||||||
<?=WebUtil::printJS('js/common.js')?>
|
<?=WebUtil::printJS('js/common.js')?>
|
||||||
@@ -111,21 +58,6 @@ if($gameStor->turntime <= $gameStor->opentime){
|
|||||||
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
||||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||||
<?=WebUtil::printCSS('css/common.css')?>
|
<?=WebUtil::printCSS('css/common.css')?>
|
||||||
<script>
|
|
||||||
var availableDieImmediately = <?=$availableDieImmediately?'true':'false'?>;
|
|
||||||
jQuery(function($){
|
|
||||||
|
|
||||||
$('#die_immediately').click(function(){
|
|
||||||
if(!availableDieImmediately){
|
|
||||||
alert('삭제를 위해서는 생성 후 2턴 가량의 시간이 필요합니다.');
|
|
||||||
location.reload();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return confirm('정말로 삭제하시겠습니까?');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -139,29 +71,45 @@ $('#die_immediately').click(function(){
|
|||||||
<?php generalInfo2($me); ?>
|
<?php generalInfo2($me); ?>
|
||||||
</td>
|
</td>
|
||||||
<td width=50% valign=top style="padding-left:4ch;">
|
<td width=50% valign=top style="padding-left:4ch;">
|
||||||
<form name=form1 action=b_myPage.php method=post>
|
|
||||||
토너먼트 【
|
토너먼트 【
|
||||||
<input type=radio name=tnmt value=0 <?=$me->getVar('tnmt')==0?"checked":""; ?>>수동참여
|
<input type=radio class='tnmt' name=tnmt value=0 <?=$me->getVar('tnmt')==0?"checked":""; ?>>수동참여
|
||||||
<input type=radio name=tnmt value=1 <?=$me->getVar('tnmt')==1?"checked":""; ?>>자동참여
|
<input type=radio class='tnmt' name=tnmt value=1 <?=$me->getVar('tnmt')==1?"checked":""; ?>>자동참여
|
||||||
】<br>
|
】<br>
|
||||||
∞<font color=orange>개막직전 남는자리가 있을경우 랜덤하게 참여합니다.</font><br><br>
|
∞<span style='color:orange'>개막직전 남는자리가 있을경우 랜덤하게 참여합니다.</span><br><br>
|
||||||
수비 【
|
|
||||||
<input type=radio name=defence_train value=80 <?=$me->getVar('defence_train')==80?"checked":""; ?>>◎(훈사80)
|
환약 사용 【<select id='use_treatment' name='use_treatment'>
|
||||||
<input type=radio name=defence_train value=60 <?=$me->getVar('defence_train')==60?"checked":""; ?>>○(훈사60)
|
<option value=10 <?=($use_treatment==10)?"selected":""; ?>>경상</option>
|
||||||
<input type=radio name=defence_train value=999 <?=$me->getVar('defence_train')==999?"checked":""; ?>>×
|
<option value=21 <?=($use_treatment==21)?"selected":""; ?>>중상</option>
|
||||||
|
<option value=41 <?=($use_treatment==41)?"selected":""; ?>>심각</option>
|
||||||
|
<option value=61 <?=($use_treatment==61)?"selected":""; ?>>위독</option>
|
||||||
|
<option value=100 <?=($use_treatment==100)?"selected":""; ?>>사용안함</option>
|
||||||
|
</select>】<br>
|
||||||
|
∞<span style='color:orange'>부상을 입었을 때 환약을 사용하는 기준입니다.</span><br><br>
|
||||||
|
<?php if(($gameStor->autorun_user['options']['chief'])??false) : ?>
|
||||||
|
자동 사령턴 허용 【<select id='use_auto_nation_turn' name='use_auto_nation_turn'>
|
||||||
|
<option value=1 <?=$use_auto_nation_turn?"selected":""; ?>>허용</option>
|
||||||
|
<option value=0 <?=(!$use_auto_nation_turn)?"selected":""; ?>>허용 안함</option>
|
||||||
|
</select>】<br>
|
||||||
|
∞<span style='color:orange'>수뇌가 되었을 때 휴식 턴이어도 적당한 턴을 알아서 넣는 것을 허용합니다.</span><br><br>
|
||||||
|
<?php endif; ?>
|
||||||
|
수비 【<select id='defence_train' name='defence_train'>
|
||||||
|
<?php foreach([90, 80, 60, 40] as $targetDefenceTrain): ?>
|
||||||
|
<option value='<?=$targetDefenceTrain?>' <?=$me->getVar('defence_train')==$targetDefenceTrain?"selected":""; ?>><?=formatDefenceTrain($targetDefenceTrain)?>(훈사<?=$targetDefenceTrain?>)</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<option value=999 <?=$me->getVar('defence_train')==999?"selected":""; ?>><?=formatDefenceTrain(999)?>[훈련, 사기 -3]</option>
|
||||||
|
</select>
|
||||||
】<br><br>
|
】<br><br>
|
||||||
<input type=<?=$submit?> name=btn style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px; value=설정저장><br>
|
<input type=<?=$submit?> id='set_my_setting' name=btn style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px; value=설정저장><br>
|
||||||
∞<font color=orange>설정저장은 이달중 <?=$myset?>회 남았습니다.</font><br><br>
|
∞<span style='color:orange'>설정저장은 이달중 <?=$myset?>회 남았습니다.</span><br><br>
|
||||||
</form>
|
|
||||||
<?php if(!($gameStor->autorun_user['limit_minutes']??false)): ?>
|
<?php if(!($gameStor->autorun_user['limit_minutes']??false)): ?>
|
||||||
휴 가 신 청<br>
|
휴 가 신 청<br>
|
||||||
<a href="c_vacation.php"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button></a><br><br>
|
<button type="button" id='vacation' style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button><br><br>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<!--빙의 해제용 삭턴 조절<br>
|
<!--빙의 해제용 삭턴 조절<br>
|
||||||
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>-->
|
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>-->
|
||||||
|
|
||||||
<?php if($showDieImmediatelyBtn): ?>
|
<?php if($showDieImmediatelyBtn): ?>
|
||||||
가오픈 기간 내 장수 삭제<br>
|
가오픈 기간 내 장수 삭제 (<?=substr($targetTime, 0, 19)?> 부터)<br>
|
||||||
<a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>장수 삭제</button></a><br><br>
|
<a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>장수 삭제</button></a><br><br>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ if ($currentNationPolicy['reqHumanWarUrgentGold'] ?? 0) {
|
|||||||
$autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold'];
|
$autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold'];
|
||||||
}
|
}
|
||||||
$autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true));
|
$autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true));
|
||||||
|
$zeroPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], null, null, $nation, $gameStor->getAll(true));
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
@@ -117,7 +118,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
|
|||||||
'긴급내정': '전쟁중에 민심이 70 미만이거나,<br>인구가 제자리 징병이 가능하지 않을 정도로 적을 경우,<br>일정확률로 주민선정과 정착장려를 수행합니다.<br><br>통솔이 높을 수록 수행할 확률이 높습니다.',
|
'긴급내정': '전쟁중에 민심이 70 미만이거나,<br>인구가 제자리 징병이 가능하지 않을 정도로 적을 경우,<br>일정확률로 주민선정과 정착장려를 수행합니다.<br><br>통솔이 높을 수록 수행할 확률이 높습니다.',
|
||||||
'전투준비': '충분한 병력을 가지고 있지만 훈련과 사기가 부족한 경우 훈련과 사기진작을 수행합니다.',
|
'전투준비': '충분한 병력을 가지고 있지만 훈련과 사기가 부족한 경우 훈련과 사기진작을 수행합니다.',
|
||||||
'전방워프': '전투장이 충분한 병력을 가지고 있다면 전방으로 이동합니다.',
|
'전방워프': '전투장이 충분한 병력을 가지고 있다면 전방으로 이동합니다.',
|
||||||
'NPC헌납': '국고가 부족한데 NPC장수가 충분한 금쌀을 가지고 있다면 일부를 헌납합니다. <br>NPC내정장은 국고가 넉넉하더라도 충분한 금쌀을 가지고 있다면 일부를 헌납합니다.',
|
'NPC헌납': '국고가 부족한데 NPC전쟁장이 충분한 금쌀(권장량 대비 1.5배)을 가지고 있다면 일부를 헌납합니다. <br>NPC내정장은 국고가 넉넉하더라도 충분한 금쌀을 가지고 있다면 권장량만 유지하고 헌납합니다.',
|
||||||
'징병': '전쟁 중 병력을 소진하였다면 재 징병합니다.<br><br>기존에 사용한 병종군 중에서 사용가능한 병종을 랜덤하게 선택합니다.<br>고급 병종을 선택할 확률이 조금 더 높습니다.<br><br>NPC의 경우 도시의 인구가 충분하지 않다면 징병을 할 확률이 감소합니다.<br><br>유저장은 최대한 고급병종을 유지하며,<br>유저장 모병이 허용되는 경우 모병을 3회할 수 있다면 모병합니다.',
|
'징병': '전쟁 중 병력을 소진하였다면 재 징병합니다.<br><br>기존에 사용한 병종군 중에서 사용가능한 병종을 랜덤하게 선택합니다.<br>고급 병종을 선택할 확률이 조금 더 높습니다.<br><br>NPC의 경우 도시의 인구가 충분하지 않다면 징병을 할 확률이 감소합니다.<br><br>유저장은 최대한 고급병종을 유지하며,<br>유저장 모병이 허용되는 경우 모병을 3회할 수 있다면 모병합니다.',
|
||||||
'후방워프': '전쟁 중 병력을 소진하였는데 도시의 인구가 충분하지 않다면,<br>인구가 많은 도시로 이동합니다.',
|
'후방워프': '전쟁 중 병력을 소진하였는데 도시의 인구가 충분하지 않다면,<br>인구가 많은 도시로 이동합니다.',
|
||||||
'전쟁내정': '전쟁 중 수행하는 내정입니다.<br>정착장려, 기술연구의 확률이 좀 더 높고,<br>치안강화, 농지개간, 상업투자의 확률이 낮습니다.<br><br>내정이 가능하다 하더라도 전시임을 고려해,<br>30% 확률로 다른 턴을 수행합니다.',
|
'전쟁내정': '전쟁 중 수행하는 내정입니다.<br>정착장려, 기술연구의 확률이 좀 더 높고,<br>치안강화, 농지개간, 상업투자의 확률이 낮습니다.<br><br>내정이 가능하다 하더라도 전시임을 고려해,<br>30% 확률로 다른 턴을 수행합니다.',
|
||||||
@@ -184,7 +185,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
|
|||||||
</div>
|
</div>
|
||||||
<div style='text-align:right;'><small class="form-text text-muted">
|
<div style='text-align:right;'><small class="form-text text-muted">
|
||||||
유저장긴급포상시 이보다 금이 적은 장수에게 포상합니다.<br>
|
유저장긴급포상시 이보다 금이 적은 장수에게 포상합니다.<br>
|
||||||
0이면 보병 6회 징병(<?= number_format(GameConst::$defaultStatMax * 100) ?> * 6) 가능한 금을 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarUrgentGold) ?>입니다.</small></div>
|
0이면 보병 6회 징병(<?= number_format(GameConst::$defaultStatMax * 100) ?> * 6) 가능한 금을 기준으로 하며, 그 수치는 현재 <?= number_format($zeroPolicy->reqHumanWarUrgentGold) ?>입니다.</small></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -193,7 +194,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
|
|||||||
<input type="number" class="form-control" data-type="integer" id="reqHumanWarUrgentRice" min="0" value="0">
|
<input type="number" class="form-control" data-type="integer" id="reqHumanWarUrgentRice" min="0" value="0">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style='text-align:right;'><small class="form-text text-muted">유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br>0이면 기본 병종으로 <?= number_format(GameConst::$defaultStatMax * 100 * 6) ?>명 사살 가능한 쌀을 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarUrgentRice) ?>입니다.</small></div>
|
<div style='text-align:right;'><small class="form-text text-muted">유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br>0이면 기본 병종으로 <?= number_format(GameConst::$defaultStatMax * 100 * 6) ?>명 사살 가능한 쌀을 기준으로 하며, 그 수치는 현재 <?= number_format($zeroPolicy->reqHumanWarUrgentRice) ?>입니다.</small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
@@ -205,7 +206,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 금입니다. 이보다 적으면 포상합니다. <br>
|
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 금입니다. 이보다 적으면 포상합니다. <br>
|
||||||
0이면 유저전투장 긴급포상 금의 3배를 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandGold) ?>입니다.</small></div>
|
0이면 유저전투장 긴급포상 금의 2배를 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandGold) ?>입니다.</small></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -215,7 +216,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 쌀입니다. 이보다 적으면 포상합니다. <br>
|
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 쌀입니다. 이보다 적으면 포상합니다. <br>
|
||||||
0이면 유저전투장 긴급포상 쌀의 3배를 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandRice) ?>입니다.</small></div>
|
0이면 유저전투장 긴급포상 쌀의 2배를 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandRice) ?>입니다.</small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ $cssList = $commandObj->getCSSFiles();
|
|||||||
<meta name="viewport" content="width=1024" />
|
<meta name="viewport" content="width=1024" />
|
||||||
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
|
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
|
||||||
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
|
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
|
||||||
|
<?=WebUtil::printJS('../e_lib/select2/select2.full.min.js')?>
|
||||||
<?=WebUtil::printJS('../d_shared/common_path.js')?>
|
<?=WebUtil::printJS('../d_shared/common_path.js')?>
|
||||||
<?=WebUtil::printJS('js/common.js')?>
|
<?=WebUtil::printJS('js/common.js')?>
|
||||||
<?=WebUtil::printJS('d_shared/base_map.js')?>
|
<?=WebUtil::printJS('d_shared/base_map.js')?>
|
||||||
@@ -95,10 +96,13 @@ foreach($jsList as $js){
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
||||||
|
<?=WebUtil::printCSS('../e_lib/select2/select2.min.css')?>
|
||||||
|
<?=WebUtil::printCSS('../e_lib/select2/select2-bootstrap4.css')?>
|
||||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||||
<?=WebUtil::printCSS('css/common.css')?>
|
<?=WebUtil::printCSS('css/common.css')?>
|
||||||
<?=WebUtil::printCSS('css/main.css')?>
|
<?=WebUtil::printCSS('css/main.css')?>
|
||||||
<?=WebUtil::printCSS('css/map.css')?>
|
<?=WebUtil::printCSS('css/map.css')?>
|
||||||
|
<?=WebUtil::printCSS('css/processing.css')?>
|
||||||
<?php
|
<?php
|
||||||
foreach($cssList as $css){
|
foreach($cssList as $css){
|
||||||
print(WebUtil::printCSS($css));
|
print(WebUtil::printCSS($css));
|
||||||
|
|||||||
@@ -8,7 +8,34 @@ $session = Session::requireLogin()->setReadOnly();
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$startYear = $gameStor->getValue('startyear');
|
$gameStor->cacheValues(['startyear', 'year']);
|
||||||
|
$startYear = $gameStor->startyear;
|
||||||
|
$year = $gameStor->year;
|
||||||
|
|
||||||
|
$me = $db->queryFirstRow('SELECT no, nation, city FROM general WHERE owner =%i', Session::getUserID());
|
||||||
|
|
||||||
|
if($me){
|
||||||
|
$generalID = $me['no'];
|
||||||
|
$nationID = $me['nation'];
|
||||||
|
$city = $db->queryFirstRow('SELECT city, level, def, wall FROM city WHERE city = %i', $me['city']);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$generalID = 0;
|
||||||
|
$nationID = 0;
|
||||||
|
$city = [
|
||||||
|
'city'=>0,
|
||||||
|
'level'=>5,
|
||||||
|
'def'=>1000,
|
||||||
|
'wall'=>1000,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if($nationID){
|
||||||
|
$nation = $db->queryFirstRow('SELECT level, type, tech, capital FROM nation WHERE nation = %i', $nationID);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$nation = null;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@@ -30,6 +57,8 @@ $startYear = $gameStor->getValue('startyear');
|
|||||||
<?=WebUtil::printJS('js/common.js')?>
|
<?=WebUtil::printJS('js/common.js')?>
|
||||||
<script>
|
<script>
|
||||||
var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
||||||
|
var city = <?=Json::encode($city)?>;
|
||||||
|
var nation = <?=Json::encode($nation)?>;
|
||||||
</script>
|
</script>
|
||||||
<?=WebUtil::printJS('js/battle_simulator.js')?>
|
<?=WebUtil::printJS('js/battle_simulator.js')?>
|
||||||
</head>
|
</head>
|
||||||
@@ -47,7 +76,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<span class="input-group-text">년 시작</span>
|
<span class="input-group-text">년 시작</span>
|
||||||
</div>
|
</div>
|
||||||
<input type="number" class="form-control" id="year" value="<?=$startYear+3?>" min="<?=$startYear?>">
|
<input type="number" class="form-control" id="year" value="<?=$year?>" min="<?=$startYear?>">
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<span class="input-group-text">년</span>
|
<span class="input-group-text">년</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -131,7 +160,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
|
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
|
||||||
</label>
|
</label>
|
||||||
<label class="btn btn-secondary active">
|
<label class="btn btn-secondary active">
|
||||||
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="2" autocomplete="off" checked>N
|
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="0" autocomplete="off">N
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -145,6 +174,9 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
|
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
|
||||||
<div class="float-sm-right btn-toolbar" role="toolbar">
|
<div class="float-sm-right btn-toolbar" role="toolbar">
|
||||||
|
<div class="btn-group btn-group-sm mr-2" role="group">
|
||||||
|
<button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
|
||||||
|
</div>
|
||||||
<div class="btn-group btn-group-sm mr-2" role="group">
|
<div class="btn-group btn-group-sm mr-2" role="group">
|
||||||
<button type="button" class="btn btn-info btn-general-save">저장</button>
|
<button type="button" class="btn btn-info btn-general-save">저장</button>
|
||||||
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
|
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
|
||||||
@@ -203,7 +235,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
|
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
|
||||||
</label>
|
</label>
|
||||||
<label class="btn btn-secondary active">
|
<label class="btn btn-secondary active">
|
||||||
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off" checked>N
|
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off">N
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -236,6 +268,9 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
|
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
|
||||||
<div class="float-sm-right btn-toolbar" role="toolbar">
|
<div class="float-sm-right btn-toolbar" role="toolbar">
|
||||||
|
<div class="btn-group btn-group-sm mr-2" role="group">
|
||||||
|
<button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
|
||||||
|
</div>
|
||||||
<div class="btn-group btn-group-sm mr-2" role="group">
|
<div class="btn-group btn-group-sm mr-2" role="group">
|
||||||
<button type="button" class="btn btn-info btn-general-save">저장</button>
|
<button type="button" class="btn btn-info btn-general-save">저장</button>
|
||||||
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
|
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
|
||||||
@@ -404,7 +439,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group mb-1">
|
<div class="input-group mb-3">
|
||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text">귀병숙련</span>
|
<span class="input-group-text">귀병숙련</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -425,11 +460,27 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
<span class="input-group-text">수비여부</span>
|
<span class="input-group-text">수비여부</span>
|
||||||
</div>
|
</div>
|
||||||
<select class="custom-select form_defence_train only_defender">
|
<select class="custom-select form_defence_train only_defender">
|
||||||
|
<option value="90">훈사 90</option>
|
||||||
<option value="80">훈사 80</option>
|
<option value="80">훈사 80</option>
|
||||||
<option value="60">훈사 60</option>
|
<option value="60">훈사 60</option>
|
||||||
|
<option value="40">훈사 40</option>
|
||||||
<option value="999">안함</option>
|
<option value="999">안함</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="input-group mb-1">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text">전투 수</span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control form_warnum" value="0" step="1">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text">승리 수</span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control form_killnum" value="0" step="1">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text">사살 수</span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control form_killcrew" value="0" step="1">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -477,5 +528,25 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="importModal" class="modal" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">장수 목록</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<select id="modalSelector"></select>
|
||||||
|
<p>타국 장수를 선택한 경우 숙련과 아이템은 0으로 초기화됩니다.</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary" id='importFromDB'>가져오기</button>
|
||||||
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">닫기</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -49,6 +49,7 @@ if($btn == '참가') {
|
|||||||
$general['gold'] -= $admin['develcost'];
|
$general['gold'] -= $admin['develcost'];
|
||||||
|
|
||||||
$freeSlot = [
|
$freeSlot = [
|
||||||
|
0=>8,
|
||||||
1=>8,
|
1=>8,
|
||||||
2=>8,
|
2=>8,
|
||||||
3=>8,
|
3=>8,
|
||||||
@@ -56,7 +57,6 @@ if($btn == '참가') {
|
|||||||
5=>8,
|
5=>8,
|
||||||
6=>8,
|
6=>8,
|
||||||
7=>8,
|
7=>8,
|
||||||
8=>8,
|
|
||||||
];
|
];
|
||||||
foreach($db->query('SELECT count(*) as cnt, grp FROM tournament WHERE grp < 10 GROUP BY grp') as $grpInfo){
|
foreach($db->query('SELECT count(*) as cnt, grp FROM tournament WHERE grp < 10 GROUP BY grp') as $grpInfo){
|
||||||
if($grpInfo['cnt'] == 8){
|
if($grpInfo['cnt'] == 8){
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#amount {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#colorType {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-padding .select2-results__option {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
+35
-3
@@ -185,7 +185,8 @@ function myNationInfo(General $generalObj)
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['startyear', 'year']);
|
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
|
||||||
|
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||||
|
|
||||||
$nationID = $generalObj->getNationID();
|
$nationID = $generalObj->getNationID();
|
||||||
$nation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $nationID)??getNationStaticInfo(0);
|
$nation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $nationID)??getNationStaticInfo(0);
|
||||||
@@ -200,6 +201,17 @@ function myNationInfo(General $generalObj)
|
|||||||
$level12Name = key_exists(12, $topChiefs)?getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']):'-';
|
$level12Name = key_exists(12, $topChiefs)?getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']):'-';
|
||||||
$level11Name = key_exists(11, $topChiefs)?getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']):'-';
|
$level11Name = key_exists(11, $topChiefs)?getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']):'-';
|
||||||
|
|
||||||
|
$impossibleStrategicCommandLists = [];
|
||||||
|
$strategicCommandLists = GameConst::$availableChiefCommand['전략'];
|
||||||
|
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
|
||||||
|
foreach($strategicCommandLists as $command){
|
||||||
|
$cmd = buildNationCommandClass($command, $generalObj, $admin, new LastTurn());
|
||||||
|
$nextAvailableTurn = $cmd->getNextAvailableTurn();
|
||||||
|
if($nextAvailableTurn > $yearMonth){
|
||||||
|
$impossibleStrategicCommandLists[] = [$cmd->getName(), $nextAvailableTurn - $yearMonth];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
echo "<table width=498 class='tb_layout bg2 nation_info'>
|
echo "<table width=498 class='tb_layout bg2 nation_info'>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan=4 ";
|
<td colspan=4 ";
|
||||||
@@ -282,10 +294,23 @@ function myNationInfo(General $generalObj)
|
|||||||
} else {
|
} else {
|
||||||
if ($nation['strategic_cmd_limit'] != 0) {
|
if ($nation['strategic_cmd_limit'] != 0) {
|
||||||
$nation['strategic_cmd_limit'] = "<font color=red>{$nation['strategic_cmd_limit']}턴</font>";
|
$nation['strategic_cmd_limit'] = "<font color=red>{$nation['strategic_cmd_limit']}턴</font>";
|
||||||
} else {
|
} else if($impossibleStrategicCommandLists) {
|
||||||
|
$nation['strategic_cmd_limit'] = "<font color=yellow>가 능</font>";
|
||||||
|
} else{
|
||||||
$nation['strategic_cmd_limit'] = "<font color=limegreen>가 능</font>";
|
$nation['strategic_cmd_limit'] = "<font color=limegreen>가 능</font>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($impossibleStrategicCommandLists){
|
||||||
|
$text = [];
|
||||||
|
foreach($impossibleStrategicCommandLists as [$cmdName, $remainTurn]){
|
||||||
|
$text[] = "{$cmdName}: {$remainTurn}턴 뒤";
|
||||||
|
}
|
||||||
|
$nation['strategic_cmd_limit'] = $templates->render('tooltip', [
|
||||||
|
'text'=>'<span style="text-decoration:underline dashed;">'.$nation['strategic_cmd_limit'].'</span>',
|
||||||
|
'info'=>'<span class="text-left d-inline-block">'.join('<br>', $text).'</span>',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
if ($nation['surlimit'] != 0) {
|
if ($nation['surlimit'] != 0) {
|
||||||
$nation['surlimit'] = "<font color=red>{$nation['surlimit']}턴</font>";
|
$nation['surlimit'] = "<font color=red>{$nation['surlimit']}턴</font>";
|
||||||
} else {
|
} else {
|
||||||
@@ -1241,7 +1266,7 @@ function addAge()
|
|||||||
$generalID = $general['no'];
|
$generalID = $general['no'];
|
||||||
$special = SpecialityHelper::pickSpecialDomestic(
|
$special = SpecialityHelper::pickSpecialDomestic(
|
||||||
$general,
|
$general,
|
||||||
(Json::decode($general['aux'])['prev_types_special2'])??[]
|
(Json::decode($general['aux'])['prev_types_special'])??[]
|
||||||
);
|
);
|
||||||
$specialClass = buildGeneralSpecialDomesticClass($special);
|
$specialClass = buildGeneralSpecialDomesticClass($special);
|
||||||
$specialText = $specialClass->getName();
|
$specialText = $specialClass->getName();
|
||||||
@@ -1336,8 +1361,11 @@ function CheckHall($no)
|
|||||||
["warnum", 'rank'],
|
["warnum", 'rank'],
|
||||||
["killnum", 'rank'],
|
["killnum", 'rank'],
|
||||||
["winrate", 'calc'],
|
["winrate", 'calc'],
|
||||||
|
["occupied", 'rank'],
|
||||||
["killcrew", 'rank'],
|
["killcrew", 'rank'],
|
||||||
["killrate", 'calc'],
|
["killrate", 'calc'],
|
||||||
|
["killcrew_person", 'rank'],
|
||||||
|
["killrate_person", 'calc'],
|
||||||
["dex1", 'natural'],
|
["dex1", 'natural'],
|
||||||
["dex2", 'natural'],
|
["dex2", 'natural'],
|
||||||
["dex3", 'natural'],
|
["dex3", 'natural'],
|
||||||
@@ -1380,6 +1408,9 @@ function CheckHall($no)
|
|||||||
$kill = $generalObj->getRankVar('killcrew');
|
$kill = $generalObj->getRankVar('killcrew');
|
||||||
$death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1);
|
$death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1);
|
||||||
|
|
||||||
|
$killPerson = $generalObj->getRankVar('killcrew_person');
|
||||||
|
$deathPerson = Util::valueFit($generalObj->getRankVar('deathcrew_person'), 1);
|
||||||
|
|
||||||
$tt = Util::valueFit($ttw + $ttd + $ttl, 1);
|
$tt = Util::valueFit($ttw + $ttd + $ttl, 1);
|
||||||
$tl = Util::valueFit($tlw + $tld + $tll, 1);
|
$tl = Util::valueFit($tlw + $tld + $tll, 1);
|
||||||
$ts = Util::valueFit($tsw + $tsd + $tsl, 1);
|
$ts = Util::valueFit($tsw + $tsd + $tsl, 1);
|
||||||
@@ -1393,6 +1424,7 @@ function CheckHall($no)
|
|||||||
$calcVar['betrate'] = $betWinGold / $betGold;
|
$calcVar['betrate'] = $betWinGold / $betGold;
|
||||||
$calcVar['winrate'] = $win / $war;
|
$calcVar['winrate'] = $win / $war;
|
||||||
$calcVar['killrate'] = $kill / $death;
|
$calcVar['killrate'] = $kill / $death;
|
||||||
|
$calcVar['killrate_person'] = $killPerson / $deathPerson;
|
||||||
|
|
||||||
if ($generalObj instanceof DummyGeneral) {
|
if ($generalObj instanceof DummyGeneral) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ function checkCommandArg(?array $arg):?string{
|
|||||||
}
|
}
|
||||||
$defaultCheck = [
|
$defaultCheck = [
|
||||||
/*'string'=>[
|
/*'string'=>[
|
||||||
'nationName', 'optionText', 'itemType', 'nationType'
|
'nationName', 'optionText', 'itemType', 'nationType', 'commandType',
|
||||||
],*/
|
],*/
|
||||||
'integer'=>[
|
'integer'=>[
|
||||||
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
|
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
|
||||||
@@ -284,14 +284,14 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
|
|||||||
$turnList[$turnIdx] = true;
|
$turnList[$turnIdx] = true;
|
||||||
}
|
}
|
||||||
else if($turnIdx == -1){
|
else if($turnIdx == -1){
|
||||||
//홀수
|
//홀수, 0부터 맞다.
|
||||||
foreach(Util::range(1, GameConst::$maxTurn, 2) as $subIdx){
|
foreach(Util::range(0, GameConst::$maxTurn, 2) as $subIdx){
|
||||||
$turnList[$subIdx] = true;
|
$turnList[$subIdx] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if($turnIdx == -2){
|
else if($turnIdx == -2){
|
||||||
//짝수
|
//짝수, 1부터 맞다.
|
||||||
foreach(Util::range(0, GameConst::$maxTurn, 2) as $subIdx){
|
foreach(Util::range(1, GameConst::$maxTurn, 2) as $subIdx){
|
||||||
$turnList[$subIdx] = true;
|
$turnList[$subIdx] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -516,6 +516,7 @@ function checkWander()
|
|||||||
$logger = $wanderer->getLogger();
|
$logger = $wanderer->getLogger();
|
||||||
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
|
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
|
||||||
$wanderCmd->run();
|
$wanderCmd->run();
|
||||||
|
$wanderCmd->setNextAvailable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,7 +566,9 @@ function updateNationState()
|
|||||||
$nation['level'] = $nationlevel;
|
$nation['level'] = $nationlevel;
|
||||||
|
|
||||||
$updateVals = [
|
$updateVals = [
|
||||||
'level' => $nationlevel
|
'level' => $nationlevel,
|
||||||
|
'gold'=>$db->sqleval('gold + %i', $nationlevel*1000),
|
||||||
|
'rice'=>$db->sqleval('rice + %i', $nationlevel*1000),
|
||||||
];
|
];
|
||||||
|
|
||||||
switch ($nationlevel) {
|
switch ($nationlevel) {
|
||||||
@@ -708,7 +711,8 @@ function updateNationState()
|
|||||||
'troop' => $npcID
|
'troop' => $npcID
|
||||||
], 'no=%i', $npcID);
|
], 'no=%i', $npcID);
|
||||||
|
|
||||||
//TODO: 5턴간 집합턴 입력
|
$cmd = buildGeneralCommandClass('che_집합', General::createGeneralObjFromDB($npcID), $admin);
|
||||||
|
_setGeneralCommand($cmd, iterator_to_array(Util::range(GameConst::$maxTurn)));
|
||||||
$assemblerCnt += 1;
|
$assemblerCnt += 1;
|
||||||
$gameStor->assembler_id = $lastAssemblerID;
|
$gameStor->assembler_id = $lastAssemblerID;
|
||||||
}
|
}
|
||||||
@@ -1008,7 +1012,7 @@ function checkEmperior()
|
|||||||
$tigers = $db->query(
|
$tigers = $db->query(
|
||||||
'SELECT value, name
|
'SELECT value, name
|
||||||
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
|
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
|
||||||
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
|
WHERE rank_data.nation_id = %i AND rank_data.type = "killnum" AND value > 0 ORDER BY value DESC LIMIT 5',
|
||||||
$nationID
|
$nationID
|
||||||
); // 오호장군
|
); // 오호장군
|
||||||
|
|
||||||
@@ -1037,7 +1041,6 @@ function checkEmperior()
|
|||||||
}
|
}
|
||||||
|
|
||||||
$gen = join(', ', array_column($rawGeneral, 'name'));
|
$gen = join(', ', array_column($rawGeneral, 'name'));
|
||||||
$nation['type'] = getNationType($nation['type']);
|
|
||||||
|
|
||||||
$stat = $db->queryFirstRow('SELECT max(nation_count) as nc, max(gen_count) as gc FROM statistic');
|
$stat = $db->queryFirstRow('SELECT max(nation_count) as nc, max(gen_count) as gc FROM statistic');
|
||||||
$genCnt = $db->queryFirstField('SELECT count(*) FROM general');
|
$genCnt = $db->queryFirstField('SELECT count(*) FROM general');
|
||||||
|
|||||||
+20
-4
@@ -39,10 +39,26 @@ function bar($per, $h=7) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function optionsForCities() {
|
function optionsForCities(callable $infoCall=null) {
|
||||||
return join('', array_map(function($city){
|
|
||||||
return "<option value='{$city->id}'>{$city->name}</option>";
|
if(!$infoCall){
|
||||||
}, CityConst::all()));
|
return join('', array_map(function($city){
|
||||||
|
return "<option value='{$city->id}'>{$city->name}</option>";
|
||||||
|
}, CityConst::all()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$infoList = [];
|
||||||
|
$noInfoList = [];
|
||||||
|
foreach(CityConst::all() as $city){
|
||||||
|
$info = $infoCall($city);
|
||||||
|
if(!$info){
|
||||||
|
$noInfoList[] = "<option value='{$city->id}'>{$city->name}</option>";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$infoList[] = "<option value='{$city->id}'>{$city->name} ({$info})</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
return join('', array_merge($infoList, $noInfoList));
|
||||||
}
|
}
|
||||||
|
|
||||||
function Submit($url, $msg="", $msg2="") {
|
function Submit($url, $msg="", $msg2="") {
|
||||||
|
|||||||
@@ -217,10 +217,14 @@ function formatDefenceTrain(int $value): string
|
|||||||
{
|
{
|
||||||
if ($value === 999) {
|
if ($value === 999) {
|
||||||
return "×";
|
return "×";
|
||||||
|
} else if ($value >= 90){
|
||||||
|
return "☆";
|
||||||
} else if ($value >= 80) {
|
} else if ($value >= 80) {
|
||||||
return "◎";
|
return "◎";
|
||||||
} else {
|
} else if ($value >= 60) {
|
||||||
return "○";
|
return "○";
|
||||||
|
} else{
|
||||||
|
return "△";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-17
@@ -78,6 +78,7 @@ function processGoldIncome() {
|
|||||||
// 실지급률
|
// 실지급률
|
||||||
$ratio = $realoutcome / $originoutcome;
|
$ratio = $realoutcome / $originoutcome;
|
||||||
}
|
}
|
||||||
|
$nation['gold'] = Util::valueFit($nation['gold'], GameConst::$basegold);
|
||||||
$adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ")
|
$adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ")
|
||||||
." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ")
|
." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ")
|
||||||
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
|
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
|
||||||
@@ -87,6 +88,8 @@ function processGoldIncome() {
|
|||||||
|
|
||||||
$incomeText = number_format($income);
|
$incomeText = number_format($income);
|
||||||
$incomeLog = "이번 수입은 금 <C>$incomeText</>입니다.";
|
$incomeLog = "이번 수입은 금 <C>$incomeText</>입니다.";
|
||||||
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
|
$nationStor->prev_income_gold = $income;
|
||||||
|
|
||||||
$db->update('nation', [
|
$db->update('nation', [
|
||||||
'gold'=>$nation['gold']
|
'gold'=>$nation['gold']
|
||||||
@@ -353,6 +356,7 @@ function processRiceIncome() {
|
|||||||
// 실지급률
|
// 실지급률
|
||||||
$ratio = $realoutcome / $originoutcome;
|
$ratio = $realoutcome / $originoutcome;
|
||||||
}
|
}
|
||||||
|
$nation['rice'] = Util::valueFit($nation['rice'], GameConst::$baserice);
|
||||||
$adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ")
|
$adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ")
|
||||||
." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ")
|
." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ")
|
||||||
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
|
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
|
||||||
@@ -362,6 +366,8 @@ function processRiceIncome() {
|
|||||||
|
|
||||||
$incomeText = number_format($income);
|
$incomeText = number_format($income);
|
||||||
$incomeLog = "이번 수입은 쌀 <C>$incomeText</>입니다.";
|
$incomeLog = "이번 수입은 쌀 <C>$incomeText</>입니다.";
|
||||||
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
|
$nationStor->prev_income_rice = $income;
|
||||||
|
|
||||||
$db->update('nation', [
|
$db->update('nation', [
|
||||||
'rice'=>$nation['rice']
|
'rice'=>$nation['rice']
|
||||||
@@ -528,36 +534,36 @@ function disaster() {
|
|||||||
$targetCityNames = "<G><b>".join(' ', Util::squeezeFromArray($targetCityList, 'name'))."</b></>";
|
$targetCityNames = "<G><b>".join(' ', Util::squeezeFromArray($targetCityList, 'name'))."</b></>";
|
||||||
$disasterTextList = [
|
$disasterTextList = [
|
||||||
1 => [
|
1 => [
|
||||||
['재난', 4, '역병이 발생하여 도시가 황폐해지고 있습니다.'],
|
['<M><b>【재난】</b></>', 4, '역병이 발생하여 도시가 황폐해지고 있습니다.'],
|
||||||
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
|
['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
|
||||||
['재난', 3, '추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.'],
|
['<M><b>【재난】</b></>', 3, '추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.'],
|
||||||
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
|
['<M><b>【재난】</b></>', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
|
||||||
],
|
],
|
||||||
4 => [
|
4 => [
|
||||||
['재난', 7, '홍수로 인해 피해가 급증하고 있습니다.'],
|
['<M><b>【재난】</b></>', 7, '홍수로 인해 피해가 급증하고 있습니다.'],
|
||||||
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
|
['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
|
||||||
['재난', 6, '태풍으로 인해 피해가 속출하고 있습니다.'],
|
['<M><b>【재난】</b></>', 6, '태풍으로 인해 피해가 속출하고 있습니다.'],
|
||||||
],
|
],
|
||||||
7 => [
|
7 => [
|
||||||
['재난', 8, '메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.'],
|
['<M><b>【재난】</b></>', 8, '메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.'],
|
||||||
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
|
['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
|
||||||
['재난', 8, '흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.'],
|
['<M><b>【재난】</b></>', 8, '흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.'],
|
||||||
],
|
],
|
||||||
10 => [
|
10 => [
|
||||||
['재난', 3, '혹한으로 도시가 황폐해지고 있습니다.'],
|
['<M><b>【재난】</b></>', 3, '혹한으로 도시가 황폐해지고 있습니다.'],
|
||||||
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
|
['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
|
||||||
['재난', 3, '눈이 많이 쌓여 도시가 황폐해지고 있습니다.'],
|
['<M><b>【재난】</b></>', 3, '눈이 많이 쌓여 도시가 황폐해지고 있습니다.'],
|
||||||
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
|
['<M><b>【재난】</b></>', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
$boomingTextList = [
|
$boomingTextList = [
|
||||||
1 => null,
|
1 => null,
|
||||||
4 => [
|
4 => [
|
||||||
['호황', 2, '호황으로 도시가 번창하고 있습니다.'],
|
['<C><b>【호황】</b></>', 2, '호황으로 도시가 번창하고 있습니다.'],
|
||||||
],
|
],
|
||||||
7 => [
|
7 => [
|
||||||
['풍작', 1, '풍작으로 도시가 번창하고 있습니다.'],
|
['<C><b>【풍작】</b></>', 1, '풍작으로 도시가 번창하고 있습니다.'],
|
||||||
],
|
],
|
||||||
10 => null
|
10 => null
|
||||||
];
|
];
|
||||||
@@ -566,7 +572,7 @@ function disaster() {
|
|||||||
|
|
||||||
$logger = new ActionLogger(0, 0, $year, $month, false);
|
$logger = new ActionLogger(0, 0, $year, $month, false);
|
||||||
|
|
||||||
$logger->pushGlobalHistoryLog("<M><b>【{$logTitle}】</b></>{$targetCityNames}에 {$logBody}");
|
$logger->pushGlobalHistoryLog("{$logTitle}{$targetCityNames}에 {$logBody}");
|
||||||
$logger->flush();
|
$logger->flush();
|
||||||
|
|
||||||
if (!$isGood) {
|
if (!$isGood) {
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ function selection($tnmt_type, $tnmt, $phase) {
|
|||||||
if($phase < 31) {
|
if($phase < 31) {
|
||||||
$gameStor->phase+=1;
|
$gameStor->phase+=1;
|
||||||
} else {
|
} else {
|
||||||
$gameStor->tournamemt = 4;
|
$gameStor->tournament = 4;
|
||||||
$gameStor->phase=0;
|
$gameStor->phase=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -61,7 +61,7 @@ $scenario = $gameStor->scenario_text;
|
|||||||
$nationID = $generalObj->getNationID();
|
$nationID = $generalObj->getNationID();
|
||||||
if($nationID){
|
if($nationID){
|
||||||
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
$nationStor->cacheValues(['notice', 'online_genenerals']);
|
$nationStor->cacheAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
$valid = 0;
|
$valid = 0;
|
||||||
|
|||||||
+4
-4
@@ -52,7 +52,7 @@ else if(
|
|||||||
$now->getTimestamp() - $lastTurn->getTimestamp() > $reservedDate->getTimestamp() - $now->getTimestamp()
|
$now->getTimestamp() - $lastTurn->getTimestamp() > $reservedDate->getTimestamp() - $now->getTimestamp()
|
||||||
){
|
){
|
||||||
//정지 상태 & 중간 넘음
|
//정지 상태 & 중간 넘음
|
||||||
AppConf::getList()[DB::prefix()]->closeServer();
|
ServConfig::getServerList()[DB::prefix()]->closeServer();
|
||||||
$status = 'closed';
|
$status = 'closed';
|
||||||
}
|
}
|
||||||
else if(
|
else if(
|
||||||
@@ -60,12 +60,12 @@ else if(
|
|||||||
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
|
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
|
||||||
){
|
){
|
||||||
//천통 & 비정지 상태 & 2/3 넘음
|
//천통 & 비정지 상태 & 2/3 넘음
|
||||||
AppConf::getList()[DB::prefix()]->closeServer();
|
ServConfig::getServerList()[DB::prefix()]->closeServer();
|
||||||
$status = 'closed';
|
$status = 'closed';
|
||||||
}
|
}
|
||||||
else if($reservedDate->getTimestamp() - $now->getTimestamp() <= 60*10){
|
else if($reservedDate->getTimestamp() - $now->getTimestamp() <= 60*10){
|
||||||
//어쨌든 간에 10분 남았다면.
|
//어쨌든 간에 10분 남았다면.
|
||||||
AppConf::getList()[DB::prefix()]->closeServer();
|
ServConfig::getServerList()[DB::prefix()]->closeServer();
|
||||||
$status = 'closed';
|
$status = 'closed';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +96,6 @@ $result = ResetHelper::buildScenario(
|
|||||||
$result['affected']=1;
|
$result['affected']=1;
|
||||||
|
|
||||||
$prefix = DB::prefix();
|
$prefix = DB::prefix();
|
||||||
AppConf::getList()[$prefix]->openServer();
|
ServConfig::getServerList()[$prefix]->openServer();
|
||||||
|
|
||||||
Json::die($result);
|
Json::die($result);
|
||||||
@@ -4,6 +4,9 @@ namespace sammo;
|
|||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
|
|
||||||
|
WebUtil::requireAJAX();
|
||||||
|
|
||||||
$availableDieImmediately = false;
|
$availableDieImmediately = false;
|
||||||
|
|
||||||
//로그인 검사
|
//로그인 검사
|
||||||
@@ -16,25 +19,31 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
$general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
|
$general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
|
||||||
|
|
||||||
if(!$general){
|
if(!$general){
|
||||||
header('location:b_myPage.php');
|
Json::die([
|
||||||
die();
|
'result'=>false,
|
||||||
|
'reason'=>'장수가 없습니다.'
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
increaseRefresh("장수 삭제", 1);
|
increaseRefresh("장수 삭제", 1);
|
||||||
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
||||||
|
|
||||||
if($gameStor->turntime <= $gameStor->opentime){
|
if($gameStor->turntime > $gameStor->opentime){
|
||||||
//서버 가오픈시 할 수 있는 행동
|
Json::die([
|
||||||
if(addTurn($general['lastrefresh'], $gameStor->turnterm, 2) <= TimeUtil::now()){
|
'result'=>false,
|
||||||
$availableDieImmediately = true;
|
'reason'=>'이미 서버가 시작되었습니다.'
|
||||||
}
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$availableDieImmediately){
|
|
||||||
header('location:b_myPage.php');
|
|
||||||
die();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, 2);
|
||||||
|
if($targetTime > TimeUtil::now()){
|
||||||
|
$targetTimeShort = substr($targetTime, 0, 19);
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>"아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$generalObj = General::createGeneralObjFromDB($general['no']);
|
$generalObj = General::createGeneralObjFromDB($general['no']);
|
||||||
@@ -46,4 +55,7 @@ $josaYi = JosaUtil::pick($generalName, '이');
|
|||||||
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
|
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
|
||||||
|
|
||||||
$session->logoutGame();
|
$session->logoutGame();
|
||||||
header('location:..');
|
Json::die([
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success'
|
||||||
|
]);
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
|
||||||
|
WebUtil::requireAJAX();
|
||||||
|
|
||||||
|
$destGeneralID = Util::getPost('destGeneralID', 'int', 0);
|
||||||
|
|
||||||
|
if(!$destGeneralID || $destGeneralID <= 0){
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'올바르지 않은 장수 코드입니다'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$session = Session::requireGameLogin([])->setReadOnly();
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
increaseRefresh("시뮬레이터 추출", 1);
|
||||||
|
|
||||||
|
$userID = Session::getUserID();
|
||||||
|
$me = $db->queryFirstRow('SELECT no,nation from general where owner=%i', $userID);
|
||||||
|
$nationID = $me['nation'];
|
||||||
|
|
||||||
|
$reqColumns = [
|
||||||
|
'nation',
|
||||||
|
'name', 'officer_level', 'explevel', 'injury',
|
||||||
|
'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item',
|
||||||
|
'rice', 'personal', 'special2',
|
||||||
|
'crew', 'crewtype',
|
||||||
|
'atmos', 'train', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'defence_train',
|
||||||
|
];
|
||||||
|
|
||||||
|
$reqRankColumns = [
|
||||||
|
'warnum', 'killnum', 'killcrew'
|
||||||
|
];
|
||||||
|
|
||||||
|
$dummyItems = [
|
||||||
|
'officer_level'=>1,
|
||||||
|
'horse'=>'None',
|
||||||
|
'weapon'=>'None',
|
||||||
|
'book'=>'None',
|
||||||
|
'item'=>'None',
|
||||||
|
'crew'=>0,
|
||||||
|
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
|
||||||
|
'rice'=>10000,
|
||||||
|
'train'=>GameConst::$maxTrainByCommand,
|
||||||
|
'atmos'=>GameConst::$maxTrainByCommand,
|
||||||
|
'dex1'=>0,
|
||||||
|
'dex2'=>0,
|
||||||
|
'dex3'=>0,
|
||||||
|
'dex4'=>0,
|
||||||
|
'dex5'=>0,
|
||||||
|
'defence_train'=>80,
|
||||||
|
'warnum'=>0,
|
||||||
|
'killnum'=>0,
|
||||||
|
'killcrew'=>0,
|
||||||
|
];
|
||||||
|
|
||||||
|
$rawDestGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no=%i', Util::formatListOfBackticks($reqColumns), $destGeneralID);
|
||||||
|
|
||||||
|
if($nationID == 0 || $rawDestGeneral['nation'] != $nationID){
|
||||||
|
foreach($dummyItems as $key=>$val){
|
||||||
|
$rawDestGeneral[$key] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$rawRankValue = $db->queryAllLists('SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', $destGeneralID, $reqRankColumns);
|
||||||
|
foreach($rawRankValue as [$rankType, $rankValue]){
|
||||||
|
$rawDestGeneral[$rankType] = $rankValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey){
|
||||||
|
$dex = $rawDestGeneral[$dexKey];
|
||||||
|
$rawDestGeneral[$dexKey] = getDexLevelList()[getDexLevel($dex)][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
Json::die([
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success',
|
||||||
|
'general'=>$rawDestGeneral,
|
||||||
|
]);
|
||||||
@@ -70,6 +70,13 @@ foreach(
|
|||||||
$nationTurnBrief = [];
|
$nationTurnBrief = [];
|
||||||
foreach($nationTurnList as $officer_level=>$turnBrief){
|
foreach($nationTurnList as $officer_level=>$turnBrief){
|
||||||
if(!key_exists($officer_level, $generals)){
|
if(!key_exists($officer_level, $generals)){
|
||||||
|
$nationTurnBrief[$officer_level] = [
|
||||||
|
'name'=>null,
|
||||||
|
'turnTime'=>null,
|
||||||
|
'officerLevelText'=>getOfficerLevelText($officer_level, $nationLevel),
|
||||||
|
'npcType'=>null,
|
||||||
|
'turn'=>$turnBrief
|
||||||
|
];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$general = $generals[$officer_level];
|
$general = $generals[$officer_level];
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
|
||||||
|
//로그인 검사
|
||||||
|
$session = Session::requireGameLogin([]);
|
||||||
|
$generalID = Session::getGeneralID();
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
$rawList = Util::convertArrayToDict($db->query('SELECT no, name, npc, nation FROM general'), 'no');
|
||||||
|
$nationID = $rawList[$generalID]['nation'];
|
||||||
|
|
||||||
|
|
||||||
|
$result = [
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success',
|
||||||
|
'nationID'=>$nationID,
|
||||||
|
'generalID'=>$generalID,
|
||||||
|
'column'=>['no', 'name', 'npc']
|
||||||
|
];
|
||||||
|
|
||||||
|
$resultItem = [];
|
||||||
|
foreach(Util::arrayGroupBy($rawList, 'nation') as $subNationID=>$generals){
|
||||||
|
$subNation = [];
|
||||||
|
foreach($generals as $general){
|
||||||
|
$subNation[] = [$general['no'], $general['name'], $general['npc']];
|
||||||
|
}
|
||||||
|
$resultItem[$subNationID] = $subNation;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result['list'] = $resultItem;
|
||||||
|
$result['nation'] = Util::convertArrayToDict($db->query('SELECT nation, name, color FROM nation'), 'nation');
|
||||||
|
Json::die($result);
|
||||||
@@ -6,7 +6,7 @@ include "func.php";
|
|||||||
|
|
||||||
|
|
||||||
//로그인 검사
|
//로그인 검사
|
||||||
$session = Session::requireLogin();
|
$session = Session::requireLogin([]);
|
||||||
$userID = Session::getUserID();
|
$userID = Session::getUserID();
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
//통합 세력장수&암행부 viewer
|
//통합 세력장수&암행부 viewer
|
||||||
@@ -11,145 +12,162 @@ $session = Session::requireGameLogin([])->setReadOnly();
|
|||||||
$userID = Session::getUserID();
|
$userID = Session::getUserID();
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$reqType = Util::getPost('req', 'int', 1);
|
$reqType = Util::getReq('req', 'int', 1);
|
||||||
$reqForce = Util::getPost('force', 'bool', false);
|
$reqForce = Util::getReq('force', 'bool', false);
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
increaseRefresh("세력장수", 1);
|
increaseRefresh("세력장수", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow('SELECT con, turntime, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $userID);
|
$me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $userID);
|
||||||
$con = checkLimit($me['con']);
|
$con = checkLimit($me['con']);
|
||||||
if ($con >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result' => false,
|
||||||
'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
|
'reason' => '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$nationID = $me['nation'];
|
$nationID = $me['nation'];
|
||||||
$permission = checkSecretPermission($me, true);
|
$permission = checkSecretPermission($me, true);
|
||||||
if($reqForce && $reqType > $permission){
|
if ($reqForce && $reqType > $permission) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result' => false,
|
||||||
'reason'=>'권한이 부족합니다.'
|
'reason' => '권한이 부족합니다.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$permission = min($reqType, $permission);
|
$permission = min($reqType, $permission);
|
||||||
$nationArr = getNationStaticInfo($nationID);
|
$nationArr = getNationStaticInfo($nationID);
|
||||||
$viewColumns = [
|
$viewColumns = [
|
||||||
'no'=>1,
|
'no' => 0,
|
||||||
'name'=>1,
|
'name' => 0,
|
||||||
'owner_name'=>9,
|
'owner_name' => 9,
|
||||||
'nation'=>1,
|
'nation' => 0,
|
||||||
'city'=>1,
|
'city' => 1,
|
||||||
'officer_level'=>9,
|
'officer_level' => 2,
|
||||||
'npc'=>1,
|
'officer_city' => 2,
|
||||||
'defence_train'=>2,
|
'npc' => 0,
|
||||||
'troop'=>2,
|
'defence_train' => 2,
|
||||||
'injury'=>1,
|
'troop' => 2,
|
||||||
'leadership'=>1,
|
'injury' => 0,
|
||||||
'strength'=>1,
|
'leadership' => 0,
|
||||||
'intel'=>1,
|
'strength' => 0,
|
||||||
'experience'=>1,
|
'intel' => 0,
|
||||||
'explevel'=>1,
|
'experience' => 1,
|
||||||
'dedication'=>1,
|
'explevel' => 0,
|
||||||
'dedlevel'=>1,
|
'dedication' => 1,
|
||||||
'gold'=>1,
|
'dedlevel' => 0,
|
||||||
'rice'=>1,
|
'gold' => 0,
|
||||||
'crewtype'=>2,
|
'rice' => 0,
|
||||||
'crew'=>2,
|
'crewtype' => 2,
|
||||||
'train'=>2,
|
'crew' => 2,
|
||||||
'atmos'=>2,
|
'train' => 2,
|
||||||
'killturn'=>1,
|
'atmos' => 2,
|
||||||
'turntime'=>2,
|
'killturn' => 0,
|
||||||
'picture'=>1,
|
'turntime' => 2,
|
||||||
'imgsvr'=>1,
|
'picture' => 0,
|
||||||
'age'=>1,
|
'imgsvr' => 0,
|
||||||
'special'=>1,
|
'age' => 0,
|
||||||
'special2'=>1,
|
'special' => 0,
|
||||||
'personal'=>1,
|
'special2' => 0,
|
||||||
'horse'=>3,
|
'personal' => 0,
|
||||||
'weapon'=>3,
|
'belong' => 0,
|
||||||
'book'=>3,
|
'horse' => 2,
|
||||||
'item'=>3,
|
'weapon' => 2,
|
||||||
'connect'=>1
|
'book' => 2,
|
||||||
|
'item' => 2,
|
||||||
|
'connect' => 0
|
||||||
];
|
];
|
||||||
|
|
||||||
$customViewColumns = [
|
$customViewColumns = [
|
||||||
'officerLevel'=>1,
|
'officerLevel' => 0,
|
||||||
'officerLevelText'=>1,
|
'officerLevelText' => 0,
|
||||||
'lbonus'=>1,
|
'lbonus' => 0,
|
||||||
'ownerName'=>1,
|
'ownerName' => 0,
|
||||||
'honorText'=>1,
|
'honorText' => 0
|
||||||
'expLevelText'=>1,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function getOfficerLevel($rawGeneral)
|
||||||
|
{
|
||||||
|
global $permission;
|
||||||
|
$level = $rawGeneral['officer_level'];
|
||||||
|
if ($level >= 5) {
|
||||||
|
return $level;
|
||||||
|
}
|
||||||
|
if ($permission > 1) {
|
||||||
|
return $level;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
$specialViewFilter = [
|
$specialViewFilter = [
|
||||||
'officerLevel'=>function($rawGeneral){
|
'officerLevel' => function ($rawGeneral){
|
||||||
return $rawGeneral['officer_level'];
|
return getOfficerLevel($rawGeneral);
|
||||||
},
|
},
|
||||||
'special'=>function($rawGeneral){
|
'special' => function ($rawGeneral) {
|
||||||
return getGeneralSpecialDomesticName($rawGeneral['special']);
|
return getGeneralSpecialDomesticName($rawGeneral['special']);
|
||||||
},
|
},
|
||||||
'special2'=>function($rawGeneral){
|
'special2' => function ($rawGeneral) {
|
||||||
return getGeneralSpecialWarName($rawGeneral['special2']);
|
return getGeneralSpecialWarName($rawGeneral['special2']);
|
||||||
},
|
},
|
||||||
'personal'=>function($rawGeneral){
|
'personal' => function ($rawGeneral) {
|
||||||
return getGenChar($rawGeneral['personal']);
|
return getGenChar($rawGeneral['personal']);
|
||||||
},
|
},
|
||||||
'lbonus'=>function($rawGeneral)use($nationArr){
|
'lbonus' => function ($rawGeneral) use ($nationArr) {
|
||||||
return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']);
|
return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']);
|
||||||
},
|
},
|
||||||
'ownerName'=>function($rawGeneral){
|
'ownerName' => function ($rawGeneral) {
|
||||||
if($rawGeneral['npc']!=1){
|
if ($rawGeneral['npc'] != 1) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return $rawGeneral['owner_name'];
|
return $rawGeneral['owner_name'];
|
||||||
},
|
},
|
||||||
'officerLevelText'=>function($rawGeneral)use($nationArr){
|
'officerLevelText' => function ($rawGeneral) use ($nationArr) {
|
||||||
return getOfficerLevelText($rawGeneral['officer_level'], $nationArr['level']);
|
$level = getOfficerLevel($rawGeneral);
|
||||||
|
return getOfficerLevelText($level, $nationArr['level']);
|
||||||
},
|
},
|
||||||
'honorText'=>function($rawGeneral){
|
'honorText' => function ($rawGeneral) {
|
||||||
return getHonor($rawGeneral['experience']);
|
return getHonor($rawGeneral['experience']);
|
||||||
},
|
},
|
||||||
'dedLevelText'=>function($rawGeneral){
|
'dedLevelText' => function ($rawGeneral) {
|
||||||
return getDedLevelText($rawGeneral['dedLevel']);
|
return getDedLevelText($rawGeneral['dedLevel']);
|
||||||
},
|
},
|
||||||
'turntime'=>function($rawGeneral){
|
'turntime' => function ($rawGeneral) {
|
||||||
//'0000-00-00 11:23';
|
//'0000-00-00 11:23';
|
||||||
return substr($rawGeneral['turntime'], 11, 5);
|
return substr($rawGeneral['turntime'], 11, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$queryColumns = General::mergeQueryColumn(array_keys($viewColumns), 1);
|
[$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys($viewColumns), 1);
|
||||||
|
|
||||||
$rawGeneralList = Util::convertArrayToDict($db->queryAllLists('SELECT %lb from general WHERE nation = %i', $queryColumns, $nationID), 'no');
|
$rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
|
||||||
|
|
||||||
$resultColumns = [];
|
$resultColumns = [];
|
||||||
foreach($viewColumns as $column=>$reqPermission){
|
foreach ($viewColumns as $column => $reqPermission) {
|
||||||
if($reqPermission > $permission){
|
if ($reqPermission > $permission) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$resultColumns[] = $column;
|
$resultColumns[] = $column;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($customViewColumns as $column=>$reqPermission){
|
foreach ($customViewColumns as $column => $reqPermission) {
|
||||||
if($reqPermission > $permission){
|
if ($reqPermission > $permission) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$resultColumns[] = $column;
|
$resultColumns[] = $column;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($rawGeneralList as $rawGeneral){
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
//General 생성?
|
//General 생성?
|
||||||
|
|
||||||
$item = [];
|
$item = [];
|
||||||
foreach($resultColumns as $column){
|
foreach ($resultColumns as $column) {
|
||||||
$value = $rawGeneral[$column];
|
if (key_exists($column, $specialViewFilter)) {
|
||||||
if(key_exists($column, $specialViewFilter)){
|
|
||||||
$value = $specialViewFilter[$column]($rawGeneral);
|
$value = $specialViewFilter[$column]($rawGeneral);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
$value = $rawGeneral[$column];
|
||||||
|
}
|
||||||
$item[] = $value;
|
$item[] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,9 +175,9 @@ foreach($rawGeneralList as $rawGeneral){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$result = [
|
$result = [
|
||||||
'result'=>true,
|
'result' => true,
|
||||||
'column'=>$resultColumns,
|
'column' => $resultColumns,
|
||||||
'list'=>$generalList,
|
'list' => $generalList,
|
||||||
];
|
];
|
||||||
|
|
||||||
Json::die($result);
|
Json::die($result);
|
||||||
|
|||||||
+1
-1
@@ -187,7 +187,7 @@ if($reserve_open){
|
|||||||
'options'=>Json::encode($reserveInfo),
|
'options'=>Json::encode($reserveInfo),
|
||||||
'date'=>$open_date
|
'date'=>$open_date
|
||||||
]);
|
]);
|
||||||
AppConf::getList()[DB::prefix()]->closeServer();
|
ServConfig::getServerList()[DB::prefix()]->closeServer();
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>true,
|
'result'=>true,
|
||||||
'reason'=>'예약'
|
'reason'=>'예약'
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ if($result !== true){
|
|||||||
|
|
||||||
ResetHelper::clearDB();
|
ResetHelper::clearDB();
|
||||||
|
|
||||||
AppConf::getList()[$prefix]->closeServer();
|
ServConfig::getServerList()[$prefix]->closeServer();
|
||||||
|
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>true,
|
'result'=>true,
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo;
|
||||||
|
use Nette\Caching\Cache;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
|
||||||
|
if(!class_exists('\\sammo\\UniqueConst')){
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'서버 초기화되지 않음'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!prepareDir('data/file_cache')){
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'cache 불가'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$storage = new \Nette\Caching\Storages\FileStorage('data/file_cache');
|
||||||
|
$cache = new Cache($storage);
|
||||||
|
$serverID = UniqueConst::$serverID;
|
||||||
|
|
||||||
|
$mapInfo = $cache->load("recent_map");
|
||||||
|
//로그인 검사
|
||||||
|
|
||||||
|
$now = time();
|
||||||
|
|
||||||
|
if($mapInfo && ($now - $mapInfo['timestamp'] < 600)){
|
||||||
|
$mapEtag = $mapInfo['etag'];
|
||||||
|
$mapModified = $mapInfo['timestamp'];
|
||||||
|
|
||||||
|
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mapModified)." GMT");
|
||||||
|
header("Etag: $mapEtag");
|
||||||
|
|
||||||
|
if (
|
||||||
|
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']??'2000-01-01') === $mapModified ||
|
||||||
|
trim($_SERVER['HTTP_IF_NONE_MATCH']??'') === $mapEtag
|
||||||
|
) {
|
||||||
|
header("HTTP/1.1 304 Not Modified");
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
Json::die($mapInfo['data'], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$defaultPost = [
|
||||||
|
'year' => null,
|
||||||
|
'month' => null,
|
||||||
|
'aux' => null,
|
||||||
|
'neutralView' => true,
|
||||||
|
'showMe' => false,
|
||||||
|
];
|
||||||
|
|
||||||
|
$history = formatHistoryToHTML(getGlobalHistoryLogRecent(10));
|
||||||
|
$rawMap = getWorldMap([
|
||||||
|
'year' => null,
|
||||||
|
'month' => null,
|
||||||
|
'aux' => null,
|
||||||
|
'neutralView' => true,
|
||||||
|
'showMe' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
$mapTheme = $gameStor->map_theme ?? 'che';
|
||||||
|
|
||||||
|
$rawMap['history'] = $history;
|
||||||
|
$rawMap['theme'] = $mapTheme;
|
||||||
|
|
||||||
|
$etag = hash('sha256', $serverID.$now);
|
||||||
|
$map = [
|
||||||
|
'etag'=>$etag,
|
||||||
|
'timestamp'=>$now,
|
||||||
|
'data'=>$rawMap,
|
||||||
|
];
|
||||||
|
$cache->save("recent_map", $map);
|
||||||
|
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $now)." GMT");
|
||||||
|
header("Etag: $etag");
|
||||||
|
|
||||||
|
Json::die($map['data'], 0);
|
||||||
@@ -40,6 +40,7 @@ if($action === '추방' && $destGeneralID==0){
|
|||||||
|
|
||||||
if($destGeneralID==0){
|
if($destGeneralID==0){
|
||||||
$general = new DummyGeneral(true);
|
$general = new DummyGeneral(true);
|
||||||
|
$general->setVar('nation', $nationID);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$general = General::createGeneralObjFromDB($destGeneralID, [
|
$general = General::createGeneralObjFromDB($destGeneralID, [
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ WebUtil::requireAJAX();
|
|||||||
|
|
||||||
$session = Session::requireGameLogin([])->setReadOnly();
|
$session = Session::requireGameLogin([])->setReadOnly();
|
||||||
|
|
||||||
|
increaseRefresh("사령턴 입력", 0);
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ WebUtil::requireAJAX();
|
|||||||
|
|
||||||
$session = Session::requireGameLogin([])->setReadOnly();
|
$session = Session::requireGameLogin([])->setReadOnly();
|
||||||
|
|
||||||
|
increaseRefresh("턴 입력", 0);
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$action = Util::getPost('action', 'string');
|
$action = Util::getPost('action', 'string');
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
|
||||||
|
WebUtil::requireAJAX();
|
||||||
|
|
||||||
|
$session = Session::requireGameLogin([])->setReadOnly();
|
||||||
|
$userID = Session::getUserID();
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
increaseRefresh("내정보 수정", 0);
|
||||||
|
|
||||||
|
$action = Util::getPost('action');
|
||||||
|
$tnmt = Util::getPost('tnmt', 'int', 1);
|
||||||
|
$defence_train = Util::getPost('defence_train', 'int', 80);
|
||||||
|
$use_treatment = Util::getPost('use_treatment', 'int', 10);
|
||||||
|
$use_auto_nation_turn = Util::getPost('use_auto_nation_turn', 'int', 1);
|
||||||
|
//$detachNPC = Util::getPost('detachNPC', 'bool');
|
||||||
|
$detachNPC = false;
|
||||||
|
|
||||||
|
if ($defence_train <= 40) {
|
||||||
|
$defence_train = 40;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($defence_train <= 90){
|
||||||
|
$defence_train = Util::round($defence_train, -1);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$defence_train = 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($tnmt < 0 || $tnmt > 1){
|
||||||
|
$tnmt = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
|
|
||||||
|
if($defence_train != $me->getVar('defence_train')){
|
||||||
|
if($defence_train == 999){
|
||||||
|
$me->increaseVar('myset', -1);
|
||||||
|
$me->setVar('defence_train', $defence_train);
|
||||||
|
$me->increaseVar('train', -3);
|
||||||
|
$me->increaseVar('atmos', -3);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$me->increaseVar('myset', -1);
|
||||||
|
$me->setVar('defence_train', $defence_train);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$me->setAuxVar('use_treatment', Util::valueFit($use_treatment, 10, 100));
|
||||||
|
|
||||||
|
if($use_auto_nation_turn != $me->getAuxVar('use_auto_nation_turn')){
|
||||||
|
$me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($me->getVar('tnmt') != $tnmt){
|
||||||
|
$me->setVar('tnmt', $tnmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($me->getNPCType() == 1 && $detachNPC){
|
||||||
|
$turnterm = $gameStor->turnterm;
|
||||||
|
|
||||||
|
if($turnterm < 10){
|
||||||
|
$targetKillTurn = 30 / $turnterm;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$targetKillTurn = 60 / $turnterm;
|
||||||
|
}
|
||||||
|
$me->setVar('killturn', $targetKillTurn);
|
||||||
|
}
|
||||||
|
|
||||||
|
$me->applyDB($db);
|
||||||
|
|
||||||
|
Json::die([
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success'
|
||||||
|
]);
|
||||||
@@ -10,6 +10,7 @@ $session = Session::requireGameLogin([])->setReadOnly();
|
|||||||
$userID = Session::getUserID();
|
$userID = Session::getUserID();
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
increaseRefresh("NPC 정책 수정", 0);
|
||||||
|
|
||||||
$type = Util::getPost('type', 'string');
|
$type = Util::getPost('type', 'string');
|
||||||
$data = Util::getPost('data', 'string');
|
$data = Util::getPost('data', 'string');
|
||||||
@@ -47,12 +48,7 @@ if (!$nationID) {
|
|||||||
'reason'=>'국가에 소속되어있지 않습니다.',
|
'reason'=>'국가에 소속되어있지 않습니다.',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
if ($me['officer_level'] < 5) {
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>'수뇌가 아닙니다.',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
$permission = checkSecretPermission($me);
|
$permission = checkSecretPermission($me);
|
||||||
if ($permission < 3) {
|
if ($permission < 3) {
|
||||||
Json::die([
|
Json::die([
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ WebUtil::requireAJAX();
|
|||||||
$session = Session::requireLogin([])->setReadOnly();
|
$session = Session::requireLogin([])->setReadOnly();
|
||||||
$userID = Session::getUserID();
|
$userID = Session::getUserID();
|
||||||
|
|
||||||
|
increaseRefresh("시뮬레이터", 0);
|
||||||
|
|
||||||
$query = Util::getPost('query');
|
$query = Util::getPost('query');
|
||||||
if($query === null){
|
if($query === null){
|
||||||
Json::die([
|
Json::die([
|
||||||
@@ -85,12 +87,13 @@ $generalCheck = [
|
|||||||
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
||||||
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
|
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
|
||||||
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
||||||
'recent_war'
|
'recent_war', 'warnum', 'killnum', 'killcrew',
|
||||||
],
|
],
|
||||||
'integer'=>[
|
'integer'=>[
|
||||||
'no', 'nation', 'crew', 'crewtype', 'atmos', 'train',
|
'no', 'nation', 'crew', 'crewtype', 'atmos', 'train',
|
||||||
'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp',
|
'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp',
|
||||||
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
||||||
|
'warnum', 'killnum', 'killcrew',
|
||||||
],
|
],
|
||||||
'min'=>[
|
'min'=>[
|
||||||
['no', 1],
|
['no', 1],
|
||||||
@@ -107,6 +110,9 @@ $generalCheck = [
|
|||||||
['dex3', 0],
|
['dex3', 0],
|
||||||
['dex4', 0],
|
['dex4', 0],
|
||||||
['dex5', 0],
|
['dex5', 0],
|
||||||
|
['warnum', 0],
|
||||||
|
['killnum', 0],
|
||||||
|
['killcrew', 0],
|
||||||
],
|
],
|
||||||
'between'=>[
|
'between'=>[
|
||||||
['train', [40, GameConst::$maxTrainByWar]],
|
['train', [40, GameConst::$maxTrainByWar]],
|
||||||
@@ -146,7 +152,8 @@ foreach($rawDefenderList as $idx=>$rawDefenderGeneral){
|
|||||||
'reason'=>"[수비자{$idx}]".$v->errorStr()
|
'reason'=>"[수비자{$idx}]".$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$defenderList[] = new General($rawDefenderGeneral, null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
|
||||||
|
$defenderList[] = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -271,6 +278,15 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
$startYear = $gameStor->startyear;
|
$startYear = $gameStor->startyear;
|
||||||
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
|
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
|
||||||
|
|
||||||
|
function extractRankVar(array $rawVal):array{
|
||||||
|
$rankVars = [];
|
||||||
|
foreach($rawVal as $rawKey=>$rawVal){
|
||||||
|
if(key_exists($rawKey, General::RANK_COLUMN)){
|
||||||
|
$rankVars[$rawKey] = $rawVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $rankVars;
|
||||||
|
}
|
||||||
|
|
||||||
function simulateBattle(
|
function simulateBattle(
|
||||||
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||||
@@ -278,7 +294,7 @@ function simulateBattle(
|
|||||||
$startYear, $year, $month, $cityRate
|
$startYear, $year, $month, $cityRate
|
||||||
){
|
){
|
||||||
$attacker = new WarUnitGeneral(
|
$attacker = new WarUnitGeneral(
|
||||||
new General($rawAttacker, null, $rawAttackerCity, $rawAttackerNation, $year, $month),
|
new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month),
|
||||||
$rawAttackerNation,
|
$rawAttackerNation,
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
@@ -310,7 +326,7 @@ function simulateBattle(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$defenderObj = new General($iterDefender->current(), null, $rawDefenderCity, $rawDefenderNation, $year, $month);
|
$defenderObj = new General($iterDefender->current(), extractRankVar($iterDefender->current()), $rawDefenderCity, $rawDefenderNation, $year, $month);
|
||||||
if(extractBattleOrder($defenderObj) <= 0){
|
if(extractBattleOrder($defenderObj) <= 0){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ $troop = Util::getPost('troop', 'int');
|
|||||||
$session = Session::requireGameLogin([])->setReadOnly();
|
$session = Session::requireGameLogin([])->setReadOnly();
|
||||||
$userID = $session::getUserID();
|
$userID = $session::getUserID();
|
||||||
|
|
||||||
|
increaseRefresh("부대명령", 0);
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$me = $db->queryFirstRow('SELECT `no`, name, nation, troop FROM general WHERE `owner`=%i', $userID);
|
$me = $db->queryFirstRow('SELECT `no`, name, nation, troop FROM general WHERE `owner`=%i', $userID);
|
||||||
|
|||||||
@@ -13,7 +13,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
$autorun_user = $gameStor->autorun_user;
|
$autorun_user = $gameStor->autorun_user;
|
||||||
if($autorun_user['limit_minutes']??false){
|
if($autorun_user['limit_minutes']??false){
|
||||||
//자동 턴인 경우에는 휴가 불가
|
//자동 턴인 경우에는 휴가 불가
|
||||||
header('location:b_myPage.php', true, 303);
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'자동 턴인 경우에는 휴가 명령이 불가능합니다.'
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$killturn = $gameStor->killturn;
|
$killturn = $gameStor->killturn;
|
||||||
@@ -23,5 +26,8 @@ $db->update('general', [
|
|||||||
], 'owner=%i', $userID);
|
], 'owner=%i', $userID);
|
||||||
|
|
||||||
|
|
||||||
header('location:b_myPage.php', true, 303);
|
Json::die([
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success'
|
||||||
|
]);
|
||||||
|
|
||||||
+1
-1
@@ -169,7 +169,7 @@ if ($genius) {
|
|||||||
'dex5'=>0
|
'dex5'=>0
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/4 - $relYear / 2), 3) + $age;
|
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/6 - $relYear / 2), 3) + $age;
|
||||||
$special2 = GameConst::$defaultSpecialWar;
|
$special2 = GameConst::$defaultSpecialWar;
|
||||||
}
|
}
|
||||||
//내특
|
//내특
|
||||||
|
|||||||
+361
-229
@@ -1,4 +1,4 @@
|
|||||||
jQuery(function($){
|
jQuery(function($) {
|
||||||
|
|
||||||
|
|
||||||
var $generalForm = $('.form_sample .general_detail');
|
var $generalForm = $('.form_sample .general_detail');
|
||||||
@@ -9,9 +9,28 @@ jQuery(function($){
|
|||||||
|
|
||||||
var $attackerCard = $('.attacker_form');
|
var $attackerCard = $('.attacker_form');
|
||||||
|
|
||||||
var initBasicEvent = function(){
|
var initBasicEvent = function() {
|
||||||
|
|
||||||
$('.form_injury').change(function(){
|
if (window.nation) {
|
||||||
|
$('.form_city_level').val(window.city.level);
|
||||||
|
$('.form_def').val(parseInt(window.city.def));
|
||||||
|
$('.form_wall').val(parseInt(window.city.wall));
|
||||||
|
$('.form_nation_type').val(window.nation.type);
|
||||||
|
$('.form_nation_level').val(window.nation.level);
|
||||||
|
$('.form_tech').val(parseInt(window.nation.tech / 1000));
|
||||||
|
if (window.nation.capital == window.city.city) {
|
||||||
|
$('.attacker_nation .form_is_capital:first').click();
|
||||||
|
$('.defender_nation .form_is_capital:first').click();
|
||||||
|
} else {
|
||||||
|
$('.attacker_nation .form_is_capital:last').click();
|
||||||
|
$('.defender_nation .form_is_capital:last').click();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$('.attacker_nation .form_is_capital:last').click();
|
||||||
|
$('.defender_nation .form_is_capital:last').click();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('.form_injury').change(function() {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var $general = getGeneralDetail($this);
|
var $general = getGeneralDetail($this);
|
||||||
var $helptext = $general.find('.injury_helptext');
|
var $helptext = $general.find('.injury_helptext');
|
||||||
@@ -20,51 +39,48 @@ jQuery(function($){
|
|||||||
//FIXME: PHP 코드와 항상 일치하도록 변경
|
//FIXME: PHP 코드와 항상 일치하도록 변경
|
||||||
var text = '건강';
|
var text = '건강';
|
||||||
var color = 'white';
|
var color = 'white';
|
||||||
if(injury > 60){
|
if (injury > 60) {
|
||||||
text = '위독';
|
text = '위독';
|
||||||
color = 'red';
|
color = 'red';
|
||||||
}
|
} else if (injury > 40) {
|
||||||
else if(injury > 40){
|
|
||||||
text = '심각';
|
text = '심각';
|
||||||
color = 'magenta';
|
color = 'magenta';
|
||||||
}
|
} else if (injury > 20) {
|
||||||
else if(injury > 20){
|
|
||||||
text = '중상';
|
text = '중상';
|
||||||
color = 'orange';
|
color = 'orange';
|
||||||
}
|
} else if (injury > 0) {
|
||||||
else if(injury > 0){
|
|
||||||
text = '경상';
|
text = '경상';
|
||||||
color = 'yellow';
|
color = 'yellow';
|
||||||
}
|
}
|
||||||
$helptext.html(text).css('color', color);
|
$helptext.html(text).css('color', color);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.export_general').click(function(){
|
$('.export_general').click(function() {
|
||||||
var $btn = $(this);
|
var $btn = $(this);
|
||||||
var $general = getGeneralDetail($btn);
|
var $general = getGeneralDetail($btn);
|
||||||
|
|
||||||
var values = exportGeneralInfo($general);
|
var values = exportGeneralInfo($general);
|
||||||
console.log(values);
|
console.log(values);
|
||||||
});
|
});
|
||||||
$('.delete-defender').click(function(){
|
$('.delete-defender').click(function() {
|
||||||
var $card = getGeneralFrame($(this));
|
var $card = getGeneralFrame($(this));
|
||||||
deleteDefender($card);
|
deleteDefender($card);
|
||||||
});
|
});
|
||||||
$('.copy-defender').click(function(){
|
$('.copy-defender').click(function() {
|
||||||
var $card = getGeneralFrame($(this));
|
var $card = getGeneralFrame($(this));
|
||||||
copyDefender($card);
|
copyDefender($card);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.add-defender').click(function(){
|
$('.add-defender').click(function() {
|
||||||
addDefender();
|
addDefender();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn-general-load').click(function(){
|
$('.btn-general-load').click(function() {
|
||||||
var $file = $(this).prev();
|
var $file = $(this).prev();
|
||||||
$file[0].click();
|
$file[0].click();
|
||||||
})
|
})
|
||||||
|
|
||||||
$('.form_load_general_file').on('change', function(e){
|
$('.form_load_general_file').on('change', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var $card = getGeneralFrame($this);
|
var $card = getGeneralFrame($this);
|
||||||
@@ -75,26 +91,35 @@ jQuery(function($){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn-general-save').click(function(){
|
$('.btn-general-import-server').click(function() {
|
||||||
|
var $this = $(this);
|
||||||
|
var $card = getGeneralFrame($this);
|
||||||
|
|
||||||
|
var $modal = $('#importModal');
|
||||||
|
$modal.data('target', $card);
|
||||||
|
$modal.modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.btn-general-save').click(function() {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var $general = getGeneralDetail($this);
|
var $general = getGeneralDetail($this);
|
||||||
var generalData = exportGeneralInfo($general);
|
var generalData = exportGeneralInfo($general);
|
||||||
|
|
||||||
var filename = "general_{0}.json".format(generalData.name);
|
var filename = "general_{0}.json".format(generalData.name);
|
||||||
var saveData = JSON.stringify({
|
var saveData = JSON.stringify({
|
||||||
objType:'general',
|
objType: 'general',
|
||||||
data:generalData
|
data: generalData
|
||||||
}, null, 4);
|
}, null, 4);
|
||||||
|
|
||||||
download(saveData, filename, 'application/json');
|
download(saveData, filename, 'application/json');
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn-battle-load').click(function(){
|
$('.btn-battle-load').click(function() {
|
||||||
var $file = $(this).prev();
|
var $file = $(this).prev();
|
||||||
$file[0].click();
|
$file[0].click();
|
||||||
})
|
})
|
||||||
|
|
||||||
$('.form_load_battle_file').on('change', function(e){
|
$('.form_load_battle_file').on('change', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var files = e.target.files;
|
var files = e.target.files;
|
||||||
@@ -103,12 +128,12 @@ jQuery(function($){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn-battle-save').click(function(){
|
$('.btn-battle-save').click(function() {
|
||||||
var battleData = exportAllData();
|
var battleData = exportAllData();
|
||||||
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
|
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
|
||||||
var saveData = JSON.stringify({
|
var saveData = JSON.stringify({
|
||||||
objType:'battle',
|
objType: 'battle',
|
||||||
data:battleData
|
data: battleData
|
||||||
}, null, 4);
|
}, null, 4);
|
||||||
|
|
||||||
download(saveData, filename, 'application/json');
|
download(saveData, filename, 'application/json');
|
||||||
@@ -119,7 +144,7 @@ jQuery(function($){
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
})
|
})
|
||||||
$generals.bind('drop', function(e){
|
$generals.bind('drop', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var $card = getGeneralFrame($this);
|
var $card = getGeneralFrame($this);
|
||||||
@@ -135,7 +160,7 @@ jQuery(function($){
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
})
|
})
|
||||||
$battlePad.bind('drop', function(e){
|
$battlePad.bind('drop', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
var files = e.originalEvent.dataTransfer.files;
|
var files = e.originalEvent.dataTransfer.files;
|
||||||
@@ -145,8 +170,8 @@ jQuery(function($){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var importGeneralInfo = function($general, data){
|
var importGeneralInfo = function($general, data) {
|
||||||
var setVal = function(query, val){
|
var setVal = function(query, val) {
|
||||||
$general.find(query).val(val).change();
|
$general.find(query).val(val).change();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,7 +179,6 @@ jQuery(function($){
|
|||||||
|
|
||||||
setVal('.form_officer_level', data.officer_level);
|
setVal('.form_officer_level', data.officer_level);
|
||||||
setVal('.form_exp_level', data.explevel);
|
setVal('.form_exp_level', data.explevel);
|
||||||
setVal('.form_injury', data.injury);
|
|
||||||
|
|
||||||
setVal('.form_leadership', data.leadership);
|
setVal('.form_leadership', data.leadership);
|
||||||
setVal('.form_general_horse', data.horse);
|
setVal('.form_general_horse', data.horse);
|
||||||
@@ -183,93 +207,103 @@ jQuery(function($){
|
|||||||
setVal('.form_dex5', data.dex5);
|
setVal('.form_dex5', data.dex5);
|
||||||
setVal('.form_defence_train', data.defence_train);
|
setVal('.form_defence_train', data.defence_train);
|
||||||
|
|
||||||
if(!setGeneralNo($general, data.no)){
|
setVal('.form_warnum', data.warnum);
|
||||||
|
setVal('.form_killnum', data.killnum);
|
||||||
|
setVal('.form_killcrew', data.killcrew);
|
||||||
|
|
||||||
|
if (!setGeneralNo($general, data.no)) {
|
||||||
setGeneralNo($general, generateNewGeneralNo());
|
setGeneralNo($general, generateNewGeneralNo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var exportGeneralInfo = function($general){
|
var exportGeneralInfo = function($general) {
|
||||||
var getInt = function(query){
|
var getInt = function(query) {
|
||||||
return parseInt($general.find(query).val());
|
return parseInt($general.find(query).val());
|
||||||
}
|
}
|
||||||
|
|
||||||
var getVal = function(query){
|
var getVal = function(query) {
|
||||||
return $general.find(query).val();
|
return $general.find(query).val();
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
no:getGeneralNo($general),
|
no: getGeneralNo($general),
|
||||||
name:getVal('.form_general_name'),
|
name: getVal('.form_general_name'),
|
||||||
officer_level:getInt('.form_officer_level'),
|
officer_level: getInt('.form_officer_level'),
|
||||||
explevel:getInt('.form_exp_level'),
|
explevel: getInt('.form_exp_level'),
|
||||||
|
|
||||||
leadership:getInt('.form_leadership'),
|
leadership: getInt('.form_leadership'),
|
||||||
horse:getVal('.form_general_horse'),
|
horse: getVal('.form_general_horse'),
|
||||||
strength:getInt('.form_strength'),
|
strength: getInt('.form_strength'),
|
||||||
weapon:getVal('.form_general_weap'),
|
weapon: getVal('.form_general_weap'),
|
||||||
intel:getInt('.form_intel'),
|
intel: getInt('.form_intel'),
|
||||||
book:getVal('.form_general_book'),
|
book: getVal('.form_general_book'),
|
||||||
item:getVal('.form_general_item'),
|
item: getVal('.form_general_item'),
|
||||||
|
|
||||||
injury:getInt('.form_injury'),
|
injury: getInt('.form_injury'),
|
||||||
|
|
||||||
rice:getInt('.form_rice'),
|
rice: getInt('.form_rice'),
|
||||||
|
|
||||||
personal:getVal('.form_general_character'),
|
personal: getVal('.form_general_character'),
|
||||||
special2:getVal('.form_general_special_war'),
|
special2: getVal('.form_general_special_war'),
|
||||||
|
|
||||||
crew:getInt('.form_crew'),
|
crew: getInt('.form_crew'),
|
||||||
crewtype:getInt('.form_crewtype'),
|
crewtype: getInt('.form_crewtype'),
|
||||||
atmos:getInt('.form_atmos'),
|
atmos: getInt('.form_atmos'),
|
||||||
train:getInt('.form_train'),
|
train: getInt('.form_train'),
|
||||||
|
|
||||||
|
dex1: getInt('.form_dex1'),
|
||||||
|
dex2: getInt('.form_dex2'),
|
||||||
|
dex3: getInt('.form_dex3'),
|
||||||
|
dex4: getInt('.form_dex4'),
|
||||||
|
dex5: getInt('.form_dex5'),
|
||||||
|
|
||||||
|
defence_train: getInt('.form_defence_train'),
|
||||||
|
|
||||||
|
warnum: getInt('.form_warnum'),
|
||||||
|
killnum: getInt('.form_killnum'),
|
||||||
|
killcrew: getInt('.form_killcrew'),
|
||||||
|
|
||||||
dex1:getInt('.form_dex1'),
|
|
||||||
dex2:getInt('.form_dex2'),
|
|
||||||
dex3:getInt('.form_dex3'),
|
|
||||||
dex4:getInt('.form_dex4'),
|
|
||||||
dex5:getInt('.form_dex5'),
|
|
||||||
defence_train:getInt('.form_defence_train'),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var importBattleInfoByFile = function(files){
|
var importBattleInfoByFile = function(files) {
|
||||||
if(files === null){
|
if (files === null) {
|
||||||
alert('파일 에러!');
|
alert('파일 에러!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(files.length < 1){
|
if (files.length < 1) {
|
||||||
alert("파일 에러!");
|
alert("파일 에러!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var file = files[0];
|
var file = files[0];
|
||||||
if(file.size > 1024*1024){
|
if (file.size > 1024 * 1024) {
|
||||||
alert('파일이 너무 큽니다!');
|
alert('파일이 너무 큽니다!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(file.type === ''){
|
if (file.type === '') {
|
||||||
alert('폴더를 업로드할 수 없습니다!');
|
alert('폴더를 업로드할 수 없습니다!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var reader = new FileReader();
|
var reader = new FileReader();
|
||||||
reader.onload = function(){
|
reader.onload = function() {
|
||||||
var battleData = {};
|
var battleData = {};
|
||||||
try {
|
try {
|
||||||
battleData = JSON.parse(reader.result);
|
battleData = JSON.parse(reader.result);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
alert('올바르지 않은 파일 형식입니다');
|
alert('올바르지 않은 파일 형식입니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!('objType' in battleData)){
|
if (!('objType' in battleData)) {
|
||||||
alert('파일 형식을 확인할 수 없습니다');
|
alert('파일 형식을 확인할 수 없습니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(battleData.objType != 'battle'){
|
if (battleData.objType != 'battle') {
|
||||||
alert('전투 데이터가 아닙니다');
|
alert('전투 데이터가 아닙니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -281,8 +315,7 @@ jQuery(function($){
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
reader.readAsText(file);
|
reader.readAsText(file);
|
||||||
}
|
} catch (e) {
|
||||||
catch(e) {
|
|
||||||
alert('파일을 읽는데 실패했습니다.');
|
alert('파일을 읽는데 실패했습니다.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -290,52 +323,52 @@ jQuery(function($){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var importGeneralInfoByFile = function(files, $card){
|
var importGeneralInfoByFile = function(files, $card) {
|
||||||
if($card === undefined){
|
if ($card === undefined) {
|
||||||
$card = addDefender();
|
$card = addDefender();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(files === null){
|
if (files === null) {
|
||||||
alert('파일 에러!');
|
alert('파일 에러!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(files.length < 1){
|
if (files.length < 1) {
|
||||||
alert("파일 에러!");
|
alert("파일 에러!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var file = files[0];
|
var file = files[0];
|
||||||
if(file.size > 1024*1024){
|
if (file.size > 1024 * 1024) {
|
||||||
alert('파일이 너무 큽니다!');
|
alert('파일이 너무 큽니다!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(file.type === ''){
|
if (file.type === '') {
|
||||||
alert('폴더를 업로드할 수 없습니다!');
|
alert('폴더를 업로드할 수 없습니다!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var reader = new FileReader();
|
var reader = new FileReader();
|
||||||
reader.onload = function(){
|
reader.onload = function() {
|
||||||
var generalData = {};
|
var generalData = {};
|
||||||
try {
|
try {
|
||||||
generalData = JSON.parse(reader.result);
|
generalData = JSON.parse(reader.result);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
alert('올바르지 않은 파일 형식입니다');
|
alert('올바르지 않은 파일 형식입니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!('objType' in generalData)){
|
if (!('objType' in generalData)) {
|
||||||
alert('파일 형식을 확인할 수 없습니다');
|
alert('파일 형식을 확인할 수 없습니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(generalData.objType == 'battle'){
|
if (generalData.objType == 'battle') {
|
||||||
importBattleInfo(generalData.data);
|
importBattleInfo(generalData.data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(generalData.objType != 'general'){
|
if (generalData.objType != 'general') {
|
||||||
alert('장수 데이터가 아닙니다');
|
alert('장수 데이터가 아닙니다');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -349,8 +382,7 @@ jQuery(function($){
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
reader.readAsText(file);
|
reader.readAsText(file);
|
||||||
}
|
} catch (e) {
|
||||||
catch(e) {
|
|
||||||
alert('파일을 읽는데 실패했습니다.');
|
alert('파일을 읽는데 실패했습니다.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -358,49 +390,49 @@ jQuery(function($){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var extendGeneralInfoForDB = function(generalData){
|
var extendGeneralInfoForDB = function(generalData) {
|
||||||
|
|
||||||
var dbVal = {
|
var dbVal = {
|
||||||
nation: (generalData.no)<=1 ? 1 : 2,
|
nation: (generalData.no) <= 1 ? 1 : 2,
|
||||||
city: (generalData.no)<=1 ? 1 : 3,
|
city: (generalData.no) <= 1 ? 1 : 3,
|
||||||
turntime:'2018-08-26 12:00',
|
turntime: '2018-08-26 12:00',
|
||||||
special:defaultSpecialDomestic,
|
special: defaultSpecialDomestic,
|
||||||
leadership_exp:0,
|
leadership_exp: 0,
|
||||||
strength_exp:0,
|
strength_exp: 0,
|
||||||
intel_exp:0,
|
intel_exp: 0,
|
||||||
|
|
||||||
gold:10000,
|
gold: 10000,
|
||||||
|
|
||||||
dedication:0,
|
dedication: 0,
|
||||||
|
|
||||||
recent_war:'2018-08-26 12:00',
|
recent_war: '2018-08-26 12:00',
|
||||||
experience:Math.pow(generalData.explevel, 2),
|
experience: Math.pow(generalData.explevel, 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
return $.extend({}, generalData, dbVal);
|
return $.extend({}, generalData, dbVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
var getGeneralFrame = function($btn){
|
var getGeneralFrame = function($btn) {
|
||||||
var $card = $btn.closest('.general_form');
|
var $card = $btn.closest('.general_form');
|
||||||
return $card;
|
return $card;
|
||||||
}
|
}
|
||||||
|
|
||||||
var getGeneralDetail = function($btn){
|
var getGeneralDetail = function($btn) {
|
||||||
var $card = getGeneralFrame($btn);
|
var $card = getGeneralFrame($btn);
|
||||||
var $general = $card.find('.general_detail');
|
var $general = $card.find('.general_detail');
|
||||||
return $general;
|
return $general;
|
||||||
}
|
}
|
||||||
|
|
||||||
var getGeneralNo = function($btn){
|
var getGeneralNo = function($btn) {
|
||||||
return parseInt(getGeneralFrame($btn).data('general_no'));
|
return parseInt(getGeneralFrame($btn).data('general_no'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var setGeneralNo = function($btn, value){
|
var setGeneralNo = function($btn, value) {
|
||||||
if(value == 1){
|
if (value == 1) {
|
||||||
//1번은 무조건 공격자임
|
//1번은 무조건 공격자임
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(value in defenderNoList){
|
if (value in defenderNoList) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var $card = getGeneralFrame($btn);
|
var $card = getGeneralFrame($btn);
|
||||||
@@ -409,35 +441,34 @@ jQuery(function($){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var generateNewGeneralNo = function(){
|
var generateNewGeneralNo = function() {
|
||||||
while(true){
|
while (true) {
|
||||||
var newGeneralNo = parseInt(Math.random()*(1<<24))+2;
|
var newGeneralNo = parseInt(Math.random() * (1 << 24)) + 2;
|
||||||
if(newGeneralNo in defenderNoList){
|
if (newGeneralNo in defenderNoList) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return newGeneralNo;
|
return newGeneralNo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var deleteGeneralNo = function($btn){
|
var deleteGeneralNo = function($btn) {
|
||||||
var $card = getGeneralFrame($btn);
|
var $card = getGeneralFrame($btn);
|
||||||
$card.removeData('general_no');
|
$card.removeData('general_no');
|
||||||
var generalNo = getGeneralNo($card);
|
var generalNo = getGeneralNo($card);
|
||||||
delete defenderNoList[generalNo];
|
delete defenderNoList[generalNo];
|
||||||
}
|
}
|
||||||
|
|
||||||
var addDefender = function($cardAfter){
|
var addDefender = function($cardAfter) {
|
||||||
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
|
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
|
||||||
|
|
||||||
if($cardAfter === undefined){
|
if ($cardAfter === undefined) {
|
||||||
$defenderColumn.append($newCard);
|
$defenderColumn.append($newCard);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$cardAfter.after($newCard);
|
$cardAfter.after($newCard);
|
||||||
}
|
}
|
||||||
|
|
||||||
$newCard.append($defenderHeaderForm.clone(true,true));
|
$newCard.append($defenderHeaderForm.clone(true, true));
|
||||||
$newCard.append($generalForm.clone(true,true));
|
$newCard.append($generalForm.clone(true, true));
|
||||||
|
|
||||||
$newGeneral = getGeneralDetail($newCard);
|
$newGeneral = getGeneralDetail($newCard);
|
||||||
setGeneralNo($newCard, generateNewGeneralNo());
|
setGeneralNo($newCard, generateNewGeneralNo());
|
||||||
@@ -445,12 +476,12 @@ jQuery(function($){
|
|||||||
return $newCard;
|
return $newCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
var deleteDefender = function($card){
|
var deleteDefender = function($card) {
|
||||||
deleteGeneralNo($card);
|
deleteGeneralNo($card);
|
||||||
$card.detach();
|
$card.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
var copyDefender = function($card){
|
var copyDefender = function($card) {
|
||||||
var $general = getGeneralDetail($card);
|
var $general = getGeneralDetail($card);
|
||||||
|
|
||||||
var generalData = exportGeneralInfo($general);
|
var generalData = exportGeneralInfo($general);
|
||||||
@@ -458,7 +489,7 @@ jQuery(function($){
|
|||||||
importGeneralInfo(getGeneralDetail($newObj), generalData);
|
importGeneralInfo(getGeneralDetail($newObj), generalData);
|
||||||
}
|
}
|
||||||
|
|
||||||
var importBattleInfo = function(battleData){
|
var importBattleInfo = function(battleData) {
|
||||||
|
|
||||||
$('.form_load_battle_file').val('');
|
$('.form_load_battle_file').val('');
|
||||||
console.log(battleData);
|
console.log(battleData);
|
||||||
@@ -481,12 +512,11 @@ jQuery(function($){
|
|||||||
$('.delete-defender').click();
|
$('.delete-defender').click();
|
||||||
|
|
||||||
$attackerNation.find('.form_nation_type').val(attackerNation.type);
|
$attackerNation.find('.form_nation_type').val(attackerNation.type);
|
||||||
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech/1000));
|
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech / 1000));
|
||||||
$attackerNation.find('.form_nation_level').val(attackerNation.level);
|
$attackerNation.find('.form_nation_level').val(attackerNation.level);
|
||||||
if(attackerNation.capital == 1){
|
if (attackerNation.capital == 1) {
|
||||||
$attackerNation.find('.form_is_capital:first').click();
|
$attackerNation.find('.form_is_capital:first').click();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$attackerNation.find('.form_is_capital:last').click();
|
$attackerNation.find('.form_is_capital:last').click();
|
||||||
}
|
}
|
||||||
$attackerNation.find('.form_city_level').val(attackerCity.level);
|
$attackerNation.find('.form_city_level').val(attackerCity.level);
|
||||||
@@ -494,56 +524,55 @@ jQuery(function($){
|
|||||||
importGeneralInfo($('.attacker_form'), attackerGeneral);
|
importGeneralInfo($('.attacker_form'), attackerGeneral);
|
||||||
|
|
||||||
$defenderNation.find('.form_nation_type').val(defenderNation.type);
|
$defenderNation.find('.form_nation_type').val(defenderNation.type);
|
||||||
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech/1000));
|
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech / 1000));
|
||||||
$defenderNation.find('.form_nation_level').val(defenderNation.level);
|
$defenderNation.find('.form_nation_level').val(defenderNation.level);
|
||||||
if(defenderNation.capital == 1){
|
if (defenderNation.capital == 1) {
|
||||||
$defenderNation.find('.form_is_capital:first').click();
|
$defenderNation.find('.form_is_capital:first').click();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$defenderNation.find('.form_is_capital:last').click();
|
$defenderNation.find('.form_is_capital:last').click();
|
||||||
}
|
}
|
||||||
$defenderNation.find('.form_city_level').val(defenderCity.level);
|
$defenderNation.find('.form_city_level').val(defenderCity.level);
|
||||||
$('#city_def').val(defenderCity.def);
|
$('#city_def').val(defenderCity.def);
|
||||||
$('#city_wall').val(defenderCity.wall);
|
$('#city_wall').val(defenderCity.wall);
|
||||||
|
|
||||||
$.each(defenderGenerals, function(idx, defenderGeneral){
|
$.each(defenderGenerals, function(idx, defenderGeneral) {
|
||||||
var $card = addDefender();
|
var $card = addDefender();
|
||||||
importGeneralInfo($card, defenderGeneral);
|
importGeneralInfo($card, defenderGeneral);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var exportAllData = function(){
|
var exportAllData = function() {
|
||||||
var $attackerNation = $('.attacker_nation');
|
var $attackerNation = $('.attacker_nation');
|
||||||
var $defenderNation = $('.defender_nation');
|
var $defenderNation = $('.defender_nation');
|
||||||
|
|
||||||
var attackerGeneral = exportGeneralInfo($('.attacker_form'));
|
var attackerGeneral = exportGeneralInfo($('.attacker_form'));
|
||||||
|
|
||||||
var attackerCity = {
|
var attackerCity = {
|
||||||
level:parseInt($attackerNation.find('.form_city_level').val()),
|
level: parseInt($attackerNation.find('.form_city_level').val()),
|
||||||
};
|
};
|
||||||
|
|
||||||
var attackerNation = {
|
var attackerNation = {
|
||||||
type:$attackerNation.find('.form_nation_type').val(),
|
type: $attackerNation.find('.form_nation_type').val(),
|
||||||
tech:parseInt($attackerNation.find('.form_tech').val()) * 1000,
|
tech: parseInt($attackerNation.find('.form_tech').val()) * 1000,
|
||||||
level:parseInt($attackerNation.find('.form_nation_level').val()),
|
level: parseInt($attackerNation.find('.form_nation_level').val()),
|
||||||
capital:$attackerNation.find('.form_is_capital:checked').val()=='1'?1:2,
|
capital: $attackerNation.find('.form_is_capital:checked').val() == '1' ? 1 : 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
var defenderGenerals = $('.defender_form').map(function(){
|
var defenderGenerals = $('.defender_form').map(function() {
|
||||||
return exportGeneralInfo($(this));
|
return exportGeneralInfo($(this));
|
||||||
}).toArray();
|
}).toArray();
|
||||||
|
|
||||||
var defenderCity = {
|
var defenderCity = {
|
||||||
def: parseInt($('#city_def').val()),
|
def: parseInt($('#city_def').val()),
|
||||||
wall: parseInt($('#city_wall').val()),
|
wall: parseInt($('#city_wall').val()),
|
||||||
level:parseInt($defenderNation.find('.form_city_level').val()),
|
level: parseInt($defenderNation.find('.form_city_level').val()),
|
||||||
};
|
};
|
||||||
|
|
||||||
var defenderNation = {
|
var defenderNation = {
|
||||||
type:$defenderNation.find('.form_nation_type').val(),
|
type: $defenderNation.find('.form_nation_type').val(),
|
||||||
tech:parseInt($defenderNation.find('.form_tech').val()) * 1000,
|
tech: parseInt($defenderNation.find('.form_tech').val()) * 1000,
|
||||||
level:parseInt($defenderNation.find('.form_nation_level').val()),
|
level: parseInt($defenderNation.find('.form_nation_level').val()),
|
||||||
capital:$defenderNation.find('.form_is_capital:checked').val()=='1'?3:4,
|
capital: $defenderNation.find('.form_is_capital:checked').val() == '1' ? 3 : 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
var year = parseInt($('#year').val());
|
var year = parseInt($('#year').val());
|
||||||
@@ -551,59 +580,59 @@ jQuery(function($){
|
|||||||
var repeatCnt = parseInt($('#repeat_cnt').val());
|
var repeatCnt = parseInt($('#repeat_cnt').val());
|
||||||
|
|
||||||
return {
|
return {
|
||||||
attackerGeneral:attackerGeneral,
|
attackerGeneral: attackerGeneral,
|
||||||
attackerCity:attackerCity,
|
attackerCity: attackerCity,
|
||||||
attackerNation:attackerNation,
|
attackerNation: attackerNation,
|
||||||
|
|
||||||
defenderGenerals:defenderGenerals,
|
defenderGenerals: defenderGenerals,
|
||||||
defenderCity:defenderCity,
|
defenderCity: defenderCity,
|
||||||
defenderNation:defenderNation,
|
defenderNation: defenderNation,
|
||||||
|
|
||||||
year:year,
|
year: year,
|
||||||
month:month,
|
month: month,
|
||||||
repeatCnt:repeatCnt,
|
repeatCnt: repeatCnt,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var extendAllDataForDB = function(allData){
|
var extendAllDataForDB = function(allData) {
|
||||||
var defaultNation = {
|
var defaultNation = {
|
||||||
nation:0,
|
nation: 0,
|
||||||
name:'재야',
|
name: '재야',
|
||||||
capital:0,
|
capital: 0,
|
||||||
level:0,
|
level: 0,
|
||||||
gold:0,
|
gold: 0,
|
||||||
rice:2000,
|
rice: 2000,
|
||||||
type:'None',
|
type: 'None',
|
||||||
tech:0,
|
tech: 0,
|
||||||
gennum:200,
|
gennum: 200,
|
||||||
};
|
};
|
||||||
|
|
||||||
var defaultCity = {
|
var defaultCity = {
|
||||||
nation:0,
|
nation: 0,
|
||||||
supply:1,
|
supply: 1,
|
||||||
name:'도시',
|
name: '도시',
|
||||||
|
|
||||||
pop:500000,
|
pop: 500000,
|
||||||
agri:10000,
|
agri: 10000,
|
||||||
comm:10000,
|
comm: 10000,
|
||||||
secu:10000,
|
secu: 10000,
|
||||||
def:1000,
|
def: 1000,
|
||||||
wall:1000,
|
wall: 1000,
|
||||||
|
|
||||||
trust:100,
|
trust: 100,
|
||||||
|
|
||||||
pop_max:600000,
|
pop_max: 600000,
|
||||||
agri_max:12000,
|
agri_max: 12000,
|
||||||
comm_max:12000,
|
comm_max: 12000,
|
||||||
secu_max:10000,
|
secu_max: 10000,
|
||||||
def_max:12000,
|
def_max: 12000,
|
||||||
wall_max:12000,
|
wall_max: 12000,
|
||||||
|
|
||||||
dead:0,
|
dead: 0,
|
||||||
|
|
||||||
state:0,
|
state: 0,
|
||||||
|
|
||||||
conflict:'{}',
|
conflict: '{}',
|
||||||
};
|
};
|
||||||
|
|
||||||
var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
|
var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
|
||||||
@@ -615,10 +644,9 @@ jQuery(function($){
|
|||||||
attackerCity.city = 1;
|
attackerCity.city = 1;
|
||||||
|
|
||||||
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
|
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
|
||||||
if(2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4){
|
if (2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4) {
|
||||||
attackerGeneral.officer_city = 1;
|
attackerGeneral.officer_city = 1;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
attackerGeneral.officer_city = 0;
|
attackerGeneral.officer_city = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,16 +657,15 @@ jQuery(function($){
|
|||||||
var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
|
var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
|
||||||
defenderCity.nation = 2;
|
defenderCity.nation = 2;
|
||||||
defenderCity.city = 3;
|
defenderCity.city = 3;
|
||||||
defenderCity.wall_max = defenderCity.wall/5*6;
|
defenderCity.wall_max = parseInt(defenderCity.wall / 5 * 6);
|
||||||
defenderCity.def_max = defenderCity.def/5*6;
|
defenderCity.def_max = parseInt(defenderCity.def / 5 * 6);
|
||||||
|
|
||||||
var defenderGenerals = [];
|
var defenderGenerals = [];
|
||||||
$.each(allData.defenderGenerals, function(){
|
$.each(allData.defenderGenerals, function() {
|
||||||
var defenderGeneral = extendGeneralInfoForDB(this);
|
var defenderGeneral = extendGeneralInfoForDB(this);
|
||||||
if(2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4){
|
if (2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4) {
|
||||||
defenderGeneral.officer_city = 3;
|
defenderGeneral.officer_city = 3;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
defenderGeneral.officer_city = 0;
|
defenderGeneral.officer_city = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -647,58 +674,55 @@ jQuery(function($){
|
|||||||
|
|
||||||
|
|
||||||
return $.extend({}, allData, {
|
return $.extend({}, allData, {
|
||||||
attackerGeneral:attackerGeneral,
|
attackerGeneral: attackerGeneral,
|
||||||
attackerCity:attackerCity,
|
attackerCity: attackerCity,
|
||||||
attackerNation:attackerNation,
|
attackerNation: attackerNation,
|
||||||
|
|
||||||
defenderGenerals:defenderGenerals,
|
defenderGenerals: defenderGenerals,
|
||||||
defenderCity:defenderCity,
|
defenderCity: defenderCity,
|
||||||
defenderNation:defenderNation,
|
defenderNation: defenderNation,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var parseSkillCount = function(skills){
|
var parseSkillCount = function(skills) {
|
||||||
var result = [];
|
var result = [];
|
||||||
$.each(skills, function(key, value){
|
$.each(skills, function(key, value) {
|
||||||
result.push("{0}({1}회)".format(key, toPretty(value)));
|
result.push("{0}({1}회)".format(key, toPretty(value)));
|
||||||
})
|
})
|
||||||
|
|
||||||
if(result.length == 0){
|
if (result.length == 0) {
|
||||||
return '-';
|
return '-';
|
||||||
}
|
}
|
||||||
return result.join(', ');
|
return result.join(', ');
|
||||||
}
|
}
|
||||||
|
|
||||||
var toPretty = function(number){
|
var toPretty = function(number) {
|
||||||
if(isInt(number)){
|
if (isInt(number)) {
|
||||||
number = parseInt(number);
|
number = parseInt(number);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
number = parseFloat(number).toFixed(2);
|
number = parseFloat(number).toFixed(2);
|
||||||
}
|
}
|
||||||
return numberWithCommas(number);
|
return numberWithCommas(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
var showBattleResult = function(result){
|
var showBattleResult = function(result) {
|
||||||
$('#result_datetime').html(result.datetime);
|
$('#result_datetime').html(result.datetime);
|
||||||
$('#result_warcnt').html(toPretty(result.avgWar));
|
$('#result_warcnt').html(toPretty(result.avgWar));
|
||||||
$('#result_phase').html(toPretty(result.phase));
|
$('#result_phase').html(toPretty(result.phase));
|
||||||
$('#result_killed').html(toPretty(result.killed));
|
$('#result_killed').html(toPretty(result.killed));
|
||||||
if(result.minKilled != result.maxKilled){
|
if (result.minKilled != result.maxKilled) {
|
||||||
$('#result_maxKilled').html(toPretty(result.maxKilled));
|
$('#result_maxKilled').html(toPretty(result.maxKilled));
|
||||||
$('#result_minKilled').html(toPretty(result.minKilled));
|
$('#result_minKilled').html(toPretty(result.minKilled));
|
||||||
$('#result_varKilled').show();
|
$('#result_varKilled').show();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$('#result_varKilled').hide();
|
$('#result_varKilled').hide();
|
||||||
}
|
}
|
||||||
$('#result_dead').html(toPretty(result.dead));
|
$('#result_dead').html(toPretty(result.dead));
|
||||||
if(result.minDead != result.maxDead){
|
if (result.minDead != result.maxDead) {
|
||||||
$('#result_maxDead').html(toPretty(result.maxDead));
|
$('#result_maxDead').html(toPretty(result.maxDead));
|
||||||
$('#result_minDead').html(toPretty(result.minDead));
|
$('#result_minDead').html(toPretty(result.minDead));
|
||||||
$('#result_varDead').show();
|
$('#result_varDead').show();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$('#result_varDead').hide();
|
$('#result_varDead').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -710,7 +734,7 @@ jQuery(function($){
|
|||||||
|
|
||||||
var $summary = $('#battle_result_summary');
|
var $summary = $('#battle_result_summary');
|
||||||
|
|
||||||
$.each(result.defendersSkills, function(idx, defenderSkills){
|
$.each(result.defendersSkills, function(idx, defenderSkills) {
|
||||||
console.log(defenderSkills);
|
console.log(defenderSkills);
|
||||||
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
|
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
|
||||||
$result.find('td').html(parseSkillCount(defenderSkills));
|
$result.find('td').html(parseSkillCount(defenderSkills));
|
||||||
@@ -722,35 +746,35 @@ jQuery(function($){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var beginBattle = function(){
|
var beginBattle = function() {
|
||||||
var data = extendAllDataForDB(exportAllData());
|
var data = extendAllDataForDB(exportAllData());
|
||||||
console.log(data);
|
console.log(data);
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type:'post',
|
type: 'post',
|
||||||
url:'j_simulate_battle.php',
|
url: 'j_simulate_battle.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
action:'battle',
|
action: 'battle',
|
||||||
query:JSON.stringify(data),
|
query: JSON.stringify(data),
|
||||||
}
|
}
|
||||||
}).then(function(result){
|
}).then(function(result) {
|
||||||
console.log(result);
|
console.log(result);
|
||||||
if(!result.result){
|
if (!result.result) {
|
||||||
alert(result.reason);
|
alert(result.reason);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showBattleResult(result);
|
showBattleResult(result);
|
||||||
|
|
||||||
}, function(result){
|
}, function(result) {
|
||||||
alert('전투 개시 실패!');
|
alert('전투 개시 실패!');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var reorderDefender = function(defenderOrder){
|
var reorderDefender = function(defenderOrder) {
|
||||||
$.each(defenderOrder, function(idx, generalNo){
|
$.each(defenderOrder, function(idx, generalNo) {
|
||||||
|
|
||||||
if(!(generalNo in defenderNoList)){
|
if (!(generalNo in defenderNoList)) {
|
||||||
//음..?
|
//음..?
|
||||||
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
|
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
|
||||||
return true;
|
return true;
|
||||||
@@ -762,39 +786,147 @@ jQuery(function($){
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
var requestReorderDefender = function(){
|
var requestReorderDefender = function() {
|
||||||
var data = extendAllDataForDB(exportAllData());
|
var data = extendAllDataForDB(exportAllData());
|
||||||
console.log(data);
|
console.log(data);
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type:'post',
|
type: 'post',
|
||||||
url:'j_simulate_battle.php',
|
url: 'j_simulate_battle.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
action:'reorder',
|
action: 'reorder',
|
||||||
query:JSON.stringify(data),
|
query: JSON.stringify(data),
|
||||||
}
|
}
|
||||||
}).then(function(result){
|
}).then(function(result) {
|
||||||
console.log(result);
|
console.log(result);
|
||||||
if(!result.result){
|
if (!result.result) {
|
||||||
alert(result.reason);
|
alert(result.reason);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reorderDefender(result.order);
|
reorderDefender(result.order);
|
||||||
|
|
||||||
}, function(result){
|
}, function(result) {
|
||||||
alert('재정렬 실패!');
|
alert('재정렬 실패!');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var initGeneralList = false;
|
||||||
|
|
||||||
|
$('#importFromDB').click(function() {
|
||||||
|
var generalID = $('#modalSelector').val();
|
||||||
|
console.log(generalID);
|
||||||
|
|
||||||
|
|
||||||
|
$.post({
|
||||||
|
url: 'j_export_simulator_object.php',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
destGeneralID: generalID
|
||||||
|
}
|
||||||
|
}).then(function(data) {
|
||||||
|
|
||||||
|
if (!data.result) {
|
||||||
|
alert(data.reason);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $modal = $('#importModal');
|
||||||
|
var $card = $modal.data('target');
|
||||||
|
importGeneralInfo($card, data.general);
|
||||||
|
|
||||||
|
$modal.modal('hide');
|
||||||
|
}, errUnknown);
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#importModal').on('show.bs.modal', function(e) {
|
||||||
|
if (!initGeneralList) {
|
||||||
|
var $list = $('#modalSelector');
|
||||||
|
|
||||||
|
var addNation = function(generalList, nationName, color) {
|
||||||
|
|
||||||
|
generalList.sort(function(lhs, rhs) {
|
||||||
|
if (lhs.npc != rhs.npc) {
|
||||||
|
return lhs.npc - rhs.npc;
|
||||||
|
}
|
||||||
|
if (lhs.name < rhs.name) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (lhs.name > rhs.name) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
var $optGroup = $('<optgroup label="{0}"></optgroup>'.format(nationName));
|
||||||
|
$optGroup.css('background-color', color);
|
||||||
|
$optGroup.css('color', isBrightColor(color) ? 'black' : 'white');
|
||||||
|
|
||||||
|
$.each(generalList, function(idx, general) {
|
||||||
|
$item = $('<option value="{0}">{1}</option>'.format(general.no, general.name));
|
||||||
|
if (general.npc) {
|
||||||
|
$item.css('color', getNpcColor(general.npc));
|
||||||
|
} else {
|
||||||
|
$item.css('color', 'white');
|
||||||
|
}
|
||||||
|
$item.css('background-color', 'black');
|
||||||
|
$optGroup.append($item);
|
||||||
|
|
||||||
|
});
|
||||||
|
$list.append($optGroup);
|
||||||
|
}
|
||||||
|
$.post({
|
||||||
|
url: 'j_get_basic_general_list.php',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
req: 2,
|
||||||
|
}
|
||||||
|
}).then(function(data) {
|
||||||
|
if (!data.result) {
|
||||||
|
alert(data.reason);
|
||||||
|
$('#importModal').modal('hide');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var nations = data.nation;
|
||||||
|
var myNationID = data.nationID;
|
||||||
|
|
||||||
|
$list.empty();
|
||||||
|
//자국 먼저
|
||||||
|
|
||||||
|
if (0 in data.list) {
|
||||||
|
nations[0] = {
|
||||||
|
nation: 0,
|
||||||
|
name: '재야',
|
||||||
|
color: '#000000'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
addNation(combineArray(data.list[myNationID], data.column), nations[myNationID].name, nations[myNationID].color);
|
||||||
|
|
||||||
|
for (var nationID in data.list) {
|
||||||
|
if (nationID == myNationID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
addNation(combineArray(data.list[nationID], data.column), nations[nationID].name, nations[nationID].color);
|
||||||
|
}
|
||||||
|
initGeneralList = true;
|
||||||
|
}, errUnknown);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
initBasicEvent();
|
initBasicEvent();
|
||||||
$attackerCard.append($generalForm.clone(true,true));
|
$attackerCard.append($generalForm.clone(true, true));
|
||||||
addDefender();
|
addDefender();
|
||||||
|
|
||||||
$('.btn-begin_battle').click(function(){
|
$('.btn-begin_battle').click(function() {
|
||||||
beginBattle();
|
beginBattle();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn-reorder_defender').click(function(){
|
$('.btn-reorder_defender').click(function() {
|
||||||
requestReorderDefender();
|
requestReorderDefender();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
+66
-72
@@ -1,26 +1,26 @@
|
|||||||
function changePermission(isAmbassador, rawGeneralList){
|
function changePermission(isAmbassador, rawGeneralList) {
|
||||||
console.log(isAmbassador);
|
console.log(isAmbassador);
|
||||||
console.log(rawGeneralList);
|
console.log(rawGeneralList);
|
||||||
|
|
||||||
var generalList = [];
|
var generalList = [];
|
||||||
$.each(rawGeneralList, function(idx, value){
|
$.each(rawGeneralList, function(idx, value) {
|
||||||
generalList.push(parseInt(value.id));
|
generalList.push(parseInt(value.id));
|
||||||
})
|
})
|
||||||
|
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_general_set_permission.php',
|
url: 'j_general_set_permission.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
isAmbassador:isAmbassador,
|
isAmbassador: isAmbassador,
|
||||||
genlist:generalList
|
genlist: generalList
|
||||||
},
|
},
|
||||||
}).then(function(data){
|
}).then(function(data) {
|
||||||
if(!data){
|
if (!data) {
|
||||||
alert('변경하지 못했습니다.');
|
alert('변경하지 못했습니다.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(!data.result){
|
if (!data.result) {
|
||||||
alert('변경하지 못했습니다. : '+data.reason);
|
alert('변경하지 못했습니다. : ' + data.reason);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
alert('변경했습니다.');
|
alert('변경했습니다.');
|
||||||
@@ -28,19 +28,19 @@ function changePermission(isAmbassador, rawGeneralList){
|
|||||||
}, errUnknown);
|
}, errUnknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
$(function(){
|
$(function() {
|
||||||
$('#selectAmbassador').select2({
|
$('#selectAmbassador').select2({
|
||||||
theme: 'bootstrap4',
|
theme: 'bootstrap4',
|
||||||
placeholder: "",
|
placeholder: "",
|
||||||
allowClear: true,
|
allowClear: true,
|
||||||
language: "ko",
|
language: "ko",
|
||||||
width:300,
|
width: 300,
|
||||||
maximumSelectionLength: 2,
|
maximumSelectionLength: 2,
|
||||||
containerCss: {
|
containerCss: {
|
||||||
display: "inline-block !important;",
|
display: "inline-block !important;",
|
||||||
color: 'white !important'
|
color: 'white !important'
|
||||||
},
|
},
|
||||||
data:candidateAmbassadors,
|
data: candidateAmbassadors,
|
||||||
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
});
|
});
|
||||||
@@ -50,19 +50,19 @@ $(function(){
|
|||||||
placeholder: "",
|
placeholder: "",
|
||||||
allowClear: true,
|
allowClear: true,
|
||||||
language: "ko",
|
language: "ko",
|
||||||
width:300,
|
width: 300,
|
||||||
maximumSelectionLength: 2,
|
maximumSelectionLength: 2,
|
||||||
containerCss: {
|
containerCss: {
|
||||||
display: "inline-block !important;",
|
display: "inline-block !important;",
|
||||||
color: 'white !important'
|
color: 'white !important'
|
||||||
},
|
},
|
||||||
data:candidateAuditors,
|
data: candidateAuditors,
|
||||||
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#changeAmbassador').click(function(){
|
$('#changeAmbassador').click(function() {
|
||||||
if(!confirm('외교권자를 변경할까요?')){
|
if (!confirm('외교권자를 변경할까요?')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +70,8 @@ $(function(){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#changeAuditor').click(function(){
|
$('#changeAuditor').click(function() {
|
||||||
if(!confirm('조언자를 변경할까요?')){
|
if (!confirm('조언자를 변경할까요?')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,31 +79,31 @@ $(function(){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#btn_kick').click(function(){
|
$('#btn_kick').click(function() {
|
||||||
var $kickSelect = $('#genlist_kick option:selected');
|
var $kickSelect = $('#genlist_kick option:selected');
|
||||||
var generalID = $kickSelect.val();
|
var generalID = $kickSelect.val();
|
||||||
if(!generalID){
|
if (!generalID) {
|
||||||
alert('장수를 선택해주세요');
|
alert('장수를 선택해주세요');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var generalName = $kickSelect.data('name');
|
var generalName = $kickSelect.data('name');
|
||||||
if(!confirm('{0}를 추방하시겠습니까?'.format(generalName))){
|
if (!confirm('{0}를 추방하시겠습니까?'.format(generalName))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_myBossInfo.php',
|
url: 'j_myBossInfo.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
action:'추방',
|
action: '추방',
|
||||||
destGeneralID:generalID
|
destGeneralID: generalID
|
||||||
},
|
},
|
||||||
}).then(function(data){
|
}).then(function(data) {
|
||||||
if(!data){
|
if (!data) {
|
||||||
alert('추방하지 못했습니다.');
|
alert('추방하지 못했습니다.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(!data.result){
|
if (!data.result) {
|
||||||
alert('추방하지 못했습니다. : '+data.reason);
|
alert('추방하지 못했습니다. : ' + data.reason);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
alert('{0}를 추방했습니다.'.format(generalName));
|
alert('{0}를 추방했습니다.'.format(generalName));
|
||||||
@@ -112,7 +112,7 @@ $(function(){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.btn_appoint').click(function(){
|
$('.btn_appoint').click(function() {
|
||||||
var $btn = $(this);
|
var $btn = $(this);
|
||||||
var officerLevel = $btn.data('officer_level');
|
var officerLevel = $btn.data('officer_level');
|
||||||
var officerLevelText = $btn.data('officer_level_text');
|
var officerLevelText = $btn.data('officer_level_text');
|
||||||
@@ -121,76 +121,70 @@ $(function(){
|
|||||||
var $generalSelect = $('#genlist_{0} option:selected'.format(officerLevel));
|
var $generalSelect = $('#genlist_{0} option:selected'.format(officerLevel));
|
||||||
var $citySelect = $('#citylist_{0} option:selected'.format(officerLevel));
|
var $citySelect = $('#citylist_{0} option:selected'.format(officerLevel));
|
||||||
|
|
||||||
var generalID = $generalSelect.val();
|
var generalID = parseInt($generalSelect.val());
|
||||||
var generalName = $generalSelect.data('name');
|
var generalName = $generalSelect.data('name');
|
||||||
var generalOfficerLevel = $generalSelect.data('officer_level');
|
var generalOfficerLevel = $generalSelect.data('officer_level');
|
||||||
|
|
||||||
|
|
||||||
if(officerLevel >= 5){
|
if (officerLevel >= 5) {
|
||||||
if(generalID == 0){
|
if (generalID == 0) {
|
||||||
if(!confirm('{0}직을 비우시겠습니까?'.format(officerLevelText))){
|
if (!confirm('{0}직을 비우시겠습니까?'.format(officerLevelText))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (generalOfficerLevel >= 5) {
|
||||||
|
if (!confirm('이미 수뇌인 {0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!confirm('{0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(generalOfficerLevel >= 5){
|
} else {
|
||||||
if(!confirm('이미 수뇌인 {0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if(!confirm('{0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
cityID = $citySelect.val();
|
cityID = $citySelect.val();
|
||||||
if(!cityID){
|
if (!cityID) {
|
||||||
alert('도시를 선택해주세요');
|
alert('도시를 선택해주세요');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cityName = $citySelect.find('option:selected .name_field').text();
|
cityName = $citySelect.find('option:selected .name_field').text();
|
||||||
|
|
||||||
if(generalID == 0){
|
if (generalID == 0) {
|
||||||
if(!confirm('{0} {1}직을 비우시겠습니까?'.format(cityName, officerLevelText))){
|
if (!confirm('{0} {1}직을 비우시겠습니까?'.format(cityName, officerLevelText))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
} else if (generalOfficerLevel >= 5) {
|
||||||
else if(generalOfficerLevel >= 5){
|
if (!confirm('수뇌인 {0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))) {
|
||||||
if(!confirm('수뇌인 {0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))){
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
if (!confirm('{0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))) {
|
||||||
if(!confirm('{0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))){
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_myBossInfo.php',
|
url: 'j_myBossInfo.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
action:'임명',
|
action: '임명',
|
||||||
destGeneralID:generalID,
|
destGeneralID: generalID,
|
||||||
destCityID:cityID,
|
destCityID: cityID,
|
||||||
officerLevel:officerLevel
|
officerLevel: officerLevel
|
||||||
},
|
},
|
||||||
}).then(function(data){
|
}).then(function(data) {
|
||||||
if(!data){
|
if (!data) {
|
||||||
alert('임명하지 못했습니다.');
|
alert('임명하지 못했습니다.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(!data.result){
|
if (!data.result) {
|
||||||
alert('임명하지 못했습니다. : '+data.reason);
|
alert('임명하지 못했습니다. : ' + data.reason);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(generalID){
|
if (generalID) {
|
||||||
alert('{0}을(를) 임명했습니다.'.format(generalName));
|
alert('{0}을(를) 임명했습니다.'.format(generalName));
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
alert('관직을 비웠습니다.');
|
alert('관직을 비웠습니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+29
-9
@@ -65,18 +65,35 @@ function reloadTable(){
|
|||||||
filledChiefList[chiefIdx] = true;
|
filledChiefList[chiefIdx] = true;
|
||||||
|
|
||||||
var plateObj = chiefTableObj[chiefIdx];
|
var plateObj = chiefTableObj[chiefIdx];
|
||||||
var $name = $('<span>{0}</span>'.format(chiefInfo.name));
|
if(chiefInfo.name){
|
||||||
var nameColor = getNpcColor(chiefInfo.npcType);
|
var $name = $('<span>{0}</span>'.format(chiefInfo.name));
|
||||||
if(nameColor){
|
var nameColor = getNpcColor(chiefInfo.npcType);
|
||||||
$name.css('color',nameColor);
|
if(nameColor){
|
||||||
|
$name.css('color',nameColor);
|
||||||
|
}
|
||||||
|
plateObj.name.html($name);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
plateObj.name.html('');
|
||||||
}
|
}
|
||||||
plateObj.officerLevelText.text(chiefInfo.officerLevelText);
|
|
||||||
plateObj.name.html($name);
|
|
||||||
|
|
||||||
var turnTimeObj = moment(chiefInfo.turnTime);
|
plateObj.officerLevelText.text(chiefInfo.officerLevelText);
|
||||||
|
|
||||||
|
if(chiefInfo.turnTime){
|
||||||
|
var turnTimeObj = moment(chiefInfo.turnTime);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var turnTimeObj = null;
|
||||||
|
}
|
||||||
var turnList = plateObj.turn;
|
var turnList = plateObj.turn;
|
||||||
$.each(chiefInfo.turn, function(turnIdx, turnText){
|
$.each(chiefInfo.turn, function(turnIdx, turnText){
|
||||||
turnList[turnIdx].turnTime.text(turnTimeObj.format('hh:mm'));
|
if(turnTimeObj){
|
||||||
|
turnList[turnIdx].turnTime.text(turnTimeObj.format('HH:mm'));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
turnList[turnIdx].turnTime.text('');
|
||||||
|
}
|
||||||
|
|
||||||
turnList[turnIdx].turnText.html(turnText).css('font-size', '13px');
|
turnList[turnIdx].turnText.html(turnText).css('font-size', '13px');
|
||||||
var oWidth = turnList[turnIdx].turnPad.innerWidth();
|
var oWidth = turnList[turnIdx].turnPad.innerWidth();
|
||||||
var iWidth = turnList[turnIdx].turnText.outerWidth();
|
var iWidth = turnList[turnIdx].turnText.outerWidth();
|
||||||
@@ -84,7 +101,10 @@ function reloadTable(){
|
|||||||
var newFontSize = 13 * oWidth / iWidth * 0.9;
|
var newFontSize = 13 * oWidth / iWidth * 0.9;
|
||||||
turnList[turnIdx].turnText.css('font-size', '{0}px'.format(newFontSize));
|
turnList[turnIdx].turnText.css('font-size', '{0}px'.format(newFontSize));
|
||||||
}
|
}
|
||||||
turnTimeObj = turnTimeObj.add(turnTerm, 'minute');
|
if(turnTimeObj){
|
||||||
|
turnTimeObj = turnTimeObj.add(turnTerm, 'minute');
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
+125
-99
@@ -3,8 +3,8 @@
|
|||||||
* @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
* @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
||||||
* @param {string} string escape하고자 하는 문자열
|
* @param {string} string escape하고자 하는 문자열
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
var escapeHtml = (function (string) {
|
var escapeHtml = (function(string) {
|
||||||
var entityMap = {
|
var entityMap = {
|
||||||
'&': '&',
|
'&': '&',
|
||||||
'<': '<',
|
'<': '<',
|
||||||
@@ -32,58 +32,70 @@ function isInt(n) {
|
|||||||
return +n === n && !(n % 1);
|
return +n === n && !(n % 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
;(function(ns){
|
;
|
||||||
|
(function(ns) {
|
||||||
//https://gist.github.com/demouth/3217440
|
//https://gist.github.com/demouth/3217440
|
||||||
/**
|
/**
|
||||||
* mb_strwidth
|
* mb_strwidth
|
||||||
* @param String
|
* @param String
|
||||||
* @return int
|
* @return int
|
||||||
* @see http://php.net/manual/ja/function.mb-strwidth.php
|
* @see http://php.net/manual/ja/function.mb-strwidth.php
|
||||||
*/
|
*/
|
||||||
var mb_strwidth = function(str){
|
var mb_strwidth = function(str) {
|
||||||
var i=0,l=str.length,c='',length=0;
|
var i = 0,
|
||||||
for(;i<l;i++){
|
l = str.length,
|
||||||
c=str.charCodeAt(i);
|
c = '',
|
||||||
if(0x0000<=c&&c<=0x0019){
|
length = 0;
|
||||||
length += 0;
|
for (; i < l; i++) {
|
||||||
}else if(0x0020<=c&&c<=0x1FFF){
|
c = str.charCodeAt(i);
|
||||||
length += 1;
|
if (0x0000 <= c && c <= 0x0019) {
|
||||||
}else if(0x2000<=c&&c<=0xFF60){
|
length += 0;
|
||||||
length += 2;
|
} else if (0x0020 <= c && c <= 0x1FFF) {
|
||||||
}else if(0xFF61<=c&&c<=0xFF9F){
|
length += 1;
|
||||||
length += 1;
|
} else if (0x2000 <= c && c <= 0xFF60) {
|
||||||
}else if(0xFFA0<=c){
|
length += 2;
|
||||||
length += 2;
|
} else if (0xFF61 <= c && c <= 0xFF9F) {
|
||||||
}
|
length += 1;
|
||||||
}
|
} else if (0xFFA0 <= c) {
|
||||||
return length;
|
length += 2;
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mb_strimwidth
|
* mb_strimwidth
|
||||||
* @param String
|
* @param String
|
||||||
* @param int
|
* @param int
|
||||||
* @param int
|
* @param int
|
||||||
* @param String
|
* @param String
|
||||||
* @return String
|
* @return String
|
||||||
* @see http://www.php.net/manual/ja/function.mb-strimwidth.php
|
* @see http://www.php.net/manual/ja/function.mb-strimwidth.php
|
||||||
*/
|
*/
|
||||||
var mb_strimwidth = function(str,start,width,trimmarker){
|
var mb_strimwidth = function(str, start, width, trimmarker) {
|
||||||
if(typeof trimmarker === 'undefined') trimmarker='';
|
if (typeof trimmarker === 'undefined') trimmarker = '';
|
||||||
var trimmakerWidth = mb_strwidth(trimmarker),i=start,l=str.length,trimmedLength=0,trimmedStr='';
|
var trimmakerWidth = mb_strwidth(trimmarker),
|
||||||
for(;i<l;i++){
|
i = start,
|
||||||
var charCode=str.charCodeAt(i),c=str.charAt(i),charWidth=mb_strwidth(c),next=str.charAt(i+1),nextWidth=mb_strwidth(next);
|
l = str.length,
|
||||||
trimmedLength += charWidth;
|
trimmedLength = 0,
|
||||||
trimmedStr += c;
|
trimmedStr = '';
|
||||||
if(trimmedLength+trimmakerWidth+nextWidth>width){
|
for (; i < l; i++) {
|
||||||
trimmedStr += trimmarker;
|
var charCode = str.charCodeAt(i),
|
||||||
break;
|
c = str.charAt(i),
|
||||||
}
|
charWidth = mb_strwidth(c),
|
||||||
}
|
next = str.charAt(i + 1),
|
||||||
return trimmedStr;
|
nextWidth = mb_strwidth(next);
|
||||||
};
|
trimmedLength += charWidth;
|
||||||
ns.mb_strwidth = mb_strwidth;
|
trimmedStr += c;
|
||||||
ns.mb_strimwidth = mb_strimwidth;
|
if (trimmedLength + trimmakerWidth + nextWidth > width) {
|
||||||
|
trimmedStr += trimmarker;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return trimmedStr;
|
||||||
|
};
|
||||||
|
ns.mb_strwidth = mb_strwidth;
|
||||||
|
ns.mb_strimwidth = mb_strimwidth;
|
||||||
})(window);
|
})(window);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,7 +105,7 @@ function isInt(n) {
|
|||||||
*/
|
*/
|
||||||
function convertDictById(arr) {
|
function convertDictById(arr) {
|
||||||
var result = {};
|
var result = {};
|
||||||
arr.forEach(function (v, i) {
|
arr.forEach(function(v, i) {
|
||||||
result[v.id] = v;
|
result[v.id] = v;
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
@@ -106,7 +118,7 @@ function convertDictById(arr) {
|
|||||||
*/
|
*/
|
||||||
function convertSet(arr) {
|
function convertSet(arr) {
|
||||||
var result = {};
|
var result = {};
|
||||||
arr.forEach(function (v) {
|
arr.forEach(function(v) {
|
||||||
result[v] = true;
|
result[v] = true;
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
@@ -115,7 +127,7 @@ function convertSet(arr) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* {0}, {1}, {2}형태로 포맷해주는 함수
|
* {0}, {1}, {2}형태로 포맷해주는 함수
|
||||||
*/
|
*/
|
||||||
String.prototype.format = function() {
|
String.prototype.format = function() {
|
||||||
var args = arguments;
|
var args = arguments;
|
||||||
return this.replace(/{(\d+)}/g, function(match, number) {
|
return this.replace(/{(\d+)}/g, function(match, number) {
|
||||||
@@ -134,12 +146,11 @@ function hexToRgb(hex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function isBrightColor(color){
|
function isBrightColor(color) {
|
||||||
color = hexToRgb(color);
|
color = hexToRgb(color);
|
||||||
if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){
|
if ((color.r * 0.299 + color.g * 0.587 + color.b * 0.114) > 140) {
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,7 +188,7 @@ function numberWithCommas(x) {
|
|||||||
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||||
}
|
}
|
||||||
|
|
||||||
function linkifyStrWithOpt(text){
|
function linkifyStrWithOpt(text) {
|
||||||
return linkifyStr(text, {});
|
return linkifyStr(text, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,14 +199,14 @@ function linkifyStrWithOpt(text){
|
|||||||
* @param {object} options
|
* @param {object} options
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
var TemplateEngine = function (html, options) {
|
var TemplateEngine = function(html, options) {
|
||||||
var re = /<%(.+?)%>/g,
|
var re = /<%(.+?)%>/g,
|
||||||
reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g,
|
reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g,
|
||||||
code = 'with(obj) { var r=[];\n',
|
code = 'with(obj) { var r=[];\n',
|
||||||
cursor = 0,
|
cursor = 0,
|
||||||
result,
|
result,
|
||||||
match;
|
match;
|
||||||
var add = function (line, js) {
|
var add = function(line, js) {
|
||||||
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
|
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
|
||||||
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
|
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
|
||||||
return add;
|
return add;
|
||||||
@@ -208,82 +219,97 @@ var TemplateEngine = function (html, options) {
|
|||||||
}
|
}
|
||||||
add(html.substr(cursor, html.length - cursor));
|
add(html.substr(cursor, html.length - cursor));
|
||||||
code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' ');
|
code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' ');
|
||||||
try { result = new Function('obj', code).apply(options, [options]); }
|
try { result = new Function('obj', code).apply(options, [options]); } catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
|
||||||
catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIconPath(imgsvr, picture){
|
function getIconPath(imgsvr, picture) {
|
||||||
// ../d_shared/common_path.js 필요
|
// ../d_shared/common_path.js 필요
|
||||||
if(!imgsvr){
|
if (!imgsvr) {
|
||||||
return pathConfig.sharedIcon+'/'+picture;
|
return pathConfig.sharedIcon + '/' + picture;
|
||||||
}
|
} else {
|
||||||
else{
|
return pathConfig.root + '/d_pic/' + picture;
|
||||||
return pathConfig.root+'/d_pic/'+picture;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function activeFlip($obj){
|
function activeFlip($obj) {
|
||||||
var $result;
|
var $result;
|
||||||
if($obj === undefined){
|
if ($obj === undefined) {
|
||||||
$result = $('img[data-flip]');
|
$result = $('img[data-flip]');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$result = $obj.find('img[data-flip]');
|
$result = $obj.find('img[data-flip]');
|
||||||
}
|
}
|
||||||
|
|
||||||
$result.each(function(){
|
$result.each(function() {
|
||||||
activeFlipItem($(this));
|
activeFlipItem($(this));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function activeFlipItem($img){
|
function combineObject(item, columnList) {
|
||||||
|
var newItem = {};
|
||||||
|
for (var columnIdx in columnList) {
|
||||||
|
var columnName = columnList[columnIdx];
|
||||||
|
newItem[columnName] = item[columnIdx];
|
||||||
|
}
|
||||||
|
return newItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
function combineArray(array, columnList) {
|
||||||
|
var result = [];
|
||||||
|
for (var key in array) {
|
||||||
|
var item = array[key];
|
||||||
|
result[key] = combineObject(item, columnList);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function activeFlipItem($img) {
|
||||||
var imageList = [];
|
var imageList = [];
|
||||||
imageList.push($img.attr('src'));
|
imageList.push($img.attr('src'));
|
||||||
$.each($img.data('flip').split(','), function(idx, value){
|
$.each($img.data('flip').split(','), function(idx, value) {
|
||||||
var value = $.trim(value);
|
var value = $.trim(value);
|
||||||
if(!value){
|
if (!value) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
imageList.push(value);
|
imageList.push(value);
|
||||||
});
|
});
|
||||||
if(imageList.length <= 1){
|
if (imageList.length <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$img.data('computed_flip_array', imageList);
|
$img.data('computed_flip_array', imageList);
|
||||||
$img.data('computed_flip_idx', 0);
|
$img.data('computed_flip_idx', 0);
|
||||||
|
|
||||||
$img.click(function(){
|
$img.click(function() {
|
||||||
var arr = $img.data('computed_flip_array');
|
var arr = $img.data('computed_flip_array');
|
||||||
var idx = $img.data('computed_flip_idx');
|
var idx = $img.data('computed_flip_idx');
|
||||||
idx = (idx + 1)%(arr.length);
|
idx = (idx + 1) % (arr.length);
|
||||||
$img.attr('src', arr[idx]);
|
$img.attr('src', arr[idx]);
|
||||||
$img.data('computed_flip_idx', idx);
|
$img.data('computed_flip_idx', idx);
|
||||||
});
|
});
|
||||||
$img.css('cursor','pointer');
|
$img.css('cursor', 'pointer');
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery(function($){
|
jQuery(function($) {
|
||||||
$('.obj_tooltip').mouseover(function(){
|
$('.obj_tooltip').mouseover(function() {
|
||||||
var $objTooltip = $(this);
|
var $objTooltip = $(this);
|
||||||
if($objTooltip.data('setObjTooltip')){
|
if ($objTooltip.data('setObjTooltip')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tooltipClassText = $objTooltip.data('tooltip-class');
|
var tooltipClassText = $objTooltip.data('tooltip-class');
|
||||||
if(!tooltipClassText){
|
if (!tooltipClassText) {
|
||||||
tooltipClassText = '';
|
tooltipClassText = '';
|
||||||
}
|
}
|
||||||
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
|
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
|
||||||
.format(tooltipClassText);
|
.format(tooltipClassText);
|
||||||
|
|
||||||
$objTooltip.tooltip({
|
$objTooltip.tooltip({
|
||||||
title:function(){
|
title: function() {
|
||||||
return $.trim($(this).find('.tooltiptext').html());
|
return $.trim($(this).find('.tooltiptext').html());
|
||||||
},
|
},
|
||||||
template:template,
|
template: template,
|
||||||
html:true
|
html: true
|
||||||
}).tooltip('show');
|
}).tooltip('show');
|
||||||
|
|
||||||
$objTooltip.data('setObjTooltip', true);
|
$objTooltip.data('setObjTooltip', true);
|
||||||
@@ -297,7 +323,7 @@ jQuery(function($){
|
|||||||
activeFlip();
|
activeFlip();
|
||||||
|
|
||||||
var customCSS = localStorage.getItem('sam_customCSS');
|
var customCSS = localStorage.getItem('sam_customCSS');
|
||||||
if(customCSS){
|
if (customCSS) {
|
||||||
var $style = $('<style type="text/css"></style>');
|
var $style = $('<style type="text/css"></style>');
|
||||||
$style.text(customCSS);
|
$style.text(customCSS);
|
||||||
$style.appendTo($('head'));
|
$style.appendTo($('head'));
|
||||||
@@ -307,11 +333,11 @@ jQuery(function($){
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function errUnknown(){
|
function errUnknown() {
|
||||||
alert('작업을 실패했습니다.');
|
alert('작업을 실패했습니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
function errUnknownToast(){
|
function errUnknownToast() {
|
||||||
$.toast({
|
$.toast({
|
||||||
title: '에러!',
|
title: '에러!',
|
||||||
content: '작업을 실패했습니다.',
|
content: '작업을 실패했습니다.',
|
||||||
@@ -320,8 +346,8 @@ function errUnknownToast(){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function quickReject(errMsg){
|
function quickReject(errMsg) {
|
||||||
if(errMsg === undefined){
|
if (errMsg === undefined) {
|
||||||
errMsg = '작업을 실패했습니다.';
|
errMsg = '작업을 실패했습니다.';
|
||||||
}
|
}
|
||||||
var deferred = $.Deferred();
|
var deferred = $.Deferred();
|
||||||
@@ -329,8 +355,8 @@ function quickReject(errMsg){
|
|||||||
return deferred.promise();
|
return deferred.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
function nl2br(text){
|
function nl2br(text) {
|
||||||
return text.replace(/\n/g,"<br>");
|
return text.replace(/\n/g, "<br>");
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
function br2nl (text) {
|
function br2nl (text) {
|
||||||
@@ -338,11 +364,11 @@ function br2nl (text) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function getNpcColor(npcType){
|
function getNpcColor(npcType) {
|
||||||
if(npcType >= 2){
|
if (npcType >= 2) {
|
||||||
return 'cyan';
|
return 'cyan';
|
||||||
}
|
}
|
||||||
if(npcType == 1){
|
if (npcType == 1) {
|
||||||
return 'skyblue';
|
return 'skyblue';
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
$(function(){
|
$(function() {
|
||||||
var $target = $("#destCityID");
|
var $target = $("#destCityID");
|
||||||
reloadWorldMap({
|
reloadWorldMap({
|
||||||
isDetailMap:false,
|
isDetailMap: false,
|
||||||
clickableAll:true,
|
clickableAll: true,
|
||||||
neutralView:true,
|
neutralView: true,
|
||||||
useCachedMap:true,
|
useCachedMap: true,
|
||||||
selectCallback:function(city){
|
selectCallback: function(city) {
|
||||||
var currVal = $target.val();
|
var currVal = $target.val();
|
||||||
$target.val(city.id);
|
$target.val(city.id).trigger("change");
|
||||||
if($target.val() === null){
|
if ($target.val() === null) {
|
||||||
$target.val(currVal);
|
$target.val(currVal).trigger("change");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
$(function(){
|
$(function() {
|
||||||
var $target = $("#destNationID");
|
var $target = $("#destNationID");
|
||||||
reloadWorldMap({
|
reloadWorldMap({
|
||||||
isDetailMap:false,
|
isDetailMap: false,
|
||||||
clickableAll:true,
|
clickableAll: true,
|
||||||
neutralView:true,
|
neutralView: true,
|
||||||
useCachedMap:true,
|
useCachedMap: true,
|
||||||
selectCallback:function(city){
|
selectCallback: function(city) {
|
||||||
var currVal = $target.val();
|
var currVal = $target.val();
|
||||||
$target.val(city.nationId);
|
$target.val(city.nationId).trigger("change");
|
||||||
if($target.val() === null){
|
if ($target.val() === null) {
|
||||||
$target.val(currVal);
|
$target.val(currVal).trigger("change");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -580,13 +580,13 @@ $(function() {
|
|||||||
$this.data('username',name);
|
$this.data('username',name);
|
||||||
|
|
||||||
if(cityList[cityName].$태수.text() == name){
|
if(cityList[cityName].$태수.text() == name){
|
||||||
cityList[cityName].$태수.css('color','lightgreen');
|
cityList[cityName].$태수.html('<span style="color:lightgreen">{0}</span>'.format(name));
|
||||||
}
|
}
|
||||||
if(cityList[cityName].$군사.text() == name){
|
if(cityList[cityName].$군사.text() == name){
|
||||||
cityList[cityName].$군사.css('color','lightgreen');
|
cityList[cityName].$군사.html('<span style="color:lightgreen">{0}</span>'.format(name));
|
||||||
}
|
}
|
||||||
if(cityList[cityName].$종사.text() == name){
|
if(cityList[cityName].$종사.text() == name){
|
||||||
cityList[cityName].$종사.css('color','lightgreen');
|
cityList[cityName].$종사.html('<span style="color:lightgreen">{0}</span>'.format(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
userList[name]={
|
userList[name]={
|
||||||
|
|||||||
+216
-184
@@ -1,8 +1,7 @@
|
|||||||
|
|
||||||
function is_touch_device() {
|
function is_touch_device() {
|
||||||
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
|
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
|
||||||
var mq = function(query) {
|
var mq = function(query) {
|
||||||
return window.matchMedia(query).matches;
|
return window.matchMedia(query).matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) {
|
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) {
|
||||||
@@ -14,32 +13,39 @@ function is_touch_device() {
|
|||||||
// https://git.io/vznFH
|
// https://git.io/vznFH
|
||||||
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
|
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
|
||||||
return mq(query);
|
return mq(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
function reloadWorldMap(option){
|
function reloadWorldMap(option, drawTarget) {
|
||||||
var $world_map = $('.world_map');
|
if (drawTarget === undefined || drawTarget === null) {
|
||||||
|
drawTarget = '.world_map'
|
||||||
|
}
|
||||||
|
var $world_map = $(drawTarget);
|
||||||
|
|
||||||
if($world_map.length == 0){
|
if ($world_map.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultOption = {
|
var defaultOption = {
|
||||||
isDetailMap:true, //복잡 지도, 단순 지도
|
isDetailMap: true, //복잡 지도, 단순 지도
|
||||||
clickableAll:false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
|
clickableAll: false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
|
||||||
selectCallback:null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
|
selectCallback: null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
|
||||||
hrefTemplate:'#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
|
hrefTemplate: '#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
|
||||||
useCachedMap:false, //맵 캐시를 사용
|
useCachedMap: false, //맵 캐시를 사용
|
||||||
|
|
||||||
//아래부터는 post query에 들어갈 녀석
|
//아래부터는 post query에 들어갈 녀석
|
||||||
year:null, //year값, 연감등에 사용
|
year: null, //year값, 연감등에 사용
|
||||||
month:null, //month값, 연감등에 사용
|
month: null, //month값, 연감등에 사용
|
||||||
aux:null, //기타 넣고 싶은 값을 입력
|
aux: null, //기타 넣고 싶은 값을 입력
|
||||||
neutralView:false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
|
neutralView: false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
|
||||||
showMe:true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
|
showMe: true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
|
||||||
targetJson:'j_map.php',
|
|
||||||
|
targetJson: 'j_map.php',
|
||||||
|
reqType: 'post',
|
||||||
|
dynamicMapTheme: false,
|
||||||
|
callback: null,
|
||||||
|
|
||||||
//기타 보조 값
|
//기타 보조 값
|
||||||
startYear:null,
|
startYear: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
option = $.extend(defaultOption, option);
|
option = $.extend(defaultOption, option);
|
||||||
@@ -56,23 +62,23 @@ function reloadWorldMap(option){
|
|||||||
var storedStartYear = 'sam.{0}.startYear'.format(serverNick);
|
var storedStartYear = 'sam.{0}.startYear'.format(serverNick);
|
||||||
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
|
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
|
||||||
|
|
||||||
function checkReturnObject(obj){
|
function checkReturnObject(obj) {
|
||||||
if(!obj.result){
|
if (!obj.result) {
|
||||||
var obj = $.Deferred();
|
var obj = $.Deferred();
|
||||||
obj.reject('fail');
|
obj.reject('fail');
|
||||||
return obj.promise();
|
return obj.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$.isNumeric(obj.startYear)
|
if (!$.isNumeric(obj.startYear) ||
|
||||||
||!$.isNumeric(obj.year)
|
!$.isNumeric(obj.year) ||
|
||||||
||!$.isNumeric(obj.month)
|
!$.isNumeric(obj.month)
|
||||||
){
|
) {
|
||||||
var obj = $.Deferred();
|
var obj = $.Deferred();
|
||||||
obj.reject('fail');
|
obj.reject('fail');
|
||||||
return obj.promise();
|
return obj.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(useCachedMap){
|
if (useCachedMap) {
|
||||||
localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj]));
|
localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj]));
|
||||||
localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear));
|
localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear));
|
||||||
}
|
}
|
||||||
@@ -82,26 +88,40 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setMapBackground(obj){
|
|
||||||
|
|
||||||
|
function setMapBackground(obj) {
|
||||||
|
function setTheme() {
|
||||||
|
var oldTheme = $world_map.data('currentTheme');
|
||||||
|
var newTheme = obj.theme;
|
||||||
|
if (oldTheme === newTheme) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (oldTheme) {
|
||||||
|
$world_map.removeClass('map_theme_' + oldTheme);
|
||||||
|
}
|
||||||
|
$world_map.addClass('map_theme_' + newTheme);
|
||||||
|
$world_map.data('currentTheme', newTheme);
|
||||||
|
}
|
||||||
|
if (option.dynamicMapTheme) {
|
||||||
|
setTheme();
|
||||||
|
}
|
||||||
var startYear = obj.startYear;
|
var startYear = obj.startYear;
|
||||||
var year = obj.year;
|
var year = obj.year;
|
||||||
var month = obj.month;
|
var month = obj.month;
|
||||||
|
|
||||||
if(isDetailMap){
|
if (isDetailMap) {
|
||||||
$world_map.addClass('map_detail').removeClass('map_basic');
|
$world_map.addClass('map_detail').removeClass('map_basic');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$world_map.addClass('map_basic').removeClass('map_detail');
|
$world_map.addClass('map_basic').removeClass('map_detail');
|
||||||
}
|
}
|
||||||
|
|
||||||
var $map_title = $('.map_title_text');
|
var $map_title = $('.map_title_text');
|
||||||
if(year < startYear + 1){
|
if (year < startYear + 1) {
|
||||||
$map_title.css('color', 'magenta');
|
$map_title.css('color', 'magenta');
|
||||||
}
|
} else if (year < startYear + 2) {
|
||||||
else if(year < startYear + 2){
|
|
||||||
$map_title.css('color', 'orange');
|
$map_title.css('color', 'orange');
|
||||||
}
|
} else if (year < startYear + 3) {
|
||||||
else if(year < startYear + 3){
|
|
||||||
$map_title.css('color', 'yellow');
|
$map_title.css('color', 'yellow');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,17 +129,17 @@ function reloadWorldMap(option){
|
|||||||
$map_title_tooltip.empty();
|
$map_title_tooltip.empty();
|
||||||
|
|
||||||
var tooltipTexts = [];
|
var tooltipTexts = [];
|
||||||
if(year < startYear + 3){
|
if (year < startYear + 3) {
|
||||||
var startYearText = [];
|
var startYearText = [];
|
||||||
var remainYear = startYear + 3 - year;
|
var remainYear = startYear + 3 - year;
|
||||||
var remainMonth = 12 - month + 1;
|
var remainMonth = 12 - month + 1;
|
||||||
if(remainMonth > 0){
|
if (remainMonth > 0) {
|
||||||
remainYear -= 1;
|
remainYear -= 1;
|
||||||
}
|
}
|
||||||
if(remainYear){
|
if (remainYear) {
|
||||||
startYearText.push('{0}년'.format(remainYear));
|
startYearText.push('{0}년'.format(remainYear));
|
||||||
}
|
}
|
||||||
if(remainMonth){
|
if (remainMonth) {
|
||||||
startYearText.push('{0}개월'.format(remainMonth));
|
startYearText.push('{0}개월'.format(remainMonth));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,20 +149,17 @@ function reloadWorldMap(option){
|
|||||||
var currentTechLimit = Math.floor(Math.max(0, year - startYear) / 5) + 1;
|
var currentTechLimit = Math.floor(Math.max(0, year - startYear) / 5) + 1;
|
||||||
var nextTechLimitYear = currentTechLimit * 5 + startYear;
|
var nextTechLimitYear = currentTechLimit * 5 + startYear;
|
||||||
|
|
||||||
tooltipTexts.push('기술등급 제한 : {0}등급 ({1}년 해제)'.format(currentTechLimit, nextTechLimitYear, currentTechLimit+1));
|
tooltipTexts.push('기술등급 제한 : {0}등급 ({1}년 해제)'.format(currentTechLimit, nextTechLimitYear, currentTechLimit + 1));
|
||||||
$map_title_tooltip.html(tooltipTexts.join('<br>'));
|
$map_title_tooltip.html(tooltipTexts.join('<br>'));
|
||||||
|
|
||||||
$world_map.removeClass('map_string map_summer map_fall map_winter');
|
$world_map.removeClass('map_string map_summer map_fall map_winter');
|
||||||
if(month <= 3){
|
if (month <= 3) {
|
||||||
$world_map.addClass('map_spring');
|
$world_map.addClass('map_spring');
|
||||||
}
|
} else if (month <= 6) {
|
||||||
else if(month <= 6){
|
|
||||||
$world_map.addClass('map_summer');
|
$world_map.addClass('map_summer');
|
||||||
}
|
} else if (month <= 9) {
|
||||||
else if(month <= 9){
|
|
||||||
$world_map.addClass('map_fall');
|
$world_map.addClass('map_fall');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$world_map.addClass('map_winter');
|
$world_map.addClass('map_winter');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,26 +168,26 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function convertCityObjs(obj){
|
function convertCityObjs(obj) {
|
||||||
//원본 Obj는 굉장히 간소하게 온다, Object 형태로 변환해서 사용한다.
|
//원본 Obj는 굉장히 간소하게 온다, Object 형태로 변환해서 사용한다.
|
||||||
|
|
||||||
function toCityObj(arr){
|
function toCityObj(arr) {
|
||||||
return {
|
return {
|
||||||
id:arr[0],
|
id: arr[0],
|
||||||
level:arr[1],
|
level: arr[1],
|
||||||
state:arr[2],
|
state: arr[2],
|
||||||
nationId:(arr[3]>0)?arr[3]:null,
|
nationId: (arr[3] > 0) ? arr[3] : null,
|
||||||
region:arr[4],
|
region: arr[4],
|
||||||
supply:(arr[5]!=0)
|
supply: (arr[5] != 0)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function toNationObj(arr){
|
function toNationObj(arr) {
|
||||||
return {
|
return {
|
||||||
id:arr[0],
|
id: arr[0],
|
||||||
name:arr[1],
|
name: arr[1],
|
||||||
color:arr[2],
|
color: arr[2],
|
||||||
capital:arr[3]
|
capital: arr[3]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,15 +196,15 @@ function reloadWorldMap(option){
|
|||||||
nationList = convertDictById(nationList); //array of object -> dict
|
nationList = convertDictById(nationList); //array of object -> dict
|
||||||
|
|
||||||
var spyList = obj.spyList;
|
var spyList = obj.spyList;
|
||||||
var shownByGeneralList = convertSet(obj.shownByGeneralList);//Array -> Set
|
var shownByGeneralList = convertSet(obj.shownByGeneralList); //Array -> Set
|
||||||
|
|
||||||
var myCity = obj.myCity;
|
var myCity = obj.myCity;
|
||||||
var myNation = obj.myNation;
|
var myNation = obj.myNation;
|
||||||
|
|
||||||
|
|
||||||
function mergePositionInfo(city){
|
function mergePositionInfo(city) {
|
||||||
var id = city.id;
|
var id = city.id;
|
||||||
if(!(id in cityPosition)){
|
if (!(id in cityPosition)) {
|
||||||
return city;
|
return city;
|
||||||
}
|
}
|
||||||
var xy_val = cityPosition[id];
|
var xy_val = cityPosition[id];
|
||||||
@@ -197,11 +214,11 @@ function reloadWorldMap(option){
|
|||||||
return city;
|
return city;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergeNationInfo(city){
|
function mergeNationInfo(city) {
|
||||||
//nationId 값으로 isCapital, color, nation을 통합
|
//nationId 값으로 isCapital, color, nation을 통합
|
||||||
|
|
||||||
var nationId = city.nationId;
|
var nationId = city.nationId;
|
||||||
if(nationId === null || !(nationId in nationList)){
|
if (nationId === null || !(nationId in nationList)) {
|
||||||
city.nationId = null;
|
city.nationId = null;
|
||||||
city.nation = null;
|
city.nation = null;
|
||||||
city.color = null;
|
city.color = null;
|
||||||
@@ -217,24 +234,24 @@ function reloadWorldMap(option){
|
|||||||
return city;
|
return city;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergeClickable(city){
|
function mergeClickable(city) {
|
||||||
//clickable = (remainSpy << 3) | (ourCity << 2) | (shownByGeneral << 1) | clickableAll
|
//clickable = (remainSpy << 3) | (ourCity << 2) | (shownByGeneral << 1) | clickableAll
|
||||||
var id = city.id;
|
var id = city.id;
|
||||||
var nationId = city.nationId;
|
var nationId = city.nationId;
|
||||||
var clickable = 0;
|
var clickable = 0;
|
||||||
if(id in spyList){
|
if (id in spyList) {
|
||||||
clickable |= spyList[id] << 3;
|
clickable |= spyList[id] << 3;
|
||||||
}
|
}
|
||||||
if(myNation !== null && nationId == myNation){
|
if (myNation !== null && nationId == myNation) {
|
||||||
clickable |= 4;
|
clickable |= 4;
|
||||||
}
|
}
|
||||||
if(shownByGeneralList.hasOwnProperty(id)){
|
if (shownByGeneralList.hasOwnProperty(id)) {
|
||||||
clickable |= 2;
|
clickable |= 2;
|
||||||
}
|
}
|
||||||
if(myCity !== null && id == myCity){
|
if (myCity !== null && id == myCity) {
|
||||||
clickable |= 2;
|
clickable |= 2;
|
||||||
}
|
}
|
||||||
if(clickableAll){
|
if (clickableAll) {
|
||||||
clickable |= 1;
|
clickable |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,35 +267,35 @@ function reloadWorldMap(option){
|
|||||||
.map(formatCityInfo);
|
.map(formatCityInfo);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'cityList' : cityList,
|
'cityList': cityList,
|
||||||
'myCity' : myCity
|
'myCity': myCity
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawDetailWorldMap(obj){
|
function drawDetailWorldMap(obj) {
|
||||||
|
|
||||||
var $map_body = $('.world_map .map_body');
|
var $map_body = $(drawTarget + ' .map_body');
|
||||||
|
|
||||||
var cityList = obj.cityList;
|
var cityList = obj.cityList;
|
||||||
var myCity = obj.myCity;
|
var myCity = obj.myCity;
|
||||||
|
|
||||||
cityList.forEach(function(city){
|
cityList.forEach(function(city) {
|
||||||
var id = city.id;
|
var id = city.id;
|
||||||
$('.city_base_{0}'.format(id)).detach();
|
$('.city_base_{0}'.format(id)).detach();
|
||||||
//이전 도시는 지운다.
|
//이전 도시는 지운다.
|
||||||
|
|
||||||
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
||||||
$cityObj.addClass('city_level_{0}'.format(city.level));
|
$cityObj.addClass('city_level_{0}'.format(city.level));
|
||||||
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15});
|
$cityObj.data('obj', city).css({ 'left': city.x - 20, 'top': city.y - 15 });
|
||||||
|
|
||||||
if('color' in city && city.color !== null){
|
if ('color' in city && city.color !== null) {
|
||||||
var $bgObj = $('<div class="city_bg"></div>');
|
var $bgObj = $('<div class="city_bg"></div>');
|
||||||
$cityObj.append($bgObj);
|
$cityObj.append($bgObj);
|
||||||
$bgObj.css({'background-image':'url({0}/b{1}.png)'.format(pathConfig.gameImage, convColorValue(city.color))});
|
$bgObj.css({ 'background-image': 'url({0}/b{1}.png)'.format(pathConfig.gameImage, convColorValue(city.color)) });
|
||||||
}
|
}
|
||||||
|
|
||||||
var $linkObj = $('<a class="city_link"></a>');
|
var $linkObj = $('<a class="city_link"></a>');
|
||||||
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id});
|
$linkObj.data({ 'text': city.text, 'nation': city.nation, 'id': city.id });
|
||||||
$cityObj.append($linkObj);
|
$cityObj.append($linkObj);
|
||||||
|
|
||||||
var $imgObj = $('<div class="city_img"><img src="{0}/cast_{1}.gif"><div class="city_filler"></div></div>'.format(pathConfig.gameImage, city.level));
|
var $imgObj = $('<div class="city_img"><img src="{0}/cast_{1}.gif"><div class="city_filler"></div></div>'.format(pathConfig.gameImage, city.level));
|
||||||
@@ -286,15 +303,15 @@ function reloadWorldMap(option){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(city.state > 0){
|
if (city.state > 0) {
|
||||||
var $stateObj = $('<div class="city_state"><img src="{0}/event{1}.gif"></div>'.format(pathConfig.gameImage, city.state));
|
var $stateObj = $('<div class="city_state"><img src="{0}/event{1}.gif"></div>'.format(pathConfig.gameImage, city.state));
|
||||||
$linkObj.append($stateObj);
|
$linkObj.append($stateObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(city.nationId && city.nationId > 0){
|
if (city.nationId && city.nationId > 0) {
|
||||||
var flagType = city.supply?'f':'d';
|
var flagType = city.supply ? 'f' : 'd';
|
||||||
var $flagObj = $('<div class="city_flag"><img src="{0}/{1}{2}.gif"></div>'.format(pathConfig.gameImage, flagType, convColorValue(city.color)));
|
var $flagObj = $('<div class="city_flag"><img src="{0}/{1}{2}.gif"></div>'.format(pathConfig.gameImage, flagType, convColorValue(city.color)));
|
||||||
if(city.isCapital){
|
if (city.isCapital) {
|
||||||
var $capitalObj = $('<div class="city_capital"><img src="{0}/event51.gif"></div>'.format(pathConfig.gameImage));
|
var $capitalObj = $('<div class="city_capital"><img src="{0}/event51.gif"></div>'.format(pathConfig.gameImage));
|
||||||
$flagObj.append($capitalObj);
|
$flagObj.append($capitalObj);
|
||||||
}
|
}
|
||||||
@@ -315,41 +332,39 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawBasicWorldMap(obj){
|
function drawBasicWorldMap(obj) {
|
||||||
|
|
||||||
var $map_body = $('.world_map .map_body');
|
var $map_body = $(drawTarget + ' .map_body');
|
||||||
|
|
||||||
var cityList = obj.cityList;
|
var cityList = obj.cityList;
|
||||||
var myCity = obj.myCity;
|
var myCity = obj.myCity;
|
||||||
|
|
||||||
cityList.forEach(function(city){
|
cityList.forEach(function(city) {
|
||||||
var id = city.id;
|
var id = city.id;
|
||||||
$('.city_base_{0}'.format(id)).detach();
|
$('.city_base_{0}'.format(id)).detach();
|
||||||
//이전 도시는 지운다.
|
//이전 도시는 지운다.
|
||||||
|
|
||||||
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
||||||
$cityObj.addClass('city_level_{0}'.format(city.level));
|
$cityObj.addClass('city_level_{0}'.format(city.level));
|
||||||
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15});
|
$cityObj.data('obj', city).css({ 'left': city.x - 20, 'top': city.y - 15 });
|
||||||
|
|
||||||
var $linkObj = $('<a class="city_link"></a>');
|
var $linkObj = $('<a class="city_link"></a>');
|
||||||
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id});
|
$linkObj.data({ 'text': city.text, 'nation': city.nation, 'id': city.id });
|
||||||
$cityObj.append($linkObj);
|
$cityObj.append($linkObj);
|
||||||
|
|
||||||
var $imgObj = $('<div class="city_img"><div class="city_filler"></div></div>');
|
var $imgObj = $('<div class="city_img"><div class="city_filler"></div></div>');
|
||||||
if('color' in city && city.color !== null){
|
if ('color' in city && city.color !== null) {
|
||||||
$imgObj.css({'background-color':city.color});
|
$imgObj.css({ 'background-color': city.color });
|
||||||
}
|
}
|
||||||
$linkObj.append($imgObj);
|
$linkObj.append($imgObj);
|
||||||
|
|
||||||
if(city.state > 0){
|
if (city.state > 0) {
|
||||||
var state_text = 'wrong';
|
var state_text = 'wrong';
|
||||||
if(city.state < 10){
|
if (city.state < 10) {
|
||||||
state_text = 'good';
|
state_text = 'good';
|
||||||
}
|
} else if (city.state < 40) {
|
||||||
else if(city.state < 40){
|
|
||||||
state_text = 'bad';
|
state_text = 'bad';
|
||||||
}
|
} else if (city.state < 50) {
|
||||||
else if(city.state < 50){
|
|
||||||
state_text = 'war';
|
state_text = 'war';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +373,7 @@ function reloadWorldMap(option){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//단순 표기에서는 깃발 여부가 없음
|
//단순 표기에서는 깃발 여부가 없음
|
||||||
if(city.isCapital){
|
if (city.isCapital) {
|
||||||
var $capitalObj = $('<div class="city_capital"></div>');
|
var $capitalObj = $('<div class="city_capital"></div>');
|
||||||
$imgObj.append($capitalObj);
|
$imgObj.append($capitalObj);
|
||||||
}
|
}
|
||||||
@@ -374,32 +389,30 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setMouseWork(obj){
|
function setMouseWork(obj) {
|
||||||
var $tooltip = $('.world_map .city_tooltip');
|
var $tooltip = $(drawTarget + ' .city_tooltip');
|
||||||
var $tooltip_city = $tooltip.find('.city_name');
|
var $tooltip_city = $tooltip.find('.city_name');
|
||||||
var $tooltip_nation = $tooltip.find('.nation_name');
|
var $tooltip_nation = $tooltip.find('.nation_name');
|
||||||
|
|
||||||
var $objs = $('.world_map .city_link');
|
var $objs = $(drawTarget + ' .city_link');
|
||||||
|
|
||||||
var $map_body = $('.world_map .map_body');
|
var $map_body = $(drawTarget + ' .map_body');
|
||||||
|
|
||||||
//터치스크린 탭
|
//터치스크린 탭
|
||||||
|
|
||||||
if(!option.neutralView && is_touch_device()){
|
if (!option.neutralView && is_touch_device()) {
|
||||||
$objs.on('touchstart', function(e){
|
$objs.on('touchstart', function(e) {
|
||||||
if(window.sam_toggleSingleTap){
|
if (window.sam_toggleSingleTap) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
|
|
||||||
var touchMode = $this.data('touchMode');
|
var touchMode = $this.data('touchMode');
|
||||||
if($tooltip_city.data('target') != $this.data('id')){
|
if ($tooltip_city.data('target') != $this.data('id')) {
|
||||||
$this.data('touchMode', 1);
|
$this.data('touchMode', 1);
|
||||||
}
|
} else if (touchMode === undefined) {
|
||||||
else if(touchMode === undefined){
|
|
||||||
$this.data('touchMode', 1);
|
$this.data('touchMode', 1);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this.data('touchMode', touchMode + 1);
|
$this.data('touchMode', touchMode + 1);
|
||||||
}
|
}
|
||||||
$map_body.data('touchMode', 1);
|
$map_body.data('touchMode', 1);
|
||||||
@@ -409,8 +422,8 @@ function reloadWorldMap(option){
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$objs.on('touchend', function(e){
|
$objs.on('touchend', function(e) {
|
||||||
if(window.sam_toggleSingleTap){
|
if (window.sam_toggleSingleTap) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
@@ -418,17 +431,25 @@ function reloadWorldMap(option){
|
|||||||
$tooltip_city.html($this.data('text'));
|
$tooltip_city.html($this.data('text'));
|
||||||
|
|
||||||
var nation_text = $this.data('nation');
|
var nation_text = $this.data('nation');
|
||||||
if(nation_text){
|
if (nation_text) {
|
||||||
$tooltip_nation.html(nation_text).show();
|
$tooltip_nation.html(nation_text).show();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$tooltip_nation.html('').hide();
|
$tooltip_nation.html('').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
$tooltip.css({'top': position.top + 25, 'left': position.left + 35}).show();
|
var left = position.left;
|
||||||
|
var top = position.top;
|
||||||
|
|
||||||
|
var scale = $map_body.data('scale');
|
||||||
|
if (scale) {
|
||||||
|
left /= scale;
|
||||||
|
top /= scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tooltip.css({ 'top': top + 25, 'left': left + 35 }).show();
|
||||||
|
|
||||||
var touchMode = $this.data('touchMode');
|
var touchMode = $this.data('touchMode');
|
||||||
if(touchMode <= 1){
|
if (touchMode <= 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,8 +457,8 @@ function reloadWorldMap(option){
|
|||||||
$this.data('touchMode', 0);
|
$this.data('touchMode', 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
$map_body.on('touchend',function(e){
|
$map_body.on('touchend', function(e) {
|
||||||
if(window.sam_toggleSingleTap){
|
if (window.sam_toggleSingleTap) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치
|
//위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치
|
||||||
@@ -448,20 +469,26 @@ function reloadWorldMap(option){
|
|||||||
|
|
||||||
//Mouse over 모드 작동
|
//Mouse over 모드 작동
|
||||||
|
|
||||||
$map_body.on('mousemove', function(e){
|
$map_body.on('mousemove', function(e) {
|
||||||
if($(this).data('touchMode')){
|
if ($(this).data('touchMode')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentOffset = $map_body.offset();
|
var rect = this.getBoundingClientRect();
|
||||||
var relX = e.pageX - parentOffset.left;
|
var left = (e.clientX - rect.left - this.clientLeft + this.scrollLeft);
|
||||||
var relY = e.pageY - parentOffset.top;
|
var top = (e.clientY - rect.top - this.clientTop + this.scrollTop);
|
||||||
|
|
||||||
$tooltip.css({'top': relY + 10, 'left': relX + 10});
|
var scale = $map_body.data('scale');
|
||||||
|
if (scale) {
|
||||||
|
left /= scale;
|
||||||
|
top /= scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tooltip.css({ 'top': top + 10, 'left': left + 10 });
|
||||||
});
|
});
|
||||||
|
|
||||||
$objs.on('mouseenter', function(e){
|
$objs.on('mouseenter', function(e) {
|
||||||
if($map_body.data('touchMode')){
|
if ($map_body.data('touchMode')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,28 +497,27 @@ function reloadWorldMap(option){
|
|||||||
$tooltip_city.data('target', $this.data('id'));
|
$tooltip_city.data('target', $this.data('id'));
|
||||||
$tooltip_city.html($this.data('text'));
|
$tooltip_city.html($this.data('text'));
|
||||||
var nation_text = $this.data('nation');
|
var nation_text = $this.data('nation');
|
||||||
if(nation_text){
|
if (nation_text) {
|
||||||
$tooltip_nation.html(nation_text).show();
|
$tooltip_nation.html(nation_text).show();
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$tooltip_nation.html('').hide();
|
$tooltip_nation.html('').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
$tooltip.show();
|
$tooltip.show();
|
||||||
});
|
});
|
||||||
|
|
||||||
$objs.on('mouseleave', function(event){
|
$objs.on('mouseleave', function(event) {
|
||||||
$tooltip.hide();
|
$tooltip.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
$objs.on('click', function(e){
|
$objs.on('click', function(e) {
|
||||||
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
|
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
|
||||||
var touchMode = $(this).data('touchMode');
|
var touchMode = $(this).data('touchMode');
|
||||||
if(touchMode === undefined){
|
if (touchMode === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(touchMode === 1){
|
if (touchMode === 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -500,17 +526,17 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCityClickable(obj){
|
function setCityClickable(obj) {
|
||||||
|
|
||||||
obj.cityList.forEach(function(city){
|
obj.cityList.forEach(function(city) {
|
||||||
var $cityLink = $world_map.find('.city_base_{0} .city_link'.format(city.id));
|
var $cityLink = $world_map.find('.city_base_{0} .city_link'.format(city.id));
|
||||||
|
|
||||||
if('clickable' in city && city.clickable > 0){
|
if ('clickable' in city && city.clickable > 0) {
|
||||||
$cityLink.attr('href',hrefTemplate.format(city.id));
|
$cityLink.attr('href', hrefTemplate.format(city.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(selectCallback){
|
if (selectCallback) {
|
||||||
$cityLink.click(function(){
|
$cityLink.click(function() {
|
||||||
return selectCallback(city);
|
return selectCallback(city);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -519,127 +545,133 @@ function reloadWorldMap(option){
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveCityInfo(obj){
|
function saveCityInfo(obj) {
|
||||||
$world_map.data('cityInfo', obj);
|
$world_map.data('cityInfo', obj);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $hideCityNameBtn = $world_map.find('.map_toggle_cityname');
|
var $hideCityNameBtn = $world_map.find('.map_toggle_cityname');
|
||||||
if(localStorage.getItem('sam.hideMapCityName') == 'yes'){
|
if (localStorage.getItem('sam.hideMapCityName') == 'yes') {
|
||||||
$world_map.addClass('hide_cityname');
|
$world_map.addClass('hide_cityname');
|
||||||
$hideCityNameBtn.addClass('active').attr('aria-pressed', 'true');
|
$hideCityNameBtn.addClass('active').attr('aria-pressed', 'true');
|
||||||
}
|
}
|
||||||
|
|
||||||
$hideCityNameBtn.click(function(){
|
$hideCityNameBtn.click(function() {
|
||||||
//이전 상태 확인
|
//이전 상태 확인
|
||||||
var state = !$hideCityNameBtn.hasClass('active');
|
var state = !$hideCityNameBtn.hasClass('active');
|
||||||
if(state){
|
if (state) {
|
||||||
$world_map.addClass('hide_cityname');
|
$world_map.addClass('hide_cityname');
|
||||||
localStorage.setItem('sam.hideMapCityName', 'yes');
|
localStorage.setItem('sam.hideMapCityName', 'yes');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$world_map.removeClass('hide_cityname');
|
$world_map.removeClass('hide_cityname');
|
||||||
localStorage.setItem('sam.hideMapCityName', 'no');
|
localStorage.setItem('sam.hideMapCityName', 'no');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var $toggleSingleTapBtn = $world_map.find('.map_toggle_single_tap');
|
var $toggleSingleTapBtn = $world_map.find('.map_toggle_single_tap');
|
||||||
if(localStorage.getItem('sam.toggleSingleTap') == 'yes'){
|
if (localStorage.getItem('sam.toggleSingleTap') == 'yes') {
|
||||||
window.sam_toggleSingleTap = true;
|
window.sam_toggleSingleTap = true;
|
||||||
$toggleSingleTapBtn.addClass('active').attr('aria-pressed', 'true');
|
$toggleSingleTapBtn.addClass('active').attr('aria-pressed', 'true');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
window.sam_toggleSingleTap = false;
|
window.sam_toggleSingleTap = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $map_body = $('.world_map .map_body');
|
var $map_body = $(drawTarget + ' .map_body');
|
||||||
|
|
||||||
$toggleSingleTapBtn.click(function(){
|
$toggleSingleTapBtn.click(function() {
|
||||||
//이전 상태 확인
|
//이전 상태 확인
|
||||||
var state = !$toggleSingleTapBtn.hasClass('active');
|
var state = !$toggleSingleTapBtn.hasClass('active');
|
||||||
if(state){
|
if (state) {
|
||||||
$map_body.removeData('touchMode');
|
$map_body.removeData('touchMode');
|
||||||
localStorage.setItem('sam.toggleSingleTap', 'yes');
|
localStorage.setItem('sam.toggleSingleTap', 'yes');
|
||||||
window.sam_toggleSingleTap = true;
|
window.sam_toggleSingleTap = true;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
localStorage.setItem('sam.toggleSingleTap', 'no');
|
localStorage.setItem('sam.toggleSingleTap', 'no');
|
||||||
window.sam_toggleSingleTap = false;
|
window.sam_toggleSingleTap = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if(isDetailMap){
|
if (isDetailMap) {
|
||||||
$world_map.addClass('map_detail');
|
$world_map.addClass('map_detail');
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$world_map.removeClass('map_datail');
|
$world_map.removeClass('map_datail');
|
||||||
}
|
}
|
||||||
|
|
||||||
//deferred mode of jQuery. != promise-then.
|
//deferred mode of jQuery. != promise-then.
|
||||||
var deferred = $.ajax({
|
var deferred = $.ajax({
|
||||||
url: option.targetJson,
|
url: option.targetJson,
|
||||||
type: 'post',
|
type: option.reqType,
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
|
ifModified: true,
|
||||||
data: {
|
data: {
|
||||||
data: JSON.stringify({
|
data: JSON.stringify({
|
||||||
neutralView:option.neutralView,
|
neutralView: option.neutralView,
|
||||||
year:option.year,
|
year: option.year,
|
||||||
month:option.month,
|
month: option.month,
|
||||||
showMe:option.showMe,
|
showMe: option.showMe,
|
||||||
aux:option.aux
|
aux: option.aux
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var rawObject = null;
|
||||||
|
|
||||||
deferred
|
deferred
|
||||||
|
.then(function(data) {
|
||||||
|
rawObject = data;
|
||||||
|
return data;
|
||||||
|
})
|
||||||
.then(checkReturnObject)
|
.then(checkReturnObject)
|
||||||
.then(setMapBackground)
|
.then(setMapBackground)
|
||||||
.then(convertCityObjs)
|
.then(convertCityObjs)
|
||||||
.then(isDetailMap?drawDetailWorldMap:drawBasicWorldMap)
|
.then(isDetailMap ? drawDetailWorldMap : drawBasicWorldMap)
|
||||||
.then(setMouseWork)
|
.then(setMouseWork)
|
||||||
.then(setCityClickable)
|
.then(setCityClickable)
|
||||||
.then(saveCityInfo);
|
.then(saveCityInfo)
|
||||||
|
.then(function(data) {
|
||||||
|
if (option.callback) {
|
||||||
|
option.callback(data, rawObject);
|
||||||
|
}
|
||||||
|
|
||||||
if($world_map.hasClass('draw_required')){
|
});
|
||||||
if(useCachedMap){
|
|
||||||
|
if ($world_map.hasClass('draw_required')) {
|
||||||
|
if (useCachedMap) {
|
||||||
//일단 불러옴
|
//일단 불러옴
|
||||||
do{
|
do {
|
||||||
var storedMap = localStorage.getItem(storedOldMapKey);
|
var storedMap = localStorage.getItem(storedOldMapKey);
|
||||||
if(!storedMap){
|
if (!storedMap) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
storedMap = JSON.parse(storedMap);
|
storedMap = JSON.parse(storedMap);
|
||||||
var storedServerID = storedMap[0];
|
var storedServerID = storedMap[0];
|
||||||
if(storedServerID != serverID){
|
if (storedServerID != serverID) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
storedMap = storedMap[1];
|
storedMap = storedMap[1];
|
||||||
storedMap = setMapBackground(storedMap);
|
storedMap = setMapBackground(storedMap);
|
||||||
storedMap = convertCityObjs(storedMap);
|
storedMap = convertCityObjs(storedMap);
|
||||||
if(isDetailMap){
|
if (isDetailMap) {
|
||||||
storedMap = drawDetailWorldMap(storedMap);
|
storedMap = drawDetailWorldMap(storedMap);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
storedMap = drawBasicWorldMap(storedMap);
|
storedMap = drawBasicWorldMap(storedMap);
|
||||||
}
|
}
|
||||||
storedMap = setMouseWork(storedMap);
|
storedMap = setMouseWork(storedMap);
|
||||||
storedMap = setCityClickable(storedMap);
|
storedMap = setCityClickable(storedMap);
|
||||||
storedMap = saveCityInfo(storedMap);
|
storedMap = saveCityInfo(storedMap);
|
||||||
}while(false);
|
} while (false);
|
||||||
}
|
} else if (option.year && option.month) {
|
||||||
else if(option.year && option.month){
|
|
||||||
var startYear = localStorage.getItem(storedStartYear);
|
var startYear = localStorage.getItem(storedStartYear);
|
||||||
if(startYear){
|
if (startYear) {
|
||||||
startYear = JSON.parse(startYear);
|
startYear = JSON.parse(startYear);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
startYear = option.year;
|
startYear = option.year;
|
||||||
}
|
}
|
||||||
var tmp = {
|
var tmp = {
|
||||||
year : option.year,
|
year: option.year,
|
||||||
month : option.month,
|
month: option.month,
|
||||||
startYear : startYear
|
startYear: startYear
|
||||||
};
|
};
|
||||||
setMapBackground(tmp);
|
setMapBackground(tmp);
|
||||||
}
|
}
|
||||||
@@ -647,8 +679,8 @@ function reloadWorldMap(option){
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$(function(){
|
$(function() {
|
||||||
if(is_touch_device()){
|
if (is_touch_device()) {
|
||||||
$('.map_body .map_toggle_single_tap').show();
|
$('.map_body .map_toggle_single_tap').show();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
+139
-57
@@ -1,85 +1,167 @@
|
|||||||
jQuery(function($){
|
jQuery(function($) {
|
||||||
|
|
||||||
|
|
||||||
var initCustomCSSForm = function(){
|
var initCustomCSSForm = function() {
|
||||||
var lastTimeOut = null;
|
var lastTimeOut = null;
|
||||||
var $obj = $('#custom_css');
|
var $obj = $('#custom_css');
|
||||||
var key = 'sam_customCSS';
|
var key = 'sam_customCSS';
|
||||||
|
|
||||||
var text = localStorage.getItem(key);
|
var text = localStorage.getItem(key);
|
||||||
if(text){
|
if (text) {
|
||||||
$obj.val(text);
|
$obj.val(text);
|
||||||
console.log(text);
|
console.log(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($obj.on('change keyup paste', function(){
|
if ($obj.on('change keyup paste', function() {
|
||||||
var newText = $obj.val();
|
var newText = $obj.val();
|
||||||
if(text == newText){
|
if (text == newText) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(lastTimeOut){
|
if (lastTimeOut) {
|
||||||
clearTimeout(lastTimeOut);
|
clearTimeout(lastTimeOut);
|
||||||
}
|
}
|
||||||
$obj.css('background-color', '#222222');
|
$obj.css('background-color', '#222222');
|
||||||
lastTimeOut = setTimeout(function(){
|
lastTimeOut = setTimeout(function() {
|
||||||
text = $obj.val();
|
text = $obj.val();
|
||||||
localStorage.setItem(key, text);
|
localStorage.setItem(key, text);
|
||||||
$obj.css('background-color', 'black');
|
$obj.css('background-color', 'black');
|
||||||
}, 500);
|
}, 500);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.load_old_log').click(function(){
|
$('.load_old_log').click(function() {
|
||||||
var $thisBtn = $(this);
|
var $thisBtn = $(this);
|
||||||
var logType = $thisBtn.data('log_type');
|
var logType = $thisBtn.data('log_type');
|
||||||
var $last = $('.log_{0}:last'.format(logType));
|
var $last = $('.log_{0}:last'.format(logType));
|
||||||
var reqTo = null;
|
var reqTo = null;
|
||||||
if($last.length){
|
if ($last.length) {
|
||||||
reqTo = $last.data('seq');
|
reqTo = $last.data('seq');
|
||||||
}
|
}
|
||||||
|
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_general_log_old.php',
|
url: 'j_general_log_old.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
to:reqTo,
|
to: reqTo,
|
||||||
type:logType
|
type: logType
|
||||||
}
|
}
|
||||||
}).then(function(data){
|
}).then(function(data) {
|
||||||
if(!data){
|
if (!data) {
|
||||||
return quickReject('로그를 받아오지 못했습니다.');
|
return quickReject('로그를 받아오지 못했습니다.');
|
||||||
}
|
}
|
||||||
if(!data.result){
|
if (!data.result) {
|
||||||
return quickReject('로그를 받아오지 못했습니다. : '+data.reason);
|
return quickReject('로그를 받아오지 못했습니다. : ' + data.reason);
|
||||||
}
|
|
||||||
|
|
||||||
var keys = Object.keys(data.log);
|
|
||||||
if(keys.length > 1 && keys[0] < keys[1]){
|
|
||||||
keys.reverse();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(keys == 0){
|
|
||||||
$thisBtn.hide();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var html = [];
|
|
||||||
$.each(keys, function(_, key){
|
|
||||||
if($('#log_{0}_{1}'.format(logType, key)).length){
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
var item = data.log[key];
|
|
||||||
html.push("<div class='log_{0}' id='log_{0}_{1}' data-seq='{1}'>{2}</div>".format(logType, key, item));
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#{0}Plate'.format(logType)).append(html);
|
var keys = Object.keys(data.log);
|
||||||
}, errUnknown)
|
if (keys.length > 1 && keys[0] < keys[1]) {
|
||||||
.fail(function(reason){
|
keys.reverse();
|
||||||
alert(reason);
|
}
|
||||||
location.reload();
|
|
||||||
});
|
if (keys == 0) {
|
||||||
|
$thisBtn.hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var html = [];
|
||||||
|
$.each(keys, function(_, key) {
|
||||||
|
if ($('#log_{0}_{1}'.format(logType, key)).length) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var item = data.log[key];
|
||||||
|
html.push("<div class='log_{0}' id='log_{0}_{1}' data-seq='{1}'>{2}</div>".format(logType, key, item));
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#{0}Plate'.format(logType)).append(html);
|
||||||
|
}, errUnknown)
|
||||||
|
.fail(function(reason) {
|
||||||
|
alert(reason);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
initCustomCSSForm();
|
initCustomCSSForm();
|
||||||
|
|
||||||
|
|
||||||
|
$('#die_immediately').click(function() {
|
||||||
|
if (!confirm('정말로 삭제하시겠습니까?')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$.post({
|
||||||
|
url: 'j_die_immediately.php',
|
||||||
|
dataType: 'json',
|
||||||
|
}).then(function(data) {
|
||||||
|
if (!data) {
|
||||||
|
return quickReject('실패했습니다.');
|
||||||
|
}
|
||||||
|
if (!data.result) {
|
||||||
|
return quickReject(data.reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
location.replace('..');
|
||||||
|
|
||||||
|
}, errUnknown)
|
||||||
|
.fail(function(reason) {
|
||||||
|
alert(reason);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#vacation').click(function() {
|
||||||
|
if (!confirm('휴가 기능을 신청할까요?')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$.post({
|
||||||
|
url: 'j_vacation.php',
|
||||||
|
dataType: 'json',
|
||||||
|
}).then(function(data) {
|
||||||
|
if (!data) {
|
||||||
|
return quickReject('실패했습니다.');
|
||||||
|
}
|
||||||
|
if (!data.result) {
|
||||||
|
return quickReject(data.reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
location.reload();
|
||||||
|
|
||||||
|
}, errUnknown)
|
||||||
|
.fail(function(reason) {
|
||||||
|
alert(reason);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#set_my_setting').click(function() {
|
||||||
|
$.post({
|
||||||
|
url: 'j_set_my_setting.php',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
tnmt: $('.tnmt:checked').val(),
|
||||||
|
defence_train: $('#defence_train').val(),
|
||||||
|
use_treatment: $('#use_treatment').val(),
|
||||||
|
use_auto_nation_turn: $('#use_auto_nation_turn').val(),
|
||||||
|
}
|
||||||
|
}).then(function(data) {
|
||||||
|
if (!data) {
|
||||||
|
return quickReject('실패했습니다.');
|
||||||
|
}
|
||||||
|
if (!data.result) {
|
||||||
|
return quickReject(data.reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
location.reload();
|
||||||
|
|
||||||
|
}, errUnknown)
|
||||||
|
.fail(function(reason) {
|
||||||
|
alert(reason);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
+40
-3
@@ -33,6 +33,35 @@ jQuery(function ($) {
|
|||||||
var $disabled = $(itemFrameDisabled.format('<비활성화 항목들>')).addClass('filtered');
|
var $disabled = $(itemFrameDisabled.format('<비활성화 항목들>')).addClass('filtered');
|
||||||
$disabledList.append($disabled);
|
$disabledList.append($disabled);
|
||||||
|
|
||||||
|
var lastInfoObj = null;
|
||||||
|
var lastInfoData = null;
|
||||||
|
|
||||||
|
var onChoose = function(evt){
|
||||||
|
//$(evt.item).find('.help-message').popopver('disable');
|
||||||
|
if(lastInfoObj){
|
||||||
|
lastInfoObj.popover('hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var onUnchoose = function(evt){
|
||||||
|
var $item = $(evt.item);//.find('.help-message').popopver('enable');
|
||||||
|
var $helpMessage = $item.find('.help-message');
|
||||||
|
if(!$helpMessage.length){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(lastInfoData != $item.data('value')){
|
||||||
|
$helpMessage.popover('show')
|
||||||
|
lastInfoData = $item.data('value');
|
||||||
|
lastInfoObj = $helpMessage;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$helpMessage.popover('hide');
|
||||||
|
lastInfoData = null;
|
||||||
|
lastInfoObj = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
$.each(availablePriority, function (key, val) {
|
$.each(availablePriority, function (key, val) {
|
||||||
if (val in usedKey) {
|
if (val in usedKey) {
|
||||||
return true;
|
return true;
|
||||||
@@ -45,12 +74,16 @@ jQuery(function ($) {
|
|||||||
$disabledList.sortable({
|
$disabledList.sortable({
|
||||||
group: priorityKey,
|
group: priorityKey,
|
||||||
filter: '.filtered',
|
filter: '.filtered',
|
||||||
|
onChoose,onChoose,
|
||||||
|
onUnchoose:onUnchoose,
|
||||||
animation: 150
|
animation: 150
|
||||||
});
|
});
|
||||||
|
|
||||||
$enabledList.sortable({
|
$enabledList.sortable({
|
||||||
group: priorityKey,
|
group: priorityKey,
|
||||||
filter: '.filtered',
|
filter: '.filtered',
|
||||||
|
onChoose,onChoose,
|
||||||
|
onUnchoose:onUnchoose,
|
||||||
animation: 150
|
animation: 150
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -59,14 +92,18 @@ jQuery(function ($) {
|
|||||||
if(!(itemValue in btnHelpMessage)){
|
if(!(itemValue in btnHelpMessage)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var helpText = btnHelpMessage[itemValue];
|
var helpText = btnHelpMessage[itemValue];
|
||||||
$item.find('.help-message').popover({
|
var $helpMessage = $item.find('.help-message');
|
||||||
|
$helpMessage.popover({
|
||||||
content:helpText,
|
content:helpText,
|
||||||
placement:'right',
|
placement:'top',
|
||||||
html:true,
|
html:true,
|
||||||
trigger:'hover'
|
trigger:'hover'
|
||||||
});
|
});
|
||||||
|
$item.mouseleave(function(){
|
||||||
|
$helpMessage.popover('hide');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+213
-70
@@ -1,102 +1,245 @@
|
|||||||
function reserveTurn(turnList, command, arg){
|
function reserveTurn(turnList, command, arg) {
|
||||||
var target;
|
var target;
|
||||||
if(isChiefTurn){
|
if (isChiefTurn) {
|
||||||
target = 'j_set_chief_command.php';
|
target = 'j_set_chief_command.php';
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
target = 'j_set_general_command.php';
|
target = 'j_set_general_command.php';
|
||||||
}
|
}
|
||||||
$.post({
|
$.post({
|
||||||
url:target,
|
url: target,
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
action:command,
|
action: command,
|
||||||
turnList:turnList,
|
turnList: turnList,
|
||||||
arg:JSON.stringify(arg)
|
arg: JSON.stringify(arg)
|
||||||
}
|
}
|
||||||
}).then(function(data){
|
}).then(function(data) {
|
||||||
if(!data.result){
|
if (!data.result) {
|
||||||
alert(data.reason);
|
alert(data.reason);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isChiefTurn){
|
if (!isChiefTurn) {
|
||||||
window.location.href = './';
|
window.location.href = './';
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
window.location.href = 'b_chiefcenter.php';
|
window.location.href = 'b_chiefcenter.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
}, errUnknown);
|
}, errUnknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery(function($){
|
jQuery(function($) {
|
||||||
|
|
||||||
window.submitAction = function(){
|
window.submitAction = function() {
|
||||||
|
|
||||||
//checkCommandArg 참고
|
//checkCommandArg 참고
|
||||||
var availableArgumentList = {
|
var availableArgumentList = {
|
||||||
'string':[
|
'string': [
|
||||||
'nationName', 'optionText', 'itemType', 'nationType', 'itemCode',
|
'nationName', 'optionText', 'itemType', 'nationType', 'itemCode', 'commandType',
|
||||||
],
|
],
|
||||||
'int':[
|
'int': [
|
||||||
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
|
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
|
||||||
'amount', 'colorType',
|
'amount', 'colorType',
|
||||||
'year', 'month',
|
'year', 'month',
|
||||||
'srcArmType', 'destArmType', //숙련전환 전용
|
'srcArmType', 'destArmType', //숙련전환 전용
|
||||||
],
|
],
|
||||||
'boolean':[
|
'boolean': [
|
||||||
'isGold', 'buyRice',
|
'isGold', 'buyRice',
|
||||||
],
|
],
|
||||||
'integerArray':[
|
'integerArray': [
|
||||||
'destNationIDList', 'destGeneralIDList', 'amountList'
|
'destNationIDList', 'destGeneralIDList', 'amountList'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
var handlerList = {
|
var handlerList = {
|
||||||
'string':function($obj){
|
'string': function($obj) {
|
||||||
return $.trim($obj.eq(0).val());
|
return $.trim($obj.eq(0).val());
|
||||||
},
|
},
|
||||||
'int':function($obj){
|
'int': function($obj) {
|
||||||
return parseInt($obj.eq(0).val());
|
return parseInt($obj.eq(0).val());
|
||||||
},
|
},
|
||||||
'boolean':function($obj){
|
'boolean': function($obj) {
|
||||||
switch ($obj.eq(0).val().toLowerCase()) {
|
switch ($obj.eq(0).val().toLowerCase()) {
|
||||||
case "true": case "yes": case "1":
|
case "true":
|
||||||
return true;
|
case "yes":
|
||||||
case "false": case "no": case "0":
|
case "1":
|
||||||
return false;
|
return true;
|
||||||
default:
|
case "false":
|
||||||
throw new Error ("Boolean.parse: Cannot convert string to boolean.");
|
case "no":
|
||||||
|
case "0":
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
throw new Error("Boolean.parse: Cannot convert string to boolean.");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'integerArray': function($obj) {
|
||||||
|
var result = [];
|
||||||
|
$obj.each(function() {
|
||||||
|
result.push(parseInt($(this).val()));
|
||||||
|
});
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
'integerArray':function($obj){
|
|
||||||
return $obj.map(function(){
|
var argument = {};
|
||||||
return parseInt($(this).val());
|
for (var typeName in availableArgumentList) {
|
||||||
|
availableArgumentList[typeName].forEach(function(argName) {
|
||||||
|
var $obj = $('#' + argName);
|
||||||
|
if ($obj.length == 0) {
|
||||||
|
$obj = $('.' + argName);
|
||||||
|
if ($obj.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argument[argName] = handlerList[typeName]($obj);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var argument = {};
|
console.log(argument);
|
||||||
for (var typeName in availableArgumentList) {
|
reserveTurn(turnList, command, argument);
|
||||||
availableArgumentList[typeName].forEach(function(argName){
|
};
|
||||||
var $obj = $('#'+argName);
|
|
||||||
if($obj.length == 0){
|
$('#commonSubmit').click(submitAction);
|
||||||
$obj = $('.'+argName);
|
|
||||||
if($obj.length == 0){
|
var $colorType = $('#colorType');
|
||||||
return;
|
if ($colorType.length) {
|
||||||
|
$colorType.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "색상을 선택해 주세요.",
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
templateSelection: function(item) {
|
||||||
|
if (item.disabled) {
|
||||||
|
return item.text;
|
||||||
}
|
}
|
||||||
}
|
var bgcolor = item.element.dataset.color;
|
||||||
|
var fgcolor = item.element.dataset.fontColor;
|
||||||
argument[argName] = handlerList[typeName]($obj);
|
return $("<span><span style='background-color:{0};color:{1};'> </span> {2}</span>".format(
|
||||||
|
bgcolor, fgcolor, item.text
|
||||||
|
));
|
||||||
|
},
|
||||||
|
templateResult: function(item) {
|
||||||
|
if (item.disabled) {
|
||||||
|
return item.text;
|
||||||
|
}
|
||||||
|
var bgcolor = item.element.dataset.color;
|
||||||
|
var fgcolor = item.element.dataset.fontColor;
|
||||||
|
return $("<div style='padding: 0.75rem 0.375rem; background-color:{0};color:{1};'>{2}</div>".format(
|
||||||
|
bgcolor, fgcolor, item.text
|
||||||
|
));
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'no-padding simple-select2-align-center bg-secondary text-secondary',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(argument);
|
var $nationType = $('#nationType');
|
||||||
reserveTurn(turnList, command, argument);
|
if ($nationType.length) {
|
||||||
};
|
$nationType.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
$('#commonSubmit').click(submitAction);
|
var $destCityID = $('#destCityID');
|
||||||
|
if ($destCityID.length) {
|
||||||
|
$destCityID.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "도시를 선택해 주세요.",
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var $destNationID = $('#destNationID');
|
||||||
|
if ($destNationID.length) {
|
||||||
|
$destNationID.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "국가를 선택해 주세요.",
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var $destGeneralID = $('#destGeneralID');
|
||||||
|
if ($destGeneralID.length) {
|
||||||
|
$destGeneralID.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "장수를 선택해 주세요.",
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var $isGold = $('#isGold');
|
||||||
|
if ($isGold.length) {
|
||||||
|
$isGold.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "분량을 지정해 주세요.",
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
minimumResultsForSearch: -1,
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var $amount = $('#amount:not([type=hidden])');
|
||||||
|
if ($amount.length) {
|
||||||
|
$amount.select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: "분량을 지정해 주세요.",
|
||||||
|
allowClear: false,
|
||||||
|
language: "ko",
|
||||||
|
containerCss: {
|
||||||
|
display: "inline-block !important",
|
||||||
|
color: 'white !important',
|
||||||
|
},
|
||||||
|
tags: true,
|
||||||
|
sorter: function(items) {
|
||||||
|
items.sort(function(lhs, rhs) {
|
||||||
|
return parseInt(lhs.id) - parseInt(rhs.id);
|
||||||
|
})
|
||||||
|
return items;
|
||||||
|
},
|
||||||
|
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
dropdownCssClass: 'select2-only-number simple-select2-align-center bg-secondary text-secondary',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).on('keypress', '.select2-only-number .select2-search__field', function() {
|
||||||
|
$(this).val($(this).val().replace(/[^\d].+/, ""));
|
||||||
|
if ((event.which < 48 || event.which > 57)) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -23,7 +23,7 @@ $(function(){
|
|||||||
var crewtype = parseInt($parent.data('crewtype'));
|
var crewtype = parseInt($parent.data('crewtype'));
|
||||||
calc(crewtype);
|
calc(crewtype);
|
||||||
$formCrewtype.val(crewtype);
|
$formCrewtype.val(crewtype);
|
||||||
$formAmount.val($this.val());
|
$formAmount.val($this.val()*100);
|
||||||
|
|
||||||
if(e.which === 13){
|
if(e.which === 13){
|
||||||
submitAction();
|
submitAction();
|
||||||
|
|||||||
+138
-145
@@ -1,5 +1,5 @@
|
|||||||
var templateGeneralCard =
|
var templateGeneralCard =
|
||||||
'<div class="general_card">\
|
'<div class="general_card">\
|
||||||
<h4 class="bg1 with_border"><%name%></h4>\
|
<h4 class="bg1 with_border"><%name%></h4>\
|
||||||
<h4><img src="<%iconPath%>" height=64 width=64></h4>\
|
<h4><img src="<%iconPath%>" height=64 width=64></h4>\
|
||||||
<p><%leadership%> / <%strength%> / <%intel%><br>\
|
<p><%leadership%> / <%strength%> / <%intel%><br>\
|
||||||
@@ -11,7 +11,7 @@ var templateGeneralCard =
|
|||||||
</div>';
|
</div>';
|
||||||
|
|
||||||
var templateSpecial =
|
var templateSpecial =
|
||||||
'<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\
|
'<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\
|
||||||
<span class="tooltiptext">\
|
<span class="tooltiptext">\
|
||||||
<%info%>\
|
<%info%>\
|
||||||
</span>\
|
</span>\
|
||||||
@@ -19,7 +19,7 @@ var templateSpecial =
|
|||||||
';
|
';
|
||||||
|
|
||||||
var templateGeneralRow =
|
var templateGeneralRow =
|
||||||
'<tr>\
|
'<tr>\
|
||||||
<td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\
|
<td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\
|
||||||
<td style="<%userCSS%>"><%name%><%nameAux%></td>\
|
<td style="<%userCSS%>"><%name%><%nameAux%></td>\
|
||||||
<td><%age%>세</td>\
|
<td><%age%>세</td>\
|
||||||
@@ -37,7 +37,7 @@ var templateGeneralRow =
|
|||||||
<td><%killturn%></td>\
|
<td><%killturn%></td>\
|
||||||
</tr>';
|
</tr>';
|
||||||
|
|
||||||
function pickGeneral(){
|
function pickGeneral() {
|
||||||
$btn = $(this);
|
$btn = $(this);
|
||||||
|
|
||||||
if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
|
if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
|
||||||
@@ -45,13 +45,13 @@ function pickGeneral(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_select_npc.php',
|
url: 'j_select_npc.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
pick:$btn.val()
|
pick: $btn.val()
|
||||||
}
|
}
|
||||||
}).then(function(result){
|
}).then(function(result) {
|
||||||
if(!result.result){
|
if (!result.result) {
|
||||||
alert(result.reason);
|
alert(result.reason);
|
||||||
location.refresh();
|
location.refresh();
|
||||||
}
|
}
|
||||||
@@ -62,32 +62,30 @@ function pickGeneral(){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateOutdateTimer(){
|
function updateOutdateTimer() {
|
||||||
var $validUntilText = $('#valid_until_text');
|
var $validUntilText = $('#valid_until_text');
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
var validUntil = $validUntilText.data('until');
|
var validUntil = $validUntilText.data('until');
|
||||||
if(validUntil <= 0){
|
if (validUntil <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
} else if (validUntil < now) {
|
||||||
else if(validUntil < now){
|
$validUntilText.data('until', 0);
|
||||||
$validUntilText.data('until',0);
|
|
||||||
$('#valid_until').hide();
|
$('#valid_until').hide();
|
||||||
$('#outdate_token').show();
|
$('#outdate_token').show();
|
||||||
return;
|
return;
|
||||||
}
|
} else if (validUntil - now <= 30000) {
|
||||||
else if(validUntil - now <= 30000){
|
$validUntilText.css('color', "rgb(255, {0}, {0})".format(255 * (validUntil - now) / 30000));
|
||||||
$validUntilText.css('color', "rgb(255, {0}, {0})".format(255*(validUntil - now)/30000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(updateOutdateTimer, 1000);
|
setTimeout(updateOutdateTimer, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updatePickMoreTimer(){
|
function updatePickMoreTimer() {
|
||||||
var $btn = $('#btn_pick_more');
|
var $btn = $('#btn_pick_more');
|
||||||
|
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
var remain = ($btn.data('available') - now) / 1000;
|
var remain = ($btn.data('available') - now) / 1000;
|
||||||
if(remain <= 0){
|
if (remain <= 0) {
|
||||||
$btn.prop('disabled', false)
|
$btn.prop('disabled', false)
|
||||||
$btn.html('다른 장수 보기');
|
$btn.html('다른 장수 보기');
|
||||||
return;
|
return;
|
||||||
@@ -98,53 +96,50 @@ function updatePickMoreTimer(){
|
|||||||
setTimeout(updatePickMoreTimer, 250);
|
setTimeout(updatePickMoreTimer, 250);
|
||||||
}
|
}
|
||||||
|
|
||||||
function printGenerals(value){
|
function printGenerals(value) {
|
||||||
$('.card_holder').empty();
|
$('.card_holder').empty();
|
||||||
$('#valid_until').show();
|
$('#valid_until').show();
|
||||||
$('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color','white');
|
$('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color', 'white');
|
||||||
$('#outdate_token').hide();
|
$('#outdate_token').hide();
|
||||||
var time = Date.now() + value.pickMoreSeconds*1000;
|
var time = Date.now() + value.pickMoreSeconds * 1000;
|
||||||
$('#btn_pick_more').data('available', time).prop('disabled',true);
|
$('#btn_pick_more').data('available', time).prop('disabled', true);
|
||||||
|
|
||||||
var pick = $.map(value.pick, function(value, key) {
|
var pick = $.map(value.pick, function(value, key) {
|
||||||
return value;
|
return value;
|
||||||
});
|
});
|
||||||
|
|
||||||
pick.sort(function(lhs, rhs){
|
pick.sort(function(lhs, rhs) {
|
||||||
var lsum = lhs.leadership+lhs.strength+lhs.intel;
|
var lsum = lhs.leadership + lhs.strength + lhs.intel;
|
||||||
var rsum = rhs.leadership+rhs.strength+rhs.intel;
|
var rsum = rhs.leadership + rhs.strength + rhs.intel;
|
||||||
return lsum - rsum;
|
return lsum - rsum;
|
||||||
});
|
});
|
||||||
|
|
||||||
$.each(pick, function(idx, cardData){
|
$.each(pick, function(idx, cardData) {
|
||||||
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture);
|
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture);
|
||||||
if(cardData.special in specialInfo){
|
if (cardData.special in specialInfo) {
|
||||||
cardData.specialText = TemplateEngine(templateSpecial, {
|
cardData.specialText = TemplateEngine(templateSpecial, {
|
||||||
text:cardData.special,
|
text: cardData.special,
|
||||||
info:specialInfo[cardData.special]
|
info: specialInfo[cardData.special]
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
cardData.specialText = cardData.special;
|
cardData.specialText = cardData.special;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cardData.special2 in specialInfo){
|
if (cardData.special2 in specialInfo) {
|
||||||
cardData.special2Text = TemplateEngine(templateSpecial, {
|
cardData.special2Text = TemplateEngine(templateSpecial, {
|
||||||
text:cardData.special2,
|
text: cardData.special2,
|
||||||
info:specialInfo[cardData.special2]
|
info: specialInfo[cardData.special2]
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
cardData.special2Text = cardData.special2;
|
cardData.special2Text = cardData.special2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cardData.personal in characterInfo){
|
if (cardData.personal in characterInfo) {
|
||||||
cardData.personalText = TemplateEngine(templateSpecial, {
|
cardData.personalText = TemplateEngine(templateSpecial, {
|
||||||
text:cardData.personal,
|
text: cardData.personal,
|
||||||
info:characterInfo[cardData.personal]
|
info: characterInfo[cardData.personal]
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
cardData.personalText = cardData.personal;
|
cardData.personalText = cardData.personal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,10 +149,10 @@ function printGenerals(value){
|
|||||||
$('.card_holder').append($card);
|
$('.card_holder').append($card);
|
||||||
$card.find('.select_btn').click(pickGeneral);
|
$card.find('.select_btn').click(pickGeneral);
|
||||||
$card.find('.obj_tooltip').tooltip({
|
$card.find('.obj_tooltip').tooltip({
|
||||||
title:function(){
|
title: function() {
|
||||||
return $.trim($(this).find('.tooltiptext').html());
|
return $.trim($(this).find('.tooltiptext').html());
|
||||||
},
|
},
|
||||||
html:true
|
html: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -165,59 +160,57 @@ function printGenerals(value){
|
|||||||
updateOutdateTimer();
|
updateOutdateTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
function printGeneralList(value){
|
function printGeneralList(value) {
|
||||||
var tokenList = value.token;
|
var tokenList = value.token;
|
||||||
var generalList = $.map(value.list, function(general){
|
var generalList = $.map(value.list, function(general) {
|
||||||
general = {
|
general = {
|
||||||
no:general[0],
|
no: general[0],
|
||||||
picture:general[1],
|
picture: general[1],
|
||||||
imgsvr:general[2],
|
imgsvr: general[2],
|
||||||
npc:general[3],
|
npc: general[3],
|
||||||
age:general[4],
|
age: general[4],
|
||||||
nation:general[5],
|
nation: general[5],
|
||||||
special:general[6],
|
special: general[6],
|
||||||
special2:general[7],
|
special2: general[7],
|
||||||
personal:general[8],
|
personal: general[8],
|
||||||
name:general[9],
|
name: general[9],
|
||||||
ownerName:general[10],
|
ownerName: general[10],
|
||||||
injury:general[11],
|
injury: general[11],
|
||||||
leadership:general[12],
|
leadership: general[12],
|
||||||
lbonus:general[13],
|
lbonus: general[13],
|
||||||
strength:general[14],
|
strength: general[14],
|
||||||
intel:general[15],
|
intel: general[15],
|
||||||
explevel:general[16],
|
explevel: general[16],
|
||||||
experience:general[17],
|
experience: general[17],
|
||||||
dedication:general[18],
|
dedication: general[18],
|
||||||
officerLevel:general[19],
|
officerLevel: general[19],
|
||||||
killturn:general[20],
|
killturn: general[20],
|
||||||
connect:general[21],
|
connect: general[21],
|
||||||
reserved:0
|
reserved: 0
|
||||||
};
|
};
|
||||||
if(general.npc < 2){
|
if (general.npc < 2) {
|
||||||
general.reserved = 2;
|
general.reserved = 2;
|
||||||
}
|
}
|
||||||
if(general.no in tokenList){
|
if (general.no in tokenList) {
|
||||||
general.reserved = 1;
|
general.reserved = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
general.userCSS = "";
|
general.userCSS = "";
|
||||||
general.nameAux = "";
|
general.nameAux = "";
|
||||||
|
|
||||||
if(general.reserved == 1){
|
if (general.reserved == 1) {
|
||||||
general.userCSS = 'color:violet';
|
general.userCSS = 'color:violet';
|
||||||
}
|
} else if (general.npc >= 2) {
|
||||||
else if(general.npc >= 2){
|
|
||||||
general.userCSS = 'color:cyan';
|
general.userCSS = 'color:cyan';
|
||||||
}
|
} else if (general.npc == 1) {
|
||||||
else if(general.npc == 1){
|
|
||||||
general.userCSS = 'color:skyblue';
|
general.userCSS = 'color:skyblue';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(general.ownerName){
|
if (general.ownerName) {
|
||||||
general.nameAux += '<br><small>({0})</small>'.format(general.ownerName);
|
general.nameAux += '<br><small>({0})</small>'.format(general.ownerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(general.reserved == 1){
|
if (general.reserved == 1) {
|
||||||
general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]);
|
general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,41 +219,41 @@ function printGeneralList(value){
|
|||||||
general.iconPath = getIconPath(general.imgsvr, general.picture);
|
general.iconPath = getIconPath(general.imgsvr, general.picture);
|
||||||
|
|
||||||
general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
|
general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
|
||||||
text:general.special,
|
text: general.special,
|
||||||
info:specialInfo[general.special]
|
info: specialInfo[general.special]
|
||||||
});
|
});
|
||||||
|
|
||||||
general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
|
general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
|
||||||
text:general.special2,
|
text: general.special2,
|
||||||
info:specialInfo[general.special2]
|
info: specialInfo[general.special2]
|
||||||
});
|
});
|
||||||
|
|
||||||
general.personalWithTooltip = TemplateEngine(templateSpecial, {
|
general.personalWithTooltip = TemplateEngine(templateSpecial, {
|
||||||
text:general.personal,
|
text: general.personal,
|
||||||
info:characterInfo[general.personal]
|
info: characterInfo[general.personal]
|
||||||
});
|
});
|
||||||
|
|
||||||
return general;
|
return general;
|
||||||
});
|
});
|
||||||
|
|
||||||
generalList.sort(function(lhs, rhs){
|
generalList.sort(function(lhs, rhs) {
|
||||||
if(lhs.reserved > rhs.reserved){
|
if (lhs.reserved > rhs.reserved) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(lhs.reserved < rhs.reserved){
|
if (lhs.reserved < rhs.reserved) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(lhs.total != rhs.total){
|
if (lhs.total != rhs.total) {
|
||||||
return rhs.total - lhs.total;
|
return rhs.total - lhs.total;
|
||||||
}
|
}
|
||||||
if(lhs.leadership != rhs.leadership){
|
if (lhs.leadership != rhs.leadership) {
|
||||||
return rhs.leadership - lhs.total;
|
return rhs.leadership - lhs.total;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lhs.name < rhs.name){
|
if (lhs.name < rhs.name) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(lhs.name > rhs.name){
|
if (lhs.name > rhs.name) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -270,9 +263,9 @@ function printGeneralList(value){
|
|||||||
_printGeneralList(true);
|
_printGeneralList(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _printGeneralList(clear){
|
function _printGeneralList(clear) {
|
||||||
var $generalTable = $('#general_list');
|
var $generalTable = $('#general_list');
|
||||||
if(clear){
|
if (clear) {
|
||||||
$generalTable.empty();
|
$generalTable.empty();
|
||||||
$generalTable.data('lastIdx', 0);
|
$generalTable.data('lastIdx', 0);
|
||||||
$('#row_print_more').show();
|
$('#row_print_more').show();
|
||||||
@@ -284,77 +277,77 @@ function _printGeneralList(clear){
|
|||||||
var idxTo = Math.min(idxFrom + 50, generalList.length);
|
var idxTo = Math.min(idxFrom + 50, generalList.length);
|
||||||
$generalTable.data('lastIdx', idxTo);
|
$generalTable.data('lastIdx', idxTo);
|
||||||
|
|
||||||
for(var idx = idxFrom; idx < idxFrom + 50; idx++){
|
for (var idx = idxFrom; idx < idxFrom + 50; idx++) {
|
||||||
var general = generalList[idx];
|
var general = generalList[idx];
|
||||||
$generalTable.append(TemplateEngine(templateGeneralRow, general));
|
$generalTable.append(TemplateEngine(templateGeneralRow, general));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(idxTo == generalList.length){
|
if (idxTo == generalList.length) {
|
||||||
$('#row_print_more').hide();
|
$('#row_print_more').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalTable.find('.obj_tooltip').tooltip({
|
$generalTable.find('.obj_tooltip').tooltip({
|
||||||
title:function(){
|
title: function() {
|
||||||
return $.trim($(this).find('.tooltiptext').html());
|
return $.trim($(this).find('.tooltiptext').html());
|
||||||
},
|
},
|
||||||
html:true
|
html: true
|
||||||
});
|
});
|
||||||
$('#tb_general_list').show();
|
$('#tb_general_list').show();
|
||||||
}
|
}
|
||||||
|
|
||||||
$(function($){
|
$(function($) {
|
||||||
window.generalList = [];
|
window.generalList = [];
|
||||||
|
|
||||||
$.post('j_get_select_npc_token.php').then(function(value){
|
$.post('j_get_select_npc_token.php').then(function(value) {
|
||||||
if(!value.result){
|
if (!value.result) {
|
||||||
alert(value.reason);
|
alert(value.reason);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(value);
|
console.log(value);
|
||||||
printGenerals(value);
|
printGenerals(value);
|
||||||
});
|
|
||||||
|
|
||||||
$('#btn_pick_more').click(function(){
|
|
||||||
var generals = $.map($('.keep_select:checked'), function(value){
|
|
||||||
return $(value).val();
|
|
||||||
});
|
});
|
||||||
console.log(generals);
|
|
||||||
$.post({
|
$('#btn_pick_more').click(function() {
|
||||||
url:'j_get_select_npc_token.php',
|
var generals = $.map($('.keep_select:checked'), function(value) {
|
||||||
dataType:'json',
|
return $(value).val();
|
||||||
data:{
|
});
|
||||||
refresh:true,
|
console.log(generals);
|
||||||
keep:generals
|
$.post({
|
||||||
}
|
url: 'j_get_select_npc_token.php',
|
||||||
}).then(function(result){
|
dataType: 'json',
|
||||||
if(!result.result){
|
data: {
|
||||||
alert(result.reason);
|
refresh: true,
|
||||||
location.refresh();
|
keep: generals
|
||||||
}
|
}
|
||||||
console.log(result);
|
}).then(function(result) {
|
||||||
printGenerals(result);
|
if (!result.result) {
|
||||||
|
alert(result.reason);
|
||||||
|
location.refresh();
|
||||||
|
}
|
||||||
|
console.log(result);
|
||||||
|
printGenerals(result);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
$('#btn_load_general_list').click(function(){
|
$('#btn_load_general_list').click(function() {
|
||||||
$.post({
|
$.post({
|
||||||
url:'j_get_general_list.php',
|
url: 'j_get_general_list.php',
|
||||||
dataType:'json',
|
dataType: 'json',
|
||||||
data:{
|
data: {
|
||||||
with_token:true
|
with_token: true
|
||||||
}
|
}
|
||||||
}).then(function(result){
|
}).then(function(result) {
|
||||||
if(!result.result){
|
if (!result.result) {
|
||||||
alert(result.reason);
|
alert(result.reason);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
printGeneralList(result);
|
printGeneralList(result);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
$('#btn_print_more').click(function(){
|
$('#btn_print_more').click(function() {
|
||||||
_printGeneralList();
|
_printGeneralList();
|
||||||
})
|
})
|
||||||
|
|
||||||
});
|
});
|
||||||
+17
@@ -55,3 +55,20 @@ function LogText($prefix, $variable)
|
|||||||
$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable));
|
$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable));
|
||||||
file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
|
file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function prepareDir(string $dirPath, bool $forceCreate=true):bool{
|
||||||
|
if(file_exists($dirPath)){
|
||||||
|
if(is_dir($dirPath)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(!$forceCreate){
|
||||||
|
throw new \RuntimeException('이미 파일이 있습니다');
|
||||||
|
}
|
||||||
|
if(!unlink($dirPath)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return mkdir($dirPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mkdir($dirPath, 0777, true);
|
||||||
|
}
|
||||||
+7
-3
@@ -558,13 +558,17 @@ function ConquerCity(array $admin, General $general, array $city) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병)
|
//NPC인 경우 일정 확률로 임관(엔장, 인재, 의병)
|
||||||
$npcType = $oldGeneral->getNPCType();
|
$npcType = $oldGeneral->getNPCType();
|
||||||
if($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(0.1)) {
|
if($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(GameConst::$joinRuinedNPCProp)) {
|
||||||
$cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [
|
$cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [
|
||||||
'destNationID'=>$attackerNationID
|
'destNationID'=>$attackerNationID
|
||||||
]);
|
]);
|
||||||
_setGeneralCommand($cmd, [0]);
|
$joinTurn = Util::randRangeInt(0, 12);
|
||||||
|
if($joinTurn){
|
||||||
|
_setGeneralCommand(buildGeneralCommandClass('che_견문', $oldGeneral, $admin), iterator_to_array(Util::range($joinTurn)));
|
||||||
|
}
|
||||||
|
_setGeneralCommand($cmd, [$joinTurn]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
require('../vendor/autoload.php');
|
||||||
|
|
||||||
|
//ParsedownExtra;
|
||||||
@@ -8,7 +8,7 @@ class che_계략_삼략 extends \sammo\BaseItem{
|
|||||||
protected $id = 22;
|
protected $id = 22;
|
||||||
protected $rawName = '삼략';
|
protected $rawName = '삼략';
|
||||||
protected $name = '삼략(계략)';
|
protected $name = '삼략(계략)';
|
||||||
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p';
|
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p<br>[전투] 계략 시도 확률 +10%p, 계략 성공 확률 +10%p';
|
||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
@@ -19,4 +19,14 @@ class che_계략_삼략 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicTrialProb'){
|
||||||
|
return $value + 0.1;
|
||||||
|
}
|
||||||
|
if($statName === 'warMagicSuccessProb'){
|
||||||
|
return $value + 0.1;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ class che_계략_육도 extends \sammo\BaseItem{
|
|||||||
protected $id = 21;
|
protected $id = 21;
|
||||||
protected $rawName = '육도';
|
protected $rawName = '육도';
|
||||||
protected $name = '육도(계략)';
|
protected $name = '육도(계략)';
|
||||||
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p';
|
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p<br>[전투] 계략 시도 확률 +10%p, 계략 성공 확률 +10%p';
|
||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
@@ -19,4 +19,14 @@ class che_계략_육도 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicTrialProb'){
|
||||||
|
return $value + 0.1;
|
||||||
|
}
|
||||||
|
if($statName === 'warMagicSuccessProb'){
|
||||||
|
return $value + 0.1;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ class che_계략_이추 extends \sammo\BaseItem{
|
|||||||
protected $id = 5;
|
protected $id = 5;
|
||||||
protected $rawName = '이추';
|
protected $rawName = '이추';
|
||||||
protected $name = '이추(계략)';
|
protected $name = '이추(계략)';
|
||||||
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p';
|
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p';
|
||||||
protected $cost = 1000;
|
protected $cost = 1000;
|
||||||
protected $consumable = true;
|
protected $consumable = true;
|
||||||
protected $buyable = true;
|
protected $buyable = true;
|
||||||
@@ -16,7 +16,7 @@ class che_계략_이추 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
if($turnType == '계략'){
|
if($turnType == '계략'){
|
||||||
if($varType == 'success') return $value + 0.1;
|
if($varType == 'success') return $value + 0.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
return $value;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class che_계략_향낭 extends \sammo\BaseItem{
|
|||||||
protected $id = 5;
|
protected $id = 5;
|
||||||
protected $rawName = '항냥';
|
protected $rawName = '항냥';
|
||||||
protected $name = '항냥(계략)';
|
protected $name = '항냥(계략)';
|
||||||
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p';
|
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +50%p';
|
||||||
protected $cost = 3000;
|
protected $cost = 3000;
|
||||||
protected $consumable = true;
|
protected $consumable = true;
|
||||||
protected $buyable = true;
|
protected $buyable = true;
|
||||||
@@ -16,7 +16,7 @@ class che_계략_향낭 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
if($turnType == '계략'){
|
if($turnType == '계략'){
|
||||||
if($varType == 'success') return $value + 0.2;
|
if($varType == 'success') return $value + 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
return $value;
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\BaseWarUnitTrigger;
|
||||||
|
use \sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계발동;
|
||||||
|
|
||||||
|
class che_반계_백우선 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 45;
|
||||||
|
protected $rawName = '백우선';
|
||||||
|
protected $name = '백우선(반계)';
|
||||||
|
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '계략약화'),
|
||||||
|
new che_반계시도($unit),
|
||||||
|
new che_반계발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\BaseWarUnitTrigger;
|
||||||
|
use \sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계발동;
|
||||||
|
|
||||||
|
class che_반계_파초선 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 45;
|
||||||
|
protected $rawName = '파초선';
|
||||||
|
protected $name = '파초선(반계)';
|
||||||
|
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '계략약화'),
|
||||||
|
new che_반계시도($unit),
|
||||||
|
new che_반계발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\GeneralTrigger;
|
||||||
|
use \sammo\GeneralTriggerCaller;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use sammo\BaseWarUnitTrigger;
|
||||||
|
use sammo\WarUnitTrigger\che_부상무효;
|
||||||
|
use sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
|
||||||
|
class che_부적_태현청생부 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 9;
|
||||||
|
protected $rawName = '태현청생부';
|
||||||
|
protected $name = '태현청생부(부적)';
|
||||||
|
protected $info = '[전투] 저격 불가, 부상 없음';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_NONE),
|
||||||
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\GeneralTrigger;
|
||||||
|
use \sammo\GeneralTriggerCaller;
|
||||||
|
use \sammo\BaseWarUnitTrigger;
|
||||||
|
use \sammo\WarUnitTriggerCaller;
|
||||||
|
use sammo\WarUnitTrigger\che_전투치료발동;
|
||||||
|
use sammo\WarUnitTrigger\che_전투치료시도;
|
||||||
|
|
||||||
|
class che_의술_상한잡병론 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 24;
|
||||||
|
protected $rawName = '상한잡병론';
|
||||||
|
protected $name = '상한잡병론(의술)';
|
||||||
|
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
||||||
|
return new GeneralTriggerCaller(
|
||||||
|
new GeneralTrigger\che_도시치료($general)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_전투치료시도($unit, BaseWarUnitTrigger::TYPE_ITEM),
|
||||||
|
new che_전투치료발동($unit, BaseWarUnitTrigger::TYPE_ITEM)
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ class che_의술_청낭서 extends \sammo\BaseItem{
|
|||||||
protected $id = 23;
|
protected $id = 23;
|
||||||
protected $rawName = '청낭서';
|
protected $rawName = '청낭서';
|
||||||
protected $name = '청낭서(의술)';
|
protected $name = '청낭서(의술)';
|
||||||
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)';
|
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
|
||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class che_의술_태평청령 extends \sammo\BaseItem{
|
|||||||
protected $id = 24;
|
protected $id = 24;
|
||||||
protected $rawName = '태평청령';
|
protected $rawName = '태평청령';
|
||||||
protected $name = '태평청령(의술)';
|
protected $name = '태평청령(의술)';
|
||||||
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)';
|
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
|
||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격발동;
|
||||||
|
|
||||||
|
class che_저격_매화수전 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 70;
|
||||||
|
protected $rawName = '매화수전';
|
||||||
|
protected $name = '매화수전(저격)';
|
||||||
|
protected $info = '[전투] 새로운 상대와 전투 시 50% 확률로 저격 발동, 성공 시 사기+10';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM, 0.5, 20, 40),
|
||||||
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격발동;
|
||||||
|
|
||||||
|
class che_저격_비도 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 70;
|
||||||
|
protected $rawName = '비도';
|
||||||
|
protected $name = '비도(저격)';
|
||||||
|
protected $info = '[전투] 새로운 상대와 전투 시 50% 확률로 저격 발동, 성공 시 사기+10';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM, 0.5, 20, 40),
|
||||||
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ class che_저격_수극 extends \sammo\BaseItem{
|
|||||||
protected $id = 2;
|
protected $id = 2;
|
||||||
protected $rawName = '수극';
|
protected $rawName = '수극';
|
||||||
protected $name = '수극(저격)';
|
protected $name = '수극(저격)';
|
||||||
protected $info = '[전투] 전투 개시 전 20% 확률로 저격 시도. 1회용';
|
protected $info = '[전투] 전투 개시 전 50% 확률로 저격 시도. 1회용';
|
||||||
protected $cost = 1000;
|
protected $cost = 1000;
|
||||||
protected $consumable = true;
|
protected $consumable = true;
|
||||||
protected $buyable = true;
|
protected $buyable = true;
|
||||||
@@ -21,7 +21,7 @@ class che_저격_수극 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM, 0.2, 20, 40),
|
new che_저격시도($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM, 0.5, 20, 40),
|
||||||
new che_저격발동($unit)
|
new che_저격발동($unit)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class che_치료_환약 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
||||||
return new GeneralTriggerCaller(
|
return new GeneralTriggerCaller(
|
||||||
new GeneralTrigger\che_아이템치료($general)
|
new GeneralTrigger\che_아이템치료($general, $general->getAuxVar('use_treatment')??10)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
|
||||||
|
class che_행동_서촉지형도 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 22;
|
||||||
|
protected $rawName = '서촉지형도';
|
||||||
|
protected $name = '서촉지형도(행동)';
|
||||||
|
protected $info = '[전투] 공격 시 페이즈 + 2';
|
||||||
|
protected $cost = 200;
|
||||||
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'initWarPhase'){
|
||||||
|
return $value + 2;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use sammo\WarUnitTrigger\che_격노시도;
|
||||||
|
use sammo\WarUnitTrigger\che_격노발동;
|
||||||
|
|
||||||
|
class event_전투특기_격노 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 74;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(격노)';
|
||||||
|
protected $info = '[전투] 상대방 필살 시 격노(필살) 발동, 회피 시도시 25% 확률로 격노 발동, 공격 시 일정 확률로 진노(1페이즈 추가)';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_격노시도($unit),
|
||||||
|
new che_격노발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\GameUnitConst;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use \sammo\WarUnitCity;
|
||||||
|
|
||||||
|
class event_전투특기_공성 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 53;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(공성)';
|
||||||
|
protected $info = '[군사] 차병 계통 징·모병비 -10%<br>[전투] 성벽 공격 시 대미지 +100%,<br>공격시 상대 병종에/수비시 자신 병종 숙련에 차병 숙련을 가산';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if(in_array($turnType, ['징병', '모병'])){
|
||||||
|
if($varType == 'cost' && $aux['armType'] == GameUnitConst::T_SIEGE) return $value * 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
|
if($unit->getOppose() instanceof WarUnitCity){
|
||||||
|
return [2, 1];
|
||||||
|
}
|
||||||
|
return [1, 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if(\sammo\Util::starts_with($statName, 'dex')){
|
||||||
|
$myArmType = 'dex'.GameUnitConst::T_SIEGE;
|
||||||
|
$opposeArmType = 'dex'.$aux['opposeType']->armType;;
|
||||||
|
if($aux['isAttacker'] && $opposeArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
if(!$aux['isAttacker'] && $myArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
|
||||||
|
use \sammo\GameUnitConst;
|
||||||
|
|
||||||
|
class event_전투특기_궁병 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 51;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(궁병)';
|
||||||
|
protected $info = '[군사] 궁병 계통 징·모병비 -10%<br>[전투] 회피 확률 +20%p,<br>공격시 상대 병종에/수비시 자신 병종 숙련에 궁병 숙련을 가산';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if(in_array($turnType, ['징병', '모병'])){
|
||||||
|
if($varType == 'cost' && $aux['armType'] == GameUnitConst::T_ARCHER) return $value * 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warAvoidRatio'){
|
||||||
|
return $value + 0.2;
|
||||||
|
}
|
||||||
|
if(\sammo\Util::starts_with($statName, 'dex')){
|
||||||
|
$myArmType = 'dex'.GameUnitConst::T_ARCHER;
|
||||||
|
$opposeArmType = 'dex'.$aux['opposeType']->armType;;
|
||||||
|
if($aux['isAttacker'] && $opposeArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
if(!$aux['isAttacker'] && $myArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\GameUnitConst;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
|
||||||
|
class event_전투특기_귀병 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 40;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(귀병)';
|
||||||
|
protected $info = '[군사] 귀병 계통 징·모병비 -10%<br>[전투] 계략 성공 확률 +20%p,<br>공격시 상대 병종에/수비시 자신 병종 숙련에 귀병 숙련을 가산';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if(in_array($turnType, ['징병', '모병'])){
|
||||||
|
if($varType == 'cost' && $aux['armType'] == GameUnitConst::T_WIZARD) return $value * 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicSuccessProb'){
|
||||||
|
return $value + 0.2;
|
||||||
|
}
|
||||||
|
if(\sammo\Util::starts_with($statName, 'dex')){
|
||||||
|
$myArmType = 'dex'.GameUnitConst::T_WIZARD;
|
||||||
|
$opposeArmType = 'dex'.$aux['opposeType']->armType;;
|
||||||
|
if($aux['isAttacker'] && $opposeArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
if(!$aux['isAttacker'] && $myArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\GameUnitConst;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
|
||||||
|
class event_전투특기_기병 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 52;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(기병)';
|
||||||
|
protected $info = '[군사] 기병 계통 징·모병비 -10%<br>[전투] 수비 시 대미지 +10%, 공격 시 대미지 +20%,<br>공격시 상대 병종에/수비시 자신 병종 숙련에 기병 숙련을 가산';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if(in_array($turnType, ['징병', '모병'])){
|
||||||
|
if($varType == 'cost' && $aux['armType'] == GameUnitConst::T_CAVALRY) return $value * 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
|
if($unit->isAttacker()){
|
||||||
|
return [1.2, 1];
|
||||||
|
}
|
||||||
|
return [1.1, 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if(\sammo\Util::starts_with($statName, 'dex')){
|
||||||
|
$myArmType = 'dex'.GameUnitConst::T_CAVALRY;
|
||||||
|
$opposeArmType = 'dex'.$aux['opposeType']->armType;;
|
||||||
|
if($aux['isAttacker'] && $opposeArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
if(!$aux['isAttacker'] && $myArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use \sammo\BaseWarUnitTrigger;
|
||||||
|
use \sammo\WarUnitTriggerCaller;
|
||||||
|
use sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
use \sammo\WarUnitTrigger\che_돌격지속;
|
||||||
|
|
||||||
|
class event_전투특기_돌격 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 60;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(돌격)';
|
||||||
|
protected $info = '[전투] 공격 시 대등/유리한 병종에게는 퇴각 전까지 전투, 공격 시 페이즈 + 2, 공격 시 대미지 +5%';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'initWarPhase'){
|
||||||
|
return $value + 2;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
|
if($unit->isAttacker()){
|
||||||
|
return [1.05, 1];
|
||||||
|
}
|
||||||
|
return [1, 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_돌격지속($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use \sammo\Util;
|
||||||
|
|
||||||
|
class event_전투특기_무쌍 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 61;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(무쌍)';
|
||||||
|
protected $info = '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대40%)<br>승리 수만큼 피해 0.05%씩 감소(최대50%)';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){
|
||||||
|
return $value += 0.1;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
|
$attackMultiplier = 1.1;
|
||||||
|
$defenceMultiplier = 1;
|
||||||
|
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
||||||
|
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.4);
|
||||||
|
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.5);
|
||||||
|
return [$attackMultiplier, $defenceMultiplier];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\BaseWarUnitTrigger;
|
||||||
|
use \sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_반계발동;
|
||||||
|
|
||||||
|
class event_전투특기_반계 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 45;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(반계)';
|
||||||
|
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림, 반목 성공시 대미지 추가(+60% → +150%)';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicSuccessDamage' && $aux === '반목'){
|
||||||
|
return $value + 0.9;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '계략약화'),
|
||||||
|
new che_반계시도($unit),
|
||||||
|
new che_반계발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\GameUnitConst;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
|
||||||
|
class event_전투특기_보병 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 50;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(보병)';
|
||||||
|
protected $info = '[군사] 보병 계통 징·모병비 -10%<br>[전투] 공격 시 아군 피해 -10%, 수비 시 아군 피해 -20%,<br>공격시 상대 병종에/수비시 자신 병종 숙련에 보병 숙련을 가산';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if(in_array($turnType, ['징병', '모병'])){
|
||||||
|
if($varType == 'cost' && $aux['armType'] == GameUnitConst::T_FOOTMAN) return $value * 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
|
if($unit->isAttacker()){
|
||||||
|
return [1, 0.9];
|
||||||
|
}
|
||||||
|
return [1, 0.8];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if(\sammo\Util::starts_with($statName, 'dex')){
|
||||||
|
$myArmType = 'dex'.GameUnitConst::T_FOOTMAN;
|
||||||
|
$opposeArmType = 'dex'.$aux['opposeType']->armType;;
|
||||||
|
if($aux['isAttacker'] && $opposeArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
if(!$aux['isAttacker'] && $myArmType === $statName){
|
||||||
|
return $value + $general->getVar($myArmType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
|
||||||
|
class event_전투특기_신산 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 41;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(신산)';
|
||||||
|
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p<br>[전투] 계략 시도 확률 +20%p, 계략 성공 확률 +20%p';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
||||||
|
if($turnType == '계략'){
|
||||||
|
if($varType == 'success') return $value + 0.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicTrialProb'){
|
||||||
|
return $value + 0.2;
|
||||||
|
}
|
||||||
|
if($statName === 'warMagicSuccessProb'){
|
||||||
|
return $value + 0.2;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
|
||||||
|
class event_전투특기_신중 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 44;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(신중)';
|
||||||
|
protected $info = '[전투] 계략 성공 확률 100%';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
if($statName === 'warMagicSuccessProb'){
|
||||||
|
return $value + 1;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\WarUnitTrigger\che_위압시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_위압발동;
|
||||||
|
|
||||||
|
class event_전투특기_위압 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 63;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(위압)';
|
||||||
|
protected $info = '[전투] 첫 페이즈 위압 발동(적 공격, 회피 불가, 사기 5 감소)';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
if($unit->getPhase() != 0){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_위압시도($unit),
|
||||||
|
new che_위압발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use sammo\BaseGeneralTrigger;
|
||||||
|
use sammo\SpecialityHelper;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\GeneralTrigger;
|
||||||
|
use \sammo\GeneralTriggerCaller;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTrigger\che_전투치료발동;
|
||||||
|
use sammo\WarUnitTrigger\che_전투치료시도;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
|
||||||
|
class event_전투특기_의술 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 73;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(의술)';
|
||||||
|
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
||||||
|
return new GeneralTriggerCaller(
|
||||||
|
new GeneralTrigger\che_도시치료($general)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_전투치료시도($unit, che_전투치료시도::TYPE_ITEM),
|
||||||
|
new che_전투치료발동($unit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
namespace sammo\ActionItem;
|
||||||
|
use \sammo\iAction;
|
||||||
|
use \sammo\General;
|
||||||
|
use \sammo\SpecialityHelper;
|
||||||
|
use \sammo\WarUnit;
|
||||||
|
use sammo\WarUnitTriggerCaller;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격시도;
|
||||||
|
use \sammo\WarUnitTrigger\che_저격발동;
|
||||||
|
|
||||||
|
class event_전투특기_저격 extends \sammo\BaseItem{
|
||||||
|
|
||||||
|
protected $id = 70;
|
||||||
|
protected $rawName = '비급';
|
||||||
|
protected $name = '비급(저격)';
|
||||||
|
protected $info = '[전투] 새로운 상대와 전투 시 50% 확률로 저격 발동, 성공 시 사기+10';
|
||||||
|
protected $cost = 100;
|
||||||
|
protected $buyable = true;
|
||||||
|
protected $consumable = false;
|
||||||
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
|
return new WarUnitTriggerCaller(
|
||||||
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM, 0.5, 20, 40),
|
||||||
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user