NPC 새로짜던 사령턴 파기

This commit is contained in:
2018-10-15 00:11:26 +09:00
parent e38258b04b
commit 05389da412
-203
View File
@@ -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();