Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
673b7054aa | ||
|
|
1472cbf257 | ||
|
|
d806935c58 | ||
|
|
6b56eb79e1 | ||
|
|
d2aea16744 | ||
|
|
bb800f032e | ||
|
|
64b9f9443e | ||
|
|
fd2d3a0e06 | ||
|
|
08d678bdb8 | ||
|
|
418007e572 | ||
|
|
4a1bccdf75 | ||
|
|
00c0b59e9d | ||
|
|
ac82c8ff0b | ||
|
|
f4bef8a090 | ||
|
|
d8a1055bff | ||
|
|
d672ce4d80 | ||
|
|
43ec361d03 | ||
|
|
c3c99c5f76 | ||
|
|
eb1e1421ab | ||
|
|
e8a1d87919 | ||
|
|
921ba6811d | ||
|
|
906dd241b4 | ||
|
|
3f0cd2ad64 | ||
|
|
41420d1954 | ||
|
|
6e5a72b170 | ||
|
|
4b19e6aec8 | ||
|
|
58572cbc36 | ||
|
|
096d5766bf | ||
|
|
f5c5b56492 | ||
|
|
69c69d63e6 | ||
|
|
3fd8b21867 | ||
|
|
8660e8cd85 | ||
|
|
8458f725f2 | ||
|
|
366678c965 | ||
|
|
336b5668db | ||
|
|
55886269ea | ||
|
|
0b3698595b | ||
|
|
05e43a39db | ||
|
|
5737ad3db2 | ||
|
|
4ac174eb9a | ||
|
|
895eec10b4 | ||
|
|
e0d891e89a | ||
|
|
adf7734b85 | ||
|
|
5362be9c21 | ||
|
|
847ece52f2 | ||
|
|
851c59d22c | ||
|
|
0669534bba | ||
|
|
05db47e62a | ||
|
|
4a0e608d1c | ||
|
|
45fe73af86 | ||
|
|
4d9fcd657f | ||
|
|
a057deb0fe | ||
|
|
4766210a7d | ||
|
|
fd26aae6d3 | ||
|
|
c5c092cc8e | ||
|
|
58c0a21d90 | ||
|
|
8dc567f966 | ||
|
|
942b2752f5 | ||
|
|
b9259353f4 | ||
|
|
86c614dd40 | ||
|
|
1a010a16a9 | ||
|
|
d5b5726b1e | ||
|
|
d06f3b6bdf | ||
|
|
97a28f716c | ||
|
|
f54bdfcea0 | ||
|
|
5958c4b0ba | ||
|
|
7c3db881c7 | ||
|
|
51ee2e1b2c | ||
|
|
baa813004b | ||
|
|
86b5269d3d | ||
|
|
860e6dacac | ||
|
|
22025bd89e | ||
|
|
ed9301455d | ||
|
|
35df84e059 | ||
|
|
62deebf310 | ||
|
|
7ed4bd5c01 | ||
|
|
c8eb9332b4 | ||
|
|
1df55f9168 | ||
|
|
b726c6aa96 | ||
|
|
0a71962652 | ||
|
|
160946ef74 | ||
|
|
1dc67317dc | ||
|
|
08f4a2e8bf | ||
|
|
11ffdaa8f7 | ||
|
|
0f853303a4 | ||
|
|
d225eb9b16 | ||
|
|
d926e4b8bc | ||
|
|
3e2df1d4d8 | ||
|
|
d670dbf081 | ||
|
|
f510a312e3 | ||
|
|
19c44e3d31 | ||
|
|
d0848aee67 | ||
|
|
f4b4b6811c | ||
|
|
fecb3f1f7b | ||
|
|
4c924c0763 | ||
|
|
f1e8d70554 | ||
|
|
7d11bc152e |
+32
-26
@@ -15,20 +15,34 @@ return [
|
|||||||
// Note that the **only** effect of choosing `'5.6'` is to infer
|
// Note that the **only** effect of choosing `'5.6'` is to infer
|
||||||
// that functions removed in php 7.0 exist.
|
// that functions removed in php 7.0 exist.
|
||||||
// (See `backward_compatibility_checks` for additional options)
|
// (See `backward_compatibility_checks` for additional options)
|
||||||
"target_php_version" => '7.4',
|
"target_php_version" => '8.0',
|
||||||
'backward_compatibility_checks ' => true,
|
'backward_compatibility_checks ' => true,
|
||||||
'minimum_severity'=>\Phan\Issue::SEVERITY_CRITICAL,
|
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
|
||||||
|
|
||||||
'file_list' => [
|
'file_list' => [
|
||||||
'f_config/config.php',
|
'f_config/config.php',
|
||||||
|
'hwe/_119_b.php',
|
||||||
|
'hwe/_119.php',
|
||||||
'hwe/a_bestGeneral.php',
|
'hwe/a_bestGeneral.php',
|
||||||
'hwe/a_emperior.php',
|
'hwe/_admin1.php',
|
||||||
|
'hwe/_admin1_submit.php',
|
||||||
|
'hwe/_admin2.php',
|
||||||
|
'hwe/_admin2_submit.php',
|
||||||
|
'hwe/_admin4.php',
|
||||||
|
'hwe/_admin4_submit.php',
|
||||||
|
'hwe/_admin5.php',
|
||||||
|
'hwe/_admin5_submit.php',
|
||||||
|
'hwe/_admin7.php',
|
||||||
|
'hwe/_admin8.php',
|
||||||
|
'hwe/_admin_force_rehall.php',
|
||||||
'hwe/a_emperior_detail.php',
|
'hwe/a_emperior_detail.php',
|
||||||
|
'hwe/a_emperior.php',
|
||||||
'hwe/a_genList.php',
|
'hwe/a_genList.php',
|
||||||
'hwe/a_hallOfFame.php',
|
'hwe/a_hallOfFame.php',
|
||||||
'hwe/a_history.php',
|
'hwe/a_history.php',
|
||||||
'hwe/a_kingdomList.php',
|
'hwe/a_kingdomList.php',
|
||||||
'hwe/a_npcList.php',
|
'hwe/a_npcList.php',
|
||||||
|
'hwe/api.php',
|
||||||
'hwe/a_status.php',
|
'hwe/a_status.php',
|
||||||
'hwe/a_traffic.php',
|
'hwe/a_traffic.php',
|
||||||
'hwe/a_vote.php',
|
'hwe/a_vote.php',
|
||||||
@@ -41,13 +55,11 @@ return [
|
|||||||
'hwe/b_dipcenter.php',
|
'hwe/b_dipcenter.php',
|
||||||
'hwe/b_diplomacy.php',
|
'hwe/b_diplomacy.php',
|
||||||
'hwe/b_genList.php',
|
'hwe/b_genList.php',
|
||||||
'hwe/v_inheritPoint.php',
|
|
||||||
'hwe/b_myBossInfo.php',
|
'hwe/b_myBossInfo.php',
|
||||||
'hwe/b_myCityInfo.php',
|
'hwe/b_myCityInfo.php',
|
||||||
'hwe/b_myGenInfo.php',
|
'hwe/b_myGenInfo.php',
|
||||||
'hwe/b_myKingdomInfo.php',
|
'hwe/b_myKingdomInfo.php',
|
||||||
'hwe/b_myPage.php',
|
'hwe/b_myPage.php',
|
||||||
'hwe/b_npc_control.php',
|
|
||||||
'hwe/b_processing.php',
|
'hwe/b_processing.php',
|
||||||
'hwe/b_tournament.php',
|
'hwe/b_tournament.php',
|
||||||
'hwe/b_troop.php',
|
'hwe/b_troop.php',
|
||||||
@@ -55,7 +67,6 @@ return [
|
|||||||
'hwe/c_dipcenter.php',
|
'hwe/c_dipcenter.php',
|
||||||
'hwe/c_tournament.php',
|
'hwe/c_tournament.php',
|
||||||
'hwe/c_vote.php',
|
'hwe/c_vote.php',
|
||||||
'hwe/func.php',
|
|
||||||
'hwe/func_auction.php',
|
'hwe/func_auction.php',
|
||||||
'hwe/func_command.php',
|
'hwe/func_command.php',
|
||||||
'hwe/func_converter.php',
|
'hwe/func_converter.php',
|
||||||
@@ -64,16 +75,15 @@ return [
|
|||||||
'hwe/func_legacy.php',
|
'hwe/func_legacy.php',
|
||||||
'hwe/func_map.php',
|
'hwe/func_map.php',
|
||||||
'hwe/func_message.php',
|
'hwe/func_message.php',
|
||||||
|
'hwe/func.php',
|
||||||
'hwe/func_process.php',
|
'hwe/func_process.php',
|
||||||
'hwe/func_string.php',
|
'hwe/func_string.php',
|
||||||
'hwe/func_template.php',
|
'hwe/func_template.php',
|
||||||
'hwe/func_time_event.php',
|
'hwe/func_time_event.php',
|
||||||
'hwe/func_tournament.php',
|
'hwe/func_tournament.php',
|
||||||
'hwe/index.php',
|
'hwe/index.php',
|
||||||
'hwe/install.php',
|
|
||||||
'hwe/install_db.php',
|
'hwe/install_db.php',
|
||||||
'hwe/join.php',
|
'hwe/install.php',
|
||||||
'hwe/join_post.php',
|
|
||||||
'hwe/j_adjust_icon.php',
|
'hwe/j_adjust_icon.php',
|
||||||
'hwe/j_autoreset.php',
|
'hwe/j_autoreset.php',
|
||||||
'hwe/j_basic_info.php',
|
'hwe/j_basic_info.php',
|
||||||
@@ -92,8 +102,8 @@ return [
|
|||||||
'hwe/j_general_log_old.php',
|
'hwe/j_general_log_old.php',
|
||||||
'hwe/j_general_set_permission.php',
|
'hwe/j_general_set_permission.php',
|
||||||
'hwe/j_general_turn.php',
|
'hwe/j_general_turn.php',
|
||||||
'hwe/j_getChiefTurn.php',
|
|
||||||
'hwe/j_get_basic_general_list.php',
|
'hwe/j_get_basic_general_list.php',
|
||||||
|
'hwe/j_getChiefTurn.php',
|
||||||
'hwe/j_get_city_list.php',
|
'hwe/j_get_city_list.php',
|
||||||
'hwe/j_get_general_list.php',
|
'hwe/j_get_general_list.php',
|
||||||
'hwe/j_get_nation_general_list.php',
|
'hwe/j_get_nation_general_list.php',
|
||||||
@@ -101,11 +111,12 @@ return [
|
|||||||
'hwe/j_get_select_npc_token.php',
|
'hwe/j_get_select_npc_token.php',
|
||||||
'hwe/j_get_select_pool.php',
|
'hwe/j_get_select_pool.php',
|
||||||
'hwe/j_image_upload.php',
|
'hwe/j_image_upload.php',
|
||||||
'hwe/j_install.php',
|
|
||||||
'hwe/j_install_db.php',
|
'hwe/j_install_db.php',
|
||||||
|
'hwe/j_install.php',
|
||||||
'hwe/j_load_scenarios.php',
|
'hwe/j_load_scenarios.php',
|
||||||
'hwe/j_map.php',
|
|
||||||
'hwe/j_map_history.php',
|
'hwe/j_map_history.php',
|
||||||
|
'hwe/j_map.php',
|
||||||
|
'hwe/j_map_recent.php',
|
||||||
'hwe/j_msg_contact_list.php',
|
'hwe/j_msg_contact_list.php',
|
||||||
'hwe/j_msg_decide_opt.php',
|
'hwe/j_msg_decide_opt.php',
|
||||||
'hwe/j_msg_delete.php',
|
'hwe/j_msg_delete.php',
|
||||||
@@ -123,26 +134,20 @@ return [
|
|||||||
'hwe/j_set_npc_control.php',
|
'hwe/j_set_npc_control.php',
|
||||||
'hwe/j_simulate_battle.php',
|
'hwe/j_simulate_battle.php',
|
||||||
'hwe/j_troop.php',
|
'hwe/j_troop.php',
|
||||||
|
'hwe/j_update_picked_general.php',
|
||||||
'hwe/j_vacation.php',
|
'hwe/j_vacation.php',
|
||||||
'hwe/lib.php',
|
'hwe/lib.php',
|
||||||
'hwe/process_war.php',
|
'hwe/process_war.php',
|
||||||
|
'hwe/proc.php',
|
||||||
|
'hwe/readme.php',
|
||||||
|
'hwe/recent_map.php',
|
||||||
'hwe/select_general_from_pool.php',
|
'hwe/select_general_from_pool.php',
|
||||||
'hwe/select_npc.php',
|
'hwe/select_npc.php',
|
||||||
'hwe/t_board.php',
|
|
||||||
'hwe/t_diplomacy.php',
|
'hwe/t_diplomacy.php',
|
||||||
'hwe/_119.php',
|
'hwe/v_board.php',
|
||||||
'hwe/_119_b.php',
|
'hwe/v_inheritPoint.php',
|
||||||
'hwe/_admin1.php',
|
'hwe/v_join.php',
|
||||||
'hwe/_admin1_submit.php',
|
'hwe/v_NPCControl.php',
|
||||||
'hwe/_admin2.php',
|
|
||||||
'hwe/_admin2_submit.php',
|
|
||||||
'hwe/_admin4.php',
|
|
||||||
'hwe/_admin4_submit.php',
|
|
||||||
'hwe/_admin5.php',
|
|
||||||
'hwe/_admin5_submit.php',
|
|
||||||
'hwe/_admin7.php',
|
|
||||||
'hwe/_admin8.php',
|
|
||||||
'hwe/_admin_force_rehall.php',
|
|
||||||
],
|
],
|
||||||
|
|
||||||
// A list of directories that should be parsed for class and
|
// A list of directories that should be parsed for class and
|
||||||
@@ -179,6 +184,7 @@ return [
|
|||||||
|
|
||||||
'suppress_issue_types' => [
|
'suppress_issue_types' => [
|
||||||
'PhanUnreferencedUseNormal',
|
'PhanUnreferencedUseNormal',
|
||||||
|
'PhanTypeArraySuspiciousNullable',
|
||||||
],
|
],
|
||||||
|
|
||||||
// A list of plugin files to execute.
|
// A list of plugin files to execute.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<title>닫혀 있습니다.</title>
|
<title>닫혀 있습니다.</title>
|
||||||
<script>
|
<script>
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
window.location = window.location+'/../';
|
window.location.href = '../';
|
||||||
}, 5000);
|
}, 5000);
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 Hide_D, 62che
|
Copyright (c) 2021 Hide_D, 62che
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
require(__DIR__ . '/vendor/autoload.php');
|
||||||
|
|
||||||
|
|
||||||
|
if (!class_exists('\\sammo\\RootDB')) {
|
||||||
|
Json::dieWithReason('No DB');
|
||||||
|
}
|
||||||
|
|
||||||
|
APIHelper::launch(dirname(__FILE__));
|
||||||
+3
-1
@@ -28,7 +28,9 @@
|
|||||||
"catfan/medoo": "^1.5",
|
"catfan/medoo": "^1.5",
|
||||||
"phan/phan": "*",
|
"phan/phan": "*",
|
||||||
"erusev/parsedown-extra": "^0.8.1",
|
"erusev/parsedown-extra": "^0.8.1",
|
||||||
"nette/caching": "^3.0"
|
"nette/caching": "^3.0",
|
||||||
|
"illuminate/database": "^8.61",
|
||||||
|
"illuminate/events": "^8.61"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|||||||
Generated
+987
-9
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "2aeb036fc53a6fdc343bd2707d4697ee",
|
"content-hash": "317938cff7b30806f4e385a70f4943fc",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "brandonwamboldt/utilphp",
|
"name": "brandonwamboldt/utilphp",
|
||||||
@@ -265,6 +265,101 @@
|
|||||||
],
|
],
|
||||||
"time": "2021-07-31T17:03:58+00:00"
|
"time": "2021-07-31T17:03:58+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "doctrine/inflector",
|
||||||
|
"version": "2.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/doctrine/inflector.git",
|
||||||
|
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
|
||||||
|
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.2 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"doctrine/coding-standard": "^7.0",
|
||||||
|
"phpstan/phpstan": "^0.11",
|
||||||
|
"phpstan/phpstan-phpunit": "^0.11",
|
||||||
|
"phpstan/phpstan-strict-rules": "^0.11",
|
||||||
|
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Guilherme Blanco",
|
||||||
|
"email": "guilhermeblanco@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Roman Borschel",
|
||||||
|
"email": "roman@code-factory.org"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Benjamin Eberlei",
|
||||||
|
"email": "kontakt@beberlei.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jonathan Wage",
|
||||||
|
"email": "jonwage@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Johannes Schmitt",
|
||||||
|
"email": "schmittjoh@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
|
||||||
|
"homepage": "https://www.doctrine-project.org/projects/inflector.html",
|
||||||
|
"keywords": [
|
||||||
|
"inflection",
|
||||||
|
"inflector",
|
||||||
|
"lowercase",
|
||||||
|
"manipulation",
|
||||||
|
"php",
|
||||||
|
"plural",
|
||||||
|
"singular",
|
||||||
|
"strings",
|
||||||
|
"uppercase",
|
||||||
|
"words"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/doctrine/inflector/issues",
|
||||||
|
"source": "https://github.com/doctrine/inflector/tree/2.0.x"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://www.doctrine-project.org/sponsorship.html",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://www.patreon.com/phpdoctrine",
|
||||||
|
"type": "patreon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2020-05-29T15:13:26+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "erusev/parsedown",
|
"name": "erusev/parsedown",
|
||||||
"version": "1.7.4",
|
"version": "1.7.4",
|
||||||
@@ -707,6 +802,497 @@
|
|||||||
},
|
},
|
||||||
"time": "2021-04-26T09:17:50+00:00"
|
"time": "2021-04-26T09:17:50+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/bus",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/bus.git",
|
||||||
|
"reference": "808097c0dfd893309bd77b00139586c516b965c9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/bus/zipball/808097c0dfd893309bd77b00139586c516b965c9",
|
||||||
|
"reference": "808097c0dfd893309bd77b00139586c516b965c9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/collections": "^8.0",
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/pipeline": "^8.0",
|
||||||
|
"illuminate/support": "^8.0",
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"illuminate/queue": "Required to use closures when chaining jobs (^7.0)."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Bus\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Bus package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-08-10T16:49:48+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/collections",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/collections.git",
|
||||||
|
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/collections/zipball/18fa841df912ec56849351dd6ca8928e8a98b69d",
|
||||||
|
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/macroable": "^8.0",
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/var-dumper": "Required to use the dump method (^5.1.4)."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Support\\": ""
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"helpers.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Collections package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-09-08T12:48:16+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/container",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/container.git",
|
||||||
|
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/container/zipball/862b64ea4ab56e307a1676104a1b93295d347ad0",
|
||||||
|
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"php": "^7.3|^8.0",
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/container-implementation": "1.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Container\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Container package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-09-09T13:55:23+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/contracts",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/contracts.git",
|
||||||
|
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/contracts/zipball/ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913",
|
||||||
|
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.3|^8.0",
|
||||||
|
"psr/container": "^1.0",
|
||||||
|
"psr/simple-cache": "^1.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Contracts\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Contracts package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-09-08T12:09:40+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/database",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/database.git",
|
||||||
|
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/database/zipball/acc11d6839ddb3b694bc6585177fa5141b70c693",
|
||||||
|
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"illuminate/collections": "^8.0",
|
||||||
|
"illuminate/container": "^8.0",
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/macroable": "^8.0",
|
||||||
|
"illuminate/support": "^8.0",
|
||||||
|
"php": "^7.3|^8.0",
|
||||||
|
"symfony/console": "^5.1.4"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).",
|
||||||
|
"fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
|
||||||
|
"illuminate/console": "Required to use the database commands (^8.0).",
|
||||||
|
"illuminate/events": "Required to use the observers with Eloquent (^8.0).",
|
||||||
|
"illuminate/filesystem": "Required to use the migrations (^8.0).",
|
||||||
|
"illuminate/pagination": "Required to paginate the result set (^8.0).",
|
||||||
|
"symfony/finder": "Required to use Eloquent model factories (^5.1.4)."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Database\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Database package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"keywords": [
|
||||||
|
"database",
|
||||||
|
"laravel",
|
||||||
|
"orm",
|
||||||
|
"sql"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-09-13T18:43:43+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/events",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/events.git",
|
||||||
|
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/events/zipball/7def78033f29cd0c0383513b27c291d233a7f90e",
|
||||||
|
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/bus": "^8.0",
|
||||||
|
"illuminate/collections": "^8.0",
|
||||||
|
"illuminate/container": "^8.0",
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/macroable": "^8.0",
|
||||||
|
"illuminate/support": "^8.0",
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Events\\": ""
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"functions.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Events package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-08-16T21:45:47+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/macroable",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/macroable.git",
|
||||||
|
"reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05",
|
||||||
|
"reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Support\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Macroable package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2020-10-27T15:20:30+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/pipeline",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/pipeline.git",
|
||||||
|
"reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/pipeline/zipball/23aeff5b26ae4aee3f370835c76bd0f4e93f71d2",
|
||||||
|
"reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/support": "^8.0",
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Pipeline\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Pipeline package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-03-26T18:39:16+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "illuminate/support",
|
||||||
|
"version": "v8.61.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/illuminate/support.git",
|
||||||
|
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/illuminate/support/zipball/b0a21c41163381dd9a5abbd68fe85ed7b4247d30",
|
||||||
|
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"doctrine/inflector": "^1.4|^2.0",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"illuminate/collections": "^8.0",
|
||||||
|
"illuminate/contracts": "^8.0",
|
||||||
|
"illuminate/macroable": "^8.0",
|
||||||
|
"nesbot/carbon": "^2.31",
|
||||||
|
"php": "^7.3|^8.0",
|
||||||
|
"voku/portable-ascii": "^1.4.8"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"tightenco/collect": "<5.5.33"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"illuminate/filesystem": "Required to use the composer class (^8.0).",
|
||||||
|
"league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0).",
|
||||||
|
"ramsey/uuid": "Required to use Str::uuid() (^4.0).",
|
||||||
|
"symfony/process": "Required to use the composer class (^5.1.4).",
|
||||||
|
"symfony/var-dumper": "Required to use the dd function (^5.1.4).",
|
||||||
|
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Illuminate\\Support\\": ""
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"helpers.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Illuminate Support package.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
|
"source": "https://github.com/laravel/framework"
|
||||||
|
},
|
||||||
|
"time": "2021-09-13T18:43:43+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "league/plates",
|
"name": "league/plates",
|
||||||
"version": "v3.4.0",
|
"version": "v3.4.0",
|
||||||
@@ -902,6 +1488,100 @@
|
|||||||
],
|
],
|
||||||
"time": "2021-05-28T08:32:12+00:00"
|
"time": "2021-05-28T08:32:12+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "nesbot/carbon",
|
||||||
|
"version": "2.53.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/briannesbitt/Carbon.git",
|
||||||
|
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045",
|
||||||
|
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"php": "^7.1.8 || ^8.0",
|
||||||
|
"symfony/polyfill-mbstring": "^1.0",
|
||||||
|
"symfony/polyfill-php80": "^1.16",
|
||||||
|
"symfony/translation": "^3.4 || ^4.0 || ^5.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"doctrine/orm": "^2.7",
|
||||||
|
"friendsofphp/php-cs-fixer": "^3.0",
|
||||||
|
"kylekatarnls/multi-tester": "^2.0",
|
||||||
|
"phpmd/phpmd": "^2.9",
|
||||||
|
"phpstan/extension-installer": "^1.0",
|
||||||
|
"phpstan/phpstan": "^0.12.54",
|
||||||
|
"phpunit/phpunit": "^7.5.20 || ^8.5.14",
|
||||||
|
"squizlabs/php_codesniffer": "^3.4"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/carbon"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-3.x": "3.x-dev",
|
||||||
|
"dev-master": "2.x-dev"
|
||||||
|
},
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Carbon\\Laravel\\ServiceProvider"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"phpstan": {
|
||||||
|
"includes": [
|
||||||
|
"extension.neon"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Carbon\\": "src/Carbon/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Brian Nesbitt",
|
||||||
|
"email": "brian@nesbot.com",
|
||||||
|
"homepage": "https://markido.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "kylekatarnls",
|
||||||
|
"homepage": "https://github.com/kylekatarnls"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An API extension for DateTime that supports 281 different languages.",
|
||||||
|
"homepage": "https://carbon.nesbot.com",
|
||||||
|
"keywords": [
|
||||||
|
"date",
|
||||||
|
"datetime",
|
||||||
|
"time"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/briannesbitt/Carbon/issues",
|
||||||
|
"source": "https://github.com/briannesbitt/Carbon"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://opencollective.com/Carbon",
|
||||||
|
"type": "open_collective"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2021-09-06T09:29:23+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "netresearch/jsonmapper",
|
"name": "netresearch/jsonmapper",
|
||||||
"version": "v4.0.0",
|
"version": "v4.0.0",
|
||||||
@@ -1206,16 +1886,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phan/phan",
|
"name": "phan/phan",
|
||||||
"version": "5.0.0",
|
"version": "5.2.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phan/phan.git",
|
"url": "https://github.com/phan/phan.git",
|
||||||
"reference": "f36b6b9a2f4143a25f35ce94d712ceb0527e9d90"
|
"reference": "d724bbb8fc3ba89179868bb5220ecdf6a9c1636b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phan/phan/zipball/f36b6b9a2f4143a25f35ce94d712ceb0527e9d90",
|
"url": "https://api.github.com/repos/phan/phan/zipball/d724bbb8fc3ba89179868bb5220ecdf6a9c1636b",
|
||||||
"reference": "f36b6b9a2f4143a25f35ce94d712ceb0527e9d90",
|
"reference": "d724bbb8fc3ba89179868bb5220ecdf6a9c1636b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1232,7 +1912,7 @@
|
|||||||
"symfony/console": "^3.2|^4.0|^5.0",
|
"symfony/console": "^3.2|^4.0|^5.0",
|
||||||
"symfony/polyfill-mbstring": "^1.11.0",
|
"symfony/polyfill-mbstring": "^1.11.0",
|
||||||
"symfony/polyfill-php80": "^1.20.0",
|
"symfony/polyfill-php80": "^1.20.0",
|
||||||
"tysonandre/var_representation_polyfill": "^0.0.2"
|
"tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^8.5.0"
|
"phpunit/phpunit": "^8.5.0"
|
||||||
@@ -1279,9 +1959,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phan/phan/issues",
|
"issues": "https://github.com/phan/phan/issues",
|
||||||
"source": "https://github.com/phan/phan/tree/5.0.0"
|
"source": "https://github.com/phan/phan/tree/5.2.1"
|
||||||
},
|
},
|
||||||
"time": "2021-08-01T18:17:28+00:00"
|
"time": "2021-09-15T00:08:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "php-extended/php-system",
|
"name": "php-extended/php-system",
|
||||||
@@ -1684,6 +2364,57 @@
|
|||||||
},
|
},
|
||||||
"time": "2021-05-03T11:20:27+00:00"
|
"time": "2021-05-03T11:20:27+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/simple-cache",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/simple-cache.git",
|
||||||
|
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
||||||
|
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\SimpleCache\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interfaces for simple caching",
|
||||||
|
"keywords": [
|
||||||
|
"cache",
|
||||||
|
"caching",
|
||||||
|
"psr",
|
||||||
|
"psr-16",
|
||||||
|
"simple-cache"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/php-fig/simple-cache/tree/master"
|
||||||
|
},
|
||||||
|
"time": "2017-10-23T01:57:42+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "ralouphie/getallheaders",
|
"name": "ralouphie/getallheaders",
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
@@ -2970,6 +3701,179 @@
|
|||||||
],
|
],
|
||||||
"time": "2021-06-27T11:44:38+00:00"
|
"time": "2021-06-27T11:44:38+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/translation",
|
||||||
|
"version": "v5.3.7",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/translation.git",
|
||||||
|
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/translation/zipball/4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6",
|
||||||
|
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.2.5",
|
||||||
|
"symfony/deprecation-contracts": "^2.1",
|
||||||
|
"symfony/polyfill-mbstring": "~1.0",
|
||||||
|
"symfony/polyfill-php80": "^1.16",
|
||||||
|
"symfony/translation-contracts": "^2.3"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"symfony/config": "<4.4",
|
||||||
|
"symfony/dependency-injection": "<5.0",
|
||||||
|
"symfony/http-kernel": "<5.0",
|
||||||
|
"symfony/twig-bundle": "<5.0",
|
||||||
|
"symfony/yaml": "<4.4"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"symfony/translation-implementation": "2.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/log": "^1|^2|^3",
|
||||||
|
"symfony/config": "^4.4|^5.0",
|
||||||
|
"symfony/console": "^4.4|^5.0",
|
||||||
|
"symfony/dependency-injection": "^5.0",
|
||||||
|
"symfony/finder": "^4.4|^5.0",
|
||||||
|
"symfony/http-kernel": "^5.0",
|
||||||
|
"symfony/intl": "^4.4|^5.0",
|
||||||
|
"symfony/polyfill-intl-icu": "^1.21",
|
||||||
|
"symfony/service-contracts": "^1.1.2|^2",
|
||||||
|
"symfony/yaml": "^4.4|^5.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/log-implementation": "To use logging capability in translator",
|
||||||
|
"symfony/config": "",
|
||||||
|
"symfony/yaml": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"Resources/functions.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Translation\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides tools to internationalize your application",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/symfony/translation/tree/v5.3.7"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://symfony.com/sponsor",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/fabpot",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2021-08-26T08:22:53+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/translation-contracts",
|
||||||
|
"version": "v2.4.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/translation-contracts.git",
|
||||||
|
"reference": "95c812666f3e91db75385749fe219c5e494c7f95"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95",
|
||||||
|
"reference": "95c812666f3e91db75385749fe219c5e494c7f95",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.2.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/translation-implementation": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "2.4-dev"
|
||||||
|
},
|
||||||
|
"thanks": {
|
||||||
|
"name": "symfony/contracts",
|
||||||
|
"url": "https://github.com/symfony/contracts"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Contracts\\Translation\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nicolas Grekas",
|
||||||
|
"email": "p@tchwork.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Generic abstractions related to translation",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"abstractions",
|
||||||
|
"contracts",
|
||||||
|
"decoupling",
|
||||||
|
"interfaces",
|
||||||
|
"interoperability",
|
||||||
|
"standards"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/symfony/translation-contracts/tree/v2.4.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://symfony.com/sponsor",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/fabpot",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2021-03-23T23:28:01+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "tysonandre/var_representation_polyfill",
|
"name": "tysonandre/var_representation_polyfill",
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
@@ -3080,6 +3984,80 @@
|
|||||||
],
|
],
|
||||||
"time": "2021-07-08T16:18:03+00:00"
|
"time": "2021-07-08T16:18:03+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "voku/portable-ascii",
|
||||||
|
"version": "1.5.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/voku/portable-ascii.git",
|
||||||
|
"reference": "80953678b19901e5165c56752d087fc11526017c"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
|
||||||
|
"reference": "80953678b19901e5165c56752d087fc11526017c",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.0.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "Use Intl for transliterator_transliterate() support"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"voku\\": "src/voku/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Lars Moelleken",
|
||||||
|
"homepage": "http://www.moelleken.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
|
||||||
|
"homepage": "https://github.com/voku/portable-ascii",
|
||||||
|
"keywords": [
|
||||||
|
"ascii",
|
||||||
|
"clean",
|
||||||
|
"php"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/voku/portable-ascii/issues",
|
||||||
|
"source": "https://github.com/voku/portable-ascii/tree/1.5.6"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://www.paypal.me/moelleken",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/voku",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://opencollective.com/portable-ascii",
|
||||||
|
"type": "open_collective"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://www.patreon.com/voku",
|
||||||
|
"type": "patreon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2020-11-12T00:07:28+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "webmozart/assert",
|
"name": "webmozart/assert",
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
@@ -3203,7 +4181,7 @@
|
|||||||
"platform": [],
|
"platform": [],
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"platform-overrides": {
|
"platform-overrides": {
|
||||||
"php": "7.3"
|
"php": "7.4"
|
||||||
},
|
},
|
||||||
"plugin-api-version": "2.0.0"
|
"plugin-api-version": "2.0.0"
|
||||||
}
|
}
|
||||||
|
|||||||
+68
-1
@@ -128,7 +128,74 @@ input::-webkit-input-placeholder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#running_map {
|
#running_map {
|
||||||
overflow: hidden;
|
|
||||||
border: none;
|
border: none;
|
||||||
width: 700px;
|
width: 700px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#map-subframe {
|
||||||
|
display: none;
|
||||||
|
width: 700px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width : 360px) {
|
||||||
|
#map-subframe {
|
||||||
|
display: block;
|
||||||
|
transform: scale(calc(330 / 700));
|
||||||
|
transform-origin: 350px 0px;
|
||||||
|
margin-bottom: -400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (min-width : 440px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(410 / 700));
|
||||||
|
margin-bottom: -300px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width : 480px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(450 / 700));
|
||||||
|
margin-bottom: -250px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (min-width : 520px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(490 / 700));
|
||||||
|
margin-bottom: -200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width : 576px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(546 / 700));
|
||||||
|
margin-bottom: -150px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width : 640px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(600/700));
|
||||||
|
margin-bottom: -100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (min-width : 700px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: scale(calc(670 / 700));
|
||||||
|
margin-bottom: -20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (min-width : 730px) {
|
||||||
|
#map-subframe {
|
||||||
|
transform: none;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
+26
-1
@@ -134,7 +134,7 @@ function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, in
|
|||||||
getExceptionTraceAsString($e)
|
getExceptionTraceAsString($e)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
set_error_handler("\sammo\logErrorByCustomHandler");
|
set_error_handler("\\sammo\\logErrorByCustomHandler");
|
||||||
|
|
||||||
|
|
||||||
function logExceptionByCustomHandler(\Throwable $e)
|
function logExceptionByCustomHandler(\Throwable $e)
|
||||||
@@ -151,3 +151,28 @@ function logExceptionByCustomHandler(\Throwable $e)
|
|||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
set_exception_handler('\\sammo\\logExceptionByCustomHandler');
|
set_exception_handler('\\sammo\\logExceptionByCustomHandler');
|
||||||
|
|
||||||
|
function getAPIExecutorClass($path){
|
||||||
|
|
||||||
|
static $basePath = __NAMESPACE__.'\\API\\';
|
||||||
|
if(is_string($path)){
|
||||||
|
}
|
||||||
|
else if(is_array($path)){
|
||||||
|
$path = join('\\', $path);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw new \InvalidArgumentException("{$path}는 올바른 API 지시자가 아님");
|
||||||
|
}
|
||||||
|
|
||||||
|
$classPath = str_replace('/', '\\', $basePath.$path);
|
||||||
|
|
||||||
|
if(class_exists($classPath)){
|
||||||
|
return $classPath;
|
||||||
|
}
|
||||||
|
throw new \InvalidArgumentException("{$path}는 올바른 API 경로가 아님");
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildAPIExecutorClass($type, string $rootPath, array $args):\sammo\BaseAPI{
|
||||||
|
$class = getAPIExecutorClass($type);
|
||||||
|
return new $class($rootPath, $args);
|
||||||
|
}
|
||||||
@@ -58,7 +58,7 @@ CREATE TABLE `member_log` (
|
|||||||
INDEX `action` (`member_no`, `action_type`, `date`),
|
INDEX `action` (`member_no`, `action_type`, `date`),
|
||||||
INDEX `member` (`member_no`, `date`)
|
INDEX `member` (`member_no`, `date`)
|
||||||
)
|
)
|
||||||
ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
|
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
###################
|
###################
|
||||||
# KV storage
|
# KV storage
|
||||||
@@ -72,4 +72,19 @@ CREATE TABLE if not exists `storage` (
|
|||||||
UNIQUE INDEX `key` (`namespace`, `key`)
|
UNIQUE INDEX `key` (`namespace`, `key`)
|
||||||
)
|
)
|
||||||
COLLATE='utf8mb4_general_ci'
|
COLLATE='utf8mb4_general_ci'
|
||||||
ENGINE=MyISAM
|
ENGINE=Aria;
|
||||||
|
|
||||||
|
CREATE TABLE `login_token` (
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user_id` INT(11) NOT NULL,
|
||||||
|
`base_token` VARCHAR(20) NOT NULL COLLATE 'utf8mb4_general_ci',
|
||||||
|
`reg_ip` VARCHAR(40) NOT NULL COLLATE 'utf8mb4_general_ci',
|
||||||
|
`reg_date` DATETIME NOT NULL,
|
||||||
|
`expire_date` DATETIME NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `by_token` (`base_token`),
|
||||||
|
INDEX `by_date` (`user_id`, `expire_date`)
|
||||||
|
)
|
||||||
|
COLLATE='utf8mb4_general_ci'
|
||||||
|
ENGINE=Aria
|
||||||
|
;
|
||||||
@@ -2,9 +2,15 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
|
//https://hub.packtpub.com/eloquent-without-laravel/
|
||||||
|
use Illuminate\Database\Capsule\Manager as Capsule;
|
||||||
|
use Illuminate\Events\Dispatcher;
|
||||||
|
use Illuminate\Container\Container;
|
||||||
|
|
||||||
class RootDB
|
class RootDB
|
||||||
{
|
{
|
||||||
private static $uDB = null;
|
private static $uDB = null;
|
||||||
|
private static ?Capsule $uIlluminate = null;
|
||||||
|
|
||||||
private static $host = '_tK_host_';
|
private static $host = '_tK_host_';
|
||||||
private static $user = '_tK_user_';
|
private static $user = '_tK_user_';
|
||||||
@@ -12,6 +18,8 @@ class RootDB
|
|||||||
private static $dbName = '_tK_dbName_';
|
private static $dbName = '_tK_dbName_';
|
||||||
private static $port = _tK_port_;
|
private static $port = _tK_port_;
|
||||||
private static $encoding = 'utf8mb4';
|
private static $encoding = 'utf8mb4';
|
||||||
|
private static $collation = 'utf8mb4_general_ci';
|
||||||
|
|
||||||
|
|
||||||
private static $globalSalt = '_tK_globalSalt_';
|
private static $globalSalt = '_tK_globalSalt_';
|
||||||
|
|
||||||
@@ -19,6 +27,29 @@ class RootDB
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function illuminate(): Capsule
|
||||||
|
{
|
||||||
|
if(self::$uIlluminate !== null){
|
||||||
|
return self::$uIlluminate;
|
||||||
|
}
|
||||||
|
$capsule = new Capsule;
|
||||||
|
|
||||||
|
$capsule->addConnection([
|
||||||
|
'driver' => 'mysql',
|
||||||
|
'host' => self::$host,
|
||||||
|
'database' => self::$dbName,
|
||||||
|
'username' => self::$user,
|
||||||
|
'password' => self::$password,
|
||||||
|
'charset' => self::$encoding,
|
||||||
|
'collation' => self::$collation,
|
||||||
|
], 'root');
|
||||||
|
|
||||||
|
$capsule->setEventDispatcher(new Dispatcher(new Container));
|
||||||
|
$capsule->bootEloquent();
|
||||||
|
self::$uIlluminate = $capsule;
|
||||||
|
return $capsule;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DB 객체 생성
|
* DB 객체 생성
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -342,6 +342,7 @@ switch ($btn) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "랜덤턴":
|
case "랜덤턴":
|
||||||
|
$turnterm = $gameStor->turnterm;
|
||||||
foreach ($genlist as $generalID) {
|
foreach ($genlist as $generalID) {
|
||||||
$turntime = getRandTurn($turnterm);
|
$turntime = getRandTurn($turnterm);
|
||||||
$db->update('general', [
|
$db->update('general', [
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ $scenarioList = (function(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if($scenarioIdx !== null && key_exists($scenarioIdx, $scenarioList)){
|
if($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx]??[])){
|
||||||
$searchScenarioName = $scenarioList[$seasonIdx][$scenarioIdx]['name'];
|
$searchScenarioName = $scenarioList[$seasonIdx][$scenarioIdx]['name'];
|
||||||
$searchFilter = $db->sqleval('season = %i AND scenario = %i', $seasonIdx, $scenarioIdx);
|
$searchFilter = $db->sqleval('season = %i AND scenario = %i', $seasonIdx, $scenarioIdx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
|
||||||
|
APIHelper::launch(dirname(__FILE__));
|
||||||
@@ -64,6 +64,7 @@ var storedData = <?=Json::encode([
|
|||||||
<?=WebUtil::printJS('dist_js/vendors.js')?>
|
<?=WebUtil::printJS('dist_js/vendors.js')?>
|
||||||
<?=WebUtil::printJS('dist_js/dipcenter.js')?>
|
<?=WebUtil::printJS('dist_js/dipcenter.js')?>
|
||||||
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
||||||
|
<?=WebUtil::printCSS('../e_lib/summernote/summernote-bs4.css')?>
|
||||||
<?=WebUtil::printCSS('dist_css/vendors.css')?>
|
<?=WebUtil::printCSS('dist_css/vendors.css')?>
|
||||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||||
<?=WebUtil::printCSS('css/common.css')?>
|
<?=WebUtil::printCSS('css/common.css')?>
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ $admin = $gameStor->getValues(['develcost', 'cost', 'vote_title', 'vote', 'votec
|
|||||||
|
|
||||||
$generalID = Session::getGeneralID();
|
$generalID = Session::getGeneralID();
|
||||||
|
|
||||||
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc'], 2);
|
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc','imgsvr','picture','aux'], 2);
|
||||||
|
|
||||||
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
|
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
|
||||||
$develcost = $admin['develcost'] * 5;
|
$develcost = $admin['develcost'] * 5;
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
class DB{
|
//https://hub.packtpub.com/eloquent-without-laravel/
|
||||||
|
use Illuminate\Database\Capsule\Manager as Capsule;
|
||||||
|
use Illuminate\Events\Dispatcher;
|
||||||
|
use Illuminate\Container\Container;
|
||||||
|
|
||||||
|
class DB
|
||||||
|
{
|
||||||
private static $uDB = null;
|
private static $uDB = null;
|
||||||
|
private static ?Capsule $uIlluminate = null;
|
||||||
|
|
||||||
private static $host = '_tK_host_';
|
private static $host = '_tK_host_';
|
||||||
private static $user = '_tK_user_';
|
private static $user = '_tK_user_';
|
||||||
@@ -10,11 +18,36 @@ class DB{
|
|||||||
private static $dbName = '_tK_dbName_';
|
private static $dbName = '_tK_dbName_';
|
||||||
private static $port = _tK_port_;
|
private static $port = _tK_port_;
|
||||||
private static $encoding = 'utf8mb4';
|
private static $encoding = 'utf8mb4';
|
||||||
|
private static $collation = 'utf8mb4_general_ci';
|
||||||
|
|
||||||
private static $prefix = '_tK_prefix_';
|
private static $prefix = '_tK_prefix_';
|
||||||
|
|
||||||
private function __construct(){
|
private function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function illuminate(): Capsule
|
||||||
|
{
|
||||||
|
if(self::$uIlluminate !== null){
|
||||||
|
return self::$uIlluminate;
|
||||||
|
}
|
||||||
|
$capsule = new Capsule;
|
||||||
|
|
||||||
|
$capsule->addConnection([
|
||||||
|
'driver' => 'mysql',
|
||||||
|
'host' => self::$host,
|
||||||
|
'database' => self::$dbName,
|
||||||
|
'username' => self::$user,
|
||||||
|
'password' => self::$password,
|
||||||
|
'charset' => self::$encoding,
|
||||||
|
'collation' => self::$collation,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$capsule->setEventDispatcher(new Dispatcher(new Container));
|
||||||
|
$capsule->setAsGlobal();
|
||||||
|
$capsule->bootEloquent();
|
||||||
|
self::$uIlluminate = $capsule;
|
||||||
|
return $capsule;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -23,12 +56,14 @@ class DB{
|
|||||||
* @return \MeekroDB
|
* @return \MeekroDB
|
||||||
* @suppress PhanTypeMismatchProperty
|
* @suppress PhanTypeMismatchProperty
|
||||||
*/
|
*/
|
||||||
public static function db(){
|
public static function db()
|
||||||
|
{
|
||||||
if (self::$uDB === null) {
|
if (self::$uDB === null) {
|
||||||
self::$uDB = new \MeekroDB(self::$host, self::$user, self::$password, self::$dbName, self::$port, self::$encoding);
|
self::$uDB = new \MeekroDB(self::$host, self::$user, self::$password, self::$dbName, self::$port, self::$encoding);
|
||||||
self::$uDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
|
self::$uDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
|
||||||
|
|
||||||
self::$uDB->error_handler= function(){};
|
self::$uDB->error_handler = function () {
|
||||||
|
};
|
||||||
self::$uDB->throw_exception_on_error = true;
|
self::$uDB->throw_exception_on_error = true;
|
||||||
self::$uDB->throw_exception_on_nonsql_error = true;
|
self::$uDB->throw_exception_on_nonsql_error = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
<div class="buttonPlate bg1">
|
<div class="buttonPlate bg1">
|
||||||
<div>
|
<div>
|
||||||
<a href="a_status.php" target="_blank"><button class="toolbarButton">세력도</button></a>
|
<a href="a_status.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">세력도</button></a>
|
||||||
<a href="a_kingdomList.php" target="_blank"><button class="toolbarButton">세력일람</button></a>
|
<a href="a_kingdomList.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">세력일람</button></a>
|
||||||
<a href="a_genList.php" target="_blank"><button class="toolbarButton">장수일람</button></a>
|
<a href="a_genList.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">장수일람</button></a>
|
||||||
<a href="a_bestGeneral.php" target="_blank"><button class="toolbarButton">명장일람</button></a>
|
<a href="a_bestGeneral.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">명장일람</button></a>
|
||||||
<a href="a_history.php" target="_blank"><button class="toolbarButton">연감</button></a>
|
<a href="a_history.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">연감</button></a>
|
||||||
<a href="a_hallOfFame.php" target="_blank"><button class="toolbarButton">명예의전당</button></a>
|
<a href="a_hallOfFame.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">명예의전당</button></a>
|
||||||
<a href="a_emperior.php" target="_blank"><button class="toolbarButton">왕조일람</button></a>
|
<a href="a_emperior.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">왕조일람</button></a>
|
||||||
<a href="a_traffic.php" target="_blank"><button class="toolbarButton">접속량정보</button></a>
|
<a href="a_traffic.php" target="_blank" class="open-window"><button type="button" class="toolbarButton">접속량정보</button></a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="/bbs/board" target="_blank"><button class="toolbarButton2">삼모게시판</button></a>
|
<a href="/bbs/board" target="_blank"><button type="button" class="toolbarButton2">삼모게시판</button></a>
|
||||||
<a href="/bbs/tip" target="_blank"><button class="toolbarButton">팁/강좌</button></a>
|
<a href="/bbs/tip" target="_blank"><button type="button" class="toolbarButton">팁/강좌</button></a>
|
||||||
<a href="/bbs/news" target="_blank"><button class="toolbarButton">삼국 일보</button></a>
|
<a href="/bbs/news" target="_blank"><button type="button" class="toolbarButton">삼국 일보</button></a>
|
||||||
<a href="/bbs/history2" target="_blank"><button class="toolbarButton">개인 열전</button></a>
|
<a href="/bbs/history2" target="_blank"><button type="button" class="toolbarButton">개인 열전</button></a>
|
||||||
<a href="/bbs/history3" target="_blank"><button class="toolbarButton">국가 열전</button></a>
|
<a href="/bbs/history3" target="_blank"><button type="button" class="toolbarButton">국가 열전</button></a>
|
||||||
<a href="/bbs/patch" target="_blank"><button class="toolbarButton">패치 내역</button></a>
|
<a href="/bbs/patch" target="_blank"><button type="button" class="toolbarButton">패치 내역</button></a>
|
||||||
<a href="../i_other/help.php" target="_blank"><button class="toolbarButton">튜토리얼</button></a>
|
<a href="battle_simulator.php" target="_blank"><button type="button" class="toolbarButton">전투 시뮬레이터</button></a>
|
||||||
<a href="<?=$site?>" target="_blank"><button class="toolbarButton"><?=$call?></button></a>
|
<a href="<?=$site?>" target="_blank" class="open-window"><button type="button" class="toolbarButton"><?=$call?></button></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+255
-11
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
use sammo\Event\Action;
|
use sammo\Event\Action;
|
||||||
|
|
||||||
require_once 'process_war.php';
|
require_once 'process_war.php';
|
||||||
@@ -1255,9 +1256,12 @@ function addAge()
|
|||||||
//나이와 호봉 증가
|
//나이와 호봉 증가
|
||||||
$db->update('general', [
|
$db->update('general', [
|
||||||
'age' => $db->sqleval('age+1'),
|
'age' => $db->sqleval('age+1'),
|
||||||
'belong' => $db->sqleval('belong+1')
|
|
||||||
], true);
|
], true);
|
||||||
|
|
||||||
|
$db->update('general', [
|
||||||
|
'belong' => $db->sqleval('belong+1')
|
||||||
|
], 'nation != 0');
|
||||||
|
|
||||||
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
|
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
|
||||||
|
|
||||||
if ($year >= $startYear + 3) {
|
if ($year >= $startYear + 3) {
|
||||||
@@ -1282,16 +1286,25 @@ function addAge()
|
|||||||
|
|
||||||
foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex1,dex2,dex3,dex4,dex5,aux from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general) {
|
foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex1,dex2,dex3,dex4,dex5,aux from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general) {
|
||||||
$generalID = $general['no'];
|
$generalID = $general['no'];
|
||||||
|
$generalAux = Json::decode($general['aux']);
|
||||||
|
|
||||||
|
$updateVars = [];
|
||||||
|
if (key_exists('inheritSpecificSpecialWar', $generalAux)) {
|
||||||
|
$special2 = $generalAux['inheritSpecificSpecialWar'];
|
||||||
|
unset($generalAux['inheritSpecificSpecialWar']);
|
||||||
|
$updateVars['aux'] = Json::encode($generalAux);
|
||||||
|
} else {
|
||||||
$special2 = SpecialityHelper::pickSpecialWar(
|
$special2 = SpecialityHelper::pickSpecialWar(
|
||||||
$general,
|
$general,
|
||||||
(Json::decode($general['aux'])['prev_types_special2'])??[]
|
($generalAux['prev_types_special2']) ?? []
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$specialClass = buildGeneralSpecialWarClass($special2);
|
$specialClass = buildGeneralSpecialWarClass($special2);
|
||||||
$specialText = $specialClass->getName();
|
$specialText = $specialClass->getName();
|
||||||
|
|
||||||
$db->update('general', [
|
$updateVars['special2'] = $special2;
|
||||||
'special2' => $special2
|
$db->update('general', $updateVars, 'no=%i', $general['no']);
|
||||||
], 'no=%i', $general['no']);
|
|
||||||
|
|
||||||
$logger = new ActionLogger($generalID, $general['nation'], $year, $month);
|
$logger = new ActionLogger($generalID, $general['nation'], $year, $month);
|
||||||
|
|
||||||
@@ -1581,9 +1594,19 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$availableUnique) {
|
if (!$availableUnique) {
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||||
|
$userLogger = new UserLogger($general->getVar('owner'));
|
||||||
|
$userLogger->push(sprintf("얻을 유니크가 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
}
|
||||||
|
|
||||||
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
|
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
|
||||||
|
|
||||||
$nationName = $general->getStaticNation()['name'];
|
$nationName = $general->getStaticNation()['name'];
|
||||||
@@ -1607,6 +1630,207 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
return true;
|
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(General $general, string $acquireType = '아이템'): bool
|
||||||
{
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
@@ -1616,8 +1840,13 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($general->getNPCType() > 6) {
|
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
|
||||||
return false;
|
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique)) {
|
||||||
|
LogText("유니크 준비?? {$general->getID()}", $inheritUnique);
|
||||||
|
$trialResult = tryInheritUniqueItem($general, $acquireType);
|
||||||
|
if ($trialResult) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$itemTypeCnt = count(GameConst::$allItems);
|
$itemTypeCnt = count(GameConst::$allItems);
|
||||||
@@ -1631,6 +1860,12 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
|
|
||||||
if ($trialCnt <= 0) {
|
if ($trialCnt <= 0) {
|
||||||
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
|
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||||
|
$userLogger = new UserLogger($general->getVar('owner'));
|
||||||
|
$userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1656,13 +1891,20 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
$prob = Util::valueFit($prob, null, 1 / 4); //최대치 감소
|
$prob = Util::valueFit($prob, null, 1 / 4); //최대치 감소
|
||||||
$result = false;
|
$result = false;
|
||||||
|
|
||||||
|
$prob /= sqrt(2);
|
||||||
|
$moreProb = pow(2, 1 / 4);
|
||||||
|
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
//포인트로 랜덤 유니크 획득
|
||||||
|
$prob = 1;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (Util::range($trialCnt) as $_idx) {
|
foreach (Util::range($trialCnt) as $_idx) {
|
||||||
if (Util::randBool($prob)) {
|
if (Util::randBool($prob)) {
|
||||||
$result = true;
|
$result = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
$prob *= $moreProb;
|
||||||
}
|
}
|
||||||
if (!$result) {
|
if (!$result) {
|
||||||
LogText("{$general->getName()}, {$general->getID()} 유니크 실패 {$trialCnt}", $prob);
|
LogText("{$general->getName()}, {$general->getID()} 유니크 실패 {$trialCnt}", $prob);
|
||||||
@@ -1706,7 +1948,8 @@ function deleteNation(General $lord, bool $applyDB):array
|
|||||||
$nationID,
|
$nationID,
|
||||||
$lordID
|
$lordID
|
||||||
),
|
),
|
||||||
['npc', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'], 1
|
['npc', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
|
||||||
|
1
|
||||||
);
|
);
|
||||||
$nationGeneralList[$lordID] = $lord;
|
$nationGeneralList[$lordID] = $lord;
|
||||||
|
|
||||||
@@ -1723,7 +1966,8 @@ function deleteNation(General $lord, bool $applyDB):array
|
|||||||
|
|
||||||
// 전 장수 재야로
|
// 전 장수 재야로
|
||||||
foreach ($nationGeneralList as $general) {
|
foreach ($nationGeneralList as $general) {
|
||||||
$general->setAuxVar('max_belong',
|
$general->setAuxVar(
|
||||||
|
'max_belong',
|
||||||
max(
|
max(
|
||||||
$general->getVar('belong'),
|
$general->getVar('belong'),
|
||||||
$general->getAuxVar('max_belong') ?? 0
|
$general->getAuxVar('max_belong') ?? 0
|
||||||
@@ -2158,7 +2402,7 @@ function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null)
|
|||||||
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
||||||
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||||
|
|
||||||
return $baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s');
|
return TimeUtil::format($baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction)), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
|
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
|
||||||
@@ -2173,5 +2417,5 @@ function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
|
|||||||
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
|
||||||
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
|
||||||
|
|
||||||
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s');
|
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s.u');
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-7
@@ -623,13 +623,13 @@ function updateNationState()
|
|||||||
$nation['nation'],
|
$nation['nation'],
|
||||||
$targetKillTurn
|
$targetKillTurn
|
||||||
);
|
);
|
||||||
$nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc'], 2);
|
$nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux'], 2);
|
||||||
$chiefObj = null;
|
$chiefID = null;
|
||||||
|
|
||||||
$uniqueLotteryWeightList = [];
|
$uniqueLotteryWeightList = [];
|
||||||
foreach ($nationGenList as $nationGen) {
|
foreach ($nationGenList as $nationGen) {
|
||||||
if ($nationGen->getVar('officer_level') == 12) {
|
if ($nationGen->getVar('officer_level') == 12) {
|
||||||
$chiefObj = $nationGen;
|
$chiefID = $nationGen->getID();
|
||||||
}
|
}
|
||||||
$trialCnt = count(GameConst::$allItems);
|
$trialCnt = count(GameConst::$allItems);
|
||||||
|
|
||||||
@@ -670,8 +670,10 @@ function updateNationState()
|
|||||||
$winnerObj->applyDB($db);
|
$winnerObj->applyDB($db);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($chiefObj){
|
if($chiefID){
|
||||||
|
$chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], 2);
|
||||||
$chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff);
|
$chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff);
|
||||||
|
$chiefObj->applyDB($db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1150,22 +1152,42 @@ function checkEmperior()
|
|||||||
LogHistory();
|
LogHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetInheritanceUser(int $userID, bool $isRebirth=false){
|
function resetInheritanceUser(int $userID, bool $isRebirth=false):float{
|
||||||
$rebirthDegraded = [
|
$rebirthDegraded = [
|
||||||
'dex'=>0.5,
|
'dex'=>0.5,
|
||||||
];
|
];
|
||||||
|
|
||||||
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
||||||
$totalPoint = 0;
|
$totalPoint = 0;
|
||||||
foreach($inheritStor->getAll() as $key=>[$value,]){
|
$allPoints = $inheritStor->getAll();
|
||||||
if(key_exists($key, $rebirthDegraded)){
|
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];
|
$value *= $rebirthDegraded[$key];
|
||||||
}
|
}
|
||||||
|
$keyText = General::INHERITANCE_KEY[$key][2];
|
||||||
|
$userLogger->push("{$keyText} 포인트 {$value} 증가", "inheritPoint");
|
||||||
$totalPoint += $value;
|
$totalPoint += $value;
|
||||||
}
|
}
|
||||||
$totalPoint = Util::toInt($totalPoint);
|
$totalPoint = Util::toInt($totalPoint);
|
||||||
|
$userLogger->push("포인트 {$previousPoint} => {$totalPoint}", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$inheritStor->resetValues();
|
$inheritStor->resetValues();
|
||||||
$inheritStor->setValue('previous', [$totalPoint, null]);
|
$inheritStor->setValue('previous', [$totalPoint, null]);
|
||||||
|
return $totalPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMaxDomesticCritical(General $general, $score){
|
function updateMaxDomesticCritical(General $general, $score){
|
||||||
|
|||||||
@@ -1132,7 +1132,7 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
|
|||||||
$gen1resKey = 'd';
|
$gen1resKey = 'd';
|
||||||
$gen2resKey = 'd';
|
$gen2resKey = 'd';
|
||||||
break;
|
break;
|
||||||
default: new MustNotBeReachedException();
|
default: throw new MustNotBeReachedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
$db->update('rank_data', [
|
$db->update('rank_data', [
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ else{
|
|||||||
'name', 'leadership', 'strength', 'intel', 'gold','rice',
|
'name', 'leadership', 'strength', 'intel', 'gold','rice',
|
||||||
'troop','officer_level','npc','picture','imgsvr',
|
'troop','officer_level','npc','picture','imgsvr',
|
||||||
'permission','penalty','belong', 'crewtype',
|
'permission','penalty','belong', 'crewtype',
|
||||||
'experience', 'dedication', 'betray', 'dedlevel', 'explevel', 'makelimit',
|
'experience', 'dedication', 'betray', 'dedlevel', 'explevel', 'makelimit', 'aux',
|
||||||
], 1);
|
], 1);
|
||||||
|
|
||||||
if($general instanceof DummyGeneral){
|
if($general instanceof DummyGeneral){
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ $db = DB::db();
|
|||||||
$me = General::createGeneralObjFromDB($generalID);
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
|
|
||||||
if($defence_train != $me->getVar('defence_train')){
|
if($defence_train !== $me->getVar('defence_train')){
|
||||||
if($defence_train == 999){
|
if($defence_train == 999){
|
||||||
$me->increaseVar('myset', -1);
|
$me->increaseVar('myset', -1);
|
||||||
$me->setVar('defence_train', $defence_train);
|
$me->setVar('defence_train', $defence_train);
|
||||||
@@ -53,14 +53,8 @@ if($defence_train != $me->getVar('defence_train')){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$me->setAuxVar('use_treatment', Util::valueFit($use_treatment, 10, 100));
|
$me->setAuxVar('use_treatment', Util::valueFit($use_treatment, 10, 100));
|
||||||
|
|
||||||
if($use_auto_nation_turn != $me->getAuxVar('use_auto_nation_turn')){
|
|
||||||
$me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn);
|
$me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn);
|
||||||
}
|
|
||||||
|
|
||||||
if($me->getVar('tnmt') != $tnmt){
|
|
||||||
$me->setVar('tnmt', $tnmt);
|
$me->setVar('tnmt', $tnmt);
|
||||||
}
|
|
||||||
|
|
||||||
if($me->getNPCType() == 1 && $detachNPC){
|
if($me->getNPCType() == 1 && $detachNPC){
|
||||||
$turnterm = $gameStor->turnterm;
|
$turnterm = $gameStor->turnterm;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
@@ -57,7 +58,8 @@ if ($permission < 3) {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyNationPolicy($policy, $nationID, $generalName):?string{
|
function applyNationPolicy($policy, $nationID, $generalName): ?string
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
|
|
||||||
@@ -139,7 +141,8 @@ function applyNationPolicy($policy, $nationID, $generalName):?string{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyNationPriority($priority, $nationID, $generalName):?string{
|
function applyNationPriority($priority, $nationID, $generalName): ?string
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
$nationPolicyRoot = $nationStor->npc_nation_policy;
|
$nationPolicyRoot = $nationStor->npc_nation_policy;
|
||||||
@@ -157,17 +160,29 @@ function applyNationPriority($priority, $nationID, $generalName):?string{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyGeneralPriority($priority, $nationID, $generalName):?string{
|
function applyGeneralPriority($priority, $nationID, $generalName): ?string
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
|
||||||
$generalPolicyRoot = $nationStor->npc_general_policy;
|
$generalPolicyRoot = $nationStor->npc_general_policy;
|
||||||
|
|
||||||
$defaultPriority = AutorunGeneralPolicy::$default_priority;
|
$defaultPriority = AutorunGeneralPolicy::$default_priority;
|
||||||
|
$mustHaveActions = ['출병' => 1];
|
||||||
foreach ($priority as $item) {
|
foreach ($priority as $item) {
|
||||||
|
if (key_exists($item, $mustHaveActions)) {
|
||||||
|
$mustHaveActions[$item] = 0;
|
||||||
|
}
|
||||||
if (!in_array($item, $defaultPriority)) {
|
if (!in_array($item, $defaultPriority)) {
|
||||||
return "{$item}은 올바른 명령이 아닙니다.";
|
return "{$item}은 올바른 명령이 아닙니다.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($mustHaveActions as $actionKey => $unset) {
|
||||||
|
if ($unset) {
|
||||||
|
return "{$actionKey}은 항상 사용해야 합니다.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$generalPolicyRoot['priority'] = $priority;
|
$generalPolicyRoot['priority'] = $priority;
|
||||||
$generalPolicyRoot['prioritySetter'] = $generalName;
|
$generalPolicyRoot['prioritySetter'] = $generalName;
|
||||||
$generalPolicyRoot['prioritySetTime'] = TimeUtil::now();
|
$generalPolicyRoot['prioritySetTime'] = TimeUtil::now();
|
||||||
@@ -177,14 +192,11 @@ function applyGeneralPriority($priority, $nationID, $generalName):?string{
|
|||||||
|
|
||||||
if ($type == 'nationPolicy') {
|
if ($type == 'nationPolicy') {
|
||||||
$result = applyNationPolicy($data, $nationID, $me['name']);
|
$result = applyNationPolicy($data, $nationID, $me['name']);
|
||||||
}
|
} else if ($type == 'generalPriority') {
|
||||||
else if($type == 'generalPriority'){
|
|
||||||
$result = applyGeneralPriority($data, $nationID, $me['name']);
|
$result = applyGeneralPriority($data, $nationID, $me['name']);
|
||||||
}
|
} else if ($type == 'nationPriority') {
|
||||||
else if($type == 'nationPriority'){
|
|
||||||
$result = applyNationPriority($data, $nationID, $me['name']);
|
$result = applyNationPriority($data, $nationID, $me['name']);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
throw new MustNotBeReachedException();
|
throw new MustNotBeReachedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-182
@@ -1,182 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo;
|
|
||||||
|
|
||||||
include "lib.php";
|
|
||||||
include "func.php";
|
|
||||||
|
|
||||||
$session = Session::requireLogin()->setReadOnly();
|
|
||||||
$userID = Session::getUserID();
|
|
||||||
|
|
||||||
if (!$userID) {
|
|
||||||
MessageBox("잘못된 접근입니다!!!");
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//회원 테이블에서 정보확인
|
|
||||||
$member = RootDB::db()->queryFirstRow("select no,name,picture,imgsvr,grade from member where no= %i", $userID);
|
|
||||||
|
|
||||||
if (!$member) {
|
|
||||||
MessageBox("잘못된 접근입니다!!!");
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$admin = $gameStor->getValues(['block_general_create','show_img_level','maxgeneral']);
|
|
||||||
if($admin['block_general_create']){
|
|
||||||
MessageBox("잘못된 접근입니다!!!");
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<!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" />
|
|
||||||
<script>
|
|
||||||
var defaultStatTotal = <?=GameConst::$defaultStatTotal?>;
|
|
||||||
var defaultStatMin = <?=GameConst::$defaultStatMin?>;
|
|
||||||
var defaultStatMax = <?=GameConst::$defaultStatMax?>;
|
|
||||||
|
|
||||||
var charInfoText = <?php
|
|
||||||
|
|
||||||
$charInfoText = [];
|
|
||||||
foreach(GameConst::$availablePersonality as $personalityID){
|
|
||||||
$personalityInfo = buildPersonalityClass($personalityID)->getInfo();
|
|
||||||
$charInfoText[$personalityID] = $personalityInfo;
|
|
||||||
}
|
|
||||||
echo Json::encode((object)$charInfoText);
|
|
||||||
?>;
|
|
||||||
</script>
|
|
||||||
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
|
||||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
|
||||||
<?=WebUtil::printCSS('css/common.css')?>
|
|
||||||
<?=WebUtil::printJS('../d_shared/common_path.js')?>
|
|
||||||
<?=WebUtil::printJS('dist_js/vendors.js')?>
|
|
||||||
<?=WebUtil::printJS('dist_js/common.js')?>
|
|
||||||
<?=WebUtil::printJS('dist_js/join.js')?>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<table align=center width=1000 class='tb_layout bg0'>
|
|
||||||
<tr><td>장 수 생 성<br><?=backButton()?></td></tr>
|
|
||||||
</table>
|
|
||||||
<table align=center width=1000 class='tb_layout bg0'>
|
|
||||||
<tr><td align=center><?=info(0)?></td></tr>
|
|
||||||
</table>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
$gencount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2');
|
|
||||||
|
|
||||||
if ($gencount >= $admin['maxgeneral']) {
|
|
||||||
echo "<script>alert('더 이상 등록할 수 없습니다.');</script>";
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
$nationList = $db->query('SELECT nation,`name`,color,scout FROM nation');
|
|
||||||
shuffle($nationList);
|
|
||||||
$nationList = Util::convertArrayToDict($nationList, 'nation');
|
|
||||||
//NOTE: join 안할것임
|
|
||||||
$scoutMsgs = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'scout_msg');
|
|
||||||
foreach($scoutMsgs as $nationID=>$scoutMsg){
|
|
||||||
$nationList[$nationID]['scoutmsg'] = $scoutMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo getInvitationList($nationList);
|
|
||||||
?>
|
|
||||||
|
|
||||||
<form id='join_form' name=form1 method=post action=join_post.php>
|
|
||||||
<table align=center width=1000 class='tb_layout bg0'>
|
|
||||||
<tr>
|
|
||||||
<td colspan=3 align=center class='bg1'>장수 생성</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>장수명</td>
|
|
||||||
<td colspan=2>
|
|
||||||
<input id="generalName" type=text name=name maxlength=18 size=18 style="color:white;background-color:black;" value="<?=$member['name']?>">(전각 9글자, 반각 18글자 이내)
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<?php
|
|
||||||
if ($admin['show_img_level'] >= 1 && $member['grade'] >= 1 && $member['picture'] != "") {
|
|
||||||
$imageTemp = GetImageURL($member['imgsvr']);
|
|
||||||
echo "
|
|
||||||
<tr>
|
|
||||||
<td align=right class='bg1'>전콘 사용 여부</td>
|
|
||||||
<td width=64 height=64>
|
|
||||||
<img width='64' height='64' src='{$imageTemp}/{$member['picture']}' border='0'>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input type=checkbox name=pic value=1 checked>사용
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
";
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<tr>
|
|
||||||
<td align=center colspan=3>
|
|
||||||
계정관리에서 자신만을 표현할 수 있는 아이콘을 업로드 해보세요!
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>성격</td>
|
|
||||||
<td colspan=2>
|
|
||||||
<select id="selChar" name=character size=1 maxlength=15 style=color:white;background-color:black;>
|
|
||||||
<option selected value='Random'>????</option>
|
|
||||||
<?php foreach(GameConst::$availablePersonality as $personalityID): ?>
|
|
||||||
<?php $personalityName = buildPersonalityClass($personalityID)->getName(); ?>
|
|
||||||
<option value='<?=$personalityID?>'><?=$personalityName?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select> <span id="charInfoText"></span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>통솔</td>
|
|
||||||
<td colspan=2><input type="number" name="leadership" id="leadership" value="50"></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>무력</td>
|
|
||||||
<td colspan=2><input type="number" name="strength" id="strength" value="50"></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>지력</td>
|
|
||||||
<td colspan=2><input type="number" name="intel" id="intel" value="50"></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right class='bg1'>능력치 조정</td>
|
|
||||||
<td colspan=2>
|
|
||||||
<input type=button value=랜덤형 onclick=abilityRand()>
|
|
||||||
<input type=button value=통솔무력형 onclick=abilityLeadpow()>
|
|
||||||
<input type=button value=통솔지력형 onclick=abilityLeadint()>
|
|
||||||
<input type=button value=무력지력형 onclick=abilityPowint()>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align=center colspan=3>
|
|
||||||
<font color=orange>모든 능력치는 ( <?=GameConst::$defaultStatMin?> <= 능력치 <= <?=GameConst::$defaultStatMax?> ) 사이로 잡으셔야 합니다.<br>
|
|
||||||
그 외의 능력치는 가입되지 않습니다.</font>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align=center colspan=3>
|
|
||||||
능력치의 총합은 <?=GameConst::$defaultStatTotal?>입니다. 가입후 0~10의 능력치 보너스를 받게 됩니다.<br>
|
|
||||||
임의의 도시에서 재야로 시작하며 건국과 임관은 게임 내에서 실행합니다.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width=498 align=right><input type=submit name=join value=장수생성></td>
|
|
||||||
<td colspan=2><input type=reset name=reset value=다시입력></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</form>
|
|
||||||
<table align=center width=1000 class='tb_layout bg0'>
|
|
||||||
<tr><td><?=backButton()?></td></tr>
|
|
||||||
<tr><td><?=banner()?> </td></tr>
|
|
||||||
</table>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,341 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo;
|
|
||||||
|
|
||||||
include "lib.php";
|
|
||||||
include "func.php";
|
|
||||||
|
|
||||||
$v = new Validator($_POST);
|
|
||||||
$v
|
|
||||||
->rule('required', [
|
|
||||||
'name',
|
|
||||||
'leadership',
|
|
||||||
'strength',
|
|
||||||
'intel'
|
|
||||||
])
|
|
||||||
->rule('integer', [
|
|
||||||
'leadership',
|
|
||||||
'strength',
|
|
||||||
'intel',
|
|
||||||
])
|
|
||||||
->rule('stringWidthBetween', 'name', 1, 18)
|
|
||||||
->rule('min', [
|
|
||||||
'leadership',
|
|
||||||
'strength',
|
|
||||||
'intel'
|
|
||||||
], GameConst::$defaultStatMin)
|
|
||||||
->rule('max', [
|
|
||||||
'leadership',
|
|
||||||
'strength',
|
|
||||||
'intel'
|
|
||||||
], GameConst::$defaultStatMax)
|
|
||||||
->rule('in', 'character', array_merge(GameConst::$availablePersonality, ['Random']));
|
|
||||||
|
|
||||||
if (!$v->validate()) {
|
|
||||||
MessageBox($v->errorStr());
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$session = Session::requireLogin()->setReadOnly();
|
|
||||||
$userID = Session::getUserID();
|
|
||||||
//NOTE: 이 페이지에서는 세션에 데이터를 등록하지 않음. 로그인은 이후에.
|
|
||||||
|
|
||||||
$name = Util::getPost('name');
|
|
||||||
$name = htmlspecialchars($name);
|
|
||||||
$name = StringUtil::removeSpecialCharacter($name);
|
|
||||||
$name = WebUtil::htmlPurify($name);
|
|
||||||
$name = StringUtil::textStrip($name);
|
|
||||||
$pic = (int)Util::getPost('pic', 'bool', 0);
|
|
||||||
$character = Util::getPost('character');
|
|
||||||
|
|
||||||
$leadership = Util::getPost('leadership', 'int', 50);
|
|
||||||
$strength = Util::getPost('strength', 'int', 50);
|
|
||||||
$intel = Util::getPost('intel', 'int', 50);
|
|
||||||
|
|
||||||
$join = Util::getPost('join'); //쓸모 없음
|
|
||||||
|
|
||||||
$rootDB = RootDB::db();
|
|
||||||
//회원 테이블에서 정보확인
|
|
||||||
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID);
|
|
||||||
|
|
||||||
if (!$member) {
|
|
||||||
MessageBox("잘못된 접근입니다!!!");
|
|
||||||
echo "<script>history.go(-1);</script>";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$gameStor->cacheValues(['year','month','maxgeneral','scenario','show_img_level','turnterm','turntime','genius','npcmode']);
|
|
||||||
########## 동일 정보 존재여부 확인. ##########
|
|
||||||
|
|
||||||
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
|
|
||||||
$oldGeneral = $db->queryFirstField('SELECT `no` FROM general WHERE `owner`=%i', $userID);
|
|
||||||
$oldName = $db->queryFirstField('SELECT `no` FROM general WHERE `name`=%s', $name);
|
|
||||||
|
|
||||||
if ($oldGeneral) {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('이미 등록하셨습니다!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if ($oldName) {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('이미 있는 장수입니다. 다른 이름으로 등록해 주세요!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if ($gameStor->maxgeneral <= $gencount) {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('더이상 등록할 수 없습니다!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if ($name == '') {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('이름이 짧습니다. 다시 가입해주세요!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if (mb_strwidth($name) > 18) {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('이름이 유효하지 않습니다. 다시 가입해주세요!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if ($leadership + $strength + $intel > GameConst::$defaultStatTotal) {
|
|
||||||
echo("<script>
|
|
||||||
window.alert('능력치가 ".GameConst::$defaultStatTotal."을 넘어섰습니다. 다시 가입해주세요!')
|
|
||||||
history.go(-1)
|
|
||||||
</script>");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$genius = Util::randBool(0.01);
|
|
||||||
// 현재 1%
|
|
||||||
if ($genius && $gameStor->genius > 0) {
|
|
||||||
$gameStor->genius = $gameStor->genius-1;
|
|
||||||
} else {
|
|
||||||
$genius = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 공백지에서만 태어나게
|
|
||||||
$city = $db->queryFirstField("select city from city where level>=5 and level<=6 and nation=0 order by rand() limit 0,1");
|
|
||||||
if (!$city) {
|
|
||||||
$city = $db->queryFirstField("select city from city where level>=5 and level<=6 order by rand() limit 0,1");
|
|
||||||
}
|
|
||||||
|
|
||||||
$pleadership = 0;
|
|
||||||
$pstrength = 0;
|
|
||||||
$pintel = 0;
|
|
||||||
foreach(Util::range(Util::randRangeInt(3, 5)) as $statIdx){
|
|
||||||
switch (Util::choiceRandomUsingWeight([$leadership, $strength, $intel])) {
|
|
||||||
case 0:
|
|
||||||
$pleadership++;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
$pstrength++;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
$pintel++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$leadership = $leadership + $pleadership;
|
|
||||||
$strength = $strength + $pstrength;
|
|
||||||
$intel = $intel + $pintel;
|
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['scenario', 'turnterm', 'turntime', 'show_img_level', 'startyear', 'year']);
|
|
||||||
$relYear = Util::valueFit($admin['year'] - $admin['startyear'], 0);
|
|
||||||
|
|
||||||
$age = 20 + ($pleadership + $pstrength + $pintel) * 2 - (mt_rand(0, 1));
|
|
||||||
// 아직 남았고 천재등록상태이면 특기 부여
|
|
||||||
if ($genius) {
|
|
||||||
$specage2 = $age;
|
|
||||||
$special2 = SpecialityHelper::pickSpecialWar([
|
|
||||||
'leadership'=>$leadership,
|
|
||||||
'strength'=>$strength,
|
|
||||||
'intel'=>$intel,
|
|
||||||
'dex1'=>0,
|
|
||||||
'dex2'=>0,
|
|
||||||
'dex3'=>0,
|
|
||||||
'dex4'=>0,
|
|
||||||
'dex5'=>0
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/6 - $relYear / 2), 3) + $age;
|
|
||||||
$special2 = GameConst::$defaultSpecialWar;
|
|
||||||
}
|
|
||||||
//내특
|
|
||||||
$specage = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/12 - $relYear / 2), 3) + $age;
|
|
||||||
$special = GameConst::$defaultSpecialDomestic;
|
|
||||||
|
|
||||||
if ($admin['scenario'] >= 1000) {
|
|
||||||
$specage2 = $age + 3;
|
|
||||||
$specage = $age + 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($relYear < 3){
|
|
||||||
$experience = 0;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
$expGenCount = $db->queryFirstField('SELECT count(*) FROM general WHERE nation != 0 AND npc < 4');
|
|
||||||
$targetGenOrder = Util::round($expGenCount * 0.2);
|
|
||||||
$experience = $db->queryFirstField(
|
|
||||||
'SELECT experience FROM general WHERE nation != 0 AND npc < 4 ORDER BY experience ASC LIMIT %i, 1',
|
|
||||||
$targetGenOrder - 1
|
|
||||||
);
|
|
||||||
$experience *= 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
$turntime = getRandTurn($admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
|
|
||||||
|
|
||||||
$now = date('Y-m-d H:i:s');
|
|
||||||
if ($now >= $turntime) {
|
|
||||||
$turntime = addTurn($turntime, $admin['turnterm']);
|
|
||||||
}
|
|
||||||
|
|
||||||
//특회 전콘
|
|
||||||
if ($admin['show_img_level'] >= 1 && $member['grade'] >= 1 && $member['picture'] != "" && $pic) {
|
|
||||||
$face = $member['picture'];
|
|
||||||
$imgsvr = $member['imgsvr'];
|
|
||||||
} else {
|
|
||||||
$face = "default.jpg";
|
|
||||||
$imgsvr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//성격 랜덤시
|
|
||||||
if (!in_array($character, GameConst::$availablePersonality)){
|
|
||||||
$character = Util::choiceRandom(GameConst::$availablePersonality);
|
|
||||||
}
|
|
||||||
//상성 랜덤
|
|
||||||
$affinity = rand()%150 + 1;
|
|
||||||
|
|
||||||
########## 회원정보 테이블에 입력값을 등록한다. ##########
|
|
||||||
$db->insert('general', [
|
|
||||||
'owner' => $userID,
|
|
||||||
'name' => $name,
|
|
||||||
'owner_name' => $member['name'],
|
|
||||||
'picture' => $face,
|
|
||||||
'imgsvr' => $imgsvr,
|
|
||||||
'nation' => 0,
|
|
||||||
'city' => $city,
|
|
||||||
'troop' => 0,
|
|
||||||
'affinity' => $affinity,
|
|
||||||
'leadership' => $leadership,
|
|
||||||
'strength' => $strength,
|
|
||||||
'intel' => $intel,
|
|
||||||
'experience' => $experience,
|
|
||||||
'dedication' => 0,
|
|
||||||
'gold' => GameConst::$defaultGold,
|
|
||||||
'rice' => GameConst::$defaultRice,
|
|
||||||
'crew' => 0,
|
|
||||||
'train' => 0,
|
|
||||||
'atmos' => 0,
|
|
||||||
'officer_level' => 0,
|
|
||||||
'turntime' => $turntime,
|
|
||||||
'killturn' => 6,
|
|
||||||
'lastconnect' => $now,
|
|
||||||
'lastrefresh' => $now,
|
|
||||||
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
|
|
||||||
'makelimit' => 0,
|
|
||||||
'age' => $age,
|
|
||||||
'startage' => $age,
|
|
||||||
'personal' => $character,
|
|
||||||
'specage' => $specage,
|
|
||||||
'special' => $special,
|
|
||||||
'specage2' => $specage2,
|
|
||||||
'special2' => $special2
|
|
||||||
]);
|
|
||||||
$generalID = $db->insertId();
|
|
||||||
$turnRows = [];
|
|
||||||
foreach(Util::range(GameConst::$maxTurn) as $turnIdx){
|
|
||||||
$turnRows[] = [
|
|
||||||
'general_id'=>$generalID,
|
|
||||||
'turn_idx'=>$turnIdx,
|
|
||||||
'action'=>'휴식',
|
|
||||||
'arg'=>null,
|
|
||||||
'brief'=>'휴식'
|
|
||||||
];
|
|
||||||
}
|
|
||||||
$db->insert('general_turn', $turnRows);
|
|
||||||
|
|
||||||
resetInheritanceUser($userID);
|
|
||||||
|
|
||||||
$rank_data = [];
|
|
||||||
foreach(array_keys(General::RANK_COLUMN) as $rankColumn){
|
|
||||||
$rank_data[] = [
|
|
||||||
'general_id'=>$generalID,
|
|
||||||
'nation_id'=>0,
|
|
||||||
'type'=>$rankColumn,
|
|
||||||
'value'=>0
|
|
||||||
];
|
|
||||||
}
|
|
||||||
$db->insert('rank_data', $rank_data);
|
|
||||||
$db->insert('betting', [
|
|
||||||
'general_id'=>$generalID,
|
|
||||||
]);
|
|
||||||
$cityname = CityConst::byID($city)->name;
|
|
||||||
|
|
||||||
$me = [
|
|
||||||
'no'=>$generalID
|
|
||||||
];
|
|
||||||
|
|
||||||
$log = [];
|
|
||||||
$mylog = [];
|
|
||||||
|
|
||||||
$logger = new ActionLogger($generalID, 0, $gameStor->year, $gameStor->month);
|
|
||||||
|
|
||||||
$josaRa = JosaUtil::pick($name, '라');
|
|
||||||
$speicalText = getGeneralSpecialWarName($special2);
|
|
||||||
if ($genius) {
|
|
||||||
|
|
||||||
$logger->pushGlobalActionLog("<G><b>{$cityname}</b></>에서 <Y>{$name}</>{$josaRa}는 기재가 천하에 이름을 알립니다.");
|
|
||||||
$logger->pushGlobalActionLog("<C>{$speicalText}</> 특기를 가진 <C>천재</>의 등장으로 온 천하가 떠들썩합니다.");
|
|
||||||
$logger->pushGlobalHistoryLog("<L><b>【천재】</b></><G><b>{$cityname}</b></>에 천재가 등장했습니다.");
|
|
||||||
} else {
|
|
||||||
$logger->pushGlobalActionLog("<G><b>{$cityname}</b></>에서 <Y>{$name}</>{$josaRa}는 호걸이 천하에 이름을 알립니다.");
|
|
||||||
}
|
|
||||||
|
|
||||||
$logger->pushGeneralHistoryLog("<Y>{$name}</>, <G>{$cityname}</>에서 큰 뜻을 품다.");
|
|
||||||
$logger->pushGeneralActionLog("삼국지 모의전투 PHP의 세계에 오신 것을 환영합니다 ^o^", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralActionLog("처음 하시는 경우에는 <D>도움말</>을 참고하시고,", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralActionLog("문의사항이 있으시면 게시판에 글을 남겨주시면 되겠네요~", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralActionLog("부디 즐거운 삼모전 되시길 바랍니다 ^^", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralActionLog("통솔 <C>$pleadership</> 무력 <C>$pstrength</> 지력 <C>$pintel</> 의 보너스를 받으셨습니다.", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralActionLog("연령은 <C>$age</>세로 시작합니다.", ActionLogger::PLAIN);
|
|
||||||
|
|
||||||
if ($genius) {
|
|
||||||
$logger->pushGeneralActionLog("축하합니다! 천재로 태어나 처음부터 <C>{$speicalText}</> 특기를 가지게 됩니다!", ActionLogger::PLAIN);
|
|
||||||
$logger->pushGeneralHistoryLog("<C>{$speicalText}</> 특기를 가진 천재로 탄생.");
|
|
||||||
}
|
|
||||||
|
|
||||||
$logger->flush();
|
|
||||||
|
|
||||||
pushAdminLog(["가입 : {$userID} // {$name} // {$generalID}".getenv("REMOTE_ADDR")]);
|
|
||||||
|
|
||||||
$rootDB->insert('member_log', [
|
|
||||||
'member_no' => $userID,
|
|
||||||
'date'=>TimeUtil::now(),
|
|
||||||
'action_type'=>'make_general',
|
|
||||||
'action'=>Json::encode([
|
|
||||||
'server'=>DB::prefix(),
|
|
||||||
'type'=>'general',
|
|
||||||
'generalID'=>$generalID,
|
|
||||||
'generalName'=>$name
|
|
||||||
])
|
|
||||||
]);
|
|
||||||
|
|
||||||
?>
|
|
||||||
<script>
|
|
||||||
window.alert('정상적으로 회원 가입되었습니다. 장수명 : <?=$name?> \n위키와 팁/강좌 게시판을 꼭 읽어보세요!');
|
|
||||||
</script>
|
|
||||||
<script>location.replace('./');</script>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,444 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\General;
|
||||||
|
|
||||||
|
use sammo\ActionLogger;
|
||||||
|
use sammo\CityConst;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\GameUnitConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\JosaUtil;
|
||||||
|
use sammo\Json;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\RootDB;
|
||||||
|
use sammo\Session;
|
||||||
|
use sammo\SpecialityHelper;
|
||||||
|
use sammo\StringUtil;
|
||||||
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Util;
|
||||||
|
use sammo\Validator;
|
||||||
|
use sammo\WebUtil;
|
||||||
|
|
||||||
|
use function sammo\addTurn;
|
||||||
|
use function sammo\cutTurn;
|
||||||
|
use function sammo\getGeneralSpecialWarName;
|
||||||
|
use function sammo\getRandTurn;
|
||||||
|
use function sammo\pushAdminLog;
|
||||||
|
use function sammo\resetInheritanceUser;
|
||||||
|
|
||||||
|
class Join extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
$v = new Validator($this->args);
|
||||||
|
$v
|
||||||
|
->rule('required', [
|
||||||
|
'name',
|
||||||
|
'leadership',
|
||||||
|
'strength',
|
||||||
|
'intel',
|
||||||
|
'pic',
|
||||||
|
'character',
|
||||||
|
])
|
||||||
|
->rule('integer', [
|
||||||
|
'leadership',
|
||||||
|
'strength',
|
||||||
|
'intel',
|
||||||
|
'inheritTurntime',
|
||||||
|
])
|
||||||
|
->rule('boolean', [
|
||||||
|
'pic'
|
||||||
|
])
|
||||||
|
->rule('stringWidthBetween', 'name', 1, 18)
|
||||||
|
->rule('min', [
|
||||||
|
'leadership',
|
||||||
|
'strength',
|
||||||
|
'intel'
|
||||||
|
], GameConst::$defaultStatMin)
|
||||||
|
->rule('max', [
|
||||||
|
'leadership',
|
||||||
|
'strength',
|
||||||
|
'intel'
|
||||||
|
], GameConst::$defaultStatMax)
|
||||||
|
->rule('in', 'character', array_merge(GameConst::$availablePersonality, ['Random']))
|
||||||
|
->rule('in', 'inheritSpecial', GameConst::$availableSpecialWar)
|
||||||
|
->rule('min', 'inheritTurntime', 0)
|
||||||
|
->rule('in', 'inheritCity', array_keys(CityConst::all()))
|
||||||
|
->rule('integerArray', 'inheritBonusStat');
|
||||||
|
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
return static::REQ_LOGIN | static::REQ_READ_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
|
||||||
|
$name = $this->args['name'];
|
||||||
|
$name = htmlspecialchars($name);
|
||||||
|
$name = StringUtil::removeSpecialCharacter($name);
|
||||||
|
$name = WebUtil::htmlPurify($name);
|
||||||
|
$name = StringUtil::textStrip($name);
|
||||||
|
$pic = $this->args['pic'];
|
||||||
|
$character = $this->args['character'];
|
||||||
|
|
||||||
|
$leadership = $this->args['leadership'];
|
||||||
|
$strength = $this->args['strength'];
|
||||||
|
$intel = $this->args['intel'];
|
||||||
|
|
||||||
|
$inheritSpecial = $this->args['inheritSpecial'] ?? null;
|
||||||
|
$inheritTurntime = $this->args['inheritTurntime'] ?? null;
|
||||||
|
$inheritCity = $this->args['inheritCity'] ?? null;
|
||||||
|
$inheritBonusStat = $this->args['inheritBonusStat'] ?? null;
|
||||||
|
|
||||||
|
$rootDB = RootDB::db();
|
||||||
|
//회원 테이블에서 정보확인
|
||||||
|
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID);
|
||||||
|
|
||||||
|
if (!$member) {
|
||||||
|
return "잘못된 접근입니다!!!";
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
$gameStor->cacheValues(['year', 'month', 'maxgeneral', 'scenario', 'show_img_level', 'turnterm', 'turntime', 'genius', 'npcmode']);
|
||||||
|
########## 동일 정보 존재여부 확인. ##########
|
||||||
|
|
||||||
|
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
|
||||||
|
$oldGeneral = $db->queryFirstField('SELECT `no` FROM general WHERE `owner`=%i', $userID);
|
||||||
|
$oldName = $db->queryFirstField('SELECT `no` FROM general WHERE `name`=%s', $name);
|
||||||
|
|
||||||
|
if ($oldGeneral) {
|
||||||
|
return "이미 등록하셨습니다!";
|
||||||
|
}
|
||||||
|
if ($oldName) {
|
||||||
|
return "이미 있는 장수입니다. 다른 이름으로 등록해 주세요!";
|
||||||
|
}
|
||||||
|
if ($gameStor->maxgeneral <= $gencount) {
|
||||||
|
return "더이상 등록할 수 없습니다!";
|
||||||
|
}
|
||||||
|
if ($name == '') {
|
||||||
|
return "이름이 짧습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
if (mb_strwidth($name) > 18) {
|
||||||
|
return "이름이 유효하지 않습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
if ($leadership + $strength + $intel > GameConst::$defaultStatTotal) {
|
||||||
|
return "능력치가 " . GameConst::$defaultStatTotal . "을 넘어섰습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritBonusStat) {
|
||||||
|
if (count($inheritBonusStat) != 3) {
|
||||||
|
return "보너스 능력치가 잘못 지정되었습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
foreach ($inheritBonusStat as $stat) {
|
||||||
|
if ($stat < 0) {
|
||||||
|
return "보너스 능력치가 음수입니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sum = array_sum($inheritBonusStat);
|
||||||
|
if ($sum == 0) {
|
||||||
|
$inheritBonusStat = null;
|
||||||
|
} else if ($sum < 3 || $sum > 5) {
|
||||||
|
return "보너스 능력치 합이 잘못 지정되었습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$admin = $gameStor->getValues(['scenario', 'turnterm', 'turntime', 'show_img_level', 'startyear', 'year', 'month']);
|
||||||
|
|
||||||
|
$inheritTotalPoint = resetInheritanceUser($userID);
|
||||||
|
$inheritRequiredPoint = 0;
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID, $admin['year'], $admin['month'], false);
|
||||||
|
|
||||||
|
if ($inheritCity !== null) {
|
||||||
|
$inheritRequiredPoint += GameConst::$inheritBornCityPoint;
|
||||||
|
}
|
||||||
|
if ($inheritBonusStat !== null) {
|
||||||
|
$inheritRequiredPoint += GameConst::$inheritBornStatPoint;
|
||||||
|
}
|
||||||
|
if ($inheritSpecial !== null) {
|
||||||
|
$inheritRequiredPoint += GameConst::$inheritBornSpecialPoint;
|
||||||
|
}
|
||||||
|
if ($inheritTurntime !== null) {
|
||||||
|
$inheritRequiredPoint += GameConst::$inheritBornTurntimePoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritTotalPoint < $inheritRequiredPoint) {
|
||||||
|
return "유산 포인트가 부족합니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritSpecial !== null && $gameStor->genius == 0) {
|
||||||
|
return "이미 천재가 모두 나타났습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritCity !== null && !key_exists($inheritCity, CityConst::all())) {
|
||||||
|
return "도시가 잘못 지정되었습니다. 다시 가입해주세요!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritSpecial) {
|
||||||
|
$speicalText = getGeneralSpecialWarName($inheritSpecial);
|
||||||
|
$userLogger->push("{$speicalText} 전투 특기를 가진 천재 생성", "inheritPoint");
|
||||||
|
$genius = true;
|
||||||
|
} else {
|
||||||
|
// 현재 1%
|
||||||
|
$genius = Util::randBool(0.01);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($genius && $gameStor->genius > 0) {
|
||||||
|
$gameStor->genius = $gameStor->genius - 1;
|
||||||
|
} else {
|
||||||
|
$genius = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritCity !== null) {
|
||||||
|
$cityname = CityConst::byID($inheritCity)->name;
|
||||||
|
$userLogger->push("{$cityname}에 장수 생성", "inheritPoint");
|
||||||
|
$city = $inheritCity;
|
||||||
|
} else {
|
||||||
|
// 공백지에서만 태어나게
|
||||||
|
$city = $db->queryFirstField("select city from city where level>=5 and level<=6 and nation=0 order by rand() limit 0,1");
|
||||||
|
if (!$city) {
|
||||||
|
$city = $db->queryFirstField("select city from city where level>=5 and level<=6 order by rand() limit 0,1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritBonusStat) {
|
||||||
|
[$pleadership, $pstrength, $pintel] = $inheritBonusStat;
|
||||||
|
$userLogger->push("{$pleadership}, {$pstrength}, {$pintel} 보너스 능력치로 생성", "inheritPoint");
|
||||||
|
} else {
|
||||||
|
$pleadership = 0;
|
||||||
|
$pstrength = 0;
|
||||||
|
$pintel = 0;
|
||||||
|
foreach (Util::range(Util::randRangeInt(3, 5)) as $statIdx) {
|
||||||
|
switch (Util::choiceRandomUsingWeight([$leadership, $strength, $intel])) {
|
||||||
|
case 0:
|
||||||
|
$pleadership++;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$pstrength++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$pintel++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$leadership = $leadership + $pleadership;
|
||||||
|
$strength = $strength + $pstrength;
|
||||||
|
$intel = $intel + $pintel;
|
||||||
|
|
||||||
|
$relYear = Util::valueFit($admin['year'] - $admin['startyear'], 0);
|
||||||
|
|
||||||
|
$age = 20 + ($pleadership + $pstrength + $pintel) * 2 - (mt_rand(0, 1));
|
||||||
|
// 아직 남았고 천재등록상태이면 특기 부여
|
||||||
|
if ($genius) {
|
||||||
|
$specage2 = $age;
|
||||||
|
if ($inheritSpecial) {
|
||||||
|
$special2 = $inheritSpecial;
|
||||||
|
} else {
|
||||||
|
$special2 = SpecialityHelper::pickSpecialWar([
|
||||||
|
'leadership' => $leadership,
|
||||||
|
'strength' => $strength,
|
||||||
|
'intel' => $intel,
|
||||||
|
'dex1' => 0,
|
||||||
|
'dex2' => 0,
|
||||||
|
'dex3' => 0,
|
||||||
|
'dex4' => 0,
|
||||||
|
'dex5' => 0
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age) / 6 - $relYear / 2), 3) + $age;
|
||||||
|
$special2 = GameConst::$defaultSpecialWar;
|
||||||
|
}
|
||||||
|
//내특
|
||||||
|
$specage = Util::valueFit(Util::round((GameConst::$retirementYear - $age) / 12 - $relYear / 2), 3) + $age;
|
||||||
|
$special = GameConst::$defaultSpecialDomestic;
|
||||||
|
|
||||||
|
if ($admin['scenario'] >= 1000) {
|
||||||
|
$specage2 = $age + 3;
|
||||||
|
$specage = $age + 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($relYear < 3) {
|
||||||
|
$experience = 0;
|
||||||
|
} else {
|
||||||
|
$expGenCount = $db->queryFirstField('SELECT count(*) FROM general WHERE nation != 0 AND npc < 4');
|
||||||
|
$targetGenOrder = Util::round($expGenCount * 0.2);
|
||||||
|
$experience = $db->queryFirstField(
|
||||||
|
'SELECT experience FROM general WHERE nation != 0 AND npc < 4 ORDER BY experience ASC LIMIT %i, 1',
|
||||||
|
$targetGenOrder - 1
|
||||||
|
);
|
||||||
|
$experience *= 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritTurntime !== null) {
|
||||||
|
$inheritTurntime = $inheritTurntime % ($admin['turnterm'] * 60);
|
||||||
|
|
||||||
|
$userLogger->push(sprintf("턴 시간 %02d:%02d 로 지정", intdiv($inheritTurntime, 60), $inheritTurntime%60), "inheritPoint");
|
||||||
|
|
||||||
|
$inheritTurntime += Util::randRangeInt(0, 999999) / 1000000;
|
||||||
|
$turntime = new \DateTimeImmutable(cutTurn($admin['turntime'], $admin['turnterm']));
|
||||||
|
$turntime = $turntime->add(TimeUtil::secondsToDateInterval($inheritTurntime));
|
||||||
|
$turntime = TimeUtil::format($turntime, true);
|
||||||
|
} else {
|
||||||
|
$turntime = getRandTurn($admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$now = TimeUtil::now(true);
|
||||||
|
if ($now >= $turntime) {
|
||||||
|
$turntime = addTurn($turntime, $admin['turnterm']);
|
||||||
|
}
|
||||||
|
|
||||||
|
//특회 전콘
|
||||||
|
if ($admin['show_img_level'] >= 1 && $member['grade'] >= 1 && $member['picture'] != "" && $pic) {
|
||||||
|
$face = $member['picture'];
|
||||||
|
$imgsvr = $member['imgsvr'];
|
||||||
|
} else {
|
||||||
|
$face = "default.jpg";
|
||||||
|
$imgsvr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//성격 랜덤시
|
||||||
|
if (!in_array($character, GameConst::$availablePersonality)) {
|
||||||
|
$character = Util::choiceRandom(GameConst::$availablePersonality);
|
||||||
|
}
|
||||||
|
//상성 랜덤
|
||||||
|
$affinity = rand() % 150 + 1;
|
||||||
|
|
||||||
|
########## 회원정보 테이블에 입력값을 등록한다. ##########
|
||||||
|
$db->insert('general', [
|
||||||
|
'owner' => $userID,
|
||||||
|
'name' => $name,
|
||||||
|
'owner_name' => $member['name'],
|
||||||
|
'picture' => $face,
|
||||||
|
'imgsvr' => $imgsvr,
|
||||||
|
'nation' => 0,
|
||||||
|
'city' => $city,
|
||||||
|
'troop' => 0,
|
||||||
|
'affinity' => $affinity,
|
||||||
|
'leadership' => $leadership,
|
||||||
|
'strength' => $strength,
|
||||||
|
'intel' => $intel,
|
||||||
|
'experience' => $experience,
|
||||||
|
'dedication' => 0,
|
||||||
|
'gold' => GameConst::$defaultGold,
|
||||||
|
'rice' => GameConst::$defaultRice,
|
||||||
|
'crew' => 0,
|
||||||
|
'train' => 0,
|
||||||
|
'atmos' => 0,
|
||||||
|
'officer_level' => 0,
|
||||||
|
'turntime' => $turntime,
|
||||||
|
'killturn' => 6,
|
||||||
|
'lastconnect' => $now,
|
||||||
|
'lastrefresh' => $now,
|
||||||
|
'crewtype' => GameUnitConst::DEFAULT_CREWTYPE,
|
||||||
|
'makelimit' => 0,
|
||||||
|
'age' => $age,
|
||||||
|
'startage' => $age,
|
||||||
|
'personal' => $character,
|
||||||
|
'specage' => $specage,
|
||||||
|
'special' => $special,
|
||||||
|
'specage2' => $specage2,
|
||||||
|
'special2' => $special2
|
||||||
|
]);
|
||||||
|
$generalID = $db->insertId();
|
||||||
|
$turnRows = [];
|
||||||
|
foreach (Util::range(GameConst::$maxTurn) as $turnIdx) {
|
||||||
|
$turnRows[] = [
|
||||||
|
'general_id' => $generalID,
|
||||||
|
'turn_idx' => $turnIdx,
|
||||||
|
'action' => '휴식',
|
||||||
|
'arg' => null,
|
||||||
|
'brief' => '휴식'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$db->insert('general_turn', $turnRows);
|
||||||
|
|
||||||
|
$rank_data = [];
|
||||||
|
foreach (array_keys(General::RANK_COLUMN) as $rankColumn) {
|
||||||
|
$rank_data[] = [
|
||||||
|
'general_id' => $generalID,
|
||||||
|
'nation_id' => 0,
|
||||||
|
'type' => $rankColumn,
|
||||||
|
'value' => 0
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$db->insert('rank_data', $rank_data);
|
||||||
|
$db->insert('betting', [
|
||||||
|
'general_id' => $generalID,
|
||||||
|
]);
|
||||||
|
$cityname = CityConst::byID($city)->name;
|
||||||
|
|
||||||
|
|
||||||
|
if ($inheritRequiredPoint > 0) {
|
||||||
|
$userLogger->push("장수 생성으로 포인트 {$inheritRequiredPoint} 소모", "inheritPoint");
|
||||||
|
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
||||||
|
$inheritStor->setValue('previous', [$inheritTotalPoint - $inheritRequiredPoint, null]);
|
||||||
|
$userLogger->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
$me = [
|
||||||
|
'no' => $generalID
|
||||||
|
];
|
||||||
|
|
||||||
|
$log = [];
|
||||||
|
$mylog = [];
|
||||||
|
|
||||||
|
$logger = new ActionLogger($generalID, 0, $gameStor->year, $gameStor->month);
|
||||||
|
|
||||||
|
$josaRa = JosaUtil::pick($name, '라');
|
||||||
|
$speicalText = getGeneralSpecialWarName($special2);
|
||||||
|
if ($genius) {
|
||||||
|
|
||||||
|
$logger->pushGlobalActionLog("<G><b>{$cityname}</b></>에서 <Y>{$name}</>{$josaRa}는 기재가 천하에 이름을 알립니다.");
|
||||||
|
$logger->pushGlobalActionLog("<C>{$speicalText}</> 특기를 가진 <C>천재</>의 등장으로 온 천하가 떠들썩합니다.");
|
||||||
|
$logger->pushGlobalHistoryLog("<L><b>【천재】</b></><G><b>{$cityname}</b></>에 천재가 등장했습니다.");
|
||||||
|
} else {
|
||||||
|
$logger->pushGlobalActionLog("<G><b>{$cityname}</b></>에서 <Y>{$name}</>{$josaRa}는 호걸이 천하에 이름을 알립니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$logger->pushGeneralHistoryLog("<Y>{$name}</>, <G>{$cityname}</>에서 큰 뜻을 품다.");
|
||||||
|
$logger->pushGeneralActionLog("삼국지 모의전투 PHP의 세계에 오신 것을 환영합니다 ^o^", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralActionLog("처음 하시는 경우에는 <D>도움말</>을 참고하시고,", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralActionLog("문의사항이 있으시면 게시판에 글을 남겨주시면 되겠네요~", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralActionLog("부디 즐거운 삼모전 되시길 바랍니다 ^^", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralActionLog("통솔 <C>$pleadership</> 무력 <C>$pstrength</> 지력 <C>$pintel</> 의 보너스를 받으셨습니다.", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralActionLog("연령은 <C>$age</>세로 시작합니다.", ActionLogger::PLAIN);
|
||||||
|
|
||||||
|
if ($genius) {
|
||||||
|
$logger->pushGeneralActionLog("축하합니다! 천재로 태어나 처음부터 <C>{$speicalText}</> 특기를 가지게 됩니다!", ActionLogger::PLAIN);
|
||||||
|
$logger->pushGeneralHistoryLog("<C>{$speicalText}</> 특기를 가진 천재로 탄생.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$logger->flush();
|
||||||
|
|
||||||
|
pushAdminLog(["가입 : {$userID} // {$name} // {$generalID}" . getenv("REMOTE_ADDR")]);
|
||||||
|
|
||||||
|
$rootDB->insert('member_log', [
|
||||||
|
'member_no' => $userID,
|
||||||
|
'date' => TimeUtil::now(),
|
||||||
|
'action_type' => 'make_general',
|
||||||
|
'action' => Json::encode([
|
||||||
|
'server' => DB::prefix(),
|
||||||
|
'type' => 'general',
|
||||||
|
'generalID' => $generalID,
|
||||||
|
'generalName' => $name
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\TimeUtil;
|
||||||
|
use sammo\TriggerInheritBuff;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
class BuyHiddenBuff extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
$v = new Validator($this->args);
|
||||||
|
$v->rule('required', [
|
||||||
|
'type',
|
||||||
|
'level',
|
||||||
|
])
|
||||||
|
->rule('integer', 'level')
|
||||||
|
->rule('min', 'level', 1)
|
||||||
|
->rule('max', 'level', TriggerInheritBuff::MAX_STEP)
|
||||||
|
->rule('keyExists', 'type', TriggerInheritBuff::BUFF_KEY_TEXT);
|
||||||
|
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//General.aux 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$type = $this->args['type'];
|
||||||
|
$level = $this->args['level'];
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if ($userID != $general->getVar('owner')) {
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
|
||||||
|
$inheritBuffList = $general->getAuxVar('inheritBuff') ?? [];
|
||||||
|
$prevLevel = $inheritBuffList[$type] ?? 0;
|
||||||
|
|
||||||
|
if ($prevLevel == $level) {
|
||||||
|
return '이미 구입했습니다.';
|
||||||
|
}
|
||||||
|
if ($prevLevel > $level) {
|
||||||
|
return '이미 더 높은 등급을 구입했습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$reqAmount = GameConst::$inheritBuffPoints[$level] - GameConst::$inheritBuffPoints[$prevLevel];
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0,0])[0];
|
||||||
|
if ($previousPoint < $reqAmount) {
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$buffTypeText = TriggerInheritBuff::BUFF_KEY_TEXT[$type];
|
||||||
|
$moreText = $prevLevel > 0 ? "추가":"";
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 {$buffTypeText} {$level} 단계 {$moreText}구입", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$inheritBuffList[$type] = $level;
|
||||||
|
$general->setAuxVar('inheritBuff', $inheritBuffList);
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
|
||||||
|
class BuyRandomUnique extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//General.aux 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if($userID != $general->getVar('owner')){
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($general->getAuxVar('inheritRandomUnique') !== null){
|
||||||
|
return '이미 구입 명령을 내렸습니다. 다음 턴까지 기다려주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous')??[0, 0])[0];
|
||||||
|
$reqAmount = GameConst::$inheritItemRandomPoint;
|
||||||
|
if($previousPoint < $reqAmount){
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 랜덤 유니크 구입", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$general->setAuxVar('inheritRandomUnique', TimeUtil::now());
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\buildItemClass;
|
||||||
|
|
||||||
|
class BuySpecificUnique 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', [
|
||||||
|
'item',
|
||||||
|
'amount',
|
||||||
|
])
|
||||||
|
->rule('integer', 'amount')
|
||||||
|
->rule('min', 'amount', GameConst::$inheritItemUniqueMinPoint)
|
||||||
|
->rule('keyExists', 'item', $availableItems);
|
||||||
|
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//KVStrorage, General.aux 모두 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$itemKey = $this->args['item'];
|
||||||
|
$amount = $this->args['amount'];
|
||||||
|
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if ($userID != $general->getVar('owner')) {
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$itemTrials = $general->getAuxVar('inheritUniqueTrial') ?? [];
|
||||||
|
if (key_exists($itemKey, $itemTrials)) {
|
||||||
|
return '이미 입찰한 아이템입니다. 다음 턴에 시도해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||||
|
if ($previousPoint < $amount) {
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$itemObj = buildItemClass($itemKey);
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$amount} 포인트로 유니크 {$itemObj->getName()} 구입 시도", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$itemTrials[$itemKey] = $amount;
|
||||||
|
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $amount, null]);
|
||||||
|
$trialStor->setValue("u{$userID}", [$userID, $generalID, $amount]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
class ResetSpecialWar extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//KVStrorage, General.aux 모두 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if ($userID != $general->getVar('owner')) {
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$currentSpecialWar = $general->getVar('special2');
|
||||||
|
if ($currentSpecialWar === null || $currentSpecialWar == 'None') {
|
||||||
|
return '이미 전투 특기가 공란입니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentLevel = $general->getAuxVar('inheritResetSpecialWar') ?? -1;
|
||||||
|
$nextLevel = $currentLevel + 1;
|
||||||
|
while (count(GameConst::$inheritResetAttrPointBase) <= $nextLevel) {
|
||||||
|
$baseLen = count(GameConst::$inheritResetAttrPointBase);
|
||||||
|
GameConst::$inheritResetAttrPointBase[] = GameConst::$inheritResetAttrPointBase[$baseLen - 1] + GameConst::$inheritResetAttrPointBase[$baseLen - 2];
|
||||||
|
}
|
||||||
|
|
||||||
|
$reqPoint = GameConst::$inheritResetAttrPointBase[$nextLevel];
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||||
|
if ($previousPoint < $reqPoint) {
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$reqPoint} 포인트로 전투 특기 초기화", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$oldTypeKey = 'prev_types_special2';
|
||||||
|
$oldSpecialList = $general->getAuxVar($oldTypeKey) ?? [];
|
||||||
|
$oldSpecialList[] = $currentSpecialWar;
|
||||||
|
$general->setAuxVar($oldTypeKey, $oldSpecialList);
|
||||||
|
|
||||||
|
$general->setAuxVar('inheritResetSpecialWar', $nextLevel);
|
||||||
|
$general->setVar('special2', 'None');
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use DateTimeImmutable;
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Util;
|
||||||
|
|
||||||
|
class ResetTurnTime extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//KVStrorage, General.aux 모두 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if ($userID != $general->getVar('owner')) {
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentLevel = $general->getAuxVar('inheritResetTurnTime') ?? -1;
|
||||||
|
$nextLevel = $currentLevel + 1;
|
||||||
|
while (count(GameConst::$inheritResetAttrPointBase) <= $nextLevel) {
|
||||||
|
$baseLen = count(GameConst::$inheritResetAttrPointBase);
|
||||||
|
GameConst::$inheritResetAttrPointBase[] = GameConst::$inheritResetAttrPointBase[$baseLen - 1] + GameConst::$inheritResetAttrPointBase[$baseLen - 2];
|
||||||
|
}
|
||||||
|
|
||||||
|
$reqPoint = GameConst::$inheritResetAttrPointBase[$nextLevel];
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||||
|
if ($previousPoint < $reqPoint) {
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$gameStor = new KVStorage($db, 'game_env');
|
||||||
|
[$turnTerm, $serverTurnTime] = $gameStor->getValuesAsArray(['turnterm', 'turntime']);
|
||||||
|
|
||||||
|
$currTurnTime = new DateTimeImmutable($general->getTurnTime());
|
||||||
|
$serverTurnTimeObj = new DateTimeImmutable($serverTurnTime);
|
||||||
|
|
||||||
|
$afterTurn = Util::randRange($turnTerm * -60 / 2, $turnTerm * 60 / 2);
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
if($afterTurn >= 0){
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 뒤로 밀림", intdiv(Util::toInt($afterTurn), 60), $afterTurn%60), "inheritPoint");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 앞으로 당김", intdiv(Util::toInt(-$afterTurn), 60), (-$afterTurn)%60), "inheritPoint");
|
||||||
|
}
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$turnTime = $currTurnTime->add(TimeUtil::secondsToDateInterval($afterTurn));
|
||||||
|
if ($turnTime <= $serverTurnTimeObj && $serverTurnTimeObj <= $currTurnTime) {
|
||||||
|
$turnTime = $turnTime->add(TimeUtil::secondsToDateInterval($turnTerm * 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
$general->setVar('turntime', TimeUtil::format($turnTime, true));
|
||||||
|
$general->setAuxVar('inheritResetTurnTime', $nextLevel);
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\InheritAction;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\buildGeneralSpecialWarClass;
|
||||||
|
|
||||||
|
class SetNextSpecialWar extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
$v = new Validator($this->args);
|
||||||
|
$v->rule('required', [
|
||||||
|
'type',
|
||||||
|
])
|
||||||
|
->rule('in', 'type', GameConst::$availableSpecialWar);
|
||||||
|
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
//General.aux 쓰므로 lock;
|
||||||
|
return static::REQ_GAME_LOGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
$userID = $session->userID;
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
|
$type = $this->args['type'];
|
||||||
|
|
||||||
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
if ($userID != $general->getVar('owner')) {
|
||||||
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$inheritSpecificSpecialWar = $general->getAuxVar('inheritSpecificSpecialWar');
|
||||||
|
$currentSpecialWar = $general->getVar('special2');
|
||||||
|
|
||||||
|
if ($currentSpecialWar == $type) {
|
||||||
|
return '이미 그 특기를 보유하고 있습니다.';
|
||||||
|
}
|
||||||
|
if ($inheritSpecificSpecialWar == $type) {
|
||||||
|
return '이미 그 특기를 예약하였습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inheritSpecificSpecialWar !== null) {
|
||||||
|
return '이미 예약한 특기가 있습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$reqAmount = GameConst::$inheritSpecificSpecialPoint;
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||||
|
if ($previousPoint < $reqAmount) {
|
||||||
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$specialWarObj = buildGeneralSpecialWarClass($type);
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 다음 전투 특기로 {$specialWarObj->getName()} 지정", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$general->setAuxVar('inheritSpecificSpecialWar', $type);
|
||||||
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
|
$general->applyDB($db);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ class che_무기_09_동호비궁 extends \sammo\BaseStatItem{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.15, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.2, 20, 40),
|
||||||
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class che_무기_13_양유기궁 extends \sammo\BaseStatItem{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.05, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.1, 20, 40),
|
||||||
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,16 @@ class che_반계_백우선 extends \sammo\BaseItem{
|
|||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*301, false, '계략약화'),
|
|
||||||
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*301),
|
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*301),
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,9 +19,16 @@ class che_반계_파초선 extends \sammo\BaseItem{
|
|||||||
protected $cost = 200;
|
protected $cost = 200;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*302, false, '계략약화'),
|
|
||||||
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*302),
|
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*302),
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -18,9 +18,11 @@ class che_서적_07_논어 extends \sammo\BaseStatItem{
|
|||||||
$this->info .= "<br>[전투] 상대의 계략 성공 확률 -10%p";
|
$this->info .= "<br>[전투] 상대의 계략 성공 확률 -10%p";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
return new WarUnitTriggerCaller(
|
{
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*207, false, '계략약화')
|
$debuff = [
|
||||||
);
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,9 +18,11 @@ class che_서적_11_춘추전 extends \sammo\BaseStatItem{
|
|||||||
$this->info .= "<br>[전투] 상대의 계략 성공 확률 -10%p";
|
$this->info .= "<br>[전투] 상대의 계략 성공 확률 -10%p";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
return new WarUnitTriggerCaller(
|
{
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*211, false, '계략약화')
|
$debuff = [
|
||||||
);
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo\ActionItem;
|
namespace sammo\ActionItem;
|
||||||
|
|
||||||
use \sammo\iAction;
|
use \sammo\iAction;
|
||||||
use \sammo\General;
|
use \sammo\General;
|
||||||
use \sammo\GeneralTrigger;
|
use \sammo\GeneralTrigger;
|
||||||
@@ -17,7 +19,8 @@ use sammo\WarUnitTrigger\che_전멸시페이즈증가;
|
|||||||
use sammo\WarUnitTrigger\che_부상무효;
|
use sammo\WarUnitTrigger\che_부상무효;
|
||||||
use sammo\WarUnitTrigger\WarActivateSkills;
|
use sammo\WarUnitTrigger\WarActivateSkills;
|
||||||
|
|
||||||
class che_치트_HideD의_사인검 extends \sammo\BaseItem{
|
class che_치트_HideD의_사인검 extends \sammo\BaseItem
|
||||||
|
{
|
||||||
|
|
||||||
protected $rawName = 'HideD의 사인검';
|
protected $rawName = 'HideD의 사인검';
|
||||||
protected $name = 'HideD의 사인검(치트)';
|
protected $name = 'HideD의 사인검(치트)';
|
||||||
@@ -37,7 +40,8 @@ EOT;
|
|||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
protected $buyable = false;
|
protected $buyable = false;
|
||||||
|
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
||||||
|
{
|
||||||
if ($turnType == '계략') {
|
if ($turnType == '계략') {
|
||||||
if ($varType == 'success') return $value + 2;
|
if ($varType == 'success') return $value + 2;
|
||||||
}
|
}
|
||||||
@@ -45,7 +49,8 @@ EOT;
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
$bonus = [
|
$bonus = [
|
||||||
'bonusTrain' => 30,
|
'bonusTrain' => 30,
|
||||||
'bonusAtmos' => 30,
|
'bonusAtmos' => 30,
|
||||||
@@ -57,13 +62,23 @@ EOT;
|
|||||||
return $bonus + $value;
|
return $bonus + $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPreTurnExecuteTriggerList(General $general): ?GeneralTriggerCaller
|
||||||
|
{
|
||||||
return new GeneralTriggerCaller(
|
return new GeneralTriggerCaller(
|
||||||
new GeneralTrigger\che_도시치료($general)
|
new GeneralTrigger\che_도시치료($general)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_NONE),
|
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_NONE),
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
|
||||||
@@ -73,7 +88,7 @@ EOT;
|
|||||||
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
|
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
{
|
{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '필살불가', '위압불가', '격노불가', '계략약화', '저격불가'),
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '필살불가', '위압불가', '격노불가', '저격불가'),
|
||||||
new che_전투치료시도($unit),
|
new che_전투치료시도($unit),
|
||||||
new che_전투치료발동($unit),
|
new che_전투치료발동($unit),
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_NONE, 1 / 2, 20, 60),
|
new che_저격시도($unit, che_저격시도::TYPE_NONE, 1 / 2, 20, 60),
|
||||||
@@ -84,8 +99,8 @@ EOT;
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit): array
|
||||||
|
{
|
||||||
return [1, 0.95];
|
return [1, 0.95];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,25 +11,29 @@ class event_전투특기_무쌍 extends \sammo\BaseItem{
|
|||||||
protected $id = 61;
|
protected $id = 61;
|
||||||
protected $rawName = '비급';
|
protected $rawName = '비급';
|
||||||
protected $name = '비급(무쌍)';
|
protected $name = '비급(무쌍)';
|
||||||
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대40%)<br>승리 수만큼 피해 0.05%씩 감소(최대30%)';
|
protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
|
||||||
protected $cost = 100;
|
protected $cost = 100;
|
||||||
protected $buyable = true;
|
protected $buyable = true;
|
||||||
protected $consumable = false;
|
protected $consumable = false;
|
||||||
protected $reqSecu = 3000;
|
protected $reqSecu = 3000;
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){
|
if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
|
||||||
return $value += 0.1;
|
return $value += 0.1;
|
||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
$attackMultiplier = 1.1;
|
$generalWarSpecial = $unit->getGeneral()->getSpecialWar();
|
||||||
$defenceMultiplier = 0.95;
|
if($generalWarSpecial !== null && $generalWarSpecial->getName() == '무쌍'){
|
||||||
|
return [1, 1];
|
||||||
|
}
|
||||||
|
$attackMultiplier = 1.05;
|
||||||
|
$defenceMultiplier = 0.98;
|
||||||
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
||||||
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.4);
|
$attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
|
||||||
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.3);
|
$defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
|
||||||
return [$attackMultiplier, $defenceMultiplier];
|
return [$attackMultiplier, $defenceMultiplier];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,10 +28,17 @@ class event_전투특기_반계 extends \sammo\BaseItem{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*401, false, '계략약화'),
|
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM),
|
||||||
new che_반계시도($unit),
|
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,14 @@ class che_event_견고 extends \sammo\BaseSpecial{
|
|||||||
SpecialityHelper::STAT_STRENGTH
|
SpecialityHelper::STAT_STRENGTH
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_ITEM),
|
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_ITEM),
|
||||||
@@ -30,7 +38,7 @@ class che_event_견고 extends \sammo\BaseSpecial{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*402, false, '필살불가', '계략약화', '저격불가')
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*402, false, '필살불가', '저격불가')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class che_event_무쌍 extends \sammo\BaseSpecial{
|
|||||||
|
|
||||||
protected $id = 61;
|
protected $id = 61;
|
||||||
protected $name = '무쌍';
|
protected $name = '무쌍';
|
||||||
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대40%)<br>승리 수만큼 피해 0.05%씩 감소(최대30%)';
|
protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
|
||||||
|
|
||||||
static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
|
static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
|
||||||
static $selectWeight = 1;
|
static $selectWeight = 1;
|
||||||
@@ -19,18 +19,22 @@ class che_event_무쌍 extends \sammo\BaseSpecial{
|
|||||||
];
|
];
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){
|
if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
|
||||||
return $value += 0.1;
|
return $value += 0.1;
|
||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
$attackMultiplier = 1.1;
|
$generalWarSpecial = $unit->getGeneral()->getSpecialWar();
|
||||||
$defenceMultiplier = 1;
|
if($generalWarSpecial !== null && $generalWarSpecial->getName() == '무쌍'){
|
||||||
|
return [1, 1];
|
||||||
|
}
|
||||||
|
$attackMultiplier = 1.05;
|
||||||
|
$defenceMultiplier = 0.98;
|
||||||
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
||||||
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.4);
|
$attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
|
||||||
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.3);
|
$defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
|
||||||
return [$attackMultiplier, $defenceMultiplier];
|
return [$attackMultiplier, $defenceMultiplier];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -33,10 +33,17 @@ class che_event_반계 extends \sammo\BaseSpecial
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
{
|
{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE * 403, false, '계략약화'),
|
|
||||||
new che_반계시도($unit),
|
new che_반계시도($unit),
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -24,6 +24,14 @@ class che_견고 extends \sammo\BaseSpecial
|
|||||||
SpecialityHelper::STAT_STRENGTH
|
SpecialityHelper::STAT_STRENGTH
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
{
|
{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
@@ -35,7 +43,7 @@ class che_견고 extends \sammo\BaseSpecial
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
{
|
{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE * 404, false, '필살불가', '계략약화', '저격불가')
|
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE * 404, false, '필살불가', '저격불가')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class che_무쌍 extends \sammo\BaseSpecial{
|
|||||||
|
|
||||||
protected $id = 61;
|
protected $id = 61;
|
||||||
protected $name = '무쌍';
|
protected $name = '무쌍';
|
||||||
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대40%)<br>승리 수만큼 피해 0.05%씩 감소(최대30%)';
|
protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
|
||||||
|
|
||||||
static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
|
static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
|
||||||
static $selectWeight = 1;
|
static $selectWeight = 1;
|
||||||
@@ -19,18 +19,18 @@ class che_무쌍 extends \sammo\BaseSpecial{
|
|||||||
];
|
];
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){
|
if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
|
||||||
return $value += 0.1;
|
return $value += 0.1;
|
||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit):array{
|
||||||
$attackMultiplier = 1.1;
|
$attackMultiplier = 1.05;
|
||||||
$defenceMultiplier = 0.95;
|
$defenceMultiplier = 0.98;
|
||||||
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
$killnum = $unit->getGeneral()->getRankVar('killnum');
|
||||||
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.4);
|
$attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
|
||||||
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.3);
|
$defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
|
||||||
return [$attackMultiplier, $defenceMultiplier];
|
return [$attackMultiplier, $defenceMultiplier];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,9 +29,16 @@ class che_반계 extends \sammo\BaseSpecial{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
$debuff = [
|
||||||
|
'warMagicSuccessProb' => 0.1,
|
||||||
|
][$statName] ?? 0;
|
||||||
|
return $value - $debuff;
|
||||||
|
}
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_ITEM + BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE * 406, false, '계략약화'),
|
|
||||||
new che_반계시도($unit),
|
new che_반계시도($unit),
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ namespace sammo;
|
|||||||
|
|
||||||
class CityHelper{
|
class CityHelper{
|
||||||
//Just Helper
|
//Just Helper
|
||||||
private static $list = null;
|
private static ?array $list = null;
|
||||||
private static $listInv = null;
|
private static ?array $listInv = null;
|
||||||
private static $listByNation = null;
|
private static ?array $listByNation = null;
|
||||||
|
|
||||||
private function __construct(){
|
private function __construct(){
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_NPC능동 extends Command\GeneralCommand{
|
class che_NPC능동 extends Command\GeneralCommand{
|
||||||
static protected $actionName = 'NPC능동';
|
static protected $actionName = 'NPC능동';
|
||||||
@@ -97,7 +98,7 @@ class che_NPC능동 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
}
|
}
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\LastTurn;
|
|||||||
use \sammo\Command;
|
use \sammo\Command;
|
||||||
|
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -161,6 +162,8 @@ class che_강행 extends Command\GeneralCommand
|
|||||||
$general->increaseVar('leadership_exp', 1);
|
$general->increaseVar('leadership_exp', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ use \sammo\Constraint\ConstraintHelper;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use function sammo\refreshNationStaticInfo;
|
use function sammo\refreshNationStaticInfo;
|
||||||
use function sammo\getAllNationStaticInfo;
|
use function sammo\getAllNationStaticInfo;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
|
|
||||||
class che_거병 extends Command\GeneralCommand{
|
class che_거병 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '거병';
|
static protected $actionName = '거병';
|
||||||
@@ -172,6 +171,8 @@ class che_거병 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ use \sammo\Constraint\Constraint;
|
|||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
use \sammo\TextDecoration\SightseeingMessage;
|
use \sammo\TextDecoration\SightseeingMessage;
|
||||||
|
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
class che_견문 extends Command\GeneralCommand{
|
class che_견문 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '견문';
|
static protected $actionName = '견문';
|
||||||
@@ -111,6 +112,8 @@ class che_견문 extends Command\GeneralCommand{
|
|||||||
$general->addExperience($exp);
|
$general->addExperience($exp);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ use \sammo\Constraint\Constraint;
|
|||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
use sammo\MustNotBeReachedException;
|
use sammo\MustNotBeReachedException;
|
||||||
|
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
class che_군량매매 extends Command\GeneralCommand{
|
class che_군량매매 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '군량매매';
|
static protected $actionName = '군량매매';
|
||||||
static public $reqArg = true;
|
static public $reqArg = true;
|
||||||
@@ -176,6 +178,8 @@ class che_군량매매 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use \sammo\Constraint\Constraint;
|
|||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
|
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
class che_귀환 extends Command\GeneralCommand{
|
class che_귀환 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '귀환';
|
static protected $actionName = '귀환';
|
||||||
@@ -95,6 +95,8 @@ class che_귀환 extends Command\GeneralCommand{
|
|||||||
$general->increaseVar('leadership_exp', 1);
|
$general->increaseVar('leadership_exp', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ use \sammo\{
|
|||||||
use function \sammo\getAllNationStaticInfo;
|
use function \sammo\getAllNationStaticInfo;
|
||||||
use function \sammo\getNationStaticInfo;
|
use function \sammo\getNationStaticInfo;
|
||||||
use function \sammo\newColor;
|
use function \sammo\newColor;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -164,6 +165,8 @@ class che_등용 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -182,13 +182,13 @@ class che_랜덤임관 extends Command\GeneralCommand
|
|||||||
$generalsCnt = [];
|
$generalsCnt = [];
|
||||||
if ($notIn) {
|
if ($notIn) {
|
||||||
$rawGeneralsCnt = $db->query(
|
$rawGeneralsCnt = $db->query(
|
||||||
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE npc != 9 AND nation.gennum < %i AND nation.scout=0 AND nation.nation NOT IN %li GROUP BY general.nation, general.npc',
|
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE (npc < 4 OR npc = 6) AND nation.gennum < %i AND nation.scout=0 AND nation.nation NOT IN %li GROUP BY general.nation, general.npc',
|
||||||
$genLimit,
|
$genLimit,
|
||||||
$notIn
|
$notIn
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$rawGeneralsCnt = $db->query(
|
$rawGeneralsCnt = $db->query(
|
||||||
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE npc != 9 AND nation.gennum < %i AND nation.scout=0 GROUP BY general.nation, general.npc',
|
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE (npc < 4 OR npc = 6) AND nation.gennum < %i AND nation.scout=0 GROUP BY general.nation, general.npc',
|
||||||
$genLimit
|
$genLimit
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -234,7 +234,7 @@ class che_랜덤임관 extends Command\GeneralCommand
|
|||||||
if (!$destNation) {
|
if (!$destNation) {
|
||||||
//임관 가능한 국가가 없다!
|
//임관 가능한 국가가 없다!
|
||||||
$logger->pushGeneralActionLog("임관 가능한 국가가 없습니다. <1>$date</>");
|
$logger->pushGeneralActionLog("임관 가능한 국가가 없습니다. <1>$date</>");
|
||||||
$this->alternative = new che_요양($general, $this->env, null);
|
$this->alternative = new che_인재탐색($general, $this->env, null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_모반시도 extends Command\GeneralCommand{
|
class che_모반시도 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '모반시도';
|
static protected $actionName = '모반시도';
|
||||||
|
|
||||||
@@ -95,6 +97,7 @@ class che_모반시도 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
$lordGeneral->applyDB($db);
|
$lordGeneral->applyDB($db);
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\{
|
|||||||
|
|
||||||
use function \sammo\getDomesticExpLevelBonus;
|
use function \sammo\getDomesticExpLevelBonus;
|
||||||
use function \sammo\CriticalScoreEx;
|
use function \sammo\CriticalScoreEx;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -120,6 +121,8 @@ class che_물자조달 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use \sammo\Constraint\ConstraintHelper;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use function sammo\DeleteConflict;
|
use function sammo\DeleteConflict;
|
||||||
use function sammo\refreshNationStaticInfo;
|
use function sammo\refreshNationStaticInfo;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_방랑 extends Command\GeneralCommand{
|
class che_방랑 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '방랑';
|
static protected $actionName = '방랑';
|
||||||
@@ -123,6 +123,7 @@ class che_방랑 extends Command\GeneralCommand{
|
|||||||
refreshNationStaticInfo();
|
refreshNationStaticInfo();
|
||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use function\sammo\tryUniqueItemLottery;
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_선양 extends Command\GeneralCommand
|
class che_선양 extends Command\GeneralCommand
|
||||||
{
|
{
|
||||||
@@ -136,6 +137,7 @@ class che_선양 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
$destGeneral->applyDB($db);
|
$destGeneral->applyDB($db);
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_소집해제 extends Command\GeneralCommand{
|
class che_소집해제 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '소집해제';
|
static protected $actionName = '소집해제';
|
||||||
|
|
||||||
@@ -80,6 +82,7 @@ class che_소집해제 extends Command\GeneralCommand{
|
|||||||
$general->addDedication($ded);
|
$general->addDedication($ded);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_요양 extends Command\GeneralCommand{
|
class che_요양 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '요양';
|
static protected $actionName = '요양';
|
||||||
@@ -71,6 +71,7 @@ class che_요양 extends Command\GeneralCommand{
|
|||||||
$general->addDedication($ded);
|
$general->addDedication($ded);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\LastTurn;
|
|||||||
use \sammo\Command;
|
use \sammo\Command;
|
||||||
|
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -169,6 +170,8 @@ class che_이동 extends Command\GeneralCommand
|
|||||||
$general->increaseVar('leadership_exp', 1);
|
$general->increaseVar('leadership_exp', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use function \sammo\buildItemClass;
|
use function \sammo\buildItemClass;
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -88,7 +89,7 @@ class che_장비매매 extends Command\GeneralCommand{
|
|||||||
else if($itemCode == $general->getVar($itemType)){
|
else if($itemCode == $general->getVar($itemType)){
|
||||||
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.');
|
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.');
|
||||||
}
|
}
|
||||||
else if($itemType != 'item' && !buildItemClass($general->getVar($itemType))->isBuyable()){
|
else if(!buildItemClass($general->getVar($itemType))->isBuyable()){
|
||||||
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.');
|
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -176,6 +177,7 @@ class che_장비매매 extends Command\GeneralCommand{
|
|||||||
$general->addExperience($exp);
|
$general->addExperience($exp);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ use \sammo\Command;
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
class che_증여 extends Command\GeneralCommand
|
class che_증여 extends Command\GeneralCommand
|
||||||
{
|
{
|
||||||
@@ -168,6 +169,8 @@ class che_증여 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
$destGeneral->applyDB($db);
|
$destGeneral->applyDB($db);
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ use \sammo\Json;
|
|||||||
|
|
||||||
use function \sammo\searchDistance;
|
use function \sammo\searchDistance;
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -217,6 +218,7 @@ class che_첩보 extends Command\GeneralCommand
|
|||||||
$general->increaseVar('leadership_exp', 1);
|
$general->increaseVar('leadership_exp', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -31,10 +31,12 @@ class che_탈취 extends che_화계{
|
|||||||
$commandName = $this->getName();
|
$commandName = $this->getName();
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
// 탈취 최대 800 * 8 * sqrt(1 + (year - startyear) / 5) / 2
|
// 탈취 최대 800 * 8 * sqrt(1 + (year - startyear) / 4) / 2
|
||||||
$yearCoef = sqrt(1 + ($this->env['year'] - $this->env['startyear']) / 5) / 2;
|
$yearCoef = sqrt(1 + ($this->env['year'] - $this->env['startyear']) / 4) / 2;
|
||||||
$gold = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'] * $yearCoef;
|
$commRatio = $destCity['comm'] / $destCity['comm_max'];
|
||||||
$rice = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'] * $yearCoef;
|
$agriRatio = $destCity['agri'] / $destCity['agri_max'];
|
||||||
|
$gold = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'] * $yearCoef * (0.25 + $commRatio / 4);
|
||||||
|
$rice = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'] * $yearCoef * (0.25 + $agriRatio / 4);
|
||||||
|
|
||||||
if($destCity['supply']){
|
if($destCity['supply']){
|
||||||
[$destNationGold, $destNationRice] = $db->queryFirstList('SELECT gold,rice FROM nation WHERE nation=%i', $destNationID);
|
[$destNationGold, $destNationRice] = $db->queryFirstList('SELECT gold,rice FROM nation WHERE nation=%i', $destNationID);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use \sammo\Constraint\Constraint;
|
|||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_하야 extends Command\GeneralCommand{
|
class che_하야 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '하야';
|
static protected $actionName = '하야';
|
||||||
@@ -104,6 +104,7 @@ class che_하야 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ use \sammo\Constraint\ConstraintHelper;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use function sammo\refreshNationStaticInfo;
|
use function sammo\refreshNationStaticInfo;
|
||||||
use function sammo\deleteNation;
|
use function sammo\deleteNation;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
|
|
||||||
class che_해산 extends Command\GeneralCommand{
|
class che_해산 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '해산';
|
static protected $actionName = '해산';
|
||||||
@@ -96,7 +95,7 @@ class che_해산 extends Command\GeneralCommand{
|
|||||||
$oldGeneral->setVar('makelimit', 12);
|
$oldGeneral->setVar('makelimit', 12);
|
||||||
$oldGeneral->applyDB($db);
|
$oldGeneral->applyDB($db);
|
||||||
}
|
}
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ use \sammo\Command;
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryUniqueItemLottery;
|
||||||
|
|
||||||
class che_헌납 extends Command\GeneralCommand
|
class che_헌납 extends Command\GeneralCommand
|
||||||
{
|
{
|
||||||
@@ -144,6 +145,8 @@ class che_헌납 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
|
||||||
|
tryUniqueItemLottery($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ use \sammo\Command;
|
|||||||
|
|
||||||
use function \sammo\searchDistance;
|
use function \sammo\searchDistance;
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -294,6 +295,7 @@ class che_화계 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -327,6 +329,7 @@ class che_화계 extends Command\GeneralCommand
|
|||||||
$general->increaseRankVar('firenum', 1);
|
$general->increaseRankVar('firenum', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ use \sammo\JosaUtil;
|
|||||||
use \sammo\LastTurn;
|
use \sammo\LastTurn;
|
||||||
use \sammo\DB;
|
use \sammo\DB;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class 휴식 extends Command\GeneralCommand{
|
class 휴식 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '휴식';
|
static protected $actionName = '휴식';
|
||||||
|
|
||||||
@@ -39,7 +41,7 @@ class 휴식 extends Command\GeneralCommand{
|
|||||||
$logger->pushGeneralActionLog("아무것도 실행하지 않았습니다. <1>$date</>");
|
$logger->pushGeneralActionLog("아무것도 실행하지 않았습니다. <1>$date</>");
|
||||||
|
|
||||||
$this->setResultTurn(new LastTurn());
|
$this->setResultTurn(new LastTurn());
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB(DB::db());
|
$general->applyDB(DB::db());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ class che_물자원조 extends Command\NationCommand{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$josaRoSrc = JosaUtil::pick($nationName, '로');
|
$josaRoSrc = JosaUtil::pick($nationName, '로');
|
||||||
$destNationLogger = new ActionLogger(0, $destChiefID, $year, $month);
|
$destNationLogger = new ActionLogger(0, $destNationID, $year, $month);
|
||||||
$destNationLogger->pushNationalHistoryLog("<D><b>{$nationName}</b></>{$josaRoSrc}부터 금<C>{$goldAmountText}</> 쌀<C>{$riceAmountText}</>을 지원 받음");
|
$destNationLogger->pushNationalHistoryLog("<D><b>{$nationName}</b></>{$josaRoSrc}부터 금<C>{$goldAmountText}</> 쌀<C>{$riceAmountText}</>을 지원 받음");
|
||||||
|
|
||||||
$destNationStor = KVStorage::getStorage(DB::db(), $destNationID, 'nation_env');
|
$destNationStor = KVStorage::getStorage(DB::db(), $destNationID, 'nation_env');
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ class che_피장파장 extends Command\NationCommand{
|
|||||||
if(!key_exists('destNationID', $this->arg)){
|
if(!key_exists('destNationID', $this->arg)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if(!key_exists('commandType', $this->arg)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
$destNationID = $this->arg['destNationID'];
|
$destNationID = $this->arg['destNationID'];
|
||||||
$commandType = $this->arg['commandType'];
|
$commandType = $this->arg['commandType'];
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ trait DefaultAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
public function onCalcStrategic(string $turnType, string $varType, $value){
|
public function onCalcStrategic(string $turnType, string $varType, $value){
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,30 @@ class DummyGeneral extends General{
|
|||||||
return new WarUnitTriggerCaller();
|
return new WarUnitTriggerCaller();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getInheritancePoint(string $key, &$aux = null, bool $forceCalc = false){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setInheritancePoint(string $key, $value, $aux = null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function increaseInheritancePoint(string $key, $value, $aux = null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mergeTotalInheritancePoint(){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function applyDB($db):bool{
|
function applyDB($db):bool{
|
||||||
if($this->logger){
|
if($this->logger){
|
||||||
$this->initLogger(1, 1);
|
$this->initLogger(1, 1);
|
||||||
|
|||||||
@@ -9,9 +9,11 @@ use function sammo\pickGeneralFromPool;
|
|||||||
//기존 event_3.php
|
//기존 event_3.php
|
||||||
class CreateManyNPC extends \sammo\Event\Action{
|
class CreateManyNPC extends \sammo\Event\Action{
|
||||||
protected $npcCount;
|
protected $npcCount;
|
||||||
|
protected $fillCnt;
|
||||||
protected $avgGen;
|
protected $avgGen;
|
||||||
public function __construct($npcCount = 10){
|
public function __construct($npcCount = 10, $fillCnt = 0){
|
||||||
$this->npcCount = $npcCount;
|
$this->npcCount = $npcCount;
|
||||||
|
$this->fillCnt = $fillCnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function generateNPC($env, int $cnt){
|
protected function generateNPC($env, int $cnt){
|
||||||
@@ -44,10 +46,20 @@ class CreateManyNPC extends \sammo\Event\Action{
|
|||||||
|
|
||||||
|
|
||||||
public function run(array $env){
|
public function run(array $env){
|
||||||
if($this->npcCount <= 0){
|
if($this->npcCount <= 0 && $this->fillCnt <= 0){
|
||||||
return [__CLASS__, []];
|
return [__CLASS__, []];
|
||||||
}
|
}
|
||||||
$result = $this->generateNPC($env, $this->npcCount);
|
|
||||||
|
|
||||||
|
$moreGenCnt = 0;
|
||||||
|
if($this->fillCnt){
|
||||||
|
$db = DB::db();
|
||||||
|
$nations = $db->queryFirstColumn('SELECT nation FROM general WHERE npc < 2 AND officer_level = 12');
|
||||||
|
$regGens = $db->queryFirstField('SELECT count(*) FROM general WHERE nation IN %li AND npc < 4', $nations);
|
||||||
|
$moreGenCnt = count($nations) * $this->fillCnt - $regGens;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->generateNPC($env, $this->npcCount + $moreGenCnt);
|
||||||
|
|
||||||
$logger = new \sammo\ActionLogger(0, 0, $env['year'], $env['month']);
|
$logger = new \sammo\ActionLogger(0, 0, $env['year'], $env['month']);
|
||||||
$genCnt = count($result);
|
$genCnt = count($result);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
class GameConstBase
|
class GameConstBase
|
||||||
@@ -143,6 +144,11 @@ class GameConstBase
|
|||||||
/** @var int 거병,임관 제한 기간 */
|
/** @var int 거병,임관 제한 기간 */
|
||||||
public static $joinActionLimit = 12;
|
public static $joinActionLimit = 12;
|
||||||
|
|
||||||
|
/** @var int 장수 생성시 능력치 최소 보너스 */
|
||||||
|
public static $bornMinStatBonus = 3;
|
||||||
|
/** @var int 장수 생성시 능력치 최대 보너스 */
|
||||||
|
public static $bornMaxStatBonus = 5;
|
||||||
|
|
||||||
/** @var array 선택 가능한 국가 성향 */
|
/** @var array 선택 가능한 국가 성향 */
|
||||||
public static $availableNationType = [
|
public static $availableNationType = [
|
||||||
'che_도적', 'che_명가', 'che_음양가', 'che_종횡가', 'che_불가', 'che_오두미도', 'che_태평도', 'che_도가',
|
'che_도적', 'che_명가', 'che_음양가', 'che_종횡가', 'che_불가', 'che_오두미도', 'che_태평도', 'che_도가',
|
||||||
@@ -189,6 +195,16 @@ class GameConstBase
|
|||||||
'che_은둔', 'None'
|
'che_은둔', 'None'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static $inheritBornSpecialPoint = 12000;
|
||||||
|
public static $inheritBornTurntimePoint = 3000;
|
||||||
|
public static $inheritBornCityPoint = 1000;
|
||||||
|
public static $inheritBornStatPoint = 1000;
|
||||||
|
public static $inheritItemUniqueMinPoint = 5000;
|
||||||
|
public static $inheritItemRandomPoint = 3000;
|
||||||
|
public static $inheritBuffPoints = [0, 250, 750, 1500, 2500, 3750];
|
||||||
|
public static $inheritSpecificSpecialPoint = 5000;
|
||||||
|
public static $inheritResetAttrPointBase = [1000, 1000, 2000, 3000];//필요하면 늘려서 쓰기
|
||||||
|
|
||||||
public static $allItems = [
|
public static $allItems = [
|
||||||
'horse' => [
|
'horse' => [
|
||||||
'che_명마_01_노기' => 0, 'che_명마_02_조랑' => 0, 'che_명마_03_노새' => 0,
|
'che_명마_01_노기' => 0, 'che_명마_02_조랑' => 0, 'che_명마_03_노새' => 0,
|
||||||
|
|||||||
+245
-99
@@ -5,7 +5,8 @@ namespace sammo;
|
|||||||
use sammo\Command\GeneralCommand;
|
use sammo\Command\GeneralCommand;
|
||||||
use sammo\WarUnitTrigger as WarUnitTrigger;
|
use sammo\WarUnitTrigger as WarUnitTrigger;
|
||||||
|
|
||||||
class General implements iAction{
|
class General implements iAction
|
||||||
|
{
|
||||||
use LazyVarUpdater;
|
use LazyVarUpdater;
|
||||||
|
|
||||||
protected $raw = [];
|
protected $raw = [];
|
||||||
@@ -35,6 +36,8 @@ class General implements iAction{
|
|||||||
protected $personalityObj = null;
|
protected $personalityObj = null;
|
||||||
/** @var iAction[] */
|
/** @var iAction[] */
|
||||||
protected $itemObjs = [];
|
protected $itemObjs = [];
|
||||||
|
/** @var iAction */
|
||||||
|
protected $inheritBuffObj = null;
|
||||||
|
|
||||||
protected $lastTurn = null;
|
protected $lastTurn = null;
|
||||||
protected $resultTurn = null;
|
protected $resultTurn = null;
|
||||||
@@ -96,7 +99,8 @@ class General implements iAction{
|
|||||||
* @param int|null $month 게임 월
|
* @param int|null $month 게임 월
|
||||||
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능
|
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능
|
||||||
*/
|
*/
|
||||||
public function __construct(array $raw, ?array $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct=true){
|
public function __construct(array $raw, ?array $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true)
|
||||||
|
{
|
||||||
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
|
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
|
||||||
|
|
||||||
if ($nation === null) {
|
if ($nation === null) {
|
||||||
@@ -136,9 +140,17 @@ class General implements iAction{
|
|||||||
$this->itemObjs['weapon'] = buildItemClass($raw['weapon']);
|
$this->itemObjs['weapon'] = buildItemClass($raw['weapon']);
|
||||||
$this->itemObjs['book'] = buildItemClass($raw['book']);
|
$this->itemObjs['book'] = buildItemClass($raw['book']);
|
||||||
$this->itemObjs['item'] = buildItemClass($raw['item']);
|
$this->itemObjs['item'] = buildItemClass($raw['item']);
|
||||||
|
|
||||||
|
if (key_exists('aux', $this->raw)) {
|
||||||
|
$rawInheritBuff = $this->getAuxVar('inheritBuff');
|
||||||
|
if ($rawInheritBuff !== null) {
|
||||||
|
$this->inheritBuffObj = new TriggerInheritBuff($rawInheritBuff);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initLogger(int $year, int $month){
|
function initLogger(int $year, int $month)
|
||||||
|
{
|
||||||
$this->logger = new ActionLogger(
|
$this->logger = new ActionLogger(
|
||||||
$this->getVar('no'),
|
$this->getVar('no'),
|
||||||
$this->getVar('nation'),
|
$this->getVar('nation'),
|
||||||
@@ -148,16 +160,26 @@ class General implements iAction{
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTurnTime(int $short=self::TURNTIME_FULL_MS){
|
function getTurnTime(int $short = self::TURNTIME_FULL_MS)
|
||||||
|
{
|
||||||
return [
|
return [
|
||||||
self::TURNTIME_FULL_MS=>function($turntime){return $turntime;},
|
self::TURNTIME_FULL_MS => function ($turntime) {
|
||||||
self::TURNTIME_FULL=>function($turntime){return substr($turntime, 0, 19);},
|
return $turntime;
|
||||||
self::TURNTIME_HMS=>function($turntime){return substr($turntime, 11, 8);},
|
},
|
||||||
self::TURNTIME_HM=>function($turntime){return substr($turntime, 11, 5);},
|
self::TURNTIME_FULL => function ($turntime) {
|
||||||
|
return substr($turntime, 0, 19);
|
||||||
|
},
|
||||||
|
self::TURNTIME_HMS => function ($turntime) {
|
||||||
|
return substr($turntime, 11, 8);
|
||||||
|
},
|
||||||
|
self::TURNTIME_HM => function ($turntime) {
|
||||||
|
return substr($turntime, 11, 5);
|
||||||
|
},
|
||||||
][$short]($this->getVar('turntime'));
|
][$short]($this->getVar('turntime'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function setItem(string $itemKey='item', ?string $itemCode){
|
function setItem(string $itemKey = 'item', ?string $itemCode)
|
||||||
|
{
|
||||||
if ($itemCode === null) {
|
if ($itemCode === null) {
|
||||||
$this->deleteItem($itemKey);
|
$this->deleteItem($itemKey);
|
||||||
}
|
}
|
||||||
@@ -166,49 +188,60 @@ class General implements iAction{
|
|||||||
$this->itemObjs[$itemKey] = buildItemClass($itemCode);
|
$this->itemObjs[$itemKey] = buildItemClass($itemCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteItem(string $itemKey='item'){
|
function deleteItem(string $itemKey = 'item')
|
||||||
|
{
|
||||||
$this->setVar($itemKey, 'None');
|
$this->setVar($itemKey, 'None');
|
||||||
$this->itemObjs[$itemKey] = new ActionItem\None();
|
$this->itemObjs[$itemKey] = new ActionItem\None();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getItem(string $itemKey='item'):BaseItem{
|
function getItem(string $itemKey = 'item'): BaseItem
|
||||||
|
{
|
||||||
return $this->itemObjs[$itemKey];
|
return $this->itemObjs[$itemKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNPCType():int{
|
function getNPCType(): int
|
||||||
|
{
|
||||||
return $this->raw['npc'];
|
return $this->raw['npc'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return BaseItem[] */
|
/** @return BaseItem[] */
|
||||||
function getItems():array{
|
function getItems(): array
|
||||||
|
{
|
||||||
return $this->itemObjs;
|
return $this->itemObjs;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPersonality():iAction{
|
function getPersonality(): iAction
|
||||||
|
{
|
||||||
return $this->personalityObj;
|
return $this->personalityObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSpecialDomestic():iAction{
|
function getSpecialDomestic(): iAction
|
||||||
|
{
|
||||||
return $this->specialDomesticObj;
|
return $this->specialDomesticObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSpecialWar():iAction{
|
function getSpecialWar(): iAction
|
||||||
|
{
|
||||||
return $this->specialWarObj;
|
return $this->specialWarObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLastTurn():LastTurn{
|
function getLastTurn(): LastTurn
|
||||||
|
{
|
||||||
return $this->lastTurn;
|
return $this->lastTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _setResultTurn(LastTurn $resultTurn){
|
function _setResultTurn(LastTurn $resultTurn)
|
||||||
|
{
|
||||||
$this->resultTurn = $resultTurn;
|
$this->resultTurn = $resultTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getResultTurn():LastTurn{
|
function getResultTurn(): LastTurn
|
||||||
|
{
|
||||||
return $this->resultTurn;
|
return $this->resultTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearActivatedSkill(){
|
function clearActivatedSkill()
|
||||||
|
{
|
||||||
foreach ($this->activatedSkill as $skillName => $state) {
|
foreach ($this->activatedSkill as $skillName => $state) {
|
||||||
if (!$state) {
|
if (!$state) {
|
||||||
continue;
|
continue;
|
||||||
@@ -223,72 +256,88 @@ class General implements iAction{
|
|||||||
$this->activatedSkill = [];
|
$this->activatedSkill = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getActivatedSkillLog():array{
|
function getActivatedSkillLog(): array
|
||||||
|
{
|
||||||
return $this->logActivatedSkill;
|
return $this->logActivatedSkill;
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasActivatedSkill(string $skillName):bool{
|
function hasActivatedSkill(string $skillName): bool
|
||||||
|
{
|
||||||
return $this->activatedSkill[$skillName] ?? false;
|
return $this->activatedSkill[$skillName] ?? false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function activateSkill(... $skillNames){
|
function activateSkill(...$skillNames)
|
||||||
|
{
|
||||||
foreach ($skillNames as $skillName) {
|
foreach ($skillNames as $skillName) {
|
||||||
$this->activatedSkill[$skillName] = true;
|
$this->activatedSkill[$skillName] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function deactivateSkill(... $skillNames){
|
function deactivateSkill(...$skillNames)
|
||||||
|
{
|
||||||
foreach ($skillNames as $skillName) {
|
foreach ($skillNames as $skillName) {
|
||||||
$this->activatedSkill[$skillName] = false;
|
$this->activatedSkill[$skillName] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getName():string{
|
function getName(): string
|
||||||
|
{
|
||||||
return $this->raw['name'];
|
return $this->raw['name'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getInfo():string{
|
function getInfo(): string
|
||||||
|
{
|
||||||
//iAction용 info로는 적절하지 않음
|
//iAction용 info로는 적절하지 않음
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
function getID():int{
|
function getID(): int
|
||||||
|
{
|
||||||
return $this->raw['no'];
|
return $this->raw['no'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRawCity():?array{
|
function getRawCity(): ?array
|
||||||
|
{
|
||||||
return $this->rawCity;
|
return $this->rawCity;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRawCity(?array $city){
|
function setRawCity(?array $city)
|
||||||
|
{
|
||||||
$this->rawCity = $city;
|
$this->rawCity = $city;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCityID():int{
|
function getCityID(): int
|
||||||
|
{
|
||||||
return $this->raw['city'];
|
return $this->raw['city'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNationID():int{
|
function getNationID(): int
|
||||||
|
{
|
||||||
return $this->raw['nation'];
|
return $this->raw['nation'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStaticNation():array{
|
function getStaticNation(): array
|
||||||
|
{
|
||||||
return getNationStaticInfo($this->raw['nation']);
|
return getNationStaticInfo($this->raw['nation']);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLogger():?ActionLogger{
|
function getLogger(): ?ActionLogger
|
||||||
|
{
|
||||||
return $this->logger;
|
return $this->logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNationTypeObj():iAction{
|
public function getNationTypeObj(): iAction
|
||||||
|
{
|
||||||
return $this->nationType;
|
return $this->nationType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOfficerLevelObj():iAction{
|
public function getOfficerLevelObj(): iAction
|
||||||
|
{
|
||||||
return $this->officerLevelObj;
|
return $this->officerLevelObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCrewTypeObj():GameUnitDetail{
|
function getCrewTypeObj(): GameUnitDetail
|
||||||
|
{
|
||||||
$crewType = GameUnitConst::byID($this->getVar('crewtype'));
|
$crewType = GameUnitConst::byID($this->getVar('crewtype'));
|
||||||
if ($crewType === null) {
|
if ($crewType === null) {
|
||||||
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
|
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
|
||||||
@@ -296,7 +345,8 @@ class General implements iAction{
|
|||||||
return $crewType;
|
return $crewType;
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcRecentWarTurn(int $turnTerm):int{
|
function calcRecentWarTurn(int $turnTerm): int
|
||||||
|
{
|
||||||
$cacheKey = "recent_war_turn_{$turnTerm}";
|
$cacheKey = "recent_war_turn_{$turnTerm}";
|
||||||
if (key_exists($cacheKey, $this->calcCache)) {
|
if (key_exists($cacheKey, $this->calcCache)) {
|
||||||
return $this->calcCache[$cacheKey];
|
return $this->calcCache[$cacheKey];
|
||||||
@@ -320,7 +370,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getReservedTurn(int $turnIdx, array $env):GeneralCommand{
|
function getReservedTurn(int $turnIdx, array $env): GeneralCommand
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$rawCmd = $db->queryFirstRow('SELECT * FROM general_turn WHERE general_id = %i AND turn_idx = %i', $this->getID(), $turnIdx);
|
$rawCmd = $db->queryFirstRow('SELECT * FROM general_turn WHERE general_id = %i AND turn_idx = %i', $this->getID(), $turnIdx);
|
||||||
if (!$rawCmd) {
|
if (!$rawCmd) {
|
||||||
@@ -336,7 +387,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[]
|
* @return GeneralCommand[]
|
||||||
*/
|
*/
|
||||||
public function getReservedTurnList(int $turnIdxFrom, int $turnIdxTo, array $env){
|
public function getReservedTurnList(int $turnIdxFrom, int $turnIdxTo, array $env)
|
||||||
|
{
|
||||||
if ($turnIdxFrom < 0 || $turnIdxFrom >= GameConst::$maxTurn) {
|
if ($turnIdxFrom < 0 || $turnIdxFrom >= GameConst::$maxTurn) {
|
||||||
throw new \OutOfRangeException('$turnIdxFrom 범위 초과' . $turnIdxFrom);
|
throw new \OutOfRangeException('$turnIdxFrom 범위 초과' . $turnIdxFrom);
|
||||||
}
|
}
|
||||||
@@ -379,7 +431,8 @@ class General implements iAction{
|
|||||||
* @return int|float 계산된 능력치
|
* @return int|float 계산된 능력치
|
||||||
*/
|
*/
|
||||||
|
|
||||||
protected function getStatValue(string $statName, $withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
protected function getStatValue(string $statName, $withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
$cKey = "{$statName}_{$withInjury}_{$withIActionObj}_{$withStatAdjust}";
|
$cKey = "{$statName}_{$withInjury}_{$withIActionObj}_{$withStatAdjust}";
|
||||||
if (key_exists($cKey, $this->calcCache)) {
|
if (key_exists($cKey, $this->calcCache)) {
|
||||||
$statValue = $this->calcCache[$cKey];
|
$statValue = $this->calcCache[$cKey];
|
||||||
@@ -398,8 +451,7 @@ class General implements iAction{
|
|||||||
if ($withStatAdjust) {
|
if ($withStatAdjust) {
|
||||||
if ($statName === 'strength') {
|
if ($statName === 'strength') {
|
||||||
$statValue += Util::round($this->getStatValue('intel', $withInjury, $withIActionObj, false, false) / 4);
|
$statValue += Util::round($this->getStatValue('intel', $withInjury, $withIActionObj, false, false) / 4);
|
||||||
}
|
} else if ($statName === 'intel') {
|
||||||
else if($statName === 'intel'){
|
|
||||||
$statValue += Util::round($this->getStatValue('strength', $withInjury, $withIActionObj, false, false) / 4);
|
$statValue += Util::round($this->getStatValue('strength', $withInjury, $withIActionObj, false, false) / 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -410,7 +462,8 @@ class General implements iAction{
|
|||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
$this->specialDomesticObj,
|
$this->specialDomesticObj,
|
||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj
|
$this->personalityObj,
|
||||||
|
$this->inheritBuffObj,
|
||||||
] as $actionObj) {
|
] as $actionObj) {
|
||||||
if ($actionObj !== null) {
|
if ($actionObj !== null) {
|
||||||
$statValue = $actionObj->onCalcStat($this, $statName, $statValue);
|
$statValue = $actionObj->onCalcStat($this, $statName, $statValue);
|
||||||
@@ -433,19 +486,23 @@ class General implements iAction{
|
|||||||
return $statValue;
|
return $statValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLeadership($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getLeadership($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('leadership', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('leadership', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStrength($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getStrength($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('strength', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('strength', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIntel($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getIntel($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('intel', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('intel', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDex(GameUnitDetail $crewType){
|
function getDex(GameUnitDetail $crewType)
|
||||||
|
{
|
||||||
$armType = $crewType->armType;
|
$armType = $crewType->armType;
|
||||||
|
|
||||||
if ($armType == GameUnitConst::T_CASTLE) {
|
if ($armType == GameUnitConst::T_CASTLE) {
|
||||||
@@ -455,7 +512,8 @@ class General implements iAction{
|
|||||||
return $this->getVar("dex{$armType}");
|
return $this->getVar("dex{$armType}");
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDex(GameUnitDetail $crewType, float $exp, bool $affectTrainAtmos=false){
|
function addDex(GameUnitDetail $crewType, float $exp, bool $affectTrainAtmos = false)
|
||||||
|
{
|
||||||
$armType = $crewType->armType;
|
$armType = $crewType->armType;
|
||||||
|
|
||||||
if ($armType == GameUnitConst::T_CASTLE) {
|
if ($armType == GameUnitConst::T_CASTLE) {
|
||||||
@@ -468,8 +526,7 @@ class General implements iAction{
|
|||||||
|
|
||||||
if ($armType == GameUnitConst::T_WIZARD) {
|
if ($armType == GameUnitConst::T_WIZARD) {
|
||||||
$exp *= 0.9;
|
$exp *= 0.9;
|
||||||
}
|
} else if ($armType == GameUnitConst::T_SIEGE) {
|
||||||
else if($armType == GameUnitConst::T_SIEGE) {
|
|
||||||
$exp *= 0.9;
|
$exp *= 0.9;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,7 +539,8 @@ class General implements iAction{
|
|||||||
$this->increaseVar($dexType, $exp);
|
$this->increaseVar($dexType, $exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addExperience(float $experience, bool $affectTrigger=true){
|
function addExperience(float $experience, bool $affectTrigger = true)
|
||||||
|
{
|
||||||
if ($affectTrigger) {
|
if ($affectTrigger) {
|
||||||
$experience = $this->onCalcStat($this, 'experience', $experience);
|
$experience = $this->onCalcStat($this, 'experience', $experience);
|
||||||
}
|
}
|
||||||
@@ -499,14 +557,13 @@ class General implements iAction{
|
|||||||
$josaRo = JosaUtil::pick($nextExpLevel, '로');
|
$josaRo = JosaUtil::pick($nextExpLevel, '로');
|
||||||
if ($comp > 0) {
|
if ($comp > 0) {
|
||||||
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <C>레벨업</>!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <C>레벨업</>!", ActionLogger::PLAIN);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <R>레벨다운</>!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <R>레벨다운</>!", ActionLogger::PLAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDedication(float $dedication, bool $affectTrigger=true){
|
function addDedication(float $dedication, bool $affectTrigger = true)
|
||||||
|
{
|
||||||
if ($affectTrigger) {
|
if ($affectTrigger) {
|
||||||
$dedication = $this->onCalcStat($this, 'dedication', $dedication);
|
$dedication = $this->onCalcStat($this, 'dedication', $dedication);
|
||||||
}
|
}
|
||||||
@@ -526,14 +583,13 @@ class General implements iAction{
|
|||||||
$josaRoBill = JosaUtil::pick($billText, '로');
|
$josaRoBill = JosaUtil::pick($billText, '로');
|
||||||
if ($comp > 0) {
|
if ($comp > 0) {
|
||||||
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <C>승급</>하여 봉록이 <C>{$billText}</>{$josaRoBill} <C>상승</>했습니다!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <C>승급</>하여 봉록이 <C>{$billText}</>{$josaRoBill} <C>상승</>했습니다!", ActionLogger::PLAIN);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <R>강등</>되어 봉록이 <C>{$billText}</>{$josaRoBill} <R>하락</>했습니다!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <R>강등</>되어 봉록이 <C>{$billText}</>{$josaRoBill} <R>하락</>했습니다!", ActionLogger::PLAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateVar(string $key, $value){
|
function updateVar(string $key, $value)
|
||||||
|
{
|
||||||
if (($this->raw[$key] ?? null) === $value) {
|
if (($this->raw[$key] ?? null) === $value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -547,13 +603,56 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @param \MeekroDB $db
|
* @param \MeekroDB $db
|
||||||
*/
|
*/
|
||||||
function kill($db, bool $sendDyingMessage=true, ?string $dyingMessage=null){
|
function kill($db, bool $sendDyingMessage = true, ?string $dyingMessage = null)
|
||||||
|
{
|
||||||
$generalID = $this->getID();
|
$generalID = $this->getID();
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
|
|
||||||
$generalName = $this->getName();
|
$generalName = $this->getName();
|
||||||
|
|
||||||
|
//유산포인트 관련 항목 환불
|
||||||
|
if ($this->getNPCType() < 2) {
|
||||||
|
|
||||||
|
$refundPoint = 0;
|
||||||
|
$userID = $this->getVar('owner');
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
if ($this->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$this->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$userLogger->push(sprintf("사망으로 랜덤 유니크 구입 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
$refundPoint += GameConst::$inheritItemRandomPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
$itemTrials = $this->getAuxVar('inheritUniqueTrial') ?? [];
|
||||||
|
foreach (array_keys($itemTrials) as $itemKey) {
|
||||||
|
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||||
|
$ownTrial = $trialStor->getValue("u{$userID}");
|
||||||
|
|
||||||
|
$itemObj = buildItemClass($itemKey);
|
||||||
|
$itemName = $itemObj->getName();
|
||||||
|
|
||||||
|
if (!$ownTrial) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
[,, $amount] = $ownTrial;
|
||||||
|
$trialStor->deleteValue("u{$userID}");
|
||||||
|
$userLogger->push("사망으로 {$itemName} 입찰에 사용한 {$amount} 포인트 반환", "inheritPoint");
|
||||||
|
$refundPoint += $amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->getAuxVar('inheritSpecificSpecialWar')){
|
||||||
|
$this->setAuxVar('inheritSpecificSpecialWar', null);
|
||||||
|
$userLogger->push(sprintf("사망으로 전투 특기 지정 %d 포인트 반환", GameConst::$inheritSpecificSpecialPoint), "inheritPoint");
|
||||||
|
$refundPoint += GameConst::$inheritSpecificSpecialPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($refundPoint > 0) {
|
||||||
|
$this->increaseInheritancePoint('previous', $refundPoint);
|
||||||
|
}
|
||||||
|
|
||||||
$this->mergeTotalInheritancePoint();
|
$this->mergeTotalInheritancePoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 군주였으면 유지 이음
|
// 군주였으면 유지 이음
|
||||||
$officerLevel = $this->getVar('officer_level');
|
$officerLevel = $this->getVar('officer_level');
|
||||||
@@ -578,8 +677,7 @@ class General implements iAction{
|
|||||||
if ($sendDyingMessage) {
|
if ($sendDyingMessage) {
|
||||||
if ($dyingMessage) {
|
if ($dyingMessage) {
|
||||||
$logger->pushGlobalActionLog($dyingMessage);
|
$logger->pushGlobalActionLog($dyingMessage);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$dyingMessageObj = new TextDecoration\DyingMessage($this);
|
$dyingMessageObj = new TextDecoration\DyingMessage($this);
|
||||||
$logger->pushGlobalActionLog($dyingMessageObj->getText());
|
$logger->pushGlobalActionLog($dyingMessageObj->getText());
|
||||||
}
|
}
|
||||||
@@ -603,7 +701,8 @@ class General implements iAction{
|
|||||||
], 'nation=%i', $this->getVar('nation'));
|
], 'nation=%i', $this->getVar('nation'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function rebirth(){
|
function rebirth()
|
||||||
|
{
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
|
|
||||||
$generalName = $this->getName();
|
$generalName = $this->getName();
|
||||||
@@ -639,7 +738,8 @@ class General implements iAction{
|
|||||||
$logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌');
|
$logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌');
|
||||||
}
|
}
|
||||||
|
|
||||||
function increaseRankVar(string $key, int $value){
|
function increaseRankVar(string $key, int $value)
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
@@ -663,21 +763,22 @@ class General implements iAction{
|
|||||||
$this->rankVarIncrease[$key] = $value;
|
$this->rankVarIncrease[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRankVar(string $key, int $value){
|
function setRankVar(string $key, int $value)
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_exists($key, $this->rankVarRead)) {
|
if (key_exists($key, $this->rankVarRead)) {
|
||||||
unset($this->rankVarRead[$key]);
|
unset($this->rankVarRead[$key]);
|
||||||
}
|
} else if (key_exists($key, $this->rankVarIncrease)) {
|
||||||
else if(key_exists($key, $this->rankVarIncrease)){
|
|
||||||
unset($this->rankVarIncrease[$key]);
|
unset($this->rankVarIncrease[$key]);
|
||||||
}
|
}
|
||||||
$this->rankVarSet[$key] = $value;
|
$this->rankVarSet[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRankVar(string $key):int{
|
function getRankVar(string $key): int
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
@@ -696,7 +797,8 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @param \MeekroDB $db
|
* @param \MeekroDB $db
|
||||||
*/
|
*/
|
||||||
function applyDB($db):bool{
|
function applyDB($db): bool
|
||||||
|
{
|
||||||
if ($this->lastTurn && $this->getLastTurn() != $this->getResultTurn()) {
|
if ($this->lastTurn && $this->getLastTurn() != $this->getResultTurn()) {
|
||||||
$this->setVar('last_turn', $this->getResultTurn()->toJson());
|
$this->setVar('last_turn', $this->getResultTurn()->toJson());
|
||||||
}
|
}
|
||||||
@@ -744,7 +846,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStatChange():bool{
|
function checkStatChange(): bool
|
||||||
|
{
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
$limit = GameConst::$upgradeLimit;
|
$limit = GameConst::$upgradeLimit;
|
||||||
|
|
||||||
@@ -764,8 +867,7 @@ class General implements iAction{
|
|||||||
$this->increaseVar($statExpName, $limit);
|
$this->increaseVar($statExpName, $limit);
|
||||||
$this->increaseVar($statName, -1);
|
$this->increaseVar($statName, -1);
|
||||||
$result = true;
|
$result = true;
|
||||||
}
|
} else if ($this->getVar($statExpName) >= $limit) {
|
||||||
else if($this->getVar($statExpName) >= $limit){
|
|
||||||
$logger->pushGeneralActionLog("<S>{$statNickName}</>이 <C>1</> 올랐습니다!", ActionLogger::PLAIN);
|
$logger->pushGeneralActionLog("<S>{$statNickName}</>이 <C>1</> 올랐습니다!", ActionLogger::PLAIN);
|
||||||
$this->increaseVar($statExpName, -$limit);
|
$this->increaseVar($statExpName, -$limit);
|
||||||
$this->increaseVar($statName, 1);
|
$this->increaseVar($statName, 1);
|
||||||
@@ -776,7 +878,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
public function getPreTurnExecuteTriggerList(General $general): ?GeneralTriggerCaller
|
||||||
|
{
|
||||||
$caller = new GeneralTriggerCaller();
|
$caller = new GeneralTriggerCaller();
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -785,6 +888,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
|
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
@@ -796,7 +900,8 @@ class General implements iAction{
|
|||||||
|
|
||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
||||||
|
{
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -804,6 +909,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -814,7 +920,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
//xxx: $general?
|
//xxx: $general?
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -823,6 +930,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -833,7 +941,9 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcStrategic(string $turnType, string $varType, $value){
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
//xxx: $general?
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -841,6 +951,27 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
|
], $this->itemObjs) as $iObj) {
|
||||||
|
if (!$iObj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/** @var iAction $iObj */
|
||||||
|
$value = $iObj->onCalcOpposeStat($this, $statName, $value, $aux);
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStrategic(string $turnType, string $varType, $value)
|
||||||
|
{
|
||||||
|
foreach (array_merge([
|
||||||
|
$this->nationType,
|
||||||
|
$this->officerLevelObj,
|
||||||
|
$this->specialDomesticObj,
|
||||||
|
$this->specialWarObj,
|
||||||
|
$this->personalityObj,
|
||||||
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -851,7 +982,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcNationalIncome(string $type, $amount){
|
public function onCalcNationalIncome(string $type, $amount)
|
||||||
|
{
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -859,6 +991,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -869,7 +1002,8 @@ class General implements iAction{
|
|||||||
return $amount;
|
return $amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit): array
|
||||||
|
{
|
||||||
//xxx:$unit
|
//xxx:$unit
|
||||||
$att = 1;
|
$att = 1;
|
||||||
$def = 1;
|
$def = 1;
|
||||||
@@ -880,6 +1014,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -891,7 +1026,8 @@ class General implements iAction{
|
|||||||
}
|
}
|
||||||
return [$att, $def];
|
return [$att, $def];
|
||||||
}
|
}
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
$caller = new WarUnitTriggerCaller();
|
$caller = new WarUnitTriggerCaller();
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -900,6 +1036,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -910,7 +1047,8 @@ class General implements iAction{
|
|||||||
|
|
||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
$caller = new WarUnitTriggerCaller(
|
$caller = new WarUnitTriggerCaller(
|
||||||
new WarUnitTrigger\che_필살시도($unit),
|
new WarUnitTrigger\che_필살시도($unit),
|
||||||
new WarUnitTrigger\che_필살발동($unit),
|
new WarUnitTrigger\che_필살발동($unit),
|
||||||
@@ -927,6 +1065,7 @@ class General implements iAction{
|
|||||||
$this->specialWarObj,
|
$this->specialWarObj,
|
||||||
$this->personalityObj,
|
$this->personalityObj,
|
||||||
$this->getCrewTypeObj(),
|
$this->getCrewTypeObj(),
|
||||||
|
$this->inheritBuffObj,
|
||||||
], $this->itemObjs) as $iObj) {
|
], $this->itemObjs) as $iObj) {
|
||||||
if (!$iObj) {
|
if (!$iObj) {
|
||||||
continue;
|
continue;
|
||||||
@@ -938,12 +1077,13 @@ class General implements iAction{
|
|||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function mergeQueryColumn(?array $reqColumns=null, int $constructMode=2):array{
|
static public function mergeQueryColumn(?array $reqColumns = null, int $constructMode = 2): array
|
||||||
|
{
|
||||||
$minimumColumn = ['no', 'name', 'city', 'nation', 'officer_level', 'officer_city'];
|
$minimumColumn = ['no', 'name', 'city', 'nation', 'officer_level', 'officer_city'];
|
||||||
$defaultEventColumn = [
|
$defaultEventColumn = [
|
||||||
'no', 'name', 'owner', 'city', 'nation', 'officer_level', 'officer_city',
|
'no', 'name', 'owner', 'city', 'nation', 'officer_level', 'officer_city',
|
||||||
'special', 'special2', 'personal',
|
'special', 'special2', 'personal',
|
||||||
'horse', 'weapon', 'book', 'item', 'last_turn'
|
'horse', 'weapon', 'book', 'item', 'last_turn', 'aux',
|
||||||
];
|
];
|
||||||
$fullColumn = [
|
$fullColumn = [
|
||||||
'no', 'name', 'owner', 'owner_name', 'picture', 'imgsvr', 'nation', 'city', 'troop', 'injury', 'affinity',
|
'no', 'name', 'owner', 'owner_name', 'picture', 'imgsvr', 'nation', 'city', 'troop', 'injury', 'affinity',
|
||||||
@@ -965,8 +1105,7 @@ class General implements iAction{
|
|||||||
foreach ($reqColumns as $column) {
|
foreach ($reqColumns as $column) {
|
||||||
if (key_exists($column, static::RANK_COLUMN)) {
|
if (key_exists($column, static::RANK_COLUMN)) {
|
||||||
$rankColumn[] = $column;
|
$rankColumn[] = $column;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$subColumn[] = $column;
|
$subColumn[] = $column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -985,7 +1124,8 @@ class General implements iAction{
|
|||||||
* @return \sammo\General[]
|
* @return \sammo\General[]
|
||||||
* @throws MustNotBeReachedException
|
* @throws MustNotBeReachedException
|
||||||
*/
|
*/
|
||||||
static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column=null, int $constructMode=2):array{
|
static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column = null, int $constructMode = 2): array
|
||||||
|
{
|
||||||
if ($generalIDList === []) {
|
if ($generalIDList === []) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -994,8 +1134,7 @@ class General implements iAction{
|
|||||||
if ($constructMode > 0) {
|
if ($constructMode > 0) {
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$year = null;
|
$year = null;
|
||||||
$month = null;
|
$month = null;
|
||||||
}
|
}
|
||||||
@@ -1008,8 +1147,7 @@ class General implements iAction{
|
|||||||
'no'
|
'no'
|
||||||
);
|
);
|
||||||
$generalIDList = array_keys($rawGenerals);
|
$generalIDList = array_keys($rawGenerals);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$rawGenerals = Util::convertArrayToDict(
|
$rawGenerals = Util::convertArrayToDict(
|
||||||
$db->query('SELECT %l FROM general WHERE no IN %li', Util::formatListOfBackticks($column), $generalIDList),
|
$db->query('SELECT %l FROM general WHERE no IN %li', Util::formatListOfBackticks($column), $generalIDList),
|
||||||
'no'
|
'no'
|
||||||
@@ -1047,13 +1185,13 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function createGeneralObjFromDB(int $generalID, ?array $column=null, int $constructMode=2):self{
|
static public function createGeneralObjFromDB(int $generalID, ?array $column = null, int $constructMode = 2): self
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
if ($constructMode > 0) {
|
if ($constructMode > 0) {
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$year = null;
|
$year = null;
|
||||||
$month = null;
|
$month = null;
|
||||||
}
|
}
|
||||||
@@ -1085,7 +1223,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[]
|
* @return GeneralCommand[]
|
||||||
*/
|
*/
|
||||||
static public function getReservedTurnByGeneralList(array $generalList, int $turnIdx, array $env){
|
static public function getReservedTurnByGeneralList(array $generalList, int $turnIdx, array $env)
|
||||||
|
{
|
||||||
if (!$generalList) {
|
if (!$generalList) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -1116,7 +1255,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[][]
|
* @return GeneralCommand[][]
|
||||||
*/
|
*/
|
||||||
static public function getReservedTurnListByGeneralList(array $generalList, int $turnIdxFrom, int $turnIdxTo, array $env){
|
static public function getReservedTurnListByGeneralList(array $generalList, int $turnIdxFrom, int $turnIdxTo, array $env)
|
||||||
|
{
|
||||||
//XXX: static인데 return값이 General이 아니라고?? GeneralCommandHelper같은게 있어야하지 않을까?
|
//XXX: static인데 return값이 General이 아니라고?? GeneralCommandHelper같은게 있어야하지 않을까?
|
||||||
if (!$generalList) {
|
if (!$generalList) {
|
||||||
return [];
|
return [];
|
||||||
@@ -1167,7 +1307,8 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @return int|float
|
* @return int|float
|
||||||
*/
|
*/
|
||||||
public function getInheritancePoint(string $key, &$aux=null, bool $forceCalc=false){
|
public function getInheritancePoint(string $key, &$aux = null, bool $forceCalc = false)
|
||||||
|
{
|
||||||
$inheritType = static::INHERITANCE_KEY[$key] ?? null;
|
$inheritType = static::INHERITANCE_KEY[$key] ?? null;
|
||||||
if ($inheritType === null) {
|
if ($inheritType === null) {
|
||||||
throw new \OutOfRangeException("{$key}는 유산 타입이 아님");
|
throw new \OutOfRangeException("{$key}는 유산 타입이 아님");
|
||||||
@@ -1209,7 +1350,9 @@ class General implements iAction{
|
|||||||
throw new \InvalidArgumentException("{$storeType}은 올바르지 않은 유산 키임");
|
throw new \InvalidArgumentException("{$storeType}은 올바르지 않은 유산 키임");
|
||||||
}
|
}
|
||||||
|
|
||||||
$extractFn = function(){ return [0, null];};
|
$extractFn = function () {
|
||||||
|
return [0, null];
|
||||||
|
};
|
||||||
switch ($key) {
|
switch ($key) {
|
||||||
case 'dex':
|
case 'dex':
|
||||||
$extractFn = function () use ($multiplier) {
|
$extractFn = function () use ($multiplier) {
|
||||||
@@ -1242,7 +1385,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setInheritancePoint(string $key, $value, $aux=null){
|
public function setInheritancePoint(string $key, $value, $aux = null)
|
||||||
|
{
|
||||||
if (!is_int($value) && !is_float($value)) {
|
if (!is_int($value) && !is_float($value)) {
|
||||||
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
||||||
}
|
}
|
||||||
@@ -1277,7 +1421,8 @@ class General implements iAction{
|
|||||||
$inheritStor->setValue($key, [$value, $aux]);
|
$inheritStor->setValue($key, [$value, $aux]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function increaseInheritancePoint(string $key, $value, $aux=null){
|
public function increaseInheritancePoint(string $key, $value, $aux = null)
|
||||||
|
{
|
||||||
if (!is_int($value) && !is_float($value)) {
|
if (!is_int($value) && !is_float($value)) {
|
||||||
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
||||||
}
|
}
|
||||||
@@ -1317,7 +1462,8 @@ class General implements iAction{
|
|||||||
$inheritStor->setValue($key, [$newValue, $aux]);
|
$inheritStor->setValue($key, [$newValue, $aux]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mergeTotalInheritancePoint(){
|
public function mergeTotalInheritancePoint()
|
||||||
|
{
|
||||||
$ownerID = $this->getVar('owner');
|
$ownerID = $this->getVar('owner');
|
||||||
if (!$ownerID) {
|
if (!$ownerID) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
+118
-136
@@ -93,8 +93,7 @@ class GeneralAI
|
|||||||
$city = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $general->getCityID());
|
$city = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $general->getCityID());
|
||||||
$general->setRawCity($city);
|
$general->setRawCity($city);
|
||||||
$this->city = $city;
|
$this->city = $city;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this->city = $general->getRawCity();
|
$this->city = $general->getRawCity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +183,6 @@ class GeneralAI
|
|||||||
$genType |= self::t통솔장;
|
$genType |= self::t통솔장;
|
||||||
}
|
}
|
||||||
return $genType;
|
return $genType;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function calcDiplomacyState()
|
protected function calcDiplomacyState()
|
||||||
@@ -219,8 +217,7 @@ class GeneralAI
|
|||||||
} else if ($warState == 1 && $warTerm < 5) {
|
} else if ($warState == 1 && $warTerm < 5) {
|
||||||
$onWarReady += 1;
|
$onWarReady += 1;
|
||||||
$warTargetNation[$warNationID] = 1;
|
$warTargetNation[$warNationID] = 1;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$onWarYet += 1;
|
$onWarYet += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,7 +248,8 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function calcWarRoute(){
|
protected function calcWarRoute()
|
||||||
|
{
|
||||||
if ($this->warRoute !== null) {
|
if ($this->warRoute !== null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -570,8 +568,7 @@ class GeneralAI
|
|||||||
$generalID = $general->getID();
|
$generalID = $general->getID();
|
||||||
if ($turnList[$generalID] instanceof Command\General\che_징병) {
|
if ($turnList[$generalID] instanceof Command\General\che_징병) {
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1222,7 +1219,7 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$crewtype = $targetUserGeneral->getCrewTypeObj();
|
$crewtype = $targetUserGeneral->getCrewTypeObj();
|
||||||
$reqMoney = $crewtype->costWithTech($this->nation['tech'], $targetUserGeneral->getLeadership(false)) * 100 * 3 * 1.1;
|
$reqMoney = $crewtype->costWithTech($this->nation['tech'], Util::toInt($targetUserGeneral->getLeadership(false))) * 100 * 3 * 1.1;
|
||||||
if ($this->env['year'] > $this->env['startyear'] + 3) {
|
if ($this->env['year'] > $this->env['startyear'] + 3) {
|
||||||
$reqMoney = max($reqMoney, $reqHumanMinRes);
|
$reqMoney = max($reqMoney, $reqHumanMinRes);
|
||||||
}
|
}
|
||||||
@@ -1244,7 +1241,8 @@ class GeneralAI
|
|||||||
|
|
||||||
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetUserGeneral->getID(),
|
'destGeneralID' => $targetUserGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $payAmount
|
'amount' => $payAmount
|
||||||
@@ -1259,7 +1257,10 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass(
|
$cmd = buildNationCommandClass(
|
||||||
'che_포상', $this->general, $this->env, $lastTurn,
|
'che_포상',
|
||||||
|
$this->general,
|
||||||
|
$this->env,
|
||||||
|
$lastTurn,
|
||||||
Util::choiceRandomUsingWeightPair($candidateArgs)
|
Util::choiceRandomUsingWeightPair($candidateArgs)
|
||||||
);
|
);
|
||||||
if (!$cmd->hasFullConditionMet()) {
|
if (!$cmd->hasFullConditionMet()) {
|
||||||
@@ -1315,20 +1316,18 @@ class GeneralAI
|
|||||||
|
|
||||||
if (key_exists($targetUserGeneral->getID(), $this->userWarGenerals)) {
|
if (key_exists($targetUserGeneral->getID(), $this->userWarGenerals)) {
|
||||||
$isWarGeneral = true;
|
$isWarGeneral = true;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$isWarGeneral = false;
|
$isWarGeneral = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($isWarGeneral) {
|
if ($isWarGeneral) {
|
||||||
$reqHumanMinRes = $reqHumanMinWarRes;
|
$reqHumanMinRes = $reqHumanMinWarRes;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$reqHumanMinRes = $reqHumanMinDevelRes;
|
$reqHumanMinRes = $reqHumanMinDevelRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
$crewtype = $targetUserGeneral->getCrewTypeObj();
|
$crewtype = $targetUserGeneral->getCrewTypeObj();
|
||||||
$reqMoney = $crewtype->costWithTech($this->nation['tech'], $targetUserGeneral->getLeadership(false)) * 100 * 6 * 1.1;
|
$reqMoney = $crewtype->costWithTech($this->nation['tech'], Util::toInt($targetUserGeneral->getLeadership(false))) * 100 * 6 * 1.1;
|
||||||
if ($this->env['year'] > $this->env['startyear'] + 3) {
|
if ($this->env['year'] > $this->env['startyear'] + 3) {
|
||||||
$reqMoney = max($reqMoney, $reqHumanMinRes);
|
$reqMoney = max($reqMoney, $reqHumanMinRes);
|
||||||
}
|
}
|
||||||
@@ -1351,7 +1350,8 @@ class GeneralAI
|
|||||||
|
|
||||||
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetUserGeneral->getID(),
|
'destGeneralID' => $targetUserGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $payAmount
|
'amount' => $payAmount
|
||||||
@@ -1366,7 +1366,10 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass(
|
$cmd = buildNationCommandClass(
|
||||||
'che_포상', $this->general, $this->env, $lastTurn,
|
'che_포상',
|
||||||
|
$this->general,
|
||||||
|
$this->env,
|
||||||
|
$lastTurn,
|
||||||
Util::choiceRandomUsingWeightPair($candidateArgs)
|
Util::choiceRandomUsingWeightPair($candidateArgs)
|
||||||
);
|
);
|
||||||
if (!$cmd->hasFullConditionMet()) {
|
if (!$cmd->hasFullConditionMet()) {
|
||||||
@@ -1417,7 +1420,7 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$crewtype = $targetNPCGeneral->getCrewTypeObj();
|
$crewtype = $targetNPCGeneral->getCrewTypeObj();
|
||||||
$reqMoney = $crewtype->costWithTech($this->nation['tech'], $targetNPCGeneral->getLeadership(false)) * 100 * 1.5;
|
$reqMoney = $crewtype->costWithTech($this->nation['tech'], Util::toInt($targetNPCGeneral->getLeadership(false))) * 100 * 1.5;
|
||||||
if ($this->env['year'] > $this->env['startyear'] + 5) {
|
if ($this->env['year'] > $this->env['startyear'] + 5) {
|
||||||
$reqMoney = max($reqMoney, $reqNPCMinWarRes);
|
$reqMoney = max($reqMoney, $reqNPCMinWarRes);
|
||||||
}
|
}
|
||||||
@@ -1440,7 +1443,8 @@ class GeneralAI
|
|||||||
|
|
||||||
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetNPCGeneral->getID(),
|
'destGeneralID' => $targetNPCGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $payAmount
|
'amount' => $payAmount
|
||||||
@@ -1455,7 +1459,10 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass(
|
$cmd = buildNationCommandClass(
|
||||||
'che_포상', $this->general, $this->env, $lastTurn,
|
'che_포상',
|
||||||
|
$this->general,
|
||||||
|
$this->env,
|
||||||
|
$lastTurn,
|
||||||
Util::choiceRandomUsingWeightPair($candidateArgs)
|
Util::choiceRandomUsingWeightPair($candidateArgs)
|
||||||
);
|
);
|
||||||
if (!$cmd->hasFullConditionMet()) {
|
if (!$cmd->hasFullConditionMet()) {
|
||||||
@@ -1509,7 +1516,7 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$crewtype = $targetNPCGeneral->getCrewTypeObj();
|
$crewtype = $targetNPCGeneral->getCrewTypeObj();
|
||||||
$reqMoney = $crewtype->costWithTech($nation['tech'], $targetNPCGeneral->getLeadership(false)) * 100 * 3 * 1.1;
|
$reqMoney = $crewtype->costWithTech($nation['tech'], Util::toInt($targetNPCGeneral->getLeadership(false))) * 100 * 3 * 1.1;
|
||||||
if ($this->env['year'] > $this->env['startyear'] + 5) {
|
if ($this->env['year'] > $this->env['startyear'] + 5) {
|
||||||
$reqMoney = max($reqMoney, $reqNPCMinWarRes);
|
$reqMoney = max($reqMoney, $reqNPCMinWarRes);
|
||||||
}
|
}
|
||||||
@@ -1526,7 +1533,8 @@ class GeneralAI
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetNPCGeneral->getID(),
|
'destGeneralID' => $targetNPCGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => Util::valueFit($payAmount, 100, $this->maxResourceActionAmount)
|
'amount' => Util::valueFit($payAmount, 100, $this->maxResourceActionAmount)
|
||||||
@@ -1556,7 +1564,8 @@ class GeneralAI
|
|||||||
|
|
||||||
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
$payAmount = Util::valueFit($payAmount, 100, $this->maxResourceActionAmount);
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetNPCGeneral->getID(),
|
'destGeneralID' => $targetNPCGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $payAmount
|
'amount' => $payAmount
|
||||||
@@ -1564,7 +1573,6 @@ class GeneralAI
|
|||||||
max(count($npcWarGenerals), count($npcCivilGenerals)) - $idx
|
max(count($npcWarGenerals), count($npcCivilGenerals)) - $idx
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$candidateArgs) {
|
if (!$candidateArgs) {
|
||||||
@@ -1572,7 +1580,10 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass(
|
$cmd = buildNationCommandClass(
|
||||||
'che_포상', $this->general, $this->env, $lastTurn,
|
'che_포상',
|
||||||
|
$this->general,
|
||||||
|
$this->env,
|
||||||
|
$lastTurn,
|
||||||
Util::choiceRandomUsingWeightPair($candidateArgs)
|
Util::choiceRandomUsingWeightPair($candidateArgs)
|
||||||
);
|
);
|
||||||
if (!$cmd->hasFullConditionMet()) {
|
if (!$cmd->hasFullConditionMet()) {
|
||||||
@@ -1626,7 +1637,8 @@ class GeneralAI
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetNPCGeneral->getID(),
|
'destGeneralID' => $targetNPCGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $takeAmount
|
'amount' => $takeAmount
|
||||||
@@ -1644,8 +1656,7 @@ class GeneralAI
|
|||||||
|
|
||||||
if ($resVal >= $reqNationResVal) {
|
if ($resVal >= $reqNationResVal) {
|
||||||
$willTakeSmallAmount = true;
|
$willTakeSmallAmount = true;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$willTakeSmallAmount = false;
|
$willTakeSmallAmount = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1661,17 +1672,14 @@ class GeneralAI
|
|||||||
if ($targetNPCGeneral->getVar($resName) <= $reqNPCMinWarRes * 2) {
|
if ($targetNPCGeneral->getVar($resName) <= $reqNPCMinWarRes * 2) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if ($targetNPCGeneral->getVar($resName) <= $reqNPCMinWarRes) {
|
||||||
}
|
|
||||||
else if($targetNPCGeneral->getVar($resName) <= $reqNPCMinWarRes){
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$willTakeSmallAmount) {
|
if (!$willTakeSmallAmount) {
|
||||||
$takeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes;
|
$takeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes;
|
||||||
$takeAmount = Util::valueFit(sqrt($takeAmount * $reqResValDelta), 0, $takeAmount);
|
$takeAmount = Util::valueFit(sqrt($takeAmount * $reqResValDelta), 0, $takeAmount);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$maxTakeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes;
|
$maxTakeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes;
|
||||||
$minTakeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes * 2;
|
$minTakeAmount = $targetNPCGeneral->getVar($resName) - $reqNPCMinWarRes * 2;
|
||||||
$takeAmount = Util::valueFit(sqrt($minTakeAmount * $reqResValDelta), 0, $maxTakeAmount);
|
$takeAmount = Util::valueFit(sqrt($minTakeAmount * $reqResValDelta), 0, $maxTakeAmount);
|
||||||
@@ -1686,7 +1694,8 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$takeAmount = Util::valueFit($takeAmount, 100, $this->maxResourceActionAmount);
|
$takeAmount = Util::valueFit($takeAmount, 100, $this->maxResourceActionAmount);
|
||||||
$candidateArgs[] = [[
|
$candidateArgs[] = [
|
||||||
|
[
|
||||||
'destGeneralID' => $targetNPCGeneral->getID(),
|
'destGeneralID' => $targetNPCGeneral->getID(),
|
||||||
'isGold' => $resName == 'gold',
|
'isGold' => $resName == 'gold',
|
||||||
'amount' => $takeAmount
|
'amount' => $takeAmount
|
||||||
@@ -1694,7 +1703,6 @@ class GeneralAI
|
|||||||
$takeAmount
|
$takeAmount
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$candidateArgs) {
|
if (!$candidateArgs) {
|
||||||
@@ -1702,7 +1710,10 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cmd = buildNationCommandClass(
|
$cmd = buildNationCommandClass(
|
||||||
'che_몰수', $this->general, $this->env, $lastTurn,
|
'che_몰수',
|
||||||
|
$this->general,
|
||||||
|
$this->env,
|
||||||
|
$lastTurn,
|
||||||
Util::choiceRandomUsingWeightPair($candidateArgs)
|
Util::choiceRandomUsingWeightPair($candidateArgs)
|
||||||
);
|
);
|
||||||
if (!$cmd->hasFullConditionMet()) {
|
if (!$cmd->hasFullConditionMet()) {
|
||||||
@@ -1896,11 +1907,9 @@ class GeneralAI
|
|||||||
|
|
||||||
if (!key_exists($destNationID, $lowTargetNations)) {
|
if (!key_exists($destNationID, $lowTargetNations)) {
|
||||||
$nations[$destNationID] = 1 / sqrt($destNationPower + 1);
|
$nations[$destNationID] = 1 / sqrt($destNationPower + 1);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$warNations[$destNationID] = 1 / sqrt($destNationPower + 1);
|
$warNations[$destNationID] = 1 / sqrt($destNationPower + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!$nations) {
|
if (!$nations) {
|
||||||
if (!$warNations) {
|
if (!$warNations) {
|
||||||
@@ -2098,8 +2107,7 @@ class GeneralAI
|
|||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)];
|
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)];
|
||||||
}
|
}
|
||||||
}
|
} else if ($develRate['pop'] < 0.99) {
|
||||||
else if ($develRate['pop'] < 0.99) {
|
|
||||||
$cmd = buildGeneralCommandClass('che_정착장려', $general, $env);
|
$cmd = buildGeneralCommandClass('che_정착장려', $general, $env);
|
||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'] / 4, 0.001)];
|
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'] / 4, 0.001)];
|
||||||
@@ -2125,8 +2133,7 @@ class GeneralAI
|
|||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
$cmdList[] = [$cmd, $strength / Util::valueFit($develRate['secu'] / 0.8, 0.001, 1)];
|
$cmdList[] = [$cmd, $strength / Util::valueFit($develRate['secu'] / 0.8, 0.001, 1)];
|
||||||
}
|
}
|
||||||
}
|
} else if ($develRate['secu'] < 1) {
|
||||||
else if($develRate['secu'] < 1){
|
|
||||||
$cmd = buildGeneralCommandClass('che_치안강화', $general, $env);
|
$cmd = buildGeneralCommandClass('che_치안강화', $general, $env);
|
||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
$cmdList[] = [$cmd, $strength / 2 / Util::valueFit($develRate['secu'], 0.001)];
|
$cmdList[] = [$cmd, $strength / 2 / Util::valueFit($develRate['secu'], 0.001)];
|
||||||
@@ -2243,8 +2250,7 @@ class GeneralAI
|
|||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
if (in_array($city['front'], [1, 3])) {
|
if (in_array($city['front'], [1, 3])) {
|
||||||
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)];
|
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)];
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001) / 2];
|
$cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001) / 2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2290,8 +2296,7 @@ class GeneralAI
|
|||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
if (in_array($city['front'], [1, 3])) {
|
if (in_array($city['front'], [1, 3])) {
|
||||||
$cmdList[] = [$cmd, ($isSpringSummer ? 1.2 : 0.8) * $intel / 4 / Util::valueFit($develRate['agri'], 0.001, 1)];
|
$cmdList[] = [$cmd, ($isSpringSummer ? 1.2 : 0.8) * $intel / 4 / Util::valueFit($develRate['agri'], 0.001, 1)];
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$cmdList[] = [$cmd, ($isSpringSummer ? 1.2 : 0.8) * $intel / 2 / Util::valueFit($develRate['agri'], 0.001, 1)];
|
$cmdList[] = [$cmd, ($isSpringSummer ? 1.2 : 0.8) * $intel / 2 / Util::valueFit($develRate['agri'], 0.001, 1)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2301,8 +2306,7 @@ class GeneralAI
|
|||||||
if ($cmd->hasFullConditionMet()) {
|
if ($cmd->hasFullConditionMet()) {
|
||||||
if (in_array($city['front'], [1, 3])) {
|
if (in_array($city['front'], [1, 3])) {
|
||||||
$cmdList[] = [$cmd, ($isSpringSummer ? 0.8 : 1.2) * $intel / 4 / Util::valueFit($develRate['comm'], 0.001, 1)];
|
$cmdList[] = [$cmd, ($isSpringSummer ? 0.8 : 1.2) * $intel / 4 / Util::valueFit($develRate['comm'], 0.001, 1)];
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$cmdList[] = [$cmd, ($isSpringSummer ? 0.8 : 1.2) * $intel / 2 / Util::valueFit($develRate['comm'], 0.001, 1)];
|
$cmdList[] = [$cmd, ($isSpringSummer ? 0.8 : 1.2) * $intel / 2 / Util::valueFit($develRate['comm'], 0.001, 1)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2346,8 +2350,7 @@ class GeneralAI
|
|||||||
'crewType' => $crewType->id,
|
'crewType' => $crewType->id,
|
||||||
'amount' => $this->fullLeadership * 100
|
'amount' => $this->fullLeadership * 100
|
||||||
]);
|
]);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$costCmd = buildGeneralCommandClass('che_징병', $general, $this->env, [
|
$costCmd = buildGeneralCommandClass('che_징병', $general, $this->env, [
|
||||||
'crewType' => $crewType->id,
|
'crewType' => $crewType->id,
|
||||||
'amount' => $this->fullLeadership * 100
|
'amount' => $this->fullLeadership * 100
|
||||||
@@ -2357,7 +2360,7 @@ class GeneralAI
|
|||||||
$goldCost = $costCmd->getCost()[0];
|
$goldCost = $costCmd->getCost()[0];
|
||||||
$riceCost = $crewType->riceWithTech(
|
$riceCost = $crewType->riceWithTech(
|
||||||
$this->nation['tech'],
|
$this->nation['tech'],
|
||||||
$this->fullLeadership*100
|
Util::toInt($this->fullLeadership * 100)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (($relGold + $relRice) * 1.5 <= $goldCost + $riceCost) {
|
if (($relGold + $relRice) * 1.5 <= $goldCost + $riceCost) {
|
||||||
@@ -2366,19 +2369,13 @@ class GeneralAI
|
|||||||
|
|
||||||
$tryBuying = false;
|
$tryBuying = false;
|
||||||
if ($this->generalPolicy->can상인무시) {
|
if ($this->generalPolicy->can상인무시) {
|
||||||
if($relRice * 1.5 < $relGold && $relRice < $riceCost * 2)
|
if ($relRice * 1.5 < $relGold && $relRice < $riceCost * 2) {
|
||||||
{
|
$tryBuying = true;
|
||||||
|
} else if ($relRice * 2 < $relGold) {
|
||||||
$tryBuying = true;
|
$tryBuying = true;
|
||||||
}
|
}
|
||||||
else if($relRice * 2 < $relGold)
|
} else {
|
||||||
{
|
if ($relRice * 2 < $relGold && $relRice < $riceCost * 3) {
|
||||||
$tryBuying = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if($relRice * 2 < $relGold && $relRice < $riceCost * 3)
|
|
||||||
{
|
|
||||||
$tryBuying = true;
|
$tryBuying = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2387,7 +2384,10 @@ class GeneralAI
|
|||||||
//1:1
|
//1:1
|
||||||
$amount = Util::valueFit(Util::toInt(($relGold - $relRice) / (1 + $deathRate)), 100, GameConst::$maxResourceActionAmount);
|
$amount = Util::valueFit(Util::toInt(($relGold - $relRice) / (1 + $deathRate)), 100, GameConst::$maxResourceActionAmount);
|
||||||
if ($amount >= $this->nationPolicy->minimumResourceActionAmount) {
|
if ($amount >= $this->nationPolicy->minimumResourceActionAmount) {
|
||||||
$cmd = buildGeneralCommandClass('che_군량매매', $general, $this->env,
|
$cmd = buildGeneralCommandClass(
|
||||||
|
'che_군량매매',
|
||||||
|
$general,
|
||||||
|
$this->env,
|
||||||
[
|
[
|
||||||
'buyRice' => true,
|
'buyRice' => true,
|
||||||
'amount' => $amount
|
'amount' => $amount
|
||||||
@@ -2401,19 +2401,13 @@ class GeneralAI
|
|||||||
|
|
||||||
$trySelling = false;
|
$trySelling = false;
|
||||||
if ($this->generalPolicy->can상인무시) {
|
if ($this->generalPolicy->can상인무시) {
|
||||||
if($relGold * 1.5 < $relRice && $relGold < $goldCost * 2)
|
if ($relGold * 1.5 < $relRice && $relGold < $goldCost * 2) {
|
||||||
{
|
$trySelling = true;
|
||||||
|
} else if ($relGold * 2 < $relRice) {
|
||||||
$trySelling = true;
|
$trySelling = true;
|
||||||
}
|
}
|
||||||
else if($relGold * 2 < $relRice)
|
} else {
|
||||||
{
|
if ($relGold * 2 < $relRice && $relGold < $goldCost * 3) {
|
||||||
$trySelling = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if($relGold * 2 < $relRice && $relGold < $goldCost * 3)
|
|
||||||
{
|
|
||||||
$trySelling = true;
|
$trySelling = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2421,7 +2415,10 @@ class GeneralAI
|
|||||||
if ($trySelling) {
|
if ($trySelling) {
|
||||||
$amount = Util::valueFit(Util::toInt(($relRice - $relGold) / (1 + $deathRate)), 100, GameConst::$maxResourceActionAmount);
|
$amount = Util::valueFit(Util::toInt(($relRice - $relGold) / (1 + $deathRate)), 100, GameConst::$maxResourceActionAmount);
|
||||||
if ($amount >= $this->nationPolicy->minimumResourceActionAmount) {
|
if ($amount >= $this->nationPolicy->minimumResourceActionAmount) {
|
||||||
$cmd = buildGeneralCommandClass('che_군량매매', $general, $this->env,
|
$cmd = buildGeneralCommandClass(
|
||||||
|
'che_군량매매',
|
||||||
|
$general,
|
||||||
|
$this->env,
|
||||||
[
|
[
|
||||||
'buyRice' => false,
|
'buyRice' => false,
|
||||||
'amount' => $amount
|
'amount' => $amount
|
||||||
@@ -2467,10 +2464,10 @@ class GeneralAI
|
|||||||
|
|
||||||
$maxPop = $city['pop_max'] - $this->nationPolicy->minNPCRecruitCityPopulation;
|
$maxPop = $city['pop_max'] - $this->nationPolicy->minNPCRecruitCityPopulation;
|
||||||
if (($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio) &&
|
if (($city['pop'] / $city['pop_max'] < $this->nationPolicy->safeRecruitCityPopulationRatio) &&
|
||||||
(Util::randF($remainPop/$maxPop))){
|
(Util::randF($remainPop / $maxPop))
|
||||||
|
) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$nationID = $general->getNationID();
|
$nationID = $general->getNationID();
|
||||||
@@ -2485,8 +2482,7 @@ class GeneralAI
|
|||||||
if ($armType) {
|
if ($armType) {
|
||||||
if (!($genType & self::t지장) && $armType == GameUnitConst::T_WIZARD) {
|
if (!($genType & self::t지장) && $armType == GameUnitConst::T_WIZARD) {
|
||||||
$armType = null;
|
$armType = null;
|
||||||
}
|
} else if (!($genType & self::t무장) && in_array($armType, [GameUnitConst::T_FOOTMAN, GameUnitConst::T_ARCHER, GameUnitConst::T_CAVALRY])) {
|
||||||
else if(!($genType & self::t무장) && in_array($armType, [GameUnitConst::T_FOOTMAN, GameUnitConst::T_ARCHER, GameUnitConst::T_CAVALRY])){
|
|
||||||
$armType = null;
|
$armType = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2535,7 +2531,7 @@ class GeneralAI
|
|||||||
if ($types) {
|
if ($types) {
|
||||||
$type = Util::choiceRandomUsingWeight($types);
|
$type = Util::choiceRandomUsingWeight($types);
|
||||||
} else {
|
} else {
|
||||||
throw new MustNotBeReachedException('에러:'.var_dump([$general->getName(), $general->getAuxVar('armType'), $armType, $cities, $regions, $relYear, $tech], true));
|
throw new MustNotBeReachedException('에러:' . print_r([$general->getName(), $general->getAuxVar('armType'), $armType, $cities, $regions, $relYear, $tech], true));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->generalPolicy->can고급병종) {
|
if ($this->generalPolicy->can고급병종) {
|
||||||
@@ -2543,8 +2539,7 @@ class GeneralAI
|
|||||||
if ($currCrewType->isValid($cities, $regions, $relYear, $tech)) {
|
if ($currCrewType->isValid($cities, $regions, $relYear, $tech)) {
|
||||||
if ($currCrewType->reqTech >= 2000) {
|
if ($currCrewType->reqTech >= 2000) {
|
||||||
$type = $currCrewType->id;
|
$type = $currCrewType->id;
|
||||||
}
|
} else if ($currCrewType->armType != $armType && $currCrewType->reqTech >= 1000) {
|
||||||
else if($currCrewType->armType != $armType && $currCrewType->reqTech >= 1000){
|
|
||||||
//굳이 뽑은 이유가 있겠지
|
//굳이 뽑은 이유가 있겠지
|
||||||
$type = $currCrewType->id;
|
$type = $currCrewType->id;
|
||||||
}
|
}
|
||||||
@@ -2566,8 +2561,8 @@ class GeneralAI
|
|||||||
|
|
||||||
$riceCost = $crewType->riceWithTech(
|
$riceCost = $crewType->riceWithTech(
|
||||||
$this->nation['tech'],
|
$this->nation['tech'],
|
||||||
$this->fullLeadership*100 *
|
Util::toInt($this->fullLeadership * 100 *
|
||||||
$general->getRankVar('killcrew')/max($general->getRankVar('deathcrew'),1)*1.2
|
$general->getRankVar('killcrew') / max($general->getRankVar('deathcrew'), 1) * 1.2)
|
||||||
);
|
);
|
||||||
|
|
||||||
$cmd = buildGeneralCommandClass('che_징병', $general, $env, [
|
$cmd = buildGeneralCommandClass('che_징병', $general, $env, [
|
||||||
@@ -2582,8 +2577,7 @@ class GeneralAI
|
|||||||
'crewType' => $type,
|
'crewType' => $type,
|
||||||
'amount' => $crew
|
'amount' => $crew
|
||||||
]);
|
]);
|
||||||
}
|
} else if ($gold < $cost && $gold * 2 >= $cost) {
|
||||||
else if($gold < $cost && $gold * 2 >= $cost){
|
|
||||||
$crew *= 0.5;
|
$crew *= 0.5;
|
||||||
$riceCost *= 0.5;
|
$riceCost *= 0.5;
|
||||||
$crew = Util::round($crew - 49, -2);
|
$crew = Util::round($crew - 49, -2);
|
||||||
@@ -2752,8 +2746,7 @@ class GeneralAI
|
|||||||
|
|
||||||
if ($this->genType & self::t통솔장) {
|
if ($this->genType & self::t통솔장) {
|
||||||
$reqRes = $reqNPCWar;
|
$reqRes = $reqNPCWar;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$reqRes = $reqNPCDevel;
|
$reqRes = $reqNPCDevel;
|
||||||
if ($genRes >= $reqNPCWar && $reqNPCWar > $reqNPCDevel + 1000) {
|
if ($genRes >= $reqNPCWar && $reqNPCWar > $reqNPCDevel + 1000) {
|
||||||
$amount = $genRes - $reqNPCDevel;
|
$amount = $genRes - $reqNPCDevel;
|
||||||
@@ -2783,8 +2776,7 @@ class GeneralAI
|
|||||||
'isGold' => 'rice',
|
'isGold' => 'rice',
|
||||||
'amount' => $genRes
|
'amount' => $genRes
|
||||||
], $genRes];
|
], $genRes];
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$args[] = [[
|
$args[] = [[
|
||||||
'isGold' => 'rice',
|
'isGold' => 'rice',
|
||||||
'amount' => $genRes / 2
|
'amount' => $genRes / 2
|
||||||
@@ -2850,8 +2842,7 @@ class GeneralAI
|
|||||||
if ($city['pop'] >= $minRecruitPop) {
|
if ($city['pop'] >= $minRecruitPop) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
if ($city['pop'] / $city['pop_max'] >= $this->nationPolicy->safeRecruitCityPopulationRatio) {
|
if ($city['pop'] / $city['pop_max'] >= $this->nationPolicy->safeRecruitCityPopulationRatio) {
|
||||||
if ($city['pop'] >= $this->nationPolicy->minNPCRecruitCityPopulation && $city['pop'] >= $minRecruitPop) {
|
if ($city['pop'] >= $this->nationPolicy->minNPCRecruitCityPopulation && $city['pop'] >= $minRecruitPop) {
|
||||||
LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 인구 충분", [$city['pop'] / $city['pop_max'], $this->nationPolicy->safeRecruitCityPopulationRatio]);
|
LogText("{$this->general->getName()}, {$this->general->getID()} 후방워프 불가: 인구 충분", [$city['pop'] / $city['pop_max'], $this->nationPolicy->safeRecruitCityPopulationRatio]);
|
||||||
@@ -2900,8 +2891,7 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
if (key_exists($cityID, $this->frontCities)) {
|
if (key_exists($cityID, $this->frontCities)) {
|
||||||
$recruitableCityList[$cityID] = $pop_ratio / 2;
|
$recruitableCityList[$cityID] = $pop_ratio / 2;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$recruitableCityList[$cityID] = $pop_ratio;
|
$recruitableCityList[$cityID] = $pop_ratio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3345,7 +3335,8 @@ class GeneralAI
|
|||||||
return $cmd;
|
return $cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function categorizeNationCities():void{
|
protected function categorizeNationCities(): void
|
||||||
|
{
|
||||||
|
|
||||||
if ($this->nationCities !== null) {
|
if ($this->nationCities !== null) {
|
||||||
return;
|
return;
|
||||||
@@ -3377,8 +3368,7 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
if ($nationCity['front']) {
|
if ($nationCity['front']) {
|
||||||
$frontCities[$cityID] = $nationCity;
|
$frontCities[$cityID] = $nationCity;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$backupCities[$cityID] = $nationCity;
|
$backupCities[$cityID] = $nationCity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3392,7 +3382,8 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function categorizeNationGeneral():void{
|
protected function categorizeNationGeneral(): void
|
||||||
|
{
|
||||||
if ($this->userGenerals !== null) {
|
if ($this->userGenerals !== null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3436,8 +3427,7 @@ class GeneralAI
|
|||||||
|
|
||||||
if ($officerLevel > 4) {
|
if ($officerLevel > 4) {
|
||||||
$chiefGenerals[$officerLevel] = $nationGeneral;
|
$chiefGenerals[$officerLevel] = $nationGeneral;
|
||||||
}
|
} else if ($officerLevel > 2) {
|
||||||
else if($officerLevel > 2){
|
|
||||||
$nationCities[$officerCity]['important'] += 1;
|
$nationCities[$officerCity]['important'] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3453,29 +3443,24 @@ class GeneralAI
|
|||||||
if ($npcType == 5) {
|
if ($npcType == 5) {
|
||||||
//부대장임
|
//부대장임
|
||||||
$troopLeaders[$generalID] = $nationGeneral;
|
$troopLeaders[$generalID] = $nationGeneral;
|
||||||
}
|
} else if ($nationGeneral->getVar('troop') === $generalID && $nationGeneral->getReservedTurn(0, $this->env)->getName() === 'che_집합') {
|
||||||
else if($nationGeneral->getVar('troop') === $generalID && $nationGeneral->getReservedTurn(0, $this->env)->getName() === 'che_집합'){
|
|
||||||
//비 NPC부대장임
|
//비 NPC부대장임
|
||||||
$troopLeaders[$generalID] = $nationGeneral;
|
$troopLeaders[$generalID] = $nationGeneral;
|
||||||
}
|
} else if ($nationGeneral->getVar('killturn') < 5) {
|
||||||
else if($nationGeneral->getVar('killturn') < 5){
|
|
||||||
//삭턴이 몇 안남은 장수는 '내정장 npc'로 처리
|
//삭턴이 몇 안남은 장수는 '내정장 npc'로 처리
|
||||||
$npcCivilGenerals[$generalID] = $nationGeneral;
|
$npcCivilGenerals[$generalID] = $nationGeneral;
|
||||||
}
|
} else if ($npcType < 2) {
|
||||||
else if($npcType < 2) {
|
|
||||||
$userGenerals[$generalID] = $nationGeneral;
|
$userGenerals[$generalID] = $nationGeneral;
|
||||||
if ($nationGeneral->calcRecentWarTurn($this->env['turnterm']) <= $lastWar + 12) {
|
if ($nationGeneral->calcRecentWarTurn($this->env['turnterm']) <= $lastWar + 12) {
|
||||||
$userWarGenerals[$generalID] = $nationGeneral;
|
$userWarGenerals[$generalID] = $nationGeneral;
|
||||||
}
|
} else if (
|
||||||
else if(
|
|
||||||
$this->dipState !== self::d평화 &&
|
$this->dipState !== self::d평화 &&
|
||||||
$nationGeneral->getVar('crew') >= $this->nationPolicy->minWarCrew
|
$nationGeneral->getVar('crew') >= $this->nationPolicy->minWarCrew
|
||||||
) {
|
) {
|
||||||
$userWarGenerals[$generalID] = $nationGeneral;
|
$userWarGenerals[$generalID] = $nationGeneral;
|
||||||
//TODO: 훈련,사기 나중에 되돌릴 것
|
//TODO: 훈련,사기 나중에 되돌릴 것
|
||||||
//TODO: 징,모병턴 기준으로 계산하는 코드를 추가할 것
|
//TODO: 징,모병턴 기준으로 계산하는 코드를 추가할 것
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$userCivilGenerals[$generalID] = $nationGeneral;
|
$userCivilGenerals[$generalID] = $nationGeneral;
|
||||||
}
|
}
|
||||||
} else if ($nationGeneral->getLeadership(false) >= $this->nationPolicy->minNPCWarLeadership) {
|
} else if ($nationGeneral->getLeadership(false) >= $this->nationPolicy->minNPCWarLeadership) {
|
||||||
@@ -3497,7 +3482,8 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function chooseNationTurn(NationCommand $reservedCommand): NationCommand{
|
public function chooseNationTurn(NationCommand $reservedCommand): NationCommand
|
||||||
|
{
|
||||||
//TODO: NationTurn과 InstantNationTurn 구분 필요
|
//TODO: NationTurn과 InstantNationTurn 구분 필요
|
||||||
$lastTurn = $reservedCommand->getLastTurn();
|
$lastTurn = $reservedCommand->getLastTurn();
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
@@ -3523,8 +3509,7 @@ class GeneralAI
|
|||||||
$this->chooseTexRate();
|
$this->chooseTexRate();
|
||||||
$this->chooseRiceBillRate();
|
$this->chooseRiceBillRate();
|
||||||
}
|
}
|
||||||
}
|
} else if (in_array($month, [3, 6, 9, 12])) {
|
||||||
else if(in_array($month, [3, 6, 9, 12])){
|
|
||||||
$this->chooseNonLordPromotion();
|
$this->chooseNonLordPromotion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3564,7 +3549,8 @@ class GeneralAI
|
|||||||
return $cmd;
|
return $cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function chooseInstantNationTurn(NationCommand $reservedCommand): ?NationCommand{
|
public function chooseInstantNationTurn(NationCommand $reservedCommand): ?NationCommand
|
||||||
|
{
|
||||||
if ($reservedCommand->hasFullConditionMet()) {
|
if ($reservedCommand->hasFullConditionMet()) {
|
||||||
return $reservedCommand;
|
return $reservedCommand;
|
||||||
}
|
}
|
||||||
@@ -3585,7 +3571,8 @@ class GeneralAI
|
|||||||
return buildNationCommandClass(null, $this->general, $this->env, $this->general->getLastTurn());
|
return buildNationCommandClass(null, $this->general, $this->env, $this->general->getLastTurn());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function chooseGeneralTurn(GeneralCommand $reservedCommand): GeneralCommand{
|
public function chooseGeneralTurn(GeneralCommand $reservedCommand): GeneralCommand
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$npcType = $general->getNPCType();
|
$npcType = $general->getNPCType();
|
||||||
$nationID = $general->getNationID();
|
$nationID = $general->getNationID();
|
||||||
@@ -3747,7 +3734,8 @@ class GeneralAI
|
|||||||
return $this->devRate;
|
return $this->devRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function chooseNonLordPromotion(){
|
protected function chooseNonLordPromotion()
|
||||||
|
{
|
||||||
//빈자리는 아무나 채움
|
//빈자리는 아무나 채움
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
@@ -3772,17 +3760,13 @@ class GeneralAI
|
|||||||
/** @var General */
|
/** @var General */
|
||||||
if ($this->npcWarGenerals) {
|
if ($this->npcWarGenerals) {
|
||||||
$randGeneral = Util::choiceRandom($this->npcWarGenerals);
|
$randGeneral = Util::choiceRandom($this->npcWarGenerals);
|
||||||
}
|
} else if ($this->npcCivilGenerals) {
|
||||||
else if($this->npcCivilGenerals){
|
|
||||||
$randGeneral = Util::choiceRandom($this->npcCivilGenerals);
|
$randGeneral = Util::choiceRandom($this->npcCivilGenerals);
|
||||||
}
|
} else if ($this->userWarGenerals) {
|
||||||
else if($this->userWarGenerals){
|
|
||||||
$randGeneral = Util::choiceRandom($this->userWarGenerals);
|
$randGeneral = Util::choiceRandom($this->userWarGenerals);
|
||||||
}
|
} else if ($this->userCivilGenerals) {
|
||||||
else if($this->userCivilGenerals){
|
|
||||||
$randGeneral = Util::choiceRandom($this->userCivilGenerals);
|
$randGeneral = Util::choiceRandom($this->userCivilGenerals);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3799,8 +3783,7 @@ class GeneralAI
|
|||||||
if ($randGeneral->getStrength(false, false, false, false) < GameConst::$chiefStatMin) {
|
if ($randGeneral->getStrength(false, false, false, false) < GameConst::$chiefStatMin) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
if ($randGeneral->getIntel(false, false, false, false) < GameConst::$chiefStatMin) {
|
if ($randGeneral->getIntel(false, false, false, false) < GameConst::$chiefStatMin) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3829,7 +3812,8 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function calcCityDevelRate(array $city){
|
protected function calcCityDevelRate(array $city)
|
||||||
|
{
|
||||||
return [
|
return [
|
||||||
'trust' => [$city['trust'] / 100, self::t통솔장],
|
'trust' => [$city['trust'] / 100, self::t통솔장],
|
||||||
'pop' => [$city['pop'] / $city['pop_max'], self::t통솔장],
|
'pop' => [$city['pop'] / $city['pop_max'], self::t통솔장],
|
||||||
@@ -3841,7 +3825,8 @@ class GeneralAI
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function choosePromotion(){
|
protected function choosePromotion()
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$nation = $this->nation;
|
$nation = $this->nation;
|
||||||
@@ -3928,8 +3913,7 @@ class GeneralAI
|
|||||||
|
|
||||||
if (!key_exists($chiefLevel, $this->chiefGenerals) && !key_exists($chiefLevel, $nextChiefs)) {
|
if (!key_exists($chiefLevel, $this->chiefGenerals) && !key_exists($chiefLevel, $nextChiefs)) {
|
||||||
$newChiefProb = 1;
|
$newChiefProb = 1;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$newChiefProb = Util::randF(0.1);
|
$newChiefProb = Util::randF(0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3951,11 +3935,9 @@ class GeneralAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($chiefLevel == 11) {
|
if ($chiefLevel == 11) {
|
||||||
}
|
} else if ($chiefLevel % 2 == 0 && $general->getStrength(false, false, false, false) < GameConst::$chiefStatMin) {
|
||||||
else if($chiefLevel % 2 == 0 && $general->getStrength(false, false, false, false) < GameConst::$chiefStatMin){
|
|
||||||
continue;
|
continue;
|
||||||
}
|
} else if ($chiefLevel % 2 == 1 && $general->getIntel(false, false, false, false) < GameConst::$chiefStatMin) {
|
||||||
else if($chiefLevel % 2 == 1 && $general->getIntel(false, false, false, false) < GameConst::$chiefStatMin){
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ trait LazyVarUpdater{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($var === null){
|
if($var === null){
|
||||||
unset($this->auxVar[$key]);
|
unset($this->raw['auxVar'][$key]);
|
||||||
$this->auxUpdated = true;
|
$this->auxUpdated = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ class GeneralBuilder{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$this->dex1 && in_array('dex_t', $avgGen)){
|
if(!$this->dex1 && key_exists('dex_t', $avgGen)){
|
||||||
$dexTotal = $avgGen['dex_t'];
|
$dexTotal = $avgGen['dex_t'];
|
||||||
if ($pickType == '무') {
|
if ($pickType == '무') {
|
||||||
$dexVal = Util::choiceRandom([
|
$dexVal = Util::choiceRandom([
|
||||||
@@ -681,7 +681,7 @@ class GeneralBuilder{
|
|||||||
'turntime'=>$turntime,
|
'turntime'=>$turntime,
|
||||||
'killturn'=>$killturn,
|
'killturn'=>$killturn,
|
||||||
'age'=>$age,
|
'age'=>$age,
|
||||||
'belong'=>1,
|
'belong'=>0,
|
||||||
'personal'=>$this->ego,
|
'personal'=>$this->ego,
|
||||||
'special'=>$this->specialDomestic,
|
'special'=>$this->specialDomestic,
|
||||||
'specage'=>$this->specAge,
|
'specage'=>$this->specAge,
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
class TriggerInheritBuff implements iAction
|
||||||
|
{
|
||||||
|
use DefaultAction;
|
||||||
|
|
||||||
|
//TODO Ratio와 Prob 혼용 중지
|
||||||
|
const WAR_AVOID_RATIO = 'warAvoidRatio';
|
||||||
|
const WAR_CRITICAL_RATIO = 'warCriticalRatio';
|
||||||
|
const WAR_MAGIC_TRIAL_PROB = 'warMagicTrialProb';
|
||||||
|
const DOMESTIC_SUCCESS_PROB = 'domesticSuccessProb';
|
||||||
|
const DOMESTIC_FAIL_PROB = 'domesticFailProb';
|
||||||
|
const OPPOSE_WAR_AVOID_RATIO = 'warAvoidRatioOppose';
|
||||||
|
const OPPOSE_WAR_CRITICAL_RATIO = 'warCriticalRatioOppose';
|
||||||
|
const OPPOSE_WAR_MAGIC_TRIAL_PROB = 'warMagicTrialProbOppose';
|
||||||
|
|
||||||
|
const MAX_STEP = 5;
|
||||||
|
|
||||||
|
const BUFF_KEY_MAP = [
|
||||||
|
self::WAR_AVOID_RATIO => 'warAvoidRatio',
|
||||||
|
self::WAR_CRITICAL_RATIO => 'warCriticalRatio',
|
||||||
|
self::WAR_MAGIC_TRIAL_PROB => 'warMagicTrialProb',
|
||||||
|
|
||||||
|
self::DOMESTIC_SUCCESS_PROB => 'success',
|
||||||
|
self::DOMESTIC_FAIL_PROB => 'fail',
|
||||||
|
|
||||||
|
self::OPPOSE_WAR_AVOID_RATIO => 'warAvoidRatio',
|
||||||
|
self::OPPOSE_WAR_CRITICAL_RATIO => 'warCriticalRatio',
|
||||||
|
self::OPPOSE_WAR_MAGIC_TRIAL_PROB => 'warMagicTrialProb',
|
||||||
|
];
|
||||||
|
|
||||||
|
const CALC_DOMESTIC = [
|
||||||
|
self::BUFF_KEY_MAP[self::DOMESTIC_SUCCESS_PROB] => [self::DOMESTIC_SUCCESS_PROB, 0.01],
|
||||||
|
self::BUFF_KEY_MAP[self::DOMESTIC_FAIL_PROB] => [self::DOMESTIC_FAIL_PROB, -0.01],
|
||||||
|
];
|
||||||
|
|
||||||
|
const CALC_STAT = [
|
||||||
|
self::BUFF_KEY_MAP[self::WAR_AVOID_RATIO] => [self::WAR_AVOID_RATIO, 0.01],
|
||||||
|
self::BUFF_KEY_MAP[self::WAR_CRITICAL_RATIO] => [self::WAR_CRITICAL_RATIO, 0.01],
|
||||||
|
self::BUFF_KEY_MAP[self::WAR_MAGIC_TRIAL_PROB] => [self::WAR_MAGIC_TRIAL_PROB, 0.01],
|
||||||
|
];
|
||||||
|
|
||||||
|
const CALC_OPPOSE_STAT = [
|
||||||
|
self::BUFF_KEY_MAP[self::OPPOSE_WAR_AVOID_RATIO] => [self::OPPOSE_WAR_AVOID_RATIO, -0.01],
|
||||||
|
self::BUFF_KEY_MAP[self::OPPOSE_WAR_CRITICAL_RATIO] => [self::OPPOSE_WAR_CRITICAL_RATIO, -0.01],
|
||||||
|
self::BUFF_KEY_MAP[self::OPPOSE_WAR_MAGIC_TRIAL_PROB] => [self::OPPOSE_WAR_MAGIC_TRIAL_PROB, -0.01],
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
const BUFF_KEY_TEXT = [
|
||||||
|
self::WAR_AVOID_RATIO => '회피 확률 증가',
|
||||||
|
self::WAR_CRITICAL_RATIO => '필살 확률 증가',
|
||||||
|
self::WAR_MAGIC_TRIAL_PROB => '전투계략 시도 확률 증가',
|
||||||
|
|
||||||
|
self::DOMESTIC_SUCCESS_PROB => '내정 성공률 증가',
|
||||||
|
self::DOMESTIC_FAIL_PROB => '내정 실패율 감소',
|
||||||
|
|
||||||
|
self::OPPOSE_WAR_AVOID_RATIO => '상대 회피 확률 감소',
|
||||||
|
self::OPPOSE_WAR_CRITICAL_RATIO => '상대 필살 확률 감소',
|
||||||
|
self::OPPOSE_WAR_MAGIC_TRIAL_PROB => '상대 전투계략 시도 확률 감소',
|
||||||
|
];
|
||||||
|
|
||||||
|
const DOMESTIC_TARGET = [
|
||||||
|
'상업' => 1,
|
||||||
|
'농업' => 1,
|
||||||
|
'치안' => 1,
|
||||||
|
'성벽' => 1,
|
||||||
|
'수비' => 1,
|
||||||
|
'민심' => 1,
|
||||||
|
'인구' => 1,
|
||||||
|
'기술' => 1,
|
||||||
|
];
|
||||||
|
|
||||||
|
protected array $inheritBuffList;
|
||||||
|
|
||||||
|
public function __construct(array $inheritBuffList)
|
||||||
|
{
|
||||||
|
$this->inheritBuffList = $inheritBuffList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
||||||
|
{
|
||||||
|
if (count($this->inheritBuffList) == 0) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
if (!key_exists($turnType, self::DOMESTIC_TARGET)) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
if(!key_exists($varType, static::CALC_DOMESTIC)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
[$iKey, $coeff] = static::CALC_DOMESTIC[$varType];
|
||||||
|
if(!key_exists($iKey, $this->inheritBuffList)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
return $value + $coeff * $this->inheritBuffList[$iKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
if (count($this->inheritBuffList) == 0) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
if(!key_exists($statName, static::CALC_STAT)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
[$iKey, $coeff] = static::CALC_STAT[$statName];
|
||||||
|
if(!key_exists($iKey, $this->inheritBuffList)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
return $value + $coeff * $this->inheritBuffList[$iKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
|
if (count($this->inheritBuffList) == 0) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
if(!key_exists($statName, static::CALC_OPPOSE_STAT)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
[$iKey, $coeff] = static::CALC_OPPOSE_STAT[$statName];
|
||||||
|
if(!key_exists($iKey, $this->inheritBuffList)){
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
return $value + $coeff * $this->inheritBuffList[$iKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use \Symfony\Component\Lock;
|
use \Symfony\Component\Lock;
|
||||||
|
|
||||||
class TurnExecutionHelper
|
class TurnExecutionHelper
|
||||||
{
|
{
|
||||||
/** @var General*/
|
/** @var General*/
|
||||||
@@ -17,16 +19,19 @@ class TurnExecutionHelper
|
|||||||
$this->applyDB();
|
$this->applyDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyDB(){
|
public function applyDB()
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$this->generalObj->applyDB($db);
|
$this->generalObj->applyDB($db);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getGeneral():General{
|
public function getGeneral(): General
|
||||||
|
{
|
||||||
return $this->generalObj;
|
return $this->generalObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function preprocessCommand(array $env){
|
public function preprocessCommand(array $env)
|
||||||
|
{
|
||||||
$general = $this->getGeneral();
|
$general = $this->getGeneral();
|
||||||
$caller = $general->getPreTurnExecuteTriggerList($general);
|
$caller = $general->getPreTurnExecuteTriggerList($general);
|
||||||
$caller->merge(new GeneralTriggerCaller(
|
$caller->merge(new GeneralTriggerCaller(
|
||||||
@@ -37,7 +42,8 @@ class TurnExecutionHelper
|
|||||||
$caller->fire($env);
|
$caller->fire($env);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processBlocked():bool{
|
public function processBlocked(): bool
|
||||||
|
{
|
||||||
$general = $this->getGeneral();
|
$general = $this->getGeneral();
|
||||||
|
|
||||||
$blocked = $general->getVar('block');
|
$blocked = $general->getVar('block');
|
||||||
@@ -50,12 +56,10 @@ class TurnExecutionHelper
|
|||||||
if ($blocked == 2) {
|
if ($blocked == 2) {
|
||||||
$general->increaseVarWithLimit('killturn', -1, 0);
|
$general->increaseVarWithLimit('killturn', -1, 0);
|
||||||
$logger->pushGeneralActionLog("현재 멀티, 또는 비매너로 인한<R>블럭</> 대상자입니다. <1>$date</>");
|
$logger->pushGeneralActionLog("현재 멀티, 또는 비매너로 인한<R>블럭</> 대상자입니다. <1>$date</>");
|
||||||
}
|
} else if ($blocked == 3) {
|
||||||
else if($blocked == 3){
|
|
||||||
$general->increaseVarWithLimit('killturn', -1, 0);
|
$general->increaseVarWithLimit('killturn', -1, 0);
|
||||||
$logger->pushGeneralActionLog("현재 악성유저로 분류되어 <R>블럭</> 대상자입니다. <1>$date</>");
|
$logger->pushGeneralActionLog("현재 악성유저로 분류되어 <R>블럭</> 대상자입니다. <1>$date</>");
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
//Hmm?
|
//Hmm?
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -63,7 +67,8 @@ class TurnExecutionHelper
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processNationCommand(Command\NationCommand $commandObj):LastTurn{
|
public function processNationCommand(Command\NationCommand $commandObj): LastTurn
|
||||||
|
{
|
||||||
$general = $this->getGeneral();
|
$general = $this->getGeneral();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -101,7 +106,8 @@ class TurnExecutionHelper
|
|||||||
return $commandObj->getResultTurn();
|
return $commandObj->getResultTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processCommand(Command\GeneralCommand $commandObj, bool $autorunMode){
|
public function processCommand(Command\GeneralCommand $commandObj, bool $autorunMode)
|
||||||
|
{
|
||||||
|
|
||||||
$general = $this->getGeneral();
|
$general = $this->getGeneral();
|
||||||
|
|
||||||
@@ -146,24 +152,21 @@ class TurnExecutionHelper
|
|||||||
|
|
||||||
if ($general->getNPCType() >= 2) {
|
if ($general->getNPCType() >= 2) {
|
||||||
$general->increaseVarWithLimit('killturn', -1);
|
$general->increaseVarWithLimit('killturn', -1);
|
||||||
}
|
} else if ($general->getVar('killturn') > $killTurn) {
|
||||||
else if($general->getVar('killturn') > $killTurn){
|
|
||||||
$general->increaseVarWithLimit('killturn', -1);
|
$general->increaseVarWithLimit('killturn', -1);
|
||||||
}
|
} else if ($autorunMode) {
|
||||||
else if($autorunMode){
|
|
||||||
$general->increaseVarWithLimit('killturn', -1);
|
$general->increaseVarWithLimit('killturn', -1);
|
||||||
}
|
} else if ($commandClassName == '휴식') {
|
||||||
else if($commandClassName == '휴식'){
|
|
||||||
$general->increaseVarWithLimit('killturn', -1);
|
$general->increaseVarWithLimit('killturn', -1);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$general->setVar('killturn', $killTurn);
|
$general->setVar('killturn', $killTurn);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $commandObj->getResultTurn();
|
return $commandObj->getResultTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTurnTime(){
|
function updateTurnTime()
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
@@ -189,8 +192,7 @@ class TurnExecutionHelper
|
|||||||
$general->setVar('owner', 0);
|
$general->setVar('owner', 0);
|
||||||
$general->setVar('defence_train', 80);
|
$general->setVar('defence_train', 80);
|
||||||
$general->setVar('owner_name', null);
|
$general->setVar('owner_name', null);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
storeOldGeneral($generalID, $gameStor->year, $gameStor->month);
|
storeOldGeneral($generalID, $gameStor->year, $gameStor->month);
|
||||||
$general->kill($db);
|
$general->kill($db);
|
||||||
@@ -210,11 +212,11 @@ class TurnExecutionHelper
|
|||||||
|
|
||||||
$turntime = addTurn($general->getTurnTime(), $gameStor->turnterm);
|
$turntime = addTurn($general->getTurnTime(), $gameStor->turnterm);
|
||||||
$general->setVar('turntime', $turntime);
|
$general->setVar('turntime', $turntime);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static public function executeGeneralCommandUntil(string $date, \DateTimeInterface $limitActionTime, int $year, int $month){
|
static public function executeGeneralCommandUntil(string $date, \DateTimeInterface $limitActionTime, int $year, int $month)
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$generalsTodo = $db->query(
|
$generalsTodo = $db->query(
|
||||||
'SELECT no,name,turntime,killturn,block,npc,deadyear FROM general WHERE turntime < %s ORDER BY turntime ASC, `no` ASC',
|
'SELECT no,name,turntime,killturn,block,npc,deadyear FROM general WHERE turntime < %s ORDER BY turntime ASC, `no` ASC',
|
||||||
@@ -260,7 +262,6 @@ class TurnExecutionHelper
|
|||||||
$general->increaseInheritancePoint('lived_month', 1);
|
$general->increaseInheritancePoint('lived_month', 1);
|
||||||
|
|
||||||
$turnObj->preprocessCommand($env);
|
$turnObj->preprocessCommand($env);
|
||||||
$generalCommandObj = $general->getReservedTurn(0, $env);
|
|
||||||
|
|
||||||
if ($general->getNPCType() >= 2 || ($autorun_user['limit_minutes'] ?? false)) {
|
if ($general->getNPCType() >= 2 || ($autorun_user['limit_minutes'] ?? false)) {
|
||||||
$ai = new GeneralAI($turnObj->getGeneral());
|
$ai = new GeneralAI($turnObj->getGeneral());
|
||||||
@@ -278,8 +279,11 @@ class TurnExecutionHelper
|
|||||||
$nationCommandObj
|
$nationCommandObj
|
||||||
);
|
);
|
||||||
$nationStor->setValue($lastNationTurnKey, $resultNationTurn->toRaw());
|
$nationStor->setValue($lastNationTurnKey, $resultNationTurn->toRaw());
|
||||||
|
$general->setRawCity(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$generalCommandObj = $general->getReservedTurn(0, $env);
|
||||||
|
|
||||||
if ($ai) {
|
if ($ai) {
|
||||||
$newGeneralCommandObj = $ai->chooseGeneralTurn($generalCommandObj); // npc AI 처리
|
$newGeneralCommandObj = $ai->chooseGeneralTurn($generalCommandObj); // npc AI 처리
|
||||||
if ($generalCommandObj !== $newGeneralCommandObj) {
|
if ($generalCommandObj !== $newGeneralCommandObj) {
|
||||||
@@ -300,14 +304,13 @@ class TurnExecutionHelper
|
|||||||
|
|
||||||
$turnObj->updateTurnTime();
|
$turnObj->updateTurnTime();
|
||||||
$turnObj->applyDB();
|
$turnObj->applyDB();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return [false, $currentTurn];
|
return [false, $currentTurn];
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function executeAllCommand(){
|
static public function executeAllCommand()
|
||||||
|
{
|
||||||
//if(!timeover()) { return; }
|
//if(!timeover()) { return; }
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
@@ -344,8 +347,7 @@ class TurnExecutionHelper
|
|||||||
$maxActionTime = Util::toInt(ini_get('max_execution_time'));
|
$maxActionTime = Util::toInt(ini_get('max_execution_time'));
|
||||||
if ($maxActionTime == 0) {
|
if ($maxActionTime == 0) {
|
||||||
$maxActionTime = 60;
|
$maxActionTime = 60;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$maxActionTime = max($maxActionTime * 2 / 3, $maxActionTime - 10);
|
$maxActionTime = max($maxActionTime * 2 / 3, $maxActionTime - 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,7 +358,10 @@ class TurnExecutionHelper
|
|||||||
while ($nextTurn <= $date) {
|
while ($nextTurn <= $date) {
|
||||||
|
|
||||||
[$executionOver, $currentTurn] = static::executeGeneralCommandUntil(
|
[$executionOver, $currentTurn] = static::executeGeneralCommandUntil(
|
||||||
$nextTurn, $limitActionTime, $gameStor->year, $gameStor->month
|
$nextTurn,
|
||||||
|
$limitActionTime,
|
||||||
|
$gameStor->year,
|
||||||
|
$gameStor->month
|
||||||
);
|
);
|
||||||
|
|
||||||
// 트래픽 업데이트
|
// 트래픽 업데이트
|
||||||
@@ -440,7 +445,10 @@ class TurnExecutionHelper
|
|||||||
// 현재시간의 월턴시간 이후 분단위 장수 처리
|
// 현재시간의 월턴시간 이후 분단위 장수 처리
|
||||||
|
|
||||||
[$executionOver, $currentTurn] = static::executeGeneralCommandUntil(
|
[$executionOver, $currentTurn] = static::executeGeneralCommandUntil(
|
||||||
$date, $limitActionTime, $gameStor->year, $gameStor->month
|
$date,
|
||||||
|
$limitActionTime,
|
||||||
|
$gameStor->year,
|
||||||
|
$gameStor->month
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($currentTurn !== null) {
|
if ($currentTurn !== null) {
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
class UserLogger
|
||||||
|
{
|
||||||
|
protected $userID;
|
||||||
|
protected $year;
|
||||||
|
protected $month;
|
||||||
|
protected $autoFlush;
|
||||||
|
protected $log = [];
|
||||||
|
|
||||||
|
function __construct(int $userID, ?int $year = null, ?int $month = null, bool $autoFlush = true)
|
||||||
|
{
|
||||||
|
$this->userID = $userID;
|
||||||
|
if ($year === null || $month === null) {
|
||||||
|
$db = DB::db();
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
$gameStor->cacheValues(['year', 'month']);
|
||||||
|
|
||||||
|
if ($year === null) {
|
||||||
|
$year = $gameStor->year;
|
||||||
|
}
|
||||||
|
if ($month === null) {
|
||||||
|
$month = $gameStor->month;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->year = $year;
|
||||||
|
$this->month = $month;
|
||||||
|
$this->autoFlush = $autoFlush;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
if ($this->autoFlush) {
|
||||||
|
$this->flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rollback()
|
||||||
|
{
|
||||||
|
$backup = $this->log;
|
||||||
|
$this->log = [];
|
||||||
|
|
||||||
|
return $backup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function flush()
|
||||||
|
{
|
||||||
|
if(!$this->log){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!$this->userID){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$serverID = UniqueConst::$serverID;
|
||||||
|
$request = array_map(function ($textAndType) use ($date, $serverID) {
|
||||||
|
[$text, $type] = $textAndType;
|
||||||
|
return [
|
||||||
|
'user_id' => $this->userID,
|
||||||
|
'server_id' => $serverID,
|
||||||
|
'log_type' => $type,
|
||||||
|
'year' => $this->year,
|
||||||
|
'month' => $this->month,
|
||||||
|
'date' => $date,
|
||||||
|
'text' => $text
|
||||||
|
];
|
||||||
|
}, array_values($this->log));
|
||||||
|
$db->insert('user_record', $request);
|
||||||
|
$this->log = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function push($text, string $type)
|
||||||
|
{
|
||||||
|
if (!$text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (is_array($text)) {
|
||||||
|
foreach ($text as $textItem) {
|
||||||
|
$this->log[] = [$textItem, $type];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->log[] = [$text, $type];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
class WarUnitGeneral extends WarUnit{
|
class WarUnitGeneral extends WarUnit
|
||||||
|
{
|
||||||
protected $raw;
|
protected $raw;
|
||||||
|
|
||||||
function __construct(General $general, array $rawNation, bool $isAttacker){
|
function __construct(General $general, array $rawNation, bool $isAttacker)
|
||||||
|
{
|
||||||
$this->general = $general;
|
$this->general = $general;
|
||||||
$this->raw = $general->getRaw();
|
$this->raw = $general->getRaw();
|
||||||
$this->rawNation = $rawNation; //read-only
|
$this->rawNation = $rawNation; //read-only
|
||||||
@@ -23,36 +26,39 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
if ($rawNation['capital'] == $this->getCityVar('city')) {
|
if ($rawNation['capital'] == $this->getCityVar('city')) {
|
||||||
$this->atmosBonus += 5;
|
$this->atmosBonus += 5;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
//수비자 보정
|
//수비자 보정
|
||||||
if ($cityLevel == 1) {
|
if ($cityLevel == 1) {
|
||||||
$this->trainBonus += 5;
|
$this->trainBonus += 5;
|
||||||
}
|
} else if ($cityLevel == 3) {
|
||||||
else if($cityLevel == 3){
|
|
||||||
$this->trainBonus += 5;
|
$this->trainBonus += 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getName():string{
|
function getName(): string
|
||||||
|
{
|
||||||
return $this->general->getName();
|
return $this->general->getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCityVar(string $key){
|
function getCityVar(string $key)
|
||||||
|
{
|
||||||
return $this->general->getRawCity()[$key];
|
return $this->general->getRawCity()[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
function setOppose(?WarUnit $oppose){
|
function setOppose(?WarUnit $oppose)
|
||||||
|
{
|
||||||
parent::setOppose($oppose);
|
parent::setOppose($oppose);
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$this->general->increaseRankVar('warnum', 1);
|
$this->general->increaseRankVar('warnum', 1);
|
||||||
|
|
||||||
if ($this->isAttacker) {
|
if ($this->isAttacker) {
|
||||||
$semiTurn = $general->getTurnTime();
|
$semiTurn = $general->getTurnTime();
|
||||||
}
|
} else if ($oppose !== null) {
|
||||||
else if($oppose !== null){
|
|
||||||
$semiTurn = $oppose->getGeneral()->getTurnTime();
|
$semiTurn = $oppose->getGeneral()->getTurnTime();
|
||||||
|
} else {
|
||||||
|
LogText("WarUnitGeneral::setOppose", "defender인데 oppose가 null {$general->getID()}, {$general->getTurnTime()}");
|
||||||
|
$semiTurn = $general->getTurnTime();
|
||||||
}
|
}
|
||||||
$phase = $this->getRealPhase();
|
$phase = $this->getRealPhase();
|
||||||
$semiTurn = substr($semiTurn, 0, strlen($semiTurn) - 2);
|
$semiTurn = substr($semiTurn, 0, strlen($semiTurn) - 2);
|
||||||
@@ -60,54 +66,71 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
$general->setVar('recent_war', $semiTurn);
|
$general->setVar('recent_war', $semiTurn);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMaxPhase():int{
|
function getMaxPhase(): int
|
||||||
|
{
|
||||||
$phase = $this->getCrewType()->speed;
|
$phase = $this->getCrewType()->speed;
|
||||||
$phase = $this->general->onCalcStat($this->general, 'initWarPhase', $phase, ['isAttacker' => $this->isAttacker]);
|
$phase = $this->general->onCalcStat($this->general, 'initWarPhase', $phase, ['isAttacker' => $this->isAttacker]);
|
||||||
|
//maxPhase는 상대가 결정되기 전에 계산되므로 oppose를 호출할 수 없음
|
||||||
return $phase + $this->bonusPhase;
|
return $phase + $this->bonusPhase;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addTrain(int $train){
|
function addTrain(int $train)
|
||||||
|
{
|
||||||
$this->general->increaseVarWithLimit('train', $train, 0, GameConst::$maxTrainByWar);
|
$this->general->increaseVarWithLimit('train', $train, 0, GameConst::$maxTrainByWar);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addAtmos(int $atmos){
|
function addAtmos(int $atmos)
|
||||||
|
{
|
||||||
$this->general->increaseVarWithLimit('atmos', $atmos, 0, GameConst::$maxAtmosByWar);
|
$this->general->increaseVarWithLimit('atmos', $atmos, 0, GameConst::$maxAtmosByWar);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDex(GameUnitDetail $crewType){
|
function getDex(GameUnitDetail $crewType)
|
||||||
$rawDex = $this->general->getDex($crewType);
|
{
|
||||||
return $this->general->onCalcStat($this->general, 'dex'.$crewType->armType, $rawDex, [
|
$dex = $this->general->getDex($crewType);
|
||||||
|
$dex = $this->general->onCalcStat($this->general, 'dex' . $crewType->armType, $dex, [
|
||||||
'isAttacker' => $this->isAttacker,
|
'isAttacker' => $this->isAttacker,
|
||||||
'opposeType' => $this->oppose->getCrewType()
|
'opposeType' => $this->oppose->getCrewType()
|
||||||
]);
|
]);
|
||||||
|
$dex = $this->oppose->general->onCalcOpposeStat($this->general, 'dex' . $crewType->armType, $dex, [
|
||||||
|
'isAttacker' => $this->isAttacker,
|
||||||
|
'opposeType' => $this->oppose->getCrewType()
|
||||||
|
]);
|
||||||
|
return $dex;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getComputedTrain(){
|
function getComputedTrain()
|
||||||
|
{
|
||||||
$train = $this->general->getVar('train');
|
$train = $this->general->getVar('train');
|
||||||
$train = $this->general->onCalcStat($this->general, 'bonusTrain', $train, ['isAttacker' => $this->isAttacker]);
|
$train = $this->general->onCalcStat($this->general, 'bonusTrain', $train, ['isAttacker' => $this->isAttacker]);
|
||||||
|
$train = $this->oppose->general->onCalcOpposeStat($this->general, 'bonusTrain', $train, ['isAttacker' => $this->isAttacker]);
|
||||||
$train += $this->trainBonus;
|
$train += $this->trainBonus;
|
||||||
|
|
||||||
return $train;
|
return $train;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getComputedAtmos(){
|
function getComputedAtmos()
|
||||||
|
{
|
||||||
$atmos = $this->general->getVar('atmos');
|
$atmos = $this->general->getVar('atmos');
|
||||||
$atmos = $this->general->onCalcStat($this->general, 'bonusAtmos', $atmos, ['isAttacker' => $this->isAttacker]);
|
$atmos = $this->general->onCalcStat($this->general, 'bonusAtmos', $atmos, ['isAttacker' => $this->isAttacker]);
|
||||||
|
$atmos = $this->oppose->general->onCalcOpposeStat($this->general, 'bonusAtmos', $atmos, ['isAttacker' => $this->isAttacker]);
|
||||||
$atmos += $this->atmosBonus;
|
$atmos += $this->atmosBonus;
|
||||||
|
|
||||||
return $atmos;
|
return $atmos;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getComputedCriticalRatio():float{
|
function getComputedCriticalRatio(): float
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$criticalRatio = $this->getCrewType()->getCriticalRatio($general);
|
$criticalRatio = $this->getCrewType()->getCriticalRatio($general);
|
||||||
|
|
||||||
/** @var float $criticalRatio */
|
/** @var float $criticalRatio */
|
||||||
$criticalRatio = $general->onCalcStat($general, 'warCriticalRatio', $criticalRatio, ['isAttacker' => $this->isAttacker]);
|
$criticalRatio = $general->onCalcStat($general, 'warCriticalRatio', $criticalRatio, ['isAttacker' => $this->isAttacker]);
|
||||||
|
$criticalRatio = $this->oppose->general->onCalcOpposeStat($general, 'warCriticalRatio', $criticalRatio, ['isAttacker' => $this->isAttacker]);
|
||||||
return $criticalRatio;
|
return $criticalRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getComputedAvoidRatio():float{
|
function getComputedAvoidRatio(): float
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
|
|
||||||
$avoidRatio = $this->getCrewType()->avoid / 100;
|
$avoidRatio = $this->getCrewType()->avoid / 100;
|
||||||
@@ -115,6 +138,7 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
|
|
||||||
/** @var float $avoidRatio */
|
/** @var float $avoidRatio */
|
||||||
$avoidRatio = $general->onCalcStat($general, 'warAvoidRatio', $avoidRatio, ['isAttacker' => $this->isAttacker]);
|
$avoidRatio = $general->onCalcStat($general, 'warAvoidRatio', $avoidRatio, ['isAttacker' => $this->isAttacker]);
|
||||||
|
$avoidRatio = $this->oppose->general->onCalcOpposeStat($general, 'warAvoidRatio', $avoidRatio, ['isAttacker' => $this->isAttacker]);
|
||||||
|
|
||||||
if ($this->getOppose()->getCrewType()->armType == GameUnitConst::T_FOOTMAN) {
|
if ($this->getOppose()->getCrewType()->armType == GameUnitConst::T_FOOTMAN) {
|
||||||
$avoidRatio *= 0.75;
|
$avoidRatio *= 0.75;
|
||||||
@@ -123,7 +147,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return $avoidRatio;
|
return $avoidRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addWin(){
|
function addWin()
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$general->increaseRankVar('killnum', 1);
|
$general->increaseRankVar('killnum', 1);
|
||||||
|
|
||||||
@@ -137,7 +162,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
$this->addStatExp(1);
|
$this->addStatExp(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addStatExp(int $value = 1){
|
function addStatExp(int $value = 1)
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
if ($this->crewType->armType == GameUnitConst::T_WIZARD) { // 귀병
|
if ($this->crewType->armType == GameUnitConst::T_WIZARD) { // 귀병
|
||||||
$general->increaseVar('intel_exp', $value);
|
$general->increaseVar('intel_exp', $value);
|
||||||
@@ -148,7 +174,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addLevelExp(float $value){
|
function addLevelExp(float $value)
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
if (!$this->isAttacker) {
|
if (!$this->isAttacker) {
|
||||||
$value *= 0.8;
|
$value *= 0.8;
|
||||||
@@ -156,18 +183,21 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
$general->addExperience($value);
|
$general->addExperience($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDedication(float $value){
|
function addDedication(float $value)
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$general->addDedication($value);
|
$general->addDedication($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addLose(){
|
function addLose()
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$general->increaseRankVar('deathnum', 1);
|
$general->increaseRankVar('deathnum', 1);
|
||||||
$this->addStatExp(1);
|
$this->addStatExp(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function computeWarPower(){
|
function computeWarPower()
|
||||||
|
{
|
||||||
[$warPower, $opposeWarPowerMultiply] = parent::computeWarPower();
|
[$warPower, $opposeWarPowerMultiply] = parent::computeWarPower();
|
||||||
|
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
@@ -178,19 +208,15 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
if ($this->isAttacker) {
|
if ($this->isAttacker) {
|
||||||
if ($officerLevel == 12) {
|
if ($officerLevel == 12) {
|
||||||
$warPower *= 1.10;
|
$warPower *= 1.10;
|
||||||
}
|
} else if ($officerLevel == 11 || $officerLevel == 10 || $officerLevel == 8 || $officerLevel == 6) {
|
||||||
else if($officerLevel == 11 | $officerLevel == 10 || $officerLevel == 8 || $officerLevel == 6){
|
|
||||||
$warPower *= 1.05;
|
$warPower *= 1.05;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
if ($officerLevel == 12) {
|
if ($officerLevel == 12) {
|
||||||
$opposeWarPowerMultiply *= 0.90;
|
$opposeWarPowerMultiply *= 0.90;
|
||||||
}
|
} else if ($officerLevel == 11 || $officerLevel == 9 || $officerLevel == 7 || $officerLevel == 5) {
|
||||||
else if($officerLevel == 11 || $officerLevel == 9 || $officerLevel == 7 || $officerLevel == 5){
|
|
||||||
$opposeWarPowerMultiply *= 0.95;
|
$opposeWarPowerMultiply *= 0.95;
|
||||||
}
|
} else if (2 <= $officerLevel && $officerLevel <= 4 && $officerCity == $cityID) {
|
||||||
else if(2 <= $officerLevel && $officerLevel <= 4 && $officerCity == $cityID){
|
|
||||||
$opposeWarPowerMultiply *= 0.95;
|
$opposeWarPowerMultiply *= 0.95;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,8 +225,7 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
|
|
||||||
if ($this->getOppose() instanceof WarUnitCity) {
|
if ($this->getOppose() instanceof WarUnitCity) {
|
||||||
$warPower *= 1 + $expLevel / 600;
|
$warPower *= 1 + $expLevel / 600;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$warPower /= max(0.01, 1 - $expLevel / 300);
|
$warPower /= max(0.01, 1 - $expLevel / 300);
|
||||||
$opposeWarPowerMultiply *= max(0.01, 1 - $expLevel / 300);
|
$opposeWarPowerMultiply *= max(0.01, 1 - $expLevel / 300);
|
||||||
}
|
}
|
||||||
@@ -215,15 +240,18 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return [$warPower, $opposeWarPowerMultiply];
|
return [$warPower, $opposeWarPowerMultiply];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getHP():int{
|
function getHP(): int
|
||||||
|
{
|
||||||
return $this->general->getVar('crew');
|
return $this->general->getVar('crew');
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDex(GameUnitDetail $crewType, float $exp){
|
function addDex(GameUnitDetail $crewType, float $exp)
|
||||||
|
{
|
||||||
$this->general->addDex($crewType, $exp, false);
|
$this->general->addDex($crewType, $exp, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function decreaseHP(int $damage):int{
|
function decreaseHP(int $damage): int
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$damage = min($damage, $general->getVar('crew'));
|
$damage = min($damage, $general->getVar('crew'));
|
||||||
|
|
||||||
@@ -240,7 +268,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return $general->getVar('crew');
|
return $general->getVar('crew');
|
||||||
}
|
}
|
||||||
|
|
||||||
function increaseKilled(int $damage):int{
|
function increaseKilled(int $damage): int
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
$this->addLevelExp($damage / 50);
|
$this->addLevelExp($damage / 50);
|
||||||
|
|
||||||
@@ -265,7 +294,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return $this->killed;
|
return $this->killed;
|
||||||
}
|
}
|
||||||
|
|
||||||
function tryWound():bool{
|
function tryWound(): bool
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
if ($this->hasActivatedSkillOnLog('부상무효')) {
|
if ($this->hasActivatedSkillOnLog('부상무효')) {
|
||||||
return false;
|
return false;
|
||||||
@@ -285,7 +315,8 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function continueWar(&$noRice):bool{
|
function continueWar(&$noRice): bool
|
||||||
|
{
|
||||||
$general = $this->general;
|
$general = $this->general;
|
||||||
if ($this->getHP() <= 0) {
|
if ($this->getHP() <= 0) {
|
||||||
$noRice = false;
|
$noRice = false;
|
||||||
@@ -298,11 +329,13 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStatChange():bool{
|
function checkStatChange(): bool
|
||||||
|
{
|
||||||
return $this->general->checkStatChange();
|
return $this->general->checkStatChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
function finishBattle(){
|
function finishBattle()
|
||||||
|
{
|
||||||
if ($this->isFinished) {
|
if ($this->isFinished) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -325,10 +358,10 @@ class WarUnitGeneral extends WarUnit{
|
|||||||
$this->checkStatChange();
|
$this->checkStatChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyDB(\MeekroDB $db):bool{
|
function applyDB(\MeekroDB $db): bool
|
||||||
|
{
|
||||||
$affected = $this->getGeneral()->applyDB($db);
|
$affected = $this->getGeneral()->applyDB($db);
|
||||||
$this->getLogger()->flush();
|
$this->getLogger()->flush();
|
||||||
return $affected;
|
return $affected;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -27,8 +27,10 @@ class che_계략발동 extends BaseWarUnitTrigger{
|
|||||||
[$magic, $damage] = $selfEnv['magic'];
|
[$magic, $damage] = $selfEnv['magic'];
|
||||||
|
|
||||||
$damage = $general->onCalcStat($general, 'warMagicFailDamage', $damage, $magic);
|
$damage = $general->onCalcStat($general, 'warMagicFailDamage', $damage, $magic);
|
||||||
|
$damage = $oppose->getGeneral()->onCalcOpposeStat($general, 'warMagicFailDamage', $damage, $magic);
|
||||||
$josaUl = \sammo\JosaUtil::pick($magic, '을');
|
$josaUl = \sammo\JosaUtil::pick($magic, '을');
|
||||||
|
|
||||||
|
|
||||||
$general->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>{$josaUl} <C>성공</>했다!", ActionLogger::PLAIN);
|
$general->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>{$josaUl} <C>성공</>했다!", ActionLogger::PLAIN);
|
||||||
$oppose->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>에 당했다!", ActionLogger::PLAIN);
|
$oppose->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>에 당했다!", ActionLogger::PLAIN);
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class che_계략시도 extends BaseWarUnitTrigger{
|
|||||||
$magicTrialProb *= $crewType->magicCoef;
|
$magicTrialProb *= $crewType->magicCoef;
|
||||||
|
|
||||||
$magicTrialProb = $general->onCalcStat($general, 'warMagicTrialProb', $magicTrialProb);
|
$magicTrialProb = $general->onCalcStat($general, 'warMagicTrialProb', $magicTrialProb);
|
||||||
|
$magicTrialProb = $oppose->getGeneral()->onCalcOpposeStat($general, 'warMagicTrialProb', $magicTrialProb);
|
||||||
|
|
||||||
if($magicTrialProb <= 0){
|
if($magicTrialProb <= 0){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -52,9 +54,7 @@ class che_계략시도 extends BaseWarUnitTrigger{
|
|||||||
|
|
||||||
$magicSuccessProb = 0.7;
|
$magicSuccessProb = 0.7;
|
||||||
$magicSuccessProb = $general->onCalcStat($general, 'warMagicSuccessProb', $magicSuccessProb);
|
$magicSuccessProb = $general->onCalcStat($general, 'warMagicSuccessProb', $magicSuccessProb);
|
||||||
if($self->hasActivatedSkill('계략약화')){
|
$magicSuccessProb = $oppose->getGeneral()->onCalcOpposeStat($general, 'warMagicSuccessProb', $magicSuccessProb);
|
||||||
$magicSuccessProb -= 0.1; //NOTE: 앞으로 이건 oppose의 onCalcStat에 들어가야하지 않을까?
|
|
||||||
}
|
|
||||||
|
|
||||||
if($oppose instanceof WarUnitCity){
|
if($oppose instanceof WarUnitCity){
|
||||||
$magic = Util::choiceRandom(array_keys(static::$tableToCity));
|
$magic = Util::choiceRandom(array_keys(static::$tableToCity));
|
||||||
@@ -66,6 +66,8 @@ class che_계략시도 extends BaseWarUnitTrigger{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$successDamage = $general->onCalcStat($general, 'warMagicSuccessDamage', $successDamage, $magic);
|
$successDamage = $general->onCalcStat($general, 'warMagicSuccessDamage', $successDamage, $magic);
|
||||||
|
$successDamage = $oppose->getGeneral()->onCalcOpposeStat($general, 'warMagicSuccessDamage', $successDamage, $magic);
|
||||||
|
|
||||||
|
|
||||||
$self->activateSkill('계략시도', $magic);
|
$self->activateSkill('계략시도', $magic);
|
||||||
if(Util::randBool($magicSuccessProb)){
|
if(Util::randBool($magicSuccessProb)){
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class che_계략실패 extends BaseWarUnitTrigger{
|
|||||||
[$magic, $damage] = $selfEnv['magic'];
|
[$magic, $damage] = $selfEnv['magic'];
|
||||||
|
|
||||||
$damage = $general->onCalcStat($general, 'warMagicFailDamage', $damage, $magic);
|
$damage = $general->onCalcStat($general, 'warMagicFailDamage', $damage, $magic);
|
||||||
|
$damage = $oppose->getGeneral()->onCalcOpposeStat($general, 'warMagicFailDamage', $damage, $magic);
|
||||||
$josaUl = \sammo\JosaUtil::pick($magic, '을');
|
$josaUl = \sammo\JosaUtil::pick($magic, '을');
|
||||||
|
|
||||||
$general->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>{$josaUl} <R>실패</>했다!", ActionLogger::PLAIN);
|
$general->getLogger()->pushGeneralBattleDetailLog("<D>{$magic}</>{$josaUl} <R>실패</>했다!", ActionLogger::PLAIN);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class che_반계시도 extends BaseWarUnitTrigger{
|
|||||||
|
|
||||||
public function __construct(WarUnit $unit, int $raiseType = 0, float $prob = 0.4){
|
public function __construct(WarUnit $unit, int $raiseType = 0, float $prob = 0.4){
|
||||||
$this->object = $unit;
|
$this->object = $unit;
|
||||||
|
$this->raiseType = $raiseType;
|
||||||
$this->prob = $prob;
|
$this->prob = $prob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class che_전투치료발동 extends BaseWarUnitTrigger{
|
|||||||
}
|
}
|
||||||
$selfEnv['치료발동'] = true;
|
$selfEnv['치료발동'] = true;
|
||||||
|
|
||||||
$oppose->getLogger()->pushGeneralBattleDetailLog("상대가 <C>치료</>했다!", ActionLogger::PLAIN);
|
$oppose->getLogger()->pushGeneralBattleDetailLog("상대가 <R>치료</>했다!", ActionLogger::PLAIN);
|
||||||
$self->getLogger()->pushGeneralBattleDetailLog("<C>치료</>했다!", ActionLogger::PLAIN);
|
$self->getLogger()->pushGeneralBattleDetailLog("<C>치료</>했다!", ActionLogger::PLAIN);
|
||||||
|
|
||||||
$oppose->multiplyWarPowerMultiply(0.5);
|
$oppose->multiplyWarPowerMultiply(0.5);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ interface iAction{
|
|||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float;
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float;
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null);
|
public function onCalcStat(General $general, string $statName, $value, $aux=null);
|
||||||
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null);
|
||||||
public function onCalcStrategic(string $turnType, string $varType, $value);
|
public function onCalcStrategic(string $turnType, string $varType, $value);
|
||||||
public function onCalcNationalIncome(string $type, $amount);
|
public function onCalcNationalIncome(string $type, $amount);
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"events":[
|
"events":[
|
||||||
[
|
[
|
||||||
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
||||||
["CreateManyNPC", 30],
|
["CreateManyNPC", 10, 10],
|
||||||
["DeleteEvent"]
|
["DeleteEvent"]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"events":[
|
"events":[
|
||||||
[
|
[
|
||||||
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
||||||
["CreateManyNPC", 30],
|
["CreateManyNPC", 10, 10],
|
||||||
["DeleteEvent"]
|
["DeleteEvent"]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"events":[
|
"events":[
|
||||||
[
|
[
|
||||||
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
||||||
["CreateManyNPC", 30],
|
["CreateManyNPC", 10, 10],
|
||||||
["DeleteEvent"]
|
["DeleteEvent"]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"title": "【가상모드19b】 진유저무쌍! (대형 지도)",
|
"title": "【가상모드19b】 진유저무쌍! (대형 지도)",
|
||||||
"startYear": 180,
|
"startYear": 180,
|
||||||
"history": [
|
"history": [
|
||||||
"<C>●</>180년 1월:<L><b>【가상모드19ㅠ】</b>진유저무쌍! (대형 지도)</>",
|
"<C>●</>180년 1월:<L><b>【가상모드19】</b>진유저무쌍! (대형 지도)</>",
|
||||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>고대장수 다 덤벼라! 유저가 최강이다!"
|
"<C>●</>180년 1월:<L><b>【이벤트】</b></>고대장수 다 덤벼라! 유저가 최강이다!"
|
||||||
],
|
],
|
||||||
"stat": {
|
"stat": {
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
{
|
||||||
|
"title": "【가상모드23】 CookieRun : Kingdom",
|
||||||
|
"startYear": 180,
|
||||||
|
"history": [
|
||||||
|
"<C>●</>180년 1월:<L><b>【가상모드23】</b>CookieRun : Kingdom</>",
|
||||||
|
"<C>●</>180년 1월:<L><b>【이벤트】</b></>쿠키들과 함께하는 삼모전"
|
||||||
|
],
|
||||||
|
"stat": {
|
||||||
|
"total": 200,
|
||||||
|
"min": 10,
|
||||||
|
"max": 90,
|
||||||
|
"npcTotal":180,
|
||||||
|
"npcMax":70,
|
||||||
|
"npcMin":10,
|
||||||
|
"chiefMin": 60
|
||||||
|
},
|
||||||
|
"iconPath": "쿠키런킹덤",
|
||||||
|
"fiction": 1,
|
||||||
|
"nation":[
|
||||||
|
|
||||||
|
],
|
||||||
|
"map":{
|
||||||
|
"mapName":"miniche",
|
||||||
|
"unitSet":"che"
|
||||||
|
},
|
||||||
|
"diplomacy":[],
|
||||||
|
"general":[
|
||||||
|
[30, "커스터드3세", null, 0, null, 60, 60, 60, 0, 160, 300, null, null, "새로운 백성이로구나. 반가워!"],
|
||||||
|
[30, "클로버", null, 0, null, 71, 49, 71, 0, 160, 300, null, null, "여러분의 모험에 행운이 깃들길..."],
|
||||||
|
[50, "마들렌", null, 0, null, 73, 57, 73, 0, 160, 300, null, null, "빛의 신께 세상을 구하라는 명을 받은 쿠키가 바로 나다!"],
|
||||||
|
[50, "호밀", null, 0, null, 73, 65, 65, 0, 160, 300, null, null, "애송이들! 그렇게 부드러워서야 되겠어?"],
|
||||||
|
[50, "에스프레소", null, 0, null, 75, 55, 75, 0, 160, 300, null, null, "커피마법이라고 다를 것 없습니다?"],
|
||||||
|
[50, "라떼", null, 0, null, 72, 58, 72, 0, 160, 300, null, null, "쓰디 쓴 실패라도 부드러운 우유 몇 방울이면 달콤해질거야"],
|
||||||
|
[50, "아몬드", null, 0, null, 69, 30, 100, 0, 160, 300, null, null, "당신을 마법 행정 규약 위반으로 체포합니다"],
|
||||||
|
[50, "블랙레이즌", null, 0, null, 65, 70, 60, 0, 160, 300, null, null, "깜깜한 어둠 속도 상관 없어. 난 전부 보이니까!"],
|
||||||
|
[60, "감초", null, 0, null, 70, 10, 120, 0, 160, 300, null, null, "나도 할 땐 하는 쿠키야!"],
|
||||||
|
[60, "독버섯", null, 0, null, 70, 60, 70, 0, 160, 300, null, null, "버서엇...?"],
|
||||||
|
[60, "딸기크레페", null, 0, null, 70, 60, 70, 0, 160, 300, null, null],
|
||||||
|
[70, "퓨어바닐라", null, 0, null, 90, 45, 90, 0, 160, 300, null, null, "힘들 땐 힘들다고 말해도 괜찮아요."],
|
||||||
|
[60, "다크초코", null, 0, null, 70, 60, 70, 0, 160, 300, null, null, "그저… 영웅이 되고 싶었을 뿐…"],
|
||||||
|
[60, "석류", null, 0, null, 75, 55, 75, 0, 160, 300, null, null, "영원히 그분만을 섬기리…"],
|
||||||
|
[999, "설탕노움", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[10, "The브레이브", null, 0, null, 69, 51, 69, 0, 160, 300, null, null, "모험은 이제부터 시작이야!"],
|
||||||
|
[10, "스트로베리", null, 0, null, 70, 50, 70, 0, 160, 300, null, null, "쿠키생은 혼자야…"],
|
||||||
|
[10, "매지션", null, 0, null, 66, 54, 66, 0, 160, 300, null, null, "가슴은 뜨겁게 머리는 앗 차거!"],
|
||||||
|
[10, "에인절", null, 0, null, 63, 57, 63, 0, 160, 300, null, null, "새처럼 날아가 볼까요…"],
|
||||||
|
[10, "비트", null, 0, null, 64, 56, 64, 0, 160, 300, null, null, "벌써 이곳에서 1000일을 버텼지!"],
|
||||||
|
[10, "The머슬", null, 0, null, 70, 50, 70, 0, 160, 300, null, null, "이번엔 스쿼트다! 하나! 둘!"],
|
||||||
|
[10, "닌자", null, 0, null, 63, 57, 63, 0, 160, 300, null, null, "허공을 가르고 바람을 밟는다!"],
|
||||||
|
[30, "용사", null, 0, null, 67, 58, 67, 0, 160, 300, null, null, "더 강해져야 해!"],
|
||||||
|
[30, "알케미스트", null, 0, null, 61, 64, 61, 0, 160, 300, null, null, "내가 어떤 걸 만들어 내는지 잘 보라구~!"],
|
||||||
|
[30, "체리", null, 0, null, 66, 59, 66, 0, 160, 300, null, null, "어랏? 터져버렸네~? 미안...일부러 그랬어~ 헤헷!"],
|
||||||
|
[30, "버블껌", null, 0, null, 65, 60, 65, 0, 160, 300, null, null, "껌은 씹는 것 보다 쏘는 게 더 재밌어!"],
|
||||||
|
[30, "블랙베리", null, 0, null, 65, 60, 65, 0, 160, 300, null, null, "맡기실 일이 있다면 뭐든 말씀하세요."],
|
||||||
|
[30, "팬케이크", null, 0, null, 52, 73, 52, 0, 160, 300, null, null, "나 도토리젤리 안 줄 거야?"],
|
||||||
|
[30, "The프린세스", null, 0, null, 60, 65, 60, 0, 160, 300, null, null, "나들이하기 좋은 날이네~!"],
|
||||||
|
[30, "아보카도", null, 0, null, 67, 58, 67, 0, 160, 300, null, null, "가장 맛있는 싸움은? 보쌈! 와하하!"],
|
||||||
|
[30, "어니언", null, 0, null, 72, 53, 72, 0, 160, 300, null, null, "으아아아아앙~"],
|
||||||
|
[30, "익스플로러", null, 0, null, 65, 60, 65, 0, 160, 300, null, null, "가보고 싶은 곳이 너무 많아!"],
|
||||||
|
[30, "캐롯", null, 0, null, 71, 54, 71, 0, 160, 300, null, null, "밭일하러 나갈 시간이야!"],
|
||||||
|
[60, "뱀파이어", null, 0, null, 58, 72, 58, 0, 160, 300, null, null, "나랑 포도주스 한 잔 어때?"],
|
||||||
|
[50, "스파클링", null, 0, null, 70, 60, 70, 0, 160, 300, null, null, "승리를 위한 한 잔이 필요하겠군요!"],
|
||||||
|
[50, "칠리", null, 0, null, 65, 65, 65, 0, 160, 300, null, null, "어이! 주머니 조심하라구!"],
|
||||||
|
[50, "자색고구마", null, 0, null, 65, 65, 65, 0, 160, 300, null, null, "나랑 싸울 쿠키 다 나와!"],
|
||||||
|
[50, "눈설탕", null, 0, null, 79, 51, 79, 0, 160, 300, null, null, "안녕? 반가워~ 나랑... 눈싸움할래?"],
|
||||||
|
[50, "정글전사", null, 0, null, 80, 50, 80, 0, 160, 300, null, null, "친구…들을… 지켜야… 해…"],
|
||||||
|
[50, "민트초코", null, 0, null, 76, 54, 76, 0, 160, 300, null, null, "어떤 음악을 들려드릴까요?"],
|
||||||
|
[50, "허브", null, 0, null, 71, 59, 71, 0, 160, 300, null, null, "무럭무럭 자라렴~"],
|
||||||
|
[50, "우유", null, 0, null, 72, 58, 72, 0, 160, 300, null, null, "평화를 위해 어둠과 맞서 싸우리라!"],
|
||||||
|
[50, "웨어울프", null, 0, null, 72, 58, 72, 0, 160, 300, null, null, "다가오지 마… 다쳐…"],
|
||||||
|
[50, "구미호", null, 0, null, 72, 58, 72, 0, 160, 300, null, null, "나한테 반하면 어떻게 되는지 궁금해?"],
|
||||||
|
[50, "슈크림", null, 0, null, 71, 59, 71, 0, 160, 300, null, null, "저도 이제 어엿한 마법사라구요!"],
|
||||||
|
[150, "케이크들개", null, 0, null, 40, 80, 40, 0, 160, 300, null, null],
|
||||||
|
[999, "곰젤리", null, 0, null, 40, 80, 40, 0, 160, 300, null, null],
|
||||||
|
[999, "곰젤리역장", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "후르츠칸앵무", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "순례자", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "은행강도", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "무녀", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[150, "역사선생님", null, 0, null, 85, 45, 85, 0, 160, 300, null, null, "오늘 확실히 가르쳐 주겠습니다! 도서관의 규칙을!"],
|
||||||
|
[150, "화학선생님", null, 0, null, 85, 45, 85, 0, 160, 300, null, null, "화학실에 멋대로 침입한 벌을 내리겠다!!"],
|
||||||
|
[150, "전술선생님", null, 0, null, 85, 45, 85, 0, 160, 300, null, null, "으하하하!! 그럼 어디 한 번 시험해 볼까! 너의 전술을!"],
|
||||||
|
[150, "꿈꾸는 바할로모트", null, 0, null, 90, 40, 90, 0, 160, 300, null, "환술", "난 이 학교의 교장이니까 말일세!"],
|
||||||
|
[999, "치료사", null, 0, null, 65, 55, 65, 0, 160, 300, null, null],
|
||||||
|
[999, "커스터드총리", null, 0, null, 63, 63, 63, 0, 160, 300, null, null],
|
||||||
|
[150, "3단케이크마녀", null, 0, null, 70, 70, 70, 0, 160, 300, null, null]
|
||||||
|
],
|
||||||
|
"general_ex":[
|
||||||
|
[999, "바람궁수", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "달빛술사", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "바다요정", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "불꽃정령", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[150, "어둠마녀", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "천년나무", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "다크카카오", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "세인트릴리", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "홀리베리", null, 0, null, 60, 60, 60, 0, 160, 300, null, null],
|
||||||
|
[999, "골드치즈", null, 0, null, 60, 60, 60, 0, 160, 300, null, null]
|
||||||
|
],
|
||||||
|
"events":[
|
||||||
|
[
|
||||||
|
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
|
||||||
|
["CreateManyNPC", 10, 10],
|
||||||
|
["DeleteEvent"]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
["Date", "==", 181, 1],
|
||||||
|
["RaiseNPCNation"],
|
||||||
|
["DeleteEvent"]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
"events":[
|
"events":[
|
||||||
[
|
[
|
||||||
["Date", "==", null, 12],
|
["Date", "==", null, 12],
|
||||||
["CreateManyNPC", 30],
|
["CreateManyNPC", 10, 10],
|
||||||
["DeleteEvent"]
|
["DeleteEvent"]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"events": [
|
"events": [
|
||||||
[
|
[
|
||||||
["Date", "==", null, 12],
|
["Date", "==", null, 12],
|
||||||
["CreateManyNPC", 100],
|
["CreateManyNPC", 100, 0],
|
||||||
["DeleteEvent"]
|
["DeleteEvent"]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
+16
-1
@@ -10,6 +10,7 @@ html {
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: 삭제!!
|
||||||
table.tb_layout {
|
table.tb_layout {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
@@ -17,7 +18,8 @@ table.tb_layout {
|
|||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
html, body{
|
html,
|
||||||
|
body {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,3 +39,16 @@ html, body{
|
|||||||
.float-right {
|
.float-right {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.a-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.a-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.a-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user