Files
core/hwe/sammo/API/Nation/GetNationInfo.php
T
Hide_D ad23398592 refac: General 생성 방식 변경
- 변경한 GeneralQueryMode에 따라 Lite가 불가능
- Lite여도 된다면 GeneralLite 클래스로 변경
- 그렇지 않다면 General 클래스로 변경
- 내부에서 어떠한 연산을 할 지 알 수 없는데,
  구현 시점에서 편의에 따라 column 여부가 차이나면
  이후에 문제가 될 수 있음
- 엔진이 살짝 무거워 질 것으로 보임
2023-08-01 16:28:29 +00:00

102 lines
2.9 KiB
PHP

<?php
namespace sammo\API\Nation;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralQueryMode;
use sammo\GameConst;
use sammo\General;
use sammo\KVStorage;
use sammo\LastTurn;
use sammo\Session;
use sammo\Util;
use sammo\Validator;
use function sammo\buildNationCommandClass;
use function sammo\getNationStaticInfo;
class GetNationInfo extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('in', 'full', ['true', 'false']);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$userID = $session->userID;
$db = DB::db();
$nationID = $db->queryFirstField('SELECT nation FROM general WHERE `owner` = %i', $userID);
if (!$nationID) {
return [
'result' => true,
'nation' => getNationStaticInfo(0)
];
}
$isFull = $this->args['full'] ?? false;
if(!$isFull){
$nation = getNationStaticInfo($nationID);
return [
'result' => true,
'nation' => $nation,
];
}
$generalObj = General::createObjFromDB($session->generalID);
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameEnv = $gameStor->getValues(['year', 'month', 'startyear']);
$nation = $db->queryFirstRow(
'SELECT nation, `name`, color, capital, gennum, gold, rice, bill, rate, secretlimit, chief_set, scout, war, strategic_cmd_limit, surlimit, tech, `power`, `level`, `type` FROM nation WHERE nation = %i',
$nationID
);
$nationStor = \sammo\KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheAll();
//전략 정보를 매번 읽어와야하나?
$impossibleStrategicCommandLists = [];
$strategicCommandLists = GameConst::$availableChiefCommand['전략'];
$yearMonth = Util::joinYearMonth($gameEnv['year'], $gameEnv['month']);
foreach ($strategicCommandLists as $command) {
$cmd = buildNationCommandClass($command, $generalObj, $gameEnv, new LastTurn());
$nextAvailableTurn = $cmd->getNextAvailableTurn();
if ($nextAvailableTurn > $yearMonth) {
$impossibleStrategicCommandLists[] = [$cmd->getName(), $nextAvailableTurn - $yearMonth];
}
}
$troopName = [];
foreach ($db->queryAllLists('SELECT troop_leader, name FROM troop WHERE nation=%i', $nationID) as [$troopID, $tName]) {
$troopName[$troopID] = $tName;
}
$result = [
'result' => true,
'isFull' => $isFull,
'nation' => $nation,
'impossibleStrategicCommandLists' => $impossibleStrategicCommandLists,
'troops' => $troopName,
];
return $result;
}
}