| = $user['name'] ?> |
- = $user['connect'] ?>(= $user['refresh'] ?>) |
+ = $user['refresh_score_total'] ?>(= $user['refresh'] ?>) |
diff --git a/hwe/b_betting.php b/hwe/b_betting.php
index d97c5a96..35b4fae8 100644
--- a/hwe/b_betting.php
+++ b/hwe/b_betting.php
@@ -2,6 +2,7 @@
namespace sammo;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn;
include "lib.php";
@@ -21,12 +22,15 @@ $generalID = $session->generalID;
-$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no,tournament,refresh_score,turntime FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
+);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
$turnTerm = $admin['turnterm'];
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -107,7 +111,7 @@ if ($str3) {
?>
-
@@ -563,7 +567,7 @@ if ($str3) {
$tournamentRankerList = General::createGeneralObjListFromDB(
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value),
[$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
- 0
+ GeneralQueryMode::Core
);
usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
$result = - ($lhs->getRankVar($gameColumn) <=> $rhs->getRankVar($gameColumn));
diff --git a/hwe/b_currentCity.php b/hwe/b_currentCity.php
index f650ad32..7728a5fd 100644
--- a/hwe/b_currentCity.php
+++ b/hwe/b_currentCity.php
@@ -211,7 +211,7 @@ $templates = new \League\Plates\Engine('templates');
$city['trade'] = "- ";
}
- $dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0];
+ $dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'])[0];
if ($showDetailedInfo) {
$generals = $db->query(
'SELECT %l from general where city=%i order by turntime',
@@ -327,7 +327,7 @@ $templates = new \League\Plates\Engine('templates');
if ($ourGeneral && !$isNPC) {
$turnText = [];
- $generalObj = new General($general, null, null, null, null, null, false);
+ $generalObj = new General($general, null, null, null, null, null, null, false);
foreach ($generalTurnList[$generalObj->getID()] as $turnRawIdx => $turn) {
$turnIdx = $turnRawIdx + 1;
$turnText[] = "{$turnIdx} : $turn";
diff --git a/hwe/b_genList.php b/hwe/b_genList.php
index 5725b7b2..0cbae607 100644
--- a/hwe/b_genList.php
+++ b/hwe/b_genList.php
@@ -19,12 +19,15 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("암행부", 1);
-$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -45,7 +48,7 @@ $templates = new \League\Plates\Engine('templates');
?>
-
diff --git a/hwe/b_myGenInfo.php b/hwe/b_myGenInfo.php
index 5e3bec52..8045c7f0 100644
--- a/hwe/b_myGenInfo.php
+++ b/hwe/b_myGenInfo.php
@@ -97,7 +97,7 @@ if ($gameStor->isunited) {
7 => ['gold', true],
8 => ['rice', true],
9 => ['crew', true],
- 10 => ['connect', true],
+ 10 => ['refresh_score_total', true],
11 => ['personal', true],
12 => ['special', true],
13 => ['special2', true],
@@ -105,7 +105,9 @@ if ($gameStor->isunited) {
15 => ['npc', true],
][$type];
- $generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect,gold,rice,crew,belong from general where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
+ $generalList = $db->query(
+ 'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total,gold,rice,crew,belong
+ FROM `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
echo "
@@ -173,8 +175,8 @@ if ($gameStor->isunited) {
| " . displayCharInfo($general['personal']) . " |
" . displaySpecialDomesticInfo($general['special']) . " / " . displaySpecialWarInfo($general['special2']) . " |
{$general['belong']} |
- {$general['connect']}";
- echo " (" . getConnect($general['connect']) . ") |
+ ". $general['refresh_score_total'] ?? 0;
+ echo " (" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . ") |
";
}
echo "
diff --git a/hwe/b_myPage.php b/hwe/b_myPage.php
index ad96b814..9859e0e2 100644
--- a/hwe/b_myPage.php
+++ b/hwe/b_myPage.php
@@ -2,6 +2,10 @@
namespace sammo;
+use sammo\Enums\GeneralAccessLogColumn;
+use sammo\Enums\GeneralQueryMode;
+use sammo\Enums\TableName;
+
include "lib.php";
include "func.php";
@@ -20,7 +24,7 @@ $gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
increaseRefresh("내정보", 1);
-$me = General::createGeneralObjFromDB($generalID);
+$me = General::createGeneralObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
$myset = $me->getVar('myset');
if ($myset > 0) {
@@ -29,7 +33,14 @@ if ($myset > 0) {
$submit = 'hidden';
}
-$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
+$lastRefresh = $db->queryFirstField(
+ 'SELECT %b FROM %b WHERE %b = %i',
+ GeneralAccessLogColumn::lastRefresh->value,
+ TableName::generalAccessLog->value,
+ GeneralAccessLogColumn::generalID->value, $generalID
+);
+
+$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
if ($gameStor->turntime <= $gameStor->opentime) {
//서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
diff --git a/hwe/b_tournament.php b/hwe/b_tournament.php
index ea74537a..461c18d1 100644
--- a/hwe/b_tournament.php
+++ b/hwe/b_tournament.php
@@ -14,14 +14,16 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("토너먼트", 1);
TurnExecutionHelper::executeAllCommand();
-$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
-$generalID = $session->generalID;
+$me = $db->queryFirstRow(
+ 'SELECT no,tournament,refresh_score,turntime from `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
+);
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
$turnTerm = $admin['turnterm'];
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -100,7 +102,7 @@ $globalBetTotal = array_sum($globalBet);
?>
-
diff --git a/hwe/func.php b/hwe/func.php
index 4b70d3b5..adae4f2f 100644
--- a/hwe/func.php
+++ b/hwe/func.php
@@ -5,6 +5,9 @@ namespace sammo;
use DateTime;
use Ds\Set;
use sammo\Enums\AuctionType;
+use sammo\Enums\GeneralAccessLogColumn;
+use sammo\Enums\GeneralColumn;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\Enums\RankColumn;
@@ -103,10 +106,9 @@ function GetImageURL($imgsvr, $filepath = '')
}
/**
- * @param null|int $con 장수의 벌점
- * @param null|int $conlimit 최대 벌점
+ * @param null|int $refreshScore 장수의 벌점
*/
-function checkLimit($con = null)
+function checkLimit($refreshScore = null)
{
$session = Session::getInstance();
if ($session->userGrade >= 4) {
@@ -116,15 +118,15 @@ function checkLimit($con = null)
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- if ($con === null) {
- $con = $db->queryFirstField('SELECT con FROM general WHERE `owner`=%i', Session::getUserID());
+ if ($refreshScore === null) {
+ $refreshScore = $db->queryFirstField('SELECT refresh_score FROM general_access_log WHERE `general_id`=%i', Session::getGeneralID());
}
- $conlimit = $gameStor->conlimit;
+ $refreshLimit = $gameStor->refreshLimit;
- if ($con > $conlimit) {
+ if ($refreshScore > $refreshLimit) {
return 2;
//접속제한 90%이면 경고문구
- } elseif ($con > $conlimit * 0.9) {
+ } elseif ($refreshScore > $refreshLimit * 0.9) {
return 1;
} else {
return 0;
@@ -642,7 +644,7 @@ function generalInfo(General $generalObj)
$age = "{$age} 세";
}
- $connectCnt = round($generalObj->getVar('connect'), -1);
+ $refreshScoreTotal = round($generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal) ?? 0, -1);
$specialDomestic = $generalObj->getVar('special') === GameConst::$defaultSpecialDomestic
? "{$generalObj->getVar('specage')}세"
: "" . displayiActionObjInfo($generalObj->getSpecialDomestic()) . "";
@@ -751,7 +753,7 @@ function generalInfo(General $generalObj)
부대 |
{$troopInfo} |
벌점 |
- " . getConnect($connectCnt) . " {$connectCnt}({$generalObj->getVar('con')}) |
+ " . getRefreshScoreText($refreshScoreTotal) . " {$refreshScoreTotal}({$generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScore)}) |
";
}
@@ -998,42 +1000,51 @@ function increaseRefresh($type = "", $cnt = 1)
$generalID = $session->generalID;
$userGrade = $session->userGrade;
- $date = TimeUtil::now();
+ $dateObj = new \DateTimeImmutable();
+ $date = TimeUtil::format($dateObj, false);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$isunited = $gameStor->isunited;
$opentime = $gameStor->opentime;
- if($userGrade == 6){
+ if ($userGrade == 6) {
return;
}
- if($isunited == 2){
+ if ($isunited == 2) {
return;
}
- if(!$generalID){
+ if (!$generalID) {
return;
}
- if($opentime > $date){
+ if ($opentime > $date) {
return;
}
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
- $db->update('general', [
- 'lastrefresh' => $date,
- 'con' => $db->sqleval('con + %i', $cnt),
- 'connect' => $db->sqleval('connect + %i', $cnt),
- 'refcnt' => $db->sqleval('refcnt + %i', $cnt),
- 'refresh' => $db->sqleval('refresh + %i', $cnt)
- ], 'owner=%i', $userID);
+ $db->insertUpdate('general_access_log', [
+ GeneralAccessLogColumn::generalID->value => $generalID,
+ GeneralAccessLogColumn::userID->value => $userID,
+ GeneralAccessLogColumn::lastRefresh->value => $date,
+ GeneralAccessLogColumn::refreshTotal->value => $cnt,
+ GeneralAccessLogColumn::refresh->value => $cnt,
+ GeneralAccessLogColumn::refreshScore->value => $cnt,
+ GeneralAccessLogColumn::refreshScoreTotal->value => $cnt,
+ ], [
+ GeneralAccessLogColumn::lastRefresh->value => $date,
+ GeneralAccessLogColumn::refreshTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshTotal->value, $cnt),
+ GeneralAccessLogColumn::refresh->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refresh->value, $cnt),
+ GeneralAccessLogColumn::refreshScore->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScore->value, $cnt),
+ GeneralAccessLogColumn::refreshScoreTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScoreTotal->value, $cnt),
+ ]);
$serverPath = __DIR__;
$serverID = UniqueConst::$serverID;
$logPath = "{$serverPath}/logs/{$serverID}/api_log.db";
- $logDB = FileDB::db($logPath, $serverPath. '/../f_install/sql/api_log.sql');
+ $logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
$ip = $_SERVER['REMOTE_ADDR'] ?? 'local';
$date = date('Y-m-d H:i:s');
@@ -1062,9 +1073,6 @@ function updateTraffic()
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh']);
/** @var array{year:int,month:int,refresh:int,maxonline:int,maxrefresh:int} $admin */
- //최다갱신자
- $user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1');
-
if ($admin['maxrefresh'] < $admin['refresh']) {
$admin['maxrefresh'] = $admin['refresh'];
}
@@ -1075,22 +1083,7 @@ function updateTraffic()
$gameStor->maxrefresh = $admin['maxrefresh'];
$gameStor->maxonline = $admin['maxonline'];
- $db->update('general', ['refresh' => 0], true);
-
- $date = TimeUtil::now();
- //일시|년|월|총갱신|접속자|최다갱신자
- file_put_contents(
- __DIR__ . "/logs/" . UniqueConst::$serverID . "/_traffic.txt",
- Json::encode([
- $date,
- $admin['year'],
- $admin['month'],
- $admin['refresh'],
- $online,
- $user['name'] . "(" . $user['refresh'] . ")"
- ]) . "\n",
- FILE_APPEND
- );
+ $db->update('general_access_log', ['refresh' => 0], true);
}
function CheckOverhead()
@@ -1098,13 +1091,13 @@ function CheckOverhead()
//서버정보
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- list($turnterm, $conlimit) = $gameStor->getValuesAsArray(['turnterm', 'conlimit']);
+ [$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']);
- $con = Util::round(pow($turnterm, 0.6) * 3) * 10;
+ $nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * 10;
- if ($con != $conlimit) {
- $gameStor->conlimit = $con;
+ if ($nextRefreshLimit != $refreshLimit) {
+ $gameStor->refreshLimit = $nextRefreshLimit;
}
}
@@ -1208,7 +1201,16 @@ function updateOnline()
//동접수
$startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false);
- $onlineUser = $db->query('SELECT no,name,nation FROM general WHERE lastrefresh >= %s AND npc < 2', $startTurn);
+ $onlineUser = $db->query(
+ 'SELECT %b, %b, %b FROM `general_access_log` as `log` INNER JOIN `general` ON `log`.%b = `general`.%b WHERE %b >= %s',
+ GeneralColumn::no->value,
+ GeneralColumn::name->value,
+ GeneralColumn::nation->value,
+ GeneralAccessLogColumn::generalID->value,
+ GeneralColumn::no->value,
+ GeneralAccessLogColumn::lastRefresh->value,
+ $startTurn
+ );
$onlineNum = count($onlineUser);
$onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation');
@@ -1322,7 +1324,7 @@ function CheckHall($no)
["betrate", 'calc'],
];
- $generalObj = General::createGeneralObjFromDB($no, null, 2);
+ $generalObj = General::createGeneralObjFromDB($no);
$ttw = $generalObj->getRankVar(RankColumn::ttw);
$ttd = $generalObj->getRankVar(RankColumn::ttd);
@@ -1719,7 +1721,7 @@ function deleteNation(General $lord, bool $applyDB): array
$lordID
),
['npc', 'owner', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
- 1
+ GeneralQueryMode::Lite,
);
$nationGeneralList[$lordID] = $lord;
@@ -1736,7 +1738,7 @@ function deleteNation(General $lord, bool $applyDB): array
// 전 장수 재야로
foreach ($nationGeneralList as $general) {
- if($general->getNPCType() < 2){
+ if ($general->getNPCType() < 2) {
$general->setAuxVar(
InheritanceKey::max_belong->value,
max(
diff --git a/hwe/func_converter.php b/hwe/func_converter.php
index 8015975f..97d60796 100644
--- a/hwe/func_converter.php
+++ b/hwe/func_converter.php
@@ -133,19 +133,19 @@ function getNationType(?string $type) {
}
-function getConnect($con) {
- if($con < 50) $conname = '안함';
- elseif($con < 100) $conname = '무관심';
- elseif($con < 200) $conname = '가끔';
- elseif($con < 400) $conname = '보통';
- elseif($con < 800) $conname = '자주';
- elseif($con < 1600) $conname = '열심';
- elseif($con < 3200) $conname = '중독';
- elseif($con < 6400) $conname = '폐인';
- elseif($con < 12800) $conname = '경고';
- else $conname = '헐...';
+function getRefreshScoreText($score) {
+ if($score < 50) $scoreName = '안함';
+ elseif($score < 100) $scoreName = '무관심';
+ elseif($score < 200) $scoreName = '가끔';
+ elseif($score < 400) $scoreName = '보통';
+ elseif($score < 800) $scoreName = '자주';
+ elseif($score < 1600) $scoreName = '열심';
+ elseif($score < 3200) $scoreName = '중독';
+ elseif($score < 6400) $scoreName = '폐인';
+ elseif($score < 12800) $scoreName = '경고';
+ else $scoreName = '헐...';
- return $conname;
+ return $scoreName;
}
function getNationType2(?string $type) {
diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php
index 7955d031..465c97eb 100644
--- a/hwe/func_gamerule.php
+++ b/hwe/func_gamerule.php
@@ -202,8 +202,10 @@ function preUpdateMonthly()
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
//접률감소, 건국제한-1
+ $db->update('general_access_log', [
+ 'refresh_score_total' => $db->sqleval('floor(refresh_score_total*0.99)'),
+ ], true);
$db->update('general', [
- 'connect' => $db->sqleval('floor(connect*0.99)'),
'makelimit' => $db->sqleval('greatest(0, makelimit - 1)'),
], true);
//전략제한-1, 외교제한-1, 세율동기화
@@ -696,7 +698,7 @@ function checkEmperior()
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- $admin = $gameStor->getValues(['year', 'month', 'isunited', 'conlimit']);
+ $admin = $gameStor->getValues(['year', 'month', 'isunited', 'refreshLimit']);
if ($admin['isunited'] != 0) {
return;
}
@@ -758,7 +760,7 @@ function checkEmperior()
}
$gameStor->isunited = 2;
- $gameStor->conlimit = $gameStor->conlimit * 100;
+ $gameStor->refreshLimit = $gameStor->refreshLimit * 100;
foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) {
CheckHall($hallGeneralNo);
diff --git a/hwe/func_time_event.php b/hwe/func_time_event.php
index aebe8e8e..22086dd8 100644
--- a/hwe/func_time_event.php
+++ b/hwe/func_time_event.php
@@ -383,7 +383,7 @@ function disaster(RandUtil $rng) {
$generalList = array_map(
function($rawGeneral) use ($city, $year, $month){
- return new General($rawGeneral, null, $city, null, $year, $month, false);
+ return new General($rawGeneral, null, null, $city, null, $year, $month, false);
},
$generalListByCity[$city['city']]??[]
);
diff --git a/hwe/j_board_article_add.php b/hwe/j_board_article_add.php
index 4b4b3a89..35ea3ae6 100644
--- a/hwe/j_board_article_add.php
+++ b/hwe/j_board_article_add.php
@@ -17,10 +17,13 @@ $text = Util::getPost('text');
increaseRefresh("회의실", 1);
-$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty, `picture`,`imgsvr` FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty, `picture`,`imgsvr` FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -50,7 +53,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
-
+
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
diff --git a/hwe/j_board_comment_add.php b/hwe/j_board_comment_add.php
index 12ada898..4fc660be 100644
--- a/hwe/j_board_comment_add.php
+++ b/hwe/j_board_comment_add.php
@@ -16,10 +16,13 @@ $text = Util::getPost('text');
increaseRefresh("회의실", 1);
-$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -58,7 +61,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
-
+
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
diff --git a/hwe/j_board_get_articles.php b/hwe/j_board_get_articles.php
index 9b902cf4..5a740f23 100644
--- a/hwe/j_board_get_articles.php
+++ b/hwe/j_board_get_articles.php
@@ -16,11 +16,14 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
increaseRefresh("회의실", 1);
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -33,7 +36,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
-
+
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
@@ -72,4 +75,3 @@ Json::die([
'articles'=>$articles,
'reason'=>'success'
]);
-
diff --git a/hwe/j_diplomacy_destroy_letter.php b/hwe/j_diplomacy_destroy_letter.php
index fec91ff8..f7ed149e 100644
--- a/hwe/j_diplomacy_destroy_letter.php
+++ b/hwe/j_diplomacy_destroy_letter.php
@@ -17,10 +17,13 @@ $letterNo = Util::getPost('letterNo', 'int');
increaseRefresh("외교부", 1);
-$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
diff --git a/hwe/j_diplomacy_get_letter.php b/hwe/j_diplomacy_get_letter.php
index 39aed480..425eb7d7 100644
--- a/hwe/j_diplomacy_get_letter.php
+++ b/hwe/j_diplomacy_get_letter.php
@@ -16,11 +16,14 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
increaseRefresh("외교부", 1);
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -33,7 +36,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
-
+
}
$letters = [];
@@ -83,4 +86,3 @@ Json::die([
'myNationID'=>$me['nation'],
'reason'=>'success'
]);
-
diff --git a/hwe/j_diplomacy_respond_letter.php b/hwe/j_diplomacy_respond_letter.php
index 42a30ab1..ce8c4d8f 100644
--- a/hwe/j_diplomacy_respond_letter.php
+++ b/hwe/j_diplomacy_respond_letter.php
@@ -22,10 +22,13 @@ $reason = Util::getPost('reason', 'string', '');
increaseRefresh("외교부", 1);
-$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
diff --git a/hwe/j_diplomacy_rollback_letter.php b/hwe/j_diplomacy_rollback_letter.php
index 5908776d..f8bc1f9b 100644
--- a/hwe/j_diplomacy_rollback_letter.php
+++ b/hwe/j_diplomacy_rollback_letter.php
@@ -17,10 +17,13 @@ $letterNo = Util::getPost('letterNo', 'int');
increaseRefresh("외교부", 1);
-$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
diff --git a/hwe/j_diplomacy_send_letter.php b/hwe/j_diplomacy_send_letter.php
index 728759bd..ea05671e 100644
--- a/hwe/j_diplomacy_send_letter.php
+++ b/hwe/j_diplomacy_send_letter.php
@@ -24,10 +24,13 @@ if($prevNo < 1){
$prevNo = null;
}
-$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
diff --git a/hwe/j_general_log_old.php b/hwe/j_general_log_old.php
index 0779fef3..99860480 100644
--- a/hwe/j_general_log_old.php
+++ b/hwe/j_general_log_old.php
@@ -33,12 +33,15 @@ if($generalID <= 0 || $reqTo <= 0){
$db = DB::db();
-$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
$nationID = $me['nation'];
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -61,7 +64,7 @@ if($generalID !== $targetID){
'reason'=>'권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.'
]);
}
-
+
if($testGeneralNationID !== $nationID){
Json::die([
'result'=>false,
diff --git a/hwe/j_myBossInfo.php b/hwe/j_myBossInfo.php
index 7c3c7674..53f69dfd 100644
--- a/hwe/j_myBossInfo.php
+++ b/hwe/j_myBossInfo.php
@@ -1,6 +1,7 @@
update('general', [
'owner'=>$userID,
'aux'=>Json::encode($genAux)
], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
+$db->insertIgnore('general_access_log', [
+ GeneralAccessLogColumn::generalID->value => $generalID,
+ GeneralAccessLogColumn::userID->value => $userID,
+ GeneralAccessLogColumn::lastRefresh->value => $now,
+]);
if(!$db->affectedRows()){
Json::die([
diff --git a/hwe/j_set_npc_control.php b/hwe/j_set_npc_control.php
index a59d1d85..bc8d0a96 100644
--- a/hwe/j_set_npc_control.php
+++ b/hwe/j_set_npc_control.php
@@ -39,7 +39,10 @@ if (!$data || !is_array($data)) {
$db = DB::db();
-$me = $db->queryFirstRow('SELECT no, name, npc, nation, city, officer_level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, name, npc, nation, city, officer_level, refresh_score, turntime, belong, permission, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
$nationID = $me['nation'];
diff --git a/hwe/j_simulate_battle.php b/hwe/j_simulate_battle.php
index d5cf09b9..a43d1ee1 100644
--- a/hwe/j_simulate_battle.php
+++ b/hwe/j_simulate_battle.php
@@ -270,7 +270,7 @@ if (key_exists('inheritBuff', $rawAttacker)) {
}
$rawAttacker['aux'] = Json::encode($rawAttacker['aux']);
$rawAttacker['owner'] = 0;
-$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month);
+$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
$attacker = new WarUnitGeneral(
$tmpRNG,
$attackerGeneral,
@@ -308,7 +308,7 @@ foreach ($rawDefenderList as $idx => $rawDefenderGeneral) {
$rawDefenderGeneral['aux'] = Json::encode($rawDefenderGeneral['aux']);
$rawDefenderGeneral['owner'] = 0;
- $defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
+ $defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
$defenderList[] = new WarUnitGeneral(
$tmpRNG,
@@ -382,7 +382,7 @@ function simulateBattle(
$warRng = new RandUtil(new LiteHashDRBG($warSeed));
- $attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month);
+ $attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
$attacker = new WarUnitGeneral(
$warRng,
$attackerGeneral,
@@ -395,7 +395,7 @@ function simulateBattle(
$defenderList = [];
foreach ($rawDefenderList as $rawDefenderGeneral) {
- $defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
+ $defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
$defenderList[] = new WarUnitGeneral(
$warRng,
diff --git a/hwe/old_index.php b/hwe/old_index.php
index 173bed68..a7b7d263 100644
--- a/hwe/old_index.php
+++ b/hwe/old_index.php
@@ -3,6 +3,7 @@
namespace sammo;
use sammo\DTO\VoteInfo;
+use sammo\Enums\GeneralQueryMode;
include "lib.php";
include "func.php";
@@ -29,7 +30,8 @@ if (!$session->isGameLoggedIn()) {
}
$me = $db->queryFirstRow(
- 'SELECT no,con,turntime,newmsg,newvote,`officer_level` from general where owner = %i',
+ 'SELECT no,refresh_score,turntime,newmsg,newvote,`officer_level` FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i',
$userID
);
@@ -51,13 +53,13 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
-$generalObj = General::createGeneralObjFromDB($me['no']);
+$generalObj = General::createGeneralObjFromDB($me['no'], null, GeneralQueryMode::FullWithAccessLog);
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
$scenario = $gameStor->scenario_text;
@@ -198,7 +200,7 @@ if ($lastVoteID) {
= info(2) ?>
전체 접속자 수 : = $gameStor->online_user_cnt ?> 명
- 턴당 갱신횟수 : = $gameStor->conlimit ?>회
+ 턴당 갱신횟수 : = $gameStor->refreshLimit ?>회
= info(3) ?>
@@ -367,7 +369,7 @@ if ($lastVoteID) {
queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city'));
- $defenderGeneralList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
+ $defenderGeneralList = General::createGeneralObjListFromDB($defenderIDList, null);
/** @var WarUnit[] */
$defenderList = [];
@@ -595,10 +596,10 @@ function ConquerCity(array $admin, General $general, array $city)
$lord = new General($db->queryFirstRow(
'SELECT %l FROM general WHERE nation = %i AND officer_level = %i LIMIT 1',
- Util::formatListOfBackticks(General::mergeQueryColumn(['npc', 'gold', 'rice', 'experience', 'explevel', 'belong', 'dedication', 'dedlevel', 'aux'], 1)[0]),
+ Util::formatListOfBackticks(General::mergeQueryColumn(['npc', 'gold', 'rice', 'experience', 'explevel', 'belong', 'dedication', 'dedlevel', 'aux'], GeneralQueryMode::Lite)[0]),
$defenderNationID,
12
- ), null, $city, $loseNation, $year, $month, false);
+ ), null, null, $city, $loseNation, $year, $month, false);
$josaUl = JosaUtil::pick($defenderNationName, '을');
$attackerLogger->pushNationalHistoryLog("{$defenderNationName}>{$josaUl} 정복");
diff --git a/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php b/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php
index 6a7738d7..b3f36e6f 100644
--- a/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php
+++ b/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php
@@ -10,6 +10,7 @@ use sammo\DTO\AuctionBidItem;
use sammo\DTO\AuctionInfo;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\AuctionType;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\InheritancePointManager;
use sammo\TimeUtil;
@@ -76,7 +77,7 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
$inheritMgr = InheritancePointManager::getInstance();
//preveious라서 column을 최대한 비울 수 있다.
$remainPoint = $inheritMgr->getInheritancePoint(
- General::createGeneralObjFromDB($generalID, ['owner'], 0),
+ General::createGeneralObjFromDB($generalID, ['owner'], GeneralQueryMode::Core),
InheritanceKey::previous
);
diff --git a/hwe/sammo/API/Betting/GetBettingList.php b/hwe/sammo/API/Betting/GetBettingList.php
index 408261c6..7fbf0c01 100644
--- a/hwe/sammo/API/Betting/GetBettingList.php
+++ b/hwe/sammo/API/Betting/GetBettingList.php
@@ -42,9 +42,12 @@ class GetBettingList extends \sammo\BaseAPI
$bettingStor = KVStorage::getStorage($db, 'betting');
$userID = $session->userID;
- $me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $me = $db->queryFirstRow(
+ 'SELECT no,nation,officer_level,refresh_score,turntime,belong,penalty,permission FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+ );
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return "접속 제한중입니다.";
}
diff --git a/hwe/sammo/API/General/BuildNationCandidate.php b/hwe/sammo/API/General/BuildNationCandidate.php
index 75816a7a..8ce2e797 100644
--- a/hwe/sammo/API/General/BuildNationCandidate.php
+++ b/hwe/sammo/API/General/BuildNationCandidate.php
@@ -39,7 +39,7 @@ class BuildNationCandidate extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['opentime', 'turntime']);
- $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i', $userID);
+ $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i', $userID);
if (!$general) {
return '장수가 없습니다';
diff --git a/hwe/sammo/API/General/DieOnPrestart.php b/hwe/sammo/API/General/DieOnPrestart.php
index c9650bb2..ce5fa56b 100644
--- a/hwe/sammo/API/General/DieOnPrestart.php
+++ b/hwe/sammo/API/General/DieOnPrestart.php
@@ -5,6 +5,7 @@ namespace sammo\API\General;
use sammo\DB;
use sammo\DummyGeneral;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralAccessLogColumn;
use sammo\GameConst;
use sammo\Session;
use sammo\General;
@@ -37,7 +38,13 @@ class DieOnPrestart extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
- $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
+ $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID);
+ $lastRefresh = $db->queryFirstField(
+ 'SELECT %b FROM general_access_log WHERE %b = %i',
+ GeneralAccessLogColumn::lastRefresh->value,
+ GeneralAccessLogColumn::generalID->value,
+ $general['no']
+ );
if (!$general) {
return '장수가 없습니다';
@@ -55,7 +62,7 @@ class DieOnPrestart extends \sammo\BaseAPI
}
//서버 가오픈시 할 수 있는 행동
- $targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
+ $targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
if ($targetTime > TimeUtil::now()) {
$targetTimeShort = substr($targetTime, 0, 19);
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
diff --git a/hwe/sammo/API/General/GetFrontInfo.php b/hwe/sammo/API/General/GetFrontInfo.php
index 035e3901..c0805c57 100644
--- a/hwe/sammo/API/General/GetFrontInfo.php
+++ b/hwe/sammo/API/General/GetFrontInfo.php
@@ -9,7 +9,9 @@ use sammo\DB;
use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\CityColumn;
+use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\GeneralColumn;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn;
use sammo\GameConst;
use sammo\General;
@@ -173,7 +175,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'online_nation', 'online_user_cnt',
'year', 'month', 'startyear',
'maxgeneral',
- 'conlimit',
+ 'refreshLimit',
'server_cnt',
]);
@@ -383,7 +385,8 @@ class GetFrontInfo extends \sammo\BaseAPI
'specialWar' => $general->getVar(GeneralColumn::special2), // GameObjClassKey;
'personal' => $general->getVar(GeneralColumn::personal), // GameObjClassKey;
'belong' => $general->getVar(GeneralColumn::belong), // number;
- 'connect' => $general->getVar(GeneralColumn::connect), // number;
+
+ 'refreshScoreTotal' => $general->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal, 0), // number;
'officerLevel' => $general->getVar(GeneralColumn::officer_level), // number;
'officerLevelText' => getOfficerLevelText($general->getVar(GeneralColumn::officer_level), $rawNation['level']), // string;
@@ -400,7 +403,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'troop' => $general->getVar(GeneralColumn::troop), // number;
//P0 End
- 'con' => $general->getVar(GeneralColumn::con), // number;
+ 'refreshScore' => $general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0), // number;
'specage' => $general->getVar(GeneralColumn::specage), // number;
'specage2' => $general->getVar(GeneralColumn::specage2), // number;
'leadership_exp' => $general->getVar(GeneralColumn::leadership_exp), // number;
@@ -531,12 +534,12 @@ class GetFrontInfo extends \sammo\BaseAPI
{
$generalID = $session->generalID;
//NOTE: 이 경우 staticNation 정보를 조회한다.
- $general = General::createGeneralObjFromDB($generalID);
+ $general = General::createGeneralObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
$nationID = $general->getNationID();
$cityID = $general->getCityID();
- $con = checkLimit($general->getVar('con'));
- if ($con >= 2) {
+ $limitState = checkLimit($general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0));
+ if ($limitState >= 2) {
return [
'result' => false,
'reason' => '접속 제한중입니다.',
diff --git a/hwe/sammo/API/General/Join.php b/hwe/sammo/API/General/Join.php
index 15a95ea4..d4713ddb 100644
--- a/hwe/sammo/API/General/Join.php
+++ b/hwe/sammo/API/General/Join.php
@@ -8,6 +8,7 @@ use sammo\Auction;
use sammo\CityConst;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\RankColumn;
use sammo\GameConst;
use sammo\GameUnitConst;
@@ -414,8 +415,6 @@ class Join extends \sammo\BaseAPI
'officer_level' => 0,
'turntime' => $turntime,
'killturn' => 6,
- 'lastconnect' => $now,
- 'lastrefresh' => $now,
'crewtype' => GameUnitConst::DEFAULT_CREWTYPE,
'makelimit' => 0,
'betray' => $betray,
@@ -428,6 +427,11 @@ class Join extends \sammo\BaseAPI
'special2' => $special2
]);
$generalID = $db->insertId();
+ $db->insert('general_access_log', [
+ GeneralAccessLogColumn::generalID->value => $generalID,
+ GeneralAccessLogColumn::userID->value => $userID,
+ GeneralAccessLogColumn::lastRefresh->value => $now,
+ ]);
if($blockCustomGeneralName){
//XXX: 클래스가 이게 맞나?
diff --git a/hwe/sammo/API/Global/GeneralList.php b/hwe/sammo/API/Global/GeneralList.php
index dd54b7df..897159fa 100644
--- a/hwe/sammo/API/Global/GeneralList.php
+++ b/hwe/sammo/API/Global/GeneralList.php
@@ -42,9 +42,12 @@ class GeneralList extends \sammo\BaseAPI
$userID = $session->userID;
if ($session->isGameLoggedIn()) {
increaseRefresh("장수일람", 2);
- $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $me = $db->queryFirstRow(
+ 'SELECT refresh_score, turntime FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+ );
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
}
} else {
@@ -62,7 +65,8 @@ class GeneralList extends \sammo\BaseAPI
$session->setReadOnly();
- $rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general');
+ $rawGeneralList = $db->queryAllLists(
+ 'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total from `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id');
$ownerNameList = [];
if ($gameStor->isunited) {
@@ -73,7 +77,7 @@ class GeneralList extends \sammo\BaseAPI
$generalList = [];
foreach ($rawGeneralList as $rawGeneral) {
- [$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $connectCnt] = $rawGeneral;
+ [$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $refreshScoreTotal] = $rawGeneral;
if (key_exists($owner, $ownerNameList)) {
$ownerName = $ownerNameList[$owner];
@@ -104,7 +108,7 @@ class GeneralList extends \sammo\BaseAPI
getDed($dedication),
getOfficerLevelText($officerLevel, $nationArr['level']),
$killturn,
- $connectCnt
+ $refreshScoreTotal ?: 0,
];
}
@@ -129,6 +133,8 @@ class GeneralList extends \sammo\BaseAPI
'honorText',
'dedLevelText',
'officerLevelText',
+ 'killturn',
+ 'refreshScoreTotal',
];
$result = [
diff --git a/hwe/sammo/API/Global/GetHistory.php b/hwe/sammo/API/Global/GetHistory.php
index 068d883b..c91257b5 100644
--- a/hwe/sammo/API/Global/GetHistory.php
+++ b/hwe/sammo/API/Global/GetHistory.php
@@ -148,13 +148,16 @@ class GetHistory extends \sammo\BaseAPI
}
increaseRefresh("연감", 1);
- $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $session->userID);
+ $me = $db->queryFirstRow(
+ 'SELECT refresh_score, turntime FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i', $session->userID
+ );
if (!$me) {
return '장수가 사망했습니다.';
}
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return templateLimitMsg($me['turntime']);
}
}
diff --git a/hwe/sammo/API/Message/GetOldMessage.php b/hwe/sammo/API/Message/GetOldMessage.php
index e683d086..c4c93f17 100644
--- a/hwe/sammo/API/Message/GetOldMessage.php
+++ b/hwe/sammo/API/Message/GetOldMessage.php
@@ -75,7 +75,7 @@ class GetOldMessage extends \sammo\BaseAPI
$db = DB::db();
- $me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
+ $me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
if ($me === null) {
return '장수가 사망했습니다.';
diff --git a/hwe/sammo/API/Message/GetRecentMessage.php b/hwe/sammo/API/Message/GetRecentMessage.php
index ae535db0..41c74a4d 100644
--- a/hwe/sammo/API/Message/GetRecentMessage.php
+++ b/hwe/sammo/API/Message/GetRecentMessage.php
@@ -73,7 +73,7 @@ class GetRecentMessage extends \sammo\BaseAPI
$db = DB::db();
- $me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
+ $me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
if ($me === null) {
return '장수가 사망했습니다.';
diff --git a/hwe/sammo/API/Message/SendMessage.php b/hwe/sammo/API/Message/SendMessage.php
index cc740342..9937bf36 100644
--- a/hwe/sammo/API/Message/SendMessage.php
+++ b/hwe/sammo/API/Message/SendMessage.php
@@ -108,7 +108,7 @@ class SendMessage extends \sammo\BaseAPI
$unlimited = new \DateTime('9999-12-31');
$db = DB::db();
- $destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
+ $destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
if (!$destUser) {
return '존재하지 않는 유저입니다.';
@@ -160,15 +160,18 @@ class SendMessage extends \sammo\BaseAPI
}
$db = DB::db();
- $me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission,belong FROM general WHERE `owner`=%i', $userID);
+ $me = $db->queryFirstRow(
+ 'SELECT `no`,`name`,`nation`,`officer_level`,`refresh_score`,`picture`,`imgsvr`,penalty,permission,belong FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE `owner`=%i', $userID
+ );
if (!$me) {
$session->logoutGame();
return '장수가 없습니다.';
}
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return '접속 제한입니다.';
}
diff --git a/hwe/sammo/API/Nation/GeneralList.php b/hwe/sammo/API/Nation/GeneralList.php
index 7aee9809..4a740589 100644
--- a/hwe/sammo/API/Nation/GeneralList.php
+++ b/hwe/sammo/API/Nation/GeneralList.php
@@ -5,6 +5,7 @@ namespace sammo\API\Nation;
use ArrayObject;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralQueryMode;
use sammo\General;
use sammo\Session;
use sammo\Util;
@@ -44,12 +45,10 @@ class GeneralList extends \sammo\BaseAPI
'special2' => 0,
'personal' => 0,
'belong' => 0,
- 'connect' => 0,
'troop' => 0,
'city' => 0,
- 'con' => 1,
'specage' => 0,
'specage2' => 0,
'leadership_exp' => 1,
@@ -83,6 +82,11 @@ class GeneralList extends \sammo\BaseAPI
'owner_name' => 9, //안씀.
+
+ //accessLog
+ 'refresh_score_total' => 0,
+ 'refresh_score' => 1,
+
//RANK
'warnum' => 1,
'killnum' => 1,
@@ -95,6 +99,8 @@ class GeneralList extends \sammo\BaseAPI
static $columnRemap = [
'special' => 'specialDomestic',
'special2' => 'specialWar',
+ 'refresh_score_total' => 'refreshScoreTotal',
+ 'refresh_score' => 'refreshScore',
'aux' => null,
];
@@ -143,9 +149,12 @@ class GeneralList extends \sammo\BaseAPI
$gameStor = \sammo\KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getValues(['year', 'month', 'turntime', 'turnterm', 'autorun_user', 'killturn']);
- $me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $session->getUserID());
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $me = $db->queryFirstRow(
+ 'SELECT refresh_score, turntime, belong, nation, officer_level, permission, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $session->getUserID()
+ );
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
}
@@ -156,9 +165,18 @@ class GeneralList extends \sammo\BaseAPI
- [$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys(static::$viewColumns), 1);
+ [$queryColumns, $rankColumns, $accessLogColumns] = General::mergeQueryColumn(array_keys(static::$viewColumns), GeneralQueryMode::Lite);
- $rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i ORDER BY turntime ASC', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
+ $rawGeneralList = Util::convertArrayToDict(
+ $db->query(
+ 'SELECT %l, %l from `general` LEFT JOIN general_access_log
+ ON `general`.`no` = general_access_log.general_id WHERE nation = %i ORDER BY turntime ASC',
+ Util::formatListOfBackticks($queryColumns),
+ Util::formatListOfBackticks($accessLogColumns),
+ $nationID
+ ),
+ 'no'
+ );
/** @var ArrayObject[] */
$troops = [];
@@ -179,19 +197,19 @@ class GeneralList extends \sammo\BaseAPI
if ($this->permission >= 1 || count($troops)) {
$reservedCommandTargetGeneralIDList = [];
- if($this->permission >= 1){
+ if ($this->permission >= 1) {
foreach ($rawGeneralList as $rawGeneral) {
if ($rawGeneral['npc'] < 2) {
$reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no'];
}
}
}
- foreach($troops as $troop){
+ foreach ($troops as $troop) {
$reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id'];
}
- if($reservedCommandTargetGeneralIDList){
+ if ($reservedCommandTargetGeneralIDList) {
$rawTurnList = $db->query(
'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc',
array_values($reservedCommandTargetGeneralIDList)
@@ -278,11 +296,11 @@ class GeneralList extends \sammo\BaseAPI
$resultColumns[$column] = $column;
}
- foreach ($troops as $troop){
+ foreach ($troops as $troop) {
$troopLeaderID = $troop['id'];
- $troop['reservedCommand'] = array_map(function($turnObj){
+ $troop['reservedCommand'] = array_map(function ($turnObj) {
$brief = $turnObj['brief'];
- if($brief == '집합'){
+ if ($brief == '집합') {
return $brief;
}
return '-';
diff --git a/hwe/sammo/API/Nation/GetGeneralLog.php b/hwe/sammo/API/Nation/GetGeneralLog.php
index 1be029b2..a9d556f9 100644
--- a/hwe/sammo/API/Nation/GetGeneralLog.php
+++ b/hwe/sammo/API/Nation/GetGeneralLog.php
@@ -109,10 +109,12 @@ class GetGeneralLog extends \sammo\BaseAPI
$reqTo = $this->args['reqTo'] ?? null;
$db = DB::db();
- $me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
+ $me = $db->queryFirstRow(
+ 'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID);
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return '접속 제한입니다.';
}
diff --git a/hwe/sammo/API/Nation/GetNationInfo.php b/hwe/sammo/API/Nation/GetNationInfo.php
index 25eade4f..9191459a 100644
--- a/hwe/sammo/API/Nation/GetNationInfo.php
+++ b/hwe/sammo/API/Nation/GetNationInfo.php
@@ -4,6 +4,7 @@ namespace sammo\API\Nation;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralQueryMode;
use sammo\GameConst;
use sammo\General;
use sammo\KVStorage;
@@ -65,7 +66,7 @@ class GetNationInfo extends \sammo\BaseAPI
];
}
- $generalObj = General::createGeneralObjFromDB($session->generalID, null, 1);
+ $generalObj = General::createGeneralObjFromDB($session->generalID, null, GeneralQueryMode::FullWithoutIAction);
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameEnv = $gameStor->getValues(['year', 'month', 'startyear']);
diff --git a/hwe/sammo/API/NationCommand/GetReservedCommand.php b/hwe/sammo/API/NationCommand/GetReservedCommand.php
index 5eb77e1a..42f8a9ca 100644
--- a/hwe/sammo/API/NationCommand/GetReservedCommand.php
+++ b/hwe/sammo/API/NationCommand/GetReservedCommand.php
@@ -6,6 +6,7 @@ use sammo\Session;
use DateTimeInterface;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralQueryMode;
use sammo\GameConst;
use sammo\General;
use sammo\Json;
@@ -39,12 +40,15 @@ class GetReservedCommand extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env');
$userID = $session->userID;
- $me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
+ $me = $db->queryFirstRow(
+ 'SELECT no,nation,officer_level,refresh_score,turntime,belong,penalty,permission FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+ );
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation = %i', $me['nation']);
$nationID = $me['nation'];
- $con = checkLimit($me['con']);
- if ($con >= 2) {
+ $limitState = checkLimit($me['refresh_score']);
+ if ($limitState >= 2) {
return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$me['turntime']})";
}
@@ -59,7 +63,7 @@ class GetReservedCommand extends \sammo\BaseAPI
$generals = [];
foreach ($db->query('SELECT no,name,turntime,npc,city,nation,officer_level FROM general WHERE nation = %i AND officer_level >= 5', $nationID) as $rawGeneral) {
- $generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, $year, $month, false);
+ $generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, null, $year, $month, false);
}
$nationTurnList = [];
@@ -109,7 +113,7 @@ class GetReservedCommand extends \sammo\BaseAPI
];
}
- $generalObj = General::createGeneralObjFromDB($session->generalID);
+ $generalObj = General::createGeneralObjFromDB($session->generalID, null, GeneralQueryMode::FullWithoutIAction);
return [
diff --git a/hwe/sammo/API/Vote/AddComment.php b/hwe/sammo/API/Vote/AddComment.php
index 1d27a9aa..417dd5de 100644
--- a/hwe/sammo/API/Vote/AddComment.php
+++ b/hwe/sammo/API/Vote/AddComment.php
@@ -6,6 +6,7 @@ use DateTimeInterface;
use sammo\DB;
use sammo\DTO\VoteComment;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralQueryMode;
use sammo\General;
use sammo\Session;
use sammo\TimeUtil;
@@ -40,7 +41,7 @@ class AddComment extends \sammo\BaseAPI
$text = mb_substr($this->args['text'], 0, 200);
$generalID = $session->generalID;
- $general = General::createGeneralObjFromDB($generalID, [], 0);
+ $general = General::createGeneralObjFromDB($generalID, null, GeneralQueryMode::Core);
$generalName = $general->getName();
$nationID = $general->getNationID();
$nationName = $general->getStaticNation()['name'];
diff --git a/hwe/sammo/API/Vote/Vote.php b/hwe/sammo/API/Vote/Vote.php
index 05a5e1db..bd5474b5 100644
--- a/hwe/sammo/API/Vote/Vote.php
+++ b/hwe/sammo/API/Vote/Vote.php
@@ -6,6 +6,7 @@ use DateTimeInterface;
use sammo\DB;
use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType;
+use sammo\Enums\GeneralQueryMode;
use sammo\General;
use sammo\Json;
use sammo\KVStorage;
@@ -105,7 +106,7 @@ class Vote extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env');
$voteReward = $gameStor->getValue('develcost') * 5;
- $general = General::createGeneralObjFromDB($generalID, ['gold', 'horse', 'weapon', 'book', 'item', 'npc', 'imgsvr', 'picture', 'aux'], 2);
+ $general = General::createGeneralObjFromDB($generalID, ['gold', 'horse', 'weapon', 'book', 'item', 'npc', 'imgsvr', 'picture', 'aux'], GeneralQueryMode::Lite);
$general->increaseVar('gold', $voteReward);
$uniqueRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
diff --git a/hwe/sammo/Betting.php b/hwe/sammo/Betting.php
index 9a4ec109..2c6604d2 100644
--- a/hwe/sammo/Betting.php
+++ b/hwe/sammo/Betting.php
@@ -5,6 +5,7 @@ namespace sammo;
use Ds\Map;
use sammo\DTO\BettingInfo;
use sammo\DTO\BettingItem;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn;
class Betting
@@ -401,7 +402,7 @@ class Betting
$userLogger->flush();
}
} else {
- $generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc', 'betgold'], 1);
+ $generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc', 'betgold'], GeneralQueryMode::Lite);
foreach ($rewardList as $rewardItem) {
$gambler = $generalList[$rewardItem['generalID']];
$reward = Util::round($rewardItem['amount']);
diff --git a/hwe/sammo/Command/General/che_등용.php b/hwe/sammo/Command/General/che_등용.php
index 196f6c6a..0b4b035e 100644
--- a/hwe/sammo/Command/General/che_등용.php
+++ b/hwe/sammo/Command/General/che_등용.php
@@ -21,7 +21,7 @@ use function \sammo\getNationStaticInfo;
use function sammo\tryUniqueItemLottery;
use \sammo\Constraint\ConstraintHelper;
-
+use sammo\Enums\GeneralQueryMode;
class che_등용 extends Command\GeneralCommand
{
@@ -77,7 +77,7 @@ class che_등용 extends Command\GeneralCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation', 'experience', 'dedication'], 0);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation', 'experience', 'dedication'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
[$reqGold, $reqRice] = $this->getCost();
diff --git a/hwe/sammo/Command/General/che_등용수락.php b/hwe/sammo/Command/General/che_등용수락.php
index 6c47e2a3..486da3c9 100644
--- a/hwe/sammo/Command/General/che_등용수락.php
+++ b/hwe/sammo/Command/General/che_등용수락.php
@@ -68,7 +68,7 @@ class che_등용수락 extends Command\GeneralCommand{
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, 2);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null);
$this->setDestGeneral($destGeneral);
$this->setDestNation($this->arg['destNationID'], ['gennum', 'scout']);
diff --git a/hwe/sammo/Command/General/che_선양.php b/hwe/sammo/Command/General/che_선양.php
index 6fc4f3f3..23be46a6 100644
--- a/hwe/sammo/Command/General/che_선양.php
+++ b/hwe/sammo/Command/General/che_선양.php
@@ -19,6 +19,7 @@ use function\sammo\tryUniqueItemLottery;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
class che_선양 extends Command\GeneralCommand
@@ -65,7 +66,7 @@ class che_선양 extends Command\GeneralCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'nation'], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'nation'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->fullConditionConstraints = [
diff --git a/hwe/sammo/Command/General/che_장수대상임관.php b/hwe/sammo/Command/General/che_장수대상임관.php
index 5182b55d..70bd734b 100644
--- a/hwe/sammo/Command/General/che_장수대상임관.php
+++ b/hwe/sammo/Command/General/che_장수대상임관.php
@@ -17,6 +17,7 @@ use function \sammo\tryUniqueItemLottery;
use function \sammo\getNationStaticInfo;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
class che_장수대상임관 extends Command\GeneralCommand{
@@ -83,7 +84,7 @@ class che_장수대상임관 extends Command\GeneralCommand{
protected function initWithArg()
{
$destGeneralID = $this->arg['destGeneralID'];
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation'], 0);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->setDestNation($this->destGeneralObj->getVar('nation'), ['gennum', 'scout']);
diff --git a/hwe/sammo/Command/General/che_증여.php b/hwe/sammo/Command/General/che_증여.php
index a1f1426a..c38493b4 100644
--- a/hwe/sammo/Command/General/che_증여.php
+++ b/hwe/sammo/Command/General/che_증여.php
@@ -15,6 +15,7 @@ use \sammo\Command;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use function sammo\tryUniqueItemLottery;
@@ -86,7 +87,7 @@ class che_증여 extends Command\GeneralCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->fullConditionConstraints = [
diff --git a/hwe/sammo/Command/General/che_화계.php b/hwe/sammo/Command/General/che_화계.php
index 385dd53d..1be84a5c 100644
--- a/hwe/sammo/Command/General/che_화계.php
+++ b/hwe/sammo/Command/General/che_화계.php
@@ -15,6 +15,7 @@ use function \sammo\searchDistance;
use \sammo\Constraint\ConstraintHelper;
use sammo\CityConst;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn;
use sammo\RandUtil;
@@ -268,7 +269,7 @@ class che_화계 extends Command\GeneralCommand
$destCityGeneralList = [];
$cityGeneralID = $db->queryFirstColumn('SELECT no FROM general WHERE city = %i AND nation = %i', $destCityID, $destNationID);
- $destCityGeneralList = General::createGeneralObjListFromDB($cityGeneralID, ['name', 'city', 'nation', 'officer_level', 'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item', 'last_turn', 'injury', 'special', 'special2', 'injury', 'crewtype', 'crew', 'atmos', 'train'], 2);
+ $destCityGeneralList = General::createGeneralObjListFromDB($cityGeneralID, ['name', 'city', 'nation', 'officer_level', 'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item', 'last_turn', 'injury', 'special', 'special2', 'injury', 'crewtype', 'crew', 'atmos', 'train']);
foreach ($destCityGeneralList as &$destCityGeneral) {
$destCityGeneral->setRawCity($this->destCity);
unset($destCityGeneral);
diff --git a/hwe/sammo/Command/Nation/che_몰수.php b/hwe/sammo/Command/Nation/che_몰수.php
index 8cc9ce82..8b51bd94 100644
--- a/hwe/sammo/Command/Nation/che_몰수.php
+++ b/hwe/sammo/Command/Nation/che_몰수.php
@@ -19,6 +19,7 @@ use function \sammo\GetImageURL;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\MessageType;
class che_몰수 extends Command\NationCommand
@@ -91,7 +92,7 @@ class che_몰수 extends Command\NationCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'npc', 'nation', 'imgsvr', 'picture'], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'npc', 'nation', 'imgsvr', 'picture'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$env = $this->env;
@@ -206,7 +207,7 @@ class che_몰수 extends Command\NationCommand
], 'nation=%i', $nationID);
$josaUl = JosaUtil::pick($amountText, '을');
-
+
$destGeneral->getLogger()->pushGeneralActionLog("{$resName} {$amountText}{$josaUl} 몰수 당했습니다.", ActionLogger::PLAIN);
$logger->pushGeneralActionLog("{$destGeneral->getName()}>에게서 {$resName} $amountText>{$josaUl} 몰수했습니다. <1>$date>");
diff --git a/hwe/sammo/Command/Nation/che_물자원조.php b/hwe/sammo/Command/Nation/che_물자원조.php
index a95aa84d..8f9ba797 100644
--- a/hwe/sammo/Command/Nation/che_물자원조.php
+++ b/hwe/sammo/Command/Nation/che_물자원조.php
@@ -216,15 +216,15 @@ class che_물자원조 extends Command\NationCommand
}
$josaUlRiceAmount = JosaUtil::pick($riceAmountText, '을');
-
- $logger->pushGeneralHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUl} 지원");
- $logger->pushNationalHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUl} 지원");
+
+ $logger->pushGeneralHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUlRiceAmount} 지원");
+ $logger->pushNationalHistoryLog("{$destNationName}>{$josaRo} 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUlRiceAmount} 지원");
$logger->pushGlobalHistoryLog("【원조】>{$nationName}>에서 {$destNationName}>{$josaRo} 물자를 지원합니다");
$logger->pushGeneralActionLog($broadcastMessage);
$logger->pushGeneralActionLog("{$destNationName}>{$josaRo} 물자를 지원합니다. <1>$date>", ActionLogger::PLAIN);
- $destBroadcastMessage = $broadcastMessage = "{$nationName}>에서 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUl} 원조했습니다.";
+ $destBroadcastMessage = $broadcastMessage = "{$nationName}>에서 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUlRiceAmount} 원조했습니다.";
$destChiefList = $db->queryFirstColumn('SELECT no FROM general WHERE officer_level >= 5 AND nation = %i', $destNationID);
foreach ($destChiefList as $destChiefID) {
$destChiefLogger = new ActionLogger($destChiefID, $nationID, $year, $month);
@@ -234,7 +234,7 @@ class che_물자원조 extends Command\NationCommand
$josaRoSrc = JosaUtil::pick($nationName, '로');
$destNationLogger = new ActionLogger(0, $destNationID, $year, $month);
- $destNationLogger->pushNationalHistoryLog("{$nationName}>{$josaRoSrc}부터 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUl} 지원 받음");
+ $destNationLogger->pushNationalHistoryLog("{$nationName}>{$josaRoSrc}부터 금{$goldAmountText}> 쌀{$riceAmountText}>{$josaUlRiceAmount} 지원 받음");
$destNationStor = KVStorage::getStorage(DB::db(), $destNationID, 'nation_env');
$destRecvAssist = $destNationStor->getValue('recv_assist') ?? [];
diff --git a/hwe/sammo/Command/Nation/che_발령.php b/hwe/sammo/Command/Nation/che_발령.php
index 7acf90dd..ddc3369a 100644
--- a/hwe/sammo/Command/Nation/che_발령.php
+++ b/hwe/sammo/Command/Nation/che_발령.php
@@ -21,6 +21,7 @@ use function \sammo\cutTurn;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
class che_발령 extends Command\NationCommand
{
@@ -71,7 +72,7 @@ class che_발령 extends Command\NationCommand
{
$this->setDestCity($this->arg['destCityID']);
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
if ($this->arg['destGeneralID'] == $this->getGeneral()->getID()) {
diff --git a/hwe/sammo/Command/Nation/che_불가침수락.php b/hwe/sammo/Command/Nation/che_불가침수락.php
index b422a481..ec348ecd 100644
--- a/hwe/sammo/Command/Nation/che_불가침수락.php
+++ b/hwe/sammo/Command/Nation/che_불가침수락.php
@@ -20,6 +20,7 @@ use function \sammo\getNationStaticInfo;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\Json;
use sammo\KVStorage;
use sammo\RandUtil;
@@ -103,7 +104,7 @@ class che_불가침수락 extends Command\NationCommand
$env = $this->env;
$relYear = $env['year'] - $env['startyear'];
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->setDestNation($this->arg['destNationID']);
diff --git a/hwe/sammo/Command/Nation/che_불가침파기수락.php b/hwe/sammo/Command/Nation/che_불가침파기수락.php
index 1f117ed8..a6962c7e 100644
--- a/hwe/sammo/Command/Nation/che_불가침파기수락.php
+++ b/hwe/sammo/Command/Nation/che_불가침파기수락.php
@@ -20,6 +20,7 @@ use function \sammo\getNationStaticInfo;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\RandUtil;
class che_불가침파기수락 extends Command\NationCommand
@@ -77,7 +78,7 @@ class che_불가침파기수락 extends Command\NationCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->setDestNation($this->arg['destNationID']);
diff --git a/hwe/sammo/Command/Nation/che_종전수락.php b/hwe/sammo/Command/Nation/che_종전수락.php
index dfbee08c..9e42ac30 100644
--- a/hwe/sammo/Command/Nation/che_종전수락.php
+++ b/hwe/sammo/Command/Nation/che_종전수락.php
@@ -22,6 +22,7 @@ use function \sammo\getNationStaticInfo;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
class che_종전수락 extends Command\NationCommand
{
@@ -86,7 +87,7 @@ class che_종전수락 extends Command\NationCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
$this->setDestNation($this->arg['destNationID']);
diff --git a/hwe/sammo/Command/Nation/che_포상.php b/hwe/sammo/Command/Nation/che_포상.php
index fdb73493..790fd504 100644
--- a/hwe/sammo/Command/Nation/che_포상.php
+++ b/hwe/sammo/Command/Nation/che_포상.php
@@ -15,6 +15,7 @@ use \sammo\Command;
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
class che_포상 extends Command\NationCommand
{
@@ -81,7 +82,7 @@ class che_포상 extends Command\NationCommand
protected function initWithArg()
{
- $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], 1);
+ $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], GeneralQueryMode::Lite);
$this->setDestGeneral($destGeneral);
if($this->arg['destGeneralID'] == $this->getGeneral()->getID()){
@@ -168,7 +169,7 @@ class che_포상 extends Command\NationCommand
], 'nation=%i', $nationID);
$josaUl = JosaUtil::pick($amountText, '을');
-
+
$destGeneral->getLogger()->pushGeneralActionLog("{$resName} {$amountText}>{$josaUl} 포상으로 받았습니다.", ActionLogger::PLAIN);
$logger->pushGeneralActionLog("{$destGeneral->getName()}>에게 {$resName} $amountText>{$josaUl} 수여했습니다. <1>$date>");
diff --git a/hwe/sammo/Command/Nation/che_필사즉생.php b/hwe/sammo/Command/Nation/che_필사즉생.php
index 431b0c63..9d56addb 100644
--- a/hwe/sammo/Command/Nation/che_필사즉생.php
+++ b/hwe/sammo/Command/Nation/che_필사즉생.php
@@ -15,6 +15,7 @@ use \sammo\{
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
+use sammo\Enums\GeneralQueryMode;
use sammo\Event\Action;
class che_필사즉생 extends Command\NationCommand{
@@ -94,7 +95,7 @@ class che_필사즉생 extends Command\NationCommand{
$broadcastMessage = "{$generalName}>{$josaYi} 필사즉생>을 발동하였습니다.";
$targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID);
- foreach(General::createGeneralObjListFromDB($targetGeneralList, ['train', 'atmos'], 1) as $targetGeneral){
+ foreach(General::createGeneralObjListFromDB($targetGeneralList, ['train', 'atmos'], GeneralQueryMode::Lite) as $targetGeneral){
$targetGeneral->getLogger()->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN);
if($targetGeneral->getVar('train') < 100){
$targetGeneral->setVar('train', 100);
diff --git a/hwe/sammo/Constraint/ReqGeneralCrewMargin.php b/hwe/sammo/Constraint/ReqGeneralCrewMargin.php
index d1d141e2..1f8f5e8d 100644
--- a/hwe/sammo/Constraint/ReqGeneralCrewMargin.php
+++ b/hwe/sammo/Constraint/ReqGeneralCrewMargin.php
@@ -39,7 +39,7 @@ class ReqGeneralCrewMargin extends Constraint{
//XXX: 왜 General -> obj -> General 변환을 하고 있나?
//FIXME: RankVar, city에 따라 통솔이 바뀐다면 이 부분에 문제가 발생.
- $generalObj = new General($this->general, null, null, null, null, null, true);
+ $generalObj = new General($this->general, null, null, null, null, null, null, true);
if($reqCrewType->id != $generalObj->getCrewTypeObj()->id){
return true;
diff --git a/hwe/sammo/DTO/GeneralAccessLog.php b/hwe/sammo/DTO/GeneralAccessLog.php
new file mode 100644
index 00000000..d70731f6
--- /dev/null
+++ b/hwe/sammo/DTO/GeneralAccessLog.php
@@ -0,0 +1,38 @@
+dest->generalID, ['picture', 'imgsvr', 'aux'], 1);
+ $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], GeneralQueryMode::Lite);
$commandObj = buildNationCommandClass('che_불가침수락', $destGeneralObj, $gameStor->getAll(true), new LastTurn(), [
'destNationID'=>$this->src->nationID,
@@ -99,7 +100,7 @@ class DiplomaticMessage extends Message{
protected function cancelNA(){
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
- $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], 1);
+ $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], GeneralQueryMode::Lite);
$commandObj = buildNationCommandClass('che_불가침파기수락', $destGeneralObj, $gameStor->getAll(true), new LastTurn(), [
'destNationID'=>$this->src->nationID,
@@ -121,7 +122,7 @@ class DiplomaticMessage extends Message{
protected function stopWar(){
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
- $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], 1);
+ $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], GeneralQueryMode::Lite);
$commandObj = buildNationCommandClass('che_종전수락', $destGeneralObj, $gameStor->getAll(true), new LastTurn(), [
'destNationID'=>$this->src->nationID,
diff --git a/hwe/sammo/Enums/GeneralAccessLogColumn.php b/hwe/sammo/Enums/GeneralAccessLogColumn.php
new file mode 100644
index 00000000..0119e116
--- /dev/null
+++ b/hwe/sammo/Enums/GeneralAccessLogColumn.php
@@ -0,0 +1,14 @@
+setValue('isunited', 3);
$logger->flush();
- $gameStor->conlimit = $gameStor->conlimit * 100;
+ $gameStor->refreshLimit = $gameStor->refreshLimit * 100;
$eventID = Util::array_get($env['currentEventID']);
$db->delete('event', 'id = %i', $eventID);
diff --git a/hwe/sammo/Event/Action/MergeInheritPointRank.php b/hwe/sammo/Event/Action/MergeInheritPointRank.php
index a93d1e55..47a07880 100644
--- a/hwe/sammo/Event/Action/MergeInheritPointRank.php
+++ b/hwe/sammo/Event/Action/MergeInheritPointRank.php
@@ -18,7 +18,7 @@ class MergeInheritPointRank extends \sammo\Event\Action
{
$db = DB::db();
- $generals = General::createGeneralObjListFromDB(null, null, 2);
+ $generals = General::createGeneralObjListFromDB(null, null);
$points = new Map();
$points->allocate(count($generals));
diff --git a/hwe/sammo/Event/Action/ProcessIncome.php b/hwe/sammo/Event/Action/ProcessIncome.php
index f0ad251d..7173070f 100644
--- a/hwe/sammo/Event/Action/ProcessIncome.php
+++ b/hwe/sammo/Event/Action/ProcessIncome.php
@@ -88,7 +88,7 @@ class ProcessIncome extends \sammo\Event\Action
// 각 장수들에게 지급
foreach ($generalRawList as $rawGeneral) {
- $generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
+ $generalObj = new General($rawGeneral, null, null, null, null, $year, $month, false);
$gold = Util::round(getBill($generalObj->getVar('dedication')) * $ratio);
$generalObj->increaseVar('gold', $gold);
@@ -169,7 +169,7 @@ class ProcessIncome extends \sammo\Event\Action
// 각 장수들에게 지급
foreach ($generalRawList as $rawGeneral) {
- $generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
+ $generalObj = new General($rawGeneral, null, null, null, null, $year, $month, false);
$rice = Util::round(getBill($generalObj->getVar('dedication')) * $ratio);
$generalObj->increaseVar('rice', $rice);
diff --git a/hwe/sammo/Event/Action/RaiseDisaster.php b/hwe/sammo/Event/Action/RaiseDisaster.php
index 28cc3b9a..da7cb8b0 100644
--- a/hwe/sammo/Event/Action/RaiseDisaster.php
+++ b/hwe/sammo/Event/Action/RaiseDisaster.php
@@ -131,7 +131,7 @@ class RaiseDisaster extends \sammo\Event\Action
$generalList = array_map(
function ($rawGeneral) use ($city, $year, $month) {
- return new General($rawGeneral, null, $city, null, $year, $month, false);
+ return new General($rawGeneral, null, null, $city, null, $year, $month, false);
},
$generalListByCity[$city['city']] ?? []
);
diff --git a/hwe/sammo/Event/Action/UpdateNationLevel.php b/hwe/sammo/Event/Action/UpdateNationLevel.php
index ea520cd0..72b7bc26 100644
--- a/hwe/sammo/Event/Action/UpdateNationLevel.php
+++ b/hwe/sammo/Event/Action/UpdateNationLevel.php
@@ -5,6 +5,7 @@ namespace sammo\Event\Action;
use sammo\ActionLogger;
use sammo\CityConst;
use sammo\DB;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\GameConst;
use sammo\General;
@@ -139,7 +140,7 @@ class UpdateNationLevel extends \sammo\Event\Action
$nation['nation'],
$targetKillTurn
);
- $nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux'], 2);
+ $nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux']);
$chiefID = null;
$uniqueLotteryWeightList = [];
@@ -214,7 +215,7 @@ class UpdateNationLevel extends \sammo\Event\Action
}
if ($chiefID) {
- $chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], 2);
+ $chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], GeneralQueryMode::Lite);
$chiefObj->increaseInheritancePoint(InheritanceKey::unifier, 250 * $levelDiff);
$chiefObj->applyDB($db);
}
diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php
index 03b8b7bc..cb856ef0 100644
--- a/hwe/sammo/General.php
+++ b/hwe/sammo/General.php
@@ -4,6 +4,8 @@ namespace sammo;
use Ds\Map;
use sammo\Command\GeneralCommand;
+use sammo\Enums\GeneralAccessLogColumn;
+use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\Enums\RankColumn;
use sammo\WarUnitTrigger as WarUnitTrigger;
@@ -23,6 +25,9 @@ class General implements iAction
/** @var Map */
protected Map $rankVarSet;
+ /** @var Map */
+ protected ?Map $accessLogRead;
+
/** @var \sammo\ActionLogger */
protected $logger;
@@ -78,12 +83,13 @@ class General implements iAction
/**
* @param array $raw DB row값.
* @param null|Map $rawRank
+ * @param null|Map $rawAccessLog
* @param null|array $city DB city 테이블의 row값
* @param int|null $year 게임 연도
* @param int|null $month 게임 월
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능
*/
- public function __construct(array $raw, ?Map $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true)
+ public function __construct(array $raw, ?Map $rawRank, ?Map $rawAccessLog, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true)
{
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
@@ -109,6 +115,10 @@ class General implements iAction
} else {
$this->rankVarRead = new Map();
}
+
+ $this->accessLogRead = $rawAccessLog;
+
+
$this->rankVarIncrease = new Map();
$this->rankVarSet = new Map();
@@ -329,7 +339,7 @@ class General implements iAction
function getCrewTypeObj(): GameUnitDetail
{
- if($this->crewType === null) {
+ if ($this->crewType === null) {
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
}
return $this->crewType;
@@ -677,6 +687,7 @@ class General implements iAction
$db->delete('general', 'no=%i', $generalID);
$db->delete('general_turn', 'general_id=%i', $generalID);
$db->delete('rank_data', 'general_id=%i', $generalID);
+ $db->delete('general_access_log', 'general_id=%i', $generalID);
$this->updatedVar = [];
$db->update('nation', [
@@ -770,6 +781,19 @@ class General implements iAction
return $this->rankVarRead[$key];
}
+ function getAccessLogVar(GeneralAccessLogColumn $key, $defaultValue = null): int | string | null
+ {
+ if (!$this->accessLogRead) {
+ return $defaultValue;
+ }
+
+ if (!$this->accessLogRead->hasKey($key)) {
+ return $defaultValue;
+ }
+
+ return $this->accessLogRead[$key];
+ }
+
/**
* @param \MeekroDB $db
*/
@@ -844,7 +868,7 @@ class General implements iAction
$this->increaseVar($statName, -1);
$result = true;
} else if ($this->getVar($statExpName) >= $limit) {
- if($this->getVar($statName) < GameConst::$maxLevel) {
+ if ($this->getVar($statName) < GameConst::$maxLevel) {
$logger->pushGeneralActionLog("{$statNickName}>이 1> 올랐습니다!", ActionLogger::PLAIN);
$this->increaseVar($statName, 1);
}
@@ -856,7 +880,8 @@ class General implements iAction
return $result;
}
- protected function getActionList(): array{
+ protected function getActionList(): array
+ {
return array_merge([
$this->nationType,
$this->officerLevelObj,
@@ -1007,7 +1032,7 @@ class General implements iAction
return $caller;
}
- static public function mergeQueryColumn(?array $reqColumns = null, int $constructMode = 2): array
+ static public function mergeQueryColumn(?array $reqColumns = null, GeneralQueryMode $queryMode = GeneralQueryMode::Full): array
{
$minimumColumn = ['no', 'name', 'npc', 'city', 'nation', 'officer_level', 'officer_city'];
$defaultEventColumn = [
@@ -1023,52 +1048,84 @@ class General implements iAction
'personal', 'special', 'special2', 'defence_train', 'tnmt', 'npc', 'npc_org', 'deadyear', 'npcmsg',
'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'betray',
'recent_war', 'last_turn', 'myset',
- 'specage', 'specage2', 'con', 'connect', 'aux', 'lastrefresh', 'permission', 'penalty',
+ 'specage', 'specage2', 'aux', 'permission', 'penalty',
+ ];
+ $fullAcessLogColumn = [
+ GeneralAccessLogColumn::refreshScore,
+ GeneralAccessLogColumn::refreshScoreTotal,
];
if ($reqColumns === null) {
- return [$fullColumn, RankColumn::cases()];
+ switch ($queryMode) {
+ case GeneralQueryMode::Core:
+ return [$minimumColumn, [], []];
+ case GeneralQueryMode::Lite:
+ return [$defaultEventColumn, [], []];
+ case GeneralQueryMode::FullWithoutIAction:
+ case GeneralQueryMode::Full:
+ return [$fullColumn, RankColumn::cases(), []];
+ case GeneralQueryMode::FullWithAccessLog:
+ return [$fullColumn, RankColumn::cases(), $fullAcessLogColumn];
+ }
}
/** @var RankColumn[] */
$rankColumn = [];
$subColumn = [];
+ $accessLogColumn = [];
foreach ($reqColumns as $column) {
if ($column instanceof RankColumn) {
$rankColumn[] = $column;
continue;
}
-
- $rankKey = RankColumn::tryFrom($column);
- if ($rankKey !== null) {
- $rankColumn[] = $rankKey;
- } else {
- $subColumn[] = $column;
+ if ($column instanceof GeneralAccessLogColumn) {
+ $accessLogColumn[] = $column;
+ continue;
}
+
+
+ $enumKey = RankColumn::tryFrom($column);
+ if ($enumKey !== null) {
+ $rankColumn[] = $enumKey;
+ continue;
+ }
+ $enumKey = GeneralAccessLogColumn::tryFrom($column);
+ if ($enumKey !== null) {
+ $accessLogColumn[] = $enumKey;
+ continue;
+ }
+ $subColumn[] = $column;
}
- if ($constructMode > 1) {
- return [array_unique(array_merge($defaultEventColumn, $subColumn)), $rankColumn];
+ switch ($queryMode) {
+ case GeneralQueryMode::Core:
+ case GeneralQueryMode::Lite:
+ return [array_unique(array_merge($minimumColumn, $subColumn)), $rankColumn, $accessLogColumn];
+ case GeneralQueryMode::FullWithoutIAction:
+ case GeneralQueryMode::Full:
+ return [array_unique(array_merge($defaultEventColumn, $subColumn)), $rankColumn, $accessLogColumn];
+ case GeneralQueryMode::FullWithAccessLog:
+ return [array_unique(array_merge($fullColumn, $subColumn)), $rankColumn, array_unique(array_merge($fullAcessLogColumn, $accessLogColumn))];
+ default:
+ throw new \RuntimeException('invalid query mode');
}
-
- return [array_unique(array_merge($minimumColumn, $subColumn)), $rankColumn];
}
/**
* @param ?int[] $generalIDList
* @param null|array $column
- * @param int $constructMode
+ * @param GeneralQueryMode $queryMode
* @return \sammo\General[]
* @throws MustNotBeReachedException
*/
- static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column = null, int $constructMode = 2): array
+ static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column = null, GeneralQueryMode $queryMode = GeneralQueryMode::Full): array
{
if ($generalIDList === []) {
return [];
}
$db = DB::db();
- if ($constructMode > 0) {
+ if ($queryMode->value > 0) {
$gameStor = KVStorage::getStorage($db, 'game_env');
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
} else {
@@ -1079,14 +1136,16 @@ class General implements iAction
/**
* @var string[] $column
* @var RankColumn[] $rankColumn
+ * @var GeneralAccessLogColumn[] $accessLogColumn
*/
- [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode);
+ [$column, $rankColumn, $accessLogColumn] = static::mergeQueryColumn($column, $queryMode);
if ($generalIDList === null) {
$rawGenerals = Util::convertArrayToDict(
$db->query('SELECT %l FROM general WHERE 1', Util::formatListOfBackticks($column)),
'no'
);
+
$generalIDList = array_keys($rawGenerals);
} else {
$rawGenerals = Util::convertArrayToDict(
@@ -1114,25 +1173,42 @@ class General implements iAction
}
}
+ $rawAccessLogs = new Map();
+ if ($accessLogColumn) {
+ $rawValue = $db->query(
+ 'SELECT `general_id`, %l FROM general_access_log WHERE general_id IN %li',
+ Util::formatListOfBackticks($accessLogColumn),
+ $generalIDList
+ );
+ foreach ($rawValue as $rawLog) {
+ $generalID = $rawLog['general_id'];
+ $logValue = new Map();
+ foreach ($rawLog as $key => $value) {
+ $logValue[GeneralAccessLogColumn::from($key)] = $value;
+ }
+ $rawAccessLogs[$generalID] = $logValue;
+ }
+ }
+
$result = [];
foreach ($generalIDList as $generalID) {
if (!key_exists($generalID, $rawGenerals)) {
- $result[$generalID] = new DummyGeneral($constructMode > 0);
+ $result[$generalID] = new DummyGeneral($queryMode->value > 0);
continue;
}
if ($rawRanks->hasKey($generalID) && $rawRanks[$generalID]->count() !== count($rankColumn)) {
throw new \RuntimeException('column의 수가 일치하지 않음 : ' . $generalID);
}
- $result[$generalID] = new static($rawGenerals[$generalID], $rawRanks[$generalID] ?? null, null, null, $year, $month, $constructMode > 1);
+ $result[$generalID] = new static($rawGenerals[$generalID], $rawRanks[$generalID] ?? null, $rawAccessLogs[$generalID] ?? null, null, null, $year, $month, $queryMode->value >= GeneralQueryMode::Full->value);
}
return $result;
}
- static public function createGeneralObjFromDB(int $generalID, ?array $column = null, int $constructMode = 2): self
+ static public function createGeneralObjFromDB(int $generalID, ?array $column = null, GeneralQueryMode $queryMode = GeneralQueryMode::Full): self
{
$db = DB::db();
- if ($constructMode > 0) {
+ if ($queryMode->value > 0) {
$gameStor = KVStorage::getStorage($db, 'game_env');
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
} else {
@@ -1143,12 +1219,39 @@ class General implements iAction
/**
* @var string[] $column
* @var RankColumn[] $rankColumn
+ * @var GeneralAccessLogCoumn[] $accessLogColumn
*/
- [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode);
+ [$column, $rankColumn, $accessLogColumn] = static::mergeQueryColumn($column, $queryMode);
+
+ /** @var Map|null */
+ $rawAccessLog = null;
+
+ if (!$accessLogColumn) {
+ $rawGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no = %i', Util::formatListOfBackticks($column), $generalID);
+ } else {
+ $rawGeneral = $db->queryFirstRow(
+ 'SELECT %l, %l FROM `general` LEFT JOIN general_access_log
+ ON general.no = general_access_log.general_id WHERE no = %i',
+ Util::formatListOfBackticks($column),
+ Util::formatListOfBackticks($accessLogColumn),
+ $generalID
+ );
+
+ $rawAccessLog = new Map();
+ foreach ($accessLogColumn as $accessLogKey) {
+ if (!key_exists($accessLogKey->value, $rawGeneral)) {
+ continue;
+ }
+ $rawAccessLog[$accessLogKey] = $rawGeneral[$accessLogKey->value];
+ unset($rawGeneral[$accessLogKey->value]);
+ }
+ if ($rawAccessLog->count() === 0) {
+ $rawAccessLog = null;
+ }
+ }
- $rawGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no = %i', Util::formatListOfBackticks($column), $generalID);
if (!$rawGeneral) {
- return new DummyGeneral($constructMode > 0);
+ return new DummyGeneral($queryMode->value > 0);
}
$rawRankValues = new Map();
@@ -1165,7 +1268,7 @@ class General implements iAction
}
- $general = new static($rawGeneral, $rawRankValues, null, null, $year, $month, $constructMode > 1);
+ $general = new static($rawGeneral, $rawRankValues, $rawAccessLog, null, null, $year, $month, $queryMode->value >= GeneralQueryMode::Full->value);
return $general;
}
diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php
index 122bda5f..0a8a5018 100644
--- a/hwe/sammo/GeneralAI.php
+++ b/hwe/sammo/GeneralAI.php
@@ -3514,7 +3514,7 @@ class GeneralAI
$db = DB::db();
$generalIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation = %i AND no != %i', $nationID, $this->general->getID());
- $nationGenerals = General::createGeneralObjListFromDB($generalIDList, null, 2);
+ $nationGenerals = General::createGeneralObjListFromDB($generalIDList);
$lastWar = \PHP_INT_MAX;
foreach ($nationGenerals as $nationGeneral) {
diff --git a/hwe/sammo/RaiseInvaderMessage.php b/hwe/sammo/RaiseInvaderMessage.php
index ded98277..33b65e89 100644
--- a/hwe/sammo/RaiseInvaderMessage.php
+++ b/hwe/sammo/RaiseInvaderMessage.php
@@ -66,7 +66,7 @@ class RaiseInvaderMessage extends Message
}
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
- $general = \sammo\General::createGeneralObjFromDB($receiverID, null, 2);
+ $general = \sammo\General::createGeneralObjFromDB($receiverID);
$logger = $general->getLogger();
diff --git a/hwe/sammo/ResetHelper.php b/hwe/sammo/ResetHelper.php
index 917cb2ba..a6cb8003 100644
--- a/hwe/sammo/ResetHelper.php
+++ b/hwe/sammo/ResetHelper.php
@@ -280,7 +280,7 @@ class ResetHelper{
'msg'=>'공지사항',//TODO:공지사항
'maxgeneral'=>GameConst::$defaultMaxGeneral,
'maxnation'=>GameConst::$defaultMaxNation,
- 'conlimit'=>30000,
+ 'refreshLimit'=>30000,
'develcost'=>$develcost,
'turntime'=>$turntime,
'starttime'=>$starttime,
diff --git a/hwe/sammo/Scenario/GeneralBuilder.php b/hwe/sammo/Scenario/GeneralBuilder.php
index b0d352da..31ddb4a1 100644
--- a/hwe/sammo/Scenario/GeneralBuilder.php
+++ b/hwe/sammo/Scenario/GeneralBuilder.php
@@ -708,7 +708,6 @@ class GeneralBuilder{
'dex4'=>$this->dex4,
'dex5'=>$this->dex5,
'aux'=>\sammo\Json::encode($this->aux),
- 'lastrefresh'=>TimeUtil::now(),
]);
$this->generalID = $db->insertId();
$turnRows = [];
diff --git a/hwe/sammo/ScoutMessage.php b/hwe/sammo/ScoutMessage.php
index 76a54d48..0a5ffe23 100644
--- a/hwe/sammo/ScoutMessage.php
+++ b/hwe/sammo/ScoutMessage.php
@@ -65,7 +65,7 @@ class ScoutMessage extends Message{
}
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
- $general = \sammo\General::createGeneralObjFromDB($receiverID, null, 2);
+ $general = \sammo\General::createGeneralObjFromDB($receiverID);
$logger = $general->getLogger();
diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php
index c20a1a76..ca17ad71 100644
--- a/hwe/sammo/TurnExecutionHelper.php
+++ b/hwe/sammo/TurnExecutionHelper.php
@@ -175,7 +175,9 @@ class TurnExecutionHelper
$general = $this->getGeneral();
$generalID = $general->getID();
$logger = $general->getLogger();
- $general->setVar('con', 0);
+ $db->update('general_access_log', [
+ 'refresh_score' => 0,
+ ], 'general_id=%i', $generalID);
$generalName = $general->getName();
@@ -194,6 +196,8 @@ class TurnExecutionHelper
$general->setVar('owner', 0);
$general->setVar('defence_train', 80);
$general->setVar('owner_name', null);
+
+ $db->delete('general_access_log', 'general_id=%i', $generalID);
} else {
$general->applyDB($db);
$general->kill($db);
diff --git a/hwe/sql/reset.sql b/hwe/sql/reset.sql
index 6bc7fb73..e9e9ab2e 100644
--- a/hwe/sql/reset.sql
+++ b/hwe/sql/reset.sql
@@ -1,6 +1,7 @@
# 장수 테이블 삭제
DROP TABLE IF EXISTS general;
DROP TABLE IF EXISTS `general_turn`;
+DROP TABLE IF EXISTS `general_access_log`;
# 국가 테이블 삭제
DROP TABLE IF EXISTS nation;
DROP TABLE IF EXISTS `nation_turn`;
diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql
index 7cec1362..dc59b926 100644
--- a/hwe/sql/schema.sql
+++ b/hwe/sql/schema.sql
@@ -11,11 +11,6 @@ CREATE TABLE `general` (
`bornyear` INT(3) NULL DEFAULT '180',
`deadyear` INT(3) NULL DEFAULT '300',
`newmsg` INT(1) NULL DEFAULT '0',
- `con` INT(6) NOT NULL DEFAULT '0',
- `connect` INT(6) NOT NULL DEFAULT '0',
- `refresh` INT(6) NOT NULL DEFAULT '0',
- `logcnt` INT(6) NULL DEFAULT '1',
- `refcnt` INT(6) NULL DEFAULT '1',
`picture` VARCHAR(40) NOT NULL,
`imgsvr` INT(1) NOT NULL DEFAULT '0',
`name` VARCHAR(32) NOT NULL COLLATE 'utf8mb4_bin',
@@ -54,9 +49,6 @@ CREATE TABLE `general` (
`recent_war` DATETIME(6) NULL DEFAULT NULL,
`makelimit` INT(2) NULL DEFAULT '0',
`killturn` INT(3) NULL DEFAULT NULL,
- `lastconnect` DATETIME NULL DEFAULT NULL,
- `lastrefresh` DATETIME NULL DEFAULT NULL,
- `ip` VARCHAR(40) NULL DEFAULT '',
`block` INT(1) NULL DEFAULT '0',
`dedlevel` INT(2) NULL DEFAULT '0',
`explevel` INT(2) NULL DEFAULT '0',
@@ -87,7 +79,6 @@ CREATE TABLE `general` (
INDEX `officer_level` (`nation`, `officer_level`),
INDEX `officer_city` (`officer_city`, `officer_level`),
INDEX `name` (`name`),
- INDEX `last_refresh` (`lastrefresh`),
CONSTRAINT `json1` CHECK (json_valid(`last_turn`)),
CONSTRAINT `json2` CHECK (json_valid(`aux`)),
CONSTRAINT `json3` CHECK (json_valid(`penalty`))
@@ -102,6 +93,21 @@ CREATE TABLE `general_turn` (
PRIMARY KEY (`id`),
UNIQUE INDEX `general_id` (`general_id`, `turn_idx`)
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
+CREATE TABLE `general_access_log` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `general_id` INT(11) NOT NULL,
+ `user_id` INT(11) NULL DEFAULT NULL,
+ `last_refresh` DATETIME NULL DEFAULT NULL,
+ `refresh` INT(11) NOT NULL DEFAULT '0',
+ `refresh_total` INT(11) NOT NULL DEFAULT '0',
+ `refresh_score` INT(11) NOT NULL DEFAULT '0',
+ `refresh_score_total` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `general_id` (`general_id`)
+)
+COLLATE='utf8mb4_general_ci'
+ENGINE=Aria;
+
##############################
## 국가 테이블
##############################
diff --git a/hwe/t_diplomacy.php b/hwe/t_diplomacy.php
index 1969d018..dc4f6c81 100644
--- a/hwe/t_diplomacy.php
+++ b/hwe/t_diplomacy.php
@@ -13,11 +13,14 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("내무부", 1);
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
diff --git a/hwe/test-ts/formatScore.test.ts b/hwe/test-ts/formatScore.test.ts
index 771b1602..771702cb 100644
--- a/hwe/test-ts/formatScore.test.ts
+++ b/hwe/test-ts/formatScore.test.ts
@@ -1,48 +1,48 @@
import chai, { assert } from "chai";
import _ from "lodash-es";
-import { formatConnectScore } from "../ts/utilGame/formatConnectScore";
+import { formatRefreshScore } from "../ts/utilGame/formatRefreshScore";
import { formatDexLevel } from "../ts/utilGame/formatDexLevel";
import { formatDefenceTrain } from "../ts/utilGame/formatDefenceTrain";
import { formatHonor } from "../ts/utilGame/formatHonor";
-describe("formatConnectScore", () => {
- it("connectScoreEqual", () => {
- assert.equal(formatConnectScore(0), "안함");
- assert.equal(formatConnectScore(50), "무관심");
- assert.equal(formatConnectScore(100), "보통");
- assert.equal(formatConnectScore(200), "가끔");
- assert.equal(formatConnectScore(400), "자주");
- assert.equal(formatConnectScore(800), "열심");
- assert.equal(formatConnectScore(1600), "중독");
- assert.equal(formatConnectScore(3200), "폐인");
- assert.equal(formatConnectScore(6400), "경고");
- assert.equal(formatConnectScore(12800), "헐...");
+describe("formatRefreshScore", () => {
+ it("refreshScoreEqual", () => {
+ assert.equal(formatRefreshScore(0), "안함");
+ assert.equal(formatRefreshScore(50), "무관심");
+ assert.equal(formatRefreshScore(100), "보통");
+ assert.equal(formatRefreshScore(200), "가끔");
+ assert.equal(formatRefreshScore(400), "자주");
+ assert.equal(formatRefreshScore(800), "열심");
+ assert.equal(formatRefreshScore(1600), "중독");
+ assert.equal(formatRefreshScore(3200), "폐인");
+ assert.equal(formatRefreshScore(6400), "경고");
+ assert.equal(formatRefreshScore(12800), "헐...");
});
- it("connectScore+1", () => {
- assert.equal(formatConnectScore(1), "안함");
- assert.equal(formatConnectScore(51), "무관심");
- assert.equal(formatConnectScore(101), "보통");
- assert.equal(formatConnectScore(201), "가끔");
- assert.equal(formatConnectScore(401), "자주");
- assert.equal(formatConnectScore(801), "열심");
- assert.equal(formatConnectScore(1601), "중독");
- assert.equal(formatConnectScore(3201), "폐인");
- assert.equal(formatConnectScore(6401), "경고");
- assert.equal(formatConnectScore(12801), "헐...");
+ it("refreshScore+1", () => {
+ assert.equal(formatRefreshScore(1), "안함");
+ assert.equal(formatRefreshScore(51), "무관심");
+ assert.equal(formatRefreshScore(101), "보통");
+ assert.equal(formatRefreshScore(201), "가끔");
+ assert.equal(formatRefreshScore(401), "자주");
+ assert.equal(formatRefreshScore(801), "열심");
+ assert.equal(formatRefreshScore(1601), "중독");
+ assert.equal(formatRefreshScore(3201), "폐인");
+ assert.equal(formatRefreshScore(6401), "경고");
+ assert.equal(formatRefreshScore(12801), "헐...");
});
- it("connectScoreF-1", () => {
- assert.equal(formatConnectScore(49), "안함");
- assert.equal(formatConnectScore(99), "무관심");
- assert.equal(formatConnectScore(199), "보통");
- assert.equal(formatConnectScore(399), "가끔");
- assert.equal(formatConnectScore(799), "자주");
- assert.equal(formatConnectScore(1599), "열심");
- assert.equal(formatConnectScore(3199), "중독");
- assert.equal(formatConnectScore(6399), "폐인");
- assert.equal(formatConnectScore(11799), "경고");
- assert.equal(formatConnectScore(20000), "헐...");
+ it("refreshScoreF-1", () => {
+ assert.equal(formatRefreshScore(49), "안함");
+ assert.equal(formatRefreshScore(99), "무관심");
+ assert.equal(formatRefreshScore(199), "보통");
+ assert.equal(formatRefreshScore(399), "가끔");
+ assert.equal(formatRefreshScore(799), "자주");
+ assert.equal(formatRefreshScore(1599), "열심");
+ assert.equal(formatRefreshScore(3199), "중독");
+ assert.equal(formatRefreshScore(6399), "폐인");
+ assert.equal(formatRefreshScore(11799), "경고");
+ assert.equal(formatRefreshScore(20000), "헐...");
});
});
diff --git a/hwe/ts/components/GeneralBasicCard.vue b/hwe/ts/components/GeneralBasicCard.vue
index 0314516d..0d1a1e4f 100644
--- a/hwe/ts/components/GeneralBasicCard.vue
+++ b/hwe/ts/components/GeneralBasicCard.vue
@@ -151,8 +151,8 @@
벌점
-
- {{ formatConnectScore(general.connect) }} {{ general.connect.toLocaleString() }}점({{ general.con }})
+
+ {{ formatRefreshScore(general.refreshScoreTotal) }} {{ (general.refreshScoreTotal ?? 0).toLocaleString() }}점({{ general.refreshScore ?? 0 }})
@@ -168,7 +168,7 @@ import { unwrap } from "@/util/unwrap";
import type { GameConstStore } from "@/GameConstStore";
import { formatGeneralTypeCall } from "@/utilGame/formatGeneralTypeCall";
import { nextExpLevelRemain } from "@/utilGame/nextExpLevelRemain";
-import { formatConnectScore } from "@/utilGame/formatConnectScore";
+import { formatRefreshScore } from "@/utilGame/formatRefreshScore";
import SammoBar from "@/components/SammoBar.vue";
import { parseTime } from "@/util/parseTime";
import { clamp } from "lodash-es";
@@ -341,7 +341,7 @@ watch(
grid-column: 2 / 4;
}
-.general-connect-score {
+.general-refresh-score-total {
grid-column: 5 / 8;
}
diff --git a/hwe/ts/components/GeneralList.vue b/hwe/ts/components/GeneralList.vue
index 32c80188..321cc784 100644
--- a/hwe/ts/components/GeneralList.vue
+++ b/hwe/ts/components/GeneralList.vue
@@ -42,7 +42,7 @@
class="form-check-label"
:for="`column-type-${colID}`"
:style="{
- textDecoration: validColumns.has(colID) ? undefined : 'line-through',
+ textDecoration: validColumns.has(colID) ? undefined : 'line-through'
}"
>
{{ col.getColDef().headerName }}
@@ -57,7 +57,7 @@
,
- required: true,
+ required: true
},
troops: {
type: Object as PropType>,
- required: true,
+ required: true
},
height: {
type: String as PropType<"static" | "fill" | number | `${number}px` | `${number}%`>,
required: false,
- default: "static",
+ default: "static"
},
env: {
type: Object as PropType,
- required: true,
+ required: true
},
toolbarID: {
type: String,
required: false,
- default: undefined,
+ default: undefined
},
role: {
type: String,
required: false,
- default: "generic",
+ default: "generic"
},
availableGeneralClick: {
type: Boolean,
required: false,
- default: true,
- },
+ default: true
+ }
});
const emit = defineEmits<{
@@ -271,7 +271,7 @@ watch(
displaySettingsKey,
JSON.stringify({
version: displaySettingVersion,
- settings,
+ settings
})
);
console.log("저장!", Array.from(newSettings.keys()));
@@ -305,7 +305,7 @@ function storeDisplaySetting() {
const setting: GridDisplaySetting = {
column: columnApi.value.getColumnState(),
- columnGroup: columnApi.value.getColumnGroupState(),
+ columnGroup: columnApi.value.getColumnGroupState()
};
displaySettings.value.set(nickName, setting);
@@ -353,7 +353,7 @@ type headerType =
| "trainAtmos"
| "specials"
| "reservedCommandShort"
- | "killturnAndConnect"
+ | "killturnAndRefresh"
| "years"
| "warResults";
@@ -485,14 +485,14 @@ const sortableNumber: Omit = {
comparator: (a, b, _a, _b, _desc) => a - b,
sortingOrder: ["desc", "asc", null],
filter: NumberFilter,
- cellClass: rightAlignClass,
+ cellClass: rightAlignClass
};
const defaultColDef = ref({
resizable: true,
headerClass: "default-cell-header",
cellClass: centerCellClass,
floatingFilter: true,
- width: 80,
+ width: 80
});
const columnRawDefs = ref>>({
icon: {
@@ -510,7 +510,7 @@ const columnRawDefs = ref
},
pinned: "left",
cellClass: [props.availableGeneralClick ? "clickable-cell" : "", ...defaultCellClass],
- lockPosition: true,
+ lockPosition: true
},
name: {
headerName: "장수명",
@@ -524,7 +524,7 @@ const columnRawDefs = ref
cellStyle: (val: CellClassParams) => {
const gen = unwrap(val.data);
const style: StyleValue = {
- color: getNPCColor(gen.npc),
+ color: getNPCColor(gen.npc)
};
return style as CellStyle;
},
@@ -546,7 +546,7 @@ const columnRawDefs = ref
cellClass: [props.availableGeneralClick ? "clickable-cell" : "", ...defaultCellClass],
filter: true,
hide: false,
- lockVisible: true,
+ lockVisible: true
},
//npc: { headerName: "NPC", colId: "npc", field: "npc" },
stat: {
@@ -562,7 +562,7 @@ const columnRawDefs = ref
const gen = unwrap(obj.data);
return `${gen.leadership}|${gen.strength}|${gen.intel}`;
},
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "leadership",
@@ -571,7 +571,7 @@ const columnRawDefs = ref
...sortableNumber,
columnGroupShow: "open",
width: 60,
- type: "numericColumn",
+ type: "numericColumn"
},
{
colId: "strength",
@@ -579,7 +579,7 @@ const columnRawDefs = ref
field: "strength",
...sortableNumber,
columnGroupShow: "open",
- width: 60,
+ width: 60
},
{
colId: "intel",
@@ -587,9 +587,9 @@ const columnRawDefs = ref
field: "intel",
...sortableNumber,
columnGroupShow: "open",
- width: 60,
- },
- ],
+ width: 60
+ }
+ ]
},
officerLevel: {
@@ -620,7 +620,7 @@ const columnRawDefs = ref
},
filter: true,
cellClass: centerCellClass,
- width: 70,
+ width: 70
},
expDedLv: {
headerName: "명성/계급",
@@ -637,7 +637,7 @@ const columnRawDefs = ref
return "";
}
return `Lv ${data.explevel} ${data.dedLevelText}`;
- },
+ }
},
{
colId: "explevel",
@@ -652,7 +652,7 @@ const columnRawDefs = ref
},
...sortableNumber,
cellClass: centerCellClass,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
colId: "dedlevel",
@@ -667,14 +667,14 @@ const columnRawDefs = ref
},
sortable: true,
comparator: (a, b, _a, _b, _desc) => {
- return (_a.data?.dedlevel??0) - (_b.data?.dedlevel??0);
+ return (_a.data?.dedlevel ?? 0) - (_b.data?.dedlevel ?? 0);
},
sortingOrder: ["desc", "asc", null],
filter: true,
cellClass: centerCellClass,
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
goldRice: {
headerName: "자금",
@@ -704,7 +704,7 @@ const columnRawDefs = ref
const lhsAmount = lhs.gold + lhs.rice;
const rhsAmount = rhs.gold + rhs.rice;
return lhsAmount - rhsAmount;
- },
+ }
},
{
colId: "gold",
@@ -713,7 +713,7 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter("금"),
width: 70,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
colId: "rice",
@@ -722,9 +722,9 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter("쌀"),
width: 70,
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
city: {
colId: "city",
@@ -744,7 +744,7 @@ const columnRawDefs = ref
return "";
}
return convertSearch초성(gameConstStore.value.cityConst[data.city].name);
- },
+ }
},
troop: {
colId: "troop",
@@ -795,7 +795,7 @@ const columnRawDefs = ref
const [troopName, troopLeader] = troopInfo;
const cityName = gameConstStore.value.cityConst[troopLeader.city].name;
return convertSearch초성(`${troopName}$${cityName}`);
- },
+ }
},
crewtypeAndCrew: {
groupId: "crewtypeAndCrew",
@@ -809,11 +809,11 @@ const columnRawDefs = ref
cells: ((): GridCellInfo[][] => {
return [
[{ target: "crewtype", iActionMap: gameConstStore.value.iActionInfo.crewtype }],
- [{ target: "crew", converter: (value) => [`${value.crew.toLocaleString()}명`, undefined] }],
+ [{ target: "crew", converter: (value) => [`${value.crew.toLocaleString()}명`, undefined] }]
];
- })(),
+ })()
},
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "crewtype",
@@ -821,7 +821,7 @@ const columnRawDefs = ref
field: "crewtype",
cellRenderer: SimpleTooltipCell,
cellRendererParams: {
- iActionMap: gameConstStore.value.iActionInfo.crewtype,
+ iActionMap: gameConstStore.value.iActionInfo.crewtype
},
sortable: true,
columnGroupShow: "open",
@@ -832,7 +832,7 @@ const columnRawDefs = ref
}
const name = gameConstStore.value.iActionInfo.crewtype[data.crewtype].name;
return convertSearch초성(name);
- },
+ }
},
{
colId: "crew",
@@ -841,9 +841,9 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter("명"),
width: 70,
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
trainAtmos: {
groupId: "trainAtmos",
@@ -859,7 +859,7 @@ const columnRawDefs = ref
}
return `${data.train} ${data.atmos}`;
},
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "train",
@@ -868,7 +868,7 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter(),
width: 70,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
colId: "atmos",
@@ -877,7 +877,7 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter(),
width: 70,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
colId: "defence_train",
@@ -886,9 +886,9 @@ const columnRawDefs = ref
sortable: true,
sortingOrder: ["desc", "asc", null],
valueFormatter: (value: GenValueParams) => formatDefenceTrain(value.value),
- width: 50,
- },
- ],
+ width: 50
+ }
+ ]
},
specials: {
groupId: "specials",
@@ -904,13 +904,13 @@ const columnRawDefs = ref
[{ target: "personal", iActionMap: gameConstStore.value.iActionInfo.personality }],
[
{ target: "specialDomestic", iActionMap: gameConstStore.value.iActionInfo.specialDomestic },
- { target: "specialWar", iActionMap: gameConstStore.value.iActionInfo.specialWar },
- ],
+ { target: "specialWar", iActionMap: gameConstStore.value.iActionInfo.specialWar }
+ ]
];
- })(),
+ })()
},
width: 80,
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "personal",
@@ -918,7 +918,7 @@ const columnRawDefs = ref
field: "personal",
cellRenderer: SimpleTooltipCell,
cellRendererParams: {
- iActionMap: gameConstStore.value.iActionInfo.personality,
+ iActionMap: gameConstStore.value.iActionInfo.personality
},
width: 60,
sortable: true,
@@ -927,7 +927,7 @@ const columnRawDefs = ref
filterValueGetter: ({ data }) => {
const name = gameConstStore.value.iActionInfo.personality[data.personal].name;
return convertSearch초성(name);
- },
+ }
},
{
colId: "specialDomestic",
@@ -935,7 +935,7 @@ const columnRawDefs = ref
field: "specialDomestic",
cellRenderer: SimpleTooltipCell,
cellRendererParams: {
- iActionMap: gameConstStore.value.iActionInfo.specialDomestic,
+ iActionMap: gameConstStore.value.iActionInfo.specialDomestic
},
width: 60,
sortable: true,
@@ -944,7 +944,7 @@ const columnRawDefs = ref
filterValueGetter: ({ data }) => {
const name = gameConstStore.value.iActionInfo.specialDomestic[data.specialDomestic].name;
return convertSearch초성(name);
- },
+ }
},
{
colId: "specialWar",
@@ -952,7 +952,7 @@ const columnRawDefs = ref
field: "specialWar",
cellRenderer: SimpleTooltipCell,
cellRendererParams: {
- iActionMap: gameConstStore.value.iActionInfo.specialWar,
+ iActionMap: gameConstStore.value.iActionInfo.specialWar
},
width: 60,
sortable: true,
@@ -961,9 +961,9 @@ const columnRawDefs = ref
filterValueGetter: ({ data }) => {
const name = gameConstStore.value.iActionInfo.specialWar[data.specialWar].name;
return convertSearch초성(name);
- },
- },
- ],
+ }
+ }
+ ]
},
reservedCommandShort: {
groupId: "reservedCommandShort",
@@ -1005,9 +1005,9 @@ const columnRawDefs = ref
},
cellStyle: {
lineHeight: "1em",
- fontSize: "0.85em",
+ fontSize: "0.85em"
},
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "reservedCommand",
@@ -1042,11 +1042,11 @@ const columnRawDefs = ref
},
cellStyle: {
lineHeight: "1em",
- fontSize: "0.85em",
+ fontSize: "0.85em"
},
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
turntime: {
colId: "turntime",
@@ -1061,7 +1061,7 @@ const columnRawDefs = ref
return turntime.substring(14, 19);
},
sortable: true,
- cellClass: centerCellClass,
+ cellClass: centerCellClass
},
recent_war: {
colId: "recent_war",
@@ -1076,7 +1076,7 @@ const columnRawDefs = ref
return turntime.substring(14, 19);
},
sortable: true,
- cellClass: centerCellClass,
+ cellClass: centerCellClass
},
years: {
groupId: "years",
@@ -1093,7 +1093,7 @@ const columnRawDefs = ref
return `${data.age}세 ${data.belong}년`;
},
cellClass: centerCellClass,
- columnGroupShow: "closed",
+ columnGroupShow: "closed"
},
{
colId: "age",
@@ -1103,7 +1103,7 @@ const columnRawDefs = ref
valueFormatter: (v: GenValueParams) => `${v.value}세`,
width: 60,
cellClass: centerCellClass,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
colId: "belong",
@@ -1113,26 +1113,26 @@ const columnRawDefs = ref
valueFormatter: (v: GenValueParams) => `${v.value}년`,
width: 60,
cellClass: centerCellClass,
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
- killturnAndConnect: {
- groupId: "killturnAndConnect",
+ killturnAndRefresh: {
+ groupId: "killturnAndRefresh",
headerName: "기타",
children: [
{
- colId: "killturnAndConnect",
+ colId: "killturnAndRefresh",
headerName: "삭/벌",
cellRenderer: ({ data }: GenValueParams) => {
if (data === undefined) {
return "?";
}
- return `${data.killturn.toLocaleString()}턴 ${data.connect.toLocaleString()}점`;
+ return `${data.killturn.toLocaleString()}턴 ${(data.refreshScoreTotal ?? 0).toLocaleString()}점`;
},
cellClass: rightAlignClass,
columnGroupShow: "closed",
- width: 70,
+ width: 70
},
{
colId: "killturn",
@@ -1146,23 +1146,25 @@ const columnRawDefs = ref
},
...sortableNumber,
width: 70,
- columnGroupShow: "open",
+ columnGroupShow: "open"
},
{
- colId: "connect",
+ colId: "refreshScoreTotal",
headerName: "벌점",
- field: "connect",
+ field: "refreshScoreTotal",
cellRenderer: ({ data }: GenValueParams) => {
if (data === undefined) {
return "?";
}
- return `${data.connect.toLocaleString()}점 (${formatConnectScore(data.connect)})`;
+ return `${(data.refreshScoreTotal ?? 0).toLocaleString()}점 (${formatRefreshScore(
+ data.refreshScoreTotal
+ )})`;
},
...sortableNumber,
width: 70,
- columnGroupShow: "open",
- },
- ],
+ columnGroupShow: "open"
+ }
+ ]
},
warResults: {
groupId: "warResults",
@@ -1180,7 +1182,7 @@ const columnRawDefs = ref
},
cellClass: centerCellClass,
columnGroupShow: "closed",
- width: 90,
+ width: 90
},
{
colId: "warnum",
@@ -1189,7 +1191,7 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter("전"),
columnGroupShow: "open",
- width: 60,
+ width: 60
},
{
colId: "killnum",
@@ -1198,7 +1200,7 @@ const columnRawDefs = ref
...sortableNumber,
valueFormatter: numberFormatter("승"),
columnGroupShow: "open",
- width: 60,
+ width: 60
},
{
colId: "killcrew",
@@ -1214,10 +1216,10 @@ const columnRawDefs = ref
},
valueFormatter: numberFormatter("%"),
columnGroupShow: "open",
- width: 60,
- },
- ],
- },
+ width: 60
+ }
+ ]
+ }
});
const columnDefs = ref([...Object.values(columnRawDefs.value)]);
watch(columnRawDefs, (val) => {
diff --git a/hwe/ts/components/GeneralLiteCard.vue b/hwe/ts/components/GeneralLiteCard.vue
index c1a57f74..2183b75f 100644
--- a/hwe/ts/components/GeneralLiteCard.vue
+++ b/hwe/ts/components/GeneralLiteCard.vue
@@ -78,8 +78,8 @@
{{ general.killturn }} 턴
벌점
-
- {{ formatConnectScore(general.connect) }} {{ general.connect.toLocaleString() }}점
+
+ {{ formatRefreshScore(general.refreshScoreTotal) }} {{ (general.refreshScoreTotal ?? 0).toLocaleString() }}점
@@ -94,7 +94,7 @@ import type { NationStaticItem } from "@/defs";
import { unwrap } from "@/util/unwrap";
import type { GameConstStore } from "@/GameConstStore";
import { formatGeneralTypeCall } from "@/utilGame/formatGeneralTypeCall";
-import { formatConnectScore } from "@/utilGame/formatConnectScore";
+import { formatRefreshScore } from "@/utilGame/formatRefreshScore";
import { calcInjury } from "@/utilGame/calcInjury";
import type { GameIActionInfo } from "@/defs/GameObj";
import { isValidObjKey } from "@/utilGame/isValidObjKey";
@@ -204,7 +204,7 @@ watch(
font-weight: bold;
}
-.general-connect-score {
+.general-refresh-score-total {
grid-column: 5 / 8;
}
diff --git a/hwe/ts/defs/API/Nation.ts b/hwe/ts/defs/API/Nation.ts
index 38b49a7c..cf221689 100644
--- a/hwe/ts/defs/API/Nation.ts
+++ b/hwe/ts/defs/API/Nation.ts
@@ -27,7 +27,7 @@ export type GeneralListItemP0 = {
specialWar: GameObjClassKey;
personal: GameObjClassKey;
belong: number;
- connect: number;
+ refreshScoreTotal: number | null;
officerLevel: number; //권한에따라 태수,군사,시종 노출 여부가 다름
officerLevelText: string;
@@ -46,7 +46,7 @@ export type GeneralListItemP0 = {
};
export type GeneralListItemP1 = {
- con: number;
+ refreshScore: number | null;
specage: number;
specage2: number;
leadership_exp: number;
diff --git a/hwe/ts/defs/gridDefs.ts b/hwe/ts/defs/gridDefs.ts
index 1eca66a7..ff680414 100644
--- a/hwe/ts/defs/gridDefs.ts
+++ b/hwe/ts/defs/gridDefs.ts
@@ -210,7 +210,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
sort: null,
},
{
- colId: "killturnAndConnect_1",
+ colId: "killturnAndRefresh_1",
width: 70,
hide: false,
sort: null,
@@ -222,7 +222,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
sort: null,
},
{
- colId: "connect",
+ colId: "refreshScoreTotal",
width: 70,
hide: true,
sort: null,
@@ -310,7 +310,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
open: false,
},
{
- groupId: "killturnAndConnect",
+ groupId: "killturnAndRefresh",
open: true,
},
{
@@ -522,7 +522,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
sort: null,
},
{
- colId: "killturnAndConnect_1",
+ colId: "killturnAndRefresh_1",
width: 70,
hide: false,
sort: null,
@@ -534,7 +534,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
sort: null,
},
{
- colId: "connect",
+ colId: "refreshScoreTotal",
width: 70,
hide: false,
sort: "desc",
@@ -623,7 +623,7 @@ export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting>
open: false
},
{
- groupId: "killturnAndConnect",
+ groupId: "killturnAndRefresh",
open: true
},
{
diff --git a/hwe/ts/defs/index.ts b/hwe/ts/defs/index.ts
index 9b43eaf1..be20079a 100644
--- a/hwe/ts/defs/index.ts
+++ b/hwe/ts/defs/index.ts
@@ -39,7 +39,7 @@ export type PublicGeneralItem = {
dedicationStr: string,
officerLevelStr: string,
killturn: number,
- connect: number,
+ refreshScoreTotal: number,
}
@@ -55,7 +55,7 @@ export type GeneralListResponse = {
PublicGeneralItem['leadership'], PublicGeneralItem['lbonus'], PublicGeneralItem['strength'], PublicGeneralItem['intel'],
PublicGeneralItem['explevel'],
PublicGeneralItem['experienceStr'], PublicGeneralItem['dedicationStr'], PublicGeneralItem['officerLevelStr'],
- PublicGeneralItem['killturn'], PublicGeneralItem['connect']
+ PublicGeneralItem['killturn'], PublicGeneralItem['refreshScoreTotal']
][],
token?: Record,
}
diff --git a/hwe/ts/select_npc.ts b/hwe/ts/select_npc.ts
index dd986bbc..354fbd32 100644
--- a/hwe/ts/select_npc.ts
+++ b/hwe/ts/select_npc.ts
@@ -273,7 +273,7 @@ function printGeneralList(value: GeneralListResponse) {
dedicationStr: rawGeneral[18],
officerLevelStr: rawGeneral[19],
killturn: rawGeneral[20],
- connect: rawGeneral[21],
+ refreshScoreTotal: rawGeneral[21],
reserved: 0
};
if (general.npc < 2) {
diff --git a/hwe/ts/utilGame/formatConnectScore.ts b/hwe/ts/utilGame/formatConnectScore.ts
deleted file mode 100644
index 73e869a0..00000000
--- a/hwe/ts/utilGame/formatConnectScore.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import bs from "binary-search";
-
-const connectMap: [number, string][] = [
- [0, "안함"],
- [50, "무관심"],
- [100, "보통"],
- [200, "가끔"],
- [400, "자주"],
- [800, "열심"],
- [1600, "중독"],
- [3200, "폐인"],
- [6400, "경고"],
- [12800, "헐..."],
-];
-
-export function formatConnectScore(connect: number) {
- const idx = bs(connectMap, connect, ([key], needle) => key - needle);
- if (idx >= 0) {
- return connectMap[idx][1] ?? "?";
- }
- const uidx = (~idx) - 1;
- return connectMap[uidx][1];
-}
diff --git a/hwe/ts/utilGame/formatRefreshScore.ts b/hwe/ts/utilGame/formatRefreshScore.ts
new file mode 100644
index 00000000..394cf679
--- /dev/null
+++ b/hwe/ts/utilGame/formatRefreshScore.ts
@@ -0,0 +1,24 @@
+import bs from "binary-search";
+
+const refreshScoreMap: [number, string][] = [
+ [0, "안함"],
+ [50, "무관심"],
+ [100, "보통"],
+ [200, "가끔"],
+ [400, "자주"],
+ [800, "열심"],
+ [1600, "중독"],
+ [3200, "폐인"],
+ [6400, "경고"],
+ [12800, "헐..."],
+];
+
+export function formatRefreshScore(refreshScore: number | null) {
+ if (!refreshScore) refreshScore = 0;
+ const idx = bs(refreshScoreMap, refreshScore, ([key], needle) => key - needle);
+ if (idx >= 0) {
+ return refreshScoreMap[idx][1] ?? "?";
+ }
+ const uidx = (~idx) - 1;
+ return refreshScoreMap[uidx][1];
+}
diff --git a/hwe/ts/utilGame/index.ts b/hwe/ts/utilGame/index.ts
index cf9046a0..66a96717 100644
--- a/hwe/ts/utilGame/index.ts
+++ b/hwe/ts/utilGame/index.ts
@@ -1,6 +1,6 @@
export { calcInjury } from './calcInjury';
export { formatCityName } from './formatCityName';
-export { formatConnectScore } from './formatConnectScore';
+export { formatRefreshScore } from './formatRefreshScore';
export { formatDefenceTrain } from './formatDefenceTrain';
export { formatDexLevel } from './formatDexLevel';
export { formatGeneralTypeCall } from './formatGeneralTypeCall';
diff --git a/hwe/v_NPCControl.php b/hwe/v_NPCControl.php
index 6500ccd9..c9307359 100644
--- a/hwe/v_NPCControl.php
+++ b/hwe/v_NPCControl.php
@@ -15,13 +15,16 @@ $gameStor->cacheValues(['autorun_user', 'develcost']);
increaseRefresh("NPC 정책", 1);
-$me = $db->queryFirstRow('SELECT no, npc, nation, city, officer_level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, npc, nation, city, officer_level, refresh_score, turntime, belong, permission, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
$nationID = $me['nation'];
$nation = $db->queryFirstRow('SELECT nation,level,name,color,type,gold,rice,bill,tech,rate,scout,war,secretlimit,capital FROM nation WHERE nation = %i', $nationID);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -40,7 +43,7 @@ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheValues(['npc_nation_policy', 'npc_general_policy']);
$gameStor->cacheAll();
-$general = new General($me, null, null, $nation, $gameStor->year, $gameStor->month, false);
+$general = new General($me, null, null, null, $nation, $gameStor->year, $gameStor->month, false);
$rawServerPolicy = $gameStor->getValue('npc_nation_policy') ?? [];
$rawNationPolicy = $nationStor->getValue('npc_nation_policy') ?? [];
diff --git a/hwe/v_auction.php b/hwe/v_auction.php
index dac367e7..820d6b14 100644
--- a/hwe/v_auction.php
+++ b/hwe/v_auction.php
@@ -12,9 +12,6 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$isResAuction = Util::getReq('type') !== 'unique';
-
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
-
?>
diff --git a/hwe/v_board.php b/hwe/v_board.php
index f552a145..2e87beba 100644
--- a/hwe/v_board.php
+++ b/hwe/v_board.php
@@ -15,14 +15,7 @@ $isSecretBoard = Util::getReq('isSecret', 'bool', false);
//increaseRefresh("회의실", 1);
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
-
-
-$con = checkLimit($me['con']);
-if ($con >= 2) {
- printLimitMsg($me['turntime']);
- exit();
-}
+$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$permission = checkSecretPermission($me);
if ($permission < 0) {
diff --git a/hwe/v_history.php b/hwe/v_history.php
index aafc1452..7b4113e7 100644
--- a/hwe/v_history.php
+++ b/hwe/v_history.php
@@ -31,9 +31,6 @@ else{
[$currentYear, $currentMonth] = [$l_year, $l_month];
}
-
-$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $userID);
-
?>
diff --git a/hwe/v_nationStratFinan.php b/hwe/v_nationStratFinan.php
index c2c2647a..bcc1c6f3 100644
--- a/hwe/v_nationStratFinan.php
+++ b/hwe/v_nationStratFinan.php
@@ -13,10 +13,13 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("내무부", 1);
-$me = $db->queryFirstRow('SELECT no, nation, officer_level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
+$me = $db->queryFirstRow(
+ 'SELECT no, nation, officer_level, refresh_score, turntime, belong, permission, penalty FROM `general`
+ LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
+);
-$con = checkLimit($me['con']);
-if ($con >= 2) {
+$limitState = checkLimit($me['refresh_score']);
+if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
diff --git a/src/sammo/Session.php b/src/sammo/Session.php
index b04e4d92..e10a7f28 100644
--- a/src/sammo/Session.php
+++ b/src/sammo/Session.php
@@ -288,12 +288,6 @@ class Session
}
}
- $db->update('general', [
- 'logcnt' => $db->sqleval('logcnt+1'),
- 'ip' => Util::get_client_ip(true),
- 'lastConnect' => TimeUtil::now()
- ], 'owner = %i', $userID);
-
$this->set($serverID.static::GAME_KEY_DATE, $now);
$this->set($serverID.static::GAME_KEY_GENERAL_ID, $generalID);
$this->set($serverID.static::GAME_KEY_GENERAL_NAME, $generalName);
|