등용 수락 변경, Aux 처리 추가
nations->aux.joinedNations dummyGeneral에 exp,ded 추가 scheme에서 nations 제거
This commit is contained in:
@@ -147,7 +147,7 @@ class che_등용 extends Command\GeneralCommand{
|
||||
|
||||
$general->increaseVar('experience', $exp);
|
||||
$general->increaseVar('dedication', $ded);
|
||||
$general->increaseVar('intel2', 1);
|
||||
$general->increaseVar('leadership2', 1);
|
||||
$general->increaseVarWithLimit('gold', -$reqGold, 0);
|
||||
|
||||
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
|
||||
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
namespace sammo\Command\General;
|
||||
|
||||
use \sammo\{
|
||||
DB, Util, JosaUtil,
|
||||
General, DummyGeneral,
|
||||
ActionLogger,
|
||||
GameConst,
|
||||
LastTurn,
|
||||
Json,
|
||||
GameUnitConst,
|
||||
Command,
|
||||
ScoutMessage
|
||||
};
|
||||
|
||||
use function \sammo\{
|
||||
getDomesticExpLevelBonus,
|
||||
CriticalRatioDomestic,
|
||||
CriticalScoreEx,
|
||||
tryUniqueItemLottery,
|
||||
getAllNationStaticInfo,
|
||||
getNationStaticInfo
|
||||
};
|
||||
|
||||
use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
|
||||
|
||||
class che_등용수락 extends Command\GeneralCommand{
|
||||
static protected $actionName = '등용 수락';
|
||||
static public $reqArg = true;
|
||||
|
||||
protected function argTest():bool{
|
||||
if($this->arg === null){
|
||||
return false;
|
||||
}
|
||||
//NOTE: 사망 직전에 '등용' 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음
|
||||
if(!key_exists('destGeneralID', $this->arg)){
|
||||
return false;
|
||||
}
|
||||
$destGeneralID = $this->arg['destGeneralID'];
|
||||
if(!is_int($destGeneralID)){
|
||||
return false;
|
||||
}
|
||||
if($destGeneralID <= 0){
|
||||
return false;
|
||||
}
|
||||
if($destGeneralID == $this->generalObj->getID()){
|
||||
return false;
|
||||
}
|
||||
$this->arg = [
|
||||
'destGeneralID'=>$destGeneralID
|
||||
];
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function init(){
|
||||
|
||||
$general = $this->generalObj;
|
||||
$this->setNation(['gennum', 'scout']);
|
||||
|
||||
$destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation'], 0);
|
||||
$this->setDestGeneral($destGeneral);
|
||||
$this->setDestNation($this->arg['destNationID'], ['gennum', 'scout']);
|
||||
|
||||
$relYear = $this->env['year'] - $this->env['startyear'];
|
||||
|
||||
$this->reservableConstraints = [
|
||||
ConstraintHelper::AlwaysFail('예약 불가능 커맨드')
|
||||
];
|
||||
|
||||
$this->runnableConstraints=[
|
||||
ConstraintHelper::ReqEnvValue('join_mode', '==', 'onlyRandom', '랜덤 임관만 가능합니다'),
|
||||
ConstraintHelper::NotOpeningPart($relYear),
|
||||
ConstraintHelper::ExistsDestNation(),
|
||||
ConstraintHelper::AllowJoinDestNation($relYear),
|
||||
ConstraintHelper::ReqDestNationValue('level', '국가규모', '>', 0, '방랑군에는 임관할 수 없습니다.'),
|
||||
ConstraintHelper::DifferentDestNation(),
|
||||
ConstraintHelper::ReqGeneralValue('level', '직위', '!=', 12, '군주는 등용장을 수락할 수 없습니다')
|
||||
];
|
||||
}
|
||||
|
||||
public function getCost():array{
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
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();
|
||||
$env = $this->env;
|
||||
|
||||
$general = $this->generalObj;
|
||||
$generalID = $general->getID();
|
||||
$generalName = $general->getName();
|
||||
$cityID = $general->getVar('city');
|
||||
$nationID = $general->getNationID();
|
||||
|
||||
$destGeneral = $this->destGeneralObj;
|
||||
$destNationID = $this->destNation['nation'];
|
||||
$destNationName = $this->destNation['name'];
|
||||
|
||||
$relYear = $env['year'] - $env['startyear'];
|
||||
if($general->getVar('npc') == 1 || $relYear >= 3){
|
||||
$joinedNations = $general->getAuxVar('joinedNations')??[];
|
||||
$joinedNations[] = $destNationID;
|
||||
$general->setAuxVar('joinedNations', $joinedNations);
|
||||
}
|
||||
|
||||
$isTroopLeader = ($generalID == $general->getVar('troop'));
|
||||
|
||||
$destGeneral->increaseVar('experience', $destGeneral->onCalcStat($general, 'experience', 100));
|
||||
$destGeneral->increaseVar('dedication', $destGeneral->onCalcStat($general, 'dedication', 100));
|
||||
|
||||
$setOriginalCityValues = [];
|
||||
$setOriginalNationValues = [
|
||||
'gennum'=>$db->sqleval('gennum - 1')
|
||||
];
|
||||
|
||||
$setScoutNationValues = [
|
||||
'gennum'=>$db->sqleval('gennum + 1')
|
||||
];
|
||||
|
||||
if($nationID != 0){
|
||||
// 기본 금액 남기고 환수
|
||||
if($general->getVar('gold') > GameConst::$defaultGold){
|
||||
$setOriginalNationValues['gold'] = $db->sqleval('gold + %i', $general->getVar('gold') - GameConst::$defaultGold);
|
||||
$general->setVar('gold', GameConst::$defaultGold);
|
||||
}
|
||||
|
||||
if($general->getVar('rice') > GameConst::$defaultRice){
|
||||
$setOriginalNationValues['rice'] = $db->sqleval('rice + %i', $general->getVar('rice') - GameConst::$defaultRice);
|
||||
$general->setVar('rice', GameConst::$defaultRice);
|
||||
}
|
||||
|
||||
$generalLevel = $general->getVar('level');
|
||||
if(5 <= $generalLevel && $generalLevel <= 11){
|
||||
$setOriginalNationValues["l{$generalLevel}set"] = 0;
|
||||
}
|
||||
else if(2 <= $generalLevel && $generalLevel <= 4){
|
||||
$setOriginalCityValues['officer'.$generalLevel] = 0;
|
||||
}
|
||||
|
||||
// 재야가 아니면 명성N*10% 공헌N*10%감소
|
||||
$general->setVar('experience', $general->getVar('experience') * (1 - 0.1 * $general->getVar('betray')));
|
||||
$general->setVar('dedication', $general->getVar('dedication') * (1 - 0.1 * $general->getVar('betray')));
|
||||
$general->increaseVar('betray', 1);
|
||||
}
|
||||
else{
|
||||
$general->increaseVar('experience', $general->onCalcStat($general, 'experience', 100));
|
||||
$general->increaseVar('dedication', $general->onCalcStat($general, 'dedication', 100));
|
||||
}
|
||||
|
||||
if($general->getVar('npc') < 2){
|
||||
$general->setVar('killturn', $env['killturn']);
|
||||
}
|
||||
|
||||
|
||||
$logger = $general->getLogger();
|
||||
$destLogger = $destGeneral->getLogger();
|
||||
|
||||
$josaRo = JosaUtil::pick($destNationName, '로');
|
||||
$josaYi = JosaUtil::pick($generalName, '이');
|
||||
$logger->pushGeneralActionLog("<D>{$destNationName}</>{$josaRo} 망명하여 수도로 이동합니다.");
|
||||
$destLogger->pushGeneralActionLog("<Y>{$generalName}</> 등용에 성공했습니다.");
|
||||
|
||||
$logger->pushGeneralHistoryLog("<D>{$destNationName}</>{$josaRo} 망명");
|
||||
$destLogger->pushGeneralHistoryLog("<Y>{$generalName}</> 등용에 성공");
|
||||
|
||||
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <D><b>{$destNationName}</b></>{$josaRo} <S>망명</>하였습니다.");
|
||||
|
||||
if($nationID != 0){
|
||||
$db->update('nation', $setOriginalNationValues, 'nation=%i', $nationID);
|
||||
}
|
||||
$db->update('nation', $setScoutNationValues, 'nation=%i', $destNationID);
|
||||
if($setOriginalCityValues){
|
||||
$db->update('city', $setOriginalCityValues, 'city=%i', $cityID);
|
||||
}
|
||||
|
||||
|
||||
$general->setVar('permission', 'normal');
|
||||
$general->setVar('belong', 1);
|
||||
$general->setVar('level', 1);
|
||||
$general->setVar('nation', $destNationID);
|
||||
$general->setVar('city', $this->destNation['capital']);
|
||||
$general->setVar('troop', 0);
|
||||
|
||||
if($isTroopLeader){
|
||||
// 모두 탈퇴
|
||||
$db->update('general', [
|
||||
'troop'=>0,
|
||||
], 'troop_leader=%i', $generalID);
|
||||
// 부대 삭제
|
||||
$db->delete('troop', 'troop_leader=%i', $generalID);
|
||||
}
|
||||
|
||||
|
||||
$general->applyDB($db);
|
||||
$destGeneral->applyDB($db);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getForm(): string
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$destGenerals = [];
|
||||
$destRawGenerals = $db->query('SELECT no,name,npc,nation FROM general WHERE npc < 2 AND no != %i AND level != 12 ORDER BY npc,binary(name)',$this->generalObj->getID());
|
||||
foreach($destRawGenerals as $destGeneral){
|
||||
$destNationID = $destGeneral['nation'];
|
||||
if(!key_exists($destNationID, $destGenerals)){
|
||||
$destGenerals[$destNationID] = [];
|
||||
}
|
||||
$destGenerals[$destNationID] = [$destGeneral];
|
||||
}
|
||||
|
||||
$nationList = array_merge([0=>getNationStaticInfo(0)], getAllNationStaticInfo());
|
||||
|
||||
ob_start();
|
||||
?>
|
||||
재야나 타국의 장수를 등용합니다.<br>
|
||||
서신은 개인 메세지로 전달됩니다.<br>
|
||||
등용할 장수를 목록에서 선택하세요.<br>
|
||||
<select class='formInput' name="destGeneralID" id="destGeneralID" size='1' style='color:white;background-color:black;'>
|
||||
<?php foreach($nationList as $destNation): ?>
|
||||
<optgroup style='color:<?=$destNation['color']?>'>【<?=$destNation['name']?>】
|
||||
<?php foreach($destGenerals[$destNation['nation']]??[] as $destGeneral):
|
||||
$nameColor = \sammo\getNameColor($destGeneral['npc']);
|
||||
if($nameColor){
|
||||
$nameColor = " style='color:{$nameColor}'";
|
||||
}
|
||||
?>
|
||||
<option value='<?=$destGeneral['no']?>' <?=$nameColor?>><?=$destGeneral['name']?></option>
|
||||
<?php endforeach; ?>
|
||||
</optgroup>
|
||||
<?php endforeach; ?>
|
||||
|
||||
</select> <input type=button id="commonSubmit" value="<?=$this->getName()?>"><br>
|
||||
<?php
|
||||
return ob_get_clean();
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,7 @@ class che_랜덤임관 extends Command\GeneralCommand{
|
||||
|
||||
$relYear = $env['year'] - $env['startyear'];
|
||||
|
||||
$notIn = array_merge(Json::decode($general->getVar('nations')), $this->arg['destNationIDList']);
|
||||
$notIn = array_merge($general->getAuxVar('joinedNations')??[], $this->arg['destNationIDList']);
|
||||
|
||||
$destNation = null;
|
||||
|
||||
@@ -257,9 +257,9 @@ class che_랜덤임관 extends Command\GeneralCommand{
|
||||
|
||||
$relYear = $env['year'] - $env['startyear'];
|
||||
if($general->getVar('npc') == 1 || $relYear >= 3){
|
||||
$joinedNations = Json::decode($general->getVar('nations'));
|
||||
$joinedNations = $general->getAuxVar('joinedNations')??[];
|
||||
$joinedNations[] = $destNationID;
|
||||
$general->setVar('nations', Json::encode($joinedNations));
|
||||
$general->setAuxVar('joinedNations', $joinedNations);
|
||||
}
|
||||
|
||||
$general->increaseVar('experience', $exp);
|
||||
|
||||
@@ -173,9 +173,9 @@ class che_임관 extends Command\GeneralCommand{
|
||||
|
||||
$relYear = $env['year'] - $env['startyear'];
|
||||
if($general->getVar('npc') == 1 || $relYear >= 3){
|
||||
$joinedNations = Json::decode($general->getVar('nations'));
|
||||
$joinedNations = $general->getAuxVar('joinedNations')??[];
|
||||
$joinedNations[] = $destNationID;
|
||||
$general->setVar('nations', Json::encode($joinedNations));
|
||||
$general->setAuxVar('joinedNations', $joinedNations);
|
||||
}
|
||||
|
||||
$general->increaseVar('experience', $exp);
|
||||
|
||||
Reference in New Issue
Block a user