diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index 2516bfdf..b044c7a0 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -959,209 +959,6 @@ class GeneralAI{ return Util::choiceRandomUsingWeightPair($commandList); } - public function chooseNeoNationTurn($command, $arg):array{ - throw new NotImplementedException(); - //TODO: 이 버전으로 새로 개발 - $generalObj = $this->getGeneralObj(); - //NOTE: 수뇌 턴에서는 general과 city이름의 충돌 가능성이 있음 - $env = $this->env; - - $chiefID = $generalObj->getID(); - $cityID = $generalObj->getCityID(); - $nationID = $generalObj->getNationID(); - - $tech = $this->nation['tech']; - - $db = DB::db(); - - if($generalObj->getVar('npc') == 5){ - return [$command, $arg]; - } - - if($command && $command != '휴식'){ - return [$command, $arg]; - } - - if($generalObj->getVar('level') == 12 && $this->dipState == self::d평화 && !$this->attackable){ - $targetNationID = $this->findWarTarget(); - if($targetNationID !== null){ - return ['che_선전포고', ['destNationID'=>$targetNationID]]; - } - } - - $cityList = []; - $frontCity = []; - foreach($db->query('SELECT * FROM city WHERE nation = %i',$nationID) as $city){ - //귀찮으니 object 변환 - $city = (object)$city; - $city->id = $city->city; - $city->generals = []; - $city->devel_intel = ($city->agri + $city->comm) / ($city->agri2 + $city->comm2); - $city->devel_power = ($city->secu + $city->def + $city->wall) / ($city->secu2 + $city->def2 + $city->wall2); - $city->devel_leadership = (($city->trust) + ($city->pop / $city->pop2)) / 2; - $cityList[$city->id] = $city; - if($city->front > 0){ - $frontCity[$city->id] = $city->front; - } - } - - if(!key_exists($cityID, $cityList)){ - //수뇌가 아국에 없음 - return ['휴식', null]; - } - - $generalList = []; - foreach($db->query('SELECT no, npc, leader, power, intel, city, nation, level, gold, rice, troop, experience, dedication, killturn, injury, crew, crewtype, train, atmos, gold, rice FROM general WHERE nation = %i AND no != %i', $nationID, $generalObj->getID()) as $general){ - //귀찮으니 object 변환 - $general = (object)$general; - $general->id = $general->no; - $generalList[$general->id] = $general; - } - - $troopList = []; - foreach($db->queryAllLists('SELECT troop, no FROM troop WHERE nation = %i', $nationID) as [$troopID, $troopLeaderID]){ - $troop = (object)['id'=>$troopID, 'troop'=>$troopID, 'leader'=>$generalList[$troopLeaderID], 'members'=>[]]; - $troopList[$troopID] = $troop;//troopID 가 아니라 troopLeaderID 임! - } - - $candidateCommand = []; - - $outerGenerals = []; - $troopLeaders = []; - - $userGenerals = []; - $npcWarGenerals = []; - $npcCivilGenerals = []; - - $remainResource = [ - 'gold'=>$this->nation['gold'] - GameConst::$minNationalGold, - 'rice'=>$this->nation['rice'] - GameConst::$minNationalRice, - ]; - - $generalResource = [ - 'gold'=>0, - 'rice'=>0, - ]; - - - foreach($generalList as $general){ - $generalResource['gold'] += $general->gold; - $generalResource['rice'] += $general->rice; - - if(!key_exists($general->city, $cityList)){ - $score = $general->npc < 2? 5 : 1; - $score *= sqrt(($general->leader + $general->power + $general->intel)/GameConst::$chiefStatMin); - //sqrt(1~5) 일 것. - $outerGenerals[$general->id] = $score; - } - else{ - $cityList[$general->city]->generals[$general->id] = true; - } - - if($general->troop){ - if($troopList[$general->troop]->leader == $general){ - $troopLeaders[] = $general; - } - else{ - $troopList[$general->troop]->members[] = $general; - } - } - - if($chiefID != $general->id){ - //명단에 추가할 수 없다. - } - else if($general->npc < 2 && $general->killturn >= 5){ - $userGenerals[] = $general; - } - else if($general->leader >= 40 && $general->killturn >= 5){ - $npcWarGenerals[] = $general; - } - else if($general->npc != 5){ - $npcCivilGenerals[] = $general; - } - } - - if($outerGenerals){ - $candidateCommand[] = - [ - ['che_발령', [ - 'destGeneralID' => Util::choiceRandomUsingWeight($outerGenerals), - 'destCityID' => Util::choiceRandom(array_keys($frontCity)) - ]], - Util::arraySum($outerGenerals, 1) / sqrt(count($outerGenerals)) - ]; - } - - $baseDevelCost = $env['develcost'] * 12; - - foreach(['gold', 'rice'] as $resName){ - usort($this->userGenerals, function($lhs, $rhs){ - return $lhs->$resName <=> $rhs->$resName; - }); - - usort($this->npcWarGenerals, function($lhs, $rhs){ - return $lhs->$resName <=> $rhs->$resName; - }); - - usort($this->npcCivilGenerals, function($lhs, $rhs){ - return $lhs->$resName <=> $rhs->$resName; - }); - - - if( - $remainResource[$resName] < 3000 || - $remainResource[$resName] < $generalResource[$resName] / sqrt(count($generalList)) - ){ - if ($npcWarGenerals) { - $targetNpcWarGeneral = Util::array_first($npcWarGenerals); - $crewtype = GameUnitConst::byID($targetNpcWarGeneral->crewtype); - //징병 2바퀴? - $reqMoney = $crewtype->costWithTech($tech, $targetNpcWarGeneral->leadership) * 2.2; - $enoughMoney = $reqMoney * 2; - $tooMuchMoney = $enoughMoney * 1.5; - - if($targetNpcWarGeneral->$resName >= $reqMoney){ - $candidateCommand[] = [ - ['che_몰수', [ - 'destGeneralID' => $targetNpcWarGeneral->id, - 'isGold'=>$resName=='gold', - 'amount'=>($targetNpcWarGeneral->$resName - $reqMoney) / 2 - ]], - $reqMoney / $tooMuchMoney * 3, - ]; - } - } - - if ($userGenerals) { - $targetUserGeneral = Util::array_last($userGenerals); - $crewtype = GameUnitConst::byID($targetUserGeneral->crewtype); - //모병 4바퀴? - $reqMoney = max(21000, $crewtype->costWithTech($tech, $targetNpcWarGeneral->leadership) * 2*4*1.1); - $enoughMoney = $reqMoney * 1.5; - $tooMuchMoney = $enoughMoney * 1.5; - - if($targetNpcWarGeneral->$resName >= $reqMoney){ - $candidateCommand[] = [ - ['che_몰수', [ - 'destGeneralID' => $targetNpcWarGeneral->id, - 'isGold'=>$resName=='gold', - 'amount'=>($userGenerals->$resName - $reqMoney) / 2 - ]], - $reqMoney / $tooMuchMoney * 2, - ]; - } - } - }//end if $remainResource[$resName] < 3000 - } - - if(in_array($this->dipState, [self::d직전, self::d전쟁])){ - - } - - - return Util::choiceRandomUsingWeightPair($candidateCommand); - } - public function chooseNeutralTurn():array{ $general = $this->getGeneralObj();