fix: 사망 시 유산 포인트 관련 환불/초기화가 없는 문제
This commit is contained in:
+206
-98
@@ -5,7 +5,8 @@ namespace sammo;
|
|||||||
use sammo\Command\GeneralCommand;
|
use sammo\Command\GeneralCommand;
|
||||||
use sammo\WarUnitTrigger as WarUnitTrigger;
|
use sammo\WarUnitTrigger as WarUnitTrigger;
|
||||||
|
|
||||||
class General implements iAction{
|
class General implements iAction
|
||||||
|
{
|
||||||
use LazyVarUpdater;
|
use LazyVarUpdater;
|
||||||
|
|
||||||
protected $raw = [];
|
protected $raw = [];
|
||||||
@@ -98,7 +99,8 @@ class General implements iAction{
|
|||||||
* @param int|null $month 게임 월
|
* @param int|null $month 게임 월
|
||||||
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능
|
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능
|
||||||
*/
|
*/
|
||||||
public function __construct(array $raw, ?array $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct=true){
|
public function __construct(array $raw, ?array $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true)
|
||||||
|
{
|
||||||
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
|
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
|
||||||
|
|
||||||
if ($nation === null) {
|
if ($nation === null) {
|
||||||
@@ -147,7 +149,8 @@ class General implements iAction{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initLogger(int $year, int $month){
|
function initLogger(int $year, int $month)
|
||||||
|
{
|
||||||
$this->logger = new ActionLogger(
|
$this->logger = new ActionLogger(
|
||||||
$this->getVar('no'),
|
$this->getVar('no'),
|
||||||
$this->getVar('nation'),
|
$this->getVar('nation'),
|
||||||
@@ -157,16 +160,26 @@ class General implements iAction{
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTurnTime(int $short=self::TURNTIME_FULL_MS){
|
function getTurnTime(int $short = self::TURNTIME_FULL_MS)
|
||||||
|
{
|
||||||
return [
|
return [
|
||||||
self::TURNTIME_FULL_MS=>function($turntime){return $turntime;},
|
self::TURNTIME_FULL_MS => function ($turntime) {
|
||||||
self::TURNTIME_FULL=>function($turntime){return substr($turntime, 0, 19);},
|
return $turntime;
|
||||||
self::TURNTIME_HMS=>function($turntime){return substr($turntime, 11, 8);},
|
},
|
||||||
self::TURNTIME_HM=>function($turntime){return substr($turntime, 11, 5);},
|
self::TURNTIME_FULL => function ($turntime) {
|
||||||
|
return substr($turntime, 0, 19);
|
||||||
|
},
|
||||||
|
self::TURNTIME_HMS => function ($turntime) {
|
||||||
|
return substr($turntime, 11, 8);
|
||||||
|
},
|
||||||
|
self::TURNTIME_HM => function ($turntime) {
|
||||||
|
return substr($turntime, 11, 5);
|
||||||
|
},
|
||||||
][$short]($this->getVar('turntime'));
|
][$short]($this->getVar('turntime'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function setItem(string $itemKey='item', ?string $itemCode){
|
function setItem(string $itemKey = 'item', ?string $itemCode)
|
||||||
|
{
|
||||||
if ($itemCode === null) {
|
if ($itemCode === null) {
|
||||||
$this->deleteItem($itemKey);
|
$this->deleteItem($itemKey);
|
||||||
}
|
}
|
||||||
@@ -175,49 +188,60 @@ class General implements iAction{
|
|||||||
$this->itemObjs[$itemKey] = buildItemClass($itemCode);
|
$this->itemObjs[$itemKey] = buildItemClass($itemCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteItem(string $itemKey='item'){
|
function deleteItem(string $itemKey = 'item')
|
||||||
|
{
|
||||||
$this->setVar($itemKey, 'None');
|
$this->setVar($itemKey, 'None');
|
||||||
$this->itemObjs[$itemKey] = new ActionItem\None();
|
$this->itemObjs[$itemKey] = new ActionItem\None();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getItem(string $itemKey='item'):BaseItem{
|
function getItem(string $itemKey = 'item'): BaseItem
|
||||||
|
{
|
||||||
return $this->itemObjs[$itemKey];
|
return $this->itemObjs[$itemKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNPCType():int{
|
function getNPCType(): int
|
||||||
|
{
|
||||||
return $this->raw['npc'];
|
return $this->raw['npc'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return BaseItem[] */
|
/** @return BaseItem[] */
|
||||||
function getItems():array{
|
function getItems(): array
|
||||||
|
{
|
||||||
return $this->itemObjs;
|
return $this->itemObjs;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPersonality():iAction{
|
function getPersonality(): iAction
|
||||||
|
{
|
||||||
return $this->personalityObj;
|
return $this->personalityObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSpecialDomestic():iAction{
|
function getSpecialDomestic(): iAction
|
||||||
|
{
|
||||||
return $this->specialDomesticObj;
|
return $this->specialDomesticObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSpecialWar():iAction{
|
function getSpecialWar(): iAction
|
||||||
|
{
|
||||||
return $this->specialWarObj;
|
return $this->specialWarObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLastTurn():LastTurn{
|
function getLastTurn(): LastTurn
|
||||||
|
{
|
||||||
return $this->lastTurn;
|
return $this->lastTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _setResultTurn(LastTurn $resultTurn){
|
function _setResultTurn(LastTurn $resultTurn)
|
||||||
|
{
|
||||||
$this->resultTurn = $resultTurn;
|
$this->resultTurn = $resultTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getResultTurn():LastTurn{
|
function getResultTurn(): LastTurn
|
||||||
|
{
|
||||||
return $this->resultTurn;
|
return $this->resultTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearActivatedSkill(){
|
function clearActivatedSkill()
|
||||||
|
{
|
||||||
foreach ($this->activatedSkill as $skillName => $state) {
|
foreach ($this->activatedSkill as $skillName => $state) {
|
||||||
if (!$state) {
|
if (!$state) {
|
||||||
continue;
|
continue;
|
||||||
@@ -232,72 +256,88 @@ class General implements iAction{
|
|||||||
$this->activatedSkill = [];
|
$this->activatedSkill = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getActivatedSkillLog():array{
|
function getActivatedSkillLog(): array
|
||||||
|
{
|
||||||
return $this->logActivatedSkill;
|
return $this->logActivatedSkill;
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasActivatedSkill(string $skillName):bool{
|
function hasActivatedSkill(string $skillName): bool
|
||||||
|
{
|
||||||
return $this->activatedSkill[$skillName] ?? false;
|
return $this->activatedSkill[$skillName] ?? false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function activateSkill(... $skillNames){
|
function activateSkill(...$skillNames)
|
||||||
|
{
|
||||||
foreach ($skillNames as $skillName) {
|
foreach ($skillNames as $skillName) {
|
||||||
$this->activatedSkill[$skillName] = true;
|
$this->activatedSkill[$skillName] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function deactivateSkill(... $skillNames){
|
function deactivateSkill(...$skillNames)
|
||||||
|
{
|
||||||
foreach ($skillNames as $skillName) {
|
foreach ($skillNames as $skillName) {
|
||||||
$this->activatedSkill[$skillName] = false;
|
$this->activatedSkill[$skillName] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getName():string{
|
function getName(): string
|
||||||
|
{
|
||||||
return $this->raw['name'];
|
return $this->raw['name'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getInfo():string{
|
function getInfo(): string
|
||||||
|
{
|
||||||
//iAction용 info로는 적절하지 않음
|
//iAction용 info로는 적절하지 않음
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
function getID():int{
|
function getID(): int
|
||||||
|
{
|
||||||
return $this->raw['no'];
|
return $this->raw['no'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRawCity():?array{
|
function getRawCity(): ?array
|
||||||
|
{
|
||||||
return $this->rawCity;
|
return $this->rawCity;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRawCity(?array $city){
|
function setRawCity(?array $city)
|
||||||
|
{
|
||||||
$this->rawCity = $city;
|
$this->rawCity = $city;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCityID():int{
|
function getCityID(): int
|
||||||
|
{
|
||||||
return $this->raw['city'];
|
return $this->raw['city'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNationID():int{
|
function getNationID(): int
|
||||||
|
{
|
||||||
return $this->raw['nation'];
|
return $this->raw['nation'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStaticNation():array{
|
function getStaticNation(): array
|
||||||
|
{
|
||||||
return getNationStaticInfo($this->raw['nation']);
|
return getNationStaticInfo($this->raw['nation']);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLogger():?ActionLogger{
|
function getLogger(): ?ActionLogger
|
||||||
|
{
|
||||||
return $this->logger;
|
return $this->logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNationTypeObj():iAction{
|
public function getNationTypeObj(): iAction
|
||||||
|
{
|
||||||
return $this->nationType;
|
return $this->nationType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOfficerLevelObj():iAction{
|
public function getOfficerLevelObj(): iAction
|
||||||
|
{
|
||||||
return $this->officerLevelObj;
|
return $this->officerLevelObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCrewTypeObj():GameUnitDetail{
|
function getCrewTypeObj(): GameUnitDetail
|
||||||
|
{
|
||||||
$crewType = GameUnitConst::byID($this->getVar('crewtype'));
|
$crewType = GameUnitConst::byID($this->getVar('crewtype'));
|
||||||
if ($crewType === null) {
|
if ($crewType === null) {
|
||||||
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
|
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
|
||||||
@@ -305,7 +345,8 @@ class General implements iAction{
|
|||||||
return $crewType;
|
return $crewType;
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcRecentWarTurn(int $turnTerm):int{
|
function calcRecentWarTurn(int $turnTerm): int
|
||||||
|
{
|
||||||
$cacheKey = "recent_war_turn_{$turnTerm}";
|
$cacheKey = "recent_war_turn_{$turnTerm}";
|
||||||
if (key_exists($cacheKey, $this->calcCache)) {
|
if (key_exists($cacheKey, $this->calcCache)) {
|
||||||
return $this->calcCache[$cacheKey];
|
return $this->calcCache[$cacheKey];
|
||||||
@@ -329,7 +370,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getReservedTurn(int $turnIdx, array $env):GeneralCommand{
|
function getReservedTurn(int $turnIdx, array $env): GeneralCommand
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$rawCmd = $db->queryFirstRow('SELECT * FROM general_turn WHERE general_id = %i AND turn_idx = %i', $this->getID(), $turnIdx);
|
$rawCmd = $db->queryFirstRow('SELECT * FROM general_turn WHERE general_id = %i AND turn_idx = %i', $this->getID(), $turnIdx);
|
||||||
if (!$rawCmd) {
|
if (!$rawCmd) {
|
||||||
@@ -345,7 +387,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[]
|
* @return GeneralCommand[]
|
||||||
*/
|
*/
|
||||||
public function getReservedTurnList(int $turnIdxFrom, int $turnIdxTo, array $env){
|
public function getReservedTurnList(int $turnIdxFrom, int $turnIdxTo, array $env)
|
||||||
|
{
|
||||||
if ($turnIdxFrom < 0 || $turnIdxFrom >= GameConst::$maxTurn) {
|
if ($turnIdxFrom < 0 || $turnIdxFrom >= GameConst::$maxTurn) {
|
||||||
throw new \OutOfRangeException('$turnIdxFrom 범위 초과' . $turnIdxFrom);
|
throw new \OutOfRangeException('$turnIdxFrom 범위 초과' . $turnIdxFrom);
|
||||||
}
|
}
|
||||||
@@ -388,7 +431,8 @@ class General implements iAction{
|
|||||||
* @return int|float 계산된 능력치
|
* @return int|float 계산된 능력치
|
||||||
*/
|
*/
|
||||||
|
|
||||||
protected function getStatValue(string $statName, $withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
protected function getStatValue(string $statName, $withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
$cKey = "{$statName}_{$withInjury}_{$withIActionObj}_{$withStatAdjust}";
|
$cKey = "{$statName}_{$withInjury}_{$withIActionObj}_{$withStatAdjust}";
|
||||||
if (key_exists($cKey, $this->calcCache)) {
|
if (key_exists($cKey, $this->calcCache)) {
|
||||||
$statValue = $this->calcCache[$cKey];
|
$statValue = $this->calcCache[$cKey];
|
||||||
@@ -407,8 +451,7 @@ class General implements iAction{
|
|||||||
if ($withStatAdjust) {
|
if ($withStatAdjust) {
|
||||||
if ($statName === 'strength') {
|
if ($statName === 'strength') {
|
||||||
$statValue += Util::round($this->getStatValue('intel', $withInjury, $withIActionObj, false, false) / 4);
|
$statValue += Util::round($this->getStatValue('intel', $withInjury, $withIActionObj, false, false) / 4);
|
||||||
}
|
} else if ($statName === 'intel') {
|
||||||
else if($statName === 'intel'){
|
|
||||||
$statValue += Util::round($this->getStatValue('strength', $withInjury, $withIActionObj, false, false) / 4);
|
$statValue += Util::round($this->getStatValue('strength', $withInjury, $withIActionObj, false, false) / 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -443,19 +486,23 @@ class General implements iAction{
|
|||||||
return $statValue;
|
return $statValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLeadership($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getLeadership($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('leadership', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('leadership', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStrength($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getStrength($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('strength', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('strength', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIntel($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true):float{
|
function getIntel($withInjury = true, $withIActionObj = true, $withStatAdjust = true, $useFloor = true): float
|
||||||
|
{
|
||||||
return $this->getStatValue('intel', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
return $this->getStatValue('intel', $withInjury, $withIActionObj, $withStatAdjust, $useFloor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDex(GameUnitDetail $crewType){
|
function getDex(GameUnitDetail $crewType)
|
||||||
|
{
|
||||||
$armType = $crewType->armType;
|
$armType = $crewType->armType;
|
||||||
|
|
||||||
if ($armType == GameUnitConst::T_CASTLE) {
|
if ($armType == GameUnitConst::T_CASTLE) {
|
||||||
@@ -465,7 +512,8 @@ class General implements iAction{
|
|||||||
return $this->getVar("dex{$armType}");
|
return $this->getVar("dex{$armType}");
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDex(GameUnitDetail $crewType, float $exp, bool $affectTrainAtmos=false){
|
function addDex(GameUnitDetail $crewType, float $exp, bool $affectTrainAtmos = false)
|
||||||
|
{
|
||||||
$armType = $crewType->armType;
|
$armType = $crewType->armType;
|
||||||
|
|
||||||
if ($armType == GameUnitConst::T_CASTLE) {
|
if ($armType == GameUnitConst::T_CASTLE) {
|
||||||
@@ -478,8 +526,7 @@ class General implements iAction{
|
|||||||
|
|
||||||
if ($armType == GameUnitConst::T_WIZARD) {
|
if ($armType == GameUnitConst::T_WIZARD) {
|
||||||
$exp *= 0.9;
|
$exp *= 0.9;
|
||||||
}
|
} else if ($armType == GameUnitConst::T_SIEGE) {
|
||||||
else if($armType == GameUnitConst::T_SIEGE) {
|
|
||||||
$exp *= 0.9;
|
$exp *= 0.9;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,7 +539,8 @@ class General implements iAction{
|
|||||||
$this->increaseVar($dexType, $exp);
|
$this->increaseVar($dexType, $exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addExperience(float $experience, bool $affectTrigger=true){
|
function addExperience(float $experience, bool $affectTrigger = true)
|
||||||
|
{
|
||||||
if ($affectTrigger) {
|
if ($affectTrigger) {
|
||||||
$experience = $this->onCalcStat($this, 'experience', $experience);
|
$experience = $this->onCalcStat($this, 'experience', $experience);
|
||||||
}
|
}
|
||||||
@@ -509,14 +557,13 @@ class General implements iAction{
|
|||||||
$josaRo = JosaUtil::pick($nextExpLevel, '로');
|
$josaRo = JosaUtil::pick($nextExpLevel, '로');
|
||||||
if ($comp > 0) {
|
if ($comp > 0) {
|
||||||
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <C>레벨업</>!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <C>레벨업</>!", ActionLogger::PLAIN);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <R>레벨다운</>!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<C>Lv {$nextExpLevel}</>{$josaRo} <R>레벨다운</>!", ActionLogger::PLAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDedication(float $dedication, bool $affectTrigger=true){
|
function addDedication(float $dedication, bool $affectTrigger = true)
|
||||||
|
{
|
||||||
if ($affectTrigger) {
|
if ($affectTrigger) {
|
||||||
$dedication = $this->onCalcStat($this, 'dedication', $dedication);
|
$dedication = $this->onCalcStat($this, 'dedication', $dedication);
|
||||||
}
|
}
|
||||||
@@ -536,14 +583,13 @@ class General implements iAction{
|
|||||||
$josaRoBill = JosaUtil::pick($billText, '로');
|
$josaRoBill = JosaUtil::pick($billText, '로');
|
||||||
if ($comp > 0) {
|
if ($comp > 0) {
|
||||||
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <C>승급</>하여 봉록이 <C>{$billText}</>{$josaRoBill} <C>상승</>했습니다!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <C>승급</>하여 봉록이 <C>{$billText}</>{$josaRoBill} <C>상승</>했습니다!", ActionLogger::PLAIN);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <R>강등</>되어 봉록이 <C>{$billText}</>{$josaRoBill} <R>하락</>했습니다!", ActionLogger::PLAIN);
|
$this->getLogger()->pushGeneralActionLog("<Y>{$dedLevelText}</>{$josaRoDed} <R>강등</>되어 봉록이 <C>{$billText}</>{$josaRoBill} <R>하락</>했습니다!", ActionLogger::PLAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateVar(string $key, $value){
|
function updateVar(string $key, $value)
|
||||||
|
{
|
||||||
if (($this->raw[$key] ?? null) === $value) {
|
if (($this->raw[$key] ?? null) === $value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -557,13 +603,56 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @param \MeekroDB $db
|
* @param \MeekroDB $db
|
||||||
*/
|
*/
|
||||||
function kill($db, bool $sendDyingMessage=true, ?string $dyingMessage=null){
|
function kill($db, bool $sendDyingMessage = true, ?string $dyingMessage = null)
|
||||||
|
{
|
||||||
$generalID = $this->getID();
|
$generalID = $this->getID();
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
|
|
||||||
$generalName = $this->getName();
|
$generalName = $this->getName();
|
||||||
|
|
||||||
|
//유산포인트 관련 항목 환불
|
||||||
|
if ($this->getNPCType() < 2) {
|
||||||
|
|
||||||
|
$refundPoint = 0;
|
||||||
|
$userID = $this->getVar('owner');
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
if ($this->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$this->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$userLogger->push(sprintf("사망으로 랜덤 유니크 구입 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
$refundPoint += GameConst::$inheritItemRandomPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
$itemTrials = $this->getAuxVar('inheritUniqueTrial') ?? [];
|
||||||
|
foreach (array_keys($itemTrials) as $itemKey) {
|
||||||
|
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||||
|
$ownTrial = $trialStor->getValue("u{$userID}");
|
||||||
|
|
||||||
|
$itemObj = buildItemClass($itemKey);
|
||||||
|
$itemName = $itemObj->getName();
|
||||||
|
|
||||||
|
if (!$ownTrial) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
[,, $amount] = $ownTrial;
|
||||||
|
$trialStor->deleteValue("u{$userID}");
|
||||||
|
$userLogger->push("사망으로 {$itemName} 입찰에 사용한 {$amount} 포인트 반환", "inheritPoint");
|
||||||
|
$refundPoint += $amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->getAuxVar('inheritSpecificSpecialWar')){
|
||||||
|
$this->setAuxVar('inheritSpecificSpecialWar', null);
|
||||||
|
$userLogger->push(sprintf("사망으로 전투 특기 지정 %d 포인트 반환", GameConst::$inheritSpecificSpecialPoint), "inheritPoint");
|
||||||
|
$refundPoint += GameConst::$inheritSpecificSpecialPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($refundPoint > 0) {
|
||||||
|
$this->increaseInheritancePoint('previous', $refundPoint);
|
||||||
|
}
|
||||||
|
|
||||||
$this->mergeTotalInheritancePoint();
|
$this->mergeTotalInheritancePoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 군주였으면 유지 이음
|
// 군주였으면 유지 이음
|
||||||
$officerLevel = $this->getVar('officer_level');
|
$officerLevel = $this->getVar('officer_level');
|
||||||
@@ -588,8 +677,7 @@ class General implements iAction{
|
|||||||
if ($sendDyingMessage) {
|
if ($sendDyingMessage) {
|
||||||
if ($dyingMessage) {
|
if ($dyingMessage) {
|
||||||
$logger->pushGlobalActionLog($dyingMessage);
|
$logger->pushGlobalActionLog($dyingMessage);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$dyingMessageObj = new TextDecoration\DyingMessage($this);
|
$dyingMessageObj = new TextDecoration\DyingMessage($this);
|
||||||
$logger->pushGlobalActionLog($dyingMessageObj->getText());
|
$logger->pushGlobalActionLog($dyingMessageObj->getText());
|
||||||
}
|
}
|
||||||
@@ -613,7 +701,8 @@ class General implements iAction{
|
|||||||
], 'nation=%i', $this->getVar('nation'));
|
], 'nation=%i', $this->getVar('nation'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function rebirth(){
|
function rebirth()
|
||||||
|
{
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
|
|
||||||
$generalName = $this->getName();
|
$generalName = $this->getName();
|
||||||
@@ -649,7 +738,8 @@ class General implements iAction{
|
|||||||
$logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌');
|
$logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌');
|
||||||
}
|
}
|
||||||
|
|
||||||
function increaseRankVar(string $key, int $value){
|
function increaseRankVar(string $key, int $value)
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
@@ -673,21 +763,22 @@ class General implements iAction{
|
|||||||
$this->rankVarIncrease[$key] = $value;
|
$this->rankVarIncrease[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRankVar(string $key, int $value){
|
function setRankVar(string $key, int $value)
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_exists($key, $this->rankVarRead)) {
|
if (key_exists($key, $this->rankVarRead)) {
|
||||||
unset($this->rankVarRead[$key]);
|
unset($this->rankVarRead[$key]);
|
||||||
}
|
} else if (key_exists($key, $this->rankVarIncrease)) {
|
||||||
else if(key_exists($key, $this->rankVarIncrease)){
|
|
||||||
unset($this->rankVarIncrease[$key]);
|
unset($this->rankVarIncrease[$key]);
|
||||||
}
|
}
|
||||||
$this->rankVarSet[$key] = $value;
|
$this->rankVarSet[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRankVar(string $key):int{
|
function getRankVar(string $key): int
|
||||||
|
{
|
||||||
if (!key_exists($key, static::RANK_COLUMN)) {
|
if (!key_exists($key, static::RANK_COLUMN)) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key);
|
||||||
}
|
}
|
||||||
@@ -706,7 +797,8 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @param \MeekroDB $db
|
* @param \MeekroDB $db
|
||||||
*/
|
*/
|
||||||
function applyDB($db):bool{
|
function applyDB($db): bool
|
||||||
|
{
|
||||||
if ($this->lastTurn && $this->getLastTurn() != $this->getResultTurn()) {
|
if ($this->lastTurn && $this->getLastTurn() != $this->getResultTurn()) {
|
||||||
$this->setVar('last_turn', $this->getResultTurn()->toJson());
|
$this->setVar('last_turn', $this->getResultTurn()->toJson());
|
||||||
}
|
}
|
||||||
@@ -754,7 +846,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStatChange():bool{
|
function checkStatChange(): bool
|
||||||
|
{
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
$limit = GameConst::$upgradeLimit;
|
$limit = GameConst::$upgradeLimit;
|
||||||
|
|
||||||
@@ -774,8 +867,7 @@ class General implements iAction{
|
|||||||
$this->increaseVar($statExpName, $limit);
|
$this->increaseVar($statExpName, $limit);
|
||||||
$this->increaseVar($statName, -1);
|
$this->increaseVar($statName, -1);
|
||||||
$result = true;
|
$result = true;
|
||||||
}
|
} else if ($this->getVar($statExpName) >= $limit) {
|
||||||
else if($this->getVar($statExpName) >= $limit){
|
|
||||||
$logger->pushGeneralActionLog("<S>{$statNickName}</>이 <C>1</> 올랐습니다!", ActionLogger::PLAIN);
|
$logger->pushGeneralActionLog("<S>{$statNickName}</>이 <C>1</> 올랐습니다!", ActionLogger::PLAIN);
|
||||||
$this->increaseVar($statExpName, -$limit);
|
$this->increaseVar($statExpName, -$limit);
|
||||||
$this->increaseVar($statName, 1);
|
$this->increaseVar($statName, 1);
|
||||||
@@ -786,7 +878,8 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
|
public function getPreTurnExecuteTriggerList(General $general): ?GeneralTriggerCaller
|
||||||
|
{
|
||||||
$caller = new GeneralTriggerCaller();
|
$caller = new GeneralTriggerCaller();
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -807,7 +900,8 @@ class General implements iAction{
|
|||||||
|
|
||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
|
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
||||||
|
{
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -826,7 +920,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
//xxx: $general?
|
//xxx: $general?
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -846,7 +941,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null){
|
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
||||||
|
{
|
||||||
//xxx: $general?
|
//xxx: $general?
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -866,7 +962,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcStrategic(string $turnType, string $varType, $value){
|
public function onCalcStrategic(string $turnType, string $varType, $value)
|
||||||
|
{
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -885,7 +982,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onCalcNationalIncome(string $type, $amount){
|
public function onCalcNationalIncome(string $type, $amount)
|
||||||
|
{
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
$this->officerLevelObj,
|
$this->officerLevelObj,
|
||||||
@@ -904,7 +1002,8 @@ class General implements iAction{
|
|||||||
return $amount;
|
return $amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWarPowerMultiplier(WarUnit $unit):array{
|
public function getWarPowerMultiplier(WarUnit $unit): array
|
||||||
|
{
|
||||||
//xxx:$unit
|
//xxx:$unit
|
||||||
$att = 1;
|
$att = 1;
|
||||||
$def = 1;
|
$def = 1;
|
||||||
@@ -927,7 +1026,8 @@ class General implements iAction{
|
|||||||
}
|
}
|
||||||
return [$att, $def];
|
return [$att, $def];
|
||||||
}
|
}
|
||||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
$caller = new WarUnitTriggerCaller();
|
$caller = new WarUnitTriggerCaller();
|
||||||
foreach (array_merge([
|
foreach (array_merge([
|
||||||
$this->nationType,
|
$this->nationType,
|
||||||
@@ -947,7 +1047,8 @@ class General implements iAction{
|
|||||||
|
|
||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
|
||||||
|
{
|
||||||
$caller = new WarUnitTriggerCaller(
|
$caller = new WarUnitTriggerCaller(
|
||||||
new WarUnitTrigger\che_필살시도($unit),
|
new WarUnitTrigger\che_필살시도($unit),
|
||||||
new WarUnitTrigger\che_필살발동($unit),
|
new WarUnitTrigger\che_필살발동($unit),
|
||||||
@@ -976,7 +1077,8 @@ class General implements iAction{
|
|||||||
return $caller;
|
return $caller;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function mergeQueryColumn(?array $reqColumns=null, int $constructMode=2):array{
|
static public function mergeQueryColumn(?array $reqColumns = null, int $constructMode = 2): array
|
||||||
|
{
|
||||||
$minimumColumn = ['no', 'name', 'city', 'nation', 'officer_level', 'officer_city'];
|
$minimumColumn = ['no', 'name', 'city', 'nation', 'officer_level', 'officer_city'];
|
||||||
$defaultEventColumn = [
|
$defaultEventColumn = [
|
||||||
'no', 'name', 'owner', 'city', 'nation', 'officer_level', 'officer_city',
|
'no', 'name', 'owner', 'city', 'nation', 'officer_level', 'officer_city',
|
||||||
@@ -1003,8 +1105,7 @@ class General implements iAction{
|
|||||||
foreach ($reqColumns as $column) {
|
foreach ($reqColumns as $column) {
|
||||||
if (key_exists($column, static::RANK_COLUMN)) {
|
if (key_exists($column, static::RANK_COLUMN)) {
|
||||||
$rankColumn[] = $column;
|
$rankColumn[] = $column;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$subColumn[] = $column;
|
$subColumn[] = $column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1023,7 +1124,8 @@ class General implements iAction{
|
|||||||
* @return \sammo\General[]
|
* @return \sammo\General[]
|
||||||
* @throws MustNotBeReachedException
|
* @throws MustNotBeReachedException
|
||||||
*/
|
*/
|
||||||
static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column=null, int $constructMode=2):array{
|
static public function createGeneralObjListFromDB(?array $generalIDList, ?array $column = null, int $constructMode = 2): array
|
||||||
|
{
|
||||||
if ($generalIDList === []) {
|
if ($generalIDList === []) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -1032,8 +1134,7 @@ class General implements iAction{
|
|||||||
if ($constructMode > 0) {
|
if ($constructMode > 0) {
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$year = null;
|
$year = null;
|
||||||
$month = null;
|
$month = null;
|
||||||
}
|
}
|
||||||
@@ -1046,8 +1147,7 @@ class General implements iAction{
|
|||||||
'no'
|
'no'
|
||||||
);
|
);
|
||||||
$generalIDList = array_keys($rawGenerals);
|
$generalIDList = array_keys($rawGenerals);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$rawGenerals = Util::convertArrayToDict(
|
$rawGenerals = Util::convertArrayToDict(
|
||||||
$db->query('SELECT %l FROM general WHERE no IN %li', Util::formatListOfBackticks($column), $generalIDList),
|
$db->query('SELECT %l FROM general WHERE no IN %li', Util::formatListOfBackticks($column), $generalIDList),
|
||||||
'no'
|
'no'
|
||||||
@@ -1085,13 +1185,13 @@ class General implements iAction{
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function createGeneralObjFromDB(int $generalID, ?array $column=null, int $constructMode=2):self{
|
static public function createGeneralObjFromDB(int $generalID, ?array $column = null, int $constructMode = 2): self
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
if ($constructMode > 0) {
|
if ($constructMode > 0) {
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$year = null;
|
$year = null;
|
||||||
$month = null;
|
$month = null;
|
||||||
}
|
}
|
||||||
@@ -1123,7 +1223,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[]
|
* @return GeneralCommand[]
|
||||||
*/
|
*/
|
||||||
static public function getReservedTurnByGeneralList(array $generalList, int $turnIdx, array $env){
|
static public function getReservedTurnByGeneralList(array $generalList, int $turnIdx, array $env)
|
||||||
|
{
|
||||||
if (!$generalList) {
|
if (!$generalList) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -1154,7 +1255,8 @@ class General implements iAction{
|
|||||||
* @param array $env
|
* @param array $env
|
||||||
* @return GeneralCommand[][]
|
* @return GeneralCommand[][]
|
||||||
*/
|
*/
|
||||||
static public function getReservedTurnListByGeneralList(array $generalList, int $turnIdxFrom, int $turnIdxTo, array $env){
|
static public function getReservedTurnListByGeneralList(array $generalList, int $turnIdxFrom, int $turnIdxTo, array $env)
|
||||||
|
{
|
||||||
//XXX: static인데 return값이 General이 아니라고?? GeneralCommandHelper같은게 있어야하지 않을까?
|
//XXX: static인데 return값이 General이 아니라고?? GeneralCommandHelper같은게 있어야하지 않을까?
|
||||||
if (!$generalList) {
|
if (!$generalList) {
|
||||||
return [];
|
return [];
|
||||||
@@ -1205,7 +1307,8 @@ class General implements iAction{
|
|||||||
/**
|
/**
|
||||||
* @return int|float
|
* @return int|float
|
||||||
*/
|
*/
|
||||||
public function getInheritancePoint(string $key, &$aux=null, bool $forceCalc=false){
|
public function getInheritancePoint(string $key, &$aux = null, bool $forceCalc = false)
|
||||||
|
{
|
||||||
$inheritType = static::INHERITANCE_KEY[$key] ?? null;
|
$inheritType = static::INHERITANCE_KEY[$key] ?? null;
|
||||||
if ($inheritType === null) {
|
if ($inheritType === null) {
|
||||||
throw new \OutOfRangeException("{$key}는 유산 타입이 아님");
|
throw new \OutOfRangeException("{$key}는 유산 타입이 아님");
|
||||||
@@ -1247,7 +1350,9 @@ class General implements iAction{
|
|||||||
throw new \InvalidArgumentException("{$storeType}은 올바르지 않은 유산 키임");
|
throw new \InvalidArgumentException("{$storeType}은 올바르지 않은 유산 키임");
|
||||||
}
|
}
|
||||||
|
|
||||||
$extractFn = function(){ return [0, null];};
|
$extractFn = function () {
|
||||||
|
return [0, null];
|
||||||
|
};
|
||||||
switch ($key) {
|
switch ($key) {
|
||||||
case 'dex':
|
case 'dex':
|
||||||
$extractFn = function () use ($multiplier) {
|
$extractFn = function () use ($multiplier) {
|
||||||
@@ -1280,7 +1385,8 @@ class General implements iAction{
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setInheritancePoint(string $key, $value, $aux=null){
|
public function setInheritancePoint(string $key, $value, $aux = null)
|
||||||
|
{
|
||||||
if (!is_int($value) && !is_float($value)) {
|
if (!is_int($value) && !is_float($value)) {
|
||||||
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
||||||
}
|
}
|
||||||
@@ -1315,7 +1421,8 @@ class General implements iAction{
|
|||||||
$inheritStor->setValue($key, [$value, $aux]);
|
$inheritStor->setValue($key, [$value, $aux]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function increaseInheritancePoint(string $key, $value, $aux=null){
|
public function increaseInheritancePoint(string $key, $value, $aux = null)
|
||||||
|
{
|
||||||
if (!is_int($value) && !is_float($value)) {
|
if (!is_int($value) && !is_float($value)) {
|
||||||
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
throw new \InvalidArgumentException("{$value}는 숫자가 아님");
|
||||||
}
|
}
|
||||||
@@ -1355,7 +1462,8 @@ class General implements iAction{
|
|||||||
$inheritStor->setValue($key, [$newValue, $aux]);
|
$inheritStor->setValue($key, [$newValue, $aux]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mergeTotalInheritancePoint(){
|
public function mergeTotalInheritancePoint()
|
||||||
|
{
|
||||||
$ownerID = $this->getVar('owner');
|
$ownerID = $this->getVar('owner');
|
||||||
if (!$ownerID) {
|
if (!$ownerID) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user