refac: GeneralAI에서 상태를 추가 업데이트할 수 있도록 구조 변경

This commit is contained in:
2022-10-02 17:33:23 +09:00
parent 7d3b0db924
commit 270cb25285
+30 -18
View File
@@ -11,8 +11,6 @@ class GeneralAI
{ {
protected RandUtil $rng; protected RandUtil $rng;
/** @var General */
protected $general;
protected array $city; protected array $city;
protected array $nation; protected array $nation;
protected int $genType; protected int $genType;
@@ -65,6 +63,9 @@ class GeneralAI
/** @var General[] */ /** @var General[] */
protected $chiefGenerals; protected $chiefGenerals;
/** @var bool */
protected $reqUpdateInstance = true;
/** @var General[] */ /** @var General[] */
protected $lostGenerals; protected $lostGenerals;
/** @var General[] 이번 턴에 '집합'하는 부대장 목록 */ /** @var General[] 이번 턴에 '집합'하는 부대장 목록 */
@@ -80,15 +81,18 @@ class GeneralAI
const d직전 = 3; const d직전 = 3;
const d전쟁 = 4; const d전쟁 = 4;
//수뇌용 protected function updateInstance(): void{
if(!$this->reqUpdateInstance){
return;
}
$this->reqUpdateInstance = false;
public function __construct(General $general)
{
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$this->env = $gameStor->getAll(true); $this->env = $gameStor->getAll(true);
$this->baseDevelCost = $this->env['develcost'] * 12; $this->baseDevelCost = $this->env['develcost'] * 12;
$this->general = $general; $general = $this->general;
$city = $general->getRawCity(); $city = $general->getRawCity();
if ($city === null) { if ($city === null) {
$city = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $general->getCityID()); $city = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $general->getCityID());
@@ -96,14 +100,6 @@ class GeneralAI
} }
$this->city = $city; $this->city = $city;
$this->rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'GeneralAI',
$this->env['year'],
$this->env['month'],
$general->getID(),
)));
$this->nation = $db->queryFirstRow( $this->nation = $db->queryFirstRow(
'SELECT nation,name,color,capital,capset,gennum,gold,rice,bill,rate,rate_tmp,scout,war,strategic_cmd_limit,surlimit,tech,power,level,chief_set,type,aux FROM nation WHERE nation = %i', 'SELECT nation,name,color,capital,capset,gennum,gold,rice,bill,rate,rate_tmp,scout,war,strategic_cmd_limit,surlimit,tech,power,level,chief_set,type,aux FROM nation WHERE nation = %i',
$general->getNationID() $general->getNationID()
@@ -142,6 +138,19 @@ class GeneralAI
$this->nation['aux'] = Json::decode($this->nation['aux'] ?? '{}'); $this->nation['aux'] = Json::decode($this->nation['aux'] ?? '{}');
$this->calcDiplomacyState();
}
public function __construct(protected General $general)
{
$this->rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'GeneralAI',
$this->env['year'],
$this->env['month'],
$general->getID(),
)));
$this->leadership = $general->getLeadership(); $this->leadership = $general->getLeadership();
$this->strength = $general->getStrength(); $this->strength = $general->getStrength();
$this->intel = $general->getIntel(); $this->intel = $general->getIntel();
@@ -150,10 +159,7 @@ class GeneralAI
$this->fullStrength = $general->getStrength(false); $this->fullStrength = $general->getStrength(false);
$this->fullIntel = $general->getIntel(false); $this->fullIntel = $general->getIntel(false);
$this->genType = $this->calcGenType($general); $this->genType = $this->calcGenType($general);
$this->calcDiplomacyState();
} }
public function getGeneralObj(): General public function getGeneralObj(): General
@@ -2653,7 +2659,7 @@ class GeneralAI
return $this->rng->choiceUsingWeightPair($cmdList); return $this->rng->choiceUsingWeightPair($cmdList);
} }
public function do소집해제(): ?GeneralCommand protected function do소집해제(): ?GeneralCommand
{ {
if ($this->attackable) { if ($this->attackable) {
return null; return null;
@@ -3573,6 +3579,8 @@ class GeneralAI
public function chooseNationTurn(NationCommand $reservedCommand): NationCommand public function chooseNationTurn(NationCommand $reservedCommand): NationCommand
{ {
$this->updateInstance();
//TODO: NationTurn과 InstantNationTurn 구분 필요 //TODO: NationTurn과 InstantNationTurn 구분 필요
$lastTurn = $reservedCommand->getLastTurn(); $lastTurn = $reservedCommand->getLastTurn();
$general = $this->general; $general = $this->general;
@@ -3644,6 +3652,8 @@ class GeneralAI
return $reservedCommand; return $reservedCommand;
} }
$this->updateInstance();
foreach ($this->nationPolicy->priority as $actionName) { foreach ($this->nationPolicy->priority as $actionName) {
/** @var ?NationCommand */ /** @var ?NationCommand */
if (!key_exists($actionName, $this->nationPolicy::$availableInstantTurn)) { if (!key_exists($actionName, $this->nationPolicy::$availableInstantTurn)) {
@@ -3666,6 +3676,8 @@ class GeneralAI
$npcType = $general->getNPCType(); $npcType = $general->getNPCType();
$nationID = $general->getNationID(); $nationID = $general->getNationID();
$this->updateInstance();
//특별 메세지 있는 경우 출력 //특별 메세지 있는 경우 출력
$term = $this->env['turnterm']; $term = $this->env['turnterm'];
if ($general->getVar('npcmsg') && $this->rng->nextBool(GameConst::$npcMessageFreqByDay * $term / (60 * 24))) { if ($general->getVar('npcmsg') && $this->rng->nextBool(GameConst::$npcMessageFreqByDay * $term / (60 * 24))) {