diff --git a/hwe/func_command.php b/hwe/func_command.php
index 7b8013b1..35aed69c 100644
--- a/hwe/func_command.php
+++ b/hwe/func_command.php
@@ -225,7 +225,7 @@ function checkCommandArg(?array $arg):?string{
['crewType', 0]
],
'integerArray'=>[
- 'destNationIDList', 'destGeneralIDList'
+ 'destNationIDList', 'destGeneralIDList', 'amountList'
],
'stringWidthBetween'=>[
['nationName', 1, 18]
diff --git a/hwe/js/processing.js b/hwe/js/processing.js
index 8179d352..55884bd0 100644
--- a/hwe/js/processing.js
+++ b/hwe/js/processing.js
@@ -48,7 +48,7 @@ window.submitAction = function(){
'isGold', 'buyRice',
],
'integerArray':[
- 'destNationIDList', 'destGeneralIDList'
+ 'destNationIDList', 'destGeneralIDList', 'amountList'
]
}
diff --git a/hwe/sammo/ActionLogger.php b/hwe/sammo/ActionLogger.php
index 3b42c23b..ebba3c88 100644
--- a/hwe/sammo/ActionLogger.php
+++ b/hwe/sammo/ActionLogger.php
@@ -171,7 +171,7 @@ class ActionLogger{
$this->generalBattleDetailLog[] = $text;
}
- public function pushNationalHistoryLog($text, int $formatType = self::RAWTEXT){
+ public function pushNationalHistoryLog($text, int $formatType = self::YEAR_MONTH){
if(!$text){
return;
}
diff --git a/hwe/sammo/Command/General/che_군량매매.php b/hwe/sammo/Command/General/che_군량매매.php
index 9be9e791..8c9cb4db 100644
--- a/hwe/sammo/Command/General/che_군량매매.php
+++ b/hwe/sammo/Command/General/che_군량매매.php
@@ -38,7 +38,7 @@ class che_군량매매 extends Command\GeneralCommand{
if(!is_int($amount)){
return false;
}
- $amount = Util::valueFit($amount, 100, 10000);
+ $amount = Util::valueFit($amount, 100, GameConst::$maxIncentiveAmount);
$this->arg = [
'buyRice'=>$buyRice,
@@ -184,28 +184,9 @@ class che_군량매매 extends Command\GeneralCommand{
쌀
쌀
$destGeneral['rice']
];
}
-
- $amountList = [
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
- 12, 15, 20, 25,
- 30, 40, 50, 60, 70, 80, 90, 100
- ];
ob_start();
?>
장수의 자금이나 군량을 몰수합니다.
@@ -235,8 +229,8 @@ class che_몰수 extends Command\NationCommand{
diff --git a/hwe/sammo/Command/Nation/che_선전포고.php b/hwe/sammo/Command/Nation/che_선전포고.php
index 1fbf4bfd..2d9bbd2e 100644
--- a/hwe/sammo/Command/Nation/che_선전포고.php
+++ b/hwe/sammo/Command/Nation/che_선전포고.php
@@ -228,6 +228,7 @@ class che_선전포고 extends Command\NationCommand{
style='color:=$nation['color']?>;=$nation['availableWar']?'':'background-color:red;'?>'
>【=$nation['name']?> 】
+
arg === null){
+ return false;
+ }
+
+ if(!key_exists('destNationID', $this->arg)){
+ return false;
+ }
+ $destNationID = $this->arg['destNationID'];
+ if(!is_int($destNationID)){
+ return false;
+ }
+ if($destNationID < 1){
+ return false;
+ }
+
+ if(!key_exists('amountList', $this->arg)){
+ return false;
+ }
+ $amountList = $this->arg['amountList'];
+ if(!is_array($amountList)){
+ return false;
+ }
+
+ if(count($amountList) != 2){
+ return false;
+ }
+
+ [$goldAmount, $riceAmount] = $amountList;
+
+ if(!is_int($goldAmount) || !is_int($riceAmount)){
+ return false;
+ }
+ if($goldAmount < 0 || $riceAmount < 0){
+ return false;
+ }
+ if($goldAmount == 0 && $riceAmount == 0){
+ return false;
+ }
+
+ $this->arg = [
+ 'destNationID'=>$destNationID,
+ 'amountList'=>[$goldAmount, $riceAmount]
+ ];
+ return true;
+ }
+
+ protected function init(){
+ $general = $this->generalObj;
+
+ $this->setCity();
+ $this->setNation(['gold', 'rice', 'surlimit']);
+
+ $destNationID = $this->arg['destNationID'];
+ $this->setDestNation($destNationID, ['gold', 'rice', 'surlimit']);
+
+ [$goldAmount, $riceAmount] = $this->arg['amountList'];
+ $limit = $this->nation['level'] * GameConst::$coefAidAmount;
+
+ if($goldAmount > $limit || $riceAmount > $limit){
+ $this->runnableConstraints[
+ ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')
+ ];
+ return;
+ }
+
+ $this->runnableConstraints=[
+ ConstraintHelper::ExistsDestNation(),
+ ConstraintHelper::OccupiedCity(),
+ ConstraintHelper::BeChief(),
+ ConstraintHelper::SuppliedCity(),
+ ConstraintHelper::ReqNationGold(GameConst::$basegold+($goldAmount>0)?1:0),
+ ConstraintHelper::ReqNationRice(GameConst::$baserice+($riceAmount>0)?1:0),
+ ConstraintHelper::ReqNationValue('surlimit', '외교제한', '==', 0, '외교제한중입니다.'),
+ ConstraintHelper::ReqDestNationValue('surlimit', '외교제한', '==', 0, '상대국이 외교제한중입니다.'),
+ ];
+ }
+
+ public function getCost():array{
+ return [0, 0];
+ }
+
+ public function getPreReqTurn():int{
+ return 0;
+ }
+
+ public function getPostReqTurn():int{
+ return 12;
+ }
+
+ public function getBrief():string{
+ [$goldAmount, $riceAmount] = $this->arg['amountList'];
+ $goldAmountText = number_format($goldAmount);
+ $riceAmountText = number_format($riceAmount);
+ $destNationName = $this->destNation['name'];
+ $commandName = $this->getName();
+ return "【{$destNationName}】에게 국고 {$goldAmountText} 병량 {$riceAmountText} {$commandName}";
+ }
+
+
+ public function run():bool{
+ if(!$this->isRunnable()){
+ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
+ }
+
+ $db = DB::db();
+
+ $general = $this->generalObj;
+ $generalID = $general->getID();
+ $date = $general->getTurnTime($general::TURNTIME_HM);
+
+ $nation = $this->nation;
+ $nationID = $nation['nation'];
+ $nationName = $nation['name'];
+
+ $destNationID = $this->destNation['nation'];
+ $destNationName = $this->destNation['name'];
+
+
+ [$goldAmount, $riceAmount] = $this->arg['amountList'];
+
+
+ $goldAmount = Util::valueFit(
+ $goldAmount,
+ 0,
+ $nation['gold'] - GameConst::$basegold
+ );
+
+ $riceAmount = Util::valueFit(
+ $riceAmount,
+ 0,
+ $nation['rice'] - GameConst::$baserice
+ );
+
+ $goldAmountText = number_format($goldAmount);
+ $riceAmountText = number_format($riceAmount);
+
+
+ $logger = $general->getLogger();
+
+ $year = $this->env['year'];
+ $month = $this->env['month'];
+
+
+
+ $josaRo = JosaUtil::pick($destNationName, '로');
+
+
+
+ $broadcastMessage = "{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>을 지원했습니다.";
+
+ $chiefList = $db->queryFirstColumn('SELECT no FROM general WHERE level >= 5 AND no != %i AND nation = %i', $generalID, $nationID);
+ foreach($chiefList as $chiefID){
+ $chiefLogger = new ActionLogger($chiefID, $nationID, $year, $month);
+ $chiefLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN);
+ $chiefLogger->flush();
+ }
+
+ $logger->pushGeneralHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>을 지원");
+ $logger->pushNationalHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>을 지원");
+ $logger->pushGlobalHistoryLog("【원조】>{$nationName}>에서 {$destNationName}>{$josaRo} 물자를 지원합니다");
+
+ $logger->pushGeneralActionLog($broadcastMessage);
+ $logger->pushGeneralActionLog("{$destNationName}>{$josaRo} 물자를 지원합니다. <1>$date>", ActionLogger::PLAIN);
+
+ $destBroadcastMessage = $broadcastMessage = "{$nationName}>에서 금{$goldAmountText}> 쌀{$riceAmountText}>을 원조했습니다.";
+ $destChiefList = $db->queryFirstColumn('SELECT no FROM general WHERE level >= 5 AND nation = %i', $destNationID);
+ foreach($destChiefList as $destChiefID){
+ $destChiefLogger = new ActionLogger($destChiefID, $nationID, $year, $month);
+ $destChiefLogger->pushGeneralActionLog($destBroadcastMessage, ActionLogger::PLAIN);
+ $destChiefLogger->flush();
+ }
+
+ $josaRoSrc = JosaUtil::pick($nationName, '로');
+ $destNationLogger = new ActionLogger(0, $destChiefID, $year, $month);
+ $destNationLogger->pushNationalHistoryLog("{$nationName}>{$josaRoSrc}부터 금{$goldAmountText}> 쌀{$riceAmountText}>을 지원 받음");
+
+
+
+ $db->update('nation', [
+ 'gold'=>$db->sqleval('gold - %i', $goldAmount),
+ 'rice'=>$db->sqleval('rice - %i', $riceAmount),
+ 'surlimit'=>$db->sqleval('surlimit + %i', 12)
+ ], 'nation = %i', $nationID);
+
+ $db->update('nation', [
+ 'gold'=>$db->sqleval('gold + %i', $goldAmount),
+ 'rice'=>$db->sqleval('rice + %i', $riceAmount),
+ ], 'nation = %i', $destNationID);
+
+ $general->increaseVar('experience', $general->onCalcStat($general, 'experience', 5));
+ $general->increaseVar('dedication', $general->onCalcStat($general, 'dedication', 5));
+
+
+ $general->applyDB($db);
+
+ return true;
+ }
+
+ public function getJSFiles(): array
+ {
+ return [
+ 'js/defaultSelectNationByMap.js'
+ ];
+ }
+
+
+ public function getForm(): string
+ {
+ $currentNationLevel = getNationStaticInfo($this->generalObj->getNationID())['level'];
+ ob_start();
+?>
+=\sammo\getMapHtml()?>
+타국에게 원조합니다.
+작위별로 금액 제한이 있습니다.
+ [$levelText,,]): ?>
+=StringUtil::padStringAlignRight($levelText, 10)?>: =number_format($level*GameConst::$coefAidAmount)?>
+
+원조할 국가를 목록에서 선택하세요.
+
+국고
+병량
+
+
+$destGeneral['rice']
];
}
-
- $amountList = [
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
- 12, 15, 20, 25,
- 30, 40, 50, 60, 70, 80, 90, 100
- ];
ob_start();
?>
국고로 장수에게 자금이나 군량을 지급합니다.
@@ -203,8 +197,8 @@ class che_포상 extends Command\NationCommand{
diff --git a/hwe/sammo/GameConstBase.php b/hwe/sammo/GameConstBase.php
index ae3b2964..b7500e14 100644
--- a/hwe/sammo/GameConstBase.php
+++ b/hwe/sammo/GameConstBase.php
@@ -111,6 +111,17 @@ class GameConstBase
/** @var int 시작시 쌀 */
public static $defaultRice = 1000;
+ /** @var int 원조 계수 */
+ public static $coefAidAmount = 10000;
+
+ /** @var int 최대 개별 자원 금액 */
+ public static $maxResourceActionAmount = 10000;
+ /** @var int[] 포상/몰수 가이드 금액 */
+ public static $resourceActionAmountGuide = [
+ 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
+ 1200, 1500, 2000, 2500, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000
+ ];
+
public static $generalMinimumGold = 0;
public static $generalMinimumRice = 500;
diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php
index e293ec9d..65e73ada 100644
--- a/hwe/sammo/GeneralAI.php
+++ b/hwe/sammo/GeneralAI.php
@@ -698,7 +698,7 @@ class GeneralAI{
if((($isWarUser || $resName == 'gold') && $compUser->$resName < 21000) || ($compUser->$resName < 5000)){
if($work){
//TODO: 새로 구현한 코드로 이전
- $amount = min(10000, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 3000)*1000 + 1000);
+ $amount = min(GameConst::$maxIncentiveAmount, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 3000)*1000 + 1000);
$commandList[] = [['che_포상', [
'destGeneralID'=>$userGenerals[0]->no,
'isGold'=>$resName=='gold',
@@ -706,7 +706,7 @@ class GeneralAI{
]], 10]; // 금,쌀 1000단위 포상
}
else{
- $amount = min(10000, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*1000 + 1000);
+ $amount = min(GameConst::$maxIncentiveAmount, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*1000 + 1000);
$commandList[] = [['che_포상', [
'destGeneralID'=>$userGenerals[0]->no,
'isGold'=>$resName=='gold',
@@ -1130,10 +1130,10 @@ class GeneralAI{
}
if($general->getVar('gold') >= $general->getVar('rice')){
- return ['che_헌납', ['isGold'=>true, 'amount'=>10000]];
+ return ['che_헌납', ['isGold'=>true, 'amount'=>GameConst::$maxResourceActionAmount]];
}
else{
- return ['che_헌납', ['isGold'=>false, 'amount'=>10000]];
+ return ['che_헌납', ['isGold'=>false, 'amount'=>GameConst::$maxResourceActionAmount]];
}
}