Compare commits

...
16 Commits
Author SHA1 Message Date
devsamanddevsam e2e578e485 game: 내정이라는 용어의 중의성 해소를 위해, 국가 성향의 내정이란 용어를 농상으로 바꾸고, 물자조달 커맨드를 내정의 하위 분류에서 국가로 이동 2024-02-29 08:09:23 +09:00
Hide_D bb26366769 fix: 이민족 발동 시 이성이 수도인 경우 문제 해결 2024-02-26 16:05:37 +00:00
Hide_D 71849a457b game: 종횡가의 전략 디메리트 감소
- 전략 쿨타임 2배 -> 4/3배
2024-02-26 16:01:16 +00:00
Hide_D 7c1a8d96a2 fix: 정규턴에 어긋나는 개인턴, 사령턴을 보정
- 조회시에만 사용
2024-02-26 15:58:41 +00:00
Hide_D cebd152daf fix: 경매장 소수점 제거 2024-02-26 15:43:07 +00:00
Hide_D 2ca03389d2 fix: 유니크 경매 항목 변경시 금액이 자동 조절되도록 수정
- 굳이 기존 값을 남길 이유가 없어보임
2024-02-24 15:14:24 +00:00
Hide_D cacf0981ce game: 턴 시간과 도시 지정을 같이 가능하도록 변경 2024-02-24 12:05:49 +00:00
Hide_D bcf5b5cb7d game: 턴 지정 단위를 1/30에서 1/60으로 변경 2024-02-24 11:46:32 +00:00
Hide_D 66b2f1a8f2 game: NPC는 건국 한턴 기다림 2024-02-24 11:45:08 +00:00
Hide_D 40ecca5440 game, feat: 커맨드마다 다른 랜덤값으로 유니크 시도
- 사전 거병 후 개인 턴일 때, 유니크 중복이 발생하는 경우가 있었음
2024-02-24 11:28:38 +00:00
Hide_D a96c2312d0 game, feat: 턴 시간 지정 방식을 30단계 중 선택하도록 변경
- 1분서버인 경우 120초 단위로
- 유산포인트 3000 -> 2500
2024-02-24 11:21:04 +00:00
Hide_D faff3f4e6a JSON -> Json
- 대체 왜 어떤 파일에는 에러가 나지 않았는가
2024-02-20 18:45:40 +09:00
Hide_D 83abf44380 feat: 유저의 제재 목록을 장수 생성/빙의시 가져옴 2024-02-18 03:24:21 +00:00
Hide_D e83960d67f fix: 사전거병시 삭턴 정상 반영 2024-02-18 03:10:42 +00:00
Hide_D c6b2e64c05 penalty에 sendPrivateMsgDelay추가 2024-02-18 03:08:21 +00:00
Hide_D 029f719112 fix: 스탯 계산 시에 캐시 사용하는 부분 수정 시도 (#241)
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/241
2024-02-17 00:01:49 +09:00
54 changed files with 252 additions and 196 deletions
+2 -2
View File
@@ -1054,10 +1054,10 @@ function increaseRefresh($type = "", $cnt = 1)
'ip' => $ip,
'date' => $date,
'path' => "refresh",
'arg' => JSON::encode([
'arg' => Json::encode([
'type' => $type,
]),
'aux' => JSON::encode([
'aux' => Json::encode([
'generalID' => $generalID,
'generalName' => $session->generalName,
'userName' => $session->userName,
+2 -2
View File
@@ -213,7 +213,7 @@ function _setGeneralCommand(GeneralCommand $command, array $turnList):void {
$db->update('general_turn', [
'action'=>$commandName,
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'general_id = %i AND turn_idx IN %li', $generalID, $turnList);
}
@@ -233,7 +233,7 @@ function _setNationCommand(NationCommand $command, array $turnList):void {
$db->update('nation_turn', [
'action'=>$commandName,
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'nation_id = %i AND officer_level = %i AND turn_idx IN %li', $nationID, $officerLevel, $turnList);
}
+15 -4
View File
@@ -899,7 +899,7 @@ function checkEmperior()
'tiger' => $tigerstr,
'eagle' => $eaglestr,
'gen' => $gen,
'history' => JSON::encode($nationHistory),
'history' => Json::encode($nationHistory),
'aux' => $statGeneral['aux']
]);
@@ -951,8 +951,19 @@ function updateMaxDomesticCritical(General $general, $score)
}
}
function genGenericUniqueRNG(int $year, int $month, int $generalID): RandUtil
function genGenericUniqueRNG(int $year, int $month, int $generalID, ?string $reason = null): RandUtil
{
if($reason){
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'unique',
$year,
$month,
$generalID,
$reason
)));
}
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'unique',
@@ -962,7 +973,7 @@ function genGenericUniqueRNG(int $year, int $month, int $generalID): RandUtil
)));
}
function genGenericUniqueRNGFromGeneral(General $general): RandUtil
function genGenericUniqueRNGFromGeneral(General $general, string $reason): RandUtil
{
$logger = $general->getLogger();
if (!$logger) {
@@ -971,5 +982,5 @@ function genGenericUniqueRNGFromGeneral(General $general): RandUtil
$year = $logger->getYear();
$month = $logger->getMonth();
$generalID = $general->getID();
return genGenericUniqueRNG($year, $month, $generalID);
return genGenericUniqueRNG($year, $month, $generalID, $reason);
}
+8 -3
View File
@@ -27,14 +27,18 @@ $rootDB = RootDB::db();
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$userNick = RootDB::db()->queryFirstField('SELECT `NAME` FROM member WHERE `NO`=%i',$userID);
if(!$userNick){
$member = $rootDB->queryFirstRow('SELECT `name`, `penalty` FROM member WHERE `NO`=%i', $userID);
if(!$member){
Json::die([
'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.'
]);
}
$userNick = $member['name'];
$memberPenalty = Json::decode($member['penalty'] ?? '{}');
$penalty = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefix()] ?? []);
$pickResult = $db->queryFirstField('SELECT pick_result FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%s', $userID, $now);
if(!$pickResult){
Json::die([
@@ -86,7 +90,8 @@ $db->update('general', [
'defence_train'=>80,
'permission'=>'normal',
'owner'=>$userID,
'aux'=>Json::encode($genAux)
'aux'=>Json::encode($genAux),
'penalty'=>Json::encode($penalty),
], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
$db->insertIgnore('general_access_log', [
GeneralAccessLogColumn::generalID->value => $pick,
@@ -6,6 +6,7 @@ use sammo\Session;
use DateTimeInterface;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\GameConst;
use sammo\Json;
use sammo\KVStorage;
use sammo\TimeUtil;
@@ -32,8 +33,18 @@ class GetReservedCommand extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env');
$generalID = $session->generalID;
$invalidTurnList = 0;
$rawTurn = $db->queryAllLists('SELECT turn_idx, action, arg, brief FROM general_turn WHERE general_id = %i ORDER BY turn_idx ASC', $generalID);
foreach ($rawTurn as [$turn_idx, $action, $arg, $brief]) {
if($turn_idx < 0) {
$invalidTurnList = -1;
$turn_idx += GameConst::$maxTurn;
}
else if($turn_idx >= GameConst::$maxTurn) {
$invalidTurnList = 1;
$turn_idx -= GameConst::$maxTurn;
}
$commandList[$turn_idx] = [
'action' => $action,
'brief' => $brief,
@@ -41,6 +52,19 @@ class GetReservedCommand extends \sammo\BaseAPI
];
}
if($invalidTurnList != 0){
if($invalidTurnList > 0){
$db->update('general_turn', [
'turn_idx' => $db->sqleval('turn_idx - %i', GameConst::$maxTurn)
], 'general_id=%i AND turn_idx >= %i', $generalID, GameConst::$maxTurn);
}
else{
$db->update('general_turn', [
'turn_idx' => $db->sqleval('turn_idx + %i', GameConst::$maxTurn)
], 'general_id=%i AND turn_idx < 0', $generalID);
}
}
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
@@ -90,8 +90,8 @@ class BuildNationCandidate extends \sammo\BaseAPI
return '거병을 실패했습니다.';
}
$general->setVar('killturn', $env['killturn']);
$general->applyDB($db);
$generalObj->setVar('killturn', $env['killturn']);
$generalObj->applyDB($db);
return null;
}
+15 -12
View File
@@ -54,7 +54,7 @@ class Join extends \sammo\BaseAPI
'leadership',
'strength',
'intel',
'inheritTurntime',
'inheritTurntimeZone',
])
->rule('boolean', [
'pic'
@@ -72,7 +72,8 @@ class Join extends \sammo\BaseAPI
], GameConst::$defaultStatMax)
->rule('in', 'character', array_merge(GameConst::$availablePersonality, ['Random']))
->rule('in', 'inheritSpecial', GameConst::$availableSpecialWar)
->rule('min', 'inheritTurntime', 0)
->rule('min', 'inheritTurntimeZone', 0)
->rule('max', 'inheritTurntimeZone', 59)
->rule('in', 'inheritCity', array_keys(CityConst::all()))
->rule('integerArray', 'inheritBonusStat');
@@ -139,22 +140,21 @@ class Join extends \sammo\BaseAPI
$intel = $this->args['intel'];
$inheritSpecial = $this->args['inheritSpecial'] ?? null;
$inheritTurntime = $this->args['inheritTurntime'] ?? null;
$inheritTurntimeZone = $this->args['inheritTurntimeZone'] ?? null;
$inheritCity = $this->args['inheritCity'] ?? null;
$inheritBonusStat = $this->args['inheritBonusStat'] ?? null;
if ($inheritTurntime !== null && $inheritCity !== null) {
return '턴과 도시를 동시에 지정할 수 없습니다.';
}
$rootDB = RootDB::db();
//회원 테이블에서 정보확인
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID);
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr, `penalty` FROM member WHERE no=%i', $userID);
if (!$member) {
return "잘못된 접근입니다!!!";
}
$memberPenalty = Json::decode($member['penalty'] ?? "{}");
$penalty = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefix()] ?? []);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['year', 'month', 'maxgeneral', 'scenario', 'show_img_level', 'block_general_create', 'turnterm', 'turntime', 'genius', 'npcmode']);
@@ -232,7 +232,7 @@ class Join extends \sammo\BaseAPI
if ($inheritSpecial !== null) {
$inheritRequiredPoint += GameConst::$inheritBornSpecialPoint;
}
if ($inheritTurntime !== null) {
if ($inheritTurntimeZone !== null) {
$inheritRequiredPoint += GameConst::$inheritBornTurntimePoint;
}
@@ -347,12 +347,14 @@ class Join extends \sammo\BaseAPI
$experience *= 0.8;
}
if ($inheritTurntime !== null) {
$inheritTurntime = $inheritTurntime % ($admin['turnterm'] * 60);
if ($inheritTurntimeZone !== null) {
$inheritTurntime = $inheritTurntimeZone * $admin['turnterm'];
$inheritTurntime += $rng->nextRangeInt(0, Util::clamp($admin['turnterm'] - 1, 0));
$userLogger->push(sprintf("턴 시간 %02d:%02d 로 지정", intdiv($inheritTurntime, 60), $inheritTurntime % 60), "inheritPoint");
$inheritTurntime += $rng->nextRangeInt(0, 999999) / 1000000;
$turntime = new \DateTimeImmutable(cutTurn($admin['turntime'], $admin['turnterm']));
$turntime = $turntime->add(TimeUtil::secondsToDateInterval($inheritTurntime));
$turntime = TimeUtil::format($turntime, true);
@@ -424,7 +426,8 @@ class Join extends \sammo\BaseAPI
'specage' => $specage,
'special' => $special,
'specage2' => $specage2,
'special2' => $special2
'special2' => $special2,
'penalty' => Json::encode($penalty),
]);
$generalID = $db->insertId();
$db->insert('general_access_log', [
+8 -2
View File
@@ -7,9 +7,11 @@ use DateTimeInterface;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\MessageType;
use sammo\Json;
use sammo\Message;
use sammo\MessageTarget;
use sammo\Validator;
use sammo\Util;
use function sammo\checkLimit;
use function sammo\checkSecretPermission;
@@ -170,6 +172,8 @@ class SendMessage extends \sammo\BaseAPI
return '장수가 없습니다.';
}
$penalty = Json::decode($me['penalty'] ?? '{}');
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
return '접속 제한입니다.';
@@ -226,8 +230,10 @@ class SendMessage extends \sammo\BaseAPI
$now = new \DateTime();
$lastMsg = new \DateTime($session->lastMsg ?? '0000-00-00');
$msg_interval = $now->getTimestamp() - $lastMsg->getTimestamp();
if ($msg_interval < 2) {
return '개인메세지는 2초당 1건만 보낼 수 있습니다!';
$msg_min_interval = $penalty['sendPrivateMsgDelay'] ?? 2;
if ($msg_interval < $msg_min_interval) {
return "개인메세지는 {$msg_min_interval}초당 1건만 보낼 수 있습니다!";
}
$session->lastMsg = $now->format('Y-m-d H:i:s');
+1 -1
View File
@@ -313,7 +313,7 @@ class GeneralList extends \sammo\BaseAPI
foreach ($rawGeneralList as $rawGeneral) {
//General 생성?
if (key_exists('aux', $rawGeneral)) {
$rawGeneral['aux'] = \sammo\JSON::decode($rawGeneral['aux']);
$rawGeneral['aux'] = \sammo\Json::decode($rawGeneral['aux']);
}
$item = [];
@@ -73,6 +73,11 @@ class GetReservedCommand extends \sammo\BaseAPI
}
$nationTurnList = [];
//혹시 정규 턴을 벗어난 턴이 있는지 체크
$invalidUnderTurnList = [];
$invalidOverTurnList = [];
foreach ($db->queryAllLists(
'SELECT officer_level, turn_idx, action, arg, brief FROM nation_turn WHERE nation_id = %i ORDER BY officer_level DESC, turn_idx ASC',
$me['nation']
@@ -80,6 +85,14 @@ class GetReservedCommand extends \sammo\BaseAPI
if (!key_exists($officer_level, $nationTurnList)) {
$nationTurnList[$officer_level] = [];
}
if($turn_idx < 0){
$invalidUnderTurnList[$officer_level] = $turn_idx;
$turn_idx += GameConst::$maxChiefTurn;
}
else if($turn_idx >= GameConst::$maxChiefTurn){
$invalidOverTurnList[$officer_level] = $turn_idx;
$turn_idx -= GameConst::$maxChiefTurn;
}
$nationTurnList[$officer_level][$turn_idx] = [
'action' => $action,
'brief' => $brief,
@@ -87,6 +100,21 @@ class GetReservedCommand extends \sammo\BaseAPI
];
}
if($invalidUnderTurnList){
$db->update(
'nation_turn', [
'turn_idx' => $db->sqleval('`turn_idx` + %i', GameConst::$maxChiefTurn)
], 'nation_id = %i AND officer_level IN %li AND turn_idx < 0', $me['nation'], array_keys($invalidUnderTurnList)
);
}
if($invalidOverTurnList){
$db->update(
'nation_turn', [
'turn_idx' => $db->sqleval('`turn_idx` - %i', GameConst::$maxChiefTurn)
], 'nation_id = %i AND officer_level IN %li AND turn_idx >= %i', $me['nation'], array_keys($invalidOverTurnList), GameConst::$maxChiefTurn
);
}
$troopList = [];
foreach ($db->queryAllLists(
'SELECT troop_leader, `name` FROM troop WHERE `nation` = %i',
@@ -9,7 +9,7 @@ class che_오두미도 extends \sammo\BaseNation{
protected $name = '오두미도';
protected $info = '';
static $pros = '쌀수입↑ 인구↑';
static $cons = '기술↓ 수성↓ 내정↓';
static $cons = '기술↓ 수성↓ 농상↓';
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
@@ -40,4 +40,4 @@ class che_오두미도 extends \sammo\BaseNation{
return $amount;
}
}
}
+2 -2
View File
@@ -8,7 +8,7 @@ class che_유가 extends \sammo\BaseNation{
protected $name = '유가';
protected $info = '';
static $pros = '내정↑ 민심↑';
static $pros = '농상↑ 민심↑';
static $cons = '쌀수입↓';
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
@@ -31,4 +31,4 @@ class che_유가 extends \sammo\BaseNation{
return $amount;
}
}
}
+4 -4
View File
@@ -8,7 +8,7 @@ class che_음양가 extends \sammo\BaseNation{
protected $name = '음양가';
protected $info = '';
static $pros = '내정↑ 인구↑';
static $pros = '농상↑ 인구↑';
static $cons = '기술↓ 전략↓';
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
@@ -29,14 +29,14 @@ class che_음양가 extends \sammo\BaseNation{
if($type == 'pop' && $amount > 0){
return $amount * 1.2;
}
return $amount;
}
public function onCalcStrategic(string $turnType, string $varType, $value){
if($varType == 'delay'){
return $value * 2;
return Util::round($value * 4 / 3);
}
return $value;
}
}
}
+2 -2
View File
@@ -9,7 +9,7 @@ class che_종횡가 extends \sammo\BaseNation{
protected $name = '종횡가';
protected $info = '';
static $pros = '전략↑ 수성↑';
static $cons = '금수입↓ 내정↓';
static $cons = '금수입↓ 농상↓';
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
if($turnType == '수비' || $turnType == '성벽'){
@@ -42,4 +42,4 @@ class che_종횡가 extends \sammo\BaseNation{
}
return $value;
}
}
}
+1 -1
View File
@@ -158,7 +158,7 @@ class che_강행 extends Command\GeneralCommand
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
+1 -1
View File
@@ -174,7 +174,7 @@ class che_거병 extends Command\GeneralCommand{
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
+1 -1
View File
@@ -201,7 +201,7 @@ class che_건국 extends Command\GeneralCommand
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general), $general, '건국');
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general, static::$actionName), $general, '건국');
$general->applyDB($db);
return true;
+1 -1
View File
@@ -112,7 +112,7 @@ class che_견문 extends Command\GeneralCommand{
$general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
@@ -178,7 +178,7 @@ class che_군량매매 extends Command\GeneralCommand{
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
+1 -1
View File
@@ -95,7 +95,7 @@ class che_귀환 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
@@ -134,7 +134,7 @@ class che_기술연구 extends che_상업투자{
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -126,7 +126,7 @@ class che_단련 extends Command\GeneralCommand{
$general->increaseVar($incStat, 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -169,7 +169,7 @@ class che_등용 extends Command\GeneralCommand
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
@@ -281,7 +281,7 @@ class che_랜덤임관 extends Command\GeneralCommand
$general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general), $general, '랜덤 임관');
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general, static::$actionName), $general, '랜덤 임관');
$general->applyDB($db);
return true;
@@ -216,7 +216,7 @@ class che_무작위건국 extends Command\GeneralCommand
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general), $general, '건국');
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general, static::$actionName), $general, '건국');
$general->applyDB($db);
return true;
@@ -148,7 +148,7 @@ class che_물자조달 extends Command\GeneralCommand{
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
@@ -106,7 +106,7 @@ class che_사기진작 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -218,7 +218,7 @@ class che_상업투자 extends Command\GeneralCommand{
$general->increaseVar(static::$statKey.'_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -179,7 +179,7 @@ class che_숙련전환 extends Command\GeneralCommand
$general->increaseVar('leadership_exp', 2);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -75,7 +75,7 @@ class che_은퇴 extends Command\GeneralCommand{
$logger->pushGeneralActionLog("은퇴하였습니다. <1>$date</>");
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -164,7 +164,7 @@ class che_이동 extends Command\GeneralCommand
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
@@ -152,7 +152,7 @@ class che_인재탐색 extends Command\GeneralCommand
$general->increaseVar($incStat, 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
}
@@ -218,7 +218,7 @@ class che_인재탐색 extends Command\GeneralCommand
$general->increaseVar($incStat, 3);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
}
+1 -1
View File
@@ -172,7 +172,7 @@ class che_임관 extends Command\GeneralCommand
$general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -196,7 +196,7 @@ class che_장비매매 extends Command\GeneralCommand
$general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -170,7 +170,7 @@ class che_장수대상임관 extends Command\GeneralCommand{
$general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -121,7 +121,7 @@ class che_전투태세 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 3);
$this->setResultTurn($turnResult);
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -103,7 +103,7 @@ class che_전투특기초기화 extends Command\GeneralCommand{
$logger->pushGeneralActionLog("새로운 {$specialName}를 가질 준비가 되었습니다. <1>$date</>");
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -188,7 +188,7 @@ class che_정착장려 extends Command\GeneralCommand{
$general->increaseVar(static::$statKey.'_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
@@ -188,7 +188,7 @@ class che_주민선정 extends Command\GeneralCommand{
$general->increaseVar(static::$statKey.'_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -170,7 +170,7 @@ class che_증여 extends Command\GeneralCommand
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
$destGeneral->applyDB($db);
+1 -1
View File
@@ -103,7 +103,7 @@ class che_집합 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -227,7 +227,7 @@ class che_징병 extends Command\GeneralCommand
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->setAuxVar('armType', $reqCrewType->armType);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -253,7 +253,7 @@ class che_출병 extends Command\GeneralCommand
processWar($warRngSeed, $general, $this->nation, $this->destCity);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -146,7 +146,7 @@ class che_헌납 extends Command\GeneralCommand
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -107,7 +107,7 @@ class che_훈련 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -201,7 +201,7 @@ class cr_건국 extends Command\GeneralCommand
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general), $general, '건국');
tryUniqueItemLottery(genGenericUniqueRNGFromGeneral($general, static::$actionName), $general, '건국');
$general->applyDB($db);
return true;
+1 -1
View File
@@ -105,7 +105,7 @@ class cr_맹훈련 extends Command\GeneralCommand{
$general->increaseVar('leadership_exp', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general), $general);
tryUniqueItemLottery(\sammo\genGenericUniqueRNGFromGeneral($general, static::$actionName), $general);
$general->applyDB($db);
return true;
+1 -1
View File
@@ -67,7 +67,7 @@ class RaiseInvader extends \sammo\Event\Action
foreach ($db->queryAllLists('SELECT capital, nation from nation WHERE capital in %li', $cities) as $row) {
[$oldCapital, $nation] = $row;
$capitalCandidates = $db->queryFirstColumn('SELECT from city WHERE nation = %i AND city != %i', $nation);
$capitalCandidates = $db->queryFirstColumn('SELECT from city WHERE nation = %i AND city != %i', $nation, $oldCapital);
if (!$capitalCandidates) {
$disabledInvaderCity->add($oldCapital);
continue;
+2 -2
View File
@@ -216,7 +216,7 @@ class GameConstBase
public static $minMonthToAllowInheritItem = 4;
public static $inheritBornSpecialPoint = 6000;
public static $inheritBornTurntimePoint = 3000;
public static $inheritBornTurntimePoint = 2500;
public static $inheritBornCityPoint = 1000;
public static $inheritBornStatPoint = 1000;
public static $inheritItemUniqueMinPoint = 5000;
@@ -318,7 +318,6 @@ class GameConstBase
'che_치안강화',
'che_정착장려',
'che_주민선정',
'che_물자조달',
],
'군사' => [
'che_징병',
@@ -349,6 +348,7 @@ class GameConstBase
'국가' => [
'che_증여',
'che_헌납',
'che_물자조달',
'che_하야',
'che_거병',
'che_건국',
+30 -19
View File
@@ -82,8 +82,9 @@ class GeneralAI
const d직전 = 3;
const d전쟁 = 4;
protected function updateInstance(): void{
if(!$this->reqUpdateInstance){
protected function updateInstance(): void
{
if (!$this->reqUpdateInstance) {
return;
}
@@ -215,11 +216,10 @@ class GeneralAI
);
if ($yearMonth <= Util::joinYearMonth($env['startyear'] + 2, 5)) {
if(!$warTarget){
if (!$warTarget) {
$this->dipState = self::d평화;
$this->attackable = false;
}
else{
} else {
$this->dipState = self::d선포;
$this->attackable = false;
}
@@ -2992,7 +2992,7 @@ class GeneralAI
}
foreach ($this->frontCities as $frontCity) {
if(!$frontCity['supply']){
if (!$frontCity['supply']) {
continue;
}
$candidateCities[$frontCity['city']] = $frontCity['important'];
@@ -3120,6 +3120,11 @@ class GeneralAI
{
$db = DB::db();
$dupLord = $db->queryFirstField('SELECT COUNT(*) FROM general WHERE officer_level = 12 AND city = %i', $this->general->getCityID());
if($dupLord <= 1) {
return null;
}
$general = $this->general;
$lordCities = $db->queryFirstColumn('SELECT city.city as city FROM general LEFT JOIN city ON general.city = city.city WHERE general.officer_level = 12 AND city.nation = 0');
$nationCities = $db->queryFirstColumn('SELECT city FROM city WHERE nation != 0');
@@ -3352,10 +3357,9 @@ class GeneralAI
if ($this->rng->nextBool(pow(1 / ($nationCnt + 1) / pow($notFullNationCnt, 3), 1 / 4))) {
return null;
}
}
else{
} else {
//임관 기간이 끝나면 고정 확률로 낮춤 0.3 * 0.5 = 0.15
if ($this->rng->nextBool()){
if ($this->rng->nextBool()) {
return null;
}
}
@@ -3481,7 +3485,7 @@ class GeneralAI
}
if ($nationCity['front']) {
$frontCities[$cityID] = $nationCity;
} else if($nationCity['supply']) {
} else if ($nationCity['supply']) {
$backupCities[$cityID] = $nationCity;
}
@@ -3783,21 +3787,28 @@ class GeneralAI
if ($npcType >= 2 && $general->getVar('officer_level') == 12 && !$this->nation['capital']) {
//방랑군 건국
$result = $this->do건국();
if ($result !== null) {
$result->reason = 'do건국';
return $result;
$relYearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']) - Util::joinYearMonth($this->env['init_year'], $this->env['init_month']);
if ($relYearMonth > 1) {
$result = $this->do건국();
if ($result !== null) {
$result->reason = 'do건국';
return $result;
}
}
$result = $this->do방랑군이동();
if ($result !== null) {
$result->reason = 'do방랑군이동';
return $result;
}
$result = $this->do해산();
if ($result !== null) {
$result->reason = 'do해산';
return $result;
if ($relYearMonth > 1) {
$result = $this->do해산();
if ($result !== null) {
$result->reason = 'do해산';
return $result;
}
}
}
@@ -4039,7 +4050,7 @@ class GeneralAI
if (!key_exists($chiefLevel, $this->chiefGenerals) && !key_exists($chiefLevel, $nextChiefs)) {
$newChiefProb = 1;
} else {
$newChiefProb = $this->rng->nextBool(0.1)?1:0;
$newChiefProb = $this->rng->nextBool(0.1) ? 1 : 0;
}
if ($newChiefProb < 1 && !$this->rng->nextBool($newChiefProb)) {
+45 -80
View File
@@ -186,58 +186,45 @@
</div>
<div class="col col-lg-6 col-sm-6 col-12 p-2 align-self-center">
<div class="a-center">
<label> <input v-model="inheritTurnTimeSet" type="checkbox" /> 시간 </label>
</div>
<div class="row turn_time_pad">
<div class="col col-lg-4 offset-lg-3 col-4 offset-3">
<NumberInputWithInfo
v-model="inheritTurnTimeMinute"
:readonly="!inheritTurnTimeSet"
:min="0"
:max="turnterm - 1"
:right="true"
title="분"
/>
</div>
<div class="col col-lg-4 col-4">
<NumberInputWithInfo
v-model="inheritTurnTimeSecond"
:readonly="!inheritTurnTimeSet"
:min="0"
:max="60"
:right="true"
title="초"
/>
<div class="row">
<div class="col col-6 a-right align-self-center"> 시간 </div>
<div class="col col-6 align-self-center">
<select v-model.number="inheritTurnTimeZone" class="form-select form-inline" style="max-width: 24ch">
<option :value="undefined">사용안함</option>
<option v-for="(zone, idx) in turnTimeZoneList" :key="idx" :value="idx">
{{ zone }}
</option>
</select>
</div>
</div>
</div>
<div class="col col-lg-6 col-12 p-2">
<div class="a-center">추가 능력치 고정</div>
<div class="col col-lg-6 col-sm-6 col-12 p-2 align-self-center">
<div class="row">
<div class="col col-6 a-right align-self-center">추가 능력치 고정(//)</div>
<div class="col col-6 align-self-center">
<div class="row g-1">
<div class="col">
<NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[0]"
:max="stats.bonusMax"
title="통솔"
/>
</div>
<div class="col">
<NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[1]"
:max="stats.bonusMax"
title="무력"
/>
</div>
<div class="col">
<NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[2]"
:max="stats.bonusMax"
title="지력"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -284,7 +271,7 @@ import TopBackBar from "@/components/TopBackBar.vue";
import { getIconPath } from "@util/getIconPath";
import { isBrightColor } from "@util/isBrightColor";
import { abilityLeadint, abilityLeadpow, abilityPowint, abilityRand } from "@util/generalStats";
import { shuffle, sum } from "lodash-es";
import { range, shuffle, sum } from "lodash-es";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { SammoAPI } from "./SammoAPI";
import type { JoinArgs } from "./defs/API/General";
@@ -378,7 +365,7 @@ watch(gameConstStore, (gameConst) => {
inheritCity: undefined,
inheritBonusStat: [0, 0, 0],
inheritSpecial: undefined,
inheritTurntime: undefined,
inheritTurntimeZone: undefined,
};
});
@@ -462,7 +449,7 @@ const inheritRequiredPoint = computed(() => {
if (args.value.inheritSpecial !== undefined) {
inheritRequiredPoint += gameConst.inheritBornSpecialPoint;
}
if (args.value.inheritTurntime !== undefined) {
if (args.value.inheritTurntimeZone !== undefined) {
inheritRequiredPoint += gameConst.inheritBornTurntimePoint;
}
if (args.value.inheritBonusStat !== undefined && sum(args.value.inheritBonusStat) != 0) {
@@ -494,55 +481,37 @@ watch(inheritCity, (newValue: undefined | number) => {
args.value.inheritCity = inheritCity.value;
});
const inheritTurnTimeSet = ref(false);
watch(inheritTurnTimeSet, (newValue: boolean) => {
if (!args.value) throw "nyc";
if (!newValue) {
args.value.inheritTurntime = undefined;
return;
const inheritTurnTimeZone = ref<number>();
const turnTimeZoneList: string[] = (()=>{
const result: string[] = [];
const zoneSec = turnterm; // * 60 / 60
let zoneCur = 0;
for(const idx of range(60)){
const zoneNext = zoneCur + zoneSec;
const zoneCurMin = Math.floor(zoneCur / 60);
const zoneCurSec = zoneCur % 60;
const zoneCurText = `${zoneCurMin.toString().padStart(2, "0")}:${zoneCurSec.toString().padStart(2, "0")}.000`;
const zoneCurEnd = zoneCur + zoneSec - 1;
const zoneCurEndMin = Math.floor(zoneCurEnd / 60);
const zoneCurEndSec = zoneCurEnd % 60;
const zoneCurEndText = `${zoneCurEndMin.toString().padStart(2, "0")}:${zoneCurEndSec.toString().padStart(2, "0")}.999`;
// aa:bb.000 ~ cc:dd.999
const zoneStr = `${zoneCurText} ~ ${zoneCurEndText}`;
result.push(zoneStr);
zoneCur = zoneNext;
}
args.value.inheritTurntime = inheritTurnTimeMinute.value * 60 + inheritTurnTimeSecond.value;
return result;
})();
watch(inheritTurnTimeZone, (newValue: undefined | number) => {
if (!args.value) throw "nyc";
args.value.inheritTurntimeZone = inheritTurnTimeZone.value;
});
watch(
[inheritCity, inheritTurnTimeSet],
([newInheritCity, newInheritTurnTimeSet], [oldInheritCity, oldInheritTurnTimeSet]) => {
if (newInheritCity === undefined || newInheritTurnTimeSet === false) {
return;
}
alert("도시와 턴 시간을 동시에 설정할 수 없습니다.");
if (newInheritCity !== oldInheritCity) {
inheritCity.value = undefined;
}
if (newInheritTurnTimeSet !== oldInheritTurnTimeSet) {
inheritTurnTimeSet.value = false;
}
},
{ immediate: true }
);
const inheritTurnTimeMinute = ref(0);
watch(inheritTurnTimeMinute, (newValue: number) => {
if (!args.value) throw "nyc";
if (!inheritTurnTimeSet.value) {
args.value.inheritTurntime = undefined;
return;
}
args.value.inheritTurntime = newValue * 60 + inheritTurnTimeSecond.value;
});
const inheritTurnTimeSecond = ref(0);
watch(inheritTurnTimeSecond, (newValue: number) => {
if (!args.value) throw "nyc";
if (!inheritTurnTimeSet.value) {
args.value.inheritTurntime = undefined;
return;
}
args.value.inheritTurntime = inheritTurnTimeMinute.value * 60 + newValue;
});
</script>
<style lang="scss">
@import "@scss/common/base.scss";
@@ -569,10 +538,6 @@ watch(inheritTurnTimeSecond, (newValue: number) => {
.col-form-label {
text-align: right;
}
.turn_time_pad .col-form-label {
text-align: left;
}
</style>
<style lang="scss" scoped>
+1 -1
View File
@@ -152,7 +152,7 @@ async function refreshDetail() {
currentAuction.value = await SammoAPI.Auction.GetUniqueItemAuctionDetail({ auctionID });
const bidList = currentAuction.value.bidList;
const highestBidAmount = Math.max(bidList[0].amount, bidList[bidList.length-1].amount);
bidAmount.value = Math.max(bidAmount.value, Math.ceil(highestBidAmount * 1.01));
bidAmount.value = Math.ceil(highestBidAmount * 1.01);
} catch (e) {
console.error(e);
if (isString(e)) {
+1 -1
View File
@@ -6,7 +6,7 @@ export type JoinArgs = {
pic: boolean;
character: string;
inheritSpecial?: string;
inheritTurntime?: number;
inheritTurntimeZone?: number;
inheritCity?: number;
inheritBonusStat?: [number, number, number];
};
+23 -20
View File
@@ -93,8 +93,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'validate',
'reason' => $validateResult
@@ -123,8 +123,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'launch',
'reason' => $result
@@ -139,8 +139,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'launch',
'reason' => $recoveryType->info(),
@@ -168,8 +168,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => true,
'state' => 'cache_not_modified',
]),
@@ -183,8 +183,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => true,
'state' => 'cache_not_modified',
]),
@@ -199,8 +199,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => true,
'state' => 'success_simple',
'set_cache' => $setCache,
@@ -216,8 +216,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => true,
'state' => 'success_complex',
'set_cache' => $setCache,
@@ -226,6 +226,7 @@ class APIHelper
$result['result'] = $result['result'] ?? true;
Json::die($result, $setCache ? 0 : Json::NO_CACHE);
} catch (\Exception $e) {
$session = Session::getInstance();
$errMsg = $e->getMessage();
$errTrace = $e->getTraceAsString();
$logDB->insert('api_log', [
@@ -233,8 +234,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'error_exception',
'errMsg' => $errMsg,
@@ -244,6 +245,7 @@ class APIHelper
Json::dieWithReason("{$errMsg}\n{$errTrace}");
} catch (\Throwable $e) {
logExceptionByCustomHandler($e, false);
$session = Session::getInstance();
$errMsg = $e->getMessage();
$errTrace = $e->getTraceAsString();
$logDB->insert('api_log', [
@@ -251,8 +253,8 @@ class APIHelper
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'error_throwable',
'errMsg' => $errMsg,
@@ -261,14 +263,15 @@ class APIHelper
]);
Json::dieWithReason("{$errMsg}\n{$errTrace}");
} catch (mixed $e) {
$session = Session::getInstance();
$errStr = strval($e);
$logDB->insert('api_log', [
'user_id' => $session->userID ?? 0,
'ip' => $ip,
'date' => $date,
'path' => $actionPath,
'arg' => JSON::encode($filteredArgs),
'aux' => JSON::encode([
'arg' => Json::encode($filteredArgs),
'aux' => Json::encode([
'result' => false,
'state' => 'error_mixed',
'errMsg' => $errStr,