arg === null){ return false; } if(!key_exists('crewType', $this->arg)){ return false; } if(!key_exists('amount', $this->arg)){ return false; } $crewType = $this->arg['crewType']; $amount = $this->arg['amount']; if(!is_int($crewType)){ return false; } if(!is_numeric($amount)){ return false; } $amount = (int)$amount; if(GameUnitConst::byID($crewType) === null){ return false; } if($amount < 0){ return false; } $this->arg = [ 'crewType'=>$crewType, 'amount'=>$amount ]; return true; } protected function init(){ $general = $this->generalObj; $this->setCity(); $this->setNation(['tech']); $leadership = $general->getLeadership(); $currCrewType = $general->getCrewTypeObj(); $maxCrew = $leadership * 100; $reqCrewType = GameUnitConst::byID($this->arg['crewType']); if($reqCrewType->id == $currCrewType->id){ $maxCrew -= $general->getVar('crew'); } $reqCrew = Util::valueFit($this->arg['amount'], 100, $maxCrew); $this->reqCrew = $reqCrew; $this->reqCrewType = $reqCrewType; $this->currCrewType = $currCrewType; [$reqGold, $reqRice] = $this->getCost(); $this->runnableConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::ReqCityCapacity('pop', '주민', GameConst::$minAvailableRecruitPop + $reqCrew), ConstraintHelper::ReqCityTrust(20), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ConstraintHelper::ReqGeneralCrewMargin($reqCrewType->id), ConstraintHelper::AvailableRecruitCrewType($reqCrewType->id) ]; } public function getBrief():string{ $crewTypeName = $this->reqCrewType->name; $amount = $this->reqCrew; $commandName = static::getName(); return "【{$crewTypeName}】 {$amount}명 {$commandName}"; } public function getCommandDetailTitle():string{ return "{$this->getName()}(통솔경험)"; } public function getCost():array{ if(!$this->isArgValid){ return [0, 0]; } $reqGold = $this->reqCrewType->costWithTech($this->nation['tech'], $this->reqCrew); $reqGold = $this->generalObj->onCalcDomestic('징병', 'cost', $reqGold, ['armType'=>$this->reqCrewType->armType]); $reqGold *= static::$costOffset; $reqRice = $this->reqCrew / 100; $reqGold = Util::round($reqGold); $reqRice = Util::round($reqRice); return [$reqGold, $reqRice]; } public function getPreReqTurn():int{ return 0; } public function getPostReqTurn():int{ return 0; } public function run():bool{ if(!$this->isRunnable()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } $db = DB::db(); $general = $this->generalObj; $date = $general->getTurnTime($general::TURNTIME_HM); $reqCrew = $this->reqCrew; $reqCrewText = number_format($reqCrew); $reqCrewType = $this->reqCrewType; $currCrew = $general->getVar('crew'); $currCrewType = $this->currCrewType; $crewTypeName = $reqCrewType->name; $logger = $general->getLogger(); if($reqCrewType->id == $currCrewType->id && $currCrew > 0){ $logger->pushGeneralActionLog("{$crewTypeName} {$reqCrewText}명을 추가{$this->getName()}했습니다. <1>$date"); $train = ($currCrew * $general->getVar('train') + $reqCrew * static::$defaultTrain) / ($currCrew + $reqCrew); $atmos = ($currCrew * $general->getVar('atmos') + $reqCrew * static::$defaultAtmos) / ($currCrew + $reqCrew); $general->increaseVar('crew', $reqCrew); $general->setVar('train', $train); $general->setVar('atmos', $atmos); } else{ $logger->pushGeneralActionLog("{$crewTypeName} {$reqCrewText}명을 {$this->getName()}했습니다. <1>$date"); $general->setVar('crewtype', $reqCrewType->id); $general->setVar('crew', $reqCrew); $general->setVar('train', static::$defaultTrain); $general->setVar('atmos', static::$defaultAtmos); } $newTrust = Util::valueFit($this->city['trust'] - ($reqCrew / $this->city['pop']) / static::$costOffset * 100, 0); $db->update('city', [ 'trust'=>$newTrust, 'pop'=>$this->city['pop'] - $reqCrew ], 'city=%i', $general->getCityID()); $exp = Util::round($reqCrew / 100); $ded = Util::round($reqCrew / 100); $general->addDex($general->getCrewTypeObj(), $reqCrew / 100, false); [$reqGold, $reqRice] = $this->getCost(); $general->addExperience($exp); $general->addDedication($ded); $general->increaseVarWithLimit('gold', -$reqGold, 0); $general->increaseVarWithLimit('rice', -$reqRice, 0); $general->increaseVar('leadership_exp', 1); $general->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->checkStatChange(); tryUniqueItemLottery($general); $general->applyDB($db); return true; } public function getJSFiles(): array { return [ 'js/recruitCrewForm.js' ]; } public function getForm(): string { $db = DB::db(); $general = $this->generalObj; [$nationLevel, $tech] = $db->queryFirstList('SELECT level,tech FROM nation WHERE nation=%i', $general->getNationID()); if(!$nationLevel){ $nationLevel = 0; } if(!$tech){ $tech = 0; } $ownCities = []; $ownRegions = []; $year = $this->env['year']; $startyear = $this->env['startyear']; $relativeYear = $year - $startyear; foreach(DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city){ $ownCities[$city['city']] = 1; $ownRegions[$city['region']] = 1; } $leadership = $general->getLeadership(); $fullLeadership = $general->getLeadership(false); $abil = getTechAbil($tech); $armTypes = []; foreach(GameUnitConst::allType() as $armType => $armName){ $armTypeCrews = []; foreach(GameUnitConst::byType($armType) as $unit){ $crewObj = new \stdClass; $crewObj->showDefault = 'true'; $crewObj->id = $unit->id; if($unit->reqTech == 0){ $crewObj->bgcolor = 'green'; } else{ $crewObj->bgcolor = 'limegreen'; } if(!$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech)){ $crewObj->showDefault = 'false'; $crewObj->bgcolor = 'red'; } $crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType'=>$unit->armType]); $crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType'=>$unit->armType]); $crewObj->name = $unit->name; $crewObj->attack = $unit->attack + $abil; $crewObj->defence = $unit->defence + $abil; $crewObj->speed = $unit->speed; $crewObj->avoid = $unit->avoid; if($this->env['show_img_level'] < 2) { $crewObj->img = ServConfig::$sharedIconPath."/default.jpg"; } else{ $crewObj->img = ServConfig::$gameImagePath."/weap".$unit->id.".png"; } $crewObj->baseRiceShort = round($crewObj->baseRice, 1); $crewObj->baseCostShort = round($crewObj->baseCost, 1); $crewObj->info = join('
', $unit->info); $armTypeCrews[] = $crewObj; } $armTypes[] = [$armName, $armTypeCrews]; } $commandName = $this->getName(); $techLevelText = getTechCall($tech); $crew = $general->getVar('crew'); $gold = $general->getVar('gold'); $crewTypeObj = $general->getCrewTypeObj(); ob_start(); ?> 병사를 모집합니다. 훈련과 사기치는 낮지만 가격이 저렴합니다.
훈련과 사기치는 높지만 자금이 많이 듭니다. 가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.
이미 병사가 있는 경우 추가되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.
현재 가능한 병종은 녹색으로 표시되며,
현재 가능한 특수병종은 초록색으로 표시됩니다.
불가능한 병종 표시
모병은 가격 2배의 자금이 소요됩니다.
현재 기술력 : 현재 통솔 : 현재 병종 : name?> 현재 병사 : 현재 자금 :
사진 병종 공격 방어 기동 회피 가격 군량 병사수 행동 특징
계열
name?> attack?> defence?> speed?> avoid?> baseCostShort?> baseRiceShort?>
00명
info?>