diff --git a/hwe/sammo/Command/General/che_기술연구.php b/hwe/sammo/Command/General/che_기술연구.php index 79892d26..6c9f9a2a 100644 --- a/hwe/sammo/Command/General/che_기술연구.php +++ b/hwe/sammo/Command/General/che_기술연구.php @@ -1,137 +1,137 @@ -arg = null; - return true; - } - - protected function init() - { - - $general = $this->generalObj; - - $this->setCity(); - $this->setNation(['tech']); - - [$reqGold, $reqRice] = $this->getCost(); - - $this->fullConditionConstraints=[ - ConstraintHelper::NotBeNeutral(), - ConstraintHelper::NotWanderingNation(), - ConstraintHelper::OccupiedCity(), - ConstraintHelper::SuppliedCity(), - ConstraintHelper::ReqGeneralGold($reqGold), - ConstraintHelper::ReqGeneralRice($reqRice) - ]; - - $this->reqGold = $reqGold; - } - - public function run():bool{ - if(!$this->hasFullConditionMet()){ - throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); - } - - $db = DB::db(); - - $general = $this->generalObj; - - $trust = Util::valueFit($this->city['trust'], 50); - - $score = Util::valueFit($this->calcBaseScore(), 1); - - ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); - if($trust < 80){ - $successRatio *= $trust / 80; - } - $successRatio = $general->onCalcDomestic(static::$cityKey, 'success', $successRatio); - $failRatio = $general->onCalcDomestic(static::$cityKey, 'fail', $failRatio); - - $successRatio = Util::valueFit($successRatio, 0, 1); - $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); - $normalRatio = 1 - $failRatio - $successRatio; - - $pick = Util::choiceRandomUsingWeight([ - 'fail'=>$failRatio, - 'success'=>$successRatio, - 'normal'=>$normalRatio - ]); - - $logger = $general->getLogger(); - - $date = $general->getTurnTime($general::TURNTIME_HM); - - $score *= CriticalScoreEx($pick); - $score = Util::round($score); - - $exp = $score * 0.7; - $ded = $score * 1.0; - - $scoreText = number_format($score, 0); - - $josaUl = JosaUtil::pick(static::$actionName, '을'); - if($pick == 'fail'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); - } - else if($pick == 'success'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); - } - else{ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); - } - - if(TechLimit($this->env['startyear'], $this->env['year'], $this->nation['tech'])){ - $score /= 4; - } - - $genCount = Util::valueFit( - $db->queryFirstField('SELECT gennum FROM nation WHERE nation=%i', $general->getVar('nation')), - GameConst::$initialNationGenLimit - ); - - $nationUpdated = [ - 'tech' => $this->nation['tech'] + $score/$genCount - ]; - $db->update('nation', $nationUpdated, 'nation=%i', $general->getVar('nation')); - - $general->increaseVarWithLimit('gold', -$this->reqGold, 0); - $general->addExperience($exp); - $general->addDedication($ded); - $general->increaseVar(static::$statKey.'_exp', 1); - - $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); - $general->checkStatChange(); - tryUniqueItemLottery($general); - $general->applyDB($db); - - return true; - } - - +arg = null; + return true; + } + + protected function init() + { + + $general = $this->generalObj; + + $this->setCity(); + $this->setNation(['tech']); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->fullConditionConstraints=[ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotWanderingNation(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice) + ]; + + $this->reqGold = $reqGold; + } + + public function run():bool{ + if(!$this->hasFullConditionMet()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + + $trust = Util::valueFit($this->city['trust'], 50); + + $score = Util::valueFit($this->calcBaseScore(), 1); + + ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); + if($trust < 80){ + $successRatio *= $trust / 80; + } + $successRatio = $general->onCalcDomestic(static::$actionKey, 'success', $successRatio); + $failRatio = $general->onCalcDomestic(static::$actionKey, 'fail', $failRatio); + + $successRatio = Util::valueFit($successRatio, 0, 1); + $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); + $normalRatio = 1 - $failRatio - $successRatio; + + $pick = Util::choiceRandomUsingWeight([ + 'fail'=>$failRatio, + 'success'=>$successRatio, + 'normal'=>$normalRatio + ]); + + $logger = $general->getLogger(); + + $date = $general->getTurnTime($general::TURNTIME_HM); + + $score *= CriticalScoreEx($pick); + $score = Util::round($score); + + $exp = $score * 0.7; + $ded = $score * 1.0; + + $scoreText = number_format($score, 0); + + $josaUl = JosaUtil::pick(static::$actionName, '을'); + if($pick == 'fail'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); + } + else if($pick == 'success'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); + } + else{ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); + } + + if(TechLimit($this->env['startyear'], $this->env['year'], $this->nation['tech'])){ + $score /= 4; + } + + $genCount = Util::valueFit( + $db->queryFirstField('SELECT gennum FROM nation WHERE nation=%i', $general->getVar('nation')), + GameConst::$initialNationGenLimit + ); + + $nationUpdated = [ + 'tech' => $this->nation['tech'] + $score/$genCount + ]; + $db->update('nation', $nationUpdated, 'nation=%i', $general->getVar('nation')); + + $general->increaseVarWithLimit('gold', -$this->reqGold, 0); + $general->addExperience($exp); + $general->addDedication($ded); + $general->increaseVar(static::$statKey.'_exp', 1); + + $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->checkStatChange(); + tryUniqueItemLottery($general); + $general->applyDB($db); + + return true; + } + + } \ No newline at end of file diff --git a/hwe/sammo/Command/General/che_상업투자.php b/hwe/sammo/Command/General/che_상업투자.php index 8b8f3ea8..9643a3e2 100644 --- a/hwe/sammo/Command/General/che_상업투자.php +++ b/hwe/sammo/Command/General/che_상업투자.php @@ -1,208 +1,208 @@ -arg = null; - return true; - } - - protected function init(){ - - $general = $this->generalObj; - - $this->setCity(); - $this->setNation(); - - [$reqGold, $reqRice] = $this->getCost(); - - $this->fullConditionConstraints=[ - ConstraintHelper::NotBeNeutral(), - ConstraintHelper::NotWanderingNation(), - ConstraintHelper::OccupiedCity(), - ConstraintHelper::SuppliedCity(), - ConstraintHelper::ReqGeneralGold($reqGold), - ConstraintHelper::ReqGeneralRice($reqRice), - ConstraintHelper::RemainCityCapacity(static::$cityKey, static::$actionName) - ]; - - $this->reqGold = $reqGold; - } - - public function getCommandDetailTitle():string{ - $name = $this->getName(); - $statTypeBase = [ - 'leadership'=>'통솔경험', - 'strength'=>'무력경험', - 'intel'=>'지력경험', - ]; - $statType = $statTypeBase[static::$statKey]; - [$reqGold, $reqRice] = $this->getCost(); - - $title = "{$name}({$statType}"; - if($reqGold > 0){ - $title .= ", 자금{$reqGold}"; - } - if($reqRice > 0){ - $title .= ", 군량{$reqRice}"; - } - $title .= ')'; - return $title; - } - - public function getCost():array{ - $develCost = $this->env['develcost']; - $reqGold = Util::round($this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost)); - $reqRice = 0; - - return [$reqGold, $reqRice]; - } - - - public function getCompensationStyle():?int{ - return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; - } - - public function getPreReqTurn():int{ - return 0; - } - - public function getPostReqTurn():int{ - return 0; - } - - protected function calcBaseScore():float{ - $trust = Util::valueFit($this->city['trust'], 50); - $general = $this->generalObj; - - if(static::$statKey == 'intel'){ - $score = $general->getIntel(true, true, true, false); - } - else if(static::$statKey == 'strength'){ - $score = $general->getStrength(true, true, true, false); - } - else if(static::$statKey == 'leadership'){ - $score = $general->getLeadership(true, true, true, false); - } - else{ - throw new \sammo\MustNotBeReachedException(); - } - - $score *= $trust / 100; - $score *= getDomesticExpLevelBonus($general->getVar('explevel')); - $score *= Util::randRange(0.8, 1.2); - $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); - - return $score; - } - - public function run():bool{ - if(!$this->hasFullConditionMet()){ - throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); - } - - $db = DB::db(); - - $general = $this->generalObj; - - $trust = Util::valueFit($this->city['trust'], 50); - - $score = Util::valueFit($this->calcBaseScore(), 1); - - ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); - if($trust < 80){ - $successRatio *= $trust / 80; - } - $successRatio = $general->onCalcDomestic(static::$cityKey, 'success', $successRatio); - $failRatio = $general->onCalcDomestic(static::$cityKey, 'fail', $failRatio); - - $successRatio = Util::valueFit($successRatio, 0, 1); - $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); - $normalRatio = 1 - $failRatio - $successRatio; - - $pick = Util::choiceRandomUsingWeight([ - 'fail'=>$failRatio, - 'success'=>$successRatio, - 'normal'=>$normalRatio - ]); - - $logger = $general->getLogger(); - - $date = $general->getTurnTime($general::TURNTIME_HM); - - $score *= CriticalScoreEx($pick); - $score = Util::round($score); - - $exp = $score * 0.7; - $ded = $score * 1.0; - - $scoreText = number_format($score, 0); - - $josaUl = JosaUtil::pick(static::$actionName, '을'); - if($pick == 'fail'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); - } - else if($pick == 'success'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); - } - else{ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); - } - - if(in_array($this->city['front'], [1, 3]) && $this->nation['capital'] != $this->city['city']){ - $score *= static::$debuffFront; - } - - //NOTE: 내정량 상승시 초과 가능? - $cityUpdated = [ - static::$cityKey => Util::valueFit( - $this->city[static::$cityKey] + $score, - 0, - $this->city[static::$cityKey.'_max'] - ) - ]; - $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); - - $general->increaseVarWithLimit('gold', -$this->reqGold, 0); - $general->addExperience($exp); - $general->addDedication($ded); - $general->increaseVar(static::$statKey.'_exp', 1); - $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); - $general->checkStatChange(); - tryUniqueItemLottery($general); - $general->applyDB($db); - - return true; - } - - +arg = null; + return true; + } + + protected function init(){ + + $general = $this->generalObj; + + $this->setCity(); + $this->setNation(); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->fullConditionConstraints=[ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotWanderingNation(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ConstraintHelper::RemainCityCapacity(static::$cityKey, static::$actionName) + ]; + + $this->reqGold = $reqGold; + } + + public function getCommandDetailTitle():string{ + $name = $this->getName(); + $statTypeBase = [ + 'leadership'=>'통솔경험', + 'strength'=>'무력경험', + 'intel'=>'지력경험', + ]; + $statType = $statTypeBase[static::$statKey]; + [$reqGold, $reqRice] = $this->getCost(); + + $title = "{$name}({$statType}"; + if($reqGold > 0){ + $title .= ", 자금{$reqGold}"; + } + if($reqRice > 0){ + $title .= ", 군량{$reqRice}"; + } + $title .= ')'; + return $title; + } + + public function getCost():array{ + $develCost = $this->env['develcost']; + $reqGold = Util::round($this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost)); + $reqRice = 0; + + return [$reqGold, $reqRice]; + } + + + public function getCompensationStyle():?int{ + return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; + } + + public function getPreReqTurn():int{ + return 0; + } + + public function getPostReqTurn():int{ + return 0; + } + + protected function calcBaseScore():float{ + $trust = Util::valueFit($this->city['trust'], 50); + $general = $this->generalObj; + + if(static::$statKey == 'intel'){ + $score = $general->getIntel(true, true, true, false); + } + else if(static::$statKey == 'strength'){ + $score = $general->getStrength(true, true, true, false); + } + else if(static::$statKey == 'leadership'){ + $score = $general->getLeadership(true, true, true, false); + } + else{ + throw new \sammo\MustNotBeReachedException(); + } + + $score *= $trust / 100; + $score *= getDomesticExpLevelBonus($general->getVar('explevel')); + $score *= Util::randRange(0.8, 1.2); + $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); + + return $score; + } + + public function run():bool{ + if(!$this->hasFullConditionMet()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + + $trust = Util::valueFit($this->city['trust'], 50); + + $score = Util::valueFit($this->calcBaseScore(), 1); + + ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); + if($trust < 80){ + $successRatio *= $trust / 80; + } + $successRatio = $general->onCalcDomestic(static::$actionKey, 'success', $successRatio); + $failRatio = $general->onCalcDomestic(static::$actionKey, 'fail', $failRatio); + + $successRatio = Util::valueFit($successRatio, 0, 1); + $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); + $normalRatio = 1 - $failRatio - $successRatio; + + $pick = Util::choiceRandomUsingWeight([ + 'fail'=>$failRatio, + 'success'=>$successRatio, + 'normal'=>$normalRatio + ]); + + $logger = $general->getLogger(); + + $date = $general->getTurnTime($general::TURNTIME_HM); + + $score *= CriticalScoreEx($pick); + $score = Util::round($score); + + $exp = $score * 0.7; + $ded = $score * 1.0; + + $scoreText = number_format($score, 0); + + $josaUl = JosaUtil::pick(static::$actionName, '을'); + if($pick == 'fail'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); + } + else if($pick == 'success'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); + } + else{ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); + } + + if(in_array($this->city['front'], [1, 3]) && $this->nation['capital'] != $this->city['city']){ + $score *= static::$debuffFront; + } + + //NOTE: 내정량 상승시 초과 가능? + $cityUpdated = [ + static::$cityKey => Util::valueFit( + $this->city[static::$cityKey] + $score, + 0, + $this->city[static::$cityKey.'_max'] + ) + ]; + $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); + + $general->increaseVarWithLimit('gold', -$this->reqGold, 0); + $general->addExperience($exp); + $general->addDedication($ded); + $general->increaseVar(static::$statKey.'_exp', 1); + $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->checkStatChange(); + tryUniqueItemLottery($general); + $general->applyDB($db); + + return true; + } + + } \ No newline at end of file diff --git a/hwe/sammo/Command/General/che_정착장려.php b/hwe/sammo/Command/General/che_정착장려.php index 05586f14..60f5ba7a 100644 --- a/hwe/sammo/Command/General/che_정착장려.php +++ b/hwe/sammo/Command/General/che_정착장려.php @@ -1,191 +1,191 @@ -arg = null; - return true; - } - - protected function init(){ - - $general = $this->generalObj; - - $this->setCity(); - $this->setNation(); - - [$reqGold, $reqRice] = $this->getCost(); - - $this->fullConditionConstraints=[ - ConstraintHelper::NotBeNeutral(), - ConstraintHelper::NotWanderingNation(), - ConstraintHelper::OccupiedCity(), - ConstraintHelper::SuppliedCity(), - ConstraintHelper::ReqGeneralGold($reqGold), - ConstraintHelper::ReqGeneralRice($reqRice), - ConstraintHelper::RemainCityCapacity(static::$cityKey, static::$actionName) - ]; - - $this->reqRice = $reqRice; - } - - public function getCommandDetailTitle():string{ - $name = $this->getName(); - $statTypeBase = [ - 'leadership'=>'통솔경험', - 'strength'=>'무력경험', - 'intel'=>'지력경험', - ]; - $statType = $statTypeBase[static::$statKey]; - [$reqGold, $reqRice] = $this->getCost(); - - $title = "{$name}({$statType}"; - if($reqGold > 0){ - $title .= ", 자금{$reqGold}"; - } - if($reqRice > 0){ - $title .= ", 군량{$reqRice}"; - } - $title .= ')'; - return $title; - } - - public function getCost():array{ - $develCost = $this->env['develcost'] * 2; - $reqGold = 0; - $reqRice = Util::round($this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost)); - - return [$reqGold, $reqRice]; - } - - public function getCompensationStyle():?int{ - return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; - } - - public function getPreReqTurn():int{ - return 0; - } - - public function getPostReqTurn():int{ - return 0; - } - - protected function calcBaseScore():float{ - $general = $this->generalObj; - - if(static::$statKey == 'leadership'){ - $score = $general->getLeadership(true, true, true, false); - } - else{ - throw new \sammo\MustNotBeReachedException(); - } - - $score *= getDomesticExpLevelBonus($general->getVar('explevel')); - $score *= Util::randRange(0.8, 1.2); - $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); - - return $score; - } - - public function run():bool{ - if(!$this->hasFullConditionMet()){ - throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); - } - - $db = DB::db(); - - $general = $this->generalObj; - - $score = Util::valueFit($this->calcBaseScore(), 1); - - ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); - $successRatio = $general->onCalcDomestic(static::$cityKey, 'success', $successRatio); - $failRatio = $general->onCalcDomestic(static::$cityKey, 'fail', $failRatio); - - $successRatio = Util::valueFit($successRatio, 0, 1); - $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); - $normalRatio = 1 - $failRatio - $successRatio; - - $pick = Util::choiceRandomUsingWeight([ - 'fail'=>$failRatio, - 'success'=>$successRatio, - 'normal'=>$normalRatio - ]); - - $logger = $general->getLogger(); - - $date = $general->getTurnTime($general::TURNTIME_HM); - - $score *= CriticalScoreEx($pick); - $score = Util::round($score); - - $exp = $score * 0.7; - $ded = $score * 1.0; - - $score *= 10; - - $scoreText = number_format($score, 0); - - $josaUl = JosaUtil::pick(static::$actionName, '을'); - if($pick == 'fail'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 주민이 $scoreText명 증가했습니다. <1>$date"); - } - else if($pick == 'success'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 주민이 $scoreText명 증가했습니다. <1>$date"); - } - else{ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 주민이 $scoreText명 증가했습니다. <1>$date"); - } - - //NOTE: 내정량 상승시 초과 가능? - $cityUpdated = [ - static::$cityKey => Util::valueFit( - $this->city[static::$cityKey] + $score, - 0, - $this->city[static::$cityKey.'_max'] - ) - ]; - $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); - - $general->increaseVarWithLimit('rice', -$this->reqRice, 0); - $general->addExperience($exp); - $general->addDedication($ded); - $general->increaseVar(static::$statKey.'_exp', 1); - $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); - $general->checkStatChange(); - tryUniqueItemLottery($general); - $general->applyDB($db); - - return true; - } - - +arg = null; + return true; + } + + protected function init(){ + + $general = $this->generalObj; + + $this->setCity(); + $this->setNation(); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->fullConditionConstraints=[ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotWanderingNation(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ConstraintHelper::RemainCityCapacity(static::$cityKey, static::$actionName) + ]; + + $this->reqRice = $reqRice; + } + + public function getCommandDetailTitle():string{ + $name = $this->getName(); + $statTypeBase = [ + 'leadership'=>'통솔경험', + 'strength'=>'무력경험', + 'intel'=>'지력경험', + ]; + $statType = $statTypeBase[static::$statKey]; + [$reqGold, $reqRice] = $this->getCost(); + + $title = "{$name}({$statType}"; + if($reqGold > 0){ + $title .= ", 자금{$reqGold}"; + } + if($reqRice > 0){ + $title .= ", 군량{$reqRice}"; + } + $title .= ')'; + return $title; + } + + public function getCost():array{ + $develCost = $this->env['develcost'] * 2; + $reqGold = 0; + $reqRice = Util::round($this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost)); + + return [$reqGold, $reqRice]; + } + + public function getCompensationStyle():?int{ + return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; + } + + public function getPreReqTurn():int{ + return 0; + } + + public function getPostReqTurn():int{ + return 0; + } + + protected function calcBaseScore():float{ + $general = $this->generalObj; + + if(static::$statKey == 'leadership'){ + $score = $general->getLeadership(true, true, true, false); + } + else{ + throw new \sammo\MustNotBeReachedException(); + } + + $score *= getDomesticExpLevelBonus($general->getVar('explevel')); + $score *= Util::randRange(0.8, 1.2); + $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); + + return $score; + } + + public function run():bool{ + if(!$this->hasFullConditionMet()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + + $score = Util::valueFit($this->calcBaseScore(), 1); + + ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); + $successRatio = $general->onCalcDomestic(static::$actionKey, 'success', $successRatio); + $failRatio = $general->onCalcDomestic(static::$actionKey, 'fail', $failRatio); + + $successRatio = Util::valueFit($successRatio, 0, 1); + $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); + $normalRatio = 1 - $failRatio - $successRatio; + + $pick = Util::choiceRandomUsingWeight([ + 'fail'=>$failRatio, + 'success'=>$successRatio, + 'normal'=>$normalRatio + ]); + + $logger = $general->getLogger(); + + $date = $general->getTurnTime($general::TURNTIME_HM); + + $score *= CriticalScoreEx($pick); + $score = Util::round($score); + + $exp = $score * 0.7; + $ded = $score * 1.0; + + $score *= 10; + + $scoreText = number_format($score, 0); + + $josaUl = JosaUtil::pick(static::$actionName, '을'); + if($pick == 'fail'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 주민이 $scoreText명 증가했습니다. <1>$date"); + } + else if($pick == 'success'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 주민이 $scoreText명 증가했습니다. <1>$date"); + } + else{ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 주민이 $scoreText명 증가했습니다. <1>$date"); + } + + //NOTE: 내정량 상승시 초과 가능? + $cityUpdated = [ + static::$cityKey => Util::valueFit( + $this->city[static::$cityKey] + $score, + 0, + $this->city[static::$cityKey.'_max'] + ) + ]; + $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); + + $general->increaseVarWithLimit('rice', -$this->reqRice, 0); + $general->addExperience($exp); + $general->addDedication($ded); + $general->increaseVar(static::$statKey.'_exp', 1); + $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->checkStatChange(); + tryUniqueItemLottery($general); + $general->applyDB($db); + + return true; + } + + } \ No newline at end of file diff --git a/hwe/sammo/Command/General/che_주민선정.php b/hwe/sammo/Command/General/che_주민선정.php index a78c6200..85335d76 100644 --- a/hwe/sammo/Command/General/che_주민선정.php +++ b/hwe/sammo/Command/General/che_주민선정.php @@ -1,191 +1,191 @@ -arg = null; - return true; - } - - protected function init(){ - - $general = $this->generalObj; - - $this->setCity(); - $this->setNation(); - - [$reqGold, $reqRice] = $this->getCost(); - - $this->fullConditionConstraints=[ - ConstraintHelper::NotBeNeutral(), - ConstraintHelper::NotWanderingNation(), - ConstraintHelper::OccupiedCity(), - ConstraintHelper::SuppliedCity(), - ConstraintHelper::ReqGeneralGold($reqGold), - ConstraintHelper::ReqGeneralRice($reqRice), - ConstraintHelper::RemainCityTrust(static::$actionName) - ]; - - $this->reqRice = $reqRice; - } - - public function getCommandDetailTitle():string{ - $name = $this->getName(); - $statTypeBase = [ - 'leadership'=>'통솔경험', - 'strength'=>'무력경험', - 'intel'=>'지력경험', - ]; - $statType = $statTypeBase[static::$statKey]; - [$reqGold, $reqRice] = $this->getCost(); - - $title = "{$name}({$statType}"; - if($reqGold > 0){ - $title .= ", 자금{$reqGold}"; - } - if($reqRice > 0){ - $title .= ", 군량{$reqRice}"; - } - $title .= ')'; - return $title; - } - - public function getCost():array{ - $develCost = $this->env['develcost'] * 2; - $reqGold = 0; - $reqRice = $this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost); - - return [$reqGold, Util::round($reqRice)]; - } - - public function getCompensationStyle():?int{ - return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; - } - - public function getPreReqTurn():int{ - return 0; - } - - public function getPostReqTurn():int{ - return 0; - } - - protected function calcBaseScore():float{ - $general = $this->generalObj; - - if(static::$statKey == 'leadership'){ - $score = $general->getLeadership(true, true, true, false); - } - else{ - throw new \sammo\MustNotBeReachedException(); - } - - $score *= getDomesticExpLevelBonus($general->getVar('explevel')); - $score *= Util::randRange(0.8, 1.2); - $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); - $score = Util::valueFit($score, 1); - - return $score; - } - - public function run():bool{ - if(!$this->hasFullConditionMet()){ - throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); - } - - $db = DB::db(); - - $general = $this->generalObj; - - $score = Util::valueFit($this->calcBaseScore(), 1); - - ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); - $successRatio = $general->onCalcDomestic(static::$cityKey, 'success', $successRatio); - $failRatio = $general->onCalcDomestic(static::$cityKey, 'fail', $failRatio); - - $successRatio = Util::valueFit($successRatio, 0, 1); - $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); - $normalRatio = 1 - $failRatio - $successRatio; - - $pick = Util::choiceRandomUsingWeight([ - 'fail'=>$failRatio, - 'success'=>$successRatio, - 'normal'=>$normalRatio - ]); - - $logger = $general->getLogger(); - - $date = $general->getTurnTime($general::TURNTIME_HM); - - $score *= CriticalScoreEx($pick); - - $exp = $score * 0.7; - $ded = $score * 1.0; - - $score /= 10; - - $scoreText = number_format($score, 1); - - $josaUl = JosaUtil::pick(static::$actionName, '을'); - if($pick == 'fail'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); - } - else if($pick == 'success'){ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); - } - else{ - $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); - } - - //NOTE: 내정량 상승시 초과 가능? - $cityUpdated = [ - static::$cityKey => Util::valueFit( - $this->city[static::$cityKey] + $score, - 0, - 100 - ) - ]; - $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); - - $general->increaseVarWithLimit('rice', -$this->reqRice, 0); - $general->addExperience($exp); - $general->addDedication($ded); - $general->increaseVar(static::$statKey.'_exp', 1); - $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); - $general->checkStatChange(); - tryUniqueItemLottery($general); - $general->applyDB($db); - - return true; - } - - +arg = null; + return true; + } + + protected function init(){ + + $general = $this->generalObj; + + $this->setCity(); + $this->setNation(); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->fullConditionConstraints=[ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotWanderingNation(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ConstraintHelper::RemainCityTrust(static::$actionName) + ]; + + $this->reqRice = $reqRice; + } + + public function getCommandDetailTitle():string{ + $name = $this->getName(); + $statTypeBase = [ + 'leadership'=>'통솔경험', + 'strength'=>'무력경험', + 'intel'=>'지력경험', + ]; + $statType = $statTypeBase[static::$statKey]; + [$reqGold, $reqRice] = $this->getCost(); + + $title = "{$name}({$statType}"; + if($reqGold > 0){ + $title .= ", 자금{$reqGold}"; + } + if($reqRice > 0){ + $title .= ", 군량{$reqRice}"; + } + $title .= ')'; + return $title; + } + + public function getCost():array{ + $develCost = $this->env['develcost'] * 2; + $reqGold = 0; + $reqRice = $this->generalObj->onCalcDomestic(static::$actionKey, 'cost', $develCost); + + return [$reqGold, Util::round($reqRice)]; + } + + public function getCompensationStyle():?int{ + return $this->generalObj->onCalcDomestic(static::$actionKey, 'score', 100)<=>100; + } + + public function getPreReqTurn():int{ + return 0; + } + + public function getPostReqTurn():int{ + return 0; + } + + protected function calcBaseScore():float{ + $general = $this->generalObj; + + if(static::$statKey == 'leadership'){ + $score = $general->getLeadership(true, true, true, false); + } + else{ + throw new \sammo\MustNotBeReachedException(); + } + + $score *= getDomesticExpLevelBonus($general->getVar('explevel')); + $score *= Util::randRange(0.8, 1.2); + $score = $general->onCalcDomestic(static::$actionKey, 'score', $score); + $score = Util::valueFit($score, 1); + + return $score; + } + + public function run():bool{ + if(!$this->hasFullConditionMet()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + + $score = Util::valueFit($this->calcBaseScore(), 1); + + ['success'=>$successRatio, 'fail'=>$failRatio] = CriticalRatioDomestic($general, static::$statKey); + $successRatio = $general->onCalcDomestic(static::$actionKey, 'success', $successRatio); + $failRatio = $general->onCalcDomestic(static::$actionKey, 'fail', $failRatio); + + $successRatio = Util::valueFit($successRatio, 0, 1); + $failRatio = Util::valueFit($failRatio, 0, 1 - $successRatio); + $normalRatio = 1 - $failRatio - $successRatio; + + $pick = Util::choiceRandomUsingWeight([ + 'fail'=>$failRatio, + 'success'=>$successRatio, + 'normal'=>$normalRatio + ]); + + $logger = $general->getLogger(); + + $date = $general->getTurnTime($general::TURNTIME_HM); + + $score *= CriticalScoreEx($pick); + + $exp = $score * 0.7; + $ded = $score * 1.0; + + $score /= 10; + + $scoreText = number_format($score, 1); + + $josaUl = JosaUtil::pick(static::$actionName, '을'); + if($pick == 'fail'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 실패하여 $scoreText 상승했습니다. <1>$date"); + } + else if($pick == 'success'){ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 성공하여 $scoreText 상승했습니다. <1>$date"); + } + else{ + $logger->pushGeneralActionLog(static::$actionName."{$josaUl} 하여 $scoreText 상승했습니다. <1>$date"); + } + + //NOTE: 내정량 상승시 초과 가능? + $cityUpdated = [ + static::$cityKey => Util::valueFit( + $this->city[static::$cityKey] + $score, + 0, + 100 + ) + ]; + $db->update('city', $cityUpdated, 'city=%i', $general->getVar('city')); + + $general->increaseVarWithLimit('rice', -$this->reqRice, 0); + $general->addExperience($exp); + $general->addDedication($ded); + $general->increaseVar(static::$statKey.'_exp', 1); + $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->checkStatChange(); + tryUniqueItemLottery($general); + $general->applyDB($db); + + return true; + } + + } \ No newline at end of file