forked from devsam/core
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88c78ec892
|
||
|
|
006ca76922
|
||
|
|
8cb2e2a447
|
||
|
|
517c85d003
|
||
|
|
83556b710c
|
||
|
|
a43b9091f8
|
||
|
|
e83a1bef49
|
||
|
|
1147a8262c
|
||
|
|
8a987cc55e
|
||
|
|
b28ca864f9
|
||
|
|
4bf77a5c55
|
||
|
|
4ebc20f182
|
||
|
|
9eff1ccaed
|
||
|
|
66170c98dd
|
||
|
|
397c054c66
|
||
|
|
0611551dc0
|
||
|
|
008f88d995
|
||
|
|
7fe450bc07
|
||
|
|
a88ec71b44
|
||
|
|
8a5a3b67f7
|
||
|
|
63771da876
|
||
|
|
68891fafdb
|
||
|
|
df31300a0b
|
||
|
|
16fb782bbf
|
||
|
|
ed3e013a53
|
||
|
|
0bf568a655
|
||
|
|
a5e481af96
|
||
|
|
78a9641c14
|
||
|
|
b517000650
|
||
|
|
1d20eb3c3e
|
||
|
|
8248ccbcd5
|
||
|
|
b880b9bace
|
||
|
|
2da374410b
|
||
|
|
fff8f9493b
|
||
|
|
987baaa307
|
||
|
|
9512ea9b52
|
||
|
|
b0f3c1c97d
|
||
|
|
e823b97cf2
|
||
|
|
203859ee5f
|
||
|
|
4870e2fa30
|
||
|
|
970b702a2b
|
||
|
|
053288b227
|
||
|
|
e9b975bea7
|
||
|
|
89fda44db8
|
||
|
|
fac8536095
|
||
|
|
c79e65b6b7
|
||
|
|
677e65ff6d
|
||
|
|
0c7589d524
|
||
|
|
da27ae2bad
|
||
|
|
f8cd58bcb3 | ||
|
|
3671a289b8 | ||
|
|
48f4dbec50 | ||
|
|
bdb29006e9 | ||
|
|
5ea324f103 | ||
|
|
2f0cd32c18 | ||
|
|
e8911d40df | ||
|
|
89f173e7e3 | ||
|
|
b0ab3f6ace | ||
|
|
641af435d4 | ||
|
|
16a2f20af0 | ||
|
|
79734a6dcf | ||
|
|
2e2ff1b150 | ||
|
|
5ce899ee6e | ||
|
|
e041080773 | ||
|
|
f8448fbb51 | ||
|
|
8defcd29a4 | ||
|
|
fba60df9d1 | ||
|
|
a4ff1f44ba | ||
|
|
7b75f4e01b | ||
|
|
a9fc69e70f | ||
|
|
a06c574327 | ||
|
|
420ae2f45b | ||
|
|
850073a096 | ||
|
|
e40aa88253 | ||
|
|
ff92b0149a | ||
|
|
e6049a17a2 | ||
|
|
9bc1bc13f2 | ||
|
|
b9cda08a4e | ||
|
|
4e2193fe6f | ||
|
|
155af45378 | ||
|
|
66d6bbc772 | ||
|
|
066a6d4e6a | ||
|
|
94f5834b61 | ||
|
|
947286bd09 | ||
|
|
a0dee353b5 | ||
|
|
308b1f2348 | ||
|
|
897780cf1c | ||
|
|
0f8a8011be | ||
|
|
7ebfd960b1 | ||
|
|
7b3d64996d | ||
|
|
e578a2f310 | ||
|
|
eecb4f699b | ||
|
|
9f4f7a759e | ||
|
|
11a98eb184 | ||
|
|
ed0bc5e19f | ||
|
|
020a2d2668 | ||
|
|
27cdd3ee4b | ||
|
|
43a95979e1 | ||
|
|
800106f9cb | ||
|
|
e5c50e48d3 | ||
|
|
08e43bed71 | ||
|
|
6773b8cddb | ||
|
|
23c030fd00 | ||
|
|
d5e67bb16d | ||
|
|
188e3a0fa6 | ||
|
|
b31ee022af | ||
|
|
87e063e03e | ||
|
|
48fe26e4b1 | ||
|
|
88fcc64537 | ||
|
|
d9beabbbbc | ||
|
|
3da0a7d950 | ||
|
|
50b1db75f0 | ||
|
|
94bb96d208 | ||
|
|
93490276fd | ||
|
|
73a7bf5a61 | ||
|
|
8a1f8f8e2c | ||
|
|
39c88c11c4 | ||
|
|
c2e956a639 | ||
|
|
368f31d1fa | ||
|
|
d3390dc490 | ||
|
|
eb36b6a52f | ||
|
|
be882000ad | ||
|
|
266c1c6a5b | ||
|
|
7864fe1e0f | ||
|
|
fe08fe0e2e | ||
|
|
87775a9471 | ||
|
|
8089457aa8 | ||
|
|
e443f92ddb | ||
|
|
cb65666600 | ||
|
|
6ed174e5dc | ||
|
|
dd7f0ef3bf | ||
|
|
ec8e43a2a9 | ||
|
|
a83b6b55cd | ||
|
|
d43f15e096 | ||
|
|
e09fdefa68 | ||
|
|
2b483749bc | ||
|
|
048d71920c | ||
|
|
47366086d5 | ||
|
|
f9a73be82b | ||
|
|
e7918469e5 | ||
|
|
687559a1a3 | ||
|
|
398c11e607 | ||
|
|
191544d28b | ||
|
|
647c2439e3 | ||
|
|
da2a6f347a | ||
|
|
dca341f35e | ||
|
|
d38ddcd79e | ||
|
|
03675349d8 | ||
|
|
72768ba7b5 | ||
|
|
a5477db6b6 | ||
|
|
c146e8587b | ||
|
|
24b65b0395 | ||
|
|
2f42691d2b | ||
|
|
ea619bd693 | ||
|
|
35a56e74bb | ||
|
|
6fb2358161 | ||
|
|
a039fb871b | ||
|
|
a19da6cda5 | ||
|
|
e5ba980865 | ||
|
|
f95ee8fab8 | ||
|
|
120706ef3f | ||
|
|
58da20f276 | ||
|
|
64af68e2d6 | ||
|
|
76a8740644 | ||
|
|
0863fafec0 | ||
|
|
42579810a2 | ||
|
|
47e6b91b82 | ||
|
|
dd38344319 | ||
|
|
7964aa5f6b | ||
|
|
85d372ecec | ||
|
|
6a2b27b875 | ||
|
|
3b8a82fa42 | ||
|
|
551e17b37b | ||
|
|
acccb74b4e | ||
|
|
39be8fa4b8 | ||
|
|
fc0c183ca3 | ||
|
|
329a461721 | ||
|
|
35b178fe3c | ||
|
|
7464629597 | ||
|
|
cb3982e57c | ||
|
|
08eae297fd | ||
|
|
c46128ed3e | ||
|
|
78a55fb87a | ||
|
|
43a5162a15 | ||
|
|
cb5cb68bf4 | ||
|
|
b79a655d56 | ||
|
|
5b19c24f84 | ||
|
|
e3716bda56 | ||
|
|
b710a26b3e | ||
|
|
e5507e1e61 | ||
|
|
85f3d0b500 | ||
|
|
27811f4891 | ||
|
|
b22987f21b | ||
|
|
8665838472 | ||
|
|
da3fb2c094 | ||
|
|
485d696e85 | ||
|
|
687f2b2edf | ||
|
|
296a27a409 | ||
|
|
c5ceff6fb5 | ||
|
|
2cb697f3dc | ||
|
|
56fd26935d | ||
|
|
002b528ef8 | ||
|
|
1f60f5b3a4 | ||
|
|
cbafa4af61 | ||
|
|
19f936b6c0 | ||
|
|
016f3c73e3 | ||
|
|
57541eca89 | ||
|
|
b7e568fb98 | ||
|
|
438cff532b | ||
|
|
3f71490d14 | ||
|
|
2221a8c9bf | ||
|
|
7255588bcc | ||
|
|
c732bcddb1 | ||
|
|
9f363e46fc | ||
|
|
99242ac3d3 | ||
|
|
3d6aabda06 | ||
|
|
d28a5e095a | ||
|
|
8104852abf | ||
|
|
459c108b13 | ||
|
|
d318ff7d90 | ||
|
|
1371b84687 | ||
|
|
2cc679dcac | ||
|
|
04f5a1bbe1 | ||
|
|
83c2fc918f | ||
|
|
63cfa5e298 | ||
|
|
3e815691df | ||
|
|
0fc0031574 | ||
|
|
6d335284ee | ||
|
|
1a9010ac06 | ||
|
|
4f40fa7813 | ||
|
|
b7346b3816 | ||
|
|
400e47f616 | ||
|
|
5d499bbfbe | ||
|
|
e0d5c44184 | ||
|
|
f100998800 | ||
|
|
5bc31c91fa | ||
|
|
4ca929d47d | ||
|
|
4ba43ea76a | ||
|
|
34232a5504 | ||
|
|
9b7464ab69 | ||
|
|
f003f38f74 | ||
|
|
91b2cecb19 | ||
|
|
8c11661fb4 | ||
|
|
9aabe0442d | ||
|
|
b463720512 | ||
|
|
6bc7c67589 | ||
|
|
443543d70f | ||
|
|
46a94b7816 | ||
|
|
b2e297bbb3 | ||
|
|
16906e960e | ||
|
|
91bc734612 | ||
|
|
fa5546874a | ||
|
|
3921d159ef | ||
|
|
cfcdc3149f | ||
|
|
717017fad5 | ||
|
|
b8f957130d | ||
|
|
5824079b41 | ||
|
|
fbcfbb7156 | ||
|
|
b738984235 | ||
|
|
c29333f8e0 | ||
|
|
123cf8d437 | ||
|
|
9293c4e480 | ||
|
|
fa5919aa1a | ||
|
|
194f2bd2a5 | ||
|
|
0ae6584b02 | ||
|
|
397aa76e15 | ||
|
|
43997b9117 | ||
|
|
de5fe818e6 | ||
|
|
e3e315a068 | ||
|
|
5430a43589 | ||
|
|
a44172f509 | ||
|
|
94bfd79afa | ||
|
|
2b4de68f0a | ||
|
|
282b413553 | ||
|
|
5164585360 | ||
|
|
f6642ecb0f | ||
|
|
928042d71b | ||
|
|
91cb3c4344 | ||
|
|
eff79c4778 | ||
|
|
f7776d5067 | ||
|
|
68aae0bec1 | ||
|
|
cb7eb3b711 | ||
|
|
2a6b661285 | ||
|
|
d2ebf94453 | ||
|
|
707f9ba7ce | ||
|
|
72e1d5e03b | ||
|
|
a612074aa4 | ||
|
|
86bbccb7f9 | ||
|
|
11b7b57343 | ||
|
|
b682e53abe | ||
|
|
ce877834cd | ||
|
|
c69d171c3a | ||
|
|
1b24aa2421 | ||
|
|
c61a4a70fc | ||
|
|
bdefcc622f | ||
|
|
67336323c2 | ||
|
|
3ac9e7c599 | ||
|
|
73f70fceff | ||
|
|
e353efc81d | ||
|
|
a37c427242 | ||
|
|
d3c9b1f8a6 | ||
|
|
0ca029babb | ||
|
|
492d113307 | ||
|
|
f2bd48e452 | ||
|
|
ddb7ee1ec2 | ||
|
|
7d62e94306 | ||
|
|
4961d76b96 | ||
|
|
12524e6e68 | ||
|
|
79f30ea275 | ||
|
|
6ec2bf2880 | ||
|
|
7708c26b71 | ||
|
|
4f300c6f82 | ||
|
|
f4d67e759e | ||
|
|
e9b76217f7 | ||
|
|
85f801df4d | ||
|
|
01d5f2cda9 | ||
|
|
601196e3f6 | ||
|
|
cbf0be20a5 | ||
|
|
e51421780e | ||
|
|
2240282155 | ||
|
|
5700b32c84 | ||
|
|
4d72e0860e | ||
|
|
994daf11d3 | ||
|
|
79b92427aa | ||
|
|
6938c74014 | ||
|
|
058a6e63f2 | ||
|
|
1be6b7a509 | ||
|
|
ef532f0779 | ||
|
|
095a23df6d | ||
|
|
7043521eaa | ||
|
|
5eaafaeee6 | ||
|
|
ec10949c64 | ||
|
|
0e882cea17 | ||
|
|
4ad5cab37b | ||
|
|
2b6139050d | ||
|
|
14be16ce74 | ||
|
|
c379ecf317 | ||
|
|
eadbc774e3 | ||
|
|
90787cdc53 | ||
|
|
337733c3d3 | ||
|
|
b7048a4422 | ||
|
|
a036f1c4bb | ||
|
|
f9b1ab3ba7 | ||
|
|
47599f000a | ||
|
|
efb1664443 | ||
|
|
2c016621b6 | ||
|
|
f2a2b338cd | ||
|
|
715a66fd35 | ||
|
|
cc73f8c5d6 | ||
|
|
9b54b2b57d | ||
|
|
fe4d095f21 | ||
|
|
f67fa5c764 | ||
|
|
06249f29cf | ||
|
|
242efc9ae7 | ||
|
|
c86572e6f3 | ||
|
|
03b458c1b2 | ||
|
|
aa2e50366b | ||
|
|
657a47c9ad | ||
|
|
5d718bf4ea | ||
|
|
082f847b1f | ||
|
|
54e4d74d0a | ||
|
|
1437d190e5 | ||
|
|
a95b26551c | ||
|
|
c96f6d9381 | ||
|
|
c7df50d899 | ||
|
|
29619ada08 | ||
|
|
222c8a25a4 | ||
|
|
eac9b7c2e2 | ||
|
|
31d6349d71 | ||
|
|
b67f4daf3a | ||
|
|
81b81d9036 | ||
|
|
2d06f368f8 | ||
|
|
d0dc0f2bd1 | ||
|
|
e301c0fd3e | ||
|
|
5879661267 | ||
|
|
ad1f070557 | ||
|
|
c20986b7b7 | ||
|
|
153f425c99 | ||
|
|
6eb202d4b2 | ||
|
|
f7e46e16a3 | ||
|
|
36d7e22040 | ||
|
|
b24c4806f5 | ||
|
|
8ab79ad9f4 | ||
|
|
4f4533e533 | ||
|
|
e569ffe8f4 | ||
|
|
e09709651c | ||
|
|
39d7b6d55c | ||
|
|
2b2a328062 | ||
|
|
65e1495b44 | ||
|
|
3400f5843e | ||
|
|
e580691c1d | ||
|
|
bb0e817943 | ||
|
|
b7e4db6acd | ||
|
|
366fe5d613 | ||
|
|
428f2706c3 | ||
|
|
7f2b4596f7 | ||
|
|
ab9bdf3822 | ||
|
|
585667dfe8 | ||
|
|
151e6ed1f3 | ||
|
|
0685d1caac | ||
|
|
f50ba83d31 | ||
|
|
24c043386d | ||
|
|
9d868cb2f4 | ||
|
|
be308fdb4a | ||
|
|
73a5f5287b | ||
|
|
acafb15215 | ||
|
|
79b9e1b22a | ||
|
|
7ebdef3116 | ||
|
|
a3fbaa0038 | ||
|
|
fea2163a01 | ||
|
|
d55443968f | ||
|
|
b08a2681a2 | ||
|
|
48af7e5e76 | ||
|
|
98f48441c9 | ||
|
|
65f2836379 | ||
|
|
3548d4e939 | ||
|
|
eb03f34a7e | ||
|
|
40b1a9fbdf | ||
|
|
76a31acadc | ||
|
|
0f71d786f7 | ||
|
|
fec2508091 |
+16
-4
@@ -3,20 +3,23 @@ module.exports = {
|
||||
parser: "vue-eslint-parser",
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true
|
||||
"es2021": true,
|
||||
'vue/setup-compiler-macros': true
|
||||
},
|
||||
ignorePatterns: ['*.test.ts', '.eslintrc.cjs', 'postcss.config.cjs', 'webpack.config.cjs', '*.js'],
|
||||
overrides: [{
|
||||
files: ['*.ts', '*.tsx', "*.vue"],
|
||||
}],
|
||||
plugins: [
|
||||
"@typescript-eslint"
|
||||
"@typescript-eslint",
|
||||
"prettier"
|
||||
],
|
||||
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:vue/vue3-essential",
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
"plugin:vue/vue3-recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"prettier",
|
||||
],
|
||||
parserOptions: {
|
||||
"sourceType": "module",
|
||||
@@ -27,6 +30,15 @@ module.exports = {
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/no-floating-promises': 'error',
|
||||
'vue/script-setup-uses-vars': 'error',
|
||||
'vue/max-attributes-per-line': [
|
||||
'warn',
|
||||
{
|
||||
singleline: 4, //prettier와 싸우지 말자
|
||||
},
|
||||
],
|
||||
'vue/v-on-event-hyphenation': 'off', //vue3에선 필요없다고 생각
|
||||
'vue/attribute-hyphenation': 'off', //vue3에선 필요없다고 생각
|
||||
},
|
||||
settings: {
|
||||
'import/resolver': {
|
||||
|
||||
+2
-1
@@ -29,6 +29,7 @@ d_pic/*.png
|
||||
d_pic/*.webp
|
||||
d_pic/uploaded_image
|
||||
|
||||
/dist_js
|
||||
*/dist_misc/*
|
||||
*/dist_js/*
|
||||
*/dist_css/*
|
||||
@@ -42,7 +43,7 @@ d_setting/*.php
|
||||
*/d_setting/templates/*.php
|
||||
!*.orig.php
|
||||
|
||||
*/data/file_cache
|
||||
**/data/file_cache
|
||||
|
||||
**/old/*
|
||||
test.*
|
||||
|
||||
+2
-17
@@ -15,7 +15,8 @@ return [
|
||||
// Note that the **only** effect of choosing `'5.6'` is to infer
|
||||
// that functions removed in php 7.0 exist.
|
||||
// (See `backward_compatibility_checks` for additional options)
|
||||
"target_php_version" => '8.0',
|
||||
"target_php_version" => '8.1',
|
||||
"minimum_target_php_version" => '8.1',
|
||||
'backward_compatibility_checks ' => true,
|
||||
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
|
||||
|
||||
@@ -39,21 +40,15 @@ return [
|
||||
'hwe/a_emperior.php',
|
||||
'hwe/a_genList.php',
|
||||
'hwe/a_hallOfFame.php',
|
||||
'hwe/a_history.php',
|
||||
'hwe/a_kingdomList.php',
|
||||
'hwe/a_npcList.php',
|
||||
'hwe/api.php',
|
||||
'hwe/a_status.php',
|
||||
'hwe/a_traffic.php',
|
||||
'hwe/a_vote.php',
|
||||
'hwe/battle_simulator.php',
|
||||
'hwe/b_auction.php',
|
||||
'hwe/b_battleCenter.php',
|
||||
'hwe/b_betting.php',
|
||||
'hwe/v_chiefCenter.php',
|
||||
'hwe/b_currentCity.php',
|
||||
'hwe/v_nationStratFinan.php',
|
||||
'hwe/b_diplomacy.php',
|
||||
'hwe/b_genList.php',
|
||||
'hwe/b_myBossInfo.php',
|
||||
'hwe/b_myCityInfo.php',
|
||||
@@ -62,10 +57,7 @@ return [
|
||||
'hwe/b_myPage.php',
|
||||
'hwe/v_processing.php',
|
||||
'hwe/b_tournament.php',
|
||||
'hwe/b_troop.php',
|
||||
'hwe/c_auction.php',
|
||||
'hwe/c_tournament.php',
|
||||
'hwe/c_vote.php',
|
||||
'hwe/func_auction.php',
|
||||
'hwe/func_command.php',
|
||||
'hwe/func_converter.php',
|
||||
@@ -86,11 +78,9 @@ return [
|
||||
'hwe/j_adjust_icon.php',
|
||||
'hwe/j_autoreset.php',
|
||||
'hwe/j_basic_info.php',
|
||||
'hwe/j_betting.php',
|
||||
'hwe/j_board_article_add.php',
|
||||
'hwe/j_board_comment_add.php',
|
||||
'hwe/j_board_get_articles.php',
|
||||
'hwe/j_die_immediately.php',
|
||||
'hwe/j_diplomacy_destroy_letter.php',
|
||||
'hwe/j_diplomacy_get_letter.php',
|
||||
'hwe/j_diplomacy_respond_letter.php',
|
||||
@@ -101,15 +91,11 @@ return [
|
||||
'hwe/j_general_set_permission.php',
|
||||
'hwe/j_get_basic_general_list.php',
|
||||
'hwe/j_get_city_list.php',
|
||||
'hwe/j_get_general_list.php',
|
||||
'hwe/j_get_nation_general_list.php',
|
||||
'hwe/j_get_select_npc_token.php',
|
||||
'hwe/j_get_select_pool.php',
|
||||
'hwe/j_image_upload.php',
|
||||
'hwe/j_install_db.php',
|
||||
'hwe/j_install.php',
|
||||
'hwe/j_load_scenarios.php',
|
||||
'hwe/j_map_history.php',
|
||||
'hwe/j_map.php',
|
||||
'hwe/j_map_recent.php',
|
||||
'hwe/j_msg_contact_list.php',
|
||||
@@ -132,7 +118,6 @@ return [
|
||||
'hwe/lib.php',
|
||||
'hwe/process_war.php',
|
||||
'hwe/proc.php',
|
||||
'hwe/readme.php',
|
||||
'hwe/recent_map.php',
|
||||
'hwe/select_general_from_pool.php',
|
||||
'hwe/select_npc.php',
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"printWidth": 120
|
||||
}
|
||||
Vendored
+2
-1
@@ -28,5 +28,6 @@
|
||||
"cSpell.words": [
|
||||
"josa",
|
||||
"sammo"
|
||||
]
|
||||
],
|
||||
"editor.tabSize": 2
|
||||
}
|
||||
@@ -8,5 +8,9 @@ require(__DIR__ . '/vendor/autoload.php');
|
||||
if (!class_exists('\\sammo\\RootDB')) {
|
||||
Json::dieWithReason('No DB');
|
||||
}
|
||||
$eParams = $_GET;
|
||||
if(key_exists('path', $eParams)){
|
||||
unset($eParams['path']);
|
||||
}
|
||||
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??'', $eParams, true);
|
||||
+8
-11
@@ -8,29 +8,26 @@
|
||||
],
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "8.0"
|
||||
"php": "8.1"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"brandonwamboldt/utilphp": "^1.1",
|
||||
"sergeytsalkov/meekrodb": "^2.3",
|
||||
"league/plates": "^3.3",
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
"monolog/monolog": "^1.23",
|
||||
"firephp/firephp-core": "^0.4.0",
|
||||
"vlucas/valitron": "^1.4",
|
||||
"php-extended/php-tail": "^2.1",
|
||||
"pguardiario/phpuri": "^1.0",
|
||||
"symfony/lock": "^4.1",
|
||||
"symfony/lock": "^6.0",
|
||||
"ezyang/htmlpurifier": "^4.10",
|
||||
"xemlock/htmlpurifier-html5": "^0.1.7",
|
||||
"catfan/medoo": "^1.5",
|
||||
"phan/phan": "*",
|
||||
"erusev/parsedown-extra": "^0.8.1",
|
||||
"catfan/medoo": "^2.1",
|
||||
"phan/phan": "^5.3",
|
||||
"nette/caching": "^3.0",
|
||||
"illuminate/database": "^8.61",
|
||||
"illuminate/events": "^8.61",
|
||||
"spatie/data-transfer-object": "^3.7"
|
||||
"illuminate/database": "^9.12",
|
||||
"illuminate/events": "^9.12",
|
||||
"php-ds/php-ds": "^1.4",
|
||||
"hided62/ldto": "^1.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
||||
Generated
+659
-1367
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+15
-4
@@ -81,23 +81,34 @@ a.just_link {
|
||||
|
||||
button.with_skin {
|
||||
padding: 0 4px;
|
||||
background-color: black;
|
||||
background-color: #191919;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
border-top-color: gray;
|
||||
border-left-color: gray;
|
||||
border-right-color: black;
|
||||
border-bottom-color: black;
|
||||
}
|
||||
|
||||
button.with_skin:disabled {
|
||||
background-color: #333333;
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
input.with_skin {
|
||||
background-color: black;
|
||||
background-color: #191919;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
input.with_skin[type=button], input.with_skin[type=submit]{
|
||||
border-top-color: gray;
|
||||
border-left-color: gray;
|
||||
border-right-color: black;
|
||||
border-bottom-color: black;
|
||||
}
|
||||
|
||||
input.with_skin:disabled {
|
||||
background-color: #333333;
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
.font0 {
|
||||
|
||||
+7
-2
@@ -36,16 +36,21 @@ body {
|
||||
height: 130px;
|
||||
}
|
||||
|
||||
#user_info button {
|
||||
#user_info .btn {
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
margin: 10px 50px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.center_ordered_items {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.server-action{
|
||||
padding-top: 16px;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.Entrance_ServerList {
|
||||
width: 800px;
|
||||
height: 64px;
|
||||
|
||||
+35
-16
@@ -49,7 +49,7 @@ function getFriendlyErrorType($type)
|
||||
return "{$type}";
|
||||
}
|
||||
|
||||
function getExceptionTraceAsString($exception)
|
||||
function getExceptionTraceAsString(\Throwable $exception)
|
||||
{
|
||||
//https://gist.github.com/abtris/1437966
|
||||
$rtn = "";
|
||||
@@ -96,6 +96,8 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
|
||||
$fdb = FileDB::db(ROOT . '/d_log/err_log.sqlite3', ROOT . '/f_install/sql/err_log.sql');
|
||||
$date = date("Ymd_His");
|
||||
|
||||
$err = str_replace(ROOT, '{ROOT}', $err);
|
||||
$errstr = str_replace(ROOT, '{ROOT}', $errstr);
|
||||
$errpath = str_replace(ROOT, '{ROOT}', $errpath);
|
||||
$trace = array_map(function (string $text) {
|
||||
return str_replace(ROOT, '{ROOT}', $text);
|
||||
@@ -117,7 +119,7 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
|
||||
]);
|
||||
}
|
||||
|
||||
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext=null)
|
||||
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline)
|
||||
{
|
||||
if (!(error_reporting() & $errno)) {
|
||||
// This error code is not included in error_reporting, so let it fall
|
||||
@@ -133,11 +135,12 @@ function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, in
|
||||
$errfile . ':' . $errline,
|
||||
getExceptionTraceAsString($e)
|
||||
);
|
||||
return true;
|
||||
}
|
||||
set_error_handler("\\sammo\\logErrorByCustomHandler");
|
||||
|
||||
|
||||
function logExceptionByCustomHandler(\Throwable $e)
|
||||
function logExceptionByCustomHandler(\Throwable $e, bool $withDie = true)
|
||||
{
|
||||
|
||||
logError(
|
||||
@@ -147,32 +150,48 @@ function logExceptionByCustomHandler(\Throwable $e)
|
||||
getExceptionTraceAsString($e)
|
||||
);
|
||||
|
||||
echo $e->getTraceAsString();
|
||||
throw $e;
|
||||
if($withDie){
|
||||
echo $e->getTraceAsString();
|
||||
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
set_exception_handler('\\sammo\\logExceptionByCustomHandler');
|
||||
|
||||
function getAPIExecutorClass($path){
|
||||
function checkForFatal()
|
||||
{
|
||||
$error = error_get_last();
|
||||
if($error === null){
|
||||
return;
|
||||
}
|
||||
if (($error["type"]??0) == E_ERROR) {
|
||||
logErrorByCustomHandler($error["type"], $error["message"], $error["file"], $error["line"]);
|
||||
}
|
||||
}
|
||||
|
||||
static $basePath = __NAMESPACE__.'\\API\\';
|
||||
if(is_string($path)){
|
||||
}
|
||||
else if(is_array($path)){
|
||||
register_shutdown_function("\\sammo\\checkForFatal");
|
||||
|
||||
function getAPIExecutorClass($path)
|
||||
{
|
||||
|
||||
static $basePath = __NAMESPACE__ . '\\API\\';
|
||||
if (is_string($path)) {
|
||||
} else if (is_array($path)) {
|
||||
$path = join('\\', $path);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
throw new \InvalidArgumentException("{$path}는 올바른 API 지시자가 아님");
|
||||
}
|
||||
|
||||
$classPath = str_replace('/', '\\', $basePath.$path);
|
||||
$classPath = str_replace('/', '\\', $basePath . $path);
|
||||
|
||||
if(class_exists($classPath)){
|
||||
if (class_exists($classPath)) {
|
||||
return $classPath;
|
||||
}
|
||||
throw new \InvalidArgumentException("{$path}는 올바른 API 경로가 아님");
|
||||
}
|
||||
|
||||
function buildAPIExecutorClass($type, string $rootPath, array $args):\sammo\BaseAPI{
|
||||
function buildAPIExecutorClass($type, string $rootPath, array $args): \sammo\BaseAPI
|
||||
{
|
||||
$class = getAPIExecutorClass($type);
|
||||
return new $class($rootPath, $args);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
|
||||
|
||||
$plock = $db->queryFirstField('SELECT plock FROM plock');
|
||||
$plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"');
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
+6
-6
@@ -50,9 +50,9 @@ switch ($btn) {
|
||||
$db->update('general', [
|
||||
'turntime' => $db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
$db->update('auction', [
|
||||
'expire' => $db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_SUB(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], 'finished = 0');
|
||||
if ($locked) {
|
||||
unlock();
|
||||
}
|
||||
@@ -78,9 +78,9 @@ switch ($btn) {
|
||||
$db->update('general', [
|
||||
'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
$db->update('auction', [
|
||||
'expire' => $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], 'finished = 0');
|
||||
if ($locked) {
|
||||
unlock();
|
||||
}
|
||||
|
||||
@@ -40,8 +40,6 @@ $admin = getAdmin();
|
||||
<tr>
|
||||
<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='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
|
||||
<td width=110 align=right>현재도시훈사</td>
|
||||
<td width=285><?=$admin['city_rate']?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=110 align=right>최대 장수</td>
|
||||
|
||||
@@ -72,6 +72,7 @@ switch ($btn) {
|
||||
case "30분턴": $turnterm = 30; break;
|
||||
case "60분턴": $turnterm = 60; break;
|
||||
case "120분턴": $turnterm = 120; break;
|
||||
default: throw new \Exception("알 수 없는 턴 기간");
|
||||
}
|
||||
$oldunit = $admin['turnterm'] * 60;
|
||||
$unit = $turnterm * 60;
|
||||
|
||||
+14
-51
@@ -48,54 +48,25 @@ $db = DB::db();
|
||||
<font color=red>접속제한</font><br><b style=background-color:red;>블럭회원</b>
|
||||
</td>
|
||||
<td width=105 rowspan=12>
|
||||
<?php
|
||||
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>
|
||||
<?php
|
||||
$generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)');
|
||||
|
||||
echo "
|
||||
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>";
|
||||
$generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)');
|
||||
|
||||
foreach ($generalList as $general) {
|
||||
$style = "style=;";
|
||||
if ($general['block'] > 0) {
|
||||
$style .= "background-color:red;";
|
||||
}
|
||||
|
||||
$npcColor = getNPCColor($general['npc']);
|
||||
if($npcColor !== null){
|
||||
$style .= "color:{$npcColor};";
|
||||
}
|
||||
|
||||
echo "
|
||||
<option value={$general['no']} $style>{$general['name']}</option>";
|
||||
}
|
||||
|
||||
echo "
|
||||
</select>
|
||||
</td>
|
||||
<td width=100 align=center>아이템 지급</td>
|
||||
<td width=504>
|
||||
<select name=weapon size=1 style='color:white;background-color:black;font-size:14px'>";
|
||||
foreach (GameConst::$allItems as $itemCategories) {
|
||||
foreach ($itemCategories as $item => $cnt) {
|
||||
if ($cnt == 0) {
|
||||
continue;
|
||||
foreach ($generalList as $general) {
|
||||
$style = "style=;";
|
||||
if ($general['block'] > 0) {
|
||||
$style .= "background-color:red;";
|
||||
}
|
||||
$itemObj = buildItemClass($item);
|
||||
if ($itemObj->isBuyable()) {
|
||||
continue;
|
||||
|
||||
$npcColor = getNPCColor($general['npc']);
|
||||
if ($npcColor !== null) {
|
||||
$style .= "color:{$npcColor};";
|
||||
}
|
||||
|
||||
echo "<option value={$general['no']} $style>{$general['name']}</option>";
|
||||
}
|
||||
}
|
||||
for ($i = 0; $i < 27; $i++) {
|
||||
echo "
|
||||
<option value={$i}>{$i}</option>";
|
||||
}
|
||||
?>
|
||||
?>
|
||||
</select>
|
||||
<input type=submit name=btn value='무기지급'>
|
||||
<input type=submit name=btn value='책지급'>
|
||||
<input type=submit name=btn value='말지급'>
|
||||
<input type=submit name=btn value='도구지급'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -109,10 +80,6 @@ $db = DB::db();
|
||||
<td align=center>강제 사망</td>
|
||||
<td><input type=submit name=btn value='강제 사망'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>이벤트</td>
|
||||
<td><input type=submit name=btn value='특기 부여'><input type=submit name=btn value='공헌치1000'><input type=submit name=btn value='경험치1000'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>이벤트2</td>
|
||||
<td><input type=submit name=btn value='보숙10000'><input type=submit name=btn value='궁숙10000'><input type=submit name=btn value='기숙10000'><input type=submit name=btn value='귀숙10000'><input type=submit name=btn value='차숙10000'></td>
|
||||
@@ -121,10 +88,6 @@ $db = DB::db();
|
||||
<td align=center>접속제한</td>
|
||||
<td><input type=submit name=btn value='접속 허용'><input type=submit name=btn value='접속 제한'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>턴 시각 설정</td>
|
||||
<td><input type=submit name=btn value='00턴'><input type=submit name=btn value='랜덤턴'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>명령 설정</td>
|
||||
<td><input type=submit name=btn value='하야입력'><input type=submit name=btn value='방랑해산'></td>
|
||||
|
||||
@@ -107,28 +107,6 @@ switch ($btn) {
|
||||
'arg' => '{}',
|
||||
'brief' => '휴식',
|
||||
], 'general_id IN %li AND turn_idx = 0', $genlist);
|
||||
break;
|
||||
case "특기 부여":
|
||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||
$text = "특기 부여!";
|
||||
|
||||
foreach ($db->query("SELECT `no`,leadership,strength,intel,dex1,dex2,dex3,dex4,dex5 FROM general WHERE `no` IN %li", $genlist) as $general) {
|
||||
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($general['no']), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
|
||||
$msg->send(true);
|
||||
|
||||
$specialWar = SpecialityHelper::pickSpecialWar($general);
|
||||
$db->update('general', [
|
||||
'specage2' => $db->sqleval('age'),
|
||||
'special2' => $specialWar
|
||||
], 'no=%i', $general['no']);
|
||||
$specialWarName = buildGeneralSpecialWarClass($specialWar)->getName();
|
||||
$josaUl = JosaUtil::pick($specialWarName, '을');
|
||||
$logger = new ActionLogger($general['no'], 0, $year, $month);
|
||||
$logger->pushGeneralHistoryLog("특기 【<b><C>{$specialWarName}</></b>】{$josaUl} 습득");
|
||||
$logger->pushGeneralActionLog("특기 【<b><L>{$specialWarName}</></b>】{$josaUl} 익혔습니다!",ActionLogger::PLAIN);
|
||||
$logger->flush();
|
||||
}
|
||||
|
||||
break;
|
||||
case "경험치1000":
|
||||
$text = $btn . " 지급!";
|
||||
@@ -222,95 +200,6 @@ switch ($btn) {
|
||||
$msg->send(true);
|
||||
}
|
||||
break;
|
||||
case "무기지급":
|
||||
|
||||
if ($item == 'None') {
|
||||
$text = "무기 회수!";
|
||||
} else {
|
||||
$text = getItemName($item) . " 지급!";
|
||||
}
|
||||
|
||||
foreach ($genlist as $generalID) {
|
||||
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
|
||||
$msg->send(true);
|
||||
}
|
||||
|
||||
if ($item === 'None') {
|
||||
$db->update('general', [
|
||||
'weapon' => 'None'
|
||||
], '`no` IN %li', $genlist);
|
||||
} else {
|
||||
$db->update('general', [
|
||||
'weapon' => $item
|
||||
], '`no` IN %li', $genlist, $item);
|
||||
}
|
||||
break;
|
||||
case "책지급":
|
||||
if ($item == 'None') {
|
||||
$text = "책 회수!";
|
||||
} else {
|
||||
$text = getItemName($item) . " 지급!";
|
||||
}
|
||||
|
||||
foreach ($genlist as $generalID) {
|
||||
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
|
||||
$msg->send(true);
|
||||
}
|
||||
|
||||
if ($item == 'None') {
|
||||
$db->update('general', [
|
||||
'book' => 'None'
|
||||
], '`no` IN %li', $genlist);
|
||||
} else {
|
||||
$db->update('general', [
|
||||
'book' => $item
|
||||
], '`no` IN %li', $genlist);
|
||||
}
|
||||
break;
|
||||
case "말지급":
|
||||
if ($item == 'None') {
|
||||
$text = "말 회수!";
|
||||
} else {
|
||||
$text = getItemName($item) . " 지급!";
|
||||
}
|
||||
|
||||
foreach ($genlist as $generalID) {
|
||||
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
|
||||
$msg->send(true);
|
||||
}
|
||||
|
||||
if ($item == 'None') {
|
||||
$db->update('general', [
|
||||
'horse' => 'None'
|
||||
], '`no` IN %li', $genlist);
|
||||
} else {
|
||||
$db->update('general', [
|
||||
'horse' => $item
|
||||
], '`no` IN %li', $genlist);
|
||||
}
|
||||
break;
|
||||
case "도구지급":
|
||||
if ($item == 'None') {
|
||||
$text = "특수도구 회수!";
|
||||
} else {
|
||||
$text = getItemName($item) . " 지급!";
|
||||
}
|
||||
|
||||
foreach ($genlist as $generalID) {
|
||||
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
|
||||
$msg->send(true);
|
||||
}
|
||||
|
||||
if ($item == 'None') {
|
||||
$db->update('general', [
|
||||
'item' => 'None'
|
||||
], '`no` IN %li', $genlist);
|
||||
} else {
|
||||
$db->update('general', [
|
||||
'item' => $item
|
||||
], '`no` IN %li AND item < %i', $genlist, $item);
|
||||
}
|
||||
break;
|
||||
case "하야입력":
|
||||
$db->update('general_turn', [
|
||||
'action' => 'che_하야',
|
||||
@@ -330,26 +219,6 @@ switch ($btn) {
|
||||
'brief' => '해산',
|
||||
], 'general_id IN %li AND turn_idx = 1', $genlist);
|
||||
break;
|
||||
case "00턴":
|
||||
$turnterm = $gameStor->turnterm;
|
||||
|
||||
foreach ($genlist as $generalID) {
|
||||
$turntime = getRandTurn($turnterm);
|
||||
$cutTurn = cutTurn($turntime, $turnterm);
|
||||
$db->update('general', [
|
||||
'turntime' => $cutTurn
|
||||
], '`no` IN %li', $genlist);
|
||||
}
|
||||
break;
|
||||
case "랜덤턴":
|
||||
$turnterm = $gameStor->turnterm;
|
||||
foreach ($genlist as $generalID) {
|
||||
$turntime = getRandTurn($turnterm);
|
||||
$db->update('general', [
|
||||
'turntime' => $turntime
|
||||
], '`no` IN %li', $genlist);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
header('location:_admin2.php');
|
||||
|
||||
@@ -5,7 +5,9 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
/** @var int */
|
||||
$type = Util::getPost('type', 'int', 0);
|
||||
/** @var int */
|
||||
$type2 = Util::getPost('type2', 'int', 0);
|
||||
|
||||
if ($type < 0 || $type > 17) {
|
||||
|
||||
@@ -95,6 +95,8 @@ $sel[$type] = "selected";
|
||||
case 7:
|
||||
$state = "<font color=green>불가침</font>";
|
||||
break;
|
||||
default:
|
||||
throw new \Exception("알 수 없는 외교 상태: {$dip['state']}");
|
||||
}
|
||||
|
||||
$date = TimeUtil::now();
|
||||
|
||||
@@ -25,8 +25,9 @@ foreach ($db->queryFirstColumn(
|
||||
CheckHall($generalNo);
|
||||
}
|
||||
|
||||
$inheritPointManager = InheritancePointManager::getInstance();
|
||||
foreach(General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
|
||||
$genObj->mergeTotalInheritancePoint(true);
|
||||
applyInheritanceUser($genObj->getVar('owner'));
|
||||
$genObj->clearInheritancePoint();
|
||||
$inheritPointManager->mergeTotalInheritancePoint($genObj, true);
|
||||
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
|
||||
$inheritPointManager->clearInheritancePoint($genObj);
|
||||
}
|
||||
+76
-30
@@ -2,6 +2,10 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use Ds\Set;
|
||||
use sammo\Enums\RankColumn;
|
||||
use sammo\Enums\AuctionType;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -17,6 +21,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
increaseRefresh("명장일람", 1);
|
||||
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -24,32 +29,27 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1136" />
|
||||
<meta name="viewport" content="width=500" />
|
||||
<title><?= UniqueConst::$serverName ?>: 명장일람</title>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/hallOfFame.css') ?>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('ts', 'common') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'bestGeneral']) ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>명 장 일 람<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<form name=form1 action=a_bestGeneral.php method=post>
|
||||
<tr>
|
||||
<td align=center>
|
||||
<input type=submit name=btn value='유저 보기'>
|
||||
<div id="container" class="bg0">
|
||||
<div class="row gx-0">
|
||||
<div class="col">명 장 일 람<br><?= closeButton() ?></div>
|
||||
</div>
|
||||
<div class="row gx-0">
|
||||
<div class="col center">
|
||||
<form name=form1 action=a_bestGeneral.php method=get><input type=submit name=btn value='유저 보기'>
|
||||
<input type=submit name=btn value='NPC 보기'>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
</table>
|
||||
<div style="margin:auto;width:1100px;">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
$ownerNameList = [];
|
||||
@@ -209,6 +209,32 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
}
|
||||
return $v;
|
||||
}],
|
||||
["유 산 소 모 량", "int", function ($v) use ($gameStor) {
|
||||
$v['value'] = $v[RankColumn::inherit_point_spent->value];
|
||||
if ($gameStor->isunited) {
|
||||
return $v;
|
||||
}
|
||||
$v['nationName'] = '???';
|
||||
$v['pictureFullPath'] = GetImageURL(0) . "/default.jpg";
|
||||
$v['name'] = '???';
|
||||
$v['ownerName'] = null;
|
||||
$v['bgColor'] = GameConst::$basecolor4;
|
||||
$v['fgColor'] = newColor($v['bgColor']);
|
||||
return $v;
|
||||
}],
|
||||
["유 산 획 득 량", "int", function ($v) use ($gameStor) {
|
||||
$v['value'] = $v[RankColumn::inherit_point_earned->value];
|
||||
if ($gameStor->isunited) {
|
||||
return $v;
|
||||
}
|
||||
$v['nationName'] = '???';
|
||||
$v['pictureFullPath'] = GetImageURL(0) . "/default.jpg";
|
||||
$v['name'] = '???';
|
||||
$v['ownerName'] = null;
|
||||
$v['bgColor'] = GameConst::$basecolor4;
|
||||
$v['fgColor'] = newColor($v['bgColor']);
|
||||
return $v;
|
||||
}],
|
||||
];
|
||||
|
||||
$generals = [];
|
||||
@@ -274,10 +300,6 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
'generals' => array_slice($typeGenerals, 0, min(10, $validCnt))
|
||||
]);
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<div style="margin:auto;width:1100px;margin-top:5px;">
|
||||
<?php
|
||||
//유니크 아이템 소유자
|
||||
$itemTypes = [
|
||||
'horse' => '명 마',
|
||||
@@ -308,6 +330,32 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$dummyAuctionGeneral = [
|
||||
'nation' => 0,
|
||||
'no' => 0,
|
||||
'ownerName' => '',
|
||||
'pictureFullPath' => GetImageURL(0) . "/default.jpg",
|
||||
'name' => '경매중',
|
||||
'bgColor' => '#00582c',
|
||||
'fgColor' => 'white',
|
||||
'nationName' => '-',
|
||||
];
|
||||
|
||||
foreach ($db->queryFirstColumn(
|
||||
'SELECT `target` FROM ng_auction WHERE `finished` = 0 AND `type` = %s',
|
||||
AuctionType::UniqueItem->value
|
||||
) as $itemClassName) {
|
||||
if(key_exists($itemClassName, $itemOwners)) {
|
||||
$itemOwners[$itemClassName][] = $dummyAuctionGeneral;
|
||||
}
|
||||
else{
|
||||
$itemOwners[$itemClassName] = [$dummyAuctionGeneral];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
foreach (GameConst::$allItems as $itemType => $itemList) {
|
||||
$itemNameType = $itemTypes[$itemType];
|
||||
$itemList = array_reverse($itemList, true);
|
||||
@@ -369,15 +417,13 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
]);
|
||||
}
|
||||
?>
|
||||
<div class="row gx-0">
|
||||
<div class="col"><?= closeButton() ?></div>
|
||||
</div>
|
||||
<div class="row bg0 gx-0">
|
||||
<div class="col bg0"><?= banner() ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+3
-2
@@ -20,6 +20,7 @@ increaseRefresh("왕조일람", 1);
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', 'common') ?>
|
||||
|
||||
</head>
|
||||
@@ -55,7 +56,7 @@ increaseRefresh("왕조일람", 1);
|
||||
<tr>
|
||||
<td style="background-color:#333333;" align=center colspan=8>
|
||||
<font size=5>현재 (<?= $year ?>年 <?= $month ?>月)</font>
|
||||
<a href="a_history.php"><button type='button'>역사 보기</button></a>
|
||||
<a href="v_history.php"><button type='button'>역사 보기</button></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -75,7 +76,7 @@ increaseRefresh("왕조일람", 1);
|
||||
<a href="a_emperior_detail.php?select=<?= $emperior['no'] ?>"><button type='button'>자세히</button></a>
|
||||
|
||||
<?php if ($emperior['server_id']) : ?>
|
||||
<a href="a_history.php?serverID=<?= $emperior['server_id'] ?>"><button type='button'>역사 보기</button></a>
|
||||
<a href="v_history.php?serverID=<?= $emperior['server_id'] ?>"><button type='button'>역사 보기</button></a>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -28,6 +28,7 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<title><?= UniqueConst::$serverName ?>: 왕조일람</title>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', 'common', true) ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
|
||||
@@ -173,8 +174,9 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
|
||||
if (!$nation['nation'] ?? null) {
|
||||
continue;
|
||||
}
|
||||
$nation += Json::decode($nation['data']);
|
||||
$nation = array_merge(Json::decode($nation['data']), $nation);
|
||||
|
||||
/** @var array $nation */
|
||||
$nation['typeName'] = getNationType($nation['type']);
|
||||
$nation['levelName'] = getNationLevel($nation['level']);
|
||||
/** @var int[]|null $nationGenerals */
|
||||
@@ -200,7 +202,7 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
|
||||
}
|
||||
|
||||
if (key_exists('aux', $nation) && !is_array($nation['aux'])) {
|
||||
$nation += Json::decode($nation['aux']);
|
||||
$nation = array_merge(Json::decode($nation['aux']), $nation);
|
||||
}
|
||||
|
||||
echo $templates->render('oldNation', $nation);
|
||||
|
||||
@@ -47,6 +47,7 @@ if ($gameStor->isunited) {
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', 'common') ?>
|
||||
|
||||
</head>
|
||||
@@ -172,6 +173,7 @@ if ($gameStor->isunited) {
|
||||
data-general-strength='{$general['strength']}'
|
||||
data-general-intel='{$general['intel']}'
|
||||
data-is-npc='" . ($general['npc'] >= 2 ? 'true' : 'false') . "'
|
||||
data-npc-type='{$general['npc']}'
|
||||
>
|
||||
<td align=center><img class='generalIcon' width='64' height='64' src='{$imageTemp}/{$general['picture']}'></img></td>
|
||||
<td align=center>$name</td>
|
||||
|
||||
+21
-23
@@ -44,22 +44,22 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1136" />
|
||||
<meta name="viewport" content="width=500" />
|
||||
<title><?= UniqueConst::$serverName ?>: 명예의 전당</title>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/hallOfFame.css') ?>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'hallOfFame']) ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>명 예 의 전 당<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div id="container" class="bg0">
|
||||
<div class="row gx-0">
|
||||
<div class="col">명 예 의 전 당<br><?= closeButton() ?></div>
|
||||
</div>
|
||||
<div class="row gx-0">
|
||||
<div class="col center">
|
||||
시나리오 검색 : <select id="by_scenario" name="by_scenario">
|
||||
<?php foreach ($scenarioList as $iterSeasonIdx => $subScenarioList) : ?>
|
||||
<option data-season="<?= $iterSeasonIdx ?>" value="" <?= ($iterSeasonIdx == $seasonIdx && $scenarioIdx === null) ? "selected='selected'" : '' ?>>* 시즌 : <?= $iterSeasonIdx ?> 종합 *</option>
|
||||
@@ -69,10 +69,8 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
|
||||
<?php endforeach; ?>
|
||||
?>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="margin:auto;width:1100px;">
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
$types = [
|
||||
'experience' => ['명 성', 'int'],
|
||||
@@ -113,7 +111,8 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
|
||||
|
||||
$hallResult = array_map(function ($general) use ($typeValue, $ownerNameList) {
|
||||
$aux = Json::decode($general['aux']);
|
||||
$general += $aux;
|
||||
/** @var array $general */
|
||||
$general = array_merge($aux, $general);
|
||||
|
||||
if (key_exists($general['owner'], $ownerNameList)) {
|
||||
$general['ownerName'] = $ownerNameList[$general['owner']];
|
||||
@@ -121,10 +120,11 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
|
||||
|
||||
if (!key_exists('bgColor', $general)) {
|
||||
if (!key_exists('color', $general)) {
|
||||
$general['bgColor'] = GameConst::$basecolor4;
|
||||
$color = GameConst::$basecolor4;
|
||||
} else {
|
||||
$general['bgColor'] = $general['color'];
|
||||
$color = $general['color'];
|
||||
}
|
||||
$general['bgColor'] = $color;
|
||||
}
|
||||
|
||||
if (!key_exists('fgColor', $general)) {
|
||||
@@ -156,15 +156,13 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
|
||||
]);
|
||||
}
|
||||
?>
|
||||
<div class="row gx-0">
|
||||
<div class="col"><?= closeButton() ?></div>
|
||||
</div>
|
||||
<div class="row bg0 gx-0">
|
||||
<div class="col bg0"><?= banner() ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,229 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
$btn = Util::getReq('btn');
|
||||
$yearMonth = Util::getReq('yearmonth', 'int');
|
||||
$serverID = Util::getReq('serverID', 'string', null);
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
if (!$serverID) {
|
||||
$serverID = UniqueConst::$serverID;
|
||||
}
|
||||
|
||||
if ($serverID === UniqueConst::$serverID) {
|
||||
increaseRefresh("연감", 1);
|
||||
}
|
||||
|
||||
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'map_theme']);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $userID);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
[$s_year, $s_month] = $db->queryFirstList('SELECT year, month FROM ng_history WHERE server_id = %s ORDER BY year ASC, month ASC LIMIT 1', $serverID);
|
||||
$s = Util::joinYearMonth($s_year, $s_month);
|
||||
|
||||
if ($s_year === null) {
|
||||
echo '인자 에러';
|
||||
exit();
|
||||
}
|
||||
|
||||
[$e_year, $e_month] = $db->queryFirstList('SELECT year, month FROM ng_history WHERE server_id = %s ORDER BY year DESC, month DESC LIMIT 1', $serverID);
|
||||
$e = Util::joinYearMonth($e_year, $e_month);
|
||||
|
||||
if ($serverID !== UniqueConst::$serverID) {
|
||||
$mapTheme = $db->queryFirstField('SELECT map FROM ng_games WHERE server_id=%s', $serverID) ?: 'che';
|
||||
} else {
|
||||
$mapTheme = $admin['map_theme'] ?? 'che';
|
||||
}
|
||||
|
||||
//FIXME: $yearmonth가 올바르지 않을 경우에 처리가 필요.
|
||||
if ($serverID !== UniqueConst::$serverID && !$yearMonth) {
|
||||
$yearMonth = $s;
|
||||
} else if (!$yearMonth) {
|
||||
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
|
||||
} else {
|
||||
if ($btn == "◀◀ 이전달") {
|
||||
$yearMonth -= 1;
|
||||
} elseif ($btn == "다음달 ▶▶") {
|
||||
$yearMonth += 1;
|
||||
}
|
||||
}
|
||||
|
||||
$isCurrent = false;
|
||||
if ($yearMonth < $s) {
|
||||
$yearMonth = $s;
|
||||
}
|
||||
if ($yearMonth > $e) {
|
||||
$isCurrent = true;
|
||||
$yearMonth = $e + 1;
|
||||
}
|
||||
|
||||
[$year, $month] = Util::parseYearMonth($yearMonth);
|
||||
|
||||
function getHistory($serverID, $year, $month):array{
|
||||
$db = DB::db();
|
||||
$history = $db->queryFirstRow('SELECT * FROM ng_history WHERE server_id = %s AND year = %i AND month = %i', $serverID, $year, $month);
|
||||
$history['global_history'] = Json::decode($history['global_history']);
|
||||
$history['global_action'] = Json::decode($history['global_action']);
|
||||
$history['nations'] = Json::decode($history['nations']);
|
||||
return $history;
|
||||
}
|
||||
|
||||
|
||||
if($isCurrent){
|
||||
$history = getCurrentHistory();
|
||||
}
|
||||
else{
|
||||
$history = getHistory($serverID, $year, $month);
|
||||
}
|
||||
|
||||
$nations = $history['nations'];
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<title><?= UniqueConst::$serverName ?>: 연감</title>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printJS("js/map/theme_{$mapTheme}.js") ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/map.css') ?>
|
||||
<?= WebUtil::printCSS('css/history.css') ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'history']) ?>
|
||||
|
||||
<script>
|
||||
var startYear = <?= $s_year ?>;
|
||||
var startMonth = <?= $s_month ?>;
|
||||
var lastYear = <?= $e_year ?>;
|
||||
var lastMonth = <?= $e_month ?>;
|
||||
var selectYear = <?= $year ?>;
|
||||
var selectMonth = <?= $month ?>;
|
||||
var nations = <?= $nations ? JSON::encode($history['nations']) : '{}' ?>;
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>연 감<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<form name=form1 method=post>
|
||||
연월 선택 :
|
||||
<input type=submit name=btn value="◀◀ 이전달">
|
||||
<select id='yearmonth' name=yearmonth size=1>
|
||||
<option selected='selected'><?= $year ?>년 <?= $month ?>월</option>
|
||||
<option><?= $e_year ?>년 12월 (현재)</option>
|
||||
</select>
|
||||
<input type=submit name=btn value='조회하기'>
|
||||
<input type=submit name=btn value="다음달 ▶▶">
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 height=520 class='tb_layout bg0'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan=5 align=center class='bg1'>중 원 지 도</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr height=520>
|
||||
<td width=698>
|
||||
<?= getMapHtml($mapTheme) ?>
|
||||
</td>
|
||||
<td id='nation_list_frame'>
|
||||
<table id='nation_list'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th width=130>국명</th>
|
||||
<th width=70>국력</th>
|
||||
<th width=45>장수</th>
|
||||
<th width=45>속령</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($nations as $nation) : ?>
|
||||
<tr>
|
||||
<td><span style='color:<?= newColor($nation['color']) ?>;background-color:<?= $nation['color'] ?>'><?= $nation['name'] ?></td>
|
||||
<td style='text-align:right'><?= number_format($nation['power']) ?></td>
|
||||
<td style='text-align:right'><?= number_format($nation['gennum']) ?></td>
|
||||
<td style='text-align:right'><?= number_format(count($nation['cities'] ?? [])) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot></tfoot>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan=5 align=center class='bg1'>중 원 정 세</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=5 valign=top>
|
||||
<?= formatHistoryToHTML($history['global_history']) ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan=5 align=center class='bg1'>장 수 동 향</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=5 valign=top>
|
||||
<?= formatHistoryToHTML($history['global_action']) ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<script>
|
||||
window.serverNick = '<?= DB::prefix() ?>';
|
||||
window.serverID = '<?= UniqueConst::$serverID ?>';
|
||||
<?php if($isCurrent): ?>
|
||||
reloadWorldMap({
|
||||
showMe: false,
|
||||
neutralView: true,
|
||||
useCachedMap: true,
|
||||
});
|
||||
<?php else: ?>
|
||||
reloadWorldMap({
|
||||
targetJson: 'j_map_history.php?year=<?= $year ?>&month=<?= $month ?>&serverID=<?= $serverID ?>',
|
||||
showMe: false,
|
||||
neutralView: true,
|
||||
useCachedMap: false,
|
||||
year: <?= $year ?>,
|
||||
month: <?= $month ?>,
|
||||
});
|
||||
<?php endif; ?>
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -32,6 +32,7 @@ if ($con >= 2) {
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'extKingdoms']) ?>
|
||||
<?= WebUtil::printStaticValues($gameStor->getValues(['killturn', 'autorun_user', 'turnterm'])) ?>
|
||||
</head>
|
||||
@@ -111,7 +112,7 @@ if ($con >= 2) {
|
||||
}
|
||||
$chief = $chiefs[$chiefLevel] ?? ['name' => '-', 'npc' => 0];
|
||||
$officerLevelText = getOfficerLevelText($chiefLevel, $nation['level']);
|
||||
$chiefText = getColoredName($chief['name'], $chief['npc']);
|
||||
$chiefText = formatName($chief['name'], $chief['npc']);
|
||||
echo "<td class='center bg1'>{$officerLevelText}</td>
|
||||
<td class='center'>{$chiefText}</td>";
|
||||
}
|
||||
@@ -178,7 +179,7 @@ if ($con >= 2) {
|
||||
<tr>
|
||||
<td colspan=5> 장수 일람 : ";
|
||||
foreach ($nations[0]['generals'] as $general) {
|
||||
$generalText = getColoredName($general['name'], $general['npc']);
|
||||
$generalText = formatName($general['name'], $general['npc']);
|
||||
echo "{$generalText}, ";
|
||||
}
|
||||
echo "
|
||||
|
||||
+2
-1
@@ -30,6 +30,7 @@ $sel[$type] = "selected";
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
@@ -111,7 +112,7 @@ $sel[$type] = "selected";
|
||||
</tr>
|
||||
<?php foreach ($generalList as $general) : ?>
|
||||
<tr>
|
||||
<td align=center><?= getColoredName($general['name'], $general['npc']) ?></td>
|
||||
<td align=center><?= formatName($general['name'], $general['npc']) ?></td>
|
||||
<td align=center><?= $general['owner_name'] ?></td>
|
||||
<td align=center>Lv <?= $general['explevel'] ?></td>
|
||||
<td align=center><?= $nationName[$general['nation']] ?></td>
|
||||
|
||||
@@ -83,6 +83,7 @@ if ($admin['maxonline'] < $curonline) {
|
||||
}
|
||||
</style>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
|
||||
-434
@@ -1,434 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("설문조사", 1);
|
||||
|
||||
$isVoteAdmin = in_array('vote', $session->acl[DB::prefix()] ?? []);
|
||||
$isVoteAdmin = $isVoteAdmin || $session->userGrade >= 5;
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,vote from general where owner=%i', $userID);
|
||||
|
||||
$admin = $gameStor->getValues(['develcost', 'voteopen', 'vote_title', 'vote', 'votecomment']);
|
||||
$vote_title = $admin['vote_title'] ?? '-';
|
||||
$vote = $admin['vote'] ?: ['-'];
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title><?= UniqueConst::$serverName ?>: 설문조사</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<style>
|
||||
.little_bar {
|
||||
float: left;
|
||||
position: relative;
|
||||
height: 17px;
|
||||
line-height: 17px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
<script type="text/javascript">
|
||||
function captureKey(e) {
|
||||
if (e.keyCode == 13 && e.srcElement.type == 'text') {
|
||||
form1.btn.value = '댓글';
|
||||
form1.btn.click();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>설 문 조 사<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form name=form1 action=c_vote.php method=post>
|
||||
<tr>
|
||||
<td colspan=3 align=center class='bg2'>
|
||||
<font size=5>설 문 조 사 (<?= $admin['develcost'] * 5 ?>금과 추첨으로 유니크템 증정!)</font>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
|
||||
if ($isVoteAdmin) {
|
||||
echo "
|
||||
<tr>
|
||||
<td width=48 align=center><input type=submit name=btn value='알림'></td>
|
||||
<td width=98 align=center><input type=submit name=btn value='수정'></td>
|
||||
<td width=848 align=left><input type=text name=title style=width:848px;></td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
|
||||
$vote_title = Tag2Code($vote_title);
|
||||
echo "
|
||||
<tr>
|
||||
<td colspan=2 width=148 align=center class='bg1'>제 목</td>
|
||||
<td width=848 align=left> {$vote_title}</td>
|
||||
</tr>
|
||||
";
|
||||
|
||||
$voteCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote>0 AND npc<2');
|
||||
$allCount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2');
|
||||
|
||||
$percentage = round($voteCount / $allCount * 100, 1);
|
||||
|
||||
$voteTypeCount = count($vote);
|
||||
for ($i = 1; $i < $voteTypeCount; $i++) {
|
||||
echo "
|
||||
<tr>
|
||||
<td width=48 align=center style=color:" . getNewColor($i) . "; bgcolor=" . getVoteColor($i) . ">{$i}.</td>
|
||||
<td width=98 align=center>
|
||||
";
|
||||
if ($me['vote'] == 0 && $me['no'] > 0) {
|
||||
echo "
|
||||
<input type=radio name=sel value={$i}>
|
||||
";
|
||||
} elseif ($admin['voteopen'] >= 1 || $isVoteAdmin) {
|
||||
$vCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote=%i', $i);
|
||||
|
||||
$per = @round($vCount / $voteCount * 100, 1);
|
||||
echo "{$vCount} 표 ({$per}%)";
|
||||
} else {
|
||||
echo "추후공개";
|
||||
}
|
||||
$vote[$i] = Tag2Code($vote[$i]);
|
||||
echo "
|
||||
</td>
|
||||
<td align=left> {$vote[$i]}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
|
||||
echo "
|
||||
<tr>
|
||||
";
|
||||
if ($me['vote'] == 0 && $me['no'] > 0) {
|
||||
echo "
|
||||
<td align=center>투표</td>
|
||||
<td align=center><input type=submit name=btn value='투표'></td>
|
||||
";
|
||||
} else {
|
||||
echo "
|
||||
<td colspan=2 align=center>결산</td>
|
||||
";
|
||||
}
|
||||
echo "
|
||||
<td align=left> 투표율 : {$voteCount} / {$allCount} ({$percentage} %)</td>
|
||||
</tr>
|
||||
";
|
||||
|
||||
if ($isVoteAdmin) {
|
||||
echo "
|
||||
<tr>
|
||||
<td align=center><input type=submit name=btn value='리셋'></td>
|
||||
<td align=center><input type=submit name=btn value='추가'></td>
|
||||
<td align=left><input type=text name=str style=width:848px;></td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
|
||||
if ($admin['votecomment']) {
|
||||
$comment = $admin['votecomment'];
|
||||
$commentCount = count($comment);
|
||||
} else {
|
||||
$commentCount = 0;
|
||||
}
|
||||
echo "
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=4 align=center class='bg1'>댓 글</td>
|
||||
</tr>
|
||||
";
|
||||
for ($i = 0; $i < $commentCount; $i++) {
|
||||
$cmt = $comment[$i];
|
||||
$cmt[2] = Tag2Code($cmt[2]);
|
||||
$j = $i + 1;
|
||||
echo "
|
||||
<tr>
|
||||
<td width=28 align=center>{$j}.</td>
|
||||
<td width=130 align=center>{$cmt[0]}</td>
|
||||
<td width=130 align=center>{$cmt[1]}</td>
|
||||
<td width=712 align=left> {$cmt[2]}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
if ($me['no'] > 0) {
|
||||
echo "
|
||||
<tr>
|
||||
<td width=158 colspan=2 align=center>-</td>
|
||||
<td width=130 align=center><input type=submit name=btn value='댓글'></td>
|
||||
<td align=left><input type=text name=comment maxlength=60 style=width:700px; onkeydown='return captureKey(event)'></td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=3 align=center class='bg2'>
|
||||
<font size=5>
|
||||
전 체 통 계
|
||||
<?php
|
||||
if ($isVoteAdmin) {
|
||||
echo "
|
||||
<input type=submit name=btn value='숨김'>
|
||||
<input type=submit name=btn value='전체통계만'>
|
||||
<input type=submit name=btn value='전부'>";
|
||||
}
|
||||
echo "
|
||||
</font></td></tr>";
|
||||
|
||||
if ($admin['voteopen'] >= 1 || $isVoteAdmin) {
|
||||
echo "
|
||||
<tr>
|
||||
<td width=130 align=center>전 체</td>
|
||||
<td width=128 align=center>{$voteCount} / {$allCount} ({$percentage} %)</td>
|
||||
<td width=742>
|
||||
";
|
||||
|
||||
$memCount = max(1, $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2'));
|
||||
|
||||
$totalVote = [];
|
||||
$nationVoteCount = [];
|
||||
$nationVote = [];
|
||||
|
||||
foreach ($db->query("SELECT nation, vote, count(`no`) as cnt FROM general WHERE npc<2 GROUP BY nation, vote") as $row) {
|
||||
$nation = $row['nation'];
|
||||
$ownVote = $row['vote'];
|
||||
$cnt = $row['cnt'];
|
||||
|
||||
if (!isset($totalVote[$ownVote])) {
|
||||
$totalVote[$ownVote] = 0;
|
||||
}
|
||||
|
||||
if (!isset($nationVoteCount[$nation])) {
|
||||
$nationVoteCount[$nation] = 0;
|
||||
$nationVote[$nation] = [];
|
||||
}
|
||||
|
||||
if (!isset($nationVote[$nation][$ownVote])) {
|
||||
$nationVote[$nation][$ownVote] = 0;
|
||||
}
|
||||
|
||||
$totalVote[$ownVote] += $cnt;
|
||||
$nationVoteCount[$nation] += $cnt;
|
||||
$nationVote[$nation][$ownVote] += $cnt;
|
||||
}
|
||||
|
||||
$totalPer = 0;
|
||||
for ($i = 0; $i < $voteTypeCount; $i++) {
|
||||
$per = round(($totalVote[$i] ?? 0) * 100 / $memCount, 1);
|
||||
if ($i == $voteTypeCount - 1) {
|
||||
$per = 100 - $totalPer;
|
||||
} else {
|
||||
$totalPer += $per;
|
||||
}
|
||||
|
||||
|
||||
// if($per < 5) { $vote['cnt'] = " "; }
|
||||
?>
|
||||
<?php if ($per == 0) : ?>
|
||||
<?php elseif ($per < 10) : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'></div>
|
||||
<?php else : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'><?= $totalVote[$i] ?></div>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
}
|
||||
|
||||
echo "
|
||||
</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
|
||||
if ($admin['voteopen'] >= 2 || $isVoteAdmin) {
|
||||
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=0 AND npc <2');
|
||||
if ($memCount == 0) {
|
||||
$memCount = 1;
|
||||
}
|
||||
|
||||
if (!isset($nationVoteCount[0])) {
|
||||
$nationVoteCount[0] = 0;
|
||||
}
|
||||
$percentage = round($nationVoteCount[0] / $memCount * 100, 1);
|
||||
|
||||
echo "
|
||||
<tr>
|
||||
<td align=center bgcolor=black>재 야</td>
|
||||
<td align=center>{$nationVoteCount[0]} / {$memCount} ({$percentage} %)</td>
|
||||
<td>
|
||||
";
|
||||
|
||||
$totalPer = 0;
|
||||
for ($i = 0; $i < $voteTypeCount; $i++) {
|
||||
$per = round(Util::array_get($nationVote[0][$i], 0) / $memCount * 100, 1);
|
||||
if ($i == $voteTypeCount - 1) {
|
||||
$per = 100 - $totalPer;
|
||||
} else {
|
||||
$totalPer += $per;
|
||||
}
|
||||
// if($per < 5) { $vote['cnt'] = " "; }
|
||||
?>
|
||||
<?php if ($per == 0) : ?>
|
||||
<?php elseif ($per < 10) : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'></div>
|
||||
<?php else : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'><?= $nationVote[0][$i] ?></div>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
}
|
||||
|
||||
echo "
|
||||
</td>
|
||||
</tr>
|
||||
";
|
||||
|
||||
foreach ($db->query('SELECT nation,color,name,gennum from nation order by gennum desc') as $i => $nation) {
|
||||
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=%i AND npc<2', $nation['nation']);
|
||||
|
||||
|
||||
|
||||
$voteCount = $nationVoteCount[$nation['nation']] ?? 0;
|
||||
if ($memCount == 0) {
|
||||
$percentage = 100;
|
||||
} else {
|
||||
$percentage = round($voteCount / $memCount * 100, 1);
|
||||
}
|
||||
|
||||
|
||||
echo "
|
||||
<tr>
|
||||
<td align=center style=color:" . newColor($nation['color']) . "; bgcolor={$nation['color']}>{$nation['name']}</td>
|
||||
<td align=center>{$voteCount} / {$memCount} ({$percentage} %)</td>
|
||||
<td align=center>
|
||||
";
|
||||
|
||||
$totalPer = 0;
|
||||
for ($k = 0; $k < $voteTypeCount; $k++) {
|
||||
if ($memCount == 0) {
|
||||
$per = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
$per = round(($nationVote[$nation['nation']][$k] ?? 0) / $memCount * 100, 1);
|
||||
|
||||
if ($i == $voteTypeCount - 1) {
|
||||
$per = 100 - $totalPer;
|
||||
} else {
|
||||
$totalPer += $per;
|
||||
}
|
||||
|
||||
// if($per < 5) { $vote['cnt'] = " "; }
|
||||
?>
|
||||
<?php if ($per == 0) : ?>
|
||||
<?php elseif ($per < 10) : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($k) ?>;background-color:<?= getVoteColor($k) ?>;'></div>
|
||||
<?php else : ?>
|
||||
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($k) ?>;background-color:<?= getVoteColor($k) ?>;'><?= $nationVote[$nation['nation']][$k] ?? 0 ?></div>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
}
|
||||
|
||||
echo "
|
||||
</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</form>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
<?php
|
||||
function getVoteColor($type)
|
||||
{
|
||||
if ($type > 0) {
|
||||
$type = (($type - 1) % 7) + 1;
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
default:
|
||||
case 0:
|
||||
$color = "black";
|
||||
break;
|
||||
case 1:
|
||||
$color = "red";
|
||||
break;
|
||||
case 2:
|
||||
$color = "orange";
|
||||
break;
|
||||
case 3:
|
||||
$color = "yellow";
|
||||
break;
|
||||
case 4:
|
||||
$color = "green";
|
||||
break;
|
||||
case 5:
|
||||
$color = "blue";
|
||||
break;
|
||||
case 6:
|
||||
$color = "navy";
|
||||
break;
|
||||
case 7:
|
||||
$color = "purple";
|
||||
break;
|
||||
}
|
||||
|
||||
return $color;
|
||||
}
|
||||
|
||||
function getNewColor($type)
|
||||
{
|
||||
if ($type > 0) {
|
||||
$type = (($type - 1) % 7) + 1;
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
case 2:
|
||||
$color = "black";
|
||||
break;
|
||||
case 3:
|
||||
$color = "black";
|
||||
break;
|
||||
default:
|
||||
$color = "white";
|
||||
break;
|
||||
}
|
||||
|
||||
return $color;
|
||||
}
|
||||
+6
-1
@@ -5,4 +5,9 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
|
||||
$eParams = $_GET;
|
||||
if(key_exists('path', $eParams)){
|
||||
unset($eParams['path']);
|
||||
}
|
||||
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??'', $eParams, true);
|
||||
@@ -1,306 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$msg = Util::getReq('msg');
|
||||
$msg2 = Util::getReq('msg2');
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("거래장", 2);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,special,con,turntime from general where owner=%i', $userID);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
|
||||
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction where no2=%i', $me['no']);
|
||||
|
||||
$btCount = $tradeCount + $bidCount;
|
||||
|
||||
if ($session->userGrade >= 5 || $btCount < 1) {
|
||||
$btn = "submit";
|
||||
} else {
|
||||
$btn = "hidden";
|
||||
}
|
||||
|
||||
if ($msg == "") {
|
||||
$msg = "-";
|
||||
}
|
||||
if ($msg2 == "") {
|
||||
$msg2 = "-";
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title><?= UniqueConst::$serverName ?>: 거래장</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>거 래 장<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font color=orange size=6><b>거 래 장</b></font><input type=button value='갱신' onclick="location.replace('b_auction.php')">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form method=post action=c_auction.php>
|
||||
<tr>
|
||||
<td colspan=11 align=center bgcolor=orange>
|
||||
<font size=5>팝 니 다</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr align=center class='bg1'>
|
||||
<td width=68>거래번호</td>
|
||||
<td width=48>선택</td>
|
||||
<td width=98>판매자</td>
|
||||
<td width=118>물품</td>
|
||||
<td width=88>수량</td>
|
||||
<td width=88>시작판매가</td>
|
||||
<td width=88>현재판매가</td>
|
||||
<td width=88>즉시판매가</td>
|
||||
<td width=48>단가</td>
|
||||
<td width=98>구매 예정자</td>
|
||||
<td width=148>거래종료</td>
|
||||
</tr>
|
||||
<?php
|
||||
$chk = 0;
|
||||
foreach ($db->query('SELECT * from auction where type=0 order by expire') as $auction) {
|
||||
$radio = "";
|
||||
$alert = "";
|
||||
$alert2 = "";
|
||||
if ($auction['no1'] == $me['no']) {
|
||||
$radio = " disabled";
|
||||
} elseif ($auction['no2'] > 0 && $auction['amount'] * 2 <= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($auction['no2'] > 0 && $auction['topv'] <= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($chk == 0) {
|
||||
$radio = " checked";
|
||||
$chk = 1;
|
||||
}
|
||||
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
|
||||
$pv = substr((string)$pv, 0, 4);
|
||||
|
||||
echo "
|
||||
<tr align=center>
|
||||
<td>{$auction['no']}</td>
|
||||
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
|
||||
<td>{$auction['name1']}</td>
|
||||
<td>쌀</td>
|
||||
<td>{$auction['amount']}</td>
|
||||
<td>금 {$auction['cost']}</td>
|
||||
<td>{$alert}금 {$auction['value']}{$alert2}</td>
|
||||
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
|
||||
<td>{$alert}{$pv}{$alert2}</td>
|
||||
<td>{$alert}{$auction['name2']}{$alert2}</td>
|
||||
<td>{$auction['expire']}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
?>
|
||||
<tr height=25>
|
||||
<td align=center class='bg1'>등록결과</td>
|
||||
<td colspan=10><?= ConvertLog($msg) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>입찰등록</td>
|
||||
<td colspan=10>
|
||||
지불할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
|
||||
<input type=<?= $btn ?> name=btn value='구매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>거래등록</td>
|
||||
<td colspan=10>
|
||||
종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
|
||||
물품: 쌀
|
||||
판매량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
|
||||
시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=500>
|
||||
즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=2000>
|
||||
<input type=<?= $btn ?> name=btn value='판매' onclick='return confirm("정말 판매하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=11>
|
||||
ㆍ<font color=cyan>Hint</font>) 거래자가 판매(물품 판매, 금 수령), 입찰자가 구매(물품 구입, 금 지불).<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 판매자 유리.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 입찰자 유리.<br>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form method=post action=c_auction.php>
|
||||
<tr>
|
||||
<td colspan=11 align=center bgcolor=skyblue>
|
||||
<font size=5>삽 니 다</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr align=center class='bg1'>
|
||||
<td width=68>거래번호</td>
|
||||
<td width=48>선택</td>
|
||||
<td width=98>구매자</td>
|
||||
<td width=118>물품</td>
|
||||
<td width=88>수량</td>
|
||||
<td width=88>시작구매가</td>
|
||||
<td width=88>현재구매가</td>
|
||||
<td width=88>즉시구매가</td>
|
||||
<td width=48>단가</td>
|
||||
<td width=98>판매 예정자</td>
|
||||
<td width=148>거래종료</td>
|
||||
</tr>
|
||||
<?php
|
||||
$chk = 0;
|
||||
foreach ($db->query('SELECT * from auction where type=1 order by expire') as $auction) {
|
||||
$radio = "";
|
||||
$alert = "";
|
||||
$alert2 = "";
|
||||
if ($auction['no1'] == $me['no']) {
|
||||
$radio = " disabled";
|
||||
} elseif ($auction['no2'] > 0 && $auction['amount'] >= $auction['value'] * 2) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($auction['no2'] > 0 && $auction['topv'] >= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($chk == 0) {
|
||||
$radio = " checked";
|
||||
$chk = 1;
|
||||
}
|
||||
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
|
||||
$pv = substr((string)$pv, 0, 4);
|
||||
echo "
|
||||
<tr align=center>
|
||||
<td>{$auction['no']}</td>
|
||||
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
|
||||
<td>{$auction['name1']}</td>
|
||||
<td>쌀</td>
|
||||
<td>{$auction['amount']}</td>
|
||||
<td>금 {$auction['cost']}</td>
|
||||
<td>{$alert}금 {$auction['value']}{$alert2}</td>
|
||||
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
|
||||
<td>{$alert}{$pv}{$alert2}</td>
|
||||
<td>{$alert}{$auction['name2']}{$alert2}</td>
|
||||
<td>{$auction['expire']}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
?>
|
||||
<tr height=25>
|
||||
<td align=center class='bg1'>등록결과</td>
|
||||
<td colspan=10><?= ConvertLog($msg2) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>입찰등록</td>
|
||||
<td colspan=10>
|
||||
수령할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
|
||||
<input type=<?= $btn ?> name=btn value='판매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>거래등록</td>
|
||||
<td colspan=10>
|
||||
종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
|
||||
물품: 쌀
|
||||
구입량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
|
||||
시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=2000>
|
||||
즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=500>
|
||||
<input type=<?= $btn ?> name=btn value='구매' onclick='return confirm("정말 구매하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=11>
|
||||
ㆍ<font color=cyan>Hint</font>) 거래자가 구매(물품 구매, 금 지불), 입찰자가 판매(물품 판매, 금 수령).<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 구매자 유리.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 입찰자 유리.<br>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font size=5>최 근 기 록</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<?= getAuctionLogRecent(20) ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font size=5>도 움 말</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<font color=white size=2>
|
||||
ㆍ판매거래는 거래자가 판매할 물품을 거래하면, 구입을 희망하는 사람이 현재가보다 높게 입찰하여 구입하는 방식입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 입찰자가 많아서 자연스레 단가가 오르게 됩니다. (해당 물품을 사려는 가격이 오름)<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 초기 가격을 낮게 책정해야 판매가 가능할 겁니다.<br>
|
||||
ㆍ구매거래는 거래자가 구입할 물품을 거래하면, 판매를 희망하는 사람이 현재가보다 낮게 입찰하여 판매하는 방식입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 입찰자가 많아서 자연스레 단가가 내리게 됩니다. (해당 물품을 팔려는 가격이 내림)<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 초기 가격을 높게 책정해야 구입이 가능할 겁니다.<br>
|
||||
ㆍ마감임박때 입찰하는 경우 입찰후 1턴 후로 종료시간이 연장됩니다.<br>
|
||||
ㆍ즉시구매가로 입찰하는 경우 입찰후 1턴 후로 종료시간이 결정됩니다.<br>
|
||||
ㆍ악용 방지를 위해 50% ~ 200%의 가격에서 거래시작이 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 110% 이상, 즉시구매가는 90% 이하의 시세로 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 시작판매가의 110% 이상, 즉시구매가는 시작구매가의 90% 이하로 가능합니다.<br>
|
||||
ㆍ1인당 도합 1건의 거래와 입찰이 가능합니다.<br>
|
||||
ㆍ기본금쌀 1000은 거래에 사용되지 못합니다.<br>
|
||||
ㆍ유찰될 때는 거래 과실자에게 거래금의 1%가 벌금으로 부과됩니다.<br>
|
||||
ㆍ<font color=magenta>10단위로 거래가 가능합니다. 1자리는 반올림 처리 됩니다.</font><br>
|
||||
ㆍ<font color=red>★ 최고가 거래 ★</font> 혹은 <font color=red>★ 최저가 거래 ★</font> 는 암거래 및 악용의 가능성이니 감시 부탁드립니다.<br>
|
||||
ㆍ거래와 입찰은 취소가 불가능하니 주의하세요!<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가는 금/쌀로 쌀1을 거래하기 위한 금의 양입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 높으면(>1.00) 쌀이 비싸므로 판매가 이득입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 낮으면(<1.00) 금이 비싸므로 구매가 이득입니다.<br>
|
||||
ㆍ즐거운 거래!
|
||||
</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,217 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$v = new Validator($_POST + $_GET);
|
||||
$v->rule('required', 'gen')
|
||||
->rule('integer', 'gen');
|
||||
|
||||
$btn = Util::getReq('btn');
|
||||
$gen = Util::getReq('gen', 'int', 0);
|
||||
$reqQueryType = Util::getReq('query_type', 'string', null);
|
||||
|
||||
// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
|
||||
$queryMap = [
|
||||
'turntime' => ['최근턴', 0, function ($lhs, $rhs) {
|
||||
return - ($lhs['turntime'] <=> $rhs['turntime']);
|
||||
}],
|
||||
'recent_war' => ['최근전투', 1, function ($lhs, $rhs) {
|
||||
return - ($lhs['recent_war'] <=> $rhs['recent_war']);
|
||||
}],
|
||||
'name' => ['장수명', 0, function ($lhs, $rhs) {
|
||||
if ($lhs['npc'] !== $rhs['npc']) {
|
||||
return $lhs['npc'] <=> $rhs['npc'];
|
||||
}
|
||||
return $lhs['name'] <=> $rhs['name'];
|
||||
}],
|
||||
'warnum' => ['전투수', 2, function ($lhs, $rhs) {
|
||||
return - ($lhs['warnum'] <=> $rhs['warnum']);
|
||||
}]
|
||||
];
|
||||
|
||||
if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
|
||||
$reqQueryType = Util::array_first_key($queryMap);
|
||||
}
|
||||
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("감찰부", 2);
|
||||
//전투 추진을 위해 갱신
|
||||
TurnExecutionHelper::executeAllCommand();
|
||||
$gameStor->resetCache();
|
||||
|
||||
$testGeneralNationID = $db->queryFirstField('SELECT nation FROM general WHERE no = %i', $gen);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||
$nationID = $me['nation'];
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$permission = checkSecretPermission($me);
|
||||
if ($permission < 0) {
|
||||
echo '국가에 소속되어있지 않습니다.';
|
||||
die();
|
||||
} else if ($permission < 1) {
|
||||
echo "권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.";
|
||||
die();
|
||||
}
|
||||
|
||||
//잘못된 접근
|
||||
if ($testGeneralNationID != $nationID) {
|
||||
$gen = 0;
|
||||
}
|
||||
|
||||
if ($btn == '정렬하기') {
|
||||
$gen = 0;
|
||||
}
|
||||
|
||||
|
||||
[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
|
||||
if ($reqArgType === 0) {
|
||||
$generalBasicList = $db->query('SELECT no, name, npc, turntime, officer_level FROM general WHERE nation = %i', $nationID);
|
||||
} else if ($reqArgType === 1) {
|
||||
$generalBasicList = $db->query('SELECT no, name, npc, turntime, officer_level, %b FROM general WHERE nation = %i', $reqQueryType, $nationID);
|
||||
} else if ($reqArgType === 2) {
|
||||
$generalBasicList = $db->query(
|
||||
'SELECT no, name, npc, turntime, officer_level, value as %b
|
||||
FROM general LEFT JOIN rank_data
|
||||
ON general.no = rank_data.general_id
|
||||
WHERE rank_data.type = %s AND general.nation = %i',
|
||||
$reqQueryType,
|
||||
$reqQueryType,
|
||||
$nationID
|
||||
);
|
||||
} else if ($reqArgType === 3) {
|
||||
$generalBasicList = array_map(function ($arr) {
|
||||
$arr['aux'] = Json::decode($arr['aux']);
|
||||
return $arr;
|
||||
}, $db->query('SELECT no, name, npc, turntime, officer_level, aux FROM general WHERE nation = %i', $nationID));
|
||||
} else {
|
||||
throw new \sammo\MustNotBeReachedException();
|
||||
}
|
||||
|
||||
|
||||
usort($generalBasicList, $comp);
|
||||
|
||||
if (!$gen) {
|
||||
$gen = $generalBasicList[0]['no'];
|
||||
}
|
||||
$showGeneral = General::createGeneralObjFromDB($gen);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title><?= UniqueConst::$serverName ?>: 감찰부</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>감 찰 부<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<form name=form1 method=post>
|
||||
정렬순서 :
|
||||
<select name='query_type' size=1>
|
||||
<?php foreach ($queryMap as $queryType => [$queryTypeText,]) : ?>
|
||||
<option <?= $queryType == $reqQueryType ? 'selected' : '' ?> value='<?= $queryType ?>'><?= $queryTypeText ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<input type=submit name=btn value='정렬하기'>
|
||||
대상장수 :
|
||||
<select name=gen size=1>
|
||||
<?php foreach ($generalBasicList as $general) : ?>
|
||||
<option <?= $gen == $general['no'] ? 'selected' : '' ?> value='<?= $general['no'] ?>'><?= $general['officer_level'] > 4 ? "*{$general['name']}*" : $general['name'] ?> (<?= substr($general['turntime'], 14, 5) ?>)</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<input type=submit name=btn value='조회하기'>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width=1000 align=center class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td width=50% align=center class='bg1'>
|
||||
<font color=skyblue size=3>장 수 정 보</font>
|
||||
</td>
|
||||
<td width=50% align=center class='bg1'>
|
||||
<font color=orange size=3>장 수 열 전</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
<?php generalInfo($showGeneral);
|
||||
generalInfo2($showGeneral); ?>
|
||||
</td>
|
||||
<td valign=top>
|
||||
<?= formatHistoryToHTML(getGeneralHistoryLogAll($gen)) ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>
|
||||
<font color=orange size=3>전투 기록</font>
|
||||
</td>
|
||||
<td align=center class='bg1'>
|
||||
<font color=orange size=3>전투 결과</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
<?= formatHistoryToHTML(getBattleDetailLogRecent($gen, 24)) ?>
|
||||
</td>
|
||||
<td valign=top>
|
||||
<?= formatHistoryToHTML(getBattleResultRecent($gen, 24)) ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if ($showGeneral->getNPCType() > 1 || $permission >= 2) : ?>
|
||||
<tr>
|
||||
<td align=center class='bg1'>
|
||||
<font color=orange size=3>개인 기록</font>
|
||||
</td>
|
||||
<td align=center class='bg1'>
|
||||
<font color=orange size=3> </font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
<?= formatHistoryToHTML(getGeneralActionLogRecent($gen, 24)) ?>
|
||||
</td>
|
||||
<td valign=top>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+118
-71
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
//로그인 검사
|
||||
@@ -16,19 +18,13 @@ TurnExecutionHelper::executeAllCommand();
|
||||
|
||||
$generalID = $session->generalID;
|
||||
|
||||
//NOTE: general_id만 빼기 귀찮음.
|
||||
$myBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
|
||||
$myBet = array_splice($myBet, -16);
|
||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
|
||||
$globalBet = array_splice($globalBet, -16);
|
||||
|
||||
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
|
||||
|
||||
$myBetTotal = array_sum($myBet);
|
||||
$globalBetTotal = array_sum($globalBet);
|
||||
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'develcost']);
|
||||
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
|
||||
$turnTerm = $admin['turnterm'];
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
@@ -36,40 +32,74 @@ if ($con >= 2) {
|
||||
}
|
||||
|
||||
switch ($admin['tnmt_type']) {
|
||||
default:
|
||||
throw new \RuntimeException('Invalid tnmt_type');
|
||||
case 0:
|
||||
$tnmt_type = "<font color=cyan>전력전</font>";
|
||||
case convertTournamentType('전력전'):
|
||||
$tnmt_type = "전력전";
|
||||
$color = "cyan";
|
||||
$tp = "total";
|
||||
$tp2 = "종합";
|
||||
$tp3 = "total";
|
||||
break;
|
||||
case 1:
|
||||
$tnmt_type = "<font color=cyan>통솔전</font>";
|
||||
case convertTournamentType('통솔전'):
|
||||
$tnmt_type = "통솔전";
|
||||
$color = "cyan";
|
||||
$tp = "leadership";
|
||||
$tp2 = "통솔";
|
||||
$tp3 = "leadership";
|
||||
break;
|
||||
case 2:
|
||||
$tnmt_type = "<font color=cyan>일기토</font>";
|
||||
case convertTournamentType('일기토'):
|
||||
$tnmt_type = "일기토";
|
||||
$color = "cyan";
|
||||
$tp = "strength";
|
||||
$tp2 = "무력";
|
||||
$tp3 = "strength";
|
||||
break;
|
||||
case 3:
|
||||
$tnmt_type = "<font color=cyan>설전</font>";
|
||||
case convertTournamentType('설전'):
|
||||
$tnmt_type = "설전";
|
||||
$color = "cyan";
|
||||
$tp = "intel";
|
||||
$tp2 = "지력";
|
||||
$tp3 = "intel";
|
||||
break;
|
||||
default:
|
||||
throw new \RuntimeException('Invalid tnmt_type');
|
||||
}
|
||||
|
||||
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||
$myBet = [];
|
||||
$globalBet = [];
|
||||
|
||||
if ($bettingID != 0) {
|
||||
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||
$info = $betting->getInfo();
|
||||
|
||||
foreach ($db->queryAllLists(
|
||||
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
|
||||
$bettingID
|
||||
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
|
||||
$bettingKey = Json::decode($bettingTypeKey)[0];
|
||||
if ($betGeneralID == $generalID) {
|
||||
$myBet[$bettingKey] = $amount;
|
||||
}
|
||||
|
||||
if (key_exists($bettingKey, $globalBet)) {
|
||||
$globalBet[$bettingKey] += $amount;
|
||||
} else {
|
||||
$globalBet[$bettingKey] = $amount;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$info = getDummyBettingInfo($tnmt_type);
|
||||
}
|
||||
|
||||
$myBetTotal = array_sum($myBet);
|
||||
$globalBetTotal = array_sum($globalBet);
|
||||
|
||||
$str1 = getTournament($admin['tournament']);
|
||||
$str2 = getTournamentTime();
|
||||
if ($str2) {
|
||||
$str2 = ', ' . $str2;
|
||||
}
|
||||
$str3 = getTournamentTermText();
|
||||
$str3 = getTournamentTermText($turnTerm);
|
||||
if ($str3) {
|
||||
$str3 = ', ' . $str3;
|
||||
}
|
||||
@@ -89,7 +119,13 @@ if ($str3) {
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'betting']) ?>
|
||||
<?= WebUtil::printStaticValues([
|
||||
'staticValues'=>[
|
||||
'bettingID'=> $bettingID
|
||||
]
|
||||
])?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -100,11 +136,11 @@ if ($str3) {
|
||||
</table>
|
||||
<table align=center width=1120 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=16><input type=button value='갱신' onclick='location.reload()'></td>
|
||||
<td colspan=16><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=16 align=center>
|
||||
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -265,7 +301,6 @@ if ($str3) {
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
echo "<td colspan=2>{$gen[$i]}</td>";
|
||||
}
|
||||
|
||||
echo "
|
||||
</tr>
|
||||
<tr align=center>";
|
||||
@@ -273,7 +308,7 @@ if ($str3) {
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$cent[$i] = "<font color=white>";
|
||||
}
|
||||
$generalList = $db->query('SELECT npc,name,win from tournament where grp>=20 order by grp, grp_no LIMIT 16');
|
||||
$generalList = $db->query('SELECT npc,name,win,leadership,strength,intel,leadership+strength+intel as total from tournament where grp>=20 order by grp, grp_no LIMIT 16');
|
||||
while (count($generalList) < 16) {
|
||||
$generalList[] = [
|
||||
'name' => '-',
|
||||
@@ -293,6 +328,11 @@ if ($str3) {
|
||||
$line[$i] = "<font color=white>";
|
||||
}
|
||||
$gen[$i] = $general['name'];
|
||||
if (array_key_exists($tp, $general)) {
|
||||
$stat[$i] = $general[$tp];
|
||||
} else {
|
||||
$stat[$i] = "-";
|
||||
}
|
||||
}
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$cent[$i] = $cent[$i] . "┻" . "</font>";
|
||||
@@ -300,45 +340,48 @@ if ($str3) {
|
||||
$line[$i * 2 + 1] = $line[$i * 2 + 1] . "━━┓" . "</font>";
|
||||
echo "<td colspan=2>{$line[$i * 2]}{$cent[$i]}{$line[$i * 2 + 1]}</td>";
|
||||
}
|
||||
echo "
|
||||
</tr>
|
||||
<tr align=center>";
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
echo "<td width=70>{$gen[$i]}</td>";
|
||||
}
|
||||
|
||||
$bet = [];
|
||||
$gold = [];
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
if ($globalBet[$i] == 0) {
|
||||
$bet[$i] = "∞";
|
||||
} else {
|
||||
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
|
||||
}
|
||||
}
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
if (!is_numeric($bet[$i])) {
|
||||
$gold[$i] = 0;
|
||||
} else {
|
||||
$gold[$i] = Util::round($myBet[$i] * $bet[$i]);
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
<tr align=center>
|
||||
<?php for ($i = 0; $i < 16; $i++) { ?>
|
||||
<td width=70><?= $gen[$i] ?></td>
|
||||
<?php } ?>
|
||||
</tr>
|
||||
<tr align=center>
|
||||
<?php for ($i = 0; $i < 16; $i++) { ?>
|
||||
<td width=70 style="font-size: 14px"><?= $stat[$i] ?></td>
|
||||
<?php } ?>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1120 class='tb_layout bg0'>
|
||||
<table align=center width=1120 style="table-layout: fixed" class='tb_layout bg0'>
|
||||
<tr align=center>
|
||||
<td height=10 colspan=16></td>
|
||||
</tr>
|
||||
<?php
|
||||
|
||||
$bet = [];
|
||||
$gold = [];
|
||||
$keyMap = [];
|
||||
foreach ($info->candidates as $key => $candidate) {
|
||||
$keyMap[$candidate->aux['idx']] = $key;
|
||||
}
|
||||
|
||||
foreach ($globalBet as $key => $amount) {
|
||||
if ($amount == 0) {
|
||||
$bet[$key] = "∞";
|
||||
$gold[$key] = 0;
|
||||
} else {
|
||||
$rewardRatio = round($globalBetTotal / $amount, 2);
|
||||
$bet[$key] = $rewardRatio;
|
||||
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
|
||||
}
|
||||
}
|
||||
echo "
|
||||
<tr align=center>";
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
echo "<td width=70><font color=skyblue>{$bet[$i]}</font></td>";
|
||||
foreach (range(0, 15) as $i) {
|
||||
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
|
||||
echo "<td width=70><font color=skyblue>{$amount}</font></td>";
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
@@ -362,8 +405,9 @@ if ($str3) {
|
||||
</tr>
|
||||
<tr align=center>
|
||||
<?php
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
echo "<td><font color=orange>{$myBet[$i]}</font></td>";
|
||||
foreach (range(0, 15) as $i) {
|
||||
$amount = $myBet[$keyMap[$i] ?? -1] ?? 0;
|
||||
echo "<td><font color=orange>{$amount}</font></td>";
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
@@ -387,8 +431,9 @@ if ($str3) {
|
||||
</tr>
|
||||
<tr align=center>
|
||||
<?php
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
echo "<td><font color=cyan>{$gold[$i]}</font></td>";
|
||||
foreach (range(0, 15) as $i) {
|
||||
$amount = $gold[$keyMap[$i] ?? -1] ?? 0;
|
||||
echo "<td><font color=cyan>{$amount}</font></td>";
|
||||
}
|
||||
|
||||
echo "
|
||||
@@ -397,12 +442,13 @@ if ($str3) {
|
||||
|
||||
if ($admin['tournament'] == 6) {
|
||||
echo "
|
||||
<tr align=center>";
|
||||
<tr align=center style='height:2.5em;'>";
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
foreach (range(0, 15) as $i) {
|
||||
$key = $keyMap[$i] ?? -1;
|
||||
echo "
|
||||
<td>
|
||||
<select size=1 id='target_{$i}' style=color:white;background-color:black;>
|
||||
<select size=1 id='target_{$key}' style='color:white;background-color:black;padding:0.2rem 0.1rem;'>
|
||||
<option style=color:white; value=10>금10</option>
|
||||
<option style=color:white; value=20>금20</option>
|
||||
<option style=color:white; value=50>금50</option>
|
||||
@@ -416,11 +462,12 @@ if ($str3) {
|
||||
|
||||
echo "
|
||||
</tr>
|
||||
<tr align=center>";
|
||||
<tr align=center style='height:2.2em;'>";
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
foreach (range(0, 15) as $i) {
|
||||
$key = $keyMap[$i] ?? -1;
|
||||
echo "
|
||||
<td><input type=button class='submitBtn' data-target='{$i}' value=베팅! style=width:100%;color:white;background-color:black;></td>";
|
||||
<td><input type=button class='submitBtn' data-target='{$key}' value=베팅! style='width:100%;color:white;padding:0.2rem 0.1rem;background-color:black;'></td>";
|
||||
}
|
||||
|
||||
echo "</tr>";
|
||||
@@ -507,14 +554,14 @@ if ($str3) {
|
||||
<td align=center>勝</td>
|
||||
</tr>
|
||||
<?php
|
||||
$prizeColumn = "{$rankColumn}p";
|
||||
$gameColumn = "{$rankColumn}g";
|
||||
$winColumn = "{$rankColumn}w";
|
||||
$drawColumn = "{$rankColumn}d";
|
||||
$loseColumn = "{$rankColumn}l";
|
||||
$prizeColumn = RankColumn::from("{$rankColumn}p");
|
||||
$gameColumn = RankColumn::from("{$rankColumn}g");
|
||||
$winColumn = RankColumn::from("{$rankColumn}w");
|
||||
$drawColumn = RankColumn::from("{$rankColumn}d");
|
||||
$loseColumn = RankColumn::from("{$rankColumn}l");
|
||||
$tournamentRankerList = General::createGeneralObjListFromDB(
|
||||
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn),
|
||||
[$prizeColumn, $gameColumn, $winColumn, $drawColumn, $loseColumn, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
|
||||
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value),
|
||||
[$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
|
||||
0
|
||||
);
|
||||
usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
|
||||
|
||||
@@ -13,9 +13,11 @@ $userID = Session::getUserID();
|
||||
$userGrade = Session::getUserGrade();
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
increaseRefresh("현재도시", 1);
|
||||
|
||||
$lastExecute = substr($gameStor->turntime, 5, 14);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID);
|
||||
$myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [
|
||||
'nation' => 0,
|
||||
@@ -53,6 +55,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
font-size: x-small;
|
||||
}
|
||||
</style>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'currentCity']) ?>
|
||||
</head>
|
||||
|
||||
@@ -337,6 +340,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
'ourGeneral' => $ourGeneral,
|
||||
'iconPath' => GetImageURL($general['imgsvr']) . '/' . $general['picture'],
|
||||
'isNPC' => $isNPC,
|
||||
'npc' => $general['npc'],
|
||||
'wounded' => $wounded,
|
||||
'name' => $name,
|
||||
'nameText' => $nameText,
|
||||
@@ -364,7 +368,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
}
|
||||
|
||||
$generalsName = array_map(function ($gen) {
|
||||
return getColoredName($gen['name'], $gen['npc']);
|
||||
return formatName($gen['name'], $gen['npc']);
|
||||
}, $generals);
|
||||
|
||||
$enemyCrew = 0;
|
||||
@@ -445,7 +449,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
<table align=center width=1000 class='tb_layout bg2'>
|
||||
<tr>
|
||||
<td colspan=11 align=center style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>'>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></td>
|
||||
<td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= date('m-d H:i:s') ?></td>
|
||||
<td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= $lastExecute ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center width=48 class=bg1>주민</td>
|
||||
|
||||
@@ -1,236 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("중원정보", 1);
|
||||
|
||||
$mapTheme = $gameStor->map_theme ?? 'che';
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation FROM general WHERE owner=%i', $userID);
|
||||
$myNationID = $me['nation'];
|
||||
|
||||
$nations = array_filter(getAllNationStaticInfo(), function (array $nation) {
|
||||
return $nation['level'];
|
||||
});
|
||||
uasort($nations, function (array $lhs, array $rhs) {
|
||||
return - ($lhs['power'] <=> $rhs['power']);
|
||||
});
|
||||
$nationCnt = count($nations);
|
||||
|
||||
foreach ($db->queryAllLists('SELECT nation, count(city) FROM city WHERE nation != 0 GROUP BY nation') as [$nationID, $cityCnt]) {
|
||||
$nations[$nationID]['city_cnt'] = $cityCnt;
|
||||
}
|
||||
|
||||
$realConflict = [];
|
||||
foreach ($db->queryAllLists('SELECT city, `name`, conflict FROM city WHERE conflict!=%s', '{}') as [
|
||||
$cityID,
|
||||
$cityName,
|
||||
$rawConflict
|
||||
]) {
|
||||
$rawConflict = Json::decode($rawConflict);
|
||||
if (count($rawConflict) < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$sum = array_sum($rawConflict);
|
||||
|
||||
|
||||
$conflict = [];
|
||||
foreach ($rawConflict as $nationID => $killnum) {
|
||||
$conflict[$nationID] = [
|
||||
'killnum' => $killnum,
|
||||
'percent' => round(100 * $killnum / $sum, 1),
|
||||
'name' => $nations[$nationID]['name'],
|
||||
'color' => $nations[$nationID]['color']
|
||||
];
|
||||
}
|
||||
|
||||
$realConflict[] = [$cityID, $cityName, $conflict];
|
||||
};
|
||||
|
||||
$diplomacyList = [];
|
||||
foreach ($db->queryAllLists('SELECT me, you, state FROM diplomacy') as [$me, $you, $state]) {
|
||||
if (!key_exists($me, $diplomacyList)) {
|
||||
$diplomacyList[$me] = [];
|
||||
}
|
||||
|
||||
$diplomacyList[$me][$you] = $state;
|
||||
}
|
||||
|
||||
$cellWidth = intdiv(888, max(1, $nationCnt));
|
||||
|
||||
|
||||
$defaultStateChar = '?';
|
||||
$sameNationStateChar = '\';
|
||||
$infomativeStateCharMap = [
|
||||
0 => '<span style="color:red;">★</span>',
|
||||
1 => '<span style="color:magenta;">▲</span>',
|
||||
2 => 'ㆍ',
|
||||
7 => '<span style="color:green;">@</span>'
|
||||
];
|
||||
$neutralStateCharMap = [
|
||||
0 => '<span style="color:red;">★</span>',
|
||||
1 => '<span style="color:magenta;">▲</span>'
|
||||
];
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<title><?= UniqueConst::$serverName ?>: 중원 정보</title>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printJS('d_shared/base_map.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/map.css') ?>
|
||||
<?= WebUtil::printCSS('css/history.css') ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'map']) ?>
|
||||
<script>
|
||||
window.serverNick = '<?= DB::prefix() ?>';
|
||||
window.serverID = '<?= UniqueConst::$serverID ?>';
|
||||
$(function() {
|
||||
|
||||
reloadWorldMap({
|
||||
neutralView: true,
|
||||
showMe: true,
|
||||
useCachedMap: true
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>중 원 정 보<br><?= backButton() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=<?= $nationCnt + 1 ?> align=center bgcolor=blue>외 교 현 황</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center width=130 style=background-color:<?= GameConst::$basecolor2 ?>;> </td>
|
||||
<?php foreach ($nations as $nation) : ?>
|
||||
<td align=center width=<?= $cellWidth ?> style='background-color:<?= $nation['color'] ?>;color:<?= newColor($nation['color']) ?>'><?= $nation['name'] ?></td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<?php foreach ($nations as $me => $meNation) : ?>
|
||||
<tr style='text-align:center;'>
|
||||
<td align=center style='background-color:<?= $meNation['color'] ?>;color:<?= newColor($meNation['color']) ?>'><?= $meNation['name'] ?></td>
|
||||
<?php foreach (array_keys($nations) as $you) : ?>
|
||||
<td <?= ($me == $myNationID || $you == $myNationID) ? 'style="background-color:' . GameConst::$basecolor3 . '"' : '' ?>><?php
|
||||
if ($me == $you) {
|
||||
echo $sameNationStateChar;
|
||||
} else if ($me == $myNationID || $you == $myNationID || $session->userGrade >= 5) {
|
||||
echo $infomativeStateCharMap[$diplomacyList[$me][$you]] ?? $defaultStateChar;
|
||||
} else {
|
||||
echo $neutralStateCharMap[$diplomacyList[$me][$you]] ?? $defaultStateChar;
|
||||
}
|
||||
?></td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<td colspan=<?= $nationCnt + 1 ?> align=center>불가침 : <font color=limegreen>@</font>, 통상 : ㆍ, 선포 : <font color=magenta>▲</font>, 교전 : <font color=red>★</font>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<?php if ($realConflict) : ?>
|
||||
|
||||
<br>
|
||||
<table align='center' width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=2 align=center bgcolor=magenta>분 쟁 현 황</td>
|
||||
</tr>
|
||||
<?php foreach ($realConflict as list($cityID, $cityName, $conflict)) : ?>
|
||||
<tr>
|
||||
<td align=center width=48><?= $cityName ?></td>
|
||||
<td style='width:948px;position:relative;'>
|
||||
<table class='tb_layout bg0' style='width:100%;'>
|
||||
<?php foreach ($conflict as $item) : ?>
|
||||
<tr>
|
||||
<td width=130 align=right style='color:<?= newColor($item['color']) ?>;background-color:<?= $item['color'] ?>;'><?= $item['name'] ?> </td>
|
||||
<td width=48 align=right><?= (float)$item['percent'] ?> % </td>
|
||||
<td width=*>
|
||||
<div style='display:inline-block;width:<?= $item['percent'] ?>%;background-color:<?= $item['color'] ?>;'> </div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<td colspan=2 height=5 class='bg1'></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=5 align=center bgcolor=green>
|
||||
<font size=3>중 원 지 도</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=698 height=420>
|
||||
<?= getMapHtml($mapTheme) ?>
|
||||
</td>
|
||||
<td id='nation_list_frame'>
|
||||
<table id='nation_list'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th width=130>국명</th>
|
||||
<th width=70>국력</th>
|
||||
<th width=45>장수</th>
|
||||
<th width=45>속령</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($nations as $nation) : ?>
|
||||
<tr>
|
||||
<td><span style='color:<?= newColor($nation['color']) ?>;background-color:<?= $nation['color'] ?>'><?= $nation['name'] ?></td>
|
||||
<td style='text-align:right'><?= number_format($nation['power']) ?></td>
|
||||
<td style='text-align:right'><?= number_format($nation['gennum']) ?></td>
|
||||
<td style='text-align:right'><?= number_format($nation['city_cnt']) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot></tfoot>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= backButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+2
-1
@@ -57,6 +57,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
@@ -172,7 +173,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
|
||||
$general['expLevelText'] = getExpLevel($general['experience']);
|
||||
|
||||
$general['nameText'] = getColoredName($general['name'], $general['npc']);
|
||||
$general['nameText'] = formatName($general['name'], $general['npc']);
|
||||
|
||||
$general['modeText'] = formatDefenceTrain($general['defence_train']);
|
||||
$general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name ?? '-';
|
||||
|
||||
+48
-48
@@ -25,6 +25,17 @@ if ($meLevel == 0) {
|
||||
|
||||
$nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nation where nation=%i', $nationID); //국가정보
|
||||
|
||||
if ($meLevel >= 5) {
|
||||
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
|
||||
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
|
||||
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
|
||||
} else {
|
||||
$candidateStrength = [];
|
||||
$candidateIntel = [];
|
||||
$candidateAny = [];
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -43,6 +54,7 @@ $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nati
|
||||
var chiefStatMin = <?= GameConst::$chiefStatMin ?>;
|
||||
var myLevel = <?= $meLevel ?>;
|
||||
</script>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'bossInfo']) ?>
|
||||
|
||||
<?php
|
||||
@@ -180,61 +192,21 @@ $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nati
|
||||
<td colspan=5><?= $eaglestr ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=6 height=5></td>
|
||||
<td colspan=4 height=5></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=2 align=center bgcolor=red>추 방</td>
|
||||
<td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=498 align=right class='bg1'>대상 장수</td>
|
||||
<td width=498>
|
||||
<?php $officerLevelText = getOfficerLevelText(11, $nation['level']); ?>
|
||||
<td width=98 align=right class='bg1'><?= getOfficerLevelText(12, $nation['level']) ?></td>
|
||||
<td width=398><?= $level[12]['name'] ?> 【<?= CityConst::byID($level[12]['city'])->name ?>】</td>
|
||||
<td width=98 align=right class='bg1'><?= $officerLevelText ?></td>
|
||||
<td width=398>
|
||||
<?php
|
||||
|
||||
if ($meLevel >= 5) {
|
||||
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
|
||||
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
|
||||
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
|
||||
} else {
|
||||
$candidateStrength = [];
|
||||
$candidateIntel = [];
|
||||
$candidateAny = [];
|
||||
}
|
||||
|
||||
|
||||
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) {
|
||||
echo "
|
||||
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
|
||||
|
||||
foreach ($candidateAny as $general) {
|
||||
if ($general['no'] === $me['no']) {
|
||||
continue;
|
||||
}
|
||||
echo "
|
||||
<option data-officer_level='{$general['officer_level']}' data-name='{$general['name']}' value={$general['no']}>{$general['name']} <small>({$general['leadership']}/{$general['strength']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
|
||||
}
|
||||
|
||||
echo "
|
||||
</select>
|
||||
<input type=$btn id='btn_kick' value=추방>";
|
||||
}
|
||||
|
||||
$officerLevelText = getOfficerLevelText(11, $nation['level']);
|
||||
echo "
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr><td colspan=4 height=5></td></tr>
|
||||
<tr><td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td></tr>
|
||||
<tr>
|
||||
<td width=98 align=right class='bg1'>" . getOfficerLevelText(12, $nation['level']) . "</td>
|
||||
<td width=398>{$level[12]['name']} 【" . CityConst::byID($level[12]['city'])->name . "】</td>
|
||||
<td width=98 align=right class='bg1'>{$officerLevelText}</td>
|
||||
<td width=398>
|
||||
";
|
||||
|
||||
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], 11)) {
|
||||
echo "
|
||||
<select id='genlist_11' size=1 maxlength=15 style=color:white;background-color:black;>
|
||||
@@ -553,6 +525,34 @@ $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nati
|
||||
<td colspan=5>※ <font color=orange>노란색</font>은 변경 불가능, 하얀색은 변경 가능 관직입니다.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td colspan=6 height=5></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=2 align=center bgcolor=red>추 방</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=498 align=right class='bg1'>대상 장수</td>
|
||||
<td width=498>
|
||||
<?php
|
||||
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) : ?>
|
||||
|
||||
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
|
||||
|
||||
<?php foreach ($candidateAny as $general) : ?>
|
||||
<?php if ($general['no'] === $me['no']) {
|
||||
continue;
|
||||
}
|
||||
?>
|
||||
<option data-officer_level='<?= $general['officer_level'] ?>' data-name='<?= $general['name'] ?>' value='<?= $general['no'] ?>'><?= $general['name'] ?> <small>(<?= $general['leadership'] ?>/<?= $general['strength'] ?>/<?= $general['intel'] ?>, <?= $general['killturn'] ?>턴)</small></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<input type=<?= $btn ?> id='btn_kick' value=추방>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
|
||||
+73
-58
@@ -39,6 +39,7 @@ $sel = [$type => "selected"];
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'extExpandCity']) ?>
|
||||
</head>
|
||||
|
||||
@@ -71,7 +72,8 @@ $sel = [$type => "selected"];
|
||||
</table>
|
||||
<?php
|
||||
|
||||
$nation = getNationStaticInfo($me['nation']); //국가정보
|
||||
$nation = $db->queryFirstRow('SELECT nation, name, color, type, level, capital, gennum, `power`, `rate` from nation WHERE nation = %i', $nationID); //국가정보
|
||||
$nationTypeObj = buildNationTypeClass($nation['type']);
|
||||
|
||||
$officerList = [];
|
||||
foreach ($db->query('SELECT no,name,npc,city,officer_level,officer_city,belong FROM general WHERE nation = %i AND 2 <= officer_level AND officer_level <= 4', $nationID) as $officer) {
|
||||
@@ -82,6 +84,17 @@ $sel = [$type => "selected"];
|
||||
$officerList[$officerCityID][$officer['officer_level']] = $officer;
|
||||
}
|
||||
|
||||
$generalList = $db->query('SELECT npc, name, city FROM general WHERE nation = %i', $me['nation']);
|
||||
$cityGeneralList = [];
|
||||
foreach ($generalList as $general) {
|
||||
$cityID = $general['city'];
|
||||
if (!key_exists($cityID, $cityGeneralList)) {
|
||||
$cityGeneralList[$cityID] = [];
|
||||
}
|
||||
|
||||
$cityGeneralList[$cityID][] = formatName($general['name'], $general['npc']);
|
||||
}
|
||||
|
||||
|
||||
$cityList = $db->query('SELECT *,pop/pop_max as poprate from city where nation=%i', $nationID);
|
||||
|
||||
@@ -171,8 +184,12 @@ $sel = [$type => "selected"];
|
||||
];
|
||||
|
||||
$cityOfficerList = $officerList[$cityID] ?? [];
|
||||
$effectiveOfficerCnt = 0;
|
||||
foreach ($cityOfficerList as $cityOfficer) {
|
||||
$officerName[$cityOfficer['officer_level']] = getColoredName($cityOfficer['name'], $cityOfficer['npc']);
|
||||
if ($cityOfficer['city'] == $cityID) {
|
||||
$effectiveOfficerCnt += 1;
|
||||
}
|
||||
$officerName[$cityOfficer['officer_level']] = formatName($cityOfficer['name'], $cityOfficer['npc']);
|
||||
}
|
||||
|
||||
if ($type == 10 && $city['region'] != $region) {
|
||||
@@ -187,62 +204,60 @@ $sel = [$type => "selected"];
|
||||
$city['trade'] = "- ";
|
||||
}
|
||||
|
||||
echo "
|
||||
<table align=center width=1000 class='tb_layout bg2'>
|
||||
<tr>
|
||||
<td colspan=12 style=color:" . newColor($nation['color']) . "; bgcolor={$nation['color']}><font size=2>【 " . CityConst::$regionMap[$city['region']] . " | " . CityConst::$levelMap[$city['level']] . " 】 {$city['name']}</font></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center width=46 class='bg1'>주민</td>
|
||||
<td align=center width=140>{$city['pop']}/{$city['pop_max']}</td>
|
||||
<td align=center width=46 class='bg1'>농업</td>
|
||||
<td align=center width=140>{$city['agri']}/{$city['agri_max']}</td>
|
||||
<td align=center width=46 class='bg1'>상업</td>
|
||||
<td align=center width=140>{$city['comm']}/{$city['comm_max']}</td>
|
||||
<td align=center width=46 class='bg1'>치안</td>
|
||||
<td align=center width=140>{$city['secu']}/{$city['secu_max']}</td>
|
||||
<td align=center width=46 class='bg1'>수비</td>
|
||||
<td align=center width=140>{$city['def']}/{$city['def_max']}</td>
|
||||
<td align=center width=46 class='bg1'>성벽</td>
|
||||
<td align=center width=140>{$city['wall']}/{$city['wall_max']}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>민심</td>
|
||||
<td align=center>" . round($city['trust'], 1) . "</td>
|
||||
<td align=center class='bg1'>시세</td>
|
||||
<td align=center>{$city['trade']}%</td>
|
||||
<td align=center class='bg1'>인구</td>
|
||||
<td align=center>" . round($city['pop'] / $city['pop_max'] * 100, 2) . " %</td>
|
||||
<td align=center class='bg1'>태수</td>
|
||||
<td align=center>";
|
||||
echo $officerName[4];
|
||||
echo "</td>
|
||||
<td align=center class='bg1'>군사</td>
|
||||
<td align=center>";
|
||||
echo $officerName[3];
|
||||
echo "</td>
|
||||
<td align=center class='bg1'>종사</td>
|
||||
<td align=center>";
|
||||
echo $officerName[2];
|
||||
echo "</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>장수</td>
|
||||
<td colspan=11>";
|
||||
$generalList = $db->query('SELECT npc, name FROM general WHERE city = %i AND nation = %i', $city['city'], $me['nation']);
|
||||
if (!$generalList) {
|
||||
echo "-";
|
||||
}
|
||||
foreach ($generalList as $general) {
|
||||
echo getColoredName($general['name'], $general['npc']) . ', ';
|
||||
}
|
||||
echo "
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
";
|
||||
}
|
||||
|
||||
$cityGoldIncome = $nation['rate'] / 20 * calcCityGoldIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
|
||||
$cityRiceIncome = $nation['rate'] / 20 * calcCityRiceIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
|
||||
$cityWallIncome = $nation['rate'] / 20 * calcCityWallRiceIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
|
||||
|
||||
?>
|
||||
<table align=center width=1000 class='tb_layout bg2'>
|
||||
<tr>
|
||||
<td colspan=10 style="color:<?= newColor($nation['color']) ?>; background-color:<?= $nation['color'] ?>;">
|
||||
<font size=2>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style='text-align:center;'>
|
||||
<td width=60 class='bg1'>주민</td>
|
||||
<td width=140 class='pop-value'><?= $city['pop'] ?>/<?= $city['pop_max'] ?></td>
|
||||
<td width=60 class='bg1'>인구율</td>
|
||||
<td width=140 class='pop-prop-value'><?= round($city['pop'] / $city['pop_max'] * 100, 2) ?>%</td>
|
||||
<td width=60 class='bg1'>자금 수입</td>
|
||||
<td width=140 class='gold-income'><?= number_format($cityGoldIncome) ?></td>
|
||||
<td width=60 class='bg1'>군량 수입</td>
|
||||
<td width=140 class='rice-income'><?= number_format($cityRiceIncome) ?></td>
|
||||
<td width=60 class='bg1'>둔전 수입</td>
|
||||
<td width=140 class='wall-income'><?= number_format($cityWallIncome) ?></td>
|
||||
</tr>
|
||||
<tr style='text-align:center;'>
|
||||
<td class='bg1'>농업</td>
|
||||
<td class='agri-value'><?= $city['agri'] ?>/<?= $city['agri_max'] ?></td>
|
||||
<td class='bg1'>상업</td>
|
||||
<td class='comm-value'><?= $city['comm'] ?>/<?= $city['comm_max'] ?></td>
|
||||
<td class='bg1'>치안</td>
|
||||
<td class='secu-value'><?= $city['secu'] ?>/<?= $city['secu_max'] ?></td>
|
||||
<td class='bg1'>수비</td>
|
||||
<td class='def-value'><?= $city['def'] ?>/<?= $city['def_max'] ?></td>
|
||||
<td class='bg1'>성벽</td>
|
||||
<td class='wall-value'><?= $city['wall'] ?>/<?= $city['wall_max'] ?></td>
|
||||
</tr>
|
||||
<tr style='text-align:center;'>
|
||||
<td class='bg1'>민심</td>
|
||||
<td class='trust-value'><?= round($city['trust'], 1) ?></td>
|
||||
<td class='bg1'>시세</td>
|
||||
<td class='trade-value'><?= $city['trade'] ?>%</td>
|
||||
<td class='bg1'>태수</td>
|
||||
<td class='officer-4-value'><?= $officerName[4] ?></td>
|
||||
<td class='bg1'>군사</td>
|
||||
<td class='officer-3-value'><?= $officerName[3] ?></td>
|
||||
<td class='bg1'>종사</td>
|
||||
<td class='officer-2-value'><?= $officerName[2] ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style='text-align:center;' class='bg1'>장수</td>
|
||||
<td colspan=9 class='city-generals'><?= key_exists($cityID, $cityGeneralList) ? join(', ', $cityGeneralList[$cityID]) : '-' ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php } ?>
|
||||
|
||||
<table align=center width=1000 class='tb_layout bg0 anchor'>
|
||||
<tr>
|
||||
@@ -252,7 +267,7 @@ $sel = [$type => "selected"];
|
||||
<td><?= banner() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div id="helper_genlist" style="display:none;"></div>
|
||||
</body>
|
||||
<div id="helper_genlist" style="display:none;"></div>
|
||||
|
||||
</html>
|
||||
@@ -48,6 +48,7 @@ if ($gameStor->isunited) {
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ if ($nationID == 0) {
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
|
||||
+47
-15
@@ -5,8 +5,9 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$showDieImmediatelyBtn = false;
|
||||
$availableDieImmediately = false;
|
||||
$showDieOnPrestartBtn = false;
|
||||
$showBuildNationCandidateBtn = false;
|
||||
$availableDieOnPrestart = false;
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
@@ -31,12 +32,16 @@ if ($myset > 0) {
|
||||
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2);
|
||||
if ($gameStor->turntime <= $gameStor->opentime) {
|
||||
//서버 가오픈시 할 수 있는 행동
|
||||
if ($me->getNPCType() == 0) {
|
||||
$showDieImmediatelyBtn = true;
|
||||
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
|
||||
$showDieOnPrestartBtn = true;
|
||||
if ($targetTime <= TimeUtil::now()) {
|
||||
$availableDieImmediately = true;
|
||||
$availableDieOnPrestart = true;
|
||||
}
|
||||
}
|
||||
|
||||
if($me->getNationID() == 0){
|
||||
$showBuildNationCandidateBtn = true;
|
||||
}
|
||||
}
|
||||
|
||||
$use_treatment = $me->getAuxVar('use_treatment') ?? 10;
|
||||
@@ -50,12 +55,22 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=500" />
|
||||
<title><?= UniqueConst::$serverName ?>: 내정보</title>
|
||||
<script>
|
||||
var availableDieImmediately = <?= $availableDieImmediately ? 'true' : 'false' ?>;
|
||||
</script>
|
||||
<?= WebUtil::printStaticValues([
|
||||
'availableDieOnPrestart' => $availableDieOnPrestart,
|
||||
'staticValues' => [
|
||||
'items' => Util::mapWithKey(fn (string $key, BaseItem $item) => [
|
||||
'name' => $item->getName(),
|
||||
'rawName' => $item->getRawName(),
|
||||
'className' => $item->getRawClassName(),
|
||||
'cost' => $item->getCost(),
|
||||
'isBuyable' => $item->isBuyable(),
|
||||
], $me->getItems())
|
||||
]
|
||||
]) ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['myPage']) ?>
|
||||
</head>
|
||||
|
||||
@@ -72,8 +87,8 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
</div>
|
||||
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="row">
|
||||
<div class="col" style='padding-left:4ch;'>
|
||||
<div class="row mx-0 gx-0">
|
||||
<div class="col" style='padding-left:2ch;'>
|
||||
토너먼트 【
|
||||
<input type=radio class='tnmt' name=tnmt value=0 <?= $me->getVar('tnmt') == 0 ? "checked" : ""; ?>>수동참여
|
||||
<input type=radio class='tnmt' name=tnmt value=1 <?= $me->getVar('tnmt') == 1 ? "checked" : ""; ?>>자동참여
|
||||
@@ -94,14 +109,14 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<option value=0 <?= (!$use_auto_nation_turn) ? "selected" : ""; ?>>허용 안함</option>
|
||||
</select>】<br>
|
||||
∞<span style='color:orange'>수뇌가 되었을 때 휴식 턴이어도 적당한 턴을 알아서 넣는 것을 허용합니다.</span><br><br>
|
||||
<?php else: ?>
|
||||
<input type="hidden" id='use_auto_nation_turn' name='use_auto_nation_turn' value="1"/>
|
||||
<?php else : ?>
|
||||
<input type="hidden" id='use_auto_nation_turn' name='use_auto_nation_turn' value="1" />
|
||||
<?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>
|
||||
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련 -3, 사기 -6]</option>
|
||||
</select>
|
||||
】<br><br>
|
||||
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
|
||||
@@ -113,9 +128,14 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<!--빙의 해제용 삭턴 조절<br>
|
||||
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>-->
|
||||
|
||||
<?php if ($showDieImmediatelyBtn) : ?>
|
||||
<?php if ($showDieOnPrestartBtn) : ?>
|
||||
가오픈 기간 내 장수 삭제 (<?= 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:14px;>장수 삭제</button></a><br><br>
|
||||
<button type="button" id='dieOnPrestart' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button><br><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($showBuildNationCandidateBtn) : ?>
|
||||
서버 개시 이전 거병(2턴부터 건국 가능)<br>
|
||||
<button type="button" id='buildNationCandidate' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>사전 거병</button><br><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
|
||||
@@ -138,6 +158,18 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">아이템 파기</div>
|
||||
|
||||
</div>
|
||||
<div class="row mx-1">
|
||||
<div class="btn-group" role="group">
|
||||
<?php foreach ($me->getItems() as $itemKey => $item) : ?>
|
||||
<button type="button" data-item-type='<?=$itemKey?>' class="drop-item-btn btn btn-primary <?= $item->getName() == '-' ? 'disabled' : '' ?>"><?= $item->getName() ?></button>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
|
||||
개인용 CSS<br>
|
||||
|
||||
+141
-137
@@ -15,8 +15,10 @@ increaseRefresh("토너먼트", 1);
|
||||
TurnExecutionHelper::executeAllCommand();
|
||||
|
||||
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
||||
$turnTerm = $admin['turnterm'];
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
@@ -25,34 +27,76 @@ if ($con >= 2) {
|
||||
}
|
||||
|
||||
switch ($admin['tnmt_type']) {
|
||||
default:
|
||||
throw new \RuntimeException('invalid tnmt_type');
|
||||
case 0:
|
||||
$tnmt_type = "<font color=cyan>전력전</font>";
|
||||
case convertTournamentType('전력전'):
|
||||
$tnmt_type = "전력전";
|
||||
$color = 'cyan';
|
||||
$tp = "total";
|
||||
$tp2 = "종합";
|
||||
$tp3 = "total";
|
||||
break;
|
||||
case 1:
|
||||
$tnmt_type = "<font color=cyan>통솔전</font>";
|
||||
case convertTournamentType('통솔전'):
|
||||
$tnmt_type = "통솔전";
|
||||
$color = 'cyan';
|
||||
$tp = "leadership";
|
||||
$tp2 = "통솔";
|
||||
$tp3 = "leadership";
|
||||
break;
|
||||
case 2:
|
||||
$tnmt_type = "<font color=cyan>일기토</font>";
|
||||
case convertTournamentType('일기토'):
|
||||
$tnmt_type = "일기토";
|
||||
$color = 'cyan';
|
||||
$tp = "strength";
|
||||
$tp2 = "무력";
|
||||
$tp3 = "strength";
|
||||
break;
|
||||
case 3:
|
||||
$tnmt_type = "<font color=cyan>설전</font>";
|
||||
case convertTournamentType('설전'):
|
||||
$tnmt_type = "설전";
|
||||
$color = 'cyan';
|
||||
$tp = "intel";
|
||||
$tp2 = "지력";
|
||||
$tp3 = "intel";
|
||||
break;
|
||||
default:
|
||||
throw new \RuntimeException('invalid tnmt_type');
|
||||
}
|
||||
|
||||
|
||||
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||
if ($bettingID != 0) {
|
||||
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||
$info = $betting->getInfo();
|
||||
} else {
|
||||
$info = getDummyBettingInfo($tnmt_type);
|
||||
}
|
||||
|
||||
$myBet = [];
|
||||
$globalBet = [];
|
||||
|
||||
if ($bettingID != 0) {
|
||||
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||
$info = $betting->getInfo();
|
||||
|
||||
foreach ($db->queryAllLists(
|
||||
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
|
||||
$bettingID
|
||||
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
|
||||
$bettingKey = Json::decode($bettingTypeKey)[0];
|
||||
if ($betGeneralID == $generalID) {
|
||||
$myBet[$bettingKey] = $amount;
|
||||
}
|
||||
|
||||
if (key_exists($bettingKey, $globalBet)) {
|
||||
$globalBet[$bettingKey] += $amount;
|
||||
} else {
|
||||
$globalBet[$bettingKey] = $amount;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$info = getDummyBettingInfo($tnmt_type);
|
||||
}
|
||||
|
||||
$myBetTotal = array_sum($myBet);
|
||||
$globalBetTotal = array_sum($globalBet);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -66,6 +110,7 @@ switch ($admin['tnmt_type']) {
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<title><?= UniqueConst::$serverName ?>: 토너먼트</title>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', 'common', true) ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
</head>
|
||||
@@ -77,128 +122,80 @@ switch ($admin['tnmt_type']) {
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center class='tb_layout bg0'>
|
||||
<?php
|
||||
if ($session->userGrade >= 5) {
|
||||
$sel = [];
|
||||
echo "
|
||||
<form method=post action=c_tournament.php>
|
||||
<tr><td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td></tr>
|
||||
<tr><td colspan=8>
|
||||
<input type=button value='갱신' onclick='location.reload()'>";
|
||||
<?php if ($session->userGrade >= 5) : ?>
|
||||
<form method=post action=c_tournament.php>
|
||||
<tr>
|
||||
<td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=8>
|
||||
<button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button>
|
||||
<?php if ($admin['tournament'] == 0) : ?>
|
||||
<select name=auto size=1 style=color:white;background-color:black;>
|
||||
<option style=color:white; value=0 <?= !$admin['tnmt_trig'] ? 'selected' : '' ?>>수동진행</option>
|
||||
<option style=color:white; value=1 <?= $admin['tnmt_trig'] ? 'selected' : '' ?>>자동진행</option>
|
||||
</select>
|
||||
<input type=submit name=btn value='자동개최설정'>
|
||||
<?php else : ?>
|
||||
<input type=submit name=btn value='중단' onclick='return confirm("진짜 중단하시겠습니까?")'>
|
||||
<?php endif; ?>
|
||||
|
||||
switch ($admin['tnmt_trig']) {
|
||||
case 0:
|
||||
$sel[0] = "selected";
|
||||
break;
|
||||
case 1:
|
||||
$sel[1] = "selected";
|
||||
break;
|
||||
case 2:
|
||||
$sel[2] = "selected";
|
||||
break;
|
||||
case 3:
|
||||
$sel[3] = "selected";
|
||||
break;
|
||||
case 4:
|
||||
$sel[4] = "selected";
|
||||
break;
|
||||
case 5:
|
||||
$sel[5] = "selected";
|
||||
break;
|
||||
case 6:
|
||||
$sel[6] = "selected";
|
||||
break;
|
||||
case 7:
|
||||
$sel[7] = "selected";
|
||||
break;
|
||||
}
|
||||
|
||||
if ($admin['tournament'] == 0) {
|
||||
?>
|
||||
<select name=auto size=1 style=color:white;background-color:black;>
|
||||
<option style=color:white; value=0>수동진행</option>
|
||||
<option style=color:white; value=1>12분 05일</option>
|
||||
<option style=color:white; value=2>07분 10시</option>
|
||||
<option style=color:white; value=3>03분 04시</option>
|
||||
<option style=color:white; value=4>01분 82분</option>
|
||||
<option style=color:white; value=5>30초 41분</option>
|
||||
<option style=color:white; value=6>15초 21분</option>
|
||||
<option style=color:white; value=7>05초 07분</option>
|
||||
</select>
|
||||
<select name=type size=1 style=color:white;background-color:black;>
|
||||
<option style=color:white; value=0>전력전</option>
|
||||
<option style=color:white; value=1>통솔전</option>
|
||||
<option style=color:white; value=2>일기토</option>
|
||||
<option style=color:white; value=3>설전</option>
|
||||
</select>
|
||||
<input type=submit name=btn value='개최'>
|
||||
<select name=trig size=1 style=color:white;background-color:black;>
|
||||
<option style=color:white; value=0 <?= $sel[0] ?? '' ?>>수동진행</option>
|
||||
<option style=color:white; value=1 <?= $sel[1] ?? '' ?>>12분 05일</option>
|
||||
<option style=color:white; value=2 <?= $sel[2] ?? '' ?>>07분 10시</option>
|
||||
<option style=color:white; value=3 <?= $sel[3] ?? '' ?>>03분 04시</option>
|
||||
<option style=color:white; value=4 <?= $sel[4] ?? '' ?>>01분 82분</option>
|
||||
<option style=color:white; value=5 <?= $sel[5] ?? '' ?>>30초 41분</option>
|
||||
<option style=color:white; value=6 <?= $sel[6] ?? '' ?>>15초 21분</option>
|
||||
<option style=color:white; value=7 <?= $sel[7] ?? '' ?>>05초 07분</option>
|
||||
</select>
|
||||
<input type=submit name=btn value='자동개최설정'>
|
||||
<input type=submit name=btn value='포상'>
|
||||
<input type=submit name=btn value='회수'>
|
||||
<?php
|
||||
} else {
|
||||
echo "<input type=submit name=btn value='중단' onclick='return confirm(\"진짜 중단하시겠습니까?\")'>";
|
||||
}
|
||||
<?php switch ($admin['tournament']) {
|
||||
case 1:
|
||||
echo "<input type=submit name=btn value='랜덤투입'>";
|
||||
echo "<input type=submit name=btn value='랜덤전부투입'>";
|
||||
break;
|
||||
case 2:
|
||||
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
|
||||
break;
|
||||
case 3:
|
||||
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
|
||||
break;
|
||||
case 4:
|
||||
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
|
||||
break;
|
||||
case 5:
|
||||
echo "<input type=submit name=btn value='배정'>";
|
||||
break;
|
||||
case 6:
|
||||
echo "<input type=submit name=btn value='베팅마감'>";
|
||||
break;
|
||||
case 7:
|
||||
echo "<input type=submit name=btn value='16강'>";
|
||||
break;
|
||||
case 8:
|
||||
echo "<input type=submit name=btn value='8강'>";
|
||||
break;
|
||||
case 9:
|
||||
echo "<input type=submit name=btn value='4강'>";
|
||||
break;
|
||||
case 10:
|
||||
echo "<input type=submit name=btn value='결승'>";
|
||||
break;
|
||||
} ?>
|
||||
|
||||
switch ($admin['tournament']) {
|
||||
case 1:
|
||||
echo "<input type=submit name=btn value='랜덤투입'>";
|
||||
echo "<input type=submit name=btn value='랜덤전부투입'>";
|
||||
break;
|
||||
case 2:
|
||||
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
|
||||
break;
|
||||
case 3:
|
||||
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
|
||||
break;
|
||||
case 4:
|
||||
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
|
||||
break;
|
||||
case 5:
|
||||
echo "<input type=submit name=btn value='배정'>";
|
||||
break;
|
||||
case 6:
|
||||
echo "<input type=submit name=btn value='베팅마감'>";
|
||||
break;
|
||||
case 7:
|
||||
echo "<input type=submit name=btn value='16강'>";
|
||||
break;
|
||||
case 8:
|
||||
echo "<input type=submit name=btn value='8강'>";
|
||||
break;
|
||||
case 9:
|
||||
echo "<input type=submit name=btn value='4강'>";
|
||||
break;
|
||||
case 10:
|
||||
echo "<input type=submit name=btn value='결승'>";
|
||||
break;
|
||||
}
|
||||
|
||||
echo "
|
||||
</td></tr>
|
||||
</form>";
|
||||
} elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) {
|
||||
echo "<form method=post action=c_tournament.php><tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'><input type=submit name=btn value='참가' onclick='return confirm(\"참가비 금{$admin['develcost']}이 필요합니다. 참가하시겠습니까?\")'></td></tr></form>";
|
||||
} else {
|
||||
echo "<tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'></td></tr>";
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
<?php elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
|
||||
<form method=post action=c_tournament.php>
|
||||
<tr>
|
||||
<td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button><button type="submit" class="btn btn-sammo-base2" onclick='return confirm("참가비 금<?= $admin['develcost'] ?>이 필요합니다. 참가하시겠습니까?")'>참가</button><input type='hidden' name='btn' value='참가'/></td>
|
||||
</tr>
|
||||
</form>
|
||||
<?php else : ?>
|
||||
<tr>
|
||||
<td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
|
||||
</tr>
|
||||
<?php endif;
|
||||
|
||||
$str1 = getTournament($admin['tournament']);
|
||||
$str2 = getTournamentTime();
|
||||
if ($str2) {
|
||||
$str2 = ', ' . $str2;
|
||||
}
|
||||
$str3 = getTournamentTermText();
|
||||
$str3 = getTournamentTermText($turnTerm);
|
||||
if ($str3) {
|
||||
$str3 = ', ' . $str3;
|
||||
}
|
||||
@@ -209,7 +206,7 @@ switch ($admin['tnmt_type']) {
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=8 align=center>
|
||||
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -418,24 +415,31 @@ switch ($admin['tnmt_type']) {
|
||||
|
||||
echo "
|
||||
</tr>";
|
||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0') ?? [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,];
|
||||
$globalBet = array_splice($globalBet, -16);
|
||||
$globalBetTotal = array_sum($globalBet);
|
||||
$admin = $gameStor->getValues(['tournament', 'phase']);
|
||||
$bet = [];
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
if ($globalBet[$i] == 0) {
|
||||
$bet[$i] = '∞';
|
||||
continue;
|
||||
$gold = [];
|
||||
$keyMap = [];
|
||||
foreach ($info->candidates as $key => $candidate) {
|
||||
$keyMap[$candidate->aux['idx']] = $key;
|
||||
}
|
||||
|
||||
foreach ($globalBet as $key => $amount) {
|
||||
if ($amount == 0) {
|
||||
$bet[$key] = "∞";
|
||||
$gold[$key] = 0;
|
||||
} else {
|
||||
$rewardRatio = round($globalBetTotal / $amount, 2);
|
||||
$bet[$key] = $rewardRatio;
|
||||
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
|
||||
}
|
||||
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
|
||||
}
|
||||
|
||||
echo "
|
||||
<tr align=center>";
|
||||
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
echo "<td><font color=skyblue>{$bet[$i]}</font></td>";
|
||||
foreach (range(0, 15) as $i) {
|
||||
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
|
||||
echo "<td><font color=skyblue>{$amount}</font></td>";
|
||||
}
|
||||
|
||||
echo "
|
||||
@@ -469,7 +473,7 @@ switch ($admin['tnmt_type']) {
|
||||
printRow($k, $general['npc'], $general['name'], $general[$tp], $general['game'], $general['win'], $general['draw'], $general['lose'], $general['gd'], $general['gl'], $general['prmt']);
|
||||
}
|
||||
foreach (Util::range(count($generalList), 4) as $idx) {
|
||||
printRow($idx, '', '', '', '', '', '', '', '', '', '');
|
||||
printRow($idx, 0, '', '', '', '', '', '', '', '', '');
|
||||
}
|
||||
echo "
|
||||
</table>
|
||||
@@ -496,7 +500,7 @@ switch ($admin['tnmt_type']) {
|
||||
printRow($k, $general['npc'], $general['name'], $general[$tp], $general['game'], $general['win'], $general['draw'], $general['lose'], $general['gd'], $general['gl'], $general['prmt']);
|
||||
}
|
||||
foreach (Util::range(count($generalList), 8) as $idx) {
|
||||
printRow($idx, '', '', '', '', '', '', '', '', '', '');
|
||||
printRow($idx, 0, '', '', '', '', '', '', '', '', '');
|
||||
}
|
||||
echo "
|
||||
</table>
|
||||
|
||||
-230
@@ -1,230 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
increaseRefresh("부대편성", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,troop FROM general WHERE owner=%i', $userID);
|
||||
|
||||
$troops = [];
|
||||
foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) {
|
||||
$troops[$rawTroop['troop_leader']] = [
|
||||
'name' => $rawTroop['name'],
|
||||
'users' => []
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($db->query(
|
||||
'SELECT no,name,turntime,troop,city FROM general WHERE troop!=0 AND nation = %i ORDER BY turntime ASC',
|
||||
$me['nation']
|
||||
) as $general) {
|
||||
if (!key_exists($general['troop'], $troops)) {
|
||||
trigger_error("올바르지 않은 부대 소속 {$general['no']}, {$general['name']} : {$general['troop']}");
|
||||
continue;
|
||||
}
|
||||
|
||||
$general['cityText'] = CityConst::byID($general['city'])->name;
|
||||
|
||||
$troops[$general['troop']]['users'][] = $general;
|
||||
}
|
||||
|
||||
if ($troops) {
|
||||
$troopLeaders = $db->query(
|
||||
'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li',
|
||||
array_keys($troops)
|
||||
);
|
||||
$generalTurnList = [];
|
||||
|
||||
foreach ($db->queryAllLists(
|
||||
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
|
||||
array_column($troopLeaders, 'no')
|
||||
) as [$generalID, $turnIdx, $brief]) {
|
||||
if (!key_exists($generalID, $generalTurnList)) {
|
||||
$generalTurnList[$generalID] = [];
|
||||
}
|
||||
$generalTurnList[$generalID][$turnIdx] = $brief;
|
||||
}
|
||||
|
||||
foreach ($troopLeaders as $troopLeader) {
|
||||
$imageTemp = GetImageURL($troopLeader['imgsvr']);
|
||||
|
||||
$troopLeader['pictureFullPath'] = "$imageTemp/{$troopLeader['picture']}";
|
||||
$troopLeader['cityText'] = CityConst::byID($troopLeader['city'])->name;
|
||||
|
||||
$turnText = [];
|
||||
foreach ($generalTurnList[$troopLeader['no']] as $rawTurnIdx => $brief) {
|
||||
if ($brief != '집합') {
|
||||
$brief = '~';
|
||||
}
|
||||
$turnIdx = $rawTurnIdx + 1;
|
||||
$turnText[] = "{$turnIdx} : {$brief}";
|
||||
}
|
||||
$troopLeader['turnText'] = join('<br>', $turnText);
|
||||
$troops[$troopLeader['troop']]['leader'] = $troopLeader;
|
||||
}
|
||||
}
|
||||
|
||||
uasort($troops, function ($lhs, $rhs) {
|
||||
return $lhs['leader']['turntime'] <=> $rhs['leader']['turntime'];
|
||||
})
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<title><?= UniqueConst::$serverName ?>: 부대편성</title>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printDist('ts', ['common', 'troop'], true) ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div style="width:1000px;margin:auto;">
|
||||
<table width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>부 대 편 성<br><?= backButton() ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table id="troop_list" class='tb_layout bg0'>
|
||||
<thead>
|
||||
<tr>
|
||||
<td width=64 class='bg1 center'>선 택</td>
|
||||
<td width=130 class='bg1 center'>부 대 정 보</td>
|
||||
<td width=100 class='bg1 center'>부 대 장</td>
|
||||
<td width=576 class='bg1 center' style=table-layout:fixed;word-break:break-all;>장 수</td>
|
||||
<td width=130 class='bg1 center' style=table-layout:fixed;word-break:break-all;>부대장행동</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='5'>
|
||||
<?php if (!$troops) : ?>
|
||||
<?php elseif ($me['troop'] == 0) : ?>
|
||||
<input type=button id='btnJoinTroop' value='부 대 가 입'>
|
||||
<?php else : ?>
|
||||
<input type=button id="btnLeaveTroop" value='부 대 탈 퇴'>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach ($troops as $troopNo => $troop) {
|
||||
$troopLeader = $troop['leader'];
|
||||
$genlistText = [];
|
||||
$cityText = $troopLeader['cityText'];
|
||||
$cityID = $troopLeader['city'];
|
||||
$leaderID = $troopLeader['no'];
|
||||
|
||||
foreach ($troop['users'] as $troopUser) {
|
||||
$spanClass = 'troopUser';
|
||||
if ($troopUser['city'] !== $cityID) {
|
||||
$spanClass .= ' diffCity';
|
||||
}
|
||||
if ($troopUser['no'] == $leaderID) {
|
||||
$spanClass .= ' leader';
|
||||
}
|
||||
$genlistText[] = "<span class='$spanClass' data-general-id='{$troopUser['no']}'
|
||||
><span class='generalName'>{$troopUser['name']}</span><span class='cityText'>【{$troopUser['cityText']}】</span
|
||||
></span>";
|
||||
}
|
||||
|
||||
$genlistText = sprintf('%s (%d명)', join(', ', $genlistText), count($genlistText)); ?>
|
||||
|
||||
<?php if ($me['troop'] == 0) : ?>
|
||||
<tr>
|
||||
<td align=center rowspan=2><input type='radio' class='troopId' name='troop' value='<?= $troopNo ?>'></td>
|
||||
<td align=center><?= $troop['name'] ?><br>【 <?= $cityText ?> 】</td>
|
||||
<td height=64 class='generalIcon' style='background:no-repeat center url("<?= $troopLeader['pictureFullPath'] ?>");background-size:64px;'> </td>
|
||||
<td rowspan=2 width=62><?= $genlistText ?></td>
|
||||
<td rowspan=2><?= $troopLeader['turnText'] ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>
|
||||
<font size=2>【턴】 <?= substr($troopLeader['turntime'], 14, 5) ?></font>
|
||||
</td>
|
||||
<td align=center>
|
||||
<font size=1><?= $troopLeader['name'] ?></font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=5>
|
||||
|
||||
<?php else : ?>
|
||||
<tr>
|
||||
<td align=center rowspan=2> </td>
|
||||
<td align=center><?= $troop['name'] ?><br>【 <?= $cityText ?> 】</td>
|
||||
<td height=64 class='generalIcon' style='background:no-repeat center url("<?= $troopLeader['pictureFullPath'] ?>");background-size:64px;'> </td>
|
||||
<td rowspan=2 width=62><?= $genlistText ?></td>
|
||||
<td rowspan=2>
|
||||
<?php if ($me['no'] == $troopLeader['no']) : ?>
|
||||
<select id='genNo' name=gen size=3 style=color:white;background-color:black;font-size:14px;width:128px;>";
|
||||
<?php foreach ($troop['users'] as $troopUser) : ?>
|
||||
<?php if ($troopUser['no'] == $me['no']) {
|
||||
continue;
|
||||
} ?>
|
||||
<option value='<?= $troopUser['no'] ?>'><?= $troopUser['name'] ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select><br>
|
||||
<input type=button id='btnKickTroop' value='부 대 추 방' style=width:130px;height:25px;>
|
||||
<?php else : ?>
|
||||
<?= $troopLeader['turnText'] ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center>
|
||||
<font size=2>【턴】 <?= substr($troopLeader['turntime'], 14, 5) ?></font>
|
||||
</td>
|
||||
<td align=center>
|
||||
<font size=1><?= $troopLeader['name'] ?></font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=5></td>
|
||||
</tr>
|
||||
<?php endif;
|
||||
} //foreach ($troops as $troopNo=>$troop) {
|
||||
?>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
<br>
|
||||
<table width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td width=80 class='bg1'>부 대 명</td>
|
||||
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=18 id='nameplate'></td>
|
||||
<?php if ($me['troop'] == 0) : ?>
|
||||
<td><input type=button id='btnCreateTroop' value='부 대 창 설'></td>
|
||||
<?php else : ?>
|
||||
<td><input type=button id='btnChangeTroopName' value='부 대 변 경'></td>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td><?= backButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -54,6 +54,7 @@ if ($nationID) {
|
||||
var city = <?= Json::encode($city) ?>;
|
||||
var nation = <?= Json::encode($nation) ?>;
|
||||
</script>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'battle_simulator']) ?>
|
||||
</head>
|
||||
|
||||
|
||||
@@ -1,247 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$v = new Validator($_POST + $_GET);
|
||||
$v->rule('integer', [
|
||||
'amount',
|
||||
'cost',
|
||||
'topv',
|
||||
'value',
|
||||
'term',
|
||||
'sel'
|
||||
]);
|
||||
|
||||
$btn = Util::getPost('btn');
|
||||
$amount = Util::getPost('amount', 'int');
|
||||
$cost = Util::getPost('cost', 'int');
|
||||
$topv = Util::getPost('topv', 'int');
|
||||
$value = Util::getPost('value', 'int');
|
||||
$term = Util::getPost('term', 'int');
|
||||
$sel = Util::getPost('sel', 'int');
|
||||
|
||||
$msg = '';
|
||||
$msg2 = '';
|
||||
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("입찰", 1);
|
||||
|
||||
$turnterm = $gameStor->turnterm;
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,name,gold,rice,special from general where owner=%i', $userID);
|
||||
|
||||
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
|
||||
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no2=%i', $me['no']);
|
||||
|
||||
$btCount = $tradeCount + $bidCount;
|
||||
|
||||
$unit = $turnterm * 60;
|
||||
|
||||
$amount = Util::round($amount, -1);
|
||||
$cost = Util::round($cost, -1);
|
||||
$topv = Util::round($topv, -1);
|
||||
$value = Util::round($value, -1);
|
||||
if ($term > 24) {
|
||||
$term = 24;
|
||||
}
|
||||
|
||||
$valid = 1;
|
||||
if ($session->userGrade >= 5 || $btCount < 1) {
|
||||
} else {
|
||||
$msg = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
|
||||
$msg2 = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
$btn = "hidden";
|
||||
}
|
||||
|
||||
if ($btn == "판매") {
|
||||
if ($term < 0 || $term > 24) {
|
||||
$msg = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount < 100 || $amount > 10000) {
|
||||
$msg = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $amount * 2 || $cost * 2 < $amount) {
|
||||
$msg = "ㆍ<span class='ev_warning'>시작판매가는 50% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv * 10 < $amount * 11 || $topv > $amount * 2) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 110% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv * 10 < $cost * 11) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 시작판매가의 110% 이상이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount > $me['rice'] - GameConst::$defaultRice) {
|
||||
$msg = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg = "ㆍ<span class='ev_success'>등록 성공.</span>";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
$db->insert('auction', [
|
||||
'type'=>0,
|
||||
'no1'=>$me['no'],
|
||||
'name1'=>$me['name'],
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
}
|
||||
} elseif ($btn == "구매시도") {
|
||||
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
|
||||
|
||||
if ($value == $auction['topv']) {
|
||||
$valid = 2;
|
||||
}
|
||||
if (!$auction) {
|
||||
$msg = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($auction['no2'] > 0 && $value <= $auction['value']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value < $auction['value']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $auction['topv']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가보다 높을 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $me['gold'] - GameConst::$defaultGold) {
|
||||
$msg = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
if ($auction['expire'] > $date) {
|
||||
$date = $auction['expire'];
|
||||
}
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
} elseif ($valid == 2) {
|
||||
$msg = "ㆍ<span class='ev_success'>즉시판매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
}
|
||||
} elseif ($btn == "구매") {
|
||||
if ($term < 0 || $term > 24) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount < 100 || $amount > 10000) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $amount * 2 || $cost * 2 < $amount) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>시작구매가는 50% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv < $amount * 0.5 || $topv > $amount * 0.9) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 50% ~ 90% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv > $cost * 0.9) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 시작구매가의 90% 이하이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $me['gold'] - GameConst::$defaultGold) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>등록 성공.</span>";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
|
||||
$db->insert('auction', [
|
||||
'type'=>1,
|
||||
'no1'=>$me['no'],
|
||||
'name1'=>$me['name'],
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
}
|
||||
} elseif ($btn == "판매시도") {
|
||||
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
|
||||
|
||||
if ($value == $auction['topv']) {
|
||||
$valid = 2;
|
||||
}
|
||||
if (!$auction) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($auction['no2'] > 0 && $value >= $auction['value']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $auction['value']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value < $auction['topv']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가보다 낮을 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $me['rice'] - GameConst::$defaultRice) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
if ($auction['expire'] > $date) {
|
||||
$date = $auction['expire'];
|
||||
}
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
} elseif ($valid == 2) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>즉시구매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
}
|
||||
}
|
||||
|
||||
Submit("b_auction.php", $msg, $msg2);
|
||||
@@ -98,8 +98,8 @@ if($btn == '참가') {
|
||||
], 'no=%i', $general['no']);
|
||||
}
|
||||
|
||||
$grpCount = $db->queryFirstField('SELECT count(*) FROM tournament where grp<10 GROUP BY grp HAVING count(*)=8');
|
||||
if($grpCount >= 8) {
|
||||
$grpCount = $db->queryFirstColumn('SELECT count(grp) FROM tournament where grp<10 GROUP BY grp;');
|
||||
if(min($grpCount) >= 8) {
|
||||
$gameStor->tournament = 2;
|
||||
$gameStor->phase = 0;
|
||||
}
|
||||
@@ -113,11 +113,11 @@ if($session->userGrade < 5) {
|
||||
}
|
||||
|
||||
if($btn == "자동개최설정") {
|
||||
$gameStor->tnmt_trig = $trig;
|
||||
$gameStor->tnmt_trig = !!$trig;
|
||||
} elseif($btn == "개최") {
|
||||
startTournament($auto, $type);
|
||||
} elseif($btn == "중단") {
|
||||
$gameStor->tnmt_auto = 0;
|
||||
$gameStor->tnmt_auto = false;
|
||||
$gameStor->tournament = 0;
|
||||
$gameStor->phase = 0;
|
||||
} elseif($btn == "랜덤투입") {
|
||||
@@ -225,6 +225,8 @@ if($btn == "자동개최설정") {
|
||||
finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
|
||||
} elseif($btn == "배정") {
|
||||
final16set();
|
||||
$phase = 0;
|
||||
startBetting($admin['tnmt_type'], 720);
|
||||
} elseif($btn == "베팅마감") {
|
||||
$dt = date("Y-m-d H:i:s", time() + 60);
|
||||
$gameStor->tournament=7;
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$btn = Util::getPost('btn');
|
||||
$sel = Util::getPost('sel', 'int');
|
||||
$comment = Util::getPost('comment');
|
||||
$title = Util::getPost('title');
|
||||
$str = Util::getPost('str');
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$isVoteAdmin = in_array('vote', $session->acl[DB::prefix()]??[]);
|
||||
$isVoteAdmin = $isVoteAdmin || $session->userGrade >= 5;
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['develcost', 'cost', 'vote_title', 'vote', 'votecomment']);
|
||||
|
||||
$generalID = Session::getGeneralID();
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc','imgsvr','picture','aux'], 2);
|
||||
|
||||
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
|
||||
$develcost = $admin['develcost'] * 5;
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold + %i', $develcost),
|
||||
'vote'=>$sel
|
||||
], 'owner=%i', $userID);
|
||||
|
||||
if(tryUniqueItemLottery($general, '설문조사')){
|
||||
$general->applyDB($db);
|
||||
}
|
||||
}
|
||||
else if($btn == "댓글" && trim($comment) != "") {
|
||||
$comment = StringUtil::neutralize($comment);
|
||||
|
||||
$nation = $general->getStaticNation();
|
||||
|
||||
if(!$admin['votecomment']){
|
||||
$admin['votecomment'] = [];
|
||||
}
|
||||
$admin['votecomment'][] = [$nation['name'],$general->getName(),$comment];
|
||||
$gameStor->votecomment = $admin['votecomment'];
|
||||
}
|
||||
|
||||
if(!$isVoteAdmin){
|
||||
header('location:a_vote.php', true, 303);
|
||||
die();
|
||||
}
|
||||
|
||||
|
||||
if($btn == "수정") {
|
||||
if($title != "") {
|
||||
$gameStor->vote_title = WebUtil::htmlPurify($title);
|
||||
}
|
||||
} elseif($btn == "추가") {
|
||||
if($str != "") {
|
||||
if(!$admin['vote']){
|
||||
$admin['vote'] = [];
|
||||
}
|
||||
$admin['vote'][] = WebUtil::htmlPurify($str);
|
||||
$gameStor->vote=$admin['vote'];
|
||||
}
|
||||
} elseif($btn == "리셋") {
|
||||
$gameStor->voteopen=1;
|
||||
$gameStor->vote=['-'];
|
||||
$gameStor->vote_title = '-';
|
||||
$gameStor->votecomment=[];
|
||||
|
||||
$db->update('general', [
|
||||
'vote'=>0
|
||||
], true);
|
||||
} elseif($btn == "알림") {
|
||||
$db->update('general', [
|
||||
'newvote'=>1
|
||||
], 'vote=0');
|
||||
} elseif($btn == "숨김") {
|
||||
$gameStor->voteopen = 0;
|
||||
} elseif($btn == "전체통계만") {
|
||||
$gameStor->voteopen = 1;
|
||||
} elseif($btn == "전부") {
|
||||
$gameStor->voteopen = 2;
|
||||
}
|
||||
|
||||
header('location:a_vote.php', true, 303);
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 582 B |
+4
-6
@@ -1,5 +1,3 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
.world_map {
|
||||
width: 700px;
|
||||
background: black;
|
||||
@@ -69,11 +67,11 @@
|
||||
}
|
||||
|
||||
.map_body .map_toggle_cityname::after {
|
||||
content: "끄기"
|
||||
content: " 끄기"
|
||||
}
|
||||
|
||||
.map_body .map_toggle_cityname.active::after {
|
||||
content: "켜기"
|
||||
content: " 켜기"
|
||||
}
|
||||
|
||||
.map_body .map_toggle_single_tap {
|
||||
@@ -81,11 +79,11 @@
|
||||
}
|
||||
|
||||
.map_body .map_toggle_single_tap::after {
|
||||
content: "끄기"
|
||||
content: " 끄기"
|
||||
}
|
||||
|
||||
.map_body .map_toggle_single_tap.active::after {
|
||||
content: "켜기"
|
||||
content: " 켜기"
|
||||
}
|
||||
|
||||
.world_map .city_tooltip {
|
||||
|
||||
@@ -5,6 +5,7 @@ class UniqueConst{
|
||||
public static $serverID = '_tK_serverID_';
|
||||
public static $serverName = '_tK_serverName_';
|
||||
public static $seasonIdx = '_tK_seasonIdx_';
|
||||
public static $hiddenSeed = '_tK_hiddenSeed_';
|
||||
|
||||
private function __construct(){}
|
||||
|
||||
|
||||
+120
-291
@@ -3,6 +3,10 @@
|
||||
namespace sammo;
|
||||
|
||||
use DateTime;
|
||||
use Ds\Set;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\Enums\RankColumn;
|
||||
use sammo\Event\Action;
|
||||
|
||||
require_once 'process_war.php';
|
||||
@@ -133,11 +137,11 @@ function getBlockLevel()
|
||||
return DB::db()->queryFirstField('select block from general where no = %i', Session::getInstance()->generalID);
|
||||
}
|
||||
|
||||
function getRandGenName()
|
||||
function getRandGenName(RandUtil $rng)
|
||||
{
|
||||
$firstname = Util::choiceRandom(GameConst::$randGenFirstName);
|
||||
$middlename = Util::choiceRandom(GameConst::$randGenMiddleName);
|
||||
$lastname = Util::choiceRandom(GameConst::$randGenLastName);
|
||||
$firstname = $rng->choice(GameConst::$randGenFirstName);
|
||||
$middlename = $rng->choice(GameConst::$randGenMiddleName);
|
||||
$lastname = $rng->choice(GameConst::$randGenLastName);
|
||||
|
||||
return "{$firstname}{$middlename}{$lastname}";
|
||||
}
|
||||
@@ -171,7 +175,7 @@ function cityInfo(General $generalObj)
|
||||
];
|
||||
|
||||
foreach ($db->query('SELECT `officer_level`, `name`, npc, no FROM general WHERE officer_city = %i', $cityID) as $officer) {
|
||||
$officerName[$officer['officer_level']] = getColoredName($officer['name'], $officer['npc']);
|
||||
$officerName[$officer['officer_level']] = formatName($officer['name'], $officer['npc']);
|
||||
}
|
||||
|
||||
$city['officerName'] = $officerName;
|
||||
@@ -199,8 +203,8 @@ function myNationInfo(General $generalObj)
|
||||
|
||||
$topChiefs = Util::convertArrayToDict($db->query('SELECT officer_level, no, name, npc FROM general WHERE nation = %i AND officer_level >= 11', $nationID), 'officer_level');
|
||||
|
||||
$level12Name = key_exists(12, $topChiefs) ? getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']) : '-';
|
||||
$level11Name = key_exists(11, $topChiefs) ? getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']) : '-';
|
||||
$level12Name = key_exists(12, $topChiefs) ? formatName($topChiefs[12]['name'], $topChiefs[12]['npc']) : '-';
|
||||
$level11Name = key_exists(11, $topChiefs) ? formatName($topChiefs[11]['name'], $topChiefs[11]['npc']) : '-';
|
||||
|
||||
$impossibleStrategicCommandLists = [];
|
||||
$strategicCommandLists = GameConst::$availableChiefCommand['전략'];
|
||||
@@ -472,7 +476,8 @@ function getCommandTable(General $general)
|
||||
return $result;
|
||||
}
|
||||
|
||||
function getChiefCommandTable(General $general){
|
||||
function getChiefCommandTable(General $general)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$gameStor->turnOnCache();
|
||||
@@ -756,8 +761,8 @@ function generalInfo2(General $generalObj)
|
||||
{
|
||||
$general = $generalObj->getRaw();
|
||||
|
||||
$winRate = round($generalObj->getRankVar('killnum') / max($generalObj->getRankVar('warnum'), 1) * 100, 2);
|
||||
$killRate = round($generalObj->getRankVar('killcrew') / max($generalObj->getRankVar('deathcrew'), 1) * 100, 2);
|
||||
$winRate = round($generalObj->getRankVar(RankColumn::killnum) / max($generalObj->getRankVar(RankColumn::warnum), 1) * 100, 2);
|
||||
$killRate = round($generalObj->getRankVar(RankColumn::killcrew) / max($generalObj->getRankVar(RankColumn::deathcrew), 1) * 100, 2);
|
||||
|
||||
$experienceBonus = $generalObj->onCalcStat($generalObj, 'experience', 10000) - 10000;
|
||||
if ($experienceBonus > 0) {
|
||||
@@ -821,9 +826,9 @@ function generalInfo2(General $generalObj)
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=64 style='text-align:center;' class='bg1'><b>전투</b></td>
|
||||
<td width=132 style='text-align:center;'>{$generalObj->getRankVar('warnum')}</td>
|
||||
<td width=132 style='text-align:center;'>{$generalObj->getRankVar(RankColumn::warnum)}</td>
|
||||
<td width=48 style='text-align:center;' class='bg1'><b>계략</b></td>
|
||||
<td width=98 style='text-align:center;'>{$generalObj->getRankVar('firenum')}</td>
|
||||
<td width=98 style='text-align:center;'>{$generalObj->getRankVar(RankColumn::firenum)}</td>
|
||||
<td width=48 style='text-align:center;' class='bg1'><b>사관</b></td>
|
||||
<td width=98 style='text-align:center;'>{$general['belong']}년</td>
|
||||
</tr>
|
||||
@@ -831,17 +836,17 @@ function generalInfo2(General $generalObj)
|
||||
<td style='text-align:center;' class='bg1'><b>승률</b></td>
|
||||
<td style='text-align:center;'>{$winRate} %</td>
|
||||
<td style='text-align:center;' class='bg1'><b>승리</b></td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar('killnum')}</td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::killnum)}</td>
|
||||
<td style='text-align:center;' class='bg1'><b>패배</b></td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar('deathnum')}</td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::deathnum)}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style='text-align:center;' class='bg1'><b>살상률</b></td>
|
||||
<td style='text-align:center;'>{$killRate} %</td>
|
||||
<td style='text-align:center;' class='bg1'><b>사살</b></td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar('killcrew')}</td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::killcrew)}</td>
|
||||
<td style='text-align:center;' class='bg1'><b>피살</b></td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar('deathcrew')}</td>
|
||||
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::deathcrew)}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width=498 class='tb_layout bg2 f_tnum'>
|
||||
@@ -879,9 +884,9 @@ function generalInfo2(General $generalObj)
|
||||
</table>";
|
||||
}
|
||||
|
||||
function getOnlineNum()
|
||||
function getOnlineNum(): int
|
||||
{
|
||||
return KVStorage::getStorage(DB::db(), 'game_env')->online;
|
||||
return KVStorage::getStorage(DB::db(), 'game_env')->getValue('online') ?? 0;
|
||||
}
|
||||
|
||||
function onlinegen(General $general)
|
||||
@@ -901,7 +906,7 @@ function nationMsg(General $general)
|
||||
$nationID = $general->getNationID();
|
||||
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||
|
||||
return $nationStor->notice ?? '';
|
||||
return $nationStor->nationNotice['msg'] ?? '';
|
||||
}
|
||||
|
||||
function banner()
|
||||
@@ -1072,6 +1077,7 @@ function updateTraffic()
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh']);
|
||||
/** @var array{year:int,month:int,refresh:int,maxonline:int,maxrefresh:int} $admin */
|
||||
|
||||
//최다갱신자
|
||||
$user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1');
|
||||
@@ -1121,7 +1127,7 @@ function CheckOverhead()
|
||||
|
||||
function isLock()
|
||||
{
|
||||
return DB::db()->queryFirstField("SELECT plock from plock limit 1") != 0;
|
||||
return DB::db()->queryFirstField("SELECT plock from plock WHERE `type`='GAME'") != 0;
|
||||
}
|
||||
|
||||
function tryLock(): bool
|
||||
@@ -1133,7 +1139,7 @@ function tryLock(): bool
|
||||
$db->update('plock', [
|
||||
'plock' => 1,
|
||||
'locktime' => TimeUtil::now(true)
|
||||
], 'plock=0');
|
||||
], 'plock=0 AND type="GAME"');
|
||||
|
||||
return $db->affectedRows() > 0;
|
||||
}
|
||||
@@ -1144,7 +1150,7 @@ function unlock(): bool
|
||||
$db = DB::db();
|
||||
$db->update('plock', [
|
||||
'plock' => 0
|
||||
], true);
|
||||
], 'type="GAME"');
|
||||
|
||||
return $db->affectedRows() > 0;
|
||||
}
|
||||
@@ -1200,9 +1206,9 @@ function checkDelay()
|
||||
$db->update('general', [
|
||||
'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
|
||||
], 'turntime<=DATE_ADD(turntime, INTERVAL %i MINUTE)', $term);
|
||||
$db->update('auction', [
|
||||
'expire' => $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], 'finished = 0');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1243,7 +1249,7 @@ function updateOnline()
|
||||
$gameStor->online_nation = join(', ', $onlineNation);
|
||||
}
|
||||
|
||||
function addAge()
|
||||
function addAge(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
@@ -1264,6 +1270,7 @@ function addAge()
|
||||
foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,aux from general where specage<=age and special=%s', GameConst::$defaultSpecialDomestic) as $general) {
|
||||
$generalID = $general['no'];
|
||||
$special = SpecialityHelper::pickSpecialDomestic(
|
||||
$rng,
|
||||
$general,
|
||||
(Json::decode($general['aux'])['prev_types_special']) ?? []
|
||||
);
|
||||
@@ -1291,6 +1298,7 @@ function addAge()
|
||||
$updateVars['aux'] = Json::encode($generalAux);
|
||||
} else {
|
||||
$special2 = SpecialityHelper::pickSpecialWar(
|
||||
$rng,
|
||||
$general,
|
||||
($generalAux['prev_types_special2']) ?? []
|
||||
);
|
||||
@@ -1339,7 +1347,7 @@ function turnDate($curtime)
|
||||
}
|
||||
|
||||
|
||||
function triggerTournament()
|
||||
function triggerTournament(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
@@ -1350,10 +1358,10 @@ function triggerTournament()
|
||||
if ($tournament != 0) {
|
||||
return;
|
||||
}
|
||||
if ($tnmt_trig == 0) {
|
||||
if (!$tnmt_trig) {
|
||||
return;
|
||||
}
|
||||
if (!Util::randBool(0.4)) {
|
||||
if (!$rng->nextBool(0.4)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1366,7 +1374,7 @@ function triggerTournament()
|
||||
|
||||
$tnmt_type = array_pop($tnmt_pattern);
|
||||
$gameStor->setValue('tnmt_pattern', $tnmt_pattern);
|
||||
startTournament($tnmt_trig, $tnmt_type);
|
||||
startTournament($tnmt_type);
|
||||
}
|
||||
|
||||
function CheckHall($no)
|
||||
@@ -1374,6 +1382,7 @@ function CheckHall($no)
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
//TODO: Enum타입을 두종류로 넣고, raw string이면 calcVar에서 받아오면?
|
||||
$types = [
|
||||
["experience", 'natural'],
|
||||
["dedication", 'natural'],
|
||||
@@ -1403,33 +1412,33 @@ function CheckHall($no)
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($no, null, 2);
|
||||
|
||||
$ttw = $generalObj->getRankVar('ttw');
|
||||
$ttd = $generalObj->getRankVar('ttd');
|
||||
$ttl = $generalObj->getRankVar('ttl');
|
||||
$ttw = $generalObj->getRankVar(RankColumn::ttw);
|
||||
$ttd = $generalObj->getRankVar(RankColumn::ttd);
|
||||
$ttl = $generalObj->getRankVar(RankColumn::ttl);
|
||||
|
||||
$tlw = $generalObj->getRankVar('tlw');
|
||||
$tld = $generalObj->getRankVar('tld');
|
||||
$tll = $generalObj->getRankVar('tll');
|
||||
$tlw = $generalObj->getRankVar(RankColumn::tlw);
|
||||
$tld = $generalObj->getRankVar(RankColumn::tld);
|
||||
$tll = $generalObj->getRankVar(RankColumn::tll);
|
||||
|
||||
$tsw = $generalObj->getRankVar('tsw');
|
||||
$tsd = $generalObj->getRankVar('tsd');
|
||||
$tsl = $generalObj->getRankVar('tsl');
|
||||
$tsw = $generalObj->getRankVar(RankColumn::tsw);
|
||||
$tsd = $generalObj->getRankVar(RankColumn::tsd);
|
||||
$tsl = $generalObj->getRankVar(RankColumn::tsl);
|
||||
|
||||
$tiw = $generalObj->getRankVar('tiw');
|
||||
$tid = $generalObj->getRankVar('tid');
|
||||
$til = $generalObj->getRankVar('til');
|
||||
$tiw = $generalObj->getRankVar(RankColumn::tiw);
|
||||
$tid = $generalObj->getRankVar(RankColumn::tid);
|
||||
$til = $generalObj->getRankVar(RankColumn::til);
|
||||
|
||||
$betWinGold = $generalObj->getRankVar('betwingold');
|
||||
$betGold = Util::valueFit($generalObj->getRankVar('betgold'), 1);
|
||||
$betWinGold = $generalObj->getRankVar(RankColumn::betwingold);
|
||||
$betGold = Util::valueFit($generalObj->getRankVar(RankColumn::betgold), 1);
|
||||
|
||||
$win = $generalObj->getRankVar('killnum');
|
||||
$war = Util::valueFit($generalObj->getRankVar('warnum'), 1);
|
||||
$win = $generalObj->getRankVar(RankColumn::killnum);
|
||||
$war = Util::valueFit($generalObj->getRankVar(RankColumn::warnum), 1);
|
||||
|
||||
$kill = $generalObj->getRankVar('killcrew');
|
||||
$death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1);
|
||||
$kill = $generalObj->getRankVar(RankColumn::killcrew);
|
||||
$death = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew), 1);
|
||||
|
||||
$killPerson = $generalObj->getRankVar('killcrew_person');
|
||||
$deathPerson = Util::valueFit($generalObj->getRankVar('deathcrew_person'), 1);
|
||||
$killPerson = $generalObj->getRankVar(RankColumn::killcrew_person);
|
||||
$deathPerson = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew_person), 1);
|
||||
|
||||
$tt = Util::valueFit($ttw + $ttd + $ttl, 1);
|
||||
$tl = Util::valueFit($tlw + $tld + $tll, 1);
|
||||
@@ -1467,13 +1476,13 @@ function CheckHall($no)
|
||||
if ($valueType === 'natural') {
|
||||
$value = $generalObj->getVar($typeName);
|
||||
} else if ($valueType === 'rank') {
|
||||
$value = $generalObj->getRankVar($typeName);
|
||||
$value = $generalObj->getRankVar(RankColumn::from($typeName));
|
||||
} else if ($valueType === 'calc') {
|
||||
$value = $calcVar[$typeName];
|
||||
}
|
||||
|
||||
//승률,살상률인데 10회 미만 전투시 스킵
|
||||
if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar('warnum') < 10) {
|
||||
if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar(RankColumn::warnum) < 10) {
|
||||
continue;
|
||||
}
|
||||
//토너승률인데 50회 미만시 스킵
|
||||
@@ -1493,7 +1502,7 @@ function CheckHall($no)
|
||||
continue;
|
||||
}
|
||||
//수익률인데 1000미만시 스킵
|
||||
if ($typeName === 'betrate' && $generalObj->getRankVar('betgold') < 1000) {
|
||||
if ($typeName === 'betrate' && $generalObj->getRankVar(RankColumn::betgold) < 1000) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1547,9 +1556,10 @@ function CheckHall($no)
|
||||
}
|
||||
}
|
||||
|
||||
function giveRandomUniqueItem(General $general, string $acquireType): bool
|
||||
function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireType): bool
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
//아이템 습득 상황
|
||||
$availableUnique = [];
|
||||
|
||||
@@ -1581,7 +1591,19 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
||||
}
|
||||
}
|
||||
|
||||
foreach($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]){
|
||||
$auctionItems = $db->queryFirstColumn(
|
||||
'SELECT `target` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0',
|
||||
AuctionType::UniqueItem->value
|
||||
);
|
||||
foreach ($auctionItems as $itemCode) {
|
||||
if (key_exists($itemCode, $occupiedUnique)) {
|
||||
$occupiedUnique[$itemCode]++;
|
||||
} else {
|
||||
$occupiedUnique[$itemCode] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]) {
|
||||
$itemCode = substr($uniqueNS, 3);
|
||||
$itemClass = buildItemClass($itemCode);
|
||||
if (!$itemClass) {
|
||||
@@ -1590,7 +1612,7 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
||||
if ($itemClass->isBuyable()) {
|
||||
continue;
|
||||
}
|
||||
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode]??0) + $cnt;
|
||||
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode] ?? 0) + $cnt;
|
||||
}
|
||||
|
||||
foreach (GameConst::$allItems as $itemType => $itemCategories) {
|
||||
@@ -1616,28 +1638,26 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
||||
if (!$availableUnique) {
|
||||
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||
$general->setAuxVar('inheritRandomUnique', null);
|
||||
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||
$general->increaseInheritancePoint(InheritanceKey::previous, GameConst::$inheritItemRandomPoint);
|
||||
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, -GameConst::$inheritItemRandomPoint);
|
||||
$userLogger = new UserLogger($general->getVar('owner'));
|
||||
$userLogger->push(sprintf("얻을 유니크가 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
[$year, $month, $initYear, $initMonth] = $gameStor->getValuesAsArray(['year', 'month', 'init_year', 'init_month']);
|
||||
|
||||
$relMonthByInit = Util::joinYearMonth($year, $month) - Util::joinYearMonth($initYear, $initMonth);
|
||||
$availableBuyUnique = $relMonthByInit >= GameConst::$minMonthToAllowInheritItem;
|
||||
|
||||
if($availableBuyUnique){
|
||||
if ($availableBuyUnique) {
|
||||
$general->setAuxVar('inheritRandomUnique', null);
|
||||
}
|
||||
}
|
||||
|
||||
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
|
||||
[$itemType, $itemCode] = $rng->choiceUsingWeightPair($availableUnique);
|
||||
|
||||
$nationName = $general->getStaticNation()['name'];
|
||||
$generalName = $general->getName();
|
||||
@@ -1660,208 +1680,7 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
||||
return true;
|
||||
}
|
||||
|
||||
function rollbackInheritUniqueTrial(General $general, string $itemKey, string $reason)
|
||||
{
|
||||
|
||||
$ownerID = $general->getVar('owner');
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
|
||||
LogText("선택유니크 롤백:{$ownerID}", [$itemKey, $itemTrials]);
|
||||
unset($itemTrials[$itemKey]);
|
||||
if (count($itemTrials) == 0) {
|
||||
$itemTrials = null;
|
||||
}
|
||||
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
||||
|
||||
|
||||
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||
$ownTrial = $trialStor->getValue("u{$ownerID}");
|
||||
|
||||
$itemObj = buildItemClass($itemKey);
|
||||
$itemName = $itemObj->getName();
|
||||
|
||||
if ($ownTrial) {
|
||||
//두 값이 general, KVStorage 둘다 있고, 이중에선 KVStorage 값을 기준으로 하자 따르자
|
||||
[,, $amount] = $ownTrial;
|
||||
$trialStor->deleteValue("u{$ownerID}");
|
||||
$general->increaseInheritancePoint('previous', $amount);
|
||||
LogText("선택유니크 롤백포인트:{$ownerID}", $amount);
|
||||
|
||||
$userLogger = new UserLogger($ownerID);
|
||||
$userLogger->push("{$itemName} 입찰에 사용한 {$amount} 포인트 반환", "inheritPoint");
|
||||
}
|
||||
|
||||
//메시지
|
||||
|
||||
$staticNation = $general->getStaticNation();
|
||||
|
||||
$unlimited = new \DateTime('9999-12-31');
|
||||
$src = new MessageTarget(0, '', 0, 'System', '#000000');
|
||||
$dest = new MessageTarget($general->getID(), $general->getName(), $general->getNationID(), $staticNation['name'], $staticNation['color'], GetImageURL($general->getVar('imgsvr'), $general->getVar('picture')));
|
||||
$josaUl = JosaUtil::pick($itemName, '을');
|
||||
$msg = new Message(
|
||||
Message::MSGTYPE_PRIVATE,
|
||||
$src,
|
||||
$dest,
|
||||
"{$itemName}{$josaUl} 얻지 못했습니다. {$reason}",
|
||||
new DateTime(),
|
||||
$unlimited,
|
||||
[]
|
||||
);
|
||||
|
||||
$general->applyDB($db);
|
||||
$msg->send(true);
|
||||
}
|
||||
|
||||
function tryRollbackInheritUniqueItem(General $general): void
|
||||
{
|
||||
tryInheritUniqueItem($general, 'Rollback', true);
|
||||
}
|
||||
|
||||
function tryInheritUniqueItem(General $general, string $acquireType = '아이템', bool $justRollback = false): bool
|
||||
{
|
||||
$ownerID = $general->getVar('owner');
|
||||
if (!$ownerID) {
|
||||
LogText("선택유니크 실패???: {$ownerID}", $general->getName());
|
||||
return false;
|
||||
}
|
||||
|
||||
$itemTrials = $general->getAuxVar('inheritUniqueTrial') ?? [];
|
||||
arsort($itemTrials);
|
||||
LogText("선택유니크항목: {$ownerID}", $itemTrials);
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$ownTarget = null;
|
||||
$ownType = null;
|
||||
|
||||
foreach ($itemTrials as $itemKey => $amount) {
|
||||
$availableItemTypes = [];
|
||||
$reasons = [];
|
||||
foreach (GameConst::$allItems as $itemType => $itemList) {
|
||||
//아직은 그런 경우는 없지만 동일 유니크를 여러 부위에 장착할 수 있을지도 모름
|
||||
if (!key_exists($itemKey, $itemList)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$ownItem = $general->getItem($itemType);
|
||||
if ($ownItem->getRawClassName() == $itemKey) {
|
||||
$reasons[] = '이미 그 유니크를 가지고 있습니다.';
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
if (!$ownItem->isBuyable()) {
|
||||
$reasons[] = '이미 다른 유니크를 가지고 있습니다.';
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
|
||||
$availableCnt = $itemList[$itemKey];
|
||||
$occupiedCnt = $db->queryFirstField('SELECT count(*) FROM general WHERE %b = %s', $itemType, $itemKey);
|
||||
if ($occupiedCnt >= $availableCnt) {
|
||||
$reasons[] = '그 유니크는 모두 점유되었습니다.';
|
||||
continue;
|
||||
}
|
||||
$availableItemTypes[] = $itemType;
|
||||
}
|
||||
|
||||
if (!$availableItemTypes) {
|
||||
rollbackInheritUniqueTrial($general, $itemKey, join(' ', $reasons));
|
||||
continue;
|
||||
}
|
||||
$reasons = [];
|
||||
|
||||
$itemType = Util::choiceRandom($availableItemTypes);
|
||||
|
||||
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}"); //혹시 itemKey의 크기가 37이 넘을 수 있을까?
|
||||
$anyTrials = $trialStor->getAll();
|
||||
if (!$anyTrials) {
|
||||
//순서가 꼬였던 모양, 실제 값은 storage를 우선시하자
|
||||
rollbackInheritUniqueTrial($general, $itemKey, '절차상의 오류입니다.');
|
||||
continue;
|
||||
}
|
||||
|
||||
//XXX: 정렬할 필요 없지 않나?
|
||||
usort($anyTrials, function ($lhsTrial, $rhsTrial) {
|
||||
[,, $lhsAmount] = $lhsTrial;
|
||||
[,, $rhsAmount] = $rhsTrial;
|
||||
return $rhsAmount <=> $lhsAmount; //큰 값이 앞에 오도록
|
||||
});
|
||||
|
||||
LogText("선택유니크상태 {$ownerID} {$itemKey}", $anyTrials);
|
||||
|
||||
//공동 1등인데 본인이 있을 수도 있다.
|
||||
[,, $topAmount] = $anyTrials[0];
|
||||
if ($amount < $topAmount) {
|
||||
$compAmount = $topAmount / $amount;
|
||||
if ($compAmount > 2.0) {
|
||||
$compText = '엄청난 차이로 ';
|
||||
} else if ($compAmount > 1.2) {
|
||||
$compText = '큰 차이로 ';
|
||||
} else if ($compAmount > 1.05) {
|
||||
$compText = '';
|
||||
} else {
|
||||
$compText = '아슬아슬한 차이로 ';
|
||||
}
|
||||
rollbackInheritUniqueTrial($general, $itemKey, "{$compText}상위 입찰한 장수가 있습니다.");
|
||||
continue;
|
||||
}
|
||||
|
||||
//내가 1위다
|
||||
if ($ownTarget !== null) {
|
||||
//이미 다른 아이템을 얻기로 되어있다.
|
||||
continue;
|
||||
}
|
||||
$ownTarget = $itemKey;
|
||||
$ownType = $itemType;
|
||||
}
|
||||
unset($itemKey);
|
||||
unset($itemType);
|
||||
|
||||
if ($ownTarget === null) {
|
||||
return false;
|
||||
}
|
||||
if ($justRollback) {
|
||||
return false;
|
||||
}
|
||||
|
||||
LogText("선택유니크획득{$ownerID}", $ownTarget);
|
||||
|
||||
$trialStor = KVStorage::getStorage($db, "ut_{$ownTarget}");
|
||||
$trialStor->deleteValue("u{$ownerID}");
|
||||
|
||||
//rollbackInheritUniqueTrial 과정 때문에 새로 받아와야함
|
||||
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
|
||||
unset($itemTrials[$ownTarget]);
|
||||
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
||||
|
||||
$nationName = $general->getStaticNation()['name'];
|
||||
$generalName = $general->getName();
|
||||
$josaYi = JosaUtil::pick($generalName, '이');
|
||||
$itemObj = buildItemClass($ownTarget);
|
||||
$itemName = $itemObj->getName();
|
||||
$itemRawName = $itemObj->getRawName();
|
||||
$josaUl = JosaUtil::pick($itemRawName, '을');
|
||||
|
||||
|
||||
$general->setVar($ownType, $ownTarget);
|
||||
|
||||
|
||||
$logger = $general->getLogger();
|
||||
|
||||
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 습득했습니다!");
|
||||
$logger->pushGeneralHistoryLog("<C>{$itemName}</>{$josaUl} 습득");
|
||||
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
|
||||
$logger->pushGlobalHistoryLog("<C><b>【{$acquireType}】</b></><D><b>{$nationName}</b></>의 <Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
|
||||
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function tryUniqueItemLottery(General $general, string $acquireType = '아이템'): bool
|
||||
function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireType = '아이템'): bool
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
@@ -1901,22 +1720,14 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
||||
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
|
||||
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||
$general->setAuxVar('inheritRandomUnique', null);
|
||||
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||
$general->increaseInheritancePoint(InheritanceKey::previous, GameConst::$inheritItemRandomPoint);
|
||||
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, -GameConst::$inheritItemRandomPoint);
|
||||
$userLogger = new UserLogger($general->getVar('owner'));
|
||||
$userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||
}
|
||||
tryRollbackInheritUniqueItem($general);
|
||||
return false;
|
||||
}
|
||||
|
||||
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
|
||||
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique) && $availableBuyUnique) {
|
||||
$trialResult = tryInheritUniqueItem($general, $acquireType);
|
||||
if ($trialResult) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$scenario = $gameStor->scenario;
|
||||
$genCount = $db->queryFirstField('SELECT count(*) FROM general WHERE npc<2');
|
||||
|
||||
@@ -1946,7 +1757,7 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
||||
}
|
||||
|
||||
foreach (Util::range($maxCnt) as $_idx) {
|
||||
if (Util::randBool($prob)) {
|
||||
if ($rng->nextBool($prob)) {
|
||||
$result = true;
|
||||
break;
|
||||
}
|
||||
@@ -1958,7 +1769,7 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
||||
}
|
||||
LogText("{$general->getName()}, {$general->getID()} 유니크 성공 {$maxCnt}", $prob);
|
||||
|
||||
return giveRandomUniqueItem($general, $acquireType);
|
||||
return giveRandomUniqueItem($rng, $general, $acquireType);
|
||||
}
|
||||
|
||||
function getAdmin()
|
||||
@@ -2001,7 +1812,7 @@ function deleteNation(General $lord, bool $applyDB): array
|
||||
|
||||
$nation['generals'] = array_keys($nationGeneralList);
|
||||
$nation['aux'] = Json::decode($nation['aux']);
|
||||
$nation['msg'] = $nationStor->notice;
|
||||
$nation['msg'] = $nationStor->nationNotice['msg'] ?? '';
|
||||
$nation['scout_msg'] = $nationStor->scout_msg;
|
||||
$nation['aux'] += $nationStor->max_power;
|
||||
$nation['history'] = getNationHistoryLogAll($nationID);
|
||||
@@ -2013,10 +1824,10 @@ function deleteNation(General $lord, bool $applyDB): array
|
||||
// 전 장수 재야로
|
||||
foreach ($nationGeneralList as $general) {
|
||||
$general->setAuxVar(
|
||||
'max_belong',
|
||||
InheritanceKey::max_belong->value,
|
||||
max(
|
||||
$general->getVar('belong'),
|
||||
$general->getAuxVar('max_belong') ?? 0
|
||||
$general->getAuxVar(InheritanceKey::max_belong->value) ?? 0
|
||||
)
|
||||
);
|
||||
$general->setVar('belong', 0);
|
||||
@@ -2075,13 +1886,31 @@ function nextRuler(General $general)
|
||||
|
||||
//npc or npc유저인 경우 후계 찾기
|
||||
if (!$fiction && $general->getNPCType() > 0) {
|
||||
$candidate = $db->queryFirstRow(
|
||||
'SELECT no,name,officer_level,IF(ABS(affinity-%i)>75,150-ABS(affinity-%i),ABS(affinity-%i)) as npcmatch2 from general where nation=%i and officer_level!=12 and 1 <= npc and npc<=3 order by npcmatch2,rand() LIMIT 1',
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'NextNPCRuler',
|
||||
$year,
|
||||
$month,
|
||||
$general->getID(),
|
||||
)));
|
||||
$rawCandidates = $db->query(
|
||||
'SELECT no,name,officer_level,IF(ABS(affinity-%i)>75,150-ABS(affinity-%i),ABS(affinity-%i)) as npcmatch2 from general where nation=%i and officer_level!=12 and 1 <= npc and npc<=3 order by npcmatch2 asc',
|
||||
$general->getVar('affinity'),
|
||||
$general->getVar('affinity'),
|
||||
$general->getVar('affinity'),
|
||||
$nationID
|
||||
);
|
||||
if ($rawCandidates) {
|
||||
$candidates = [];
|
||||
$minNPCMatch = $rawCandidates[0]['npcmatch2'];
|
||||
foreach ($rawCandidates as $candidate) {
|
||||
if (!$candidate['npcmatch2'] == $minNPCMatch) {
|
||||
break;
|
||||
}
|
||||
$candidates[] = $candidate;
|
||||
}
|
||||
$candidate = $rng->choice($candidates);
|
||||
}
|
||||
}
|
||||
if (!$candidate) {
|
||||
$candidate = $db->queryFirstRow(
|
||||
@@ -2244,7 +2073,7 @@ function calcCityDistance(int $from, int $to, ?array $linkNationList): ?int
|
||||
* @param $from 기준 도시 코드
|
||||
* @param $to 대상 도시 코드
|
||||
* @param $linkNationList 경로에 해당하는 국가 리스트
|
||||
* @return array $dist=>[cityID, $nation] 배열 가장 앞이 가장 가까움
|
||||
* @return array<int,array{int,int}[]> $dist=>[cityID, $nation] 배열 가장 앞이 가장 가까움
|
||||
*/
|
||||
function searchDistanceListToDest(int $from, int $to, array $linkNationList)
|
||||
{
|
||||
@@ -2405,7 +2234,7 @@ function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply = true)
|
||||
return false;
|
||||
}
|
||||
|
||||
function SabotageInjury(array $cityGeneralList, string $reason): int
|
||||
function SabotageInjury(RandUtil $rng, array $cityGeneralList, string $reason): int
|
||||
{
|
||||
$injuryCount = 0;
|
||||
$josaRo = JosaUtil::pick($reason, '로');
|
||||
@@ -2417,12 +2246,12 @@ function SabotageInjury(array $cityGeneralList, string $reason): int
|
||||
/** @var General $general */
|
||||
$injuryProb = 0.3;
|
||||
$injuryProb = $general->onCalcStat($general, 'injuryProb', $injuryProb);
|
||||
if (!Util::randBool($injuryProb)) {
|
||||
if (!$rng->nextBool($injuryProb)) {
|
||||
continue;
|
||||
}
|
||||
$general->getLogger()->pushGeneralActionLog($text);
|
||||
|
||||
$general->increaseVarWithLimit('injury', Util::randRangeInt(1, 16), 0, 80);
|
||||
$general->increaseVarWithLimit('injury', $rng->nextRangeInt(1, 16), 0, 80);
|
||||
$general->multiplyVar('crew', 0.98);
|
||||
$general->multiplyVar('atmos', 0.98);
|
||||
$general->multiplyVar('train', 0.98);
|
||||
@@ -2435,7 +2264,7 @@ function SabotageInjury(array $cityGeneralList, string $reason): int
|
||||
return $injuryCount;
|
||||
}
|
||||
|
||||
function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null)
|
||||
function getRandTurn(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
|
||||
{
|
||||
if ($baseDateTime === null) {
|
||||
$baseDateTime = new \DateTimeImmutable();
|
||||
@@ -2447,13 +2276,13 @@ function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null)
|
||||
throw new MustNotBeReachedException();
|
||||
}
|
||||
|
||||
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
||||
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
|
||||
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||
|
||||
return TimeUtil::format($baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction)), true);
|
||||
}
|
||||
|
||||
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
|
||||
function getRandTurn2(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
|
||||
{
|
||||
if ($baseDateTime === null) {
|
||||
$baseDateTime = new \DateTimeImmutable();
|
||||
@@ -2462,8 +2291,8 @@ function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
|
||||
} else {
|
||||
throw new MustNotBeReachedException();
|
||||
}
|
||||
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
||||
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
|
||||
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||
|
||||
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s.u');
|
||||
}
|
||||
|
||||
+55
-212
@@ -1,247 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
function registerAuction() {
|
||||
use sammo\Enums\AuctionType;
|
||||
|
||||
function registerAuction(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'turnterm']);
|
||||
|
||||
$unit = 60 * $admin['turnterm'];
|
||||
|
||||
// 장수들 평금,평쌀
|
||||
$general = $db->queryFirstRow('SELECT avg(gold) as gold, avg(rice) as rice,max(gold) as maxgold from general where npc<2');
|
||||
[$avgGold, $avgRice] = $db->queryFirstList('SELECT avg(gold), avg(rice) from general where npc<2');
|
||||
$avgGold = Util::valueFit($avgGold, 1000, 20000);
|
||||
$avgRice = Util::valueFit($avgRice, 1000, 20000);
|
||||
|
||||
if($general['gold'] < 1000) { $general['gold'] = 1000; }
|
||||
if($general['gold'] > 20000) { $general['gold'] = 20000; }
|
||||
if($general['rice'] < 1000) { $general['rice'] = 1000; }
|
||||
if($general['rice'] > 20000) { $general['rice'] = 20000; }
|
||||
$neutralAuctionCnt = Util::convertPairArrayToDict($db->queryAllLists(
|
||||
'SELECT `type`, count(*) FROM ng_auction WHERE `type` IN %ls AND `host_general_id`=0 GROUP BY `type`',
|
||||
[AuctionType::BuyRice->value, AuctionType::SellRice->value],
|
||||
));
|
||||
|
||||
$neutralbuyRiceCnt = $neutralAuctionCnt[AuctionType::BuyRice->value] ?? 0;
|
||||
|
||||
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=0 AND no1=0');
|
||||
$count += 5;
|
||||
// 판매건 등록
|
||||
if(Util::randBool(1/$count)) {
|
||||
if ($rng->nextBool(1 / ($neutralbuyRiceCnt + 5))) {
|
||||
//평균 쌀의 5% ~ 25%
|
||||
$mul = rand() % 5 + 1;
|
||||
$amount = $general['rice'] / 20 * $mul;
|
||||
$cost = $general['gold'] / 20 * 0.9 * $mul;
|
||||
$mul = $rng->nextRangeInt(1, 5);
|
||||
$amount = $avgRice / 20 * $mul;
|
||||
$cost = $avgGold / 20 * 0.9 * $mul;
|
||||
$topv = $amount * 2;
|
||||
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
|
||||
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
|
||||
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
|
||||
|
||||
$amount = Util::round($amount, -1);
|
||||
$cost = Util::round($cost, -1);
|
||||
$topv = Util::round($topv, -1);
|
||||
|
||||
$term = 3 + rand() % 10;
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
$db->insert('auction', [
|
||||
'type'=>0,
|
||||
'no1'=>0,
|
||||
'name1'=>'ⓝ상인',
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
$term = $rng->nextRangeInt(3, 12);
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
AuctionBuyRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
|
||||
}
|
||||
|
||||
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=1 AND no1=0');
|
||||
$count += 5;
|
||||
$neutralSellRiceCnt = $neutralAuctionCnt[AuctionType::SellRice->value] ?? 0;
|
||||
// 구매건 등록
|
||||
if(Util::randBool(1/$count)) {
|
||||
if ($rng->nextBool(1 / ($neutralSellRiceCnt + 5))) {
|
||||
//평균 쌀의 5% ~ 25%
|
||||
$mul = Util::randRangeInt(1, 5);
|
||||
$amount = $general['rice'] / 20 * $mul;
|
||||
$cost = $general['gold'] / 20 * 1.1 * $mul;
|
||||
$topv = $amount * 0.5;
|
||||
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
|
||||
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
|
||||
$mul = $rng->nextRangeInt(1, 5);
|
||||
$amount = $avgGold / 20 * $mul;
|
||||
$cost = $avgRice / 20 * 1.1 * $mul;
|
||||
$topv = $amount * 2;
|
||||
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
|
||||
|
||||
$amount = Util::round($amount, -1);
|
||||
$cost = Util::round($cost, -1);
|
||||
$topv = Util::round($topv, -1);
|
||||
|
||||
$term = Util::randRangeInt(3, 12);
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
$db->insert('auction', [
|
||||
'type'=>1,
|
||||
'no1'=>0,
|
||||
'name1'=>'ⓝ상인',
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
$term = $rng->nextRangeInt(3, 12);
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
AuctionSellRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
|
||||
}
|
||||
}
|
||||
|
||||
function processAuction() {
|
||||
function processAuction()
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$date = TimeUtil::now();
|
||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||
$now = TimeUtil::now();
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month']);
|
||||
$auctionList = $db->queryAllLists(
|
||||
'SELECT id, `type` FROM ng_auction WHERE `close_date` <= %s AND finished = 0',
|
||||
$now
|
||||
);
|
||||
|
||||
foreach($db->query('SELECT * from auction where expire<=%s', $date) as $auction){
|
||||
$josaYi1 = JosaUtil::pick($auction['name1'], '이');
|
||||
$josaYi2 = JosaUtil::pick($auction['name2'], '이');
|
||||
|
||||
// 쌀 처리
|
||||
if($auction['no2'] == 0) {
|
||||
// 상인건수가 아닌것만 출력
|
||||
if($auction['no1'] != 0) {
|
||||
$traderID = $db->queryFirstField('SELECT no FROM general WHERE no=%i', $auction['no1']);
|
||||
$logger = new ActionLogger($traderID, 0, $year, $month);
|
||||
$logger->pushGeneralActionLog("입찰자 부재로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
|
||||
$logger->flush();
|
||||
|
||||
$auctionLog = [];
|
||||
if($auction['type'] == 0) {
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$auctionLog[] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 그러나 입찰자 부재";
|
||||
} else {
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$auctionLog[] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, 그러나 입찰자 부재";
|
||||
}
|
||||
|
||||
pushAuctionLog($auctionLog);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if($auction['no1'] == 0) {
|
||||
$trader = [
|
||||
'no'=>0,
|
||||
'name'=>'ⓝ상인',
|
||||
'gold'=>99999,
|
||||
'rice'=>99999
|
||||
];
|
||||
} else {
|
||||
$trader = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no1']);
|
||||
}
|
||||
|
||||
$bidder = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no2']);
|
||||
|
||||
$traderLogger = new ActionLogger($trader['no'], 0, $year, $month, false);
|
||||
$bidderLogger = new ActionLogger($bidder['no'], 0, $year, $month, false);
|
||||
|
||||
$auctionLog = [];
|
||||
|
||||
|
||||
//판매거래
|
||||
if($auction['type'] == 0) {
|
||||
if($auction['amount'] > $trader['rice'] - 1000) {
|
||||
$gold = Util::round($auction['value'] * 0.01);
|
||||
$db->update('general', [
|
||||
'gold'=>Util::valueFit($trader['gold'] - $gold, 0)
|
||||
], 'no=%i', $trader['no']);
|
||||
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
|
||||
$bidderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 판매자 군량부족, 벌금 <C>{$gold}</>";
|
||||
} elseif($auction['value'] > $bidder['gold'] - 1000) {
|
||||
$gold = Util::round($auction['value'] * 0.01);
|
||||
$db->update('general', [
|
||||
'gold'=>Util::valueFit($bidder['gold'] - $gold, 0)
|
||||
], 'no=%i', $bidder['no']);
|
||||
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
|
||||
$bidderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 <C>{$gold}</>";
|
||||
} else {
|
||||
$josaUlGold = JosaUtil::pick($auction['value'], '을');
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN);
|
||||
$bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 구매";
|
||||
if($auction['value'] >= $auction['amount'] * 2) {
|
||||
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
|
||||
} elseif($auction['value'] >= $auction['topv']) {
|
||||
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
|
||||
} elseif($auction['value'] * 2 <= $auction['amount']) {
|
||||
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
|
||||
|
||||
}
|
||||
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold + %i', $auction['value']),
|
||||
'rice'=>$db->sqleval('rice - %i', $auction['amount']),
|
||||
], 'no=%i', $auction['no1']);
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold - %i', $auction['value']),
|
||||
'rice'=>$db->sqleval('rice + %i', $auction['amount']),
|
||||
], 'no=%i', $auction['no2']);
|
||||
}
|
||||
pushAuctionLog($auctionLog);
|
||||
//구매거래
|
||||
} else {
|
||||
if($auction['amount'] > $bidder['rice'] - 1000) {
|
||||
$gold = Util::round($auction['value'] * 0.01);
|
||||
$db->update('general', [
|
||||
'gold'=>Util::valueFit($bidder['gold'] - $gold, 0)
|
||||
], 'no=%i', $bidder['no']);
|
||||
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
|
||||
$bidderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 군량부족, 벌금 <C>{$gold}</>";
|
||||
} elseif($auction['value'] > $trader['gold'] - 1000) {
|
||||
$gold = Util::round($auction['value'] * 0.01);
|
||||
$db->update('general', [
|
||||
'gold'=>Util::valueFit($trader['gold'] - $gold, 0)
|
||||
], 'no=%i', $trader['no']);
|
||||
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
|
||||
$bidderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 구매자 자금부족, 벌금 <C>{$gold}</>";
|
||||
} else {
|
||||
$josaUlGold = JosaUtil::pick($auction['value'], '을');
|
||||
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
|
||||
$josaRo = JosaUtil::pick($auction['value'], '로');
|
||||
$traderLogger->pushGeneralActionLog(
|
||||
"{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN
|
||||
);
|
||||
$bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN);
|
||||
$auctionLog[0] = "<S>◆</>{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 <S>구매</> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 판매";
|
||||
if($auction['value'] >= $auction['amount'] * 2) {
|
||||
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
|
||||
} elseif($auction['value'] * 2 <= $auction['amount']) {
|
||||
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
|
||||
} elseif($auction['value'] <= $auction['topv']) {
|
||||
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
|
||||
}
|
||||
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold - %i', $auction['value']),
|
||||
'rice'=>$db->sqleval('rice + %i', $auction['amount']),
|
||||
], 'no=%i', $auction['no1']);
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold + %i', $auction['value']),
|
||||
'rice'=>$db->sqleval('rice - %i', $auction['amount']),
|
||||
], 'no=%i', $auction['no2']);
|
||||
}
|
||||
$traderLogger->flush();
|
||||
$bidderLogger->flush();
|
||||
pushAuctionLog($auctionLog);
|
||||
}
|
||||
|
||||
$traderLogger->flush();
|
||||
$bidderLogger->flush();
|
||||
if (!$auctionList) {
|
||||
return;
|
||||
}
|
||||
|
||||
$db->delete('auction', 'expire <= %s', $date);
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
foreach ($auctionList as [$auctionID, $rawAuctionType]) {
|
||||
$auctionType = AuctionType::from($rawAuctionType);
|
||||
if ($auctionType === AuctionType::BuyRice) {
|
||||
$auction = new AuctionBuyRice($auctionID, $dummyGeneral);
|
||||
} else if ($auctionType === AuctionType::SellRice) {
|
||||
$auction = new AuctionSellRice($auctionID, $dummyGeneral);
|
||||
} else if ($auctionType === AuctionType::UniqueItem) {
|
||||
$auction = new AuctionUniqueItem($auctionID, $dummyGeneral);
|
||||
} else {
|
||||
throw new \Exception('Unknown auction type');
|
||||
}
|
||||
$auction->tryFinish();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -266,7 +266,7 @@ function checkCommandArg(?array $arg):?string{
|
||||
/*'string'=>[
|
||||
'nationName', 'optionText', 'itemType', 'nationType', 'commandType',
|
||||
],*/
|
||||
'integer'=>[
|
||||
'int'=>[
|
||||
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
|
||||
'amount', 'colorType',
|
||||
'srcArmType', 'destArmType', //숙련전환 전용
|
||||
@@ -393,6 +393,7 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
|
||||
_setGeneralCommand($commandObj, $turnList);
|
||||
return [
|
||||
'result'=>true,
|
||||
'brief'=>$commandObj->getBrief(),
|
||||
'reason'=>'success'
|
||||
];
|
||||
}
|
||||
@@ -474,6 +475,7 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
|
||||
_setNationCommand($commandObj, $turnList);
|
||||
return [
|
||||
'result'=>true,
|
||||
'brief'=>$commandObj->getBrief(),
|
||||
'arg_test'=>true,
|
||||
'reason'=>'success'
|
||||
];
|
||||
|
||||
+34
-11
@@ -64,6 +64,15 @@ function getNationLevel(int $level) {
|
||||
][$level];
|
||||
}
|
||||
|
||||
function convertTournamentType(string $type){
|
||||
return[
|
||||
'전력전'=>0,
|
||||
'통솔전'=>1,
|
||||
'일기토'=>2,
|
||||
'설전'=>3,
|
||||
][$type]??-1;
|
||||
}
|
||||
|
||||
function getGenChar(?string $type) {
|
||||
if($type === null){
|
||||
return '-';
|
||||
@@ -396,10 +405,10 @@ function getGeneralPoolClass(string $type){
|
||||
* @param null|string $prefix
|
||||
* @return AbsGeneralPool[]
|
||||
*/
|
||||
function pickGeneralFromPool(\MeekroDB $db, int $owner, int $pickCnt, ?string $prefix=null):array{
|
||||
function pickGeneralFromPool(\MeekroDB $db, RandUtil $rng, int $owner, int $pickCnt, ?string $prefix=null):array{
|
||||
/** @var AbsGeneralPool */
|
||||
$class = getGeneralPoolClass(GameConst::$targetGeneralPool);
|
||||
return $class::pickGeneralFromPool($db, $owner, $pickCnt, $prefix);
|
||||
return $class::pickGeneralFromPool($db, $rng, $owner, $pickCnt, $prefix);
|
||||
}
|
||||
|
||||
function countPureGeneralFromRawList(?array $rawGeneralList=null):int{
|
||||
@@ -657,7 +666,7 @@ function getDexCall(int $dex) : string {
|
||||
|
||||
function getDexLevel(int $dex) : int {
|
||||
if($dex < 0){
|
||||
throw new \InvalidArgumentException();
|
||||
return 0;
|
||||
}
|
||||
|
||||
$retVal = 0;
|
||||
@@ -692,21 +701,35 @@ function isConsumable(?string $item) : bool{
|
||||
return $itemClass->isConsumable();
|
||||
}
|
||||
|
||||
function getNameColor(int $npcType):?string{
|
||||
if($npcType >= 2){
|
||||
return 'cyan';
|
||||
}
|
||||
if($npcType == 1){
|
||||
function getNPCColor(int $npc): ?string{
|
||||
if ($npc == 1) {
|
||||
return 'skyblue';
|
||||
}
|
||||
if ($npc == 4){
|
||||
return 'deepskyblue';
|
||||
}
|
||||
if ($npc == 5){
|
||||
return 'darkcyan';
|
||||
}
|
||||
if ($npc == 6){
|
||||
return 'mediumaquamarine';
|
||||
}
|
||||
|
||||
if ($npc > 1) {
|
||||
return 'cyan';
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
function getColoredName(string $name, int $npcType):string{
|
||||
$color = getNameColor($npcType);
|
||||
|
||||
function formatName(string $name, int $npc): string
|
||||
{
|
||||
$color = getNPCColor($npc);
|
||||
if($color === null){
|
||||
return $name;
|
||||
}
|
||||
return "<span style='color:{$color}'>{$name}</span>";
|
||||
|
||||
return "<span style='color:{$color}'>$name</span>";
|
||||
}
|
||||
|
||||
function ConvertLog(?string $str, $type=1) : string {
|
||||
|
||||
+154
-107
@@ -2,7 +2,10 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use Monolog\Logger;
|
||||
use sammo\DTO\AuctionInfo;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
/**
|
||||
* 게임 룰에 해당하는 함수 모음
|
||||
@@ -282,13 +285,8 @@ function preUpdateMonthly()
|
||||
'rate_tmp' => $db->sqleval('rate')
|
||||
], true);
|
||||
|
||||
//도시훈사 180년 60, 220년 87, 240년 100
|
||||
$rate = Util::round(($admin['year'] - $admin['startyear']) / 1.5) + 60;
|
||||
if ($rate > 100) $rate = 100;
|
||||
|
||||
// 20 ~ 140원
|
||||
$develcost = ($admin['year'] - $admin['startyear'] + 10) * 2;
|
||||
$gameStor->city_rate = $rate;
|
||||
$gameStor->develcost = $develcost;
|
||||
|
||||
//매달 사망자 수입 결산
|
||||
@@ -332,7 +330,7 @@ EOD),
|
||||
}
|
||||
|
||||
// 외교 로그처리, 외교 상태 처리
|
||||
function postUpdateMonthly()
|
||||
function postUpdateMonthly(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
@@ -371,7 +369,7 @@ function postUpdateMonthly()
|
||||
sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop_max+agri_max+comm_max+secu_max+wall_max+def_max)/100
|
||||
) from city where nation=A.nation and supply=1
|
||||
))
|
||||
+(select SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)*2 + (SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/2)
|
||||
+(select SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`npc` < 2 THEN 1.2 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)*2 + (SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/2)
|
||||
FROM general AS g
|
||||
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = \'killcrew_person\'
|
||||
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = \'deathcrew_person\'
|
||||
@@ -395,7 +393,7 @@ function postUpdateMonthly()
|
||||
|
||||
//약간의 랜덤치 부여 (95% ~ 105%)
|
||||
|
||||
$nation['power'] = Util::round($nation['power'] * (rand() % 101 + 950) / 1000);
|
||||
$nation['power'] = Util::round($nation['power'] * $rng->nextRange(0.95, 1.05));
|
||||
$powerValues['maxPower'] = max($powerValues['maxPower'] ?? 0, $nation['power']);
|
||||
$powerValues['maxCrew'] = max($powerValues['maxCrew'] ?? 0, Util::toInt($nation['totalCrew']));
|
||||
|
||||
@@ -484,12 +482,12 @@ function postUpdateMonthly()
|
||||
$availableWarSettingCnt = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'available_war_setting_cnt');
|
||||
foreach ($nations as $nation) {
|
||||
$nationID = $nation['nation'];
|
||||
if(!key_exists($nationID, $availableWarSettingCnt)){
|
||||
if (!key_exists($nationID, $availableWarSettingCnt)) {
|
||||
$availableWarSettingCnt[$nationID] = 0;
|
||||
}
|
||||
}
|
||||
foreach($availableWarSettingCnt as $nationID=>$cnt){
|
||||
if($cnt >= GameConst::$maxAvailableWarSettingCnt){
|
||||
foreach ($availableWarSettingCnt as $nationID => $cnt) {
|
||||
if ($cnt >= GameConst::$maxAvailableWarSettingCnt) {
|
||||
continue;
|
||||
}
|
||||
$cnt = Util::valueFit($cnt + GameConst::$incAvailableWarSettingCnt, 0, GameConst::$maxAvailableWarSettingCnt);
|
||||
@@ -498,7 +496,7 @@ function postUpdateMonthly()
|
||||
|
||||
//초반이후 방랑군 자동 해체
|
||||
if ($admin['year'] >= $admin['startyear'] + 2) {
|
||||
checkWander();
|
||||
checkWander($rng);
|
||||
}
|
||||
// 작위 업데이트
|
||||
updateNationState();
|
||||
@@ -507,9 +505,9 @@ function postUpdateMonthly()
|
||||
// 천통여부 검사
|
||||
checkEmperior();
|
||||
//토너먼트 개시
|
||||
triggerTournament();
|
||||
triggerTournament($rng);
|
||||
// 시스템 거래건 등록
|
||||
registerAuction();
|
||||
registerAuction($rng);
|
||||
//전방설정
|
||||
foreach (getAllNationStaticInfo() as $nation) {
|
||||
if ($nation['level'] <= 0) {
|
||||
@@ -520,12 +518,12 @@ function postUpdateMonthly()
|
||||
}
|
||||
|
||||
|
||||
function checkWander()
|
||||
function checkWander(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month']);
|
||||
$admin = $gameStor->getValues(['year', 'month', 'init_year', 'init_month']);
|
||||
|
||||
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12');
|
||||
|
||||
@@ -534,7 +532,7 @@ function checkWander()
|
||||
if ($wanderCmd->hasFullConditionMet()) {
|
||||
$logger = $wanderer->getLogger();
|
||||
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
|
||||
$wanderCmd->run();
|
||||
$wanderCmd->run($rng);
|
||||
$wanderCmd->setNextAvailable();
|
||||
}
|
||||
}
|
||||
@@ -551,32 +549,44 @@ function updateNationState()
|
||||
|
||||
$history = array();
|
||||
$admin = $gameStor->getValues(['killturn', 'year', 'month', 'fiction', 'startyear', 'show_img_level', 'turnterm', 'turntime']);
|
||||
$year = $admin['year'];
|
||||
$month = $admin['month'];
|
||||
$startYear = $admin['startyear'];
|
||||
|
||||
$assemblerCnts = [];
|
||||
|
||||
$nationCityCounts = [];
|
||||
foreach($db->queryAllLists('SELECT nation, count(*) FROM city WHERE LEVEL>=4 GROUP BY nation') as [$nationID, $cityCnt]){
|
||||
$nationCityCounts[$nationID] = $cityCnt;
|
||||
}
|
||||
|
||||
foreach ($db->queryAllLists('SELECT nation,count(no) FROM general WHERE npc = 5 GROUP BY nation') as [$nationID, $assemblerCnt]) {
|
||||
$assemblerCnts[$nationID] = $assemblerCnt;
|
||||
};
|
||||
|
||||
$nationLevelByCityCnt = [
|
||||
0, //방랑군
|
||||
1, //호족
|
||||
2, //군벌
|
||||
5, //주자사
|
||||
8, //주목
|
||||
11, //공
|
||||
16, //왕
|
||||
21, //황제
|
||||
];
|
||||
|
||||
foreach ($db->query('SELECT nation,name,level,tech,aux FROM nation') as $nation) {
|
||||
//TODO: level이 진관수이소중대특 체계를 벗어날 수 있음
|
||||
$citycount = $db->queryFirstField('SELECT count(*) FROM city WHERE nation=%i AND level>=4', $nation['nation']);
|
||||
$nationID = $nation['nation'];
|
||||
$cityCnt = $nationCityCounts[$nationID] ?? 0;
|
||||
|
||||
if ($citycount == 0) {
|
||||
$nationlevel = 0; // 방랑군
|
||||
} elseif ($citycount == 1) {
|
||||
$nationlevel = 1; // 호족
|
||||
} elseif ($citycount <= 4) {
|
||||
$nationlevel = 2; // 군벌
|
||||
} elseif ($citycount <= 7) {
|
||||
$nationlevel = 3; // 주자사
|
||||
} elseif ($citycount <= 10) {
|
||||
$nationlevel = 4; // 주목
|
||||
} elseif ($citycount <= 15) {
|
||||
$nationlevel = 5; // 공
|
||||
} elseif ($citycount <= 20) {
|
||||
$nationlevel = 6; // 왕
|
||||
} else {
|
||||
$nationlevel = 7; // 황제
|
||||
/** @var int */
|
||||
$nationlevel = 0;
|
||||
foreach($nationLevelByCityCnt as $cmpNationLevel => $cmpCityCnt){
|
||||
if($cityCnt < $cmpCityCnt){
|
||||
break;
|
||||
}
|
||||
$nationlevel = $cmpNationLevel;
|
||||
}
|
||||
|
||||
if ($nationlevel > $nation['level']) {
|
||||
@@ -590,33 +600,47 @@ function updateNationState()
|
||||
'rice' => $db->sqleval('rice + %i', $nationlevel * 1000),
|
||||
];
|
||||
|
||||
$nationName = $nation['name'];
|
||||
$lordName = $db->queryFirstField('SELECT name FROM general WHERE nation = %i AND officer_level = 12', $nationID);
|
||||
|
||||
$oldNationLevelText = getNationLevel($oldLevel);
|
||||
$nationLevelText = getNationLevel($nationlevel);
|
||||
|
||||
$logger = new ActionLogger(0, $nationID, $year, $month, false);
|
||||
$josaYi = JosaUtil::pick($lordName, '이');
|
||||
|
||||
switch ($nationlevel) {
|
||||
case 7:
|
||||
$josaUl = JosaUtil::pick(getNationLevel($nationlevel), '을');
|
||||
$history[] = "<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭하였습니다.";
|
||||
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}년 {$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭"]);
|
||||
case 7: //황제
|
||||
$josaRo = JosaUtil::pick($nationLevelText, '로');
|
||||
$logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></> {$oldNationLevelText} <Y>{$lordName}</>{$josaYi} <C>{$nationLevelText}</>{$josaRo} 옹립되었습니다.");
|
||||
$logger->pushNationalHistoryLog("<D><b>{$nationName}</b></> {$oldNationLevelText} <Y>{$lordName}</>{$josaYi} <C>{$nationLevelText}</>{$josaRo} 옹립");
|
||||
$auxVal = Json::decode($nation['aux']);
|
||||
$auxVal['can_국기변경'] = 1;
|
||||
$auxVal['can_국호변경'] = 1;
|
||||
$updateVals['aux'] = Json::encode($auxVal);
|
||||
break;
|
||||
case 6:
|
||||
$history[] = "<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극하였습니다.";
|
||||
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}년 {$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극"]);
|
||||
case 6: //왕
|
||||
$josaRo = JosaUtil::pick($nationLevelText, '로');
|
||||
$logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 책봉되었습니다.");
|
||||
$logger->pushNationalHistoryLog("<D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 책봉");
|
||||
break;
|
||||
case 5:
|
||||
case 4:
|
||||
case 3:
|
||||
$history[] = "<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명되었습니다.";
|
||||
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}년 {$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명됨"]);
|
||||
case 5: //공
|
||||
case 4: //주목
|
||||
case 3: //주자사
|
||||
$josaRo = JosaUtil::pick($nationLevelText, '로');
|
||||
$logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 임명되었습니다.");
|
||||
$logger->pushNationalHistoryLog("<D><b>{$nationName}</b></>의 <Y>{$lordName}</>{$josaYi} <C>$nationLevelText</>{$josaRo} 임명됨");
|
||||
break;
|
||||
case 2:
|
||||
$history[] = "<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 독립하여 <Y>" . getNationLevel($nationlevel) . "</>로 나섰습니다.";
|
||||
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}년 {$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>로 나서다"]);
|
||||
case 2: //군벌
|
||||
$josaRa = JosaUtil::pick($nationName, '라');
|
||||
$josaRo = JosaUtil::pick($nationLevelText, '로');
|
||||
$logger->pushGlobalHistoryLog("<Y><b>【작위】</b></><Y>{$lordName}</>{$josaYi} 독립하여 <D><b>{$nationName}</b></>{$josaRa}는 <C>$nationLevelText</>{$josaRo} 나섰습니다.");
|
||||
$logger->pushNationalHistoryLog("<Y>{$lordName}</>{$josaYi} 독립하여 <D><b>{$nationName}</b></>{$josaRa}는 <C>$nationLevelText</>{$josaRo} 나서다");
|
||||
break;
|
||||
}
|
||||
|
||||
$db->update('nation', $updateVals, 'nation=%i', $nation['nation']);
|
||||
$logger->flush();
|
||||
|
||||
$turnRows = [];
|
||||
foreach (Util::range(getNationChiefLevel($nation['level']), 12) as $chiefLevel) {
|
||||
@@ -647,7 +671,6 @@ function updateNationState()
|
||||
|
||||
$uniqueLotteryWeightList = [];
|
||||
|
||||
[$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
|
||||
$relYear = $year - $startYear;
|
||||
$maxTrialCountByYear = 1;
|
||||
foreach (GameConst::$maxUniqueItemLimit as $tmpVals) {
|
||||
@@ -683,26 +706,43 @@ function updateNationState()
|
||||
$score += 15;
|
||||
}
|
||||
|
||||
$score *= 2**$trialCnt;
|
||||
$score *= 2 ** $trialCnt;
|
||||
|
||||
$uniqueLotteryWeightList[$nationGen->getID()] = [$nationGen, $score];
|
||||
}
|
||||
|
||||
$nationLevelUpRNG = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'nationLevelUp',
|
||||
$year,
|
||||
$month,
|
||||
$nationID
|
||||
)));
|
||||
|
||||
foreach (Util::range($levelDiff) as $idx) {
|
||||
if (!$uniqueLotteryWeightList) {
|
||||
break;
|
||||
}
|
||||
|
||||
/** @var General */
|
||||
$winnerObj = Util::choiceRandomUsingWeightPair($uniqueLotteryWeightList);
|
||||
$winnerObj = $nationLevelUpRNG->choiceUsingWeightPair($uniqueLotteryWeightList);
|
||||
unset($uniqueLotteryWeightList[$winnerObj->getID()]);
|
||||
giveRandomUniqueItem($winnerObj, '작위보상');
|
||||
|
||||
$givenUniqueRNG = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'givenUnique',
|
||||
$year,
|
||||
$month,
|
||||
$nationID,
|
||||
$winnerObj->getID(),
|
||||
)));
|
||||
giveRandomUniqueItem($givenUniqueRNG, $winnerObj, '작위보상');
|
||||
$winnerObj->applyDB($db);
|
||||
}
|
||||
|
||||
if ($chiefID) {
|
||||
$chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], 2);
|
||||
$chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff);
|
||||
$chiefObj->increaseInheritancePoint(InheritanceKey::unifier, 250 * $levelDiff);
|
||||
$chiefObj->applyDB($db);
|
||||
}
|
||||
}
|
||||
@@ -722,9 +762,18 @@ function updateNationState()
|
||||
if ($assemblerCnt < $maxAssemblerCnt) {
|
||||
$lastAssemblerID = $gameStor->assembler_id ?? 0;
|
||||
|
||||
$troopLeaderRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'troopLeader',
|
||||
$year,
|
||||
$month,
|
||||
$nationID
|
||||
)));
|
||||
|
||||
while ($assemblerCnt < $maxAssemblerCnt) {
|
||||
$lastAssemblerID += 1;
|
||||
$npcObj = new Scenario\GeneralBuilder(
|
||||
$troopLeaderRng,
|
||||
sprintf('부대장%4d', $lastAssemblerID),
|
||||
false,
|
||||
null,
|
||||
@@ -1022,15 +1071,30 @@ function checkEmperior()
|
||||
$nationLogger = new ActionLogger(0, $nationID, $admin['year'], $admin['month']);
|
||||
$nationLogger->pushNationalHistoryLog("<D><b>{$nationName}</b></>{$josaYi} 전토를 통일");
|
||||
|
||||
foreach (General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2')) as $genObj) {
|
||||
/** @var int[] */
|
||||
$auctionList = $db->queryFirstColumn(
|
||||
'SELECT `id` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0 ORDER BY `close_date` ASC',
|
||||
AuctionType::UniqueItem->value
|
||||
);
|
||||
foreach($auctionList as $auctionID){
|
||||
$auction = new AuctionUniqueItem($auctionID, new DummyGeneral(true));
|
||||
$auction->closeAuction(true);
|
||||
}
|
||||
|
||||
$inheritPointManager = InheritancePointManager::getInstance();
|
||||
$allUserGenerals = General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
|
||||
foreach ($allUserGenerals as $genObj) {
|
||||
if ($genObj->getNationID() == $nationID) {
|
||||
if ($genObj->getVar('officer_level') > 4) {
|
||||
$genObj->increaseInheritancePoint('unifier', 2000);
|
||||
$genObj->increaseInheritancePoint(InheritanceKey::unifier, 2000);
|
||||
};
|
||||
}
|
||||
$genObj->mergeTotalInheritancePoint(true);
|
||||
applyInheritanceUser($genObj->getVar('owner'));
|
||||
$genObj->clearInheritancePoint();
|
||||
}
|
||||
processSumInheritPointRank();
|
||||
foreach ($allUserGenerals as $genObj) {
|
||||
$inheritPointManager->mergeTotalInheritancePoint($genObj, true);
|
||||
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
|
||||
$inheritPointManager->clearInheritancePoint($genObj);
|
||||
}
|
||||
|
||||
$gameStor->isunited = 2;
|
||||
@@ -1099,7 +1163,7 @@ function checkEmperior()
|
||||
$nation = $nation;
|
||||
$nation['generals'] = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
|
||||
$nation['aux'] = Json::decode($nation['aux']);
|
||||
$nation['msg'] = $nationStor->notice;
|
||||
$nation['msg'] = $nationStor->nationNotice['msg'] ?? '';;
|
||||
$nation['scout_msg'] = $nationStor->scout_msg;
|
||||
$nation['aux'] += $nationStor->max_power;
|
||||
$nation['history'] = getNationHistoryLogAll($nation['nation']);
|
||||
@@ -1177,62 +1241,45 @@ function checkEmperior()
|
||||
'aux' => $statGeneral['aux']
|
||||
]);
|
||||
|
||||
$history = ["<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【통일】</b></><D><b>{$nation['name']}</b></>{$josaYi} 전토를 통일하였습니다."];
|
||||
$hiddenSeed = UniqueConst::$hiddenSeed;
|
||||
$history = ["<C>●</>{$admin['year']}년 {$admin['month']}월:<Y><b>【통일】</b></><D><b>{$nation['name']}</b></>{$josaYi} 전토를 통일하였습니다. <span class='hidden_but_copyable'>(서버시드: $hiddenSeed})</span>"];
|
||||
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
|
||||
|
||||
//연감 월결산
|
||||
LogHistory();
|
||||
}
|
||||
|
||||
function applyInheritanceUser(int $userID, bool $isRebirth = false): float
|
||||
{
|
||||
//FIXME: 은퇴, 사망, 천통 시점에 바로 반영한다면 여기가 아니라 general class로 이동하는 것이 옳음
|
||||
//또한 굳이 merge, apply, clean 3단계를 거쳐야 할 이유도 없음
|
||||
$rebirthDegraded = [
|
||||
'dex' => 0.5,
|
||||
];
|
||||
|
||||
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
||||
$totalPoint = 0;
|
||||
$allPoints = $inheritStor->getAll();
|
||||
if (!$allPoints || count($allPoints) == 0) {
|
||||
//비었으므로 리셋 안함
|
||||
return 0;
|
||||
}
|
||||
if (count($allPoints) == 1 && key_exists('previous', $allPoints)) {
|
||||
//이미 리셋되었으므로 리셋 안함
|
||||
return $allPoints['previous'][0];
|
||||
}
|
||||
|
||||
$userLogger = new UserLogger($userID);
|
||||
|
||||
$previousPoint = ($allPoints['previous'] ?? [0, 0])[0];
|
||||
|
||||
foreach ($allPoints as $key => [$value,]) {
|
||||
if ($isRebirth && key_exists($key, $rebirthDegraded)) {
|
||||
$value *= $rebirthDegraded[$key];
|
||||
}
|
||||
$keyText = General::INHERITANCE_KEY[$key][2];
|
||||
$userLogger->push("{$keyText} 포인트 {$value} 증가", "inheritPoint");
|
||||
$totalPoint += $value;
|
||||
}
|
||||
$totalPoint = Util::toInt($totalPoint);
|
||||
$userLogger->push("포인트 {$previousPoint} => {$totalPoint}", "inheritPoint");
|
||||
$userLogger->flush();
|
||||
|
||||
$inheritStor->resetValues();
|
||||
$inheritStor->setValue('previous', [$totalPoint, null]);
|
||||
return $totalPoint;
|
||||
}
|
||||
|
||||
function updateMaxDomesticCritical(General $general, $score)
|
||||
{
|
||||
$maxDomesticCritical = $general->getAuxVar('max_domestic_critical') ?? 0;
|
||||
$maxDomesticCritical = $general->getAuxVar(InheritanceKey::max_domestic_critical->value) ?? 0;
|
||||
$maxDomesticCritical += $score / 2;
|
||||
$general->setAuxVar('max_domestic_critical', $maxDomesticCritical);
|
||||
$general->setAuxVar(InheritanceKey::max_domestic_critical->value, $maxDomesticCritical);
|
||||
|
||||
$oldMaxDomesticCritical = $general->getInheritancePoint('max_domestic_critical');
|
||||
$oldMaxDomesticCritical = $general->getInheritancePoint(InheritanceKey::max_domestic_critical);
|
||||
if ($maxDomesticCritical > $oldMaxDomesticCritical) {
|
||||
$general->setInheritancePoint('max_domestic_critical', $maxDomesticCritical);
|
||||
$general->setInheritancePoint(InheritanceKey::max_domestic_critical, $maxDomesticCritical);
|
||||
}
|
||||
}
|
||||
|
||||
function genGenericUniqueRNG(int $year, int $month, int $generalID): RandUtil
|
||||
{
|
||||
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'unique',
|
||||
$year,
|
||||
$month,
|
||||
$generalID
|
||||
)));
|
||||
}
|
||||
|
||||
function genGenericUniqueRNGFromGeneral(General $general): RandUtil
|
||||
{
|
||||
$logger = $general->getLogger();
|
||||
if (!$logger) {
|
||||
throw new \Exception('정식 초기화된 객체가 아닙니다.');
|
||||
}
|
||||
$year = $logger->getYear();
|
||||
$month = $logger->getMonth();
|
||||
$generalID = $general->getID();
|
||||
return genGenericUniqueRNG($year, $month, $generalID);
|
||||
}
|
||||
|
||||
+12
-2
@@ -90,8 +90,8 @@ function pushAuctionLog($log) {
|
||||
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $log);
|
||||
}
|
||||
|
||||
function getAuctionLogRecent(int $count) {
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
|
||||
function getAuctionLogRecent(int $count): array {
|
||||
return array_reverse(getRawFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300));
|
||||
}
|
||||
|
||||
//DB-based
|
||||
@@ -254,6 +254,7 @@ function pushGeneralHistoryLog(int $generalID, ?array $history, $year=null, $mon
|
||||
|
||||
}
|
||||
|
||||
/** @deprecated */
|
||||
function getGeneralHistoryLogAll(int $generalID):array {
|
||||
$db = DB::db();
|
||||
|
||||
@@ -263,6 +264,15 @@ function getGeneralHistoryLogAll(int $generalID):array {
|
||||
);
|
||||
}
|
||||
|
||||
function getGeneralHistoryLogWithLogID(int $generalID):array {
|
||||
$db = DB::db();
|
||||
|
||||
return Util::convertPairArrayToDict($db->queryAllLists(
|
||||
'SELECT `id`, `text` from general_record WHERE general_id = %i AND log_type = "history" order by id desc',
|
||||
$generalID
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
function pushNationHistoryLog(int $nationID, ?array $history, ?int $year=null, ?int $month=null) {
|
||||
if(!$history){
|
||||
|
||||
+14
-13
@@ -8,11 +8,11 @@ class MapRequest{
|
||||
public $neutralView;
|
||||
public $showMe;
|
||||
function __construct($obj){
|
||||
$this->serverID = Util::array_get($obj['serverID'], null);
|
||||
$this->year = Util::array_get($obj['year']);
|
||||
$this->month = Util::array_get($obj['month']);
|
||||
$this->aux = Util::array_get($obj['aux'],[]);
|
||||
$this->neutralView = Util::array_get($obj['neutralView'], false);
|
||||
$this->serverID = $obj['serverID'] ?? null;
|
||||
$this->year = $obj['year'] ?? null;
|
||||
$this->month = $obj['month'] ?? null;
|
||||
$this->aux = $obj['aux'] ?? [];
|
||||
$this->neutralView = $obj['neutralView'] ?? false;
|
||||
$this->showMe = $obj['showMe'];
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ function getHistoryMap($year, $month, ?string $serverID=null){
|
||||
|
||||
$map = DB::db()->queryFirstField('SELECT map FROM ng_history WHERE server_id = %s AND year=%i and month=%i',
|
||||
$serverID,
|
||||
$year,
|
||||
$year,
|
||||
$month);
|
||||
|
||||
if(!$map){
|
||||
@@ -53,7 +53,7 @@ function getWorldMap($req){
|
||||
if(is_array($req)){
|
||||
$req = new MapRequest($req);
|
||||
}
|
||||
|
||||
|
||||
if($req->year && $req->month){
|
||||
return getHistoryMap($req->year, $req->month, $req->serverID??null);
|
||||
}
|
||||
@@ -98,7 +98,7 @@ function getWorldMap($req){
|
||||
$spyInfo = (object)null;
|
||||
|
||||
if($myNation){
|
||||
$rawSpy = $db->queryFirstField('select `spy` from `nation` where `nation`=%i',
|
||||
$rawSpy = $db->queryFirstField('select `spy` from `nation` where `nation`=%i',
|
||||
$myNation);
|
||||
|
||||
if(strpos($rawSpy, '|') !== false || is_numeric($rawSpy)){
|
||||
@@ -123,16 +123,16 @@ function getWorldMap($req){
|
||||
$nationList = [];
|
||||
foreach($db->query('select `nation`, `name`, `color`, `capital` from `nation`') as $row){
|
||||
$nationList[] = [
|
||||
Util::toInt($row['nation']),
|
||||
$row['name'],
|
||||
$row['color'],
|
||||
Util::toInt($row['nation']),
|
||||
$row['name'],
|
||||
$row['color'],
|
||||
Util::toInt($row['capital'])
|
||||
];
|
||||
}
|
||||
|
||||
if($myNation){
|
||||
//굳이 타국 도시에 있는 아국 장수 리스트를 뽑을 이유가 없음. 일단 다 뽑자.
|
||||
$shownByGeneralList =
|
||||
$shownByGeneralList =
|
||||
array_map('\\sammo\\Util::toInt',
|
||||
$db->queryFirstColumn('select distinct `city` from `general` where `nation` = %i',
|
||||
$myNation));
|
||||
@@ -143,7 +143,7 @@ function getWorldMap($req){
|
||||
|
||||
$cityList = [];
|
||||
foreach($db->query('select `city`, `level`, `state`, `nation`, `region`, `supply` from `city`') as $r){
|
||||
$cityList[] =
|
||||
$cityList[] =
|
||||
array_map('\\sammo\\Util::toInt', [$r['city'], $r['level'], $r['state'], $r['nation'], $r['region'], $r['supply']]);
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@ function getWorldMap($req){
|
||||
'shownByGeneralList' => $shownByGeneralList,
|
||||
'myCity' => $myCity,
|
||||
'myNation' => $myNation,
|
||||
'version' => 0,
|
||||
'result' => true
|
||||
];
|
||||
}
|
||||
@@ -3,10 +3,10 @@ namespace sammo;
|
||||
|
||||
/**
|
||||
* 내정 커맨드 사용시 성공 확률 계산
|
||||
*
|
||||
*
|
||||
* @param General $general 장수 정보
|
||||
* @param string $type 내정 커맨드 타입, 'leadership' = 통솔 기반, 'strength' = 무력 기반, 'intel' = 지력 기반
|
||||
*
|
||||
*
|
||||
* @return array 계산된 실패, 성공 확률 ('success' => 성공 확률, 'fail' => 실패 확률)
|
||||
*/
|
||||
function CriticalRatioDomestic(General $general, string $type) {
|
||||
@@ -24,7 +24,7 @@ function CriticalRatioDomestic(General $general, string $type) {
|
||||
506040(33%/30%), 505050(43%/40%), 504060(50%/50%)
|
||||
|
||||
* 통솔 내정 기준
|
||||
756510(25%/22%), 707010(31%/28%), 657510(38%,35%),
|
||||
756510(25%/22%), 707010(31%/28%), 657510(38%,35%),
|
||||
505050(50%,50%), 107070(50%,50%)
|
||||
*/
|
||||
switch($type) {
|
||||
@@ -60,13 +60,12 @@ function calcLeadershipBonus($officerLevel, $nationLevel):int{
|
||||
return $lbonus;
|
||||
}
|
||||
|
||||
function CriticalScoreEx(string $type):float {
|
||||
function CriticalScoreEx(RandUtil $rng, string $type):float {
|
||||
if ($type == 'success') {
|
||||
return Util::randRange(2.2, 3.0);
|
||||
return $rng->nextRange(2.2, 3.0);
|
||||
}
|
||||
if ($type == 'fail') {
|
||||
return Util::randRange(0.2, 0.4);
|
||||
return $rng->nextRange(0.2, 0.4);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
+19
-48
@@ -60,6 +60,11 @@ function chiefTurnTable()
|
||||
";
|
||||
}
|
||||
|
||||
function templateLimitMsg(string $turntime): string
|
||||
{
|
||||
return "이미 너무 많은 접속을 하셨습니다. 다음 턴에 다시 시도해주세요. (턴시간: {$turntime})";
|
||||
}
|
||||
|
||||
function displayiActionObjInfo(?iAction $action)
|
||||
{
|
||||
if ($action === null) {
|
||||
@@ -125,7 +130,7 @@ function allButton(bool $seizeNPCMode, array $opts = [])
|
||||
$site = "a_npcList.php";
|
||||
$call = "빙의일람";
|
||||
} else {
|
||||
$site = "a_vote.php";
|
||||
$site = "v_vote.php";
|
||||
$call = "설문조사";
|
||||
}
|
||||
|
||||
@@ -161,24 +166,24 @@ function commandButton(array $opts = [])
|
||||
'color' => '#000000'
|
||||
];
|
||||
|
||||
$bgColor = Util::array_get($nation['color']) ?: '#000000';
|
||||
$bgColor = $nation['color'] ?? '#000000';
|
||||
$fgColor = newColor($bgColor);
|
||||
|
||||
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
$showSecret = false;
|
||||
$permission = checkSecretPermission($me);
|
||||
$btnClassForTournament = $opts['btnClass'];
|
||||
if ($opts['isTournamentActive']) {
|
||||
if ($btnClassForTournament != 'dropdown-item') {
|
||||
$btnClassForTournament = 'toolbarButton2';
|
||||
}
|
||||
if ($opts['isTournamentApplicationOpen']) {
|
||||
if ($btnClassForTournament != 'dropdown-item') {
|
||||
$btnClassForTournament = 'toolbarButton2';
|
||||
}
|
||||
}
|
||||
|
||||
$btnClassForBetting = $opts['btnClass'];
|
||||
if ($opts['isBettingActive']) {
|
||||
if ($btnClassForTournament != 'dropdown-item') {
|
||||
$btnClassForBetting = 'toolbarButton2';
|
||||
}
|
||||
if ($btnClassForTournament != 'dropdown-item') {
|
||||
$btnClassForBetting = 'toolbarButton2';
|
||||
}
|
||||
}
|
||||
|
||||
if ($permission >= 1) {
|
||||
@@ -231,57 +236,23 @@ function formatLeadershipBonus(int $value): string
|
||||
return "<font color=cyan>+{$value}</font>";
|
||||
}
|
||||
|
||||
function getNPCColor(int $npc): ?string{
|
||||
if ($npc == 1) {
|
||||
return 'skyblue';
|
||||
}
|
||||
if ($npc == 4){
|
||||
return 'deepskyblue';
|
||||
}
|
||||
if ($npc == 5){
|
||||
return 'darkcyan';
|
||||
}
|
||||
if ($npc == 6){
|
||||
return 'mediumaquamarine';
|
||||
}
|
||||
|
||||
if ($npc > 1) {
|
||||
return 'cyan';
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function formatName(string $name, int $npc): string
|
||||
{
|
||||
$color = getNPCColor($npc);
|
||||
if($color === null){
|
||||
return $name;
|
||||
}
|
||||
|
||||
return "<span style='color:{$color}'>$name</span>";
|
||||
}
|
||||
|
||||
function getMapTheme(): string
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$mapTheme = $gameStor->map_theme ?? 'che';
|
||||
return $mapTheme;
|
||||
return GameConst::$mapName;
|
||||
}
|
||||
|
||||
function getMapHtml(?string $mapTheme = null)
|
||||
function getMapHtml(?string $mapName = null)
|
||||
{
|
||||
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||
|
||||
if ($mapTheme === null) {
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$mapTheme = $gameStor->map_theme ?? 'che';
|
||||
if ($mapName === null) {
|
||||
$mapName = GameConst::$mapName;
|
||||
}
|
||||
|
||||
return $templates->render('map', [
|
||||
'mapTheme' => $mapTheme
|
||||
'mapName' => $mapName
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
+81
-28
@@ -1,17 +1,68 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\Enums\RankColumn;
|
||||
use Ds\Map;
|
||||
/**
|
||||
* 시간 단위로 일어나는 이벤트들에 대한 함수 모음
|
||||
*/
|
||||
|
||||
|
||||
|
||||
function processSumInheritPointRank(){
|
||||
$db = DB::db();
|
||||
|
||||
$generals = General::createGeneralObjListFromDB(null, null, 2);
|
||||
|
||||
$points = new Map();
|
||||
$points->allocate(count($generals));
|
||||
foreach($generals as $general){
|
||||
$generalID = $general->getID();
|
||||
$points[$generalID] = 0;
|
||||
}
|
||||
|
||||
foreach(InheritanceKey::cases() as $key){
|
||||
if($key === InheritanceKey::previous){
|
||||
continue;
|
||||
}
|
||||
$subPoints = InheritancePointManager::getInstance()->getInheritancePointFromAll($generals, $key);
|
||||
foreach($generals as $general){
|
||||
$generalID = $general->getID();
|
||||
$points[$generalID] += $subPoints[$generalID] ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
$pointsPairs = [];
|
||||
foreach($points as $generalID => $point){
|
||||
$pointsPairs[] = [
|
||||
'nation_id' => $generals[$generalID]->getNationID(),
|
||||
'general_id' => $generalID,
|
||||
'type' => RankColumn::inherit_point_earned_by_merge->value,
|
||||
'value' => $point,
|
||||
];
|
||||
}
|
||||
//XXX: multiple batch update가 제공되지 않으므로..
|
||||
$db->delete('rank_data', '`type` = %s', RankColumn::inherit_point_earned_by_merge->value);
|
||||
$db->insert('rank_data', $pointsPairs);
|
||||
|
||||
$db->query(
|
||||
'UPDATE `rank_data` D SET `value` = (SELECT SUM(`value`) FROM `rank_data` S WHERE S.general_id = D.general_id AND S.`type` IN %ls) WHERE D.`type` = %s',
|
||||
[RankColumn::inherit_point_earned_by_action->value, RankColumn::inherit_point_earned_by_merge->value],
|
||||
RankColumn::inherit_point_earned->value
|
||||
);
|
||||
|
||||
$db->query(
|
||||
'UPDATE `rank_data` D SET `value` = (SELECT `value` FROM `rank_data` S WHERE S.general_id = D.general_id AND S.`type` = %s) WHERE D.`type` = %s',
|
||||
RankColumn::inherit_point_spent_dynamic->value,
|
||||
RankColumn::inherit_point_spent->value
|
||||
);
|
||||
}
|
||||
|
||||
//1월마다 실행
|
||||
function processSpring() {
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
//인구 증가
|
||||
popIncrease();
|
||||
// 1월엔 무조건 내정 1% 감소
|
||||
$db->update('city',[
|
||||
'dead'=>0,
|
||||
@@ -22,6 +73,9 @@ function processSpring() {
|
||||
'wall'=>$db->sqleval('wall * 0.99'),
|
||||
],true);
|
||||
|
||||
//인구 증가
|
||||
popIncrease();
|
||||
|
||||
// > 10000 유지비 3%, > 1000 유지비 1%
|
||||
// 유지비 1%
|
||||
$db->update('general', [
|
||||
@@ -40,7 +94,7 @@ function processSpring() {
|
||||
|
||||
function processGoldIncome() {
|
||||
$db = DB::db();
|
||||
$gameStor = new KVStorage($db, 'game_env');
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||
$adminLog = [];
|
||||
@@ -100,7 +154,7 @@ function processGoldIncome() {
|
||||
$generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
|
||||
$gold = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
|
||||
$generalObj->increaseVar('gold', $gold);
|
||||
|
||||
|
||||
$logger = $generalObj->getLogger();
|
||||
if($generalObj->getVar('officer_level') > 4){
|
||||
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
|
||||
@@ -121,9 +175,9 @@ function processGoldIncome() {
|
||||
|
||||
function popIncrease() {
|
||||
$db = DB::db();
|
||||
|
||||
|
||||
$nationList = $db->queryAllLists('SELECT nation,rate_tmp,type FROM nation');
|
||||
|
||||
|
||||
// 인구 및 민심
|
||||
|
||||
$db->update('city', [
|
||||
@@ -138,7 +192,7 @@ function popIncrease() {
|
||||
foreach($nationList as [$nationID, $taxRate, $nationType]){
|
||||
$nationTypeObj = buildNationTypeClass($nationType);
|
||||
|
||||
|
||||
|
||||
$popRatio = (30 - $taxRate)/200; // 20일때 5% 5일때 12.5% 50일때 -10%
|
||||
$popRatio = $nationTypeObj->onCalcNationalIncome('pop', $popRatio);
|
||||
|
||||
@@ -246,7 +300,7 @@ function getGoldIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
|
||||
}
|
||||
|
||||
$cityIncome *= ($taxRate / 20);
|
||||
|
||||
|
||||
return $cityIncome;
|
||||
}
|
||||
|
||||
@@ -290,9 +344,6 @@ function getWarGoldIncome(string $nationType, array $cityList){
|
||||
function processFall() {
|
||||
$db = DB::db();
|
||||
|
||||
//인구 증가
|
||||
popIncrease();
|
||||
|
||||
// 7월엔 무조건 내정 1% 감소
|
||||
$db->update('city',[
|
||||
'dead'=>0,
|
||||
@@ -303,6 +354,8 @@ function processFall() {
|
||||
'wall'=>$db->sqleval('wall * 0.99'),
|
||||
],true);
|
||||
|
||||
//인구 증가
|
||||
popIncrease();
|
||||
|
||||
// > 10000 유지비 3%, > 1000 유지비 1%
|
||||
// 유지비 1%
|
||||
@@ -378,7 +431,7 @@ function processRiceIncome() {
|
||||
$generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
|
||||
$rice = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
|
||||
$generalObj->increaseVar('rice', $rice);
|
||||
|
||||
|
||||
$logger = $generalObj->getLogger();
|
||||
if($generalObj->getVar('officer_level') > 4){
|
||||
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
|
||||
@@ -418,7 +471,7 @@ function getRiceIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
|
||||
}
|
||||
|
||||
$cityIncome *= ($taxRate / 20);
|
||||
|
||||
|
||||
return $cityIncome;
|
||||
}
|
||||
|
||||
@@ -439,12 +492,12 @@ function getWallIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
|
||||
$cityIncome = 0;
|
||||
foreach($cityList as $rawCity){
|
||||
$cityID = $rawCity['city'];
|
||||
|
||||
|
||||
$cityIncome += calcCityWallRiceIncome($rawCity, $officersCnt[$cityID]??0, $capitalID == $cityID, $nationLevel, $nationTypeObj);
|
||||
}
|
||||
|
||||
$cityIncome *= ($taxRate / 20);
|
||||
|
||||
|
||||
return $cityIncome;
|
||||
}
|
||||
|
||||
@@ -460,7 +513,7 @@ function getOutcome(float $billRate, array $generalList) {
|
||||
return $outcome;
|
||||
}
|
||||
|
||||
function tradeRate() {
|
||||
function tradeRate(RandUtil $rng) {
|
||||
$db = DB::db();
|
||||
|
||||
foreach($db->query('SELECT city,level FROM city') as $city){
|
||||
@@ -475,8 +528,8 @@ function tradeRate() {
|
||||
7=>0.8,
|
||||
8=>1
|
||||
][$city['level']];
|
||||
if($prob > 0 && Util::randBool($prob)) {
|
||||
$trade = Util::randRangeInt(95, 105);
|
||||
if($prob > 0 && $rng->nextBool($prob)) {
|
||||
$trade = $rng->nextRangeInt(95, 105);
|
||||
} else {
|
||||
$trade = null;
|
||||
}
|
||||
@@ -486,7 +539,7 @@ function tradeRate() {
|
||||
}
|
||||
}
|
||||
|
||||
function disaster() {
|
||||
function disaster(RandUtil $rng) {
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
@@ -507,7 +560,7 @@ function disaster() {
|
||||
10=>0
|
||||
];
|
||||
|
||||
$isGood = Util::randBool($boomingRate[$month]);
|
||||
$isGood = $rng->nextBool($boomingRate[$month]);
|
||||
|
||||
|
||||
$targetCityList = [];
|
||||
@@ -520,9 +573,9 @@ function disaster() {
|
||||
}
|
||||
else {
|
||||
$raiseProp = 0.06 - ($city['secu'] / $city['secu_max']) * 0.05; // 1 ~ 6%
|
||||
}
|
||||
}
|
||||
|
||||
if(Util::randBool($raiseProp)) {
|
||||
if($rng->nextBool($raiseProp)) {
|
||||
$targetCityList[] = $city;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +621,7 @@ function disaster() {
|
||||
10 => null
|
||||
];
|
||||
|
||||
[$logTitle, $stateCode, $logBody] = Util::choiceRandom(($isGood?$boomingTextList:$disasterTextList)[$month]);
|
||||
[$logTitle, $stateCode, $logBody] = $rng->choice(($isGood?$boomingTextList:$disasterTextList)[$month]);
|
||||
|
||||
$logger = new ActionLogger(0, 0, $year, $month, false);
|
||||
|
||||
@@ -592,15 +645,15 @@ function disaster() {
|
||||
'def'=>$db->sqleval('def * %d', $affectRatio),
|
||||
'wall'=>$db->sqleval('wall * %d', $affectRatio),
|
||||
], 'city = %i', $city['city']);
|
||||
|
||||
|
||||
$generalList = array_map(
|
||||
function($rawGeneral) use ($city, $year, $month){
|
||||
return new General($rawGeneral, null, $city, null, $year, $month, false);
|
||||
},
|
||||
},
|
||||
$generalListByCity[$city['city']]??[]
|
||||
);
|
||||
|
||||
SabotageInjury($generalList, '재난');
|
||||
SabotageInjury($rng, $generalList, '재난');
|
||||
}
|
||||
}
|
||||
else{
|
||||
@@ -619,7 +672,7 @@ function disaster() {
|
||||
'wall'=>$db->sqleval('least(wall * %d, wall_max)', $affectRatio),
|
||||
], 'city = %i', $city['city']);
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+204
-643
@@ -2,18 +2,28 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\DTO\BettingInfo;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
|
||||
/**
|
||||
* @param int $turnTerm 서버 턴 단위
|
||||
* @return int 토너먼트 초 단위
|
||||
*/
|
||||
function calcTournamentTerm(int $turnTerm): int{
|
||||
return Util::valueFit($turnTerm, 5, 120);
|
||||
}
|
||||
|
||||
function processTournament()
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']);
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'turnterm', 'last_tournament_betting_id']);
|
||||
$now = new \DateTime();
|
||||
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
|
||||
|
||||
//수동일땐 무시
|
||||
if ($admin['tnmt_auto'] == 0) {
|
||||
if (!$admin['tnmt_auto']) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -26,31 +36,7 @@ function processTournament()
|
||||
}
|
||||
|
||||
//현시간이 스탬프 지나친경우
|
||||
switch ($admin['tnmt_auto']) {
|
||||
case 1:
|
||||
$unit = 720;
|
||||
break;
|
||||
case 2:
|
||||
$unit = 420;
|
||||
break;
|
||||
case 3:
|
||||
$unit = 180;
|
||||
break;
|
||||
case 4:
|
||||
$unit = 60;
|
||||
break;
|
||||
case 5:
|
||||
$unit = 30;
|
||||
break;
|
||||
case 6:
|
||||
$unit = 15;
|
||||
break;
|
||||
case 7:
|
||||
$unit = 5;
|
||||
break;
|
||||
default:
|
||||
throw new MustNotBeReachedException();
|
||||
}
|
||||
$unit = calcTournamentTerm($admin['turnterm']);
|
||||
|
||||
//업데이트 횟수
|
||||
$iter = intdiv($offset, $unit) + 1;
|
||||
@@ -90,9 +76,12 @@ function processTournament()
|
||||
final16set();
|
||||
$tnmt = 6;
|
||||
$phase = 0;
|
||||
startBetting();
|
||||
startBetting($type, $unit);
|
||||
break;
|
||||
case 6: //베팅중
|
||||
$bettingID = $admin['last_tournament_betting_id'];
|
||||
$betting = new Betting($bettingID);
|
||||
$betting->closeBetting();
|
||||
$tnmt = 7;
|
||||
$phase = 0;
|
||||
break;
|
||||
@@ -131,10 +120,7 @@ function processTournament()
|
||||
|
||||
//베팅은 무조건 60페이즈후 진행(최대 1시간)
|
||||
if ($tnmt == 6) {
|
||||
$betTerm = $unit * 60;
|
||||
if ($betTerm > 3600) {
|
||||
$betTerm = 3600;
|
||||
}
|
||||
$betTerm = Util::valueFit($unit * 60, null, 3600);
|
||||
//처리 초 더한 날짜
|
||||
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i + $betTerm);
|
||||
$gameStor->tournament = $tnmt;
|
||||
@@ -142,20 +128,6 @@ function processTournament()
|
||||
$gameStor->tnmt_time = $dt;
|
||||
return;
|
||||
}
|
||||
|
||||
if ($admin['tnmt_auto'] == 1) {
|
||||
//처리 초 더한 날짜
|
||||
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i);
|
||||
$hr = substr($dt, 11, 2);
|
||||
//지정시간대 넘어가면 중단 20~24시
|
||||
if ($hr < 20) {
|
||||
$dt = substr($dt, 0, 11) . "20:00:00";
|
||||
$gameStor->tournament = $tnmt;
|
||||
$gameStor->phase = $phase;
|
||||
$gameStor->tnmt_time = $dt;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$second = $unit * $iter;
|
||||
@@ -164,41 +136,16 @@ function processTournament()
|
||||
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
function getTournamentTerm(): ?int{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$tnmt_auto = $gameStor->tnmt_auto;
|
||||
if($tnmt_auto === null){
|
||||
$tnmt_auto = $gameStor->tnmt_trig;
|
||||
}
|
||||
switch($tnmt_auto){
|
||||
case 0: return null;
|
||||
case 1: return 12 * 60;
|
||||
case 2: return 7 * 60;
|
||||
case 3: return 3 * 60;
|
||||
case 4: return 1 * 60;
|
||||
case 5: return 30;
|
||||
case 6: return 15;
|
||||
case 7: return 5;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getTournamentTermText()
|
||||
function getTournamentTermText(int $turnTerm)
|
||||
{
|
||||
$term = getTournamentTerm();
|
||||
$term = calcTournamentTerm($turnTerm);
|
||||
|
||||
if($term === null){
|
||||
return '수동';
|
||||
}
|
||||
|
||||
if($term % 60 === 0){
|
||||
if ($term % 60 === 0) {
|
||||
$termMin = intdiv($term, 60);
|
||||
return "경기당 {$termMin}분";
|
||||
}
|
||||
|
||||
if($term > 60){
|
||||
if ($term > 60) {
|
||||
$termSec = $term % 60;
|
||||
$termMin = intdiv($term, 60);
|
||||
return "경기당 {$termMin}분 {$termSec}초";
|
||||
@@ -263,12 +210,12 @@ function getTournament(int $tnmt)
|
||||
][$tnmt] ?? "TOURNAMENT_TYPE_ERR_{$tnmt}";
|
||||
}
|
||||
|
||||
function printRow($k, $npc, $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl, $prmt)
|
||||
function printRow(int $k, int $npc, string $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl, $prmt)
|
||||
{
|
||||
$k += 1;
|
||||
if ($prmt > 0) {
|
||||
$name = "<font color=orange>" . $name . "</font>";
|
||||
} else if($npc > 0){
|
||||
} else if ($npc > 0) {
|
||||
$name = formatName($name, $npc);
|
||||
}
|
||||
echo "<tr align=center><td class='bg2'>$k</td><td style='font-size:80%;'>$name</td><td>$abil</td><td>$tgame</td><td>$win</td><td>$draw</td><td>$lose</td><td>$gd</td><td>$gl</td></tr>";
|
||||
@@ -327,69 +274,27 @@ function printFighting($tournament, $phase)
|
||||
}
|
||||
}
|
||||
|
||||
function startTournament($auto, $type)
|
||||
function startTournament($type)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
eraseTnmtFightLogAll();
|
||||
|
||||
switch ($auto) {
|
||||
case 1:
|
||||
$unit = 60;
|
||||
break;
|
||||
case 2:
|
||||
$unit = 60;
|
||||
break;
|
||||
case 3:
|
||||
$unit = 60;
|
||||
break;
|
||||
case 4:
|
||||
$unit = 60;
|
||||
break;
|
||||
case 5:
|
||||
$unit = 30;
|
||||
break;
|
||||
case 6:
|
||||
$unit = 15;
|
||||
break;
|
||||
case 7:
|
||||
$unit = 5;
|
||||
break;
|
||||
default:
|
||||
$unit = 60;
|
||||
break;
|
||||
}
|
||||
$admin = $gameStor->getValues(['year', 'month', 'turnterm']);
|
||||
$turnTerm = $admin['turnterm'];
|
||||
$unit = calcTournamentTerm($turnTerm);
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month']);
|
||||
|
||||
$gameStor->tnmt_auto = $auto;
|
||||
$gameStor->tnmt_auto = true;
|
||||
$gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
|
||||
$gameStor->tournament = 1;
|
||||
$gameStor->tnmt_type = $type;
|
||||
$gameStor->last_tournament_betting_id = 0;
|
||||
$gameStor->phase = 0;
|
||||
|
||||
$db->update('general', [
|
||||
'tournament' => 0,
|
||||
], true);
|
||||
$db->update('betting', [
|
||||
'bet0' => 0,
|
||||
'bet1' => 0,
|
||||
'bet2' => 0,
|
||||
'bet3' => 0,
|
||||
'bet4' => 0,
|
||||
'bet5' => 0,
|
||||
'bet6' => 0,
|
||||
'bet7' => 0,
|
||||
'bet8' => 0,
|
||||
'bet9' => 0,
|
||||
'bet10' => 0,
|
||||
'bet11' => 0,
|
||||
'bet12' => 0,
|
||||
'bet13' => 0,
|
||||
'bet14' => 0,
|
||||
'bet15' => 0
|
||||
], true);
|
||||
$db->query('TRUNCATE TABLE tournament');
|
||||
|
||||
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`officer_level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
|
||||
@@ -416,44 +321,100 @@ function startTournament($auto, $type)
|
||||
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
|
||||
}
|
||||
|
||||
function startBetting()
|
||||
function getDummyBettingInfo(string $tnmt_type): BettingInfo
|
||||
{
|
||||
return new BettingInfo(
|
||||
id: 0,
|
||||
type: 'tournament',
|
||||
name: $tnmt_type,
|
||||
finished: true,
|
||||
selectCnt: 1,
|
||||
isExclusive: null,
|
||||
reqInheritancePoint: false,
|
||||
openYearMonth: 0,
|
||||
closeYearMonth: 0,
|
||||
candidates: [],
|
||||
winner: null,
|
||||
);
|
||||
}
|
||||
|
||||
function startBetting($type)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
[$year, $month, $startyear] = $gameStor->getValuesAsArray(['year', 'month', 'startyear']);
|
||||
[$year, $month, $startyear, $turnterm] = $gameStor->getValuesAsArray(['year', 'month', 'startyear', 'turnterm']);
|
||||
pushGlobalHistoryLog([
|
||||
"<S>◆</>{$year}년 {$month}월:<B><b>【대회】</b></>우승자를 예상하는 <C>내기</>가 진행중입니다! 호사가의 참여를 기다립니다!"
|
||||
], $year, $month);
|
||||
|
||||
[$typeText, $statName, $statKey] = [
|
||||
['전력전', '종능', 'total'],
|
||||
['통솔전', '통솔', 'leadership'],
|
||||
['일기토', '무력', 'strength'],
|
||||
['설전', '지력', 'intel'],
|
||||
][$type];
|
||||
|
||||
$bettingID = Betting::genNextBettingID();
|
||||
|
||||
|
||||
//어차피 강제로 닫을 것이므로 크게 신경쓰지 않는다.
|
||||
$openYearMonth = Util::joinYearMonth($year, $month);
|
||||
$closeYearMonth = $openYearMonth + 120;
|
||||
|
||||
/** @var \sammo\DTO\SelectItem[] */
|
||||
$candidates = [];
|
||||
|
||||
$generalList = $db->query('SELECT no,npc,name,win,leadership,strength,intel,leadership+strength+intel as total from tournament where grp>=20 order by grp, grp_no LIMIT 16');
|
||||
foreach ($generalList as $idx => $general) {
|
||||
if ($general['no'] <= 0) {
|
||||
continue;
|
||||
}
|
||||
$general['idx'] = $idx;
|
||||
$candidates[$general['no']] = new \sammo\DTO\SelectItem(
|
||||
title: $general['name'],
|
||||
info: "{$statName}: {$general[$statKey]}",
|
||||
isHtml: null,
|
||||
aux: $general
|
||||
);
|
||||
}
|
||||
|
||||
Betting::openBetting(new BettingInfo(
|
||||
id: $bettingID,
|
||||
type: 'tournament',
|
||||
name: $typeText,
|
||||
finished: false,
|
||||
selectCnt: 1,
|
||||
isExclusive: null,
|
||||
reqInheritancePoint: false,
|
||||
openYearMonth: $openYearMonth,
|
||||
closeYearMonth: $closeYearMonth,
|
||||
candidates: $candidates,
|
||||
winner: null,
|
||||
));
|
||||
|
||||
$betting = new Betting($bettingID);
|
||||
|
||||
$gameStor->last_tournament_betting_id = $bettingID;
|
||||
|
||||
$betGold = Util::valueFit(floor((3 + $year - $startyear) * 0.334) * 10, 10);
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'OpenBettingTournament',
|
||||
$bettingID,
|
||||
)));
|
||||
|
||||
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE npc >= 2 AND gold >= (500 + %i)', $betGold);
|
||||
$npcBet = [];
|
||||
$betSum = [
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
$targetList = array_keys($candidates);
|
||||
foreach ($npcList as $npcID) {
|
||||
$target = Util::randRangeInt(0, 15);
|
||||
$betSum[$target] += $betGold;
|
||||
$target = $rng->choice($targetList);
|
||||
$npcBet[] = [$npcID, $target];
|
||||
}
|
||||
|
||||
$db->update('general', [
|
||||
'gold' => $db->sqleval('gold - %i', $betGold),
|
||||
], 'no IN %li', $npcList);
|
||||
foreach ($npcBet as [$npcID, $betTarget]) {
|
||||
$targetKey = "bet{$betTarget}";
|
||||
$db->update('betting', [
|
||||
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betGold),
|
||||
], 'general_id = %i', $npcID);
|
||||
}
|
||||
foreach ($betSum as $betTarget => $betSumGold) {
|
||||
$targetKey = "bet{$betTarget}";
|
||||
$db->update('betting', [
|
||||
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betSumGold),
|
||||
], 'general_id = 0');
|
||||
$betting->bet($npcID, null, [$betTarget], $betGold);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -512,24 +473,26 @@ function fillLowGenAll($tnmt_type)
|
||||
};
|
||||
|
||||
//자동신청하고, 돈 있고, 아직 참가 안한 장수
|
||||
/** @var array<array{0:array,1:float}> */
|
||||
$freeJoinerCandidate = [];
|
||||
|
||||
foreach($db->query(
|
||||
foreach ($db->query(
|
||||
'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0',
|
||||
) as $gen){
|
||||
) as $gen) {
|
||||
$score = $scoringCandFunction($gen);
|
||||
$freeJoinerCandidate[$gen['no']] = [$gen, $score**1.5];
|
||||
$freeJoinerCandidate[$gen['no']] = [$gen, $score ** 1.5];
|
||||
}
|
||||
|
||||
|
||||
$joinersValues = [];
|
||||
$joinersIdx = [];
|
||||
|
||||
foreach(Util::range($toBeFilledCnt) as $_){
|
||||
if(!$freeJoinerCandidate){
|
||||
foreach (Util::range($toBeFilledCnt) as $_) {
|
||||
if (!$freeJoinerCandidate) {
|
||||
break;
|
||||
}
|
||||
$general = Util::choiceRandomUsingWeightPair($freeJoinerCandidate);
|
||||
/** @var array $general */
|
||||
unset($freeJoinerCandidate[$general['no']]);
|
||||
|
||||
$grpIdx = array_keys($grpCount, min($grpCount))[0];
|
||||
@@ -581,160 +544,37 @@ function fillLowGenAll($tnmt_type)
|
||||
//7 8강
|
||||
//8 4강
|
||||
//9 결승
|
||||
function getTwo($tournament, $phase)
|
||||
/**
|
||||
* @return array{0:int,1:int}
|
||||
*/
|
||||
function getTwo(int $tournament, int $phase): array
|
||||
{
|
||||
$cand = [];
|
||||
switch ($tournament) {
|
||||
case 2:
|
||||
//예선
|
||||
switch ($phase % 28) {
|
||||
case 0:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 1;
|
||||
break;
|
||||
case 1:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 2:
|
||||
$cand[0] = 4;
|
||||
$cand[1] = 5;
|
||||
break;
|
||||
case 3:
|
||||
$cand[0] = 6;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 4:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 2;
|
||||
break;
|
||||
case 5:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 6:
|
||||
$cand[0] = 4;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
case 7:
|
||||
$cand[0] = 5;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 8:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 9:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
case 10:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 5;
|
||||
break;
|
||||
case 11:
|
||||
$cand[0] = 4;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 12:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 4;
|
||||
break;
|
||||
case 13:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 5;
|
||||
break;
|
||||
case 14:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
case 15:
|
||||
$cand[0] = 3;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 16:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 5;
|
||||
break;
|
||||
case 17:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 4;
|
||||
break;
|
||||
case 18:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 19:
|
||||
$cand[0] = 3;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
case 20:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
case 21:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 22:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 4;
|
||||
break;
|
||||
case 23:
|
||||
$cand[0] = 3;
|
||||
$cand[1] = 5;
|
||||
break;
|
||||
case 24:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 7;
|
||||
break;
|
||||
case 25:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 2;
|
||||
break;
|
||||
case 26:
|
||||
$cand[0] = 3;
|
||||
$cand[1] = 4;
|
||||
break;
|
||||
case 27:
|
||||
$cand[0] = 5;
|
||||
$cand[1] = 6;
|
||||
break;
|
||||
}
|
||||
$candMap = [
|
||||
[0, 1], [2, 3], [4, 5], [6, 7],
|
||||
[0, 2], [1, 3], [4, 6], [5, 7],
|
||||
[0, 3], [1, 6], [2, 5], [4, 7],
|
||||
[0, 4], [1, 5], [2, 6], [3, 7],
|
||||
[0, 5], [1, 4], [2, 7], [3, 6],
|
||||
[0, 6], [1, 7], [2, 4], [3, 5],
|
||||
[0, 7], [1, 2], [3, 4], [5, 6],
|
||||
];
|
||||
$cand = $candMap[$phase % 28];
|
||||
if ($phase >= 28) {
|
||||
$temp = $cand[0];
|
||||
$cand[0] = $cand[1];
|
||||
$cand[1] = $temp;
|
||||
$cand = [$cand[1], $cand[0]];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
//본선
|
||||
switch ($phase % 6) {
|
||||
case 0:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 1;
|
||||
break;
|
||||
case 1:
|
||||
$cand[0] = 2;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 2:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 2;
|
||||
break;
|
||||
case 3:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 4:
|
||||
$cand[0] = 0;
|
||||
$cand[1] = 3;
|
||||
break;
|
||||
case 5:
|
||||
$cand[0] = 1;
|
||||
$cand[1] = 2;
|
||||
break;
|
||||
}
|
||||
$candMap = [
|
||||
[0, 1], [2, 3],
|
||||
[0, 2], [1, 3],
|
||||
[0, 3], [1, 2],
|
||||
];
|
||||
$cand = $candMap[$phase % 6];
|
||||
break;
|
||||
}
|
||||
return $cand;
|
||||
@@ -927,29 +767,14 @@ function finalFight($tnmt_type, $tnmt, $phase, $type)
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
switch ($type) {
|
||||
case 16:
|
||||
$offset = 20;
|
||||
$turn = 7;
|
||||
$next = 7;
|
||||
break;
|
||||
case 8:
|
||||
$offset = 30;
|
||||
$turn = 3;
|
||||
$next = 8;
|
||||
break;
|
||||
case 4:
|
||||
$offset = 40;
|
||||
$turn = 1;
|
||||
$next = 9;
|
||||
break;
|
||||
case 2:
|
||||
$offset = 50;
|
||||
$turn = 0;
|
||||
$next = 0;
|
||||
break;
|
||||
default:
|
||||
throw new MustNotBeReachedException();
|
||||
[$offset, $turn, $next] = [
|
||||
16 => [20, 7, 7],
|
||||
8 => [30, 3, 8],
|
||||
4 => [40, 1, 9],
|
||||
2 => [50, 0, 0],
|
||||
][$type] ?? [0, 0, 0];
|
||||
if ($offset === 0) {
|
||||
throw new MustNotBeReachedException();
|
||||
}
|
||||
|
||||
$grp = $phase + $offset;
|
||||
@@ -987,29 +812,18 @@ function setGift($tnmt_type, $tnmt, $phase)
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
|
||||
$admin = $gameStor->getValues(['year', 'month', 'develcost', 'last_tournament_betting_id']);
|
||||
|
||||
$resultHelper = [];
|
||||
|
||||
switch ($tnmt_type) {
|
||||
case 0:
|
||||
$tp = "전력전";
|
||||
$tp2 = "tt";
|
||||
break;
|
||||
case 1:
|
||||
$tp = "통솔전";
|
||||
$tp2 = "tl";
|
||||
break;
|
||||
case 2:
|
||||
$tp = "일기토";
|
||||
$tp2 = "ts";
|
||||
break;
|
||||
case 3:
|
||||
$tp = "설전";
|
||||
$tp2 = "ti";
|
||||
break;
|
||||
default:
|
||||
throw new MustNotBeReachedException();
|
||||
[$tp, $tp2] = [
|
||||
0 => ['전력전', 'tt'],
|
||||
1 => ['통솔전', 'tl'],
|
||||
2 => ['일기토', 'ts'],
|
||||
3 => ['설전', 'ti'],
|
||||
][$tnmt_type] ?? [null, null];
|
||||
if($tp === null || $tp2 === null){
|
||||
throw new MustNotBeReachedException();
|
||||
}
|
||||
|
||||
//16강자 명성 돈
|
||||
@@ -1068,7 +882,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
||||
//포상 장수 이름, 금액
|
||||
$resultHelper[$generalID]['reward'] += $cost;
|
||||
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
|
||||
General::createGeneralObjFromDB($generalID)->increaseInheritancePoint('tournament', 10);
|
||||
General::createGeneralObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
|
||||
}
|
||||
//결승자 명성 돈
|
||||
$cost = $admin['develcost'] * 6;
|
||||
@@ -1113,7 +927,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
||||
}
|
||||
|
||||
//자동진행 끝
|
||||
$gameStor->tnmt_auto = 0;
|
||||
$gameStor->tnmt_auto = false;
|
||||
|
||||
//장수열전 기록
|
||||
/** @var ActionLogger */
|
||||
@@ -1140,39 +954,19 @@ function setGift($tnmt_type, $tnmt, $phase)
|
||||
$logger = $general['logger'];
|
||||
$logger->pushGeneralActionLog("<C>{$tp}</> 대회의 {$general['msg']}로 <C>{$rewardText}</>의 <S>상금</>, 약간의 <S>명성</> 획득!", ActionLogger::EVENT_PLAIN);
|
||||
//TODO: 토너먼트의 다른 값이 모두 sql에 직접 입력하므로 기반을 바꿔야함.
|
||||
$generalObjList[$generalID]->increaseInheritancePoint('tournament', $general['inheritance_point']);
|
||||
$generalObjList[$generalID]->increaseInheritancePoint(InheritanceKey::tournament, $general['inheritance_point']);
|
||||
}
|
||||
|
||||
//우승자 번호
|
||||
$winnerGrp = $resultHelper[$winner['no']]['grp'];
|
||||
$winnerGrpNo = $resultHelper[$winner['no']]['grp_no'];
|
||||
$winnerSlot = ($winnerGrp - 20) * 2 + $winnerGrpNo;
|
||||
|
||||
//당첨칸에 베팅한 사람들만
|
||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
|
||||
$globalBet = array_splice($globalBet, -16);
|
||||
$globalBetTotal = array_sum($globalBet);
|
||||
$rewardRate = round($globalBetTotal / max($globalBet[$winnerSlot], 1), 2);
|
||||
|
||||
$betKey = "bet{$winnerSlot}";
|
||||
$gambleResult = Util::convertArrayToDict($db->query('SELECT general_id, %b as bet FROM betting WHERE %b > 0 AND general_id > 0', $betKey, $betKey), 'general_id');
|
||||
|
||||
foreach (General::createGeneralObjListFromDB(Util::squeezeFromArray($gambleResult, 'general_id'), ['gold', 'npc'], 1) as $gambler) {
|
||||
$reward = Util::round($gambleResult[$gambler->getID()]['bet'] * $rewardRate);
|
||||
$gambler->increaseVar('gold', $reward);
|
||||
if (($gambler->getNPCType() == 0) || ($gambler->getNPCType() == 1 && $gambler->getRankVar('betgold', 0) > 0)) {
|
||||
$gambler->increaseRankVar('betwingold', $reward);
|
||||
$gambler->increaseRankVar('betwin', 1);
|
||||
}
|
||||
$rewardText = number_format($reward);
|
||||
$gambler->getLogger()->pushGeneralActionLog("<C>{$tp}</> 대회의 베팅 당첨으로 <C>{$rewardText}</>의 <S>금</> 획득!", ActionLogger::EVENT_PLAIN);
|
||||
$gambler->applyDB($db);
|
||||
}
|
||||
$bettingID = $gameStor->last_tournament_betting_id;
|
||||
$betting = new Betting($bettingID);
|
||||
$betting->giveReward([$winner['no']]);
|
||||
}
|
||||
|
||||
function setRefund()
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
//16강자 명성 돈
|
||||
@@ -1183,12 +977,16 @@ function setRefund()
|
||||
], 'no IN %li', $generalIDList);
|
||||
|
||||
//베팅금 환수
|
||||
$db->update(['general', [
|
||||
'gold' => $db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
|
||||
]], true);
|
||||
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||
if ($bettingID != 0) {
|
||||
$betting = new Betting($bettingID);
|
||||
if (!$betting->getInfo()->finished) {
|
||||
$betting->giveReward([-1]);
|
||||
}
|
||||
}
|
||||
|
||||
//자동진행 끝
|
||||
$gameStor->tnmt_auto = 0;
|
||||
$gameStor->tnmt_auto = false;
|
||||
}
|
||||
|
||||
//10차이 1.1, 50 차이 1.17, 100차이 1.2
|
||||
@@ -1219,19 +1017,15 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
|
||||
$turn = 100;
|
||||
}
|
||||
|
||||
[$tp, $tp2] = [
|
||||
0 => ['total', 'tt'],
|
||||
1 => ['leadership', 'tl'],
|
||||
2 => ['strength', 'ts'],
|
||||
3 => ['intel', 'ti'],
|
||||
][$tnmt_type] ?? [null, null];
|
||||
|
||||
if ($tnmt_type == 1) {
|
||||
$tp = "leadership";
|
||||
$tp2 = "tl";
|
||||
} elseif ($tnmt_type == 2) {
|
||||
$tp = "strength";
|
||||
$tp2 = "ts";
|
||||
} elseif ($tnmt_type == 3) {
|
||||
$tp = "intel";
|
||||
$tp2 = "ti";
|
||||
} else /*$tnmt_type == 0*/ {
|
||||
$tp = "total";
|
||||
$tp2 = "tt";
|
||||
if($tp === null || $tp2 === null){
|
||||
throw new MustNotBeReachedException($tnmt_type);
|
||||
}
|
||||
|
||||
$e1 = $energy1 = Util::round($gen1[$tp] * getLog($gen1['lvl'], $gen2['lvl']) * 10);
|
||||
@@ -1338,303 +1132,70 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
|
||||
} // 10~50
|
||||
$critical1 = 0;
|
||||
$critical2 = 0;
|
||||
|
||||
$crticialSkillMap = [
|
||||
0 => ['전력', '집중'],
|
||||
1 => ['봉시진', '어린진'],
|
||||
2 => ['삼단', '나선'],
|
||||
3 => ['독설', '논파'],
|
||||
];
|
||||
$fatalitySkillMap = [
|
||||
0 => '압도',
|
||||
1 => '팔문금쇄진',
|
||||
2 => '일격 필살',
|
||||
3 => '모독 욕설'
|
||||
];
|
||||
$skillMap = [
|
||||
0 => ['참격', '집중', '역공', '반격', '선제', '도발'],
|
||||
1 => ['추행진', '학익진', '장사진', '형액진', '기형진', '구행진'],
|
||||
2 => ['기합', '기염', '반격', '역공', '삼단', '나선'],
|
||||
3 => ['논파', '항변', '반론', '반박', '도발', '면박'],
|
||||
];
|
||||
|
||||
//막판 분노
|
||||
$ratio = rand() % 300;
|
||||
if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) {
|
||||
$damage2 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
|
||||
$critical1 = 1;
|
||||
if ($tnmt_type == 0) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "전력";
|
||||
break;
|
||||
case 1:
|
||||
$str = "집중";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 1) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "봉시진";
|
||||
break;
|
||||
case 1:
|
||||
$str = "어린진";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 2) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "삼단";
|
||||
break;
|
||||
case 1:
|
||||
$str = "나선";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 3) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "독설";
|
||||
break;
|
||||
case 1:
|
||||
$str = "논파";
|
||||
break;
|
||||
}
|
||||
}
|
||||
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!";
|
||||
}
|
||||
$ratio = rand() % 300;
|
||||
if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) {
|
||||
$damage1 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
|
||||
$critical2 = 1;
|
||||
if ($tnmt_type == 0) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "전력";
|
||||
break;
|
||||
case 1:
|
||||
$str = "집중";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 1) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "봉시진";
|
||||
break;
|
||||
case 1:
|
||||
$str = "어린진";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 2) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "삼단";
|
||||
break;
|
||||
case 1:
|
||||
$str = "나선";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 3) {
|
||||
switch (rand() % 2) {
|
||||
case 0:
|
||||
$str = "독설";
|
||||
break;
|
||||
case 1:
|
||||
$str = "논파";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!";
|
||||
}
|
||||
//1합 승부
|
||||
if ($phase == 1) {
|
||||
|
||||
$ratio = rand() % 400;
|
||||
if ($gen1[$tp] * 0.9 > $gen2[$tp] && $gen1[$tp] >= $ratio) {
|
||||
$damage1 = 0;
|
||||
$damage2 = $e2;
|
||||
if ($tnmt_type == 0) {
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>압도</>!";
|
||||
} elseif ($tnmt_type == 1) {
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>팔문금쇄진</>!";
|
||||
} elseif ($tnmt_type == 2) {
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>일격 필살</>!";
|
||||
} elseif ($tnmt_type == 3) {
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>모독 욕설</>!";
|
||||
}
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>{$fatalitySkillMap[$tnmt_type]}</>!";
|
||||
}
|
||||
if ($gen2[$tp] * 0.9 > $gen1[$tp] && $gen2[$tp] >= $ratio) {
|
||||
$damage2 = 0;
|
||||
$damage1 = $e1;
|
||||
if ($tnmt_type == 0) {
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>압도</>!";
|
||||
} elseif ($tnmt_type == 1) {
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>팔문금쇄진</>!";
|
||||
} elseif ($tnmt_type == 2) {
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>일격 필살</>!";
|
||||
} elseif ($tnmt_type == 3) {
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>모독 욕설</>!";
|
||||
}
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>{$fatalitySkillMap[$tnmt_type]}</>!";
|
||||
}
|
||||
} else {
|
||||
|
||||
$ratio = rand() % 1000;
|
||||
if ($critical1 == 0 && $gen1[$tp] >= $ratio) {
|
||||
$damage2 *= Util::randRangeInt(150, 300) / 100; // 150 ~ 300%
|
||||
$critical1 = 1;
|
||||
if ($tnmt_type == 0) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "참격";
|
||||
break;
|
||||
case 1:
|
||||
$str = "집중";
|
||||
break;
|
||||
case 2:
|
||||
$str = "역공";
|
||||
break;
|
||||
case 3:
|
||||
$str = "반격";
|
||||
break;
|
||||
case 4:
|
||||
$str = "선제";
|
||||
break;
|
||||
case 5:
|
||||
$str = "도발";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 1) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "추행진";
|
||||
break;
|
||||
case 1:
|
||||
$str = "학익진";
|
||||
break;
|
||||
case 2:
|
||||
$str = "장사진";
|
||||
break;
|
||||
case 3:
|
||||
$str = "형액진";
|
||||
break;
|
||||
case 4:
|
||||
$str = "기형진";
|
||||
break;
|
||||
case 5:
|
||||
$str = "구행진";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 2) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "기합";
|
||||
break;
|
||||
case 1:
|
||||
$str = "기염";
|
||||
break;
|
||||
case 2:
|
||||
$str = "반격";
|
||||
break;
|
||||
case 3:
|
||||
$str = "역공";
|
||||
break;
|
||||
case 4:
|
||||
$str = "삼단";
|
||||
break;
|
||||
case 5:
|
||||
$str = "나선";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 3) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "논파";
|
||||
break;
|
||||
case 1:
|
||||
$str = "항변";
|
||||
break;
|
||||
case 2:
|
||||
$str = "반론";
|
||||
break;
|
||||
case 3:
|
||||
$str = "반박";
|
||||
break;
|
||||
case 4:
|
||||
$str = "도발";
|
||||
break;
|
||||
case 5:
|
||||
$str = "면박";
|
||||
break;
|
||||
}
|
||||
}
|
||||
$str = Util::choiceRandom($skillMap[$tnmt_type]);
|
||||
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>{$str}</>!";
|
||||
}
|
||||
$ratio = rand() % 1000;
|
||||
if ($critical2 == 0 && $gen2[$tp] >= $ratio) {
|
||||
$damage1 *= Util::randRangeInt(150, 300) / 100; // 150 ~ 300%
|
||||
$critical2 = 1;
|
||||
if ($tnmt_type == 0) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "참격";
|
||||
break;
|
||||
case 1:
|
||||
$str = "집중";
|
||||
break;
|
||||
case 2:
|
||||
$str = "역공";
|
||||
break;
|
||||
case 3:
|
||||
$str = "반격";
|
||||
break;
|
||||
case 4:
|
||||
$str = "선제";
|
||||
break;
|
||||
case 5:
|
||||
$str = "도발";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 1) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "추행진";
|
||||
break;
|
||||
case 1:
|
||||
$str = "학익진";
|
||||
break;
|
||||
case 2:
|
||||
$str = "장사진";
|
||||
break;
|
||||
case 3:
|
||||
$str = "형액진";
|
||||
break;
|
||||
case 4:
|
||||
$str = "기형진";
|
||||
break;
|
||||
case 5:
|
||||
$str = "구행진";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 2) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "기합";
|
||||
break;
|
||||
case 1:
|
||||
$str = "기염";
|
||||
break;
|
||||
case 2:
|
||||
$str = "반격";
|
||||
break;
|
||||
case 3:
|
||||
$str = "역공";
|
||||
break;
|
||||
case 4:
|
||||
$str = "삼단";
|
||||
break;
|
||||
case 5:
|
||||
$str = "나선";
|
||||
break;
|
||||
}
|
||||
} elseif ($tnmt_type == 3) {
|
||||
switch (rand() % 6) {
|
||||
case 0:
|
||||
$str = "논파";
|
||||
break;
|
||||
case 1:
|
||||
$str = "항변";
|
||||
break;
|
||||
case 2:
|
||||
$str = "반론";
|
||||
break;
|
||||
case 3:
|
||||
$str = "반박";
|
||||
break;
|
||||
case 4:
|
||||
$str = "도발";
|
||||
break;
|
||||
case 5:
|
||||
$str = "면박";
|
||||
break;
|
||||
}
|
||||
}
|
||||
$str = Util::choiceRandom($skillMap[$tnmt_type]);
|
||||
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>{$str}</>!";
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,684 +0,0 @@
|
||||
상성 이름 사진 국가 도시 통 무 지 급 출생 사망 꿈 특기
|
||||
1, "소제1",1001, 0, "낙양", 20, 11, 48, 0, 168, 190, "유지", "-"); $gencount++;
|
||||
1, "헌제",1002, 0, "낙양", 17, 13, 61, 0, 170, 250, "안전", "-", "한 왕조는 이대로 끝나는 것인가..."); $gencount++;
|
||||
999, "사마휘",1003, 0, "양양", 71, 11, 96, 0, 173, 234, "은둔", "신산", "좋지, 좋아~"); $gencount++;
|
||||
999, "우길",1004, 0, "업", 17, 13, 83, 0, 131, 200, "은둔", "신산"); $gencount++;
|
||||
999, "화타",1005, 0, "낙양", 53, 25, 70, 0, 151, 220, "은둔", "의술", "아픈 사람들은 모두 내게 오시오. 껄껄껄."); $gencount++;
|
||||
999, "길평",1006, 0, "허창", 27, 15, 72, 0, 158, 200, "은둔", "의술"); $gencount++;
|
||||
|
||||
29, "가규",1007, 0, "낙양", 55, 55, 74, 0, 177, 231, "재간", "-"); $gencount++;
|
||||
136, "가범",1008, 0, "낙양", 58, 48, 73, 0, 202, 237, "유지", "-"); $gencount++;
|
||||
49, "가비능",1009, 0, "낙양", 58, 83, 32, 0, 172, 235, "정복", "-"); $gencount++;
|
||||
31, "가충",1010, 0, "낙양", 50, 25, 87, 0, 217, 282, "출세", "-"); $gencount++;
|
||||
20, "가후",1011, 0, "낙양", 69, 30, 94, 0, 147, 223, "할거", "귀병"); $gencount++;
|
||||
73, "간옹",1012, 0, "낙양", 31, 33, 70, 0, 164, 225, "안전", "경작"); $gencount++;
|
||||
129, "감녕",1013, 0, "낙양", 78, 95, 71, 0, 174, 222, "출세", "무쌍"); $gencount++;
|
||||
127, "감택",1014, 0, "낙양", 62, 44, 79, 0, 182, 243, "유지", "-"); $gencount++;
|
||||
60, "강단",1015, 0, "낙양", 41, 73, 43, 0, 168, 230, "재간", "-"); $gencount++;
|
||||
73, "강유",1016, 0, "낙양", 95, 90, 94, 0, 202, 264, "왕좌", "집중"); $gencount++;
|
||||
102, "고간",1017, 0, "낙양", 60, 57, 51, 0, 168, 206, "유지", "-"); $gencount++;
|
||||
27, "고람",1018, 0, "낙양", 72, 67, 59, 0, 159, 201, "출세", "기병"); $gencount++;
|
||||
69, "고상",1019, 0, "낙양", 41, 40, 38, 0, 194, 252, "재간", "-"); $gencount++;
|
||||
144, "고순",1020, 0, "낙양", 79, 82, 65, 0, 162, 198, "의협", "기병"); $gencount++;
|
||||
7, "고승",1021, 0, "낙양", 42, 73, 24, 0, 145, 185, "출세", "-"); $gencount++;
|
||||
120, "고옹",1022, 0, "낙양", 57, 21, 79, 0, 168, 243, "출세", "-"); $gencount++;
|
||||
63, "고정",1023, 0, "낙양", 67, 65, 55, 0, 190, 251, "정복", "-"); $gencount++;
|
||||
53, "고패",1024, 0, "낙양", 53, 56, 28, 0, 170, 212, "유지", "-"); $gencount++;
|
||||
74, "공도",1025, 0, "낙양", 26, 73, 19, 0, 164, 200, "재간", "-"); $gencount++;
|
||||
142, "공손강",1026, 0, "낙양", 64, 72, 61, 0, 172, 210, "정복", "-"); $gencount++;
|
||||
142, "공손공",1027, 0, "낙양", 68, 41, 75, 0, 174, 238, "정복", "-"); $gencount++;
|
||||
142, "공손도",1028, 0, "낙양", 62, 72, 41, 0, 154, 204, "정복", "기병"); $gencount++;
|
||||
65, "공손범",1029, 0, "낙양", 61, 67, 61, 0, 158, 199, "출세", "-"); $gencount++;
|
||||
65, "공손속",1030, 0, "낙양", 60, 76, 41, 0, 176, 199, "정복", "-"); $gencount++;
|
||||
10, "공손연",1031, 0, "낙양", 74, 79, 64, 0, 205, 238, "패권", "돌격"); $gencount++;
|
||||
65, "공손월",1032, 0, "낙양", 47, 63, 46, 0, 160, 192, "정복", "-"); $gencount++;
|
||||
65, "공손찬",1033, 0, "낙양", 61, 87, 67, 0, 152, 199, "패권", "기병"); $gencount++;
|
||||
43, "공융",1034, 0, "낙양", 63, 48, 85, 0, 153, 208, "왕좌", "경작"); $gencount++;
|
||||
35, "공주",1035, 0, "낙양", 64, 35, 78, 0, 151, 194, "재간", "-"); $gencount++;
|
||||
83, "공지",1036, 0, "낙양", 57, 54, 64, 0, 178, 242, "대의", "-"); $gencount++;
|
||||
26, "곽가",1037, 0, "낙양", 47, 23, 99, 0, 170, 207, "패권", "귀모"); $gencount++;
|
||||
111, "곽도",1038, 0, "낙양", 63, 67, 81, 0, 155, 205, "재간", "-"); $gencount++;
|
||||
2, "곽사",1039, 0, "낙양", 58, 67, 31, 0, 146, 197, "패권", "-"); $gencount++;
|
||||
80, "곽유지",1040, 0, "낙양", 37, 22, 71, 0, 190, 259, "재간", "상재"); $gencount++;
|
||||
67, "곽익",1041, 0, "낙양", 67, 60, 67, 0, 207, 270, "재간", "-"); $gencount++;
|
||||
67, "곽준",1042, 0, "낙양", 76, 69, 73, 0, 178, 217, "출세", "-"); $gencount++;
|
||||
27, "곽혁",1043, 0, "낙양", 40, 29, 80, 0, 187, 228, "안전", "-"); $gencount++;
|
||||
20, "곽회",1044, 0, "낙양", 77, 75, 71, 0, 187, 255, "정복", "-"); $gencount++;
|
||||
39, "관구검",1045, 0, "낙양", 72, 68, 77, 0, 202, 255, "대의", "-"); $gencount++;
|
||||
76, "관색",1046, 0, "낙양", 69, 85, 67, 0, 200, 239, "의협", "징병"); $gencount++;
|
||||
76, "관우",1047, 0, "낙양", 96, 98, 80, 0, 162, 219, "의협", "위압"); $gencount++;
|
||||
76, "관이",1048, 0, "낙양", 48, 60, 58, 0, 219, 263, "안전", "-"); $gencount++;
|
||||
76, "관통",1049, 0, "낙양", 49, 63, 60, 0, 218, 259, "대의", "-"); $gencount++;
|
||||
76, "관평",1050, 0, "낙양", 77, 80, 70, 0, 186, 219, "의협", "보병"); $gencount++;
|
||||
7, "관해",1051, 0, "낙양", 66, 90, 35, 0, 160, 193, "출세", "-"); $gencount++;
|
||||
76, "관흥",1052, 0, "낙양", 69, 84, 72, 0, 199, 234, "의협", "돌격"); $gencount++;
|
||||
40, "괴량",1053, 0, "낙양", 41, 28, 81, 0, 155, 204, "안전", "신중"); $gencount++;
|
||||
40, "괴월",1054, 0, "낙양", 26, 30, 84, 0, 157, 214, "유지", "귀병"); $gencount++;
|
||||
98, "교모",1055, 0, "낙양", 59, 58, 61, 0, 150, 191, "안전", "-"); $gencount++;
|
||||
98, "교현",1056, 0, "낙양", 50, 18, 60, 0, 158, 210, "재간", "-"); $gencount++;
|
||||
6, "구역거",1057, 0, "낙양", 51, 72, 49, 0, 152, 193, "안전", "-"); $gencount++;
|
||||
80, "극정",1058, 0, "낙양", 38, 25, 75, 0, 208, 278, "유지", "-"); $gencount++;
|
||||
46, "금선",1059, 0, "낙양", 55, 49, 36, 0, 155, 208, "할거", "-"); $gencount++;
|
||||
62, "금환삼결",1060, 0, "낙양", 46, 76, 17, 0, 192, 225, "출세", "-"); $gencount++;
|
||||
141, "기령",1061, 0, "낙양", 76, 81, 33, 0, 155, 199, "대의", "무쌍"); $gencount++;
|
||||
122, "낙통",1062, 0, "낙양", 57, 44, 69, 0, 193, 228, "유지", "-"); $gencount++;
|
||||
124, "노숙1",1063, 0, "낙양", 90, 42, 94, 0, 172, 217, "왕좌", "상재"); $gencount++;
|
||||
75, "노식",1064, 0, "낙양", 91, 54, 80, 0, 139, 192, "왕좌", "징병"); $gencount++;
|
||||
59, "뇌동",1065, 0, "낙양", 70, 77, 45, 0, 172, 218, "출세", "궁병"); $gencount++;
|
||||
142, "뇌박",1066, 0, "낙양", 54, 54, 33, 0, 157, 206, "유지", "-"); $gencount++;
|
||||
127, "능조",1067, 0, "낙양", 67, 80, 44, 0, 165, 203, "재간", "공성"); $gencount++;
|
||||
127, "능통",1068, 0, "낙양", 71, 78, 58, 0, 189, 237, "의협", "궁병"); $gencount++;
|
||||
64, "단경",1069, 0, "낙양", 68, 61, 68, 0, 156, 199, "정복", "-"); $gencount++;
|
||||
132, "담웅",1070, 0, "낙양", 52, 77, 19, 0, 188, 221, "출세", "-"); $gencount++;
|
||||
99, "답둔",1071, 0, "낙양", 59, 71, 31, 0, 158, 207, "유지", "-"); $gencount++;
|
||||
132, "당자",1072, 0, "낙양", 59, 56, 45, 0, 196, 265, "안전", "-"); $gencount++;
|
||||
60, "대래동주",1073, 0, "낙양", 40, 65, 24, 0, 195, 249, "안전", "-"); $gencount++;
|
||||
82, "도겸",1074, 0, "낙양", 51, 32, 61, 0, 132, 194, "할거", "인덕"); $gencount++;
|
||||
120, "도준",1075, 0, "낙양", 64, 57, 50, 0, 238, 285, "안전", "-"); $gencount++;
|
||||
73, "동궐",1076, 0, "낙양", 66, 50, 76, 0, 204, 271, "대의", "-"); $gencount++;
|
||||
62, "동다나",1077, 0, "낙양", 51, 71, 27, 0, 189, 225, "유지", "-"); $gencount++;
|
||||
2, "동민",1078, 0, "낙양", 52, 65, 49, 0, 149, 192, "안전", "-"); $gencount++;
|
||||
21, "동소",1079, 0, "낙양", 46, 46, 62, 0, 156, 236, "패권", "-"); $gencount++;
|
||||
127, "동습",1080, 0, "낙양", 53, 64, 32, 0, 169, 215, "출세", "-"); $gencount++;
|
||||
89, "동승",1081, 0, "낙양", 75, 66, 65, 0, 154, 200, "왕좌", "-"); $gencount++;
|
||||
78, "동윤",1082, 0, "낙양", 64, 26, 78, 0, 192, 246, "왕좌", "-"); $gencount++;
|
||||
2, "동탁",1083, 0, "낙양", 87, 91, 54, 0, 139, 192, "패권", "기병"); $gencount++;
|
||||
66, "동화",1084, 0, "낙양", 48, 64, 53, 0, 168, 219, "대의", "-"); $gencount++;
|
||||
32, "두예",1085, 0, "낙양", 88, 80, 84, 0, 222, 284, "정복", "-"); $gencount++;
|
||||
7, "등무",1086, 0, "낙양", 43, 74, 19, 0, 147, 185, "정복", "-"); $gencount++;
|
||||
41, "등애",1087, 0, "낙양", 94, 82, 92, 0, 197, 264, "패권", "신산"); $gencount++;
|
||||
116, "등윤",1088, 0, "낙양", 34, 42, 68, 0, 194, 256, "안전", "-"); $gencount++;
|
||||
73, "등지",1089, 0, "낙양", 74, 51, 80, 0, 182, 251, "할거", "경작"); $gencount++;
|
||||
41, "등충",1090, 0, "낙양", 60, 82, 55, 0, 230, 264, "출세", "-"); $gencount++;
|
||||
54, "등현",1091, 0, "낙양", 65, 59, 61, 0, 188, 248, "출세", "-"); $gencount++;
|
||||
29, "마균",1092, 0, "낙양", 33, 38, 80, 0, 200, 259, "안전", "-"); $gencount++;
|
||||
71, "마대",1093, 0, "낙양", 77, 79, 49, 0, 183, 246, "대의", "기병"); $gencount++;
|
||||
70, "마등",1094, 0, "낙양", 80, 87, 56, 0, 149, 211, "왕좌", "기병"); $gencount++;
|
||||
80, "마속",1095, 0, "낙양", 73, 64, 82, 0, 190, 228, "패권", "집중"); $gencount++;
|
||||
77, "마량",1096, 0, "낙양", 57, 25, 87, 0, 187, 225, "왕좌", "-"); $gencount++;
|
||||
48, "마완",1097, 0, "낙양", 49, 64, 26, 0, 170, 211, "안전", "기병"); $gencount++;
|
||||
19, "마준",1098, 0, "낙양", 45, 63, 62, 0, 196, 260, "안전", "-"); $gencount++;
|
||||
71, "마철",1099, 0, "낙양", 71, 60, 31, 0, 179, 211, "대의", "기병"); $gencount++;
|
||||
70, "마초",1100, 0, "낙양", 78, 97, 40, 0, 176, 226, "대의", "기병"); $gencount++;
|
||||
131, "마충1",1101, 0, "낙양", 67, 62, 51, 0, 186, 222, "재간", "-"); $gencount++;
|
||||
69, "마충2",1102, 0, "낙양", 61, 68, 51, 0, 187, 249, "출세", "-"); $gencount++;
|
||||
71, "마휴",1103, 0, "낙양", 71, 60, 32, 0, 178, 211, "대의", "기병"); $gencount++;
|
||||
116, "만총",1104, 0, "낙양", 79, 40, 78, 0, 170, 242, "할거", "신중"); $gencount++;
|
||||
51, "망아장",1105, 0, "낙양", 29, 64, 20, 0, 191, 225, "출세", "-"); $gencount++;
|
||||
44, "맹달",1106, 0, "낙양", 70, 66, 72, 0, 172, 228, "할거", "귀병"); $gencount++;
|
||||
60, "맹우",1107, 0, "낙양", 63, 79, 26, 0, 190, 251, "정복", "-"); $gencount++;
|
||||
60, "맹획",1108, 0, "낙양", 78, 92, 50, 0, 186, 245, "왕좌", "격노"); $gencount++;
|
||||
29, "모개",1109, 0, "낙양", 46, 56, 56, 0, 161, 216, "대의", "-"); $gencount++;
|
||||
51, "목록대왕",1110, 0, "낙양", 58, 71, 65, 0, 184, 225, "재간", "척사"); $gencount++;
|
||||
96, "목순",1111, 0, "낙양", 17, 21, 68, 0, 157, 191, "왕좌", "-"); $gencount++;
|
||||
43, "무안국",1112, 0, "낙양", 51, 73, 18, 0, 156, 191, "재간", "-"); $gencount++;
|
||||
28, "문빙",1113, 0, "낙양", 70, 77, 43, 0, 178, 237, "유지", "-"); $gencount++;
|
||||
38, "문앙",1114, 0, "낙양", 71, 91, 46, 0, 222, 285, "대의", "-"); $gencount++;
|
||||
102, "문추",1115, 0, "낙양", 72, 94, 25, 0, 161, 200, "출세", "무쌍"); $gencount++;
|
||||
38, "문흠",1116, 0, "낙양", 76, 77, 43, 0, 200, 258, "대의", "-"); $gencount++;
|
||||
49, "미당대왕",1117, 0, "낙양", 64, 75, 32, 0, 202, 260, "유지", "-"); $gencount++;
|
||||
108, "미방",1118, 0, "낙양", 58, 65, 37, 0, 169, 222, "패권", "징병"); $gencount++;
|
||||
77, "미축",1119, 0, "낙양", 26, 30, 65, 0, 165, 220, "왕좌", "상재"); $gencount++;
|
||||
94, "반봉",1120, 0, "낙양", 61, 75, 17, 0, 155, 191, "출세", "-"); $gencount++;
|
||||
44, "반준",1121, 0, "낙양", 41, 21, 67, 0, 174, 239, "안전", "-"); $gencount++;
|
||||
65, "방덕",1122, 0, "낙양", 76, 90, 67, 0, 170, 219, "의협", "기병"); $gencount++;
|
||||
73, "방통",1123, 0, "낙양", 86, 41, 97, 0, 179, 214, "패권", "반계"); $gencount++;
|
||||
65, "방회",1124, 0, "낙양", 25, 33, 59, 0, 205, 272, "안전", "-"); $gencount++;
|
||||
68, "배원소",1125, 0, "낙양", 45, 69, 33, 0, 169, 200, "재간", "-"); $gencount++;
|
||||
78, "번건",1126, 0, "낙양", 28, 31, 68, 0, 205, 270, "대의", "-"); $gencount++;
|
||||
149, "번주",1127, 0, "낙양", 67, 77, 21, 0, 149, 192, "할거", "-"); $gencount++;
|
||||
72, "법정",1128, 0, "낙양", 81, 29, 93, 0, 176, 220, "패권", "신산"); $gencount++;
|
||||
8, "변희",1129, 0, "낙양", 65, 65, 27, 0, 169, 200, "안전", "-"); $gencount++;
|
||||
121, "보질",1130, 0, "낙양", 58, 28, 77, 0, 177, 247, "유지", "-"); $gencount++;
|
||||
113, "복양흥",1131, 0, "낙양", 58, 51, 71, 0, 224, 264, "유지", "-"); $gencount++;
|
||||
110, "봉기",1132, 0, "낙양", 68, 52, 80, 0, 153, 202, "패권", "집중"); $gencount++;
|
||||
74, "부동",1133, 0, "낙양", 58, 69, 69, 0, 183, 222, "대의", "-"); $gencount++;
|
||||
108, "부사인",1134, 0, "낙양", 54, 59, 51, 0, 182, 222, "출세", "-"); $gencount++;
|
||||
38, "부손",1135, 0, "낙양", 24, 43, 68, 0, 162, 230, "안전", "-"); $gencount++;
|
||||
74, "부첨",1136, 0, "낙양", 61, 74, 45, 0, 216, 263, "대의", "-"); $gencount++;
|
||||
66, "비시",1137, 0, "낙양", 18, 36, 61, 0, 176, 240, "재간", "-"); $gencount++;
|
||||
141, "비연",1138, 0, "낙양", 66, 65, 53, 0, 196, 238, "출세", "-"); $gencount++;
|
||||
77, "비위",1139, 0, "낙양", 72, 26, 73, 0, 193, 253, "대의", "-"); $gencount++;
|
||||
144, "사광",1140, 0, "낙양", 57, 49, 66, 0, 175, 235, "안전", "-"); $gencount++;
|
||||
71, "사마가",1141, 0, "낙양", 61, 85, 18, 0, 167, 222, "정복", "돌격"); $gencount++;
|
||||
20, "사마랑",1142, 0, "낙양", 25, 32, 63, 0, 171, 217, "대의", "-"); $gencount++;
|
||||
24, "사마망",1143, 0, "낙양", 71, 61, 65, 0, 205, 271, "정복", "-"); $gencount++;
|
||||
24, "사마부",1144, 0, "낙양", 55, 31, 73, 0, 180, 272, "대의", "-"); $gencount++;
|
||||
31, "사마사",1145, 0, "낙양", 87, 64, 91, 0, 208, 255, "정복", "-"); $gencount++;
|
||||
31, "사마소",1146, 0, "낙양", 93, 63, 84, 0, 211, 265, "정복", "-"); $gencount++;
|
||||
31, "사마염",1147, 0, "낙양", 92, 78, 72, 0, 236, 290, "패권", "-"); $gencount++;
|
||||
30, "사마유",1148, 0, "낙양", 62, 45, 79, 0, 248, 283, "왕좌", "-"); $gencount++;
|
||||
31, "사마의",1149, 0, "낙양", 98, 67, 98, 0, 179, 251, "패권", "반계"); $gencount++;
|
||||
139, "사섭",1150, 0, "낙양", 63, 61, 71, 0, 137, 226, "안전", "-"); $gencount++;
|
||||
139, "사일",1151, 0, "낙양", 59, 44, 68, 0, 153, 230, "유지", "-"); $gencount++;
|
||||
132, "사정",1152, 0, "낙양", 67, 71, 20, 0, 178, 221, "안전", "-"); $gencount++;
|
||||
146, "사지",1153, 0, "낙양", 61, 49, 70, 0, 163, 227, "안전", "-"); $gencount++;
|
||||
144, "사휘",1154, 0, "낙양", 67, 71, 61, 0, 165, 227, "유지", "-"); $gencount++;
|
||||
35, "서막",1155, 0, "낙양", 56, 41, 72, 0, 171, 249, "유지", "-"); $gencount++;
|
||||
76, "서서",1156, 0, "낙양", 90, 70, 96, 0, 178, 232, "의협", "귀병"); $gencount++;
|
||||
124, "서성",1157, 0, "낙양", 83, 76, 83, 0, 177, 234, "대의", "-"); $gencount++;
|
||||
142, "서영",1158, 0, "낙양", 47, 63, 33, 0, 147, 191, "안전", "-"); $gencount++;
|
||||
23, "서질",1159, 0, "낙양", 55, 73, 34, 0, 207, 253, "재간", "-"); $gencount++;
|
||||
23, "서황",1160, 0, "낙양", 79, 89, 68, 0, 165, 228, "의협", "필살"); $gencount++;
|
||||
32, "석포",1161, 0, "낙양", 71, 63, 59, 0, 214, 272, "정복", "-"); $gencount++;
|
||||
131, "설영",1162, 0, "낙양", 46, 23, 64, 0, 223, 282, "유지", "-"); $gencount++;
|
||||
128, "설종",1163, 0, "낙양", 27, 33, 67, 0, 187, 243, "유지", "-"); $gencount++;
|
||||
69, "성의",1164, 0, "낙양", 45, 64, 22, 0, 168, 211, "재간", "-"); $gencount++;
|
||||
129, "소비",1165, 0, "낙양", 67, 63, 49, 0, 172, 221, "대의", "-"); $gencount++;
|
||||
76, "손건",1166, 0, "낙양", 42, 33, 73, 0, 165, 215, "대의", null); $gencount++;
|
||||
125, "손견",1167, 0, "낙양", 96, 95, 76, 0, 156, 192, "왕좌", "무쌍"); $gencount++;
|
||||
126, "손광",1168, 0, "낙양", 63, 54, 58, 0, 186, 207, "유지", "-"); $gencount++;
|
||||
125, "손권",1169, 0, "낙양", 90, 77, 83, 0, 182, 252, "할거", "수비"); $gencount++;
|
||||
126, "손랑",1170, 0, "낙양", 27, 54, 28, 0, 187, 226, "안전", "-"); $gencount++;
|
||||
126, "손등",1171, 0, "낙양", 52, 39, 77, 0, 209, 241, "할거", "-"); $gencount++;
|
||||
125, "손량",1172, 0, "낙양", 24, 23, 79, 0, 243, 260, "할거", "-"); $gencount++;
|
||||
20, "손례",1173, 0, "낙양", 64, 64, 69, 0, 180, 250, "안전", "-"); $gencount++;
|
||||
124, "손소",1174, 0, "낙양", 76, 80, 68, 0, 188, 241, "정복", "-"); $gencount++;
|
||||
130, "손수",1175, 0, "낙양", 67, 57, 59, 0, 235, 299, "안전", "-"); $gencount++;
|
||||
126, "손유",1176, 0, "낙양", 77, 60, 67, 0, 177, 215, "정복", "-"); $gencount++;
|
||||
122, "손이",1177, 0, "낙양", 57, 62, 57, 0, 223, 272, "안전", "-"); $gencount++;
|
||||
126, "손정",1178, 0, "낙양", 59, 56, 62, 0, 160, 206, "유지", "-"); $gencount++;
|
||||
115, "손준",1179, 0, "낙양", 59, 69, 51, 0, 219, 256, "정복", "-"); $gencount++;
|
||||
7, "손중",1180, 0, "낙양", 53, 63, 24, 0, 154, 185, "안전", "-"); $gencount++;
|
||||
125, "손책",1181, 0, "낙양", 96, 96, 78, 0, 175, 200, "패권", "필살"); $gencount++;
|
||||
115, "손침",1182, 0, "낙양", 49, 71, 40, 0, 231, 258, "패권", "-"); $gencount++;
|
||||
114, "손호",1183, 0, "낙양", 20, 78, 67, 0, 242, 284, "패권", "-"); $gencount++;
|
||||
126, "손화",1184, 0, "낙양", 35, 25, 71, 0, 224, 253, "왕좌", "-"); $gencount++;
|
||||
127, "손환",1185, 0, "낙양", 79, 65, 70, 0, 197, 228, "정복", "-"); $gencount++;
|
||||
126, "손휴",1186, 0, "낙양", 63, 43, 64, 0, 235, 264, "정복", "-"); $gencount++;
|
||||
117, "손흠",1187, 0, "낙양", 66, 63, 33, 0, 235, 280, "정복", "-"); $gencount++;
|
||||
147, "송헌",1188, 0, "낙양", 42, 63, 41, 0, 157, 200, "안전", "-"); $gencount++;
|
||||
95, "순우경",1189, 0, "낙양", 72, 67, 60, 0, 146, 200, "할거", "-"); $gencount++;
|
||||
22, "순욱1",1190, 0, "낙양", 54, 29, 97, 0, 163, 212, "왕좌", "집중"); $gencount++;
|
||||
22, "순유",1191, 0, "낙양", 73, 41, 90, 0, 157, 214, "대의", "신중"); $gencount++;
|
||||
29, "신비",1192, 0, "낙양", 47, 28, 74, 0, 171, 240, "재간", "-"); $gencount++;
|
||||
37, "신의",1193, 0, "낙양", 55, 61, 51, 0, 190, 252, "출세", "-"); $gencount++;
|
||||
37, "신탐",1194, 0, "낙양", 56, 58, 57, 0, 188, 254, "출세", "-"); $gencount++;
|
||||
85, "신평",1195, 0, "낙양", 68, 51, 75, 0, 165, 204, "왕좌", "-"); $gencount++;
|
||||
102, "심배",1196, 0, "낙양", 75, 66, 68, 0, 156, 204, "패권", "귀병"); $gencount++;
|
||||
126, "심영",1197, 0, "낙양", 53, 72, 51, 0, 235, 280, "재간", "-"); $gencount++;
|
||||
47, "아하소과",1198, 0, "낙양", 53, 75, 15, 0, 204, 253, "안전", "척사"); $gencount++;
|
||||
62, "아회남",1199, 0, "낙양", 50, 74, 30, 0, 190, 225, "출세", "척사"); $gencount++;
|
||||
23, "악진",1200, 0, "낙양", 73, 67, 56, 0, 159, 218, "대의", "돌격"); $gencount++;
|
||||
23, "악침",1201, 0, "낙양", 45, 52, 33, 0, 196, 257, "대의", "-"); $gencount++;
|
||||
63, "악환",1202, 0, "낙양", 54, 82, 55, 0, 196, 251, "재간", "-"); $gencount++;
|
||||
102, "안량",1203, 0, "낙양", 73, 93, 36, 0, 160, 200, "출세", "위압"); $gencount++;
|
||||
14, "양백",1204, 0, "낙양", 55, 54, 53, 0, 171, 214, "안전", "-"); $gencount++;
|
||||
92, "양봉1",1205, 0, "낙양", 57, 64, 36, 0, 153, 197, "유지", "-"); $gencount++;
|
||||
91, "양봉2",1206, 0, "낙양", 62, 78, 61, 0, 191, 252, "정복", "-"); $gencount++;
|
||||
13, "양송",1207, 0, "낙양", 15, 35, 34, 0, 167, 215, "안전", "-"); $gencount++;
|
||||
43, "양수",1208, 0, "낙양", 18, 31, 91, 0, 175, 219, "재간", "귀병"); $gencount++;
|
||||
61, "양의",1209, 0, "낙양", 67, 56, 71, 0, 190, 235, "유지", "-"); $gencount++;
|
||||
141, "양조1",1210, 0, "낙양", 68, 54, 60, 0, 202, 256, "출세", "-"); $gencount++;
|
||||
9, "양추1",1211, 0, "낙양", 51, 67, 16, 0, 159, 199, "정복", "-"); $gencount++;
|
||||
31, "양호",1212, 0, "낙양", 91, 69, 80, 0, 221, 278, "패권", "-"); $gencount++;
|
||||
53, "양회",1213, 0, "낙양", 60, 67, 40, 0, 167, 212, "출세", "-"); $gencount++;
|
||||
141, "양흥",1214, 0, "낙양", 52, 68, 17, 0, 169, 211, "안전", "-"); $gencount++;
|
||||
6, "어부라",1215, 0, "낙양", 78, 80, 61, 0, 150, 195, "정복", "-"); $gencount++;
|
||||
64, "엄강",1216, 0, "낙양", 57, 65, 44, 0, 163, 192, "재간", "-"); $gencount++;
|
||||
10, "엄백호",1217, 0, "낙양", 48, 68, 30, 0, 150, 197, "할거", "-"); $gencount++;
|
||||
10, "엄여",1218, 0, "낙양", 35, 66, 24, 0, 153, 197, "할거", "-"); $gencount++;
|
||||
69, "엄안",1219, 0, "낙양", 72, 84, 67, 0, 151, 222, "왕좌", "-"); $gencount++;
|
||||
7, "엄정",1220, 0, "낙양", 31, 68, 49, 0, 151, 189, "출세", "-"); $gencount++;
|
||||
121, "엄준",1221, 0, "낙양", 44, 24, 71, 0, 169, 246, "재간", "-"); $gencount++;
|
||||
71, "여개",1222, 0, "낙양", 51, 42, 67, 0, 194, 227, "유지", "-"); $gencount++;
|
||||
29, "여건",1223, 0, "낙양", 44, 68, 29, 0, 173, 238, "출세", "-"); $gencount++;
|
||||
107, "여광",1224, 0, "낙양", 60, 67, 27, 0, 162, 207, "유지", "-"); $gencount++;
|
||||
124, "여몽",1225, 0, "낙양", 92, 78, 93, 0, 178, 219, "패권", "궁병"); $gencount++;
|
||||
123, "여범",1226, 0, "낙양", 43, 34, 71, 0, 169, 228, "할거", "-"); $gencount++;
|
||||
107, "여상",1227, 0, "낙양", 62, 68, 26, 0, 164, 207, "유지", "-"); $gencount++;
|
||||
105, "여위황",1228, 0, "낙양", 42, 62, 38, 0, 159, 200, "정복", "-"); $gencount++;
|
||||
145, "여포",1229, 0, "낙양", 74,100, 29, 0, 156, 198, "패권", "돌격"); $gencount++;
|
||||
50, "염우",1230, 0, "낙양", 58, 51, 18, 0, 209, 264, "출세", "-"); $gencount++;
|
||||
40, "염유",1231, 0, "낙양", 59, 75, 51, 0, 168, 227, "출세", "-"); $gencount++;
|
||||
18, "염포",1232, 0, "낙양", 33, 35, 77, 0, 163, 231, "유지", "-"); $gencount++;
|
||||
40, "예형",1233, 0, "낙양", 77, 31, 95, 0, 173, 209, "은둔", "통찰"); $gencount++;
|
||||
133, "오강",1234, 0, "낙양", 47, 37, 61, 0, 216, 275, "안전", "-"); $gencount++;
|
||||
59, "오란",1235, 0, "낙양", 67, 75, 42, 0, 170, 218, "재간", "-"); $gencount++;
|
||||
72, "오반",1236, 0, "낙양", 70, 66, 45, 0, 171, 234, "재간", "-"); $gencount++;
|
||||
128, "오언",1237, 0, "낙양", 71, 60, 52, 0, 235, 297, "재간", "-"); $gencount++;
|
||||
126, "오연",1238, 0, "낙양", 36, 70, 31, 0, 234, 280, "정복", "-"); $gencount++;
|
||||
69, "오의",1239, 0, "낙양", 75, 72, 74, 0, 165, 237, "유지", "-"); $gencount++;
|
||||
19, "오질",1240, 0, "낙양", 43, 37, 69, 0, 177, 230, "출세", "-"); $gencount++;
|
||||
51, "올돌골",1241, 0, "낙양", 77, 92, 15, 0, 186, 225, "출세", "척사"); $gencount++;
|
||||
52, "옹개",1242, 0, "낙양", 58, 67, 51, 0, 188, 225, "안전", "-"); $gencount++;
|
||||
20, "왕경",1243, 0, "낙양", 55, 47, 65, 0, 206, 260, "재간", "-"); $gencount++;
|
||||
97, "왕광",1244, 0, "낙양", 72, 67, 54, 0, 150, 190, "유지", "-"); $gencount++;
|
||||
30, "왕기1",1245, 0, "낙양", 76, 62, 70, 0, 190, 261, "유지", "-"); $gencount++;
|
||||
34, "왕랑",1246, 0, "낙양", 49, 29, 51, 0, 162, 228, "할거", "-"); $gencount++;
|
||||
57, "왕루",1247, 0, "낙양", 40, 28, 76, 0, 173, 211, "유지", "-"); $gencount++;
|
||||
76, "왕보",1248, 0, "낙양", 47, 34, 75, 0, 171, 219, "대의", "-"); $gencount++;
|
||||
86, "왕수",1249, 0, "낙양", 34, 34, 67, 0, 168, 218, "재간", "-"); $gencount++;
|
||||
26, "왕쌍",1250, 0, "낙양", 58, 89, 15, 0, 195, 228, "정복", "보병"); $gencount++;
|
||||
46, "왕위",1251, 0, "낙양", 59, 60, 68, 0, 163, 208, "안전", "-"); $gencount++;
|
||||
92, "왕윤",1252, 0, "낙양", 16, 18, 77, 0, 137, 192, "왕좌", "-"); $gencount++;
|
||||
40, "왕융",1253, 0, "낙양", 62, 41, 77, 0, 234, 305, "재간", "-"); $gencount++;
|
||||
32, "왕준",1254, 0, "낙양", 81, 83, 76, 0, 206, 285, "대의", "-"); $gencount++;
|
||||
30, "왕찬",1255, 0, "낙양", 28, 28, 78, 0, 177, 217, "안전", "-"); $gencount++;
|
||||
33, "왕창",1256, 0, "낙양", 74, 57, 52, 0, 188, 259, "정복", "-"); $gencount++;
|
||||
69, "왕평",1257, 0, "낙양", 77, 76, 71, 0, 192, 248, "재간", "-"); $gencount++;
|
||||
71, "왕항",1258, 0, "낙양", 51, 43, 60, 0, 184, 254, "대의", "-"); $gencount++;
|
||||
33, "왕혼",1259, 0, "낙양", 69, 32, 59, 0, 223, 297, "정복", "-"); $gencount++;
|
||||
71, "요립",1260, 0, "낙양", 65, 41, 84, 0, 181, 250, "출세", "-"); $gencount++;
|
||||
74, "요화",1261, 0, "낙양", 67, 58, 60, 0, 170, 264, "의협", "-"); $gencount++;
|
||||
22, "우금1",1262, 0, "낙양", 80, 74, 71, 0, 159, 221, "정복", "-"); $gencount++;
|
||||
27, "우금2",1263, 0, "낙양", 63, 77, 37, 0, 173, 226, "대의", "-"); $gencount++;
|
||||
122, "우번",1264, 0, "낙양", 23, 42, 73, 0, 164, 233, "유지", "-"); $gencount++;
|
||||
126, "우전",1265, 0, "낙양", 63, 55, 41, 0, 204, 258, "안전", "-"); $gencount++;
|
||||
86, "원담",1266, 0, "낙양", 67, 59, 55, 0, 173, 205, "왕좌", "-"); $gencount++;
|
||||
101, "원상",1267, 0, "낙양", 54, 72, 68, 0, 179, 207, "패권", "-"); $gencount++;
|
||||
101, "원소",1268, 0, "낙양", 85, 67, 76, 0, 154, 202, "패권", "위압"); $gencount++;
|
||||
140, "원술",1269, 0, "낙양", 77, 59, 71, 0, 155, 199, "패권", "축성"); $gencount++;
|
||||
140, "원윤",1270, 0, "낙양", 41, 34, 60, 0, 163, 199, "패권", "-"); $gencount++;
|
||||
101, "원희",1271, 0, "낙양", 69, 57, 72, 0, 176, 207, "할거", "-"); $gencount++;
|
||||
131, "위소",1272, 0, "낙양", 39, 24, 82, 0, 204, 273, "재간", "-"); $gencount++;
|
||||
147, "위속",1273, 0, "낙양", 57, 59, 41, 0, 156, 200, "안전", "-"); $gencount++;
|
||||
81, "위연",1274, 0, "낙양", 78, 94, 62, 0, 175, 234, "패권", "보병"); $gencount++;
|
||||
96, "위유",1275, 0, "낙양", 53, 69, 71, 0, 151, 193, "재간", "-"); $gencount++;
|
||||
76, "유기",1276, 0, "낙양", 57, 19, 73, 0, 174, 209, "왕좌", "-"); $gencount++;
|
||||
36, "유대",1277, 0, "낙양", 61, 57, 62, 0, 147, 202, "재간", "-"); $gencount++;
|
||||
134, "유도",1278, 0, "낙양", 35, 33, 68, 0, 168, 214, "재간", "-"); $gencount++;
|
||||
46, "유벽",1279, 0, "낙양", 63, 71, 23, 0, 168, 210, "출세", "-"); $gencount++;
|
||||
75, "유봉",1280, 0, "낙양", 60, 65, 62, 0, 188, 220, "출세", "-"); $gencount++;
|
||||
75, "유비",1281, 0, "낙양", 85, 75, 70, 0, 161, 223, "왕좌", "인덕"); $gencount++;
|
||||
75, "유선1",1282, 0, "낙양", 24, 17, 21, 0, 207, 271, "대의", "-"); $gencount++;
|
||||
55, "유순",1283, 0, "낙양", 67, 61, 54, 0, 184, 239, "출세", "-"); $gencount++;
|
||||
75, "유심",1284, 0, "낙양", 63, 46, 70, 0, 238, 263, "왕좌", "-"); $gencount++;
|
||||
129, "유약",1285, 0, "낙양", 67, 63, 61, 0, 206, 260, "유지", "-"); $gencount++;
|
||||
55, "유언",1286, 0, "낙양", 60, 40, 74, 0, 132, 194, "할거", "-"); $gencount++;
|
||||
27, "유엽",1287, 0, "낙양", 40, 29, 79, 0, 176, 235, "유지", "-"); $gencount++;
|
||||
11, "유요",1288, 0, "낙양", 23, 22, 48, 0, 156, 195, "안전", "발명"); $gencount++;
|
||||
96, "유우",1289, 0, "낙양", 68, 34, 72, 0, 145, 193, "왕좌", "-"); $gencount++;
|
||||
55, "유장",1290, 0, "낙양", 38, 31, 63, 0, 162, 219, "할거", "수비"); $gencount++;
|
||||
45, "유종",1291, 0, "낙양", 22, 26, 61, 0, 191, 208, "할거", "-"); $gencount++;
|
||||
56, "유파",1292, 0, "낙양", 47, 32, 70, 0, 186, 222, "대의", "-"); $gencount++;
|
||||
45, "유표1",1293, 0, "낙양", 71, 57, 71, 0, 142, 208, "할거", "-"); $gencount++;
|
||||
27, "유표2",1294, 0, "낙양", 76, 55, 71, 0, 173, 229, "안전", "-"); $gencount++;
|
||||
134, "유현",1295, 0, "낙양", 32, 56, 55, 0, 188, 252, "안전", "-"); $gencount++;
|
||||
122, "육개",1296, 0, "낙양", 66, 30, 72, 0, 198, 269, "재간", "-"); $gencount++;
|
||||
122, "육손",1297, 0, "낙양", 98, 68, 98, 0, 183, 245, "왕좌", "귀병"); $gencount++;
|
||||
121, "육적",1298, 0, "낙양", 44, 29, 73, 0, 187, 219, "안전", "-"); $gencount++;
|
||||
122, "육항",1299, 0, "낙양", 95, 69, 94, 0, 226, 274, "왕좌", "-"); $gencount++;
|
||||
38, "윤대목",1300, 0, "낙양", 62, 49, 69, 0, 211, 270, "재간", "-"); $gencount++;
|
||||
80, "윤묵",1301, 0, "낙양", 19, 28, 73, 0, 183, 239, "대의", "-"); $gencount++;
|
||||
72, "윤상",1302, 0, "낙양", 30, 32, 42, 0, 194, 260, "대의", "-"); $gencount++;
|
||||
136, "윤직",1303, 0, "낙양", 44, 58, 63, 0, 197, 237, "재간", "-"); $gencount++;
|
||||
2, "이각",1304, 0, "낙양", 56, 77, 43, 0, 148, 198, "패권", "-"); $gencount++;
|
||||
146, "이숙",1305, 0, "낙양", 27, 45, 67, 0, 156, 192, "재간", "-"); $gencount++;
|
||||
71, "이엄",1306, 0, "낙양", 80, 84, 81, 0, 172, 234, "패권", "-"); $gencount++;
|
||||
2, "이유",1307, 0, "낙양", 64, 22, 90, 0, 150, 192, "패권", "귀모"); $gencount++;
|
||||
132, "이이",1308, 0, "낙양", 55, 75, 20, 0, 187, 222, "정복", "-"); $gencount++;
|
||||
77, "이적",1309, 0, "낙양", 55, 27, 77, 0, 162, 226, "할거", "-"); $gencount++;
|
||||
22, "이전",1310, 0, "낙양", 75, 68, 82, 0, 174, 216, "왕좌", "-"); $gencount++;
|
||||
71, "이풍1",1311, 0, "낙양", 59, 56, 62, 0, 206, 260, "재간", "-"); $gencount++;
|
||||
66, "이회",1312, 0, "낙양", 67, 50, 79, 0, 175, 231, "유지", "-"); $gencount++;
|
||||
114, "잠혼",1313, 0, "낙양", 15, 16, 44, 0, 239, 280, "할거", "-"); $gencount++;
|
||||
7, "장각",1314, 0, "낙양", 93, 25, 93, 0, 140, 185, "패권", "환술"); $gencount++;
|
||||
34, "장간",1315, 0, "낙양", 19, 20, 70, 0, 175, 239, "재간", "-"); $gencount++;
|
||||
7, "장개",1316, 0, "낙양", 48, 69, 19, 0, 155, 202, "안전", "-"); $gencount++;
|
||||
122, "장굉",1317, 0, "낙양", 25, 21, 85, 0, 153, 212, "왕좌", "-"); $gencount++;
|
||||
7, "장량",1318, 0, "낙양", 68, 81, 68, 0, 153, 185, "정복", "환술"); $gencount++;
|
||||
15, "장로",1319, 0, "낙양", 76, 44, 80, 0, 163, 237, "유지", "축성"); $gencount++;
|
||||
23, "장료",1320, 0, "낙양", 89, 93, 83, 0, 169, 222, "의협", "견고"); $gencount++;
|
||||
7, "장보",1321, 0, "낙양", 78, 81, 76, 0, 148, 185, "패권", "환술"); $gencount++;
|
||||
76, "장비",1322, 0, "낙양", 79, 99, 48, 0, 167, 221, "의협", "무쌍"); $gencount++;
|
||||
62, "장서",1323, 0, "낙양", 44, 48, 35, 0, 225, 290, "출세", "-"); $gencount++;
|
||||
120, "장소1",1324, 0, "낙양", 42, 24, 91, 0, 156, 236, "안전", "-"); $gencount++;
|
||||
78, "장소2",1325, 0, "낙양", 51, 44, 71, 0, 202, 264, "재간", "-"); $gencount++;
|
||||
72, "장송",1326, 0, "낙양", 49, 28, 93, 0, 170, 212, "할거", "통찰"); $gencount++;
|
||||
148, "장수",1327, 0, "낙양", 71, 72, 69, 0, 154, 207, "할거", "-"); $gencount++;
|
||||
145, "장양1",1328, 0, "낙양", 62, 66, 65, 0, 150, 199, "출세", "-"); $gencount++;
|
||||
8, "장연",1329, 0, "낙양", 78, 66, 47, 0, 153, 210, "안전", "-"); $gencount++;
|
||||
11, "장영",1330, 0, "낙양", 55, 65, 40, 0, 154, 195, "재간", "-"); $gencount++;
|
||||
118, "장온",1331, 0, "낙양", 21, 30, 69, 0, 193, 231, "할거", "-"); $gencount++;
|
||||
78, "장완",1332, 0, "낙양", 70, 55, 86, 0, 188, 246, "할거", "상재"); $gencount++;
|
||||
15, "장위",1333, 0, "낙양", 65, 70, 29, 0, 172, 215, "대의", "-"); $gencount++;
|
||||
36, "장윤",1334, 0, "낙양", 67, 59, 60, 0, 163, 208, "정복", "-"); $gencount++;
|
||||
104, "장의거",1335, 0, "낙양", 68, 59, 34, 0, 159, 205, "대의", "-"); $gencount++;
|
||||
68, "장익",1336, 0, "낙양", 75, 68, 63, 0, 188, 264, "유지", "-"); $gencount++;
|
||||
56, "장임",1337, 0, "낙양", 83, 82, 74, 0, 169, 214, "대의", "견고"); $gencount++;
|
||||
148, "장제1",1338, 0, "낙양", 70, 65, 59, 0, 144, 196, "할거", "-"); $gencount++;
|
||||
32, "장제2",1339, 0, "낙양", 30, 33, 84, 0, 188, 249, "유지", "-"); $gencount++;
|
||||
126, "장제3",1340, 0, "낙양", 74, 49, 61, 0, 236, 280, "할거", "-"); $gencount++;
|
||||
17, "장패",1341, 0, "낙양", 44, 78, 43, 0, 165, 231, "할거", "-"); $gencount++;
|
||||
76, "장포1",1342, 0, "낙양", 69, 85, 49, 0, 198, 229, "재간", "징병"); $gencount++;
|
||||
113, "장포2",1343, 0, "낙양", 63, 66, 51, 0, 225, 264, "유지", "-"); $gencount++;
|
||||
27, "장합",1344, 0, "낙양", 83, 91, 63, 0, 167, 231, "출세", "궁병"); $gencount++;
|
||||
23, "장호",1345, 0, "낙양", 56, 62, 54, 0, 195, 240, "정복", "-"); $gencount++;
|
||||
31, "장화",1346, 0, "낙양", 49, 24, 86, 0, 232, 300, "유지", "-"); $gencount++;
|
||||
48, "장횡",1347, 0, "낙양", 53, 67, 25, 0, 178, 211, "재간", "-"); $gencount++;
|
||||
141, "장훈",1348, 0, "낙양", 67, 61, 60, 0, 156, 206, "안전", "-"); $gencount++;
|
||||
120, "장휴",1349, 0, "낙양", 42, 35, 70, 0, 204, 244, "재간", "-"); $gencount++;
|
||||
126, "장흠",1350, 0, "낙양", 64, 66, 67, 0, 168, 219, "대의", "저격"); $gencount++;
|
||||
96, "저수",1351, 0, "낙양", 82, 54, 88, 0, 156, 201, "할거", "반계"); $gencount++;
|
||||
130, "전단",1352, 0, "낙양", 64, 73, 61, 0, 204, 261, "출세", "-"); $gencount++;
|
||||
42, "전속",1353, 0, "낙양", 66, 57, 49, 0, 218, 272, "안전", "-"); $gencount++;
|
||||
26, "전위1",1354, 0, "낙양", 61, 96, 34, 0, 160, 197, "의협", "필살"); $gencount++;
|
||||
130, "전위2",1355, 0, "낙양", 74, 69, 62, 0, 230, 274, "출세", "-"); $gencount++;
|
||||
128, "전종",1356, 0, "낙양", 79, 77, 74, 0, 183, 249, "패권", "-"); $gencount++;
|
||||
42, "전주",1357, 0, "낙양", 69, 67, 51, 0, 169, 214, "의협", "-"); $gencount++;
|
||||
96, "전풍",1358, 0, "낙양", 81, 41, 96, 0, 162, 200, "왕좌", "-"); $gencount++;
|
||||
24, "정무",1359, 0, "낙양", 54, 38, 74, 0, 201, 265, "출세", "-"); $gencount++;
|
||||
119, "정병",1360, 0, "낙양", 22, 25, 67, 0, 172, 226, "유지", "-"); $gencount++;
|
||||
126, "정보",1361, 0, "낙양", 81, 64, 76, 0, 151, 216, "패권", "-"); $gencount++;
|
||||
123, "정봉1",1362, 0, "낙양", 70, 77, 64, 0, 190, 271, "패권", "-"); $gencount++;
|
||||
24, "정욱",1363, 0, "낙양", 80, 39, 90, 0, 141, 220, "패권", "신중"); $gencount++;
|
||||
88, "정원",1364, 0, "낙양", 64, 77, 58, 0, 137, 190, "왕좌", "기병"); $gencount++;
|
||||
7, "정원지",1365, 0, "낙양", 41, 74, 38, 0, 145, 185, "출세", "-"); $gencount++;
|
||||
69, "정은",1366, 0, "낙양", 53, 62, 26, 0, 169, 211, "재간", "-"); $gencount++;
|
||||
121, "제갈각",1367, 0, "낙양", 61, 53, 92, 0, 203, 253, "왕좌", "-"); $gencount++;
|
||||
76, "제갈균",1368, 0, "낙양", 59, 45, 74, 0, 185, 252, "안전", "상재"); $gencount++;
|
||||
121, "제갈근",1369, 0, "낙양", 60, 42, 88, 0, 174, 241, "왕좌", "경작"); $gencount++;
|
||||
76, "제갈량",1370, 0, "낙양", 97, 55,100, 0, 181, 234, "왕좌", "집중"); $gencount++;
|
||||
76, "제갈상",1371, 0, "낙양", 52, 75, 71, 0, 246, 263, "대의", "-"); $gencount++;
|
||||
135, "제갈정",1372, 0, "낙양", 56, 57, 54, 0, 241, 300, "안전", "-"); $gencount++;
|
||||
76, "제갈첨",1373, 0, "낙양", 73, 52, 76, 0, 227, 263, "대의", "-"); $gencount++;
|
||||
135, "제갈탄",1374, 0, "낙양", 79, 79, 73, 0, 206, 258, "패권", "-"); $gencount++;
|
||||
76, "조광",1375, 0, "낙양", 65, 67, 54, 0, 210, 263, "재간", "-"); $gencount++;
|
||||
74, "조루",1376, 0, "낙양", 49, 37, 60, 0, 183, 219, "대의", "-"); $gencount++;
|
||||
24, "조모",1377, 0, "낙양", 53, 32, 30, 0, 241, 260, "할거", "-"); $gencount++;
|
||||
127, "조무",1378, 0, "낙양", 71, 68, 71, 0, 155, 191, "의협", "-"); $gencount++;
|
||||
26, "조방",1379, 0, "낙양", 50, 20, 31, 0, 232, 274, "정복", "-"); $gencount++;
|
||||
83, "조범",1380, 0, "낙양", 58, 40, 63, 0, 168, 218, "유지", "-"); $gencount++;
|
||||
26, "조비",1381, 0, "낙양", 72, 69, 75, 0, 187, 226, "패권", "징병"); $gencount++;
|
||||
19, "조상",1382, 0, "낙양", 68, 62, 31, 0, 207, 249, "패권", "-"); $gencount++;
|
||||
147, "조성",1383, 0, "낙양", 44, 69, 51, 0, 163, 198, "안전", "-"); $gencount++;
|
||||
26, "조순",1384, 0, "낙양", 66, 57, 72, 0, 170, 210, "정복", "-"); $gencount++;
|
||||
25, "조식",1385, 0, "낙양", 19, 19, 90, 0, 192, 232, "왕좌", "귀모"); $gencount++;
|
||||
25, "조앙",1386, 0, "낙양", 44, 65, 62, 0, 175, 197, "왕좌", "-"); $gencount++;
|
||||
25, "조예",1387, 0, "낙양", 57, 55, 82, 0, 205, 239, "정복", "-"); $gencount++;
|
||||
26, "조우",1388, 0, "낙양", 67, 55, 67, 0, 199, 260, "대의", "-"); $gencount++;
|
||||
76, "조운",1389, 0, "낙양", 95, 98, 87, 0, 168, 229, "왕좌", "무쌍"); $gencount++;
|
||||
25, "조웅",1390, 0, "낙양", 59, 27, 44, 0, 194, 220, "안전", "-"); $gencount++;
|
||||
26, "조인",1391, 0, "낙양", 74, 79, 62, 0, 168, 223, "패권", "보병"); $gencount++;
|
||||
25, "조조",1392, 0, "낙양",100, 80, 95, 0, 155, 220, "패권", "반계"); $gencount++;
|
||||
26, "조진",1393, 0, "낙양", 82, 67, 65, 0, 185, 231, "정복", "-"); $gencount++;
|
||||
25, "조창",1394, 0, "낙양", 75, 88, 37, 0, 190, 223, "정복", "돌격"); $gencount++;
|
||||
76, "조통",1395, 0, "낙양", 65, 64, 55, 0, 209, 260, "재간", "-"); $gencount++;
|
||||
84, "조표",1396, 0, "낙양", 34, 70, 16, 0, 151, 196, "안전", "-"); $gencount++;
|
||||
7, "조홍1",1397, 0, "낙양", 52, 66, 42, 0, 156, 185, "유지", "-"); $gencount++;
|
||||
24, "조홍2",1398, 0, "낙양", 72, 69, 44, 0, 169, 232, "패권", "-"); $gencount++;
|
||||
26, "조환",1399, 0, "낙양", 34, 24, 42, 0, 246, 302, "정복", "-"); $gencount++;
|
||||
19, "조훈",1400, 0, "낙양", 67, 63, 30, 0, 212, 249, "출세", "-"); $gencount++;
|
||||
26, "조휴",1401, 0, "낙양", 75, 71, 70, 0, 174, 228, "패권", "-"); $gencount++;
|
||||
19, "조희",1402, 0, "낙양", 64, 57, 71, 0, 210, 249, "대의", "-"); $gencount++;
|
||||
22, "종요",1403, 0, "낙양", 16, 20, 74, 0, 151, 230, "유지", "-"); $gencount++;
|
||||
20, "종회",1404, 0, "낙양", 84, 58, 93, 0, 225, 264, "패권", "-"); $gencount++;
|
||||
128, "주거",1405, 0, "낙양", 73, 71, 72, 0, 190, 246, "유지", "-"); $gencount++;
|
||||
118, "주방",1406, 0, "낙양", 56, 36, 76, 0, 200, 240, "할거", "-"); $gencount++;
|
||||
126, "주연",1407, 0, "낙양", 73, 72, 51, 0, 182, 249, "할거", "-"); $gencount++;
|
||||
126, "주유",1408, 0, "낙양", 97, 73, 97, 0, 175, 210, "패권", "신산"); $gencount++;
|
||||
128, "주이",1409, 0, "낙양", 61, 55, 61, 0, 201, 257, "안전", "-"); $gencount++;
|
||||
88, "주준",1410, 0, "낙양", 82, 75, 65, 0, 149, 195, "왕좌", "-"); $gencount++;
|
||||
32, "주지",1411, 0, "낙양", 52, 77, 47, 0, 233, 295, "안전", "-"); $gencount++;
|
||||
76, "주창",1412, 0, "낙양", 42, 79, 30, 0, 164, 219, "의협", "궁병"); $gencount++;
|
||||
126, "주치",1413, 0, "낙양", 58, 55, 56, 0, 156, 224, "안전", "-"); $gencount++;
|
||||
41, "주태1",1414, 0, "낙양", 62, 55, 61, 0, 207, 261, "안전", "-"); $gencount++;
|
||||
126, "주태2",1415, 0, "낙양", 74, 88, 60, 0, 171, 225, "정복", "필살"); $gencount++;
|
||||
128, "주환",1416, 0, "낙양", 84, 86, 74, 0, 177, 238, "정복", "-"); $gencount++;
|
||||
29, "진건",1417, 0, "낙양", 62, 70, 62, 0, 214, 292, "정복", "-"); $gencount++;
|
||||
29, "진교",1418, 0, "낙양", 21, 25, 67, 0, 175, 237, "유지", "-"); $gencount++;
|
||||
28, "진군",1419, 0, "낙양", 60, 38, 87, 0, 167, 235, "대의", "-"); $gencount++;
|
||||
143, "진궁",1420, 0, "낙양", 77, 51, 90, 0, 154, 198, "할거", "신중"); $gencount++;
|
||||
79, "진규",1421, 0, "낙양", 22, 19, 71, 0, 132, 206, "할거", "-"); $gencount++;
|
||||
72, "진도",1422, 0, "낙양", 71, 85, 70, 0, 171, 237, "대의", "-"); $gencount++;
|
||||
79, "진등",1423, 0, "낙양", 64, 62, 71, 0, 169, 207, "할거", "-"); $gencount++;
|
||||
37, "진림",1424, 0, "낙양", 50, 28, 82, 0, 160, 217, "재간", "-"); $gencount++;
|
||||
124, "진무",1425, 0, "낙양", 62, 74, 59, 0, 176, 215, "재간", "-"); $gencount++;
|
||||
66, "진복",1426, 0, "낙양", 36, 27, 76, 0, 160, 226, "재간", "-"); $gencount++;
|
||||
50, "진수",1427, 0, "낙양", 25, 29, 83, 0, 233, 297, "대의", "-"); $gencount++;
|
||||
81, "진식",1428, 0, "낙양", 47, 68, 52, 0, 191, 230, "출세", "-"); $gencount++;
|
||||
79, "진진",1429, 0, "낙양", 58, 38, 64, 0, 170, 235, "재간", "-"); $gencount++;
|
||||
28, "진태",1430, 0, "낙양", 79, 76, 70, 0, 210, 260, "대의", "-"); $gencount++;
|
||||
11, "진횡",1431, 0, "낙양", 38, 58, 47, 0, 161, 195, "출세", "-"); $gencount++;
|
||||
21, "차주",1432, 0, "낙양", 55, 66, 62, 0, 164, 199, "안전", "-"); $gencount++;
|
||||
11, "착융",1433, 0, "낙양", 62, 59, 21, 0, 161, 194, "출세", "-"); $gencount++;
|
||||
36, "채모",1434, 0, "낙양", 79, 69, 68, 0, 155, 208, "정복", "궁병"); $gencount++;
|
||||
36, "채중",1435, 0, "낙양", 58, 43, 55, 0, 168, 208, "출세", "-"); $gencount++;
|
||||
36, "채화",1436, 0, "낙양", 56, 47, 49, 0, 166, 208, "안전", "-"); $gencount++;
|
||||
66, "초주",1437, 0, "낙양", 22, 26, 81, 0, 201, 270, "대의", "-"); $gencount++;
|
||||
20, "최염",1438, 0, "낙양", 43, 54, 67, 0, 162, 216, "대의", "-"); $gencount++;
|
||||
60, "축융",1439, 0, "낙양", 59, 87, 25, 0, 193, 246, "정복", "척사"); $gencount++;
|
||||
60, "타사대왕",1440, 0, "낙양", 61, 72, 67, 0, 186, 225, "출세", "척사"); $gencount++;
|
||||
124, "태사자",1441, 0, "낙양", 71, 97, 65, 0, 166, 209, "대의", "무쌍"); $gencount++;
|
||||
124, "태사향",1442, 0, "낙양", 51, 69, 50, 0, 189, 246, "재간", "-"); $gencount++;
|
||||
12, "포륭",1443, 0, "낙양", 53, 74, 20, 0, 174, 208, "안전", "-"); $gencount++;
|
||||
74, "풍습",1444, 0, "낙양", 36, 64, 44, 0, 182, 222, "재간", "-"); $gencount++;
|
||||
7, "하의",1445, 0, "낙양", 49, 68, 25, 0, 161, 195, "출세", "-"); $gencount++;
|
||||
121, "하제",1446, 0, "낙양", 74, 73, 64, 0, 171, 227, "재간", "-"); $gencount++;
|
||||
90, "하진",1447, 0, "낙양", 49, 69, 37, 0, 135, 189, "왕좌", "-"); $gencount++;
|
||||
24, "하후덕",1448, 0, "낙양", 67, 64, 39, 0, 178, 218, "출세", "-"); $gencount++;
|
||||
26, "하후돈",1449, 0, "낙양", 88, 92, 71, 0, 156, 220, "의협", "돌격"); $gencount++;
|
||||
19, "하후무",1450, 0, "낙양", 38, 33, 37, 0, 201, 259, "안전", "-"); $gencount++;
|
||||
24, "하후상",1451, 0, "낙양", 67, 62, 71, 0, 181, 225, "출세", "-"); $gencount++;
|
||||
26, "하후연",1452, 0, "낙양", 79, 90, 58, 0, 162, 219, "패권", "궁병"); $gencount++;
|
||||
26, "하후위",1453, 0, "낙양", 73, 76, 71, 0, 204, 254, "정복", "-"); $gencount++;
|
||||
26, "하후은",1454, 0, "낙양", 49, 51, 39, 0, 180, 208, "안전", "-"); $gencount++;
|
||||
23, "하후패",1455, 0, "낙양", 78, 88, 69, 0, 202, 262, "대의", "-"); $gencount++;
|
||||
20, "하후현",1456, 0, "낙양", 57, 23, 75, 0, 208, 254, "유지", "-"); $gencount++;
|
||||
26, "하후혜",1457, 0, "낙양", 76, 66, 78, 0, 206, 242, "정복", "-"); $gencount++;
|
||||
26, "하후화",1458, 0, "낙양", 77, 61, 80, 0, 207, 265, "정복", "-"); $gencount++;
|
||||
22, "학소",1459, 0, "낙양", 89, 81, 86, 0, 185, 229, "대의", "견고"); $gencount++;
|
||||
126, "한당",1460, 0, "낙양", 68, 67, 64, 0, 156, 225, "할거", "-"); $gencount++;
|
||||
93, "한복",1461, 0, "낙양", 66, 59, 42, 0, 149, 191, "안전", "-"); $gencount++;
|
||||
8, "한섬",1462, 0, "낙양", 39, 62, 35, 0, 159, 196, "출세", "-"); $gencount++;
|
||||
48, "한수",1463, 0, "낙양", 66, 76, 77, 0, 142, 215, "대의", "기병"); $gencount++;
|
||||
40, "한숭",1464, 0, "낙양", 21, 25, 70, 0, 154, 210, "재간", "-"); $gencount++;
|
||||
7, "한충",1465, 0, "낙양", 41, 66, 29, 0, 151, 185, "안전", "-"); $gencount++;
|
||||
9, "한현",1466, 0, "낙양", 43, 61, 20, 0, 163, 208, "유지", "-"); $gencount++;
|
||||
27, "한호",1467, 0, "낙양", 60, 73, 45, 0, 164, 218, "유지", "-"); $gencount++;
|
||||
79, "향랑",1468, 0, "낙양", 51, 21, 77, 0, 167, 247, "대의", "-"); $gencount++;
|
||||
79, "향총",1469, 0, "낙양", 76, 42, 73, 0, 195, 240, "왕좌", "-"); $gencount++;
|
||||
139, "허공",1470, 0, "낙양", 65, 63, 59, 0, 155, 200, "유지", "-"); $gencount++;
|
||||
21, "허유",1471, 0, "낙양", 47, 47, 57, 0, 155, 204, "재간", "-"); $gencount++;
|
||||
23, "허의",1472, 0, "낙양", 31, 74, 47, 0, 213, 263, "출세", "-"); $gencount++;
|
||||
26, "허저",1473, 0, "낙양", 57, 98, 27, 0, 169, 226, "정복", "무쌍"); $gencount++;
|
||||
87, "허정",1474, 0, "낙양", 18, 29, 74, 0, 152, 222, "재간", "-"); $gencount++;
|
||||
12, "형도영",1475, 0, "낙양", 49, 78, 23, 0, 174, 208, "출세", "-"); $gencount++;
|
||||
148, "호거아",1476, 0, "낙양", 35, 76, 61, 0, 164, 206, "안전", "-"); $gencount++;
|
||||
76, "호반",1477, 0, "낙양", 61, 58, 46, 0, 179, 233, "재간", "-"); $gencount++;
|
||||
20, "호분",1478, 0, "낙양", 71, 60, 61, 0, 222, 288, "할거", "-"); $gencount++;
|
||||
27, "호주천",1479, 0, "낙양", 77, 75, 65, 0, 169, 230, "정복", "-"); $gencount++;
|
||||
20, "호준",1480, 0, "낙양", 67, 60, 46, 0, 200, 256, "재간", "-"); $gencount++;
|
||||
2, "화웅",1481, 0, "낙양", 68, 88, 24, 0, 155, 191, "출세", "돌격"); $gencount++;
|
||||
131, "화핵",1482, 0, "낙양", 37, 27, 75, 0, 217, 278, "안전", "-"); $gencount++;
|
||||
10, "화흠",1483, 0, "낙양", 18, 43, 75, 0, 157, 231, "출세", "-"); $gencount++;
|
||||
21, "환범",1484, 0, "낙양", 20, 25, 81, 0, 199, 249, "유지", "-"); $gencount++;
|
||||
127, "황개",1485, 0, "낙양", 78, 85, 69, 0, 154, 218, "왕좌", "징병"); $gencount++;
|
||||
56, "황권",1486, 0, "낙양", 76, 46, 77, 0, 167, 240, "대의", "-"); $gencount++;
|
||||
41, "황란",1487, 0, "낙양", 29, 70, 25, 0, 200, 264, "재간", "-"); $gencount++;
|
||||
88, "황보숭",1488, 0, "낙양", 83, 63, 73, 0, 132, 195, "왕좌", "-"); $gencount++;
|
||||
72, "황충",1489, 0, "낙양", 84, 94, 67, 0, 148, 222, "왕좌", "궁병"); $gencount++;
|
||||
50, "황호",1490, 0, "낙양", 15, 17, 48, 0, 226, 263, "안전", "-"); $gencount++;
|
||||
147, "후성",1491, 0, "낙양", 56, 62, 33, 0, 158, 199, "정복", "-"); $gencount++;
|
||||
|
||||
|
||||
|
||||
|
||||
123, "가화",1492, 0, "낙양", 50, 66, 40, 0, 176, 224, "-", "-"); $gencount++;
|
||||
999, "건석",1493, 0, "낙양", 21, 12, 61, 0, 155, 189, "-", "-"); $gencount++;
|
||||
999, "견씨",1494, 0, "낙양", 35, 24, 58, 0, 182, 221, "-", "-"); $gencount++;
|
||||
40, "견홍",1495, 0, "낙양", 76, 72, 66, 0, 224, 272, "-", "-"); $gencount++;
|
||||
120, "고담",1496, 0, "낙양", 33, 21, 69, 0, 203, 244, "-", "-"); $gencount++;
|
||||
101, "고유",1497, 0, "낙양", 56, 44, 73, 0, 174, 263, "-", "-"); $gencount++;
|
||||
132, "곽마",1498, 0, "낙양", 68, 71, 49, 0, 239, 280, "-", "-"); $gencount++;
|
||||
39, "관구수",1499, 0, "낙양", 58, 63, 35, 0, 206, 265, "-", "-"); $gencount++;
|
||||
39, "관구전",1500, 0, "낙양", 63, 58, 68, 0, 224, 255, "-", "-"); $gencount++;
|
||||
999, "관로",1501, 0, "낙양", 62, 21, 75, 0, 191, 256, "-", "-"); $gencount++;
|
||||
65, "관정",1502, 0, "낙양", 35, 50, 73, 0, 158, 199, "-", "-"); $gencount++;
|
||||
137, "교수",1503, 0, "낙양", 67, 69, 39, 0, 143, 195, "-", "-"); $gencount++;
|
||||
33, "구건",1504, 0, "낙양", 43, 56, 69, 0, 239, 272, "-", "-"); $gencount++;
|
||||
41, "구본",1505, 0, "낙양", 52, 41, 70, 0, 232, 269, "-", "-"); $gencount++;
|
||||
12, "구성",1506, 0, "낙양", 56, 71, 31, 0, 157, 187, "-", "-"); $gencount++;
|
||||
21, "국연",1507, 0, "낙양", 52, 21, 71, 0, 160, 219, "-", "-"); $gencount++;
|
||||
99, "국의",1508, 0, "낙양", 83, 79, 50, 0, 146, 191, "-", "-"); $gencount++;
|
||||
34, "금의",1509, 0, "낙양", 18, 40, 63, 0, 177, 218, "-", "-"); $gencount++;
|
||||
76, "나헌",1510, 0, "낙양", 86, 67, 75, 0, 218, 270, "-", "-"); $gencount++;
|
||||
999, "남두",1511, 0, "낙양", 35, 25, 54, 0, 130, 200, "-", "-"); $gencount++;
|
||||
54, "냉포",1512, 0, "낙양", 70, 82, 69, 0, 176, 214, "-", "-"); $gencount++;
|
||||
124, "노숙2",1513, 0, "낙양", 70, 55, 76, 0, 208, 274, "-", "-"); $gencount++;
|
||||
42, "누규",1514, 0, "낙양", 54, 19, 88, 0, 143, 212, "-", "-"); $gencount++;
|
||||
6, "누반",1515, 0, "낙양", 65, 76, 39, 0, 178, 207, "-", "-"); $gencount++;
|
||||
130, "누현",1516, 0, "낙양", 23, 20, 68, 0, 223, 275, "-", "-"); $gencount++;
|
||||
40, "당균",1517, 0, "낙양", 33, 19, 81, 0, 229, 264, "-", "-"); $gencount++;
|
||||
32, "당빈",1518, 0, "낙양", 70, 74, 62, 0, 235, 294, "-", "-"); $gencount++;
|
||||
999, "대교",1519, 0, "낙양", 42, 10, 54, 0, 177, 235, "-", "-"); $gencount++;
|
||||
28, "대릉",1520, 0, "낙양", 64, 75, 45, 0, 199, 258, "-", "-"); $gencount++;
|
||||
129, "동조",1521, 0, "낙양", 16, 15, 51, 0, 221, 281, "-", "-"); $gencount++;
|
||||
114, "등수",1522, 0, "낙양", 35, 20, 44, 0, 228, 288, "-", "-"); $gencount++;
|
||||
50, "마막",1523, 0, "낙양", 22, 17, 5, 0, 221, 265, "-", "-"); $gencount++;
|
||||
116, "만욱",1524, 0, "낙양", 20, 18, 66, 0, 240, 272, "-", "-"); $gencount++;
|
||||
120, "맹종",1525, 0, "낙양", 48, 48, 67, 0, 216, 271, "-", "-"); $gencount++;
|
||||
38, "문호",1526, 0, "낙양", 65, 74, 45, 0, 227, 279, "-", "-"); $gencount++;
|
||||
999, "미씨",1527, 0, "낙양", 59, 15, 68, 0, 176, 208, "-", "-"); $gencount++;
|
||||
39, "반림",1528, 0, "낙양", 66, 79, 8, 0, 168, 225, "-", "-"); $gencount++;
|
||||
129, "반장",1529, 0, "낙양", 77, 78, 69, 0, 177, 222, "-", "-"); $gencount++;
|
||||
94, "방열",1530, 0, "낙양", 58, 82, 28, 0, 153, 190, "-", "-"); $gencount++;
|
||||
55, "방희",1531, 0, "낙양", 59, 38, 69, 0, 153, 218, "-", "-"); $gencount++;
|
||||
30, "배수",1532, 0, "낙양", 10, 11, 77, 0, 223, 271, "-", "-"); $gencount++;
|
||||
8, "번능",1533, 0, "낙양", 70, 61, 47, 0, 158, 194, "-", "-"); $gencount++;
|
||||
999, "번씨",1534, 0, "낙양", 32, 17, 45, 0, 176, 220, "-", "-"); $gencount++;
|
||||
49, "보도근",1535, 0, "낙양", 64, 73, 50, 0, 170, 233, "-", "-"); $gencount++;
|
||||
129, "보천",1536, 0, "낙양", 68, 60, 72, 0, 222, 272, "-", "-"); $gencount++;
|
||||
121, "보협",1537, 0, "낙양", 73, 53, 75, 0, 216, 264, "-", "-"); $gencount++;
|
||||
28, "부하",1538, 0, "낙양", 44, 36, 85, 0, 209, 255, "-", "-"); $gencount++;
|
||||
26, "비요",1539, 0, "낙양", 70, 65, 73, 0, 192, 228, "-", "-"); $gencount++;
|
||||
31, "사마주",1540, 0, "낙양", 63, 53, 62, 0, 227, 283, "-", "-"); $gencount++;
|
||||
41, "사찬",1541, 0, "낙양", 61, 71, 54, 0, 215, 264, "-", "-"); $gencount++;
|
||||
128, "설후",1542, 0, "낙양", 16, 14, 71, 0, 221, 271, "-", "-"); $gencount++;
|
||||
36, "성공영",1543, 0, "낙양", 73, 58, 80, 0, 172, 220, "-", "-"); $gencount++;
|
||||
126, "성만",1544, 0, "낙양", 61, 69, 66, 0, 225, 276, "-", "-"); $gencount++;
|
||||
999, "소교",1545, 0, "낙양", 57, 23, 66, 0, 178, 218, "-", "-"); $gencount++;
|
||||
46, "소유",1546, 0, "낙양", 51, 61, 48, 0, 164, 210, "-", "-"); $gencount++;
|
||||
31, "소제2",1547, 0, "낙양", 22, 16, 78, 0, 224, 268, "-", "-"); $gencount++;
|
||||
126, "손교",1548, 0, "낙양", 77, 60, 69, 0, 181, 219, "-", "-"); $gencount++;
|
||||
116, "손기",1549, 0, "낙양", 62, 65, 52, 0, 227, 276, "-", "-"); $gencount++;
|
||||
999, "손상향",1550, 0, "낙양", 72, 62, 42, 0, 193, 244, "-", "-"); $gencount++;
|
||||
125, "손익",1551, 0, "낙양", 69, 75, 26, 0, 184, 204, "-", "-"); $gencount++;
|
||||
125, "손진",1552, 0, "낙양", 64, 71, 48, 0, 234, 280, "-", "-"); $gencount++;
|
||||
123, "송겸",1553, 0, "낙양", 61, 48, 44, 0, 175, 215, "-", "-"); $gencount++;
|
||||
85, "순심",1554, 0, "낙양", 20, 21, 79, 0, 164, 208, "-", "-"); $gencount++;
|
||||
31, "순욱2",1555, 0, "낙양", 10, 16, 77, 0, 225, 289, "-", "-"); $gencount++;
|
||||
31, "순의",1556, 0, "낙양", 16, 11, 73, 0, 207, 281, "-", "-"); $gencount++;
|
||||
129, "시삭",1557, 0, "낙양", 36, 66, 44, 0, 226, 268, "-", "-"); $gencount++;
|
||||
29, "신창",1558, 0, "낙양", 51, 29, 46, 0, 210, 272, "-", "-"); $gencount++;
|
||||
999, "악신",1559, 0, "낙양", 53, 12, 46, 0, 175, 228, "-", "-"); $gencount++;
|
||||
138, "악취",1560, 0, "낙양", 56, 68, 58, 0, 157, 195, "-", "-"); $gencount++;
|
||||
138, "양강",1561, 0, "낙양", 62, 70, 42, 0, 160, 199, "-", "-"); $gencount++;
|
||||
21, "양부",1562, 0, "낙양", 68, 55, 85, 0, 178, 239, "-", "-"); $gencount++;
|
||||
72, "양서",1563, 0, "낙양", 56, 62, 66, 0, 198, 260, "-", "-"); $gencount++;
|
||||
34, "양습",1564, 0, "낙양", 67, 49, 73, 0, 168, 230, "-", "-"); $gencount++;
|
||||
16, "양앙",1565, 0, "낙양", 65, 70, 39, 0, 172, 215, "-", "-"); $gencount++;
|
||||
17, "양임",1566, 0, "낙양", 71, 78, 56, 0, 170, 215, "-", "-"); $gencount++;
|
||||
32, "양제",1567, 0, "낙양", 69, 63, 71, 0, 226, 291, "-", "-"); $gencount++;
|
||||
33, "양조2",1568, 0, "낙양", 65, 61, 67, 0, 223, 286, "-", "-"); $gencount++;
|
||||
48, "양추2",1569, 0, "낙양", 66, 67, 61, 0, 172, 238, "-", "-"); $gencount++;
|
||||
140, "양홍",1570, 0, "낙양", 19, 17, 76, 0, 152, 199, "-", "-"); $gencount++;
|
||||
31, "양혼",1571, 0, "낙양", 60, 67, 63, 0, 220, 278, "-", "-"); $gencount++;
|
||||
123, "여거",1572, 0, "낙양", 71, 58, 69, 0, 196, 256, "-", "-"); $gencount++;
|
||||
130, "여대",1573, 0, "낙양", 83, 72, 70, 0, 161, 256, "-", "-"); $gencount++;
|
||||
136, "염상",1574, 0, "낙양", 29, 27, 69, 0, 158, 199, "-", "-"); $gencount++;
|
||||
36, "염행",1575, 0, "낙양", 70, 86, 38, 0, 159, 222, "-", "-"); $gencount++;
|
||||
73, "영수",1576, 0, "낙양", 69, 70, 74, 0, 234, 264, "-", "-"); $gencount++;
|
||||
39, "오거",1577, 0, "낙양", 49, 63, 32, 0, 151, 211, "-", "-"); $gencount++;
|
||||
126, "오경",1578, 0, "낙양", 73, 60, 57, 0, 159, 203, "-", "-"); $gencount++;
|
||||
999, "오국태",1579, 0, "낙양", 31, 11, 60, 0, 161, 222, "-", "-"); $gencount++;
|
||||
126, "오찬",1580, 0, "낙양", 69, 41, 78, 0, 181, 245, "-", "-"); $gencount++;
|
||||
23, "온회",1581, 0, "낙양", 42, 40, 78, 0, 178, 222, "-", "-"); $gencount++;
|
||||
21, "왕기2",1582, 0, "낙양", 70, 66, 63, 0, 217, 281, "-", "-"); $gencount++;
|
||||
32, "왕도",1583, 0, "낙양", 48, 44, 70, 0, 210, 269, "-", "-"); $gencount++;
|
||||
123, "왕돈",1584, 0, "낙양", 60, 65, 41, 0, 198, 256, "-", "-"); $gencount++;
|
||||
34, "왕릉",1585, 0, "낙양", 73, 60, 71, 0, 172, 251, "-", "-"); $gencount++;
|
||||
63, "왕문",1586, 0, "낙양", 64, 67, 32, 0, 162, 205, "-", "-"); $gencount++;
|
||||
32, "왕상",1587, 0, "낙양", 25, 19, 65, 0, 180, 268, "-", "-"); $gencount++;
|
||||
34, "왕숙",1588, 0, "낙양", 35, 21, 80, 0, 195, 256, "-", "-"); $gencount++;
|
||||
33, "왕업",1589, 0, "낙양", 32, 6, 46, 0, 220, 280, "-", "-"); $gencount++;
|
||||
35, "왕충",1590, 0, "낙양", 42, 58, 21, 0, 152, 214, "-", "-"); $gencount++;
|
||||
1, "우보",1591, 0, "낙양", 43, 63, 12, 0, 159, 192, "-", "-"); $gencount++;
|
||||
122, "우사",1592, 0, "낙양", 70, 33, 79, 0, 217, 273, "-", "-"); $gencount++;
|
||||
138, "원요",1593, 0, "낙양", 44, 42, 45, 0, 177, 206, "-", "-"); $gencount++;
|
||||
95, "원유",1594, 0, "낙양", 57, 38, 73, 0, 150, 193, "-", "-"); $gencount++;
|
||||
31, "위관",1595, 0, "낙양", 69, 45, 81, 0, 220, 291, "-", "-"); $gencount++;
|
||||
129, "위막",1596, 0, "낙양", 58, 62, 60, 0, 221, 268, "-", "-"); $gencount++;
|
||||
55, "유괴",1597, 0, "낙양", 75, 72, 66, 0, 165, 214, "-", "-"); $gencount++;
|
||||
129, "유략",1598, 0, "낙양", 72, 68, 59, 0, 206, 260, "-", "-"); $gencount++;
|
||||
45, "유반",1599, 0, "낙양", 74, 79, 48, 0, 168, 210, "-", "-"); $gencount++;
|
||||
29, "유복",1600, 0, "낙양", 54, 50, 73, 0, 164, 208, "-", "-"); $gencount++;
|
||||
78, "유선2",1601, 0, "낙양", 9, 21, 39, 0, 224, 264, "-", "-"); $gencount++;
|
||||
139, "유섭",1602, 0, "낙양", 62, 79, 26, 0, 158, 190, "-", "-"); $gencount++;
|
||||
28, "유소",1603, 0, "낙양", 66, 51, 73, 0, 195, 264, "-", "-"); $gencount++;
|
||||
128, "유승",1604, 0, "낙양", 46, 69, 29, 0, 215, 258, "-", "-"); $gencount++;
|
||||
129, "유찬",1605, 0, "낙양", 74, 75, 66, 0, 172, 255, "-", "-"); $gencount++;
|
||||
129, "유평",1606, 0, "낙양", 65, 70, 67, 0, 218, 272, "-", "-"); $gencount++;
|
||||
138, "유훈",1607, 0, "낙양", 51, 64, 50, 0, 163, 216, "-", "-"); $gencount++;
|
||||
48, "이감",1608, 0, "낙양", 59, 67, 33, 0, 176, 211, "-", "-"); $gencount++;
|
||||
19, "이승",1609, 0, "낙양", 13, 26, 32, 0, 201, 249, "-", "-"); $gencount++;
|
||||
22, "이통",1610, 0, "낙양", 75, 84, 52, 0, 168, 211, "-", "-"); $gencount++;
|
||||
138, "이풍2",1611, 0, "낙양", 72, 77, 50, 0, 158, 199, "-", "-"); $gencount++;
|
||||
20, "이풍3",1612, 0, "낙양", 23, 25, 71, 0, 204, 254, "-", "-"); $gencount++;
|
||||
29, "장구",1613, 0, "낙양", 69, 71, 47, 0, 201, 263, "-", "-"); $gencount++;
|
||||
21, "장기",1614, 0, "낙양", 77, 35, 79, 0, 170, 223, "-", "-"); $gencount++;
|
||||
74, "장남",1615, 0, "낙양", 71, 64, 38, 0, 187, 222, "-", "-"); $gencount++;
|
||||
100, "장막",1616, 0, "낙양", 53, 52, 70, 0, 155, 195, "-", "-"); $gencount++;
|
||||
7, "장만성",1617, 0, "낙양", 73, 83, 47, 0, 143, 184, "-", "-"); $gencount++;
|
||||
135, "장반",1618, 0, "낙양", 56, 73, 66, 0, 227, 282, "-", "-"); $gencount++;
|
||||
78, "장빈",1619, 0, "낙양", 30, 28, 67, 0, 216, 263, "-", "-"); $gencount++;
|
||||
124, "장승",1620, 0, "낙양", 75, 68, 75, 0, 178, 244, "-", "-"); $gencount++;
|
||||
999, "장양2",1621, 0, "낙양", 58, 50, 47, 0, 130, 184, "-", "-"); $gencount++;
|
||||
68, "장억",1622, 0, "낙양", 82, 80, 54, 0, 190, 254, "-", "-"); $gencount++;
|
||||
75, "장준",1623, 0, "낙양", 65, 67, 66, 0, 224, 263, "-", "-"); $gencount++;
|
||||
20, "장집",1624, 0, "낙양", 31, 27, 74, 0, 196, 254, "-", "-"); $gencount++;
|
||||
39, "장특",1625, 0, "낙양", 71, 53, 74, 0, 209, 265, "-", "-"); $gencount++;
|
||||
96, "저곡",1626, 0, "낙양", 57, 53, 67, 0, 184, 204, "-", "-"); $gencount++;
|
||||
128, "전기",1627, 0, "낙양", 51, 69, 55, 0, 231, 258, "-", "-"); $gencount++;
|
||||
23, "전만",1628, 0, "낙양", 52, 74, 38, 0, 181, 235, "-", "-"); $gencount++;
|
||||
128, "전상",1629, 0, "낙양", 5, 6, 11, 0, 208, 258, "-", "-"); $gencount++;
|
||||
130, "전역",1630, 0, "낙양", 60, 62, 37, 0, 212, 265, "-", "-"); $gencount++;
|
||||
75, "전예",1631, 0, "낙양", 80, 62, 83, 0, 171, 252, "-", "-"); $gencount++;
|
||||
64, "전해",1632, 0, "낙양", 71, 63, 57, 0, 154, 199, "-", "-"); $gencount++;
|
||||
123, "정봉2",1633, 0, "낙양", 67, 68, 52, 0, 198, 266, "-", "-"); $gencount++;
|
||||
22, "정의",1634, 0, "낙양", 17, 3, 66, 0, 184, 220, "-", "-"); $gencount++;
|
||||
81, "제갈교",1635, 0, "낙양", 55, 17, 77, 0, 204, 228, "-", "-"); $gencount++;
|
||||
40, "제갈서",1636, 0, "낙양", 45, 43, 27, 0, 218, 286, "-", "-"); $gencount++;
|
||||
25, "조충",1637, 0, "낙양", 14, 7, 80, 0, 196, 208, "-", "-"); $gencount++;
|
||||
121, "종리목",1638, 0, "낙양", 84, 68, 75, 0, 214, 269, "-", "-"); $gencount++;
|
||||
22, "종육",1639, 0, "낙양", 27, 11, 71, 0, 223, 263, "-", "-"); $gencount++;
|
||||
122, "좌혁",1640, 0, "낙양", 60, 66, 51, 0, 232, 280, "-", "-"); $gencount++;
|
||||
36, "주령",1641, 0, "낙양", 77, 70, 69, 0, 170, 236, "-", "-"); $gencount++;
|
||||
115, "주앙",1642, 0, "낙양", 75, 64, 64, 0, 162, 195, "-", "-"); $gencount++;
|
||||
52, "주포",1643, 0, "낙양", 59, 72, 12, 0, 191, 225, "-", "-"); $gencount++;
|
||||
11, "주흔",1644, 0, "낙양", 67, 53, 77, 0, 159, 196, "-", "-"); $gencount++;
|
||||
140, "진기",1645, 0, "낙양", 58, 67, 46, 0, 165, 198, "-", "-"); $gencount++;
|
||||
142, "진란",1646, 0, "낙양", 65, 70, 43, 0, 157, 204, "-", "-"); $gencount++;
|
||||
25, "진랑",1647, 0, "낙양", 57, 70, 38, 0, 192, 234, "-", "-"); $gencount++;
|
||||
12, "진응",1648, 0, "낙양", 62, 69, 49, 0, 172, 208, "-", "-"); $gencount++;
|
||||
124, "진표",1649, 0, "낙양", 62, 49, 74, 0, 204, 237, "-", "-"); $gencount++;
|
||||
999, "채염",1650, 0, "낙양", 40, 22, 64, 0, 168, 237, "-", "-"); $gencount++;
|
||||
999, "초선",1651, 0, "낙양", 66, 15, 72, 0, 176, 211, "-", "-"); $gencount++;
|
||||
135, "초이",1652, 0, "낙양", 54, 65, 55, 0, 219, 266, "-", "-"); $gencount++;
|
||||
65, "추단",1653, 0, "낙양", 63, 71, 36, 0, 148, 193, "-", "-"); $gencount++;
|
||||
999, "추씨",1654, 0, "낙양", 36, 13, 54, 0, 165, 225, "-", "-"); $gencount++;
|
||||
71, "추정",1655, 0, "낙양", 67, 65, 66, 0, 144, 193, "-", "-"); $gencount++;
|
||||
145, "파재",1656, 0, "낙양", 69, 75, 52, 0, 145, 184, "-", "-"); $gencount++;
|
||||
22, "포신",1657, 0, "낙양", 78, 60, 83, 0, 152, 192, "-", "-"); $gencount++;
|
||||
114, "하식",1658, 0, "낙양", 18, 38, 29, 0, 230, 284, "-", "-"); $gencount++;
|
||||
36, "하안",1659, 0, "낙양", 6, 27, 72, 0, 190, 249, "-", "-"); $gencount++;
|
||||
999, "하후씨",1660, 0, "낙양", 29, 16, 47, 0, 186, 249, "-", "-"); $gencount++;
|
||||
5, "학맹",1661, 0, "낙양", 57, 66, 41, 0, 156, 197, "-", "-"); $gencount++;
|
||||
98, "한거자",1662, 0, "낙양", 53, 59, 30, 0, 158, 200, "-", "-"); $gencount++;
|
||||
19, "한덕",1663, 0, "낙양", 62, 79, 24, 0, 171, 228, "-", "-"); $gencount++;
|
||||
140, "한윤",1664, 0, "낙양", 27, 24, 68, 0, 155, 197, "-", "-"); $gencount++;
|
||||
999, "허소",1665, 0, "낙양", 53, 27, 60, 0, 150, 195, "-", "-"); $gencount++;
|
||||
30, "호열",1666, 0, "낙양", 77, 69, 76, 0, 225, 272, "-", "-"); $gencount++;
|
||||
76, "호제",1667, 0, "낙양", 58, 42, 68, 0, 207, 264, "-", "-"); $gencount++;
|
||||
149, "호진",1668, 0, "낙양", 65, 77, 13, 0, 146, 190, "-", "-"); $gencount++;
|
||||
29, "호질",1669, 0, "낙양", 73, 50, 75, 0, 192, 250, "-", "-"); $gencount++;
|
||||
7, "환계",1670, 0, "낙양", 12, 25, 67, 0, 156, 221, "-", "-"); $gencount++;
|
||||
56, "황숭",1671, 0, "낙양", 68, 64, 74, 0, 208, 263, "-", "-"); $gencount++;
|
||||
999, "황승언",1672, 0, "낙양", 68, 17, 81, 0, 165, 222, "-", "-"); $gencount++;
|
||||
999, "황월영",1673, 0, "낙양", 58, 14, 75, 0, 186, 235, "-", "-"); $gencount++;
|
||||
45, "황조",1674, 0, "낙양", 74, 65, 57, 0, 148, 208, "-", "-"); $gencount++;
|
||||
48, "후선",1675, 0, "낙양", 56, 66, 35, 0, 175, 228, "-", "-"); $gencount++;
|
||||
8, "휴고",1676, 0, "낙양", 61, 72, 40, 0, 151, 199, "-", "-"); $gencount++;
|
||||
98, "휴원진",1677, 0, "낙양", 53, 63, 38, 0, 155, 200, "-", "-"); $gencount++;
|
||||
22, "희지재",1678, 0, "낙양", 24, 5, 86, 0, 157, 194, "-", "-"); $gencount++;
|
||||
+70
-20
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\DTO\VoteInfo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -47,7 +49,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
||||
], 'owner=%i', $userID);
|
||||
}
|
||||
|
||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
|
||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
@@ -83,12 +85,12 @@ if ($gameStor->npcmode == 0) {
|
||||
$npcmode = "선택 생성";
|
||||
}
|
||||
$color = "cyan";
|
||||
$mapTheme = $gameStor->map_theme;
|
||||
$serverName = UniqueConst::$serverName;
|
||||
$serverCnt = $gameStor->server_cnt;
|
||||
|
||||
$auctionCount = $db->queryFirstField('SELECT count(`no`) FROM auction');
|
||||
$isTournamentActive = $gameStor->tournament == 1;
|
||||
$auctionCount = $db->queryFirstField('SELECT count(*) FROM ng_auction WHERE finished = 0');
|
||||
$isTournamentActive = $gameStor->tournament > 0;
|
||||
$isTournamentApplicationOpen = $gameStor->tournament == 1;
|
||||
$isBettingActive = $gameStor->tournament == 6;
|
||||
|
||||
$myNationStatic = getNationStaticInfo($generalObj->getNationID());
|
||||
@@ -109,6 +111,16 @@ if (!$otherTextInfo) {
|
||||
} else {
|
||||
$otherTextInfo = join(', ', $otherTextInfo);
|
||||
}
|
||||
|
||||
$lastVoteID = $gameStor->lastVote;
|
||||
$lastVote = null;
|
||||
if ($lastVoteID) {
|
||||
$voteStor = KVStorage::getStorage($db, 'vote');
|
||||
$lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}"));
|
||||
if ($lastVote->endDate && $lastVote->endDate < TimeUtil::now()) {
|
||||
$lastVote = null;
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -125,19 +137,34 @@ if (!$otherTextInfo) {
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/map.css') ?>
|
||||
<?= WebUtil::printStaticValues([
|
||||
//deprecated, staticValues를 이용할 것
|
||||
'serverName' => $serverName,
|
||||
'serverCnt' => $serverCnt,
|
||||
'serverNick' => DB::prefix(),
|
||||
'serverID' => UniqueConst::$serverID,
|
||||
'maxTurn' => GameConst::$maxTurn,
|
||||
'maxPushTurn' => 12,
|
||||
'commandList' => getCommandTable($generalObj),
|
||||
'serverNow' => TimeUtil::now(false),
|
||||
'baseColor2' => GameConst::$basecolor2,
|
||||
'lastExecuted' => $gameStor->turntime,
|
||||
'isLocked' => $plock,
|
||||
'isTournamentActive' => $isTournamentActive,
|
||||
'isBettingActive' => $isBettingActive
|
||||
'isBettingActive' => $isBettingActive,
|
||||
'staticValues' => [
|
||||
'serverName' => $serverName,
|
||||
'serverCnt' => $serverCnt,
|
||||
'serverNick' => DB::prefix(),
|
||||
'serverID' => UniqueConst::$serverID,
|
||||
'maxTurn' => GameConst::$maxTurn,
|
||||
'maxPushTurn' => 12,
|
||||
'commandList' => getCommandTable($generalObj),
|
||||
'serverNow' => TimeUtil::now(false),
|
||||
'lastExecuted' => $gameStor->turntime,
|
||||
'isLocked' => $plock,
|
||||
'isTournamentActive' => $isTournamentActive,
|
||||
'isBettingActive' => $isBettingActive,
|
||||
'mapName' => GameConst::$mapName,
|
||||
'unitSet' => GameConst::$unitSet,
|
||||
]
|
||||
]) ?>
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
|
||||
</head>
|
||||
@@ -163,7 +190,7 @@ if (!$otherTextInfo) {
|
||||
NPC선택 : <?= $npcmode ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
토너먼트 : <?= getTournamentTermText() ?>
|
||||
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
기타 설정: <?= $otherTextInfo ?>
|
||||
@@ -174,11 +201,11 @@ if (!$otherTextInfo) {
|
||||
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
|
||||
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-4">
|
||||
<?php if ($isTournamentActive) : ?>
|
||||
↑<span style='color:cyan'><?=(['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
|
||||
<?php else : ?>
|
||||
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
|
||||
<?php endif; ?>
|
||||
<?php if ($isTournamentActive) : ?>
|
||||
↑<span style='color:cyan'><?= (['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
|
||||
<?php else : ?>
|
||||
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
|
||||
@@ -192,13 +219,11 @@ if (!$otherTextInfo) {
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-4 vote-cell">
|
||||
<?php
|
||||
$vote = $gameStor->vote ?: [''];
|
||||
$vote_title = Tag2Code($gameStor->vote_title ?? '-');
|
||||
?>
|
||||
<?php if ($vote[0] == "") : ?>
|
||||
<?php if ($lastVote === null) : ?>
|
||||
<span style='color:magenta'>진행중 설문 없음</span>
|
||||
<?php else : ?>
|
||||
<span style='color:cyan'>설문 진행중</span> : <span><?= $vote_title ?></span>
|
||||
<span style='color:cyan'>설문 진행중</span> : <span><?= $lastVote->title ?></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -241,7 +266,7 @@ if (!$otherTextInfo) {
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div id="map_view" class="gx-0">
|
||||
<div id="mapZone" class="view-item"><?= getMapHtml($mapTheme) ?></div>
|
||||
<div id="mapZone" class="view-item"><?= getMapHtml() ?></div>
|
||||
<div class="view-item" id="reservedCommandZone">
|
||||
<div id="reservedCommandList"></div>
|
||||
<div id="actionMiniPlate" class="gx-0 row">
|
||||
@@ -257,7 +282,21 @@ if (!$otherTextInfo) {
|
||||
<div id="nation-position"><?php myNationInfo($generalObj); ?></div>
|
||||
<div id="general-position"><?php generalInfo($generalObj); ?></div>
|
||||
<div id="generalCommandButton" class="row gx-0">
|
||||
<div class="buttonPlate bg2"><?= commandButton(['btnClass' => 'btn btn-sammo-nation', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?></div>
|
||||
<div class="buttonPlate bg2">
|
||||
<?= commandButton([
|
||||
'splitBtnBegin' => '<div class="btn-group">',
|
||||
'splitBtnEnd' => '</div>',
|
||||
'splitZoneSign' => '<button type="button" class="btn btn-sammo-nation dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"><span class="visually-hidden">Toggle Dropdown</span></button>',
|
||||
'splitZoneBegin' => '<ul class="dropdown-menu dropdown-menu-end">',
|
||||
'splitZoneEnd' => '</ul>',
|
||||
'splitSubBtnBegin' => '<li>',
|
||||
'splitSubBtnEnd' => '</li>',
|
||||
'btnClass' => 'btn btn-sammo-nation',
|
||||
'btnSplitClass' => 'dropdown-item',
|
||||
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
|
||||
'isBettingActive' => $isBettingActive
|
||||
])
|
||||
?></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -357,7 +396,18 @@ if (!$otherTextInfo) {
|
||||
국가 메뉴
|
||||
</div>
|
||||
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
|
||||
<?= commandButton(['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?>
|
||||
<?= commandButton([
|
||||
'btnBegin' => '<li>',
|
||||
'btnEnd' => '</li>',
|
||||
'splitMainBegin' => '<div class="d-none">',
|
||||
'splitMainEnd' => '</div>',
|
||||
'splitSubBtnBegin' => '<li>',
|
||||
'splitSubBtnEnd' => '</li>',
|
||||
'btnClass' => 'dropdown-item',
|
||||
'btnSplitClass' => 'dropdown-item',
|
||||
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
|
||||
'isBettingActive' => $isBettingActive
|
||||
]) ?>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item dropup">
|
||||
|
||||
+4
-9
@@ -32,6 +32,7 @@ if ($session->userGrade < 5 && !$allowReset) {
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printCSS('css/install.css') ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'install']) ?>
|
||||
</head>
|
||||
|
||||
@@ -194,17 +195,11 @@ if ($session->userGrade < 5 && !$allowReset) {
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span> <span class="text-nowrap">경기 단위</span></label>
|
||||
<label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span></label>
|
||||
<div class="col-sm-9" id="tournament_trig">
|
||||
<div id="tournament_trig" class="btn-group-toggle btn-group flex-wrap" data-bs-toggle="buttons">
|
||||
<input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">안함</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">12분(총 5일)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_2" name="tournament_trig" value="2"><label for="tournament_trig_2" class="btn btn-secondary w-25">7분(총 10시간)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_3" name="tournament_trig" value="3"><label for="tournament_trig_3" class="btn btn-secondary w-25">3분(총 4시간)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_4" name="tournament_trig" value="4" checked><label for="tournament_trig_4" class="btn btn-secondary w-25">1분(총 82분)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_5" name="tournament_trig" value="5"><label for="tournament_trig_5" class="btn btn-secondary w-25">30초(총 41분)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_6" name="tournament_trig" value="6"><label for="tournament_trig_6" class="btn btn-secondary w-25">15초(총 21분)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_7" name="tournament_trig" value="7"><label for="tournament_trig_7" class="btn btn-secondary w-25">5초(총 7분)</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">수동</label>
|
||||
<input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" checked value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">자동</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+2
-2
@@ -56,7 +56,7 @@ else if(
|
||||
$status = 'closed';
|
||||
}
|
||||
else if(
|
||||
$isUnited > 0 &&
|
||||
$isUnited > 0 &&
|
||||
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
|
||||
){
|
||||
//천통 & 비정지 상태 & 2/3 넘음
|
||||
@@ -88,7 +88,7 @@ $result = ResetHelper::buildScenario(
|
||||
$options['block_general_create'],
|
||||
$options['npcmode'],
|
||||
$options['show_img_level'],
|
||||
$options['tournament_trig'],
|
||||
!!$options['tournament_trig'],
|
||||
$options['join_mode'],
|
||||
$options['starttime'],
|
||||
$options['autorun_user']?:null
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
WebUtil::requireAJAX();
|
||||
|
||||
$betTarget = Util::getPost('target', 'int', -1);
|
||||
$betGold = Util::getPost('amount', 'int', 0);
|
||||
|
||||
|
||||
if($betTarget < 0 || $betTarget >= 16 || $betGold < 10 || $betGold > 1000){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'올바르지 않은 입력입니다'
|
||||
]);
|
||||
}
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("베팅", 1);
|
||||
|
||||
$tournament = $gameStor->tournament;
|
||||
if($tournament != 6) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'베팅 기간이 아닙니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
$myGold = $db->queryFirstField('SELECT gold FROM general WHERE no = %i', $generalID);
|
||||
$bets = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
|
||||
$bets = array_splice($bets, -16);
|
||||
$totalBet = array_sum($bets);
|
||||
$oldBet = $bets[$betTarget];
|
||||
|
||||
$targetKey = "bet{$betTarget}";
|
||||
|
||||
if($myGold - $betGold < 500){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'여유 자금이 부족합니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
if($betGold + $totalBet > 1000){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'베팅 허용 금액을 초과했습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
$db->update('betting', [
|
||||
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold),
|
||||
], 'general_id = %i', $generalID);
|
||||
$db->update('general', [
|
||||
'gold'=>$db->sqleval('gold - %i', $betGold),
|
||||
], 'no = %i', $generalID);
|
||||
$db->update('rank_data', [
|
||||
'value'=>$db->sqleval('value + %i', $betGold)
|
||||
], 'general_id = %i AND type = "betgold"', $generalID);
|
||||
$db->update('betting', [
|
||||
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold)
|
||||
], 'general_id = 0');
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'reason'=>'SUCCESS'
|
||||
]);
|
||||
@@ -1,61 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
|
||||
WebUtil::requireAJAX();
|
||||
|
||||
$availableDieImmediately = false;
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$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);
|
||||
|
||||
if(!$general){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'장수가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
increaseRefresh("장수 삭제", 1);
|
||||
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
||||
|
||||
if($gameStor->turntime > $gameStor->opentime){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'이미 서버가 시작되었습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$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']);
|
||||
if($generalObj instanceof DummyGeneral){
|
||||
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
|
||||
}
|
||||
$generalName = $generalObj->getName();
|
||||
$josaYi = JosaUtil::pick($generalName, '이');
|
||||
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
|
||||
|
||||
$session->logoutGame();
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'reason'=>'success'
|
||||
]);
|
||||
@@ -100,7 +100,7 @@ if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){
|
||||
'reason'=>'파기'
|
||||
];
|
||||
}
|
||||
$msgText = "외교 서신 #{$letterNo}를 파기했습니다.";
|
||||
$msgText = "외교 서신(#{$letterNo})을 파기했습니다.";
|
||||
$lastState = 'cancelled';
|
||||
}
|
||||
else{
|
||||
@@ -114,7 +114,7 @@ else{
|
||||
'aux'=>Json::encode($aux)
|
||||
], 'no=%i', $letterNo);
|
||||
|
||||
$msgText = "외교 서신 #{$letterNo}를 파기 요청합니다.";
|
||||
$msgText = "외교 서신(#{$letterNo})을 파기 요청합니다.";
|
||||
$lastState = 'activated';
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ if($isAgree){
|
||||
], 'no=%i', $prevLetterNo);
|
||||
$prevLetterNo = $db->queryFirstField('SELECT prev_no FROM ng_diplomacy WHERE state != \'cancelled\' AND no = %i', $prevLetterNo);
|
||||
}
|
||||
$msgText = "외교 서신 #{$letterNo}가 승인되었습니다.";
|
||||
$msgText = "외교 서신( #{$letterNo})이 승인되었습니다.";
|
||||
}
|
||||
else{
|
||||
$aux['reason'] = [
|
||||
@@ -97,7 +97,7 @@ else{
|
||||
'state'=>'cancelled',
|
||||
'aux'=>Json::encode($aux)
|
||||
], 'no=%i', $letterNo);
|
||||
$msgText = "외교 서신 #{$letterNo}가 거부되었습니다.";
|
||||
$msgText = "외교 서신(#{$letterNo})이 거부되었습니다.";
|
||||
if($reason){
|
||||
$msgText .= ' 이유 : '.$reason;
|
||||
}
|
||||
|
||||
@@ -41,8 +41,6 @@ if ($permission < 4) {
|
||||
]);
|
||||
}
|
||||
|
||||
$reason = trim($reason);
|
||||
|
||||
$letter = $db->queryFirstRow('SELECT * FROM ng_diplomacy WHERE no=%i AND src_nation_id = %i AND state = \'proposed\'', $letterNo, $me['nation']);
|
||||
if(!$letter){
|
||||
Json::die([
|
||||
@@ -66,13 +64,13 @@ $unlimited = new \DateTime('9999-12-31');
|
||||
$aux['reason'] = [
|
||||
'who'=>$me['no'],
|
||||
'action'=>'cancelled',
|
||||
'reason'=>$reason
|
||||
'reason'=>'회수',
|
||||
];
|
||||
$db->update('ng_diplomacy', [
|
||||
'state'=>'cancelled',
|
||||
'aux'=>Json::encode($aux)
|
||||
], 'no=%i', $letterNo);
|
||||
$msgText = "외교 서신 #{$letterNo}가 회수되었습니다.";
|
||||
$msgText = "외교 서신(#{$letterNo})이 회수되었습니다.";
|
||||
|
||||
$msg = new Message(
|
||||
Message::MSGTYPE_DIPLOMACY,
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireLogin([]);
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$withToken = Util::getPost('with_token', 'bool', false);
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
if($session->isGameLoggedIn()){
|
||||
increaseRefresh("장수일람", 2);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
|
||||
]);
|
||||
}
|
||||
}
|
||||
else{
|
||||
$availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00';
|
||||
$now = new \DateTimeImmutable();
|
||||
|
||||
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
|
||||
]);
|
||||
}
|
||||
|
||||
$availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s');
|
||||
$session->availableNextCallGetGeneralList = $availableNextCall;
|
||||
}
|
||||
|
||||
$session->setReadOnly();
|
||||
|
||||
$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general');
|
||||
|
||||
$ownerNameList = [];
|
||||
if($gameStor->isunited){
|
||||
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
|
||||
$ownerNameList[$ownerID] = $ownerName;
|
||||
}
|
||||
}
|
||||
|
||||
$generalList = [];
|
||||
foreach($rawGeneralList as $rawGeneral){
|
||||
[$owner,$no,$picture,$imgsvr,$npc,$age,$nation,$special,$special2,$personal,$name,$ownerName,$injury,$leadership,$strength,$intel,$experience,$dedication,$officerLevel,$killturn,$connectCnt] = $rawGeneral;
|
||||
|
||||
if(key_exists($owner, $ownerNameList)){
|
||||
$ownerName = $ownerNameList[$owner];
|
||||
}
|
||||
|
||||
$nationArr = getNationStaticInfo($nation);
|
||||
$lbonus = calcLeadershipBonus($officerLevel, $nationArr['level']);
|
||||
|
||||
$generalList[] = [
|
||||
$no,
|
||||
$picture,
|
||||
$imgsvr,
|
||||
$npc,
|
||||
$age,
|
||||
$nationArr['name'],
|
||||
getGeneralSpecialDomesticName($special),
|
||||
getGeneralSpecialWarName($special2),
|
||||
getGenChar($personal),
|
||||
$name,
|
||||
$npc==1?$ownerName:null,
|
||||
$injury,
|
||||
$leadership,
|
||||
$lbonus,
|
||||
$strength,
|
||||
$intel,
|
||||
getExpLevel($experience),
|
||||
getHonor($experience),
|
||||
getDed($dedication),
|
||||
getOfficerLevelText($officerLevel, $nationArr['level']),
|
||||
$killturn,
|
||||
$connectCnt
|
||||
];
|
||||
}
|
||||
|
||||
$result = [
|
||||
'result'=>'true',
|
||||
'list'=>$generalList,
|
||||
];
|
||||
|
||||
if($withToken){
|
||||
$now = (new \DateTimeImmutable())->format('Y-m-d H:i:s');
|
||||
$tokens = [];
|
||||
foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){
|
||||
$validUntil = $token['valid_until'];
|
||||
|
||||
foreach(Json::decode($token['pick_result']) as $pickResult){
|
||||
$tokens[$pickResult['no']]=$pickResult['keepCnt'];
|
||||
}
|
||||
}
|
||||
$result['token'] = $tokens;
|
||||
}
|
||||
|
||||
Json::die($result);
|
||||
@@ -1,184 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
//통합 세력장수&암행부 viewer
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin([])->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$reqType = Util::getReq('req', 'int', 1);
|
||||
$reqForce = Util::getReq('force', 'bool', false);
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("세력장수", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $userID);
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
$nationID = $me['nation'];
|
||||
$permission = checkSecretPermission($me, true);
|
||||
if ($reqForce && $reqType > $permission) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => '권한이 부족합니다.'
|
||||
]);
|
||||
}
|
||||
$permission = min($reqType, $permission);
|
||||
$nationArr = getNationStaticInfo($nationID);
|
||||
$viewColumns = [
|
||||
'no' => 0,
|
||||
'name' => 0,
|
||||
'owner_name' => 9,
|
||||
'nation' => 0,
|
||||
'city' => 1,
|
||||
'officer_level' => 2,
|
||||
'officer_city' => 2,
|
||||
'npc' => 0,
|
||||
'defence_train' => 2,
|
||||
'troop' => 2,
|
||||
'injury' => 0,
|
||||
'leadership' => 0,
|
||||
'strength' => 0,
|
||||
'intel' => 0,
|
||||
'experience' => 1,
|
||||
'explevel' => 0,
|
||||
'dedication' => 1,
|
||||
'dedlevel' => 0,
|
||||
'gold' => 0,
|
||||
'rice' => 0,
|
||||
'crewtype' => 2,
|
||||
'crew' => 2,
|
||||
'train' => 2,
|
||||
'atmos' => 2,
|
||||
'killturn' => 0,
|
||||
'turntime' => 2,
|
||||
'picture' => 0,
|
||||
'imgsvr' => 0,
|
||||
'age' => 0,
|
||||
'special' => 0,
|
||||
'special2' => 0,
|
||||
'personal' => 0,
|
||||
'belong' => 0,
|
||||
'horse' => 2,
|
||||
'weapon' => 2,
|
||||
'book' => 2,
|
||||
'item' => 2,
|
||||
'connect' => 0
|
||||
];
|
||||
|
||||
$customViewColumns = [
|
||||
'officerLevel' => 0,
|
||||
'officerLevelText' => 0,
|
||||
'lbonus' => 0,
|
||||
'ownerName' => 0,
|
||||
'honorText' => 0
|
||||
];
|
||||
|
||||
function getOfficerLevel($rawGeneral)
|
||||
{
|
||||
global $permission;
|
||||
$level = $rawGeneral['officer_level'];
|
||||
if ($level >= 5) {
|
||||
return $level;
|
||||
}
|
||||
if ($permission > 1) {
|
||||
return $level;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
$specialViewFilter = [
|
||||
'officerLevel' => function ($rawGeneral){
|
||||
return getOfficerLevel($rawGeneral);
|
||||
},
|
||||
'special' => function ($rawGeneral) {
|
||||
return getGeneralSpecialDomesticName($rawGeneral['special']);
|
||||
},
|
||||
'special2' => function ($rawGeneral) {
|
||||
return getGeneralSpecialWarName($rawGeneral['special2']);
|
||||
},
|
||||
'personal' => function ($rawGeneral) {
|
||||
return getGenChar($rawGeneral['personal']);
|
||||
},
|
||||
'lbonus' => function ($rawGeneral) use ($nationArr) {
|
||||
return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']);
|
||||
},
|
||||
'ownerName' => function ($rawGeneral) {
|
||||
if ($rawGeneral['npc'] != 1) {
|
||||
return null;
|
||||
}
|
||||
return $rawGeneral['owner_name'];
|
||||
},
|
||||
'officerLevelText' => function ($rawGeneral) use ($nationArr) {
|
||||
$level = getOfficerLevel($rawGeneral);
|
||||
return getOfficerLevelText($level, $nationArr['level']);
|
||||
},
|
||||
'honorText' => function ($rawGeneral) {
|
||||
return getHonor($rawGeneral['experience']);
|
||||
},
|
||||
'dedLevelText' => function ($rawGeneral) {
|
||||
return getDedLevelText($rawGeneral['dedLevel']);
|
||||
},
|
||||
'turntime' => function ($rawGeneral) {
|
||||
//'0000-00-00 11:23';
|
||||
return substr($rawGeneral['turntime'], 11, 5);
|
||||
}
|
||||
|
||||
];
|
||||
|
||||
[$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys($viewColumns), 1);
|
||||
|
||||
$rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
|
||||
|
||||
$resultColumns = [];
|
||||
foreach ($viewColumns as $column => $reqPermission) {
|
||||
if ($reqPermission > $permission) {
|
||||
continue;
|
||||
}
|
||||
$resultColumns[] = $column;
|
||||
}
|
||||
|
||||
foreach ($customViewColumns as $column => $reqPermission) {
|
||||
if ($reqPermission > $permission) {
|
||||
continue;
|
||||
}
|
||||
$resultColumns[] = $column;
|
||||
}
|
||||
|
||||
$generalList = [];
|
||||
foreach ($rawGeneralList as $rawGeneral) {
|
||||
//General 생성?
|
||||
|
||||
$item = [];
|
||||
foreach ($resultColumns as $column) {
|
||||
if (key_exists($column, $specialViewFilter)) {
|
||||
$value = $specialViewFilter[$column]($rawGeneral);
|
||||
}
|
||||
else{
|
||||
$value = $rawGeneral[$column];
|
||||
}
|
||||
$item[] = $value;
|
||||
}
|
||||
|
||||
$generalList[] = $item;
|
||||
}
|
||||
|
||||
$result = [
|
||||
'result' => true,
|
||||
'column' => $resultColumns,
|
||||
'list' => $generalList,
|
||||
];
|
||||
|
||||
Json::die($result);
|
||||
@@ -110,16 +110,23 @@ foreach($db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `o
|
||||
}
|
||||
}
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'SelectNPCToken',
|
||||
$userID,
|
||||
$now,
|
||||
)));
|
||||
|
||||
$pickLimit = min(count($candidates), 5);
|
||||
|
||||
while(count($pickResult) < $pickLimit){
|
||||
$generalID = Util::choiceRandomUsingWeight($weight);
|
||||
$generalID = $rng->choiceUsingWeight($weight);
|
||||
if(!key_exists($generalID, $pickResult)){
|
||||
$pickResult[$generalID] = $candidates[$generalID];
|
||||
}
|
||||
}
|
||||
|
||||
$newNonce = mt_rand(0, 0xfffffff);
|
||||
$newNonce = random_int(0, 0xfffffff);
|
||||
|
||||
$validSecond = max(VALID_SECOND, $turnterm*40);
|
||||
$pickMoreSecond = max(PICK_MORE_SECOND, Util::round(pow($turnterm, 0.672)*8));
|
||||
|
||||
@@ -74,9 +74,13 @@ if($tokens){
|
||||
]);
|
||||
}
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed, 'selectPool', $userID, $now
|
||||
)));
|
||||
|
||||
$pick = [];
|
||||
$valid_until = null;
|
||||
foreach(pickGeneralFromPool($db, $userID, 14) as $pickObj){
|
||||
foreach(pickGeneralFromPool($db, $rng, $userID, 14) as $pickObj){
|
||||
$valid_until = $pickObj->getValidUntil();
|
||||
$info = $pickObj->getInfo();
|
||||
putInfoText($info);
|
||||
|
||||
+8
-8
@@ -4,8 +4,6 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
WebUtil::requireAJAX();
|
||||
|
||||
$session = Session::requireLogin([])->setReadOnly();
|
||||
|
||||
if(!class_exists('\\sammo\\DB')){
|
||||
@@ -113,7 +111,7 @@ $extend = (int)$_POST['extend'];
|
||||
$npcmode = (int)$_POST['npcmode'];
|
||||
$block_general_create = (bool)$_POST['block_general_create'];
|
||||
$show_img_level = (int)$_POST['show_img_level'];
|
||||
$tournament_trig = (int)$_POST['tournament_trig'];
|
||||
$tournament_trig = !!(int)$_POST['tournament_trig'];
|
||||
$join_mode = $_POST['join_mode'];
|
||||
$autorun_user_minutes = (int)$_POST['autorun_user_minutes'];
|
||||
$autorun_user_options = [];
|
||||
@@ -144,7 +142,7 @@ $autorun_user = $autorun_user_minutes?[
|
||||
if($reserve_open){
|
||||
$reserve_open = new \DateTime($reserve_open);
|
||||
$db = DB::db();
|
||||
|
||||
|
||||
if (!$db->queryFirstField("SHOW TABLES LIKE 'storage'")) {
|
||||
$clearResult = ResetHelper::clearDB();
|
||||
if(!$clearResult['result']){
|
||||
@@ -159,7 +157,9 @@ if($reserve_open){
|
||||
]);
|
||||
}
|
||||
|
||||
$scenarioObj = new Scenario($scenario, true);
|
||||
$rng = new RandUtil(new LiteHashDRBG(random_bytes(16)));
|
||||
|
||||
$scenarioObj = new Scenario($rng, $scenario, true);
|
||||
$open_date = $reserve_open->format('Y-m-d H:i:s');
|
||||
|
||||
$reserveInfo = [
|
||||
@@ -179,14 +179,14 @@ if($reserve_open){
|
||||
'autorun_user'=>$autorun_user
|
||||
];
|
||||
|
||||
|
||||
|
||||
if($pre_reserve_open){
|
||||
$pre_reserve_open = new \DateTime($pre_reserve_open);
|
||||
$open_date = $pre_reserve_open->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$db->delete('reserved_open', true);
|
||||
$db->insert('reserved_open', [
|
||||
'options'=>Json::encode($reserveInfo),
|
||||
@@ -208,7 +208,7 @@ Json::die(ResetHelper::buildScenario(
|
||||
$block_general_create,
|
||||
$npcmode,
|
||||
$show_img_level,
|
||||
$tournament_trig,
|
||||
!!$tournament_trig,
|
||||
$join_mode,
|
||||
TimeUtil::now(),
|
||||
$autorun_user
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$year = Util::getReq('year', 'int');
|
||||
$month = Util::getReq('month', 'int');
|
||||
$serverID = Util::getReq('serverID', 'string', null);
|
||||
|
||||
$url = '/a_history.php';
|
||||
|
||||
if(!strpos($_SERVER['HTTP_REFERER'], $url)) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'Invalid Referer'
|
||||
]);
|
||||
}
|
||||
|
||||
if($year === null || !$month) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'year, month가 지정되지 않았습니다'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
if(!$serverID){
|
||||
$serverID = UniqueConst::$serverID;
|
||||
}
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin([])->setReadOnly();
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$map = $db->queryFirstField('SELECT map FROM ng_history WHERE server_id=%s AND year=%i AND month=%i', $serverID, $year, $month);
|
||||
|
||||
if(!$map){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'해당하는 연월의 지도가 없습니다'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die($map, Json::PASS_THROUGH);
|
||||
+8
-15
@@ -31,17 +31,12 @@ $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();
|
||||
}
|
||||
WebUtil::setCacheHeader(new APICacheResult(TimeUtil::secondsToDateTime($mapModified), $mapEtag));
|
||||
$reqMapEtag = WebUtil::parseETag();
|
||||
$reqModifiedSince = WebUtil::parseLastModified();
|
||||
if($mapEtag === $reqMapEtag || $mapModified === $reqModifiedSince){
|
||||
WebUtil::dieWithNotModified();
|
||||
}
|
||||
|
||||
Json::die($mapInfo['data'], 0);
|
||||
}
|
||||
@@ -65,10 +60,9 @@ $rawMap = getWorldMap([
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$mapTheme = $gameStor->map_theme ?? 'che';
|
||||
|
||||
$rawMap['history'] = $history;
|
||||
$rawMap['theme'] = $mapTheme;
|
||||
$rawMap['theme'] = GameConst::$mapName;
|
||||
|
||||
$etag = hash('sha256', $serverID.$now);
|
||||
$map = [
|
||||
@@ -77,7 +71,6 @@ $map = [
|
||||
'data'=>$rawMap,
|
||||
];
|
||||
$cache->save("recent_map", $map);
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $now)." GMT");
|
||||
header("Etag: $etag");
|
||||
WebUtil::setCacheHeader(new APICacheResult(TimeUtil::secondsToDateTime($now), $etag));
|
||||
|
||||
Json::die($map['data'], 0);
|
||||
+35
-26
@@ -241,34 +241,43 @@ function do추방(General $general, int $myOfficerLevel):?string{
|
||||
}
|
||||
$general->setVar('troop', 0);
|
||||
|
||||
if($general->getNPCType() >= 2 && Util::randBool(GameConst::$npcBanMessageProb)) {
|
||||
if($general->getNPCType() >= 2){
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'BanNPC',
|
||||
$env['year'],
|
||||
$env['month'],
|
||||
$general->getID(),
|
||||
)));
|
||||
if ($rng->nextBool(GameConst::$npcBanMessageProb)) {
|
||||
|
||||
$str = Util::choiceRandom([
|
||||
'날 버리다니... 곧 전장에서 복수해주겠다...',
|
||||
'추방이라... 내가 무얼 잘못했단 말인가...',
|
||||
'어디 추방해가면서 잘되나 보자... 꼭 복수하겠다...',
|
||||
'인덕이 제일이거늘... 추방이 웬말인가... 저주한다!',
|
||||
'날 추방했으니 그 복수로 적국에 정보를 팔아 넘겨야겠군요. 그럼 이만.'
|
||||
]);
|
||||
$str = $rng->choice([
|
||||
'날 버리다니... 곧 전장에서 복수해주겠다...',
|
||||
'추방이라... 내가 무얼 잘못했단 말인가...',
|
||||
'어디 추방해가면서 잘되나 보자... 꼭 복수하겠다...',
|
||||
'인덕이 제일이거늘... 추방이 웬말인가... 저주한다!',
|
||||
'날 추방했으니 그 복수로 적국에 정보를 팔아 넘겨야겠군요. 그럼 이만.'
|
||||
]);
|
||||
|
||||
$src = new MessageTarget(
|
||||
$generalID,
|
||||
$generalName,
|
||||
$nationID,
|
||||
$nation['name'],
|
||||
$nation['color'],
|
||||
GetImageURL($general->getVar('imgsvr'), $general->getVar('picture'))
|
||||
);
|
||||
$msg = new Message(
|
||||
Message::MSGTYPE_PUBLIC,
|
||||
$src,
|
||||
$src,
|
||||
$str,
|
||||
new \DateTime(),
|
||||
new \DateTime('9999-12-31'),
|
||||
[]
|
||||
);
|
||||
$msg->send();
|
||||
$src = new MessageTarget(
|
||||
$generalID,
|
||||
$generalName,
|
||||
$nationID,
|
||||
$nation['name'],
|
||||
$nation['color'],
|
||||
GetImageURL($general->getVar('imgsvr'), $general->getVar('picture'))
|
||||
);
|
||||
$msg = new Message(
|
||||
Message::MSGTYPE_PUBLIC,
|
||||
$src,
|
||||
$src,
|
||||
$str,
|
||||
new \DateTime(),
|
||||
new \DateTime('9999-12-31'),
|
||||
[]
|
||||
);
|
||||
$msg->send();
|
||||
}
|
||||
}
|
||||
|
||||
if($env['year'] < $env['startyear']+3) {
|
||||
|
||||
@@ -6,6 +6,7 @@ include "func.php";
|
||||
|
||||
WebUtil::requireAJAX();
|
||||
|
||||
/** @var int|null */
|
||||
$pick = Util::getPost('pick', 'int');
|
||||
|
||||
if(!$pick){
|
||||
|
||||
@@ -103,7 +103,7 @@ foreach(GameConst::$generalPoolAllowOption as $allowOption){
|
||||
}
|
||||
else if($allowOption == 'ego'){
|
||||
if(!$personal || $personal == 'Random'){
|
||||
$personal = Util::choiceRandom(GameConst::$availablePersonality);
|
||||
$personal = Util::choiceRandom(GameConst::$availablePersonality);
|
||||
}
|
||||
if(!array_search($personal, GameConst::$availablePersonality)){
|
||||
Json::die([
|
||||
|
||||
@@ -44,7 +44,7 @@ if($defence_train !== $me->getVar('defence_train')){
|
||||
$me->increaseVar('myset', -1);
|
||||
$me->setVar('defence_train', $defence_train);
|
||||
$me->increaseVarWithLimit('train', -3, 20);
|
||||
$me->increaseVarWithLimit('atmos', -3, 20);
|
||||
$me->increaseVarWithLimit('atmos', -6, 20);
|
||||
}
|
||||
else{
|
||||
$me->increaseVar('myset', -1);
|
||||
|
||||
@@ -82,7 +82,7 @@ function applyNationPolicy($policy, $nationID, $generalName): ?string
|
||||
return "{$troopID}는 국가의 부대가 아닙니다.";
|
||||
}
|
||||
if ($troopCache[$troopID] != 'Neutral') {
|
||||
return "부대({$troopID}는 하나의 역할만 지정할 수 있습니다.";
|
||||
return "부대({$troopID})는 하나의 역할만 지정할 수 있습니다.";
|
||||
}
|
||||
if (!is_array($troopTarget) || count($troopTarget) != 2) {
|
||||
return "{$troopID}의 입력양식이 올바르지 않습니다.";
|
||||
|
||||
+37
-27
@@ -1,6 +1,9 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
use Ds\Map;
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -54,7 +57,7 @@ $defaultCheck = [
|
||||
['year', 0]
|
||||
],
|
||||
'array'=>[
|
||||
'attackerGeneral', 'attackerCity', 'attackerNation',
|
||||
'attackerGeneral', 'attackerCity', 'attackerNation',
|
||||
'defenderGenerals', 'defenderCity', 'defenderNation'
|
||||
],
|
||||
];
|
||||
@@ -84,14 +87,14 @@ $rawDefenderNation = $query['defenderNation'];
|
||||
|
||||
$generalCheck = [
|
||||
'required'=>[
|
||||
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
||||
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
|
||||
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
||||
'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',
|
||||
'recent_war', 'warnum', 'killnum', 'killcrew',
|
||||
],
|
||||
'integer'=>[
|
||||
'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',
|
||||
'warnum', 'killnum', 'killcrew',
|
||||
],
|
||||
@@ -154,18 +157,18 @@ foreach($rawDefenderList as $idx=>$rawDefenderGeneral){
|
||||
]);
|
||||
}
|
||||
$rawDefenderGeneral['owner'] = 0;
|
||||
|
||||
|
||||
$defenderList[] = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||
}
|
||||
|
||||
|
||||
$cityCheck = [
|
||||
'required'=>[
|
||||
'city', 'nation', 'supply', 'name',
|
||||
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
|
||||
'city', 'nation', 'supply', 'name',
|
||||
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
|
||||
'trust', 'level',
|
||||
'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max',
|
||||
'dead', 'state', 'conflict',
|
||||
'dead', 'state', 'conflict',
|
||||
],
|
||||
'numeric'=>[
|
||||
'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'trust', 'dead'
|
||||
@@ -258,7 +261,7 @@ if($action == 'reorder'){
|
||||
foreach($defenderList as $defenderGeneral){
|
||||
$order[] = $defenderGeneral->getID();
|
||||
}
|
||||
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'reason'=>'success',
|
||||
@@ -278,29 +281,35 @@ unset($defenderList);
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$startYear = $gameStor->startyear;
|
||||
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
|
||||
|
||||
function extractRankVar(array $rawVal):array{
|
||||
$rankVars = [];
|
||||
function extractRankVar(array $rawVal):Map{
|
||||
$rankVars = new Map;
|
||||
foreach($rawVal as $rawKey=>$rawVal){
|
||||
if(key_exists($rawKey, General::RANK_COLUMN)){
|
||||
$rankVars[$rawKey] = $rawVal;
|
||||
$key = RankColumn::tryFrom($rawKey);
|
||||
if($key === null){
|
||||
continue;
|
||||
}
|
||||
$rankVars[$key] = $rawVal;
|
||||
}
|
||||
return $rankVars;
|
||||
}
|
||||
|
||||
function simulateBattle(
|
||||
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||
$startYear, $year, $month, $cityRate
|
||||
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||
$startYear, $year, $month
|
||||
){
|
||||
|
||||
$warSeed = bin2hex(random_bytes(16));
|
||||
$warRng = new RandUtil(new LiteHashDRBG($warSeed));
|
||||
|
||||
$attacker = new WarUnitGeneral(
|
||||
$warRng,
|
||||
new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month),
|
||||
$rawAttackerNation,
|
||||
true
|
||||
);
|
||||
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
|
||||
$city = new WarUnitCity($warRng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
||||
|
||||
$iterDefender = new \ArrayIterator($rawDefenderList);
|
||||
$iterDefender->rewind();
|
||||
@@ -310,8 +319,8 @@ function simulateBattle(
|
||||
$attackerRice = $rawAttacker['rice'];
|
||||
$defenderRice = 0;
|
||||
|
||||
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext)
|
||||
use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) {
|
||||
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext)
|
||||
use ($warRng, $iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) {
|
||||
if($prevDefender !== null){
|
||||
$prevDefender->getLogger()->rollback();
|
||||
$battleResult[] = $prevDefender;
|
||||
@@ -336,6 +345,7 @@ function simulateBattle(
|
||||
$defenderRice += $defenderObj->getVar('rice');
|
||||
|
||||
$retVal = new WarUnitGeneral(
|
||||
$warRng,
|
||||
$defenderObj,
|
||||
$rawDefenderNation,
|
||||
false
|
||||
@@ -344,7 +354,7 @@ function simulateBattle(
|
||||
return $retVal;
|
||||
};
|
||||
|
||||
$conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear);
|
||||
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city, $year - $startYear);
|
||||
|
||||
$rawDefenderCity = $city->getRaw();
|
||||
$updateAttackerNation = [];
|
||||
@@ -356,7 +366,7 @@ function simulateBattle(
|
||||
$rice = $city->getKilled() / 100 * 0.8;
|
||||
$rice *= $city->getCrewType()->rice;
|
||||
$rice *= getTechCost($rawDefenderNation['tech']);
|
||||
$rice *= $cityRate / 100 - 0.2;
|
||||
$rice *= $city->getCityTrainAtmos() / 100 - 0.2;
|
||||
Util::setRound($rice);
|
||||
|
||||
$defenderRice += $rice;
|
||||
@@ -393,13 +403,13 @@ $defendersActivatedSkills = [];
|
||||
foreach(Util::range($repeatCnt) as $repeatIdx){
|
||||
/** @var WarUnit $attacker */
|
||||
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
|
||||
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||
$startYear, $year, $month, $cityRate
|
||||
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||
$startYear, $year, $month
|
||||
);
|
||||
$lastWarLog = Util::mapWithKey(function($key, $values){
|
||||
return ConvertLog(join('<br>', $values));
|
||||
}, $attacker->getLogger()->rollback());
|
||||
}, $attacker->getLogger()->rollback());
|
||||
|
||||
$avgPhase += $attacker->getPhase() / $repeatCnt;
|
||||
|
||||
@@ -443,7 +453,7 @@ foreach(Util::range($repeatCnt) as $repeatIdx){
|
||||
$activatedSkills[$skillName] += $skillCnt / $repeatCnt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,32 +53,6 @@ if($action == '부대창설'){
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == '부대변경'){
|
||||
$name = StringUtil::neutralize($name);
|
||||
if(!$name){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'부대 이름이 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
$db->update('troop', [
|
||||
'name'=>$name
|
||||
], 'troop_leader=%i',$generalID);
|
||||
|
||||
if($db->affectedRows() == 0){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'부대장이 아닙니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'reason'=>'success'
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == '부대추방'){
|
||||
if (!$gen){
|
||||
Json::die([
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ $loader->addClassMap((function () {
|
||||
|
||||
|
||||
//디버그용 매크로
|
||||
ini_set("session.cache_expire", 10080); // minutes
|
||||
ini_set("session.cache_expire", "10080"); // minutes
|
||||
|
||||
ob_start();
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
0
|
||||
@@ -1,53 +0,0 @@
|
||||
로그활성화
|
||||
show variables like '%log%';
|
||||
|
||||
ALTER TABLE mysql.general_log
|
||||
ADD COLUMN seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT AFTER argument,
|
||||
ADD PRIMARY KEY(seq),
|
||||
ENGINE=MYISAM;
|
||||
|
||||
set global expire_logs_days=7;
|
||||
set global log_output='TABLE';
|
||||
set global general_log=1;
|
||||
|
||||
select count(*) from mysql.general_log;
|
||||
select * from mysql.general_log limit 100;
|
||||
|
||||
set global general_log=0;
|
||||
truncate mysql.general_log;
|
||||
|
||||
|
||||
캐시들
|
||||
show variables like '%cache%';
|
||||
show status like '%cache%';
|
||||
show variables like '%key%';
|
||||
show status like '%key%';
|
||||
|
||||
key_buffer_size 줄이자. 현16M -> 8M이하
|
||||
myisam_sort_buffer_size 줄이자. 현8M -> 2M
|
||||
|
||||
innodb 설정
|
||||
기존 Antelope 포맷은 가변컬럼의 767바이트까지만 저장하고 나머지는 offset하여 외부에 저장한다.
|
||||
그런데 innodb는 1개 행이 최대 8KB만 저장 가능하므로 가변컬럼이 11개 이상인 경우는 오류 위험이 있다.
|
||||
(MyISAM은 64KB)
|
||||
Barracuda 포맷에 Dynamic 또는 Compressed를 사용하면 포인터 20바이트만 저장하고 실데이터는 외부에 저장한다.
|
||||
|
||||
[mysqld]
|
||||
innodb_file_format=barracuda
|
||||
innodb_file_per_table=1
|
||||
|
||||
|
||||
innodb 최적화
|
||||
innodb_buffer_pool_size: 체섭 테이블 최대 5M정도. 인덱스 포함해도 32M면 충분?
|
||||
innodb_flush_method: 기본값대로. O_DIRECT는 메모리가 커서 캐시 2중 필요 없을때만.
|
||||
innodb_file_per_table: 테이블마다 독립파일로 저장
|
||||
innodb_flush_log_at_trx_commit: 기본1(커밋마다), 0(로그찰때만), 추천2(1초마다)
|
||||
innodb_log_file_size: 현 5M, 많이 키워도 될듯
|
||||
innodb_log_buffer_size: 기본 8M 적당
|
||||
innodb_thread_concurrency: 코어개수 2배 정도
|
||||
|
||||
sync_binlog=0 이미 꺼져있음
|
||||
|
||||
ib_logfile0, ib_logfile1은 로그사이즈 바꾸면 재시작이 안되므로 지우고 다시 해야함
|
||||
|
||||
alter table table_name engine=innodb row_format=dynamic
|
||||
+54
-29
@@ -3,9 +3,10 @@
|
||||
namespace sammo;
|
||||
|
||||
|
||||
function processWar(General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity)
|
||||
function processWar(string $warSeed, General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity)
|
||||
{
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG($warSeed));
|
||||
$db = DB::db();
|
||||
|
||||
$attackerNationID = $attackerGeneral->getNationID();
|
||||
@@ -28,11 +29,11 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
}
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
[$startYear, $year, $month, $cityRate, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'city_rate', 'join_mode']);
|
||||
[$startYear, $year, $month, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'join_mode']);
|
||||
|
||||
$attacker = new WarUnitGeneral($attackerGeneral, $rawAttackerNation, true);
|
||||
$attacker = new WarUnitGeneral($rng, $attackerGeneral,$rawAttackerNation, true);
|
||||
|
||||
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
|
||||
$city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
||||
|
||||
$defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city'));
|
||||
$defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
|
||||
@@ -44,7 +45,7 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
$iterDefender = new \ArrayIterator($defenderList);
|
||||
$iterDefender->rewind();
|
||||
|
||||
$getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $rawDefenderNation, $rawDefenderCity, $db) {
|
||||
$getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($rng, $iterDefender, $rawDefenderNation, $rawDefenderCity, $db) {
|
||||
if ($prevDefender !== null) {
|
||||
$prevDefender->applyDB($db);
|
||||
}
|
||||
@@ -65,6 +66,7 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
|
||||
|
||||
$retVal = new WarUnitGeneral(
|
||||
$rng,
|
||||
$nextDefender,
|
||||
$rawDefenderNation,
|
||||
false
|
||||
@@ -73,7 +75,7 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
return $retVal;
|
||||
};
|
||||
|
||||
$conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear);
|
||||
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city, $year - $startYear);
|
||||
|
||||
$attacker->applyDB($db);
|
||||
|
||||
@@ -88,7 +90,7 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
$rice = $city->getKilled() / 100 * 0.8;
|
||||
$rice *= $city->getCrewType()->rice;
|
||||
$rice *= getTechCost($rawDefenderNation['tech']);
|
||||
$rice *= $cityRate / 100 - 0.2;
|
||||
$rice *= $city->getCityTrainAtmos() / 100 - 0.2;
|
||||
Util::setRound($rice);
|
||||
|
||||
$updateDefenderNation['rice'] = max(0, $rawDefenderNation['rice'] - $rice);
|
||||
@@ -111,8 +113,8 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
'dead' => $db->sqleval('dead + %i', $totalDead * 0.6)
|
||||
], 'city=%i', $rawDefenderCity['city']);
|
||||
|
||||
$attackerIncTech = buildNationTypeClass($rawAttackerNation['type'])->onCalcDomestic('기술', 'score', $attacker->getDead() * 0.01);
|
||||
$defenderIncTech = buildNationTypeClass($rawDefenderNation['type'])->onCalcDomestic('기술', 'score', $attacker->getKilled() * 0.01);
|
||||
$attackerIncTech = buildNationTypeClass($rawAttackerNation['type'])->onCalcDomestic('기술', 'score', $attacker->getDead() * 0.012);
|
||||
$defenderIncTech = buildNationTypeClass($rawDefenderNation['type'])->onCalcDomestic('기술', 'score', $attacker->getKilled() * 0.009);
|
||||
|
||||
$attackerGenCnt = $rawAttackerNation['gennum'];
|
||||
$defenderGenCnt = $rawDefenderNation['gennum'];
|
||||
@@ -173,7 +175,6 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
|
||||
'startyear' => $startYear,
|
||||
'year' => $year,
|
||||
'month' => $month,
|
||||
'city_rate' => $cityRate,
|
||||
'join_mode' => $joinMode,
|
||||
], $attacker->getGeneral(), $city->getRaw());
|
||||
}
|
||||
@@ -206,6 +207,7 @@ function extractBattleOrder(General $general)
|
||||
}
|
||||
|
||||
function processWar_NG(
|
||||
string $warSeed,
|
||||
WarUnitGeneral $attacker,
|
||||
callable $getNextDefender,
|
||||
WarUnitCity $city,
|
||||
@@ -228,10 +230,13 @@ function processWar_NG(
|
||||
$josaRo = JosaUtil::pick($city->getName(), '로');
|
||||
$josaYi = JosaUtil::pick($attacker->getName(), '이');
|
||||
|
||||
$logger->pushGlobalActionLog("<D><b>{$attacker->getNationVar('name')}</b></>의 <Y>{$attacker->getName()}</>{$josaYi} <G><b>{$city->getName()}</b></>{$josaRo} 진격합니다.");
|
||||
$logger->pushGeneralActionLog("<G><b>{$city->getName()}</b></>{$josaRo} <M>진격</>합니다. <1>$date</>");
|
||||
$logger->pushGlobalActionLog("<D><b>{$attacker->getNationVar('name')}</b></>의 <Y>{$attacker->getName()}</>{$josaYi} <G><b>{$city->getName()}</b></>{$josaRo} 진격합니다.<span class='hidden_but_copyable'>(전투시드: {$warSeed})</span>");
|
||||
$logger->pushGeneralActionLog("<G><b>{$city->getName()}</b></>{$josaRo} <M>진격</>합니다.<span class='hidden_but_copyable'>(전투시드: {$warSeed})</span> <1>$date</>");
|
||||
|
||||
for ($currPhase = 0; $currPhase < $attacker->getMaxPhase(); $currPhase += 1) {
|
||||
$logWritten = false;
|
||||
|
||||
while($attacker->getPhase() < $attacker->getMaxPhase()){
|
||||
$logWritten = false;
|
||||
if ($defender === null) {
|
||||
$defender = $city;
|
||||
|
||||
@@ -256,8 +261,8 @@ function processWar_NG(
|
||||
}
|
||||
}
|
||||
|
||||
if ($defender->getPhase() == 0) {
|
||||
$defender->setPrePhase($currPhase);
|
||||
if ($defender->getPhase() == 0 && $defender->getOppose() == null) {
|
||||
$defender->setPrePhase($attacker->getPhase());
|
||||
|
||||
$attacker->addTrain(1);
|
||||
$defender->addTrain(1);
|
||||
@@ -266,10 +271,10 @@ function processWar_NG(
|
||||
$defenderCrewTypeCoef = $defender->getCrewType()->getAttackCoef($attacker->getCrewType()) * $attacker->getCrewType()->getDefenceCoef($defender->getCrewType());
|
||||
/*
|
||||
if($attackerCrewTypeCoef > $defenderCrewTypeCoef && $attacker instanceof WarUnitGeneral){
|
||||
$attacker->getGeneral()->increaseInheritancePoint('snipe_combat', 1);
|
||||
$attacker->getGeneral()->increaseInheritancePoint(InheritanceKey::snipe_combat, 1);
|
||||
}
|
||||
if($defenderCrewTypeCoef > $attackerCrewTypeCoef && $defender instanceof WarUnitGeneral){
|
||||
$defender->getGeneral()->increaseInheritancePoint('snipe_combat', 1);
|
||||
$defender->getGeneral()->increaseInheritancePoint(InheritanceKey::snipe_combat, 1);
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -306,7 +311,7 @@ function processWar_NG(
|
||||
$initCaller = $attacker->getGeneral()->getBattleInitSkillTriggerList($attacker);
|
||||
$initCaller->merge($defender->getGeneral()->getBattleInitSkillTriggerList($defender));
|
||||
|
||||
$initCaller->fire([], [$attacker, $defender]);
|
||||
$initCaller->fire($attacker->rng, [], [$attacker, $defender]);
|
||||
}
|
||||
|
||||
$attacker->beginPhase();
|
||||
@@ -315,7 +320,7 @@ function processWar_NG(
|
||||
$battleCaller = $attacker->getGeneral()->getBattlePhaseSkillTriggerList($attacker);
|
||||
$battleCaller->merge($defender->getGeneral()->getBattlePhaseSkillTriggerList($defender));
|
||||
|
||||
$battleCaller->fire([], [$attacker, $defender]);
|
||||
$battleCaller->fire($attacker->rng, [], [$attacker, $defender]);
|
||||
|
||||
$deadDefender = $attacker->calcDamage();
|
||||
$deadAttacker = $defender->calcDamage();
|
||||
@@ -347,15 +352,22 @@ function processWar_NG(
|
||||
$attacker->increaseKilled($deadDefender);
|
||||
$defender->increaseKilled($deadAttacker);
|
||||
|
||||
$phaseNickname = $currPhase + 1;
|
||||
if($defender->getPhase() < 0){
|
||||
$phaseNickname = '先';
|
||||
}
|
||||
else{
|
||||
$currPhase = $attacker->getPhase() + 1;
|
||||
$phaseNickname = "{$currPhase} ";
|
||||
}
|
||||
|
||||
|
||||
if ($deadAttacker > 0 || $deadDefender > 0) {
|
||||
$attacker->getLogger()->pushGeneralBattleDetailLog(
|
||||
"$phaseNickname : <Y1>【{$attacker->getName()}】</> <C>{$attacker->getHP()} (-$deadAttacker)</> VS <C>{$defender->getHP()} (-$deadDefender)</> <Y1>【{$defender->getName()}】</>"
|
||||
"$phaseNickname: <Y1>【{$attacker->getName()}】</> <C>{$attacker->getHP()} (-$deadAttacker)</> VS <C>{$defender->getHP()} (-$deadDefender)</> <Y1>【{$defender->getName()}】</>"
|
||||
);
|
||||
|
||||
$defender->getLogger()->pushGeneralBattleDetailLog(
|
||||
"$phaseNickname : <Y1>【{$defender->getName()}】</> <C>{$defender->getHP()} (-$deadDefender)</> VS <C>{$attacker->getHP()} (-$deadAttacker)</> <Y1>【{$attacker->getName()}】</>"
|
||||
"$phaseNickname: <Y1>【{$defender->getName()}】</> <C>{$defender->getHP()} (-$deadDefender)</> VS <C>{$attacker->getHP()} (-$deadAttacker)</> <Y1>【{$attacker->getName()}】</>"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -364,6 +376,8 @@ function processWar_NG(
|
||||
$defender->addPhase();
|
||||
|
||||
if (!$attacker->continueWar($noRice)) {
|
||||
$logWritten = true;
|
||||
|
||||
$attacker->logBattleResult();
|
||||
$defender->logBattleResult();
|
||||
|
||||
@@ -386,6 +400,7 @@ function processWar_NG(
|
||||
}
|
||||
|
||||
if (!$defender->continueWar($noRice)) {
|
||||
$logWritten = true;
|
||||
|
||||
$attacker->logBattleResult();
|
||||
$defender->logBattleResult();
|
||||
@@ -414,7 +429,7 @@ function processWar_NG(
|
||||
$defender->getLogger()->pushGeneralActionLog("전멸했습니다.", ActionLogger::PLAIN);
|
||||
}
|
||||
|
||||
if ($currPhase + 1 == $attacker->getMaxPhase()) {
|
||||
if ($attacker->getPhase() >= $attacker->getMaxPhase()) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -427,7 +442,7 @@ function processWar_NG(
|
||||
}
|
||||
}
|
||||
|
||||
if ($currPhase == $attacker->getMaxPhase()) {
|
||||
if (!$logWritten) {
|
||||
//마지막 페이즈의 전투 마무리
|
||||
$attacker->logBattleResult();
|
||||
$defender->logBattleResult();
|
||||
@@ -497,6 +512,16 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
$cityID = $city['city'];
|
||||
$cityName = $city['name'];
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'ConquerCity',
|
||||
$year,
|
||||
$month,
|
||||
$attackerNationID,
|
||||
$attackerID,
|
||||
$cityID
|
||||
)));
|
||||
|
||||
$defenderNationID = $city['nation'];
|
||||
$defenderStaticNation = getNationStaticInfo($defenderNationID);
|
||||
$defenderNationName = $defenderStaticNation['name'];
|
||||
@@ -564,8 +589,8 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
$loseGeneralGold = 0;
|
||||
$loseGeneralRice = 0;
|
||||
foreach ($oldNationGenerals as $oldGeneral) {
|
||||
$loseGold = intdiv($oldGeneral->getVar('gold') * (rand() % 30 + 20), 100);
|
||||
$loseRice = intdiv($oldGeneral->getVar('rice') * (rand() % 30 + 20), 100);
|
||||
$loseGold = Util::toInt($oldGeneral->getVar('gold') * $rng->nextRange(0.2, 0.5));
|
||||
$loseRice = Util::toInt($oldGeneral->getVar('rice') * $rng->nextRange(0.2, 0.5));
|
||||
$oldGeneral->getLogger()->pushGeneralActionLog(
|
||||
"도주하며 금<C>$loseGold</> 쌀<C>$loseRice</>을 분실했습니다.",
|
||||
ActionLogger::PLAIN
|
||||
@@ -581,7 +606,7 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
$oldGeneral->applyDB($db);
|
||||
|
||||
//모두 등용장 발부
|
||||
if ($admin['join_mode'] != 'onlyRandom' && Util::randBool(0.5)) {
|
||||
if ($admin['join_mode'] != 'onlyRandom' && $rng->nextBool(0.5)) {
|
||||
$msg = ScoutMessage::buildScoutMessage($attackerID, $oldGeneral->getID());
|
||||
if ($msg) {
|
||||
$msg->send(true);
|
||||
@@ -590,11 +615,11 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
|
||||
//NPC인 경우 일정 확률로 임관(엔장, 인재, 의병)
|
||||
$npcType = $oldGeneral->getNPCType();
|
||||
if ($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(GameConst::$joinRuinedNPCProp)) {
|
||||
if ($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && $rng->nextBool(GameConst::$joinRuinedNPCProp)) {
|
||||
$cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [
|
||||
'destNationID' => $attackerNationID
|
||||
]);
|
||||
$joinTurn = Util::randRangeInt(0, 12);
|
||||
$joinTurn = $rng->nextRangeInt(0, 12);
|
||||
if ($joinTurn) {
|
||||
_setGeneralCommand(buildGeneralCommandClass('che_견문', $oldGeneral, $admin), iterator_to_array(Util::range($joinTurn)));
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<?php
|
||||
require('../vendor/autoload.php');
|
||||
|
||||
//ParsedownExtra;
|
||||
+5
-2
@@ -16,8 +16,10 @@ include "func.php";
|
||||
<title>최근 지도</title>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= WebUtil::printStaticValues([
|
||||
'serverNick' => DB::prefix(),
|
||||
'serverID' => UniqueConst::$serverID
|
||||
'staticValues' => [
|
||||
'serverNick' => DB::prefix(),
|
||||
'serverID' => UniqueConst::$serverID
|
||||
],
|
||||
]) ?>
|
||||
<?= WebUtil::printJS('d_shared/base_map.js') ?>
|
||||
|
||||
@@ -25,6 +27,7 @@ include "func.php";
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/map.css') ?>
|
||||
<?= WebUtil::printDist('ts', ['common', 'recent_map'], true) ?>
|
||||
<?= WebUtil::printDist('vue', [], true) ?>
|
||||
<style>
|
||||
html {
|
||||
width: 700px;
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionBuyRice;
|
||||
use sammo\AuctionUniqueItem;
|
||||
use sammo\Validator;
|
||||
use sammo\General;
|
||||
|
||||
class BidBuyRiceAuction extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
$v = new Validator($this->args);
|
||||
$v->rule('required', [
|
||||
'auctionID',
|
||||
'amount',
|
||||
])
|
||||
->rule('int', 'amount')
|
||||
->rule('int', 'auctionID');
|
||||
|
||||
if (!$v->validate()) {
|
||||
return $v->errorStr();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$auctionID = $this->args['auctionID'];
|
||||
$amount = $this->args['amount'];
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$auction = new AuctionBuyRice($auctionID, $general);
|
||||
$result = $auction->bid($amount, true);
|
||||
|
||||
if (is_string($result)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionSellRice;
|
||||
use sammo\Validator;
|
||||
use sammo\General;
|
||||
|
||||
class BidSellRiceAuction extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
$v = new Validator($this->args);
|
||||
$v->rule('required', [
|
||||
'auctionID',
|
||||
'amount',
|
||||
])
|
||||
->rule('int', 'amount')
|
||||
->rule('int', 'auctionID');
|
||||
|
||||
if (!$v->validate()) {
|
||||
return $v->errorStr();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$auctionID = $this->args['auctionID'];
|
||||
$amount = $this->args['amount'];
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$auction = new AuctionSellRice($auctionID, $general);
|
||||
$result = $auction->bid($amount, true);
|
||||
|
||||
if (is_string($result)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionUniqueItem;
|
||||
use sammo\Validator;
|
||||
use sammo\GameConst;
|
||||
use sammo\General;
|
||||
|
||||
class BidUniqueAuction extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
$v = new Validator($this->args);
|
||||
$v->rule('required', [
|
||||
'auctionID',
|
||||
'amount',
|
||||
])
|
||||
->rule('int', 'amount')
|
||||
->rule('int', 'auctionID')
|
||||
->rule('boolean', 'extendCloseDate');
|
||||
|
||||
if (!$v->validate()) {
|
||||
return $v->errorStr();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$auctionID = $this->args['auctionID'];
|
||||
$amount = $this->args['amount'];
|
||||
$tryExtendCloseDate = $this->args['extendCloseDate'] ?? false;
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$auction = new AuctionUniqueItem($auctionID, $general);
|
||||
$result = $auction->bid($amount, $tryExtendCloseDate);
|
||||
|
||||
if (is_string($result)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionSellRice;
|
||||
use sammo\DB;
|
||||
use sammo\DTO\AuctionBidItem;
|
||||
use sammo\DTO\AuctionInfo;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Validator;
|
||||
use sammo\General;
|
||||
use sammo\Json;
|
||||
use sammo\TimeUtil;
|
||||
use sammo\Util;
|
||||
|
||||
use function sammo\getAuctionLogRecent;
|
||||
|
||||
class GetActiveResourceAuctionList extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$buyRiceList = [];
|
||||
$sellRiceList = [];
|
||||
/** @var AuctionInfo[] */
|
||||
$auctions = array_map(fn ($raw) => AuctionInfo::fromArray($raw), $db->query(
|
||||
'SELECT * FROM `ng_auction` WHERE `type` IN %ls AND `finished` = 0 ORDER BY `close_date` ASC',
|
||||
[
|
||||
AuctionType::BuyRice->value,
|
||||
AuctionType::SellRice->value,
|
||||
]
|
||||
));
|
||||
|
||||
$recentLogs = getAuctionLogRecent(20);
|
||||
|
||||
|
||||
if (!$auctions) {
|
||||
return [
|
||||
'result' => true,
|
||||
'buyRice' => $buyRiceList,
|
||||
'sellRice' => $sellRiceList,
|
||||
'recentLogs' => $recentLogs,
|
||||
'generalID' => $session->generalID,
|
||||
];
|
||||
}
|
||||
|
||||
$auctionIDList = [];
|
||||
foreach ($auctions as $auction) {
|
||||
$auctionIDList[] = $auction->id;
|
||||
}
|
||||
|
||||
|
||||
$rawHighestBids = Util::convertArrayToDict($db->query(
|
||||
'SELECT bid.* FROM `ng_auction_bid` bid INNER JOIN (
|
||||
SELECT `auction_id`, MAX(`amount`) as `max_amount`
|
||||
FROM `ng_auction_bid`
|
||||
WHERE `auction_id` IN %li
|
||||
GROUP BY `auction_id`
|
||||
ORDER BY `amount`
|
||||
) AS max_bid
|
||||
ON bid.`auction_id` = max_bid.`auction_id` AND bid.`amount` = max_bid.`max_amount`',
|
||||
$auctionIDList,
|
||||
) ?? [], 'auction_id');
|
||||
/** @var array<int,AuctionBidItem> */
|
||||
$highestBids = Util::mapWithKey(
|
||||
fn ($auctionID, $bid) => AuctionBidItem::fromArray($bid),
|
||||
$rawHighestBids
|
||||
);
|
||||
|
||||
foreach ($auctions as $auction) {
|
||||
$rawAuction = [
|
||||
'id' => $auction->id,
|
||||
'type' => $auction->type->value,
|
||||
'hostGeneralID' => $auction->hostGeneralID,
|
||||
'hostName' => $auction->detail->hostName,
|
||||
'openDate' => TimeUtil::format($auction->openDate, false),
|
||||
'closeDate' => TimeUtil::format($auction->closeDate, false),
|
||||
'amount' => $auction->detail->amount,
|
||||
'startBidAmount' => $auction->detail->startBidAmount,
|
||||
'finishBidAmount' => $auction->detail->finishBidAmount,
|
||||
];
|
||||
|
||||
$highestBid = $highestBids[$rawAuction['id']] ?? null;
|
||||
if ($highestBid === null) {
|
||||
$rawAuction['highestBid'] = null;
|
||||
} else {
|
||||
$rawAuction['highestBid'] = [
|
||||
'amount' => $highestBid->amount,
|
||||
'date' => TimeUtil::format($highestBid->date, false),
|
||||
'generalID' => $highestBid->generalID,
|
||||
'generalName' => $highestBid->aux->generalName,
|
||||
];
|
||||
}
|
||||
|
||||
if ($rawAuction['type'] == AuctionType::BuyRice->value) {
|
||||
$buyRiceList[] = $rawAuction;
|
||||
} else {
|
||||
$sellRiceList[] = $rawAuction;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'result' => true,
|
||||
'buyRice' => $buyRiceList,
|
||||
'sellRice' => $sellRiceList,
|
||||
'recentLogs' => $recentLogs,
|
||||
'generalID' => $session->generalID,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionUniqueItem;
|
||||
use sammo\DB;
|
||||
use sammo\DTO\AuctionBidItem;
|
||||
use sammo\DTO\AuctionInfo;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\InheritancePointManager;
|
||||
use sammo\TimeUtil;
|
||||
use sammo\Validator;
|
||||
use sammo\General;
|
||||
|
||||
class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
$v = new Validator($this->args);
|
||||
$v->rule('required', [
|
||||
'auctionID',
|
||||
])
|
||||
->rule('integer', 'auctionID');
|
||||
|
||||
if (!$v->validate()) {
|
||||
return $v->errorStr();
|
||||
}
|
||||
$this->args['auctionID'] = (int)$this->args['auctionID'];
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$auctionID = $this->args['auctionID'];
|
||||
|
||||
$rawAuction = $db->queryFirstRow(
|
||||
'SELECT * FROM `ng_auction` WHERE `type` = %s AND `id` = %i',
|
||||
AuctionType::UniqueItem->value,
|
||||
$auctionID
|
||||
);
|
||||
|
||||
if (!$rawAuction) {
|
||||
return '선택한 경매가 없습니다.';
|
||||
}
|
||||
|
||||
$auction = AuctionInfo::fromArray($rawAuction);
|
||||
|
||||
/** @var AuctionBidItem[] */
|
||||
$bidList = array_map(fn ($raw) => AuctionBidItem::fromArray($raw), $db->query(
|
||||
'SELECT * FROM `ng_auction_bid` WHERE `auction_id` = %s ORDER BY `amount` DESC',
|
||||
$auctionID
|
||||
) ?? []);
|
||||
|
||||
$responseBid = [];
|
||||
foreach ($bidList as $bid) {
|
||||
$responseBid[] = [
|
||||
'generalName' => $bid->aux->generalName,
|
||||
'amount' => $bid->amount,
|
||||
'isCallerHighestBidder' => $bid->generalID === $generalID,
|
||||
'date' => TimeUtil::format($bid->date, false),
|
||||
];
|
||||
}
|
||||
|
||||
$inheritMgr = InheritancePointManager::getInstance();
|
||||
//preveious라서 column을 최대한 비울 수 있다.
|
||||
$remainPoint = $inheritMgr->getInheritancePoint(
|
||||
General::createGeneralObjFromDB($generalID, ['owner'], 0),
|
||||
InheritanceKey::previous
|
||||
);
|
||||
|
||||
$obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID);
|
||||
|
||||
return [
|
||||
'result' => true,
|
||||
'auction' => [
|
||||
'id' => $auction->id,
|
||||
'finished' => $auction->finished,
|
||||
'title' => $auction->detail->title,
|
||||
'target' => $auction->target,
|
||||
'isCallerHost' => $auction->hostGeneralID === $generalID,
|
||||
'hostName' => $auction->detail->hostName,
|
||||
'closeDate' => TimeUtil::format($auction->closeDate, false),
|
||||
'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt,
|
||||
'availableLatestBidCloseDate' => TimeUtil::format($auction->detail->availableLatestBidCloseDate, false),
|
||||
],
|
||||
'bidList' => $responseBid,
|
||||
'obfuscatedName' => $obfuscatedName,
|
||||
'remainPoint' => $remainPoint,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionUniqueItem;
|
||||
use sammo\DB;
|
||||
use sammo\DTO\AuctionBidItem;
|
||||
use sammo\DTO\AuctionInfo;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\TimeUtil;
|
||||
use sammo\Util;
|
||||
|
||||
class GetUniqueItemAuctionList extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$generalID = $session->generalID;
|
||||
|
||||
/** @var AuctionInfo[] */
|
||||
$auctions = array_map(fn($raw)=>AuctionInfo::fromArray($raw), $db->query(
|
||||
'SELECT * FROM `ng_auction` WHERE `type` = %s ORDER BY `close_date` ASC',
|
||||
AuctionType::UniqueItem->value
|
||||
) ?? []);
|
||||
|
||||
$obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID);
|
||||
|
||||
if(!$auctions){
|
||||
return [
|
||||
'result' => true,
|
||||
'list' => [],
|
||||
'obfuscatedName' => $obfuscatedName,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
$auctionIDList = [];
|
||||
foreach ($auctions as $auction) {
|
||||
$auctionIDList[] = $auction->id;
|
||||
}
|
||||
|
||||
$rawHighestBids = Util::convertArrayToDict($db->query(
|
||||
'SELECT bid.* FROM `ng_auction_bid` bid INNER JOIN (
|
||||
SELECT `auction_id`, MAX(`amount`) as `max_amount`
|
||||
FROM `ng_auction_bid`
|
||||
WHERE `auction_id` IN %li
|
||||
GROUP BY `auction_id`
|
||||
ORDER BY `amount`
|
||||
) AS max_bid
|
||||
ON bid.`auction_id` = max_bid.`auction_id` AND bid.`amount` = max_bid.`max_amount`',
|
||||
$auctionIDList,
|
||||
) ?? [], 'auction_id');
|
||||
/** @var array<int,AuctionBidItem> */
|
||||
$highestBids = Util::mapWithKey(
|
||||
fn ($auctionID, $bid) => AuctionBidItem::fromArray($bid),
|
||||
$rawHighestBids
|
||||
);
|
||||
|
||||
$response = [];
|
||||
foreach ($auctions as $auction) {
|
||||
$auctionID = $auction->id;
|
||||
$highestBid = $highestBids[$auctionID] ?? null;
|
||||
if($highestBid === null){
|
||||
continue;
|
||||
}
|
||||
|
||||
$response[] = [
|
||||
'id' => $auctionID,
|
||||
'finished' => $auction->finished,
|
||||
'title' => $auction->detail->title,
|
||||
'target' => $auction->target,
|
||||
'isCallerHost' => $auction->hostGeneralID === $generalID,
|
||||
'hostName' => $auction->detail->hostName,
|
||||
'closeDate' => TimeUtil::format($auction->closeDate, false),
|
||||
'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt,
|
||||
'availableLatestBidCloseDate' => TimeUtil::format($auction->detail->availableLatestBidCloseDate, false),
|
||||
'highestBid' => [
|
||||
'generalName' => $highestBid->aux->generalName,
|
||||
'amount' => $highestBid->amount,
|
||||
'isCallerHighestBidder' => $highestBid->generalID === $generalID,
|
||||
'date' => $highestBid->date,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'result' => true,
|
||||
'list' => $response,
|
||||
'obfuscatedName' => $obfuscatedName,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\API\Auction;
|
||||
|
||||
use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\AuctionBuyRice;
|
||||
use sammo\DB;
|
||||
use sammo\Validator;
|
||||
use sammo\GameConst;
|
||||
use sammo\General;
|
||||
use sammo\KVStorage;
|
||||
use sammo\Util;
|
||||
|
||||
class OpenBuyRiceAuction extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
$availableItems = [];
|
||||
foreach (GameConst::$allItems as $items) {
|
||||
foreach ($items as $itemKey => $amount) {
|
||||
if ($amount == 0) {
|
||||
continue;
|
||||
}
|
||||
$availableItems[$itemKey] = $amount;
|
||||
}
|
||||
}
|
||||
|
||||
$v = new Validator($this->args);
|
||||
$v->rule('required', [
|
||||
'amount',
|
||||
'closeTurnCnt',
|
||||
'startBidAmount',
|
||||
'finishBidAmount',
|
||||
])
|
||||
->rule('int', 'amount')
|
||||
->rule('int', 'closeTurnCnt')
|
||||
->rule('min', 'amount', 100)
|
||||
->rule('max', 'amount', 10000)
|
||||
->rule('int', 'startBidAmount')
|
||||
->rule('int', 'finishBidAmount');
|
||||
|
||||
|
||||
if (!$v->validate()) {
|
||||
return $v->errorStr();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRequiredSessionMode(): int
|
||||
{
|
||||
return static::REQ_GAME_LOGIN;
|
||||
}
|
||||
|
||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||
{
|
||||
/** @var int */
|
||||
$amount = $this->args['amount'];
|
||||
/** @var int */
|
||||
$closeTurnCnt = $this->args['closeTurnCnt'];
|
||||
|
||||
/** @var int */
|
||||
$startBidAmount = $this->args['startBidAmount'];
|
||||
/** @var int */
|
||||
$finishBidAmount = $this->args['finishBidAmount'];
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
[$initYear, $initMonth, $year, $month] = $gameStor->getValuesAsArray(['init_year', 'init_month', 'year', 'month']);
|
||||
$initYearMonth = Util::joinYearMonth($initYear, $initMonth);
|
||||
$yearMonth = Util::joinYearMonth($year, $month);
|
||||
|
||||
if($yearMonth < $initYearMonth + 3){
|
||||
return '시작 후 3개월이 지나야 경매를 열 수 있습니다.';
|
||||
}
|
||||
|
||||
$auctionResult = AuctionBuyRice::openResourceAuction(
|
||||
$general,
|
||||
$amount,
|
||||
$closeTurnCnt,
|
||||
$startBidAmount,
|
||||
$finishBidAmount
|
||||
);
|
||||
|
||||
if (is_string($auctionResult)) {
|
||||
return $auctionResult;
|
||||
}
|
||||
|
||||
return [
|
||||
'result' => true,
|
||||
'auctionID' => $auctionResult->getInfo()->id,
|
||||
];
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user