queryFirstRow( 'SELECT nation, `name`, `level`, capital, scout FROM nation WHERE nation=%i', $nationID ); if(!$nation){ return; } $this->senderID = $senderID; $this->nation = $nation; $this->valid = true; [ $this->startYear, $this->year, $this->month, $this->killturn ] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'killturn']); } public function checkAgreeValidation(array $general){ if(!$this->valid){ return [ScoutMessage::DECLINED, '이미 멸망한 국가입니다.']; } if($this->year < $this->startYear + 3){ return [ScoutMessage::INVALID, '초반제한 중입니다.']; } if($this->nation['scout']){ return [ScoutMessage::INVALID, '현재 임관금지 중인 국가입니다.']; } if($this->nation['level'] == 0){ return [ScoutMessage::DECLINED, '방랑군에는 임관할 수 없습니다.']; } if($this->nation['nation'] == $general['nation']){ return [ScoutMessage::DECLINED, '이미 같은 국가입니다.']; } if($general['level'] == 12){ return [ScoutMessage::DECLINED, '군주는 등용장을 수락할 수 없습니다.']; } if(in_array($this->nation['nation'], Json::decode($general['nations']))){ return [ScoutMessage::DECLINED, '이미 임관했었던 국가입니다.']; } return [ScoutMessage::ACCEPTED, '']; } public function scoutGeneral(int $generalID){ $db = DB::db(); $general = $db->queryFirstRow( 'SELECT `no`, `name`, nation, nations, city, `level`, troop, npc, gold, rice FROM general WHERE `no`=%i', $generalID ); list($result, $reason) = $this->checkAgreeValidation($general); if($result !== ScoutMessage::ACCEPTED){ return [$result, $reason]; } $scoutNationGeneralCnt = $db->queryFirstField( 'SELECT COUNT(`no`) FROM general WHERE nation = %i', $this->nation['nation'] ); $originalNationGeneralCnt = $db->queryFirstField( 'SELECT COUNT(`no`) FROM general WHERE nation = %i', $general['nation'] ); $isTroopLeader = false; if($general['troop']){ $troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop = %i', $general['troop']); if($troopLeader == $generalID){ $isTroopLeader = true; } } $scoutNationGeneralCnt+=1; if($scoutNationGeneralCnt < GameConst::$initialNationGenLimit){ $scoutNationGeneralCnt = GameConst::$initialNationGenLimit; } $originalNationGeneralCnt-=1; if($originalNationGeneralCnt < GameConst::$initialNationGenLimit){ $originalNationGeneralCnt = GameConst::$initialNationGenLimit; } $joinedNations = Json::decode($general['nations']); $joinedNations[] = $this->nation['nation']; // 국가 변경, 도시 변경, 일반으로, 수도로 $setValues = [ 'belong'=>1, 'level'=>1, 'nation'=>$this->nation['nation'], 'city'=>$this->nation['capital'], 'nations'=>Json::encode($joinedNations), 'troop'=>0, ]; $setSenderValues = [ 'experience'=>$db->sqleval('experience + %i', 100),//XXX: 상수. 'dedication'=>$db->sqleval('dedication + %i', 100) ]; $setOriginalNationValues = [ 'totaltech'=>$db->sqleval('tech * %i', $originalNationGeneralCnt), 'gennum'=>$originalNationGeneralCnt ]; $setScoutNationValues = [ 'totaltech'=>$db->sqleval('tech * %i', $scoutNationGeneralCnt), 'gennum'=>$scoutNationGeneralCnt ]; $setOriginalCityValues = []; // 재야가 아니면 명성N*10% 공헌N*10%감소 if($general['nation'] != 0){ // 1000 1000 남기고 환수 if($general['gold'] > 1000){//XXX: 상수. $setValues['gold'] = 1000; $setOriginalNationValues['gold'] = $db->sqleval('gold + %i', $general['gold'] - 1000); } if($general['rice'] > 1000){//XXX: 상수. $setValues['rice'] = 1000; $setOriginalNationValues['rice'] = $db->sqleval('rice + %i', $general['rice'] - 1000); } //관직 해제 if(5 <= $general['level'] && $general['level'] <= 11){ $setOriginalNationValues["l{$general['level']}set"] = 0; } else if($general['level'] == 4){ $setOriginalCityValues['gen1'] = 0; } else if($general['level'] == 3){ $setOriginalCityValues['gen2'] = 0; } else if($general['level'] == 2){ $setOriginalCityValues['gen3'] = 0; } $setValues['betray'] = $db->sqleval('betray + 1'); $setValues['experience'] = $db->sqleval('experience * (1 - 0.1 * betray)');//XXX: 상수 $setValues['dedication'] = $db->sqleval('dedication * (1 - 0.1 * betray)');//XXX: 상수 } else{ //재야이면 100 100 증가 $setValues['experience'] = $db->sqleval('experience + %i', 100);//XXX: 상수 $setValues['dedication'] = $db->sqleval('experience + %i', 100);//XXX: 상수 } if($general['npc'] < 2){ $setValues['killturn'] = $this->killturn; } $db->update('general', $setValues, 'no=%i', $generalID); $db->update('general', $setSenderValues, 'no=%i', $this->senderID); $db->update('nation', $setOriginalNationValues, 'nation=%i', $general['nation']); $db->update('nation', $setScoutNationValues, 'nation=%i', $this->nation['nation']); if($setOriginalCityValues){ $db->update('city', $setOriginalCityValues, 'city=%i', $general['city']); } if($isTroopLeader){ // 모두 탈퇴 $db->update('general', [ 'troop'=>0, ], 'troop=%i', $general['troop']); // 부대 삭제 $db->delete('troop', 'troop=%i', $general['troop']); } return [ScoutMessage::ACCEPTED, '']; } }