Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5c5b56492 | ||
|
|
69c69d63e6 | ||
|
|
3fd8b21867 | ||
|
|
8660e8cd85 | ||
|
|
8458f725f2 | ||
|
|
366678c965 | ||
|
|
336b5668db | ||
|
|
55886269ea | ||
|
|
0b3698595b | ||
|
|
05e43a39db | ||
|
|
5737ad3db2 | ||
|
|
4ac174eb9a | ||
|
|
895eec10b4 | ||
|
|
e0d891e89a | ||
|
|
adf7734b85 | ||
|
|
5362be9c21 | ||
|
|
847ece52f2 | ||
|
|
851c59d22c | ||
|
|
0669534bba | ||
|
|
05db47e62a | ||
|
|
4a0e608d1c | ||
|
|
45fe73af86 | ||
|
|
4d9fcd657f | ||
|
|
a057deb0fe | ||
|
|
4766210a7d |
@@ -64,6 +64,7 @@ var storedData = <?=Json::encode([
|
|||||||
<?=WebUtil::printJS('dist_js/vendors.js')?>
|
<?=WebUtil::printJS('dist_js/vendors.js')?>
|
||||||
<?=WebUtil::printJS('dist_js/dipcenter.js')?>
|
<?=WebUtil::printJS('dist_js/dipcenter.js')?>
|
||||||
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
|
||||||
|
<?=WebUtil::printCSS('../e_lib/summernote/summernote-bs4.css')?>
|
||||||
<?=WebUtil::printCSS('dist_css/vendors.css')?>
|
<?=WebUtil::printCSS('dist_css/vendors.css')?>
|
||||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||||
<?=WebUtil::printCSS('css/common.css')?>
|
<?=WebUtil::printCSS('css/common.css')?>
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ $admin = $gameStor->getValues(['develcost', 'cost', 'vote_title', 'vote', 'votec
|
|||||||
|
|
||||||
$generalID = Session::getGeneralID();
|
$generalID = Session::getGeneralID();
|
||||||
|
|
||||||
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc'], 2);
|
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc','imgsvr','picture','aux'], 2);
|
||||||
|
|
||||||
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
|
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
|
||||||
$develcost = $admin['develcost'] * 5;
|
$develcost = $admin['develcost'] * 5;
|
||||||
|
|||||||
+41
-10
@@ -1256,9 +1256,12 @@ function addAge()
|
|||||||
//나이와 호봉 증가
|
//나이와 호봉 증가
|
||||||
$db->update('general', [
|
$db->update('general', [
|
||||||
'age' => $db->sqleval('age+1'),
|
'age' => $db->sqleval('age+1'),
|
||||||
'belong' => $db->sqleval('belong+1')
|
|
||||||
], true);
|
], true);
|
||||||
|
|
||||||
|
$db->update('general', [
|
||||||
|
'belong' => $db->sqleval('belong+1')
|
||||||
|
], 'nation != 0');
|
||||||
|
|
||||||
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
|
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
|
||||||
|
|
||||||
if ($year >= $startYear + 3) {
|
if ($year >= $startYear + 3) {
|
||||||
@@ -1290,8 +1293,7 @@ function addAge()
|
|||||||
$special2 = $generalAux['inheritSpecificSpecialWar'];
|
$special2 = $generalAux['inheritSpecificSpecialWar'];
|
||||||
unset($generalAux['inheritSpecificSpecialWar']);
|
unset($generalAux['inheritSpecificSpecialWar']);
|
||||||
$updateVars['aux'] = Json::encode($generalAux);
|
$updateVars['aux'] = Json::encode($generalAux);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$special2 = SpecialityHelper::pickSpecialWar(
|
$special2 = SpecialityHelper::pickSpecialWar(
|
||||||
$general,
|
$general,
|
||||||
($generalAux['prev_types_special2']) ?? []
|
($generalAux['prev_types_special2']) ?? []
|
||||||
@@ -1592,9 +1594,19 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$availableUnique) {
|
if (!$availableUnique) {
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||||
|
$userLogger = new UserLogger($general->getVar('owner'));
|
||||||
|
$userLogger->push(sprintf("얻을 유니크가 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
}
|
||||||
|
|
||||||
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
|
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
|
||||||
|
|
||||||
$nationName = $general->getStaticNation()['name'];
|
$nationName = $general->getStaticNation()['name'];
|
||||||
@@ -1628,22 +1640,29 @@ function rollbackInheritUniqueTrial(General $general, string $itemKey, string $r
|
|||||||
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
|
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
|
||||||
LogText("선택유니크 롤백:{$ownerID}", [$itemKey, $itemTrials]);
|
LogText("선택유니크 롤백:{$ownerID}", [$itemKey, $itemTrials]);
|
||||||
unset($itemTrials[$itemKey]);
|
unset($itemTrials[$itemKey]);
|
||||||
|
if(count($itemTrials) == 0){
|
||||||
|
$itemTrials = null;
|
||||||
|
}
|
||||||
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
||||||
|
|
||||||
|
|
||||||
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||||
$ownTrial = $trialStor->getValue("u{$ownerID}");
|
$ownTrial = $trialStor->getValue("u{$ownerID}");
|
||||||
|
|
||||||
|
$itemObj = buildItemClass($itemKey);
|
||||||
|
$itemName = $itemObj->getName();
|
||||||
|
|
||||||
if ($ownTrial) {
|
if ($ownTrial) {
|
||||||
//두 값이 general, KVStorage 둘다 있고, 이중에선 KVStorage 값을 기준으로 하자 따르자
|
//두 값이 general, KVStorage 둘다 있고, 이중에선 KVStorage 값을 기준으로 하자 따르자
|
||||||
[,, $amount] = $ownTrial;
|
[,, $amount] = $ownTrial;
|
||||||
$trialStor->deleteValue("u{$ownerID}");
|
$trialStor->deleteValue("u{$ownerID}");
|
||||||
$general->increaseInheritancePoint('previous', $amount);
|
$general->increaseInheritancePoint('previous', $amount);
|
||||||
LogText("선택유니크 롤백포인트:{$ownerID}", $amount);
|
LogText("선택유니크 롤백포인트:{$ownerID}", $amount);
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($ownerID);
|
||||||
|
$userLogger->push("{$itemName} 입찰에 사용한 {$amount} 포인트 반환", "inheritPoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
$itemObj = buildItemClass($itemKey);
|
|
||||||
$itemName = $itemObj->getName();
|
|
||||||
//메시지
|
//메시지
|
||||||
|
|
||||||
$staticNation = $general->getStaticNation();
|
$staticNation = $general->getStaticNation();
|
||||||
@@ -1662,11 +1681,16 @@ function rollbackInheritUniqueTrial(General $general, string $itemKey, string $r
|
|||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
$msg->send(true);
|
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
$msg->send(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function tryInheritUniqueItem(General $general, string $acquireType = '아이템'): bool
|
function tryRollbackInheritUniqueItem(General $general): void
|
||||||
|
{
|
||||||
|
tryInheritUniqueItem($general, 'Rollback', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function tryInheritUniqueItem(General $general, string $acquireType = '아이템', bool $justRollback = false): bool
|
||||||
{
|
{
|
||||||
$ownerID = $general->getVar('owner');
|
$ownerID = $general->getVar('owner');
|
||||||
if (!$ownerID) {
|
if (!$ownerID) {
|
||||||
@@ -1769,6 +1793,9 @@ function tryInheritUniqueItem(General $general, string $acquireType = '아이템
|
|||||||
if ($ownTarget === null) {
|
if ($ownTarget === null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if ($justRollback) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
LogText("선택유니크획득{$ownerID}", $ownTarget);
|
LogText("선택유니크획득{$ownerID}", $ownTarget);
|
||||||
|
|
||||||
@@ -1814,7 +1841,7 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
}
|
}
|
||||||
|
|
||||||
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
|
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
|
||||||
if ($inheritUnique && count($inheritUnique)) {
|
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique)) {
|
||||||
LogText("유니크 준비?? {$general->getID()}", $inheritUnique);
|
LogText("유니크 준비?? {$general->getID()}", $inheritUnique);
|
||||||
$trialResult = tryInheritUniqueItem($general, $acquireType);
|
$trialResult = tryInheritUniqueItem($general, $acquireType);
|
||||||
if ($trialResult) {
|
if ($trialResult) {
|
||||||
@@ -1833,6 +1860,12 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
|
|
||||||
if ($trialCnt <= 0) {
|
if ($trialCnt <= 0) {
|
||||||
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
|
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
|
||||||
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
|
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
|
||||||
|
$userLogger = new UserLogger($general->getVar('owner'));
|
||||||
|
$userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1864,8 +1897,6 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
|
|||||||
if ($general->getAuxVar('inheritRandomUnique')) {
|
if ($general->getAuxVar('inheritRandomUnique')) {
|
||||||
//포인트로 랜덤 유니크 획득
|
//포인트로 랜덤 유니크 획득
|
||||||
$prob = 1;
|
$prob = 1;
|
||||||
LogText("{$general->getName()}, {$general->getID()} 유산 포인트 유니크", $prob);
|
|
||||||
$general->setAuxVar('inheritRandomUnique', null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (Util::range($trialCnt) as $_idx) {
|
foreach (Util::range($trialCnt) as $_idx) {
|
||||||
|
|||||||
@@ -1166,13 +1166,23 @@ function resetInheritanceUser(int $userID, bool $isRebirth=false):float{
|
|||||||
//이미 리셋되었으므로 리셋 안함
|
//이미 리셋되었으므로 리셋 안함
|
||||||
return $allPoints['previous'][0];
|
return $allPoints['previous'][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
|
||||||
|
$previousPoint = ($allPoints['previous']??[0,0])[0];
|
||||||
|
|
||||||
foreach($allPoints as $key=>[$value,]){
|
foreach($allPoints as $key=>[$value,]){
|
||||||
if($isRebirth && key_exists($key, $rebirthDegraded)){
|
if($isRebirth && key_exists($key, $rebirthDegraded)){
|
||||||
$value *= $rebirthDegraded[$key];
|
$value *= $rebirthDegraded[$key];
|
||||||
}
|
}
|
||||||
|
$keyText = General::INHERITANCE_KEY[$key][2];
|
||||||
|
$userLogger->push("{$keyText} 포인트 {$value} 증가", "inheritPoint");
|
||||||
$totalPoint += $value;
|
$totalPoint += $value;
|
||||||
}
|
}
|
||||||
$totalPoint = Util::toInt($totalPoint);
|
$totalPoint = Util::toInt($totalPoint);
|
||||||
|
$userLogger->push("포인트 {$previousPoint} => {$totalPoint}", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$inheritStor->resetValues();
|
$inheritStor->resetValues();
|
||||||
$inheritStor->setValue('previous', [$totalPoint, null]);
|
$inheritStor->setValue('previous', [$totalPoint, null]);
|
||||||
return $totalPoint;
|
return $totalPoint;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ else{
|
|||||||
'name', 'leadership', 'strength', 'intel', 'gold','rice',
|
'name', 'leadership', 'strength', 'intel', 'gold','rice',
|
||||||
'troop','officer_level','npc','picture','imgsvr',
|
'troop','officer_level','npc','picture','imgsvr',
|
||||||
'permission','penalty','belong', 'crewtype',
|
'permission','penalty','belong', 'crewtype',
|
||||||
'experience', 'dedication', 'betray', 'dedlevel', 'explevel', 'makelimit',
|
'experience', 'dedication', 'betray', 'dedlevel', 'explevel', 'makelimit', 'aux',
|
||||||
], 1);
|
], 1);
|
||||||
|
|
||||||
if($general instanceof DummyGeneral){
|
if($general instanceof DummyGeneral){
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ use sammo\Session;
|
|||||||
use sammo\SpecialityHelper;
|
use sammo\SpecialityHelper;
|
||||||
use sammo\StringUtil;
|
use sammo\StringUtil;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Util;
|
use sammo\Util;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
use sammo\WebUtil;
|
use sammo\WebUtil;
|
||||||
@@ -152,11 +153,13 @@ class Join extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['scenario', 'turnterm', 'turntime', 'show_img_level', 'startyear', 'year']);
|
$admin = $gameStor->getValues(['scenario', 'turnterm', 'turntime', 'show_img_level', 'startyear', 'year', 'month']);
|
||||||
|
|
||||||
$inheritTotalPoint = resetInheritanceUser($userID);
|
$inheritTotalPoint = resetInheritanceUser($userID);
|
||||||
$inheritRequiredPoint = 0;
|
$inheritRequiredPoint = 0;
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID, $admin['year'], $admin['month'], false);
|
||||||
|
|
||||||
if ($inheritCity !== null) {
|
if ($inheritCity !== null) {
|
||||||
$inheritRequiredPoint += GameConst::$inheritBornCityPoint;
|
$inheritRequiredPoint += GameConst::$inheritBornCityPoint;
|
||||||
}
|
}
|
||||||
@@ -183,6 +186,8 @@ class Join extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($inheritSpecial) {
|
if ($inheritSpecial) {
|
||||||
|
$speicalText = getGeneralSpecialWarName($inheritSpecial);
|
||||||
|
$userLogger->push("{$speicalText} 전투 특기를 가진 천재 생성", "inheritPoint");
|
||||||
$genius = true;
|
$genius = true;
|
||||||
} else {
|
} else {
|
||||||
// 현재 1%
|
// 현재 1%
|
||||||
@@ -196,6 +201,8 @@ class Join extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($inheritCity !== null) {
|
if ($inheritCity !== null) {
|
||||||
|
$cityname = CityConst::byID($inheritCity)->name;
|
||||||
|
$userLogger->push("{$cityname}에 장수 생성", "inheritPoint");
|
||||||
$city = $inheritCity;
|
$city = $inheritCity;
|
||||||
} else {
|
} else {
|
||||||
// 공백지에서만 태어나게
|
// 공백지에서만 태어나게
|
||||||
@@ -207,6 +214,7 @@ class Join extends \sammo\BaseAPI
|
|||||||
|
|
||||||
if ($inheritBonusStat) {
|
if ($inheritBonusStat) {
|
||||||
[$pleadership, $pstrength, $pintel] = $inheritBonusStat;
|
[$pleadership, $pstrength, $pintel] = $inheritBonusStat;
|
||||||
|
$userLogger->push("{$pleadership}, {$pstrength}, {$pintel} 보너스 능력치로 생성", "inheritPoint");
|
||||||
} else {
|
} else {
|
||||||
$pleadership = 0;
|
$pleadership = 0;
|
||||||
$pstrength = 0;
|
$pstrength = 0;
|
||||||
@@ -276,8 +284,10 @@ class Join extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($inheritTurntime !== null) {
|
if ($inheritTurntime !== null) {
|
||||||
//FIXME: 오동작함
|
|
||||||
$inheritTurntime = $inheritTurntime % ($admin['turnterm'] * 60);
|
$inheritTurntime = $inheritTurntime % ($admin['turnterm'] * 60);
|
||||||
|
|
||||||
|
$userLogger->push(sprintf("턴 시간 %02d:%02d 로 지정", intdiv($inheritTurntime, 60), $inheritTurntime%60), "inheritPoint");
|
||||||
|
|
||||||
$inheritTurntime += Util::randRangeInt(0, 999999) / 1000000;
|
$inheritTurntime += Util::randRangeInt(0, 999999) / 1000000;
|
||||||
$turntime = new \DateTimeImmutable(cutTurn($admin['turntime'], $admin['turnterm']));
|
$turntime = new \DateTimeImmutable(cutTurn($admin['turntime'], $admin['turnterm']));
|
||||||
$turntime = $turntime->add(TimeUtil::secondsToDateInterval($inheritTurntime));
|
$turntime = $turntime->add(TimeUtil::secondsToDateInterval($inheritTurntime));
|
||||||
@@ -372,9 +382,12 @@ class Join extends \sammo\BaseAPI
|
|||||||
]);
|
]);
|
||||||
$cityname = CityConst::byID($city)->name;
|
$cityname = CityConst::byID($city)->name;
|
||||||
|
|
||||||
|
|
||||||
if ($inheritRequiredPoint > 0) {
|
if ($inheritRequiredPoint > 0) {
|
||||||
|
$userLogger->push("장수 생성으로 포인트 {$inheritRequiredPoint} 소모", "inheritPoint");
|
||||||
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
|
||||||
$inheritStor->setValue('previous', [$inheritTotalPoint - $inheritRequiredPoint, null]);
|
$inheritStor->setValue('previous', [$inheritTotalPoint - $inheritRequiredPoint, null]);
|
||||||
|
$userLogger->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
$me = [
|
$me = [
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use sammo\General;
|
|||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
use sammo\TriggerInheritBuff;
|
use sammo\TriggerInheritBuff;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
|
|
||||||
class BuyHiddenBuff extends \sammo\BaseAPI
|
class BuyHiddenBuff extends \sammo\BaseAPI
|
||||||
@@ -50,6 +51,7 @@ class BuyHiddenBuff extends \sammo\BaseAPI
|
|||||||
if ($userID != $general->getVar('owner')) {
|
if ($userID != $general->getVar('owner')) {
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
|
||||||
$inheritBuffList = $general->getAuxVar('inheritBuff') ?? [];
|
$inheritBuffList = $general->getAuxVar('inheritBuff') ?? [];
|
||||||
$prevLevel = $inheritBuffList[$type] ?? 0;
|
$prevLevel = $inheritBuffList[$type] ?? 0;
|
||||||
@@ -70,6 +72,11 @@ class BuyHiddenBuff extends \sammo\BaseAPI
|
|||||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$buffTypeText = TriggerInheritBuff::BUFF_KEY_TEXT[$type];
|
||||||
|
$moreText = $prevLevel > 0 ? "추가":"";
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 {$buffTypeText} {$level} 단계 {$moreText}구입", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$inheritBuffList[$type] = $level;
|
$inheritBuffList[$type] = $level;
|
||||||
$general->setAuxVar('inheritBuff', $inheritBuffList);
|
$general->setAuxVar('inheritBuff', $inheritBuffList);
|
||||||
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use sammo\GameConst;
|
|||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
|
|
||||||
class BuyRandomUnique extends \sammo\BaseAPI
|
class BuyRandomUnique extends \sammo\BaseAPI
|
||||||
{
|
{
|
||||||
@@ -40,12 +41,17 @@ class BuyRandomUnique extends \sammo\BaseAPI
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
$previousPoint = ($inheritStor->getValue('previous')??[0, 0])[0];
|
$previousPoint = ($inheritStor->getValue('previous')??[0, 0])[0];
|
||||||
if($previousPoint < GameConst::$inheritItemRandomPoint){
|
$reqAmount = GameConst::$inheritItemRandomPoint;
|
||||||
|
if($previousPoint < $reqAmount){
|
||||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 랜덤 유니크 구입", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$general->setAuxVar('inheritRandomUnique', TimeUtil::now());
|
$general->setAuxVar('inheritRandomUnique', TimeUtil::now());
|
||||||
$inheritStor->setValue('previous', [$previousPoint - GameConst::$inheritItemRandomPoint, null]);
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ use sammo\DB;
|
|||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\buildItemClass;
|
||||||
|
|
||||||
class BuySpecificUnique extends \sammo\BaseAPI
|
class BuySpecificUnique extends \sammo\BaseAPI
|
||||||
{
|
{
|
||||||
public function validateArgs(): ?string
|
public function validateArgs(): ?string
|
||||||
@@ -70,6 +73,11 @@ class BuySpecificUnique extends \sammo\BaseAPI
|
|||||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$itemObj = buildItemClass($itemKey);
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$amount} 포인트로 유니크 {$itemObj->getName()} 구입 시도", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$itemTrials[$itemKey] = $amount;
|
$itemTrials[$itemKey] = $amount;
|
||||||
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
|
||||||
$inheritStor->setValue('previous', [$previousPoint - $amount, null]);
|
$inheritStor->setValue('previous', [$previousPoint - $amount, null]);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use sammo\DB;
|
|||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
|
|
||||||
class ResetSpecialWar extends \sammo\BaseAPI
|
class ResetSpecialWar extends \sammo\BaseAPI
|
||||||
@@ -55,6 +56,10 @@ class ResetSpecialWar extends \sammo\BaseAPI
|
|||||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$userLogger->push("{$reqPoint} 포인트로 전투 특기 초기화", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$oldTypeKey = 'prev_types_special2';
|
$oldTypeKey = 'prev_types_special2';
|
||||||
$oldSpecialList = $general->getAuxVar($oldTypeKey) ?? [];
|
$oldSpecialList = $general->getAuxVar($oldTypeKey) ?? [];
|
||||||
$oldSpecialList[] = $currentSpecialWar;
|
$oldSpecialList[] = $currentSpecialWar;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use sammo\GameConst;
|
|||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Util;
|
use sammo\Util;
|
||||||
|
|
||||||
class ResetTurnTime extends \sammo\BaseAPI
|
class ResetTurnTime extends \sammo\BaseAPI
|
||||||
@@ -59,6 +60,15 @@ class ResetTurnTime extends \sammo\BaseAPI
|
|||||||
|
|
||||||
$afterTurn = Util::randRange($turnTerm * -60 / 2, $turnTerm * 60 / 2);
|
$afterTurn = Util::randRange($turnTerm * -60 / 2, $turnTerm * 60 / 2);
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
if($afterTurn >= 0){
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 뒤로 밀림", intdiv($afterTurn, 60), $afterTurn%60), "inheritPoint");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 앞으로 당김", intdiv(-$afterTurn, 60), (-$afterTurn)%60), "inheritPoint");
|
||||||
|
}
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$turnTime = $currTurnTime->add(TimeUtil::secondsToDateInterval($afterTurn));
|
$turnTime = $currTurnTime->add(TimeUtil::secondsToDateInterval($afterTurn));
|
||||||
if ($turnTime <= $serverTurnTimeObj && $serverTurnTimeObj <= $currTurnTime) {
|
if ($turnTime <= $serverTurnTimeObj && $serverTurnTimeObj <= $currTurnTime) {
|
||||||
$turnTime = $turnTime->add(TimeUtil::secondsToDateInterval($turnTerm * 60));
|
$turnTime = $turnTime->add(TimeUtil::secondsToDateInterval($turnTerm * 60));
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ use sammo\DB;
|
|||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
|
use sammo\UserLogger;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\buildGeneralSpecialWarClass;
|
||||||
|
|
||||||
class SetNextSpecialWar extends \sammo\BaseAPI
|
class SetNextSpecialWar extends \sammo\BaseAPI
|
||||||
{
|
{
|
||||||
public function validateArgs(): ?string
|
public function validateArgs(): ?string
|
||||||
@@ -67,6 +70,11 @@ class SetNextSpecialWar extends \sammo\BaseAPI
|
|||||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$userLogger = new UserLogger($userID);
|
||||||
|
$specialWarObj = buildGeneralSpecialWarClass($type);
|
||||||
|
$userLogger->push("{$reqAmount} 포인트로 다음 전투 특기로 {$specialWarObj->getName()} 지정", "inheritPoint");
|
||||||
|
$userLogger->flush();
|
||||||
|
|
||||||
$general->setAuxVar('inheritSpecificSpecialWar', $type);
|
$general->setAuxVar('inheritSpecificSpecialWar', $type);
|
||||||
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class che_무기_09_동호비궁 extends \sammo\BaseStatItem{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.15, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.2, 20, 40),
|
||||||
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class che_무기_13_양유기궁 extends \sammo\BaseStatItem{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.05, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.1, 20, 40),
|
||||||
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class event_전투특기_반계 extends \sammo\BaseItem{
|
|||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_반계시도($unit),
|
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM),
|
||||||
new che_반계발동($unit)
|
new che_반계발동($unit)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_NPC능동 extends Command\GeneralCommand{
|
class che_NPC능동 extends Command\GeneralCommand{
|
||||||
static protected $actionName = 'NPC능동';
|
static protected $actionName = 'NPC능동';
|
||||||
@@ -97,7 +98,7 @@ class che_NPC능동 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
}
|
}
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ class che_랜덤임관 extends Command\GeneralCommand
|
|||||||
if (!$destNation) {
|
if (!$destNation) {
|
||||||
//임관 가능한 국가가 없다!
|
//임관 가능한 국가가 없다!
|
||||||
$logger->pushGeneralActionLog("임관 가능한 국가가 없습니다. <1>$date</>");
|
$logger->pushGeneralActionLog("임관 가능한 국가가 없습니다. <1>$date</>");
|
||||||
$this->alternative = new che_요양($general, $this->env, null);
|
$this->alternative = new che_인재탐색($general, $this->env, null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_모반시도 extends Command\GeneralCommand{
|
class che_모반시도 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '모반시도';
|
static protected $actionName = '모반시도';
|
||||||
|
|
||||||
@@ -95,6 +97,7 @@ class che_모반시도 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
$lordGeneral->applyDB($db);
|
$lordGeneral->applyDB($db);
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use \sammo\Constraint\ConstraintHelper;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use function sammo\DeleteConflict;
|
use function sammo\DeleteConflict;
|
||||||
use function sammo\refreshNationStaticInfo;
|
use function sammo\refreshNationStaticInfo;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_방랑 extends Command\GeneralCommand{
|
class che_방랑 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '방랑';
|
static protected $actionName = '방랑';
|
||||||
@@ -123,6 +123,7 @@ class che_방랑 extends Command\GeneralCommand{
|
|||||||
refreshNationStaticInfo();
|
refreshNationStaticInfo();
|
||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use function\sammo\tryUniqueItemLottery;
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_선양 extends Command\GeneralCommand
|
class che_선양 extends Command\GeneralCommand
|
||||||
{
|
{
|
||||||
@@ -136,6 +137,7 @@ class che_선양 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
$destGeneral->applyDB($db);
|
$destGeneral->applyDB($db);
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_소집해제 extends Command\GeneralCommand{
|
class che_소집해제 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '소집해제';
|
static protected $actionName = '소집해제';
|
||||||
|
|
||||||
@@ -80,6 +82,7 @@ class che_소집해제 extends Command\GeneralCommand{
|
|||||||
$general->addDedication($ded);
|
$general->addDedication($ded);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use \sammo\{
|
|||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_요양 extends Command\GeneralCommand{
|
class che_요양 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '요양';
|
static protected $actionName = '요양';
|
||||||
@@ -71,6 +71,7 @@ class che_요양 extends Command\GeneralCommand{
|
|||||||
$general->addDedication($ded);
|
$general->addDedication($ded);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ use \sammo\Json;
|
|||||||
|
|
||||||
use function \sammo\searchDistance;
|
use function \sammo\searchDistance;
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -217,6 +218,7 @@ class che_첩보 extends Command\GeneralCommand
|
|||||||
$general->increaseVar('leadership_exp', 1);
|
$general->increaseVar('leadership_exp', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use \sammo\Constraint\Constraint;
|
|||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class che_하야 extends Command\GeneralCommand{
|
class che_하야 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '하야';
|
static protected $actionName = '하야';
|
||||||
@@ -104,6 +104,7 @@ class che_하야 extends Command\GeneralCommand{
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ use \sammo\Constraint\ConstraintHelper;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use function sammo\refreshNationStaticInfo;
|
use function sammo\refreshNationStaticInfo;
|
||||||
use function sammo\deleteNation;
|
use function sammo\deleteNation;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
|
|
||||||
class che_해산 extends Command\GeneralCommand{
|
class che_해산 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '해산';
|
static protected $actionName = '해산';
|
||||||
@@ -96,7 +95,7 @@ class che_해산 extends Command\GeneralCommand{
|
|||||||
$oldGeneral->setVar('makelimit', 12);
|
$oldGeneral->setVar('makelimit', 12);
|
||||||
$oldGeneral->applyDB($db);
|
$oldGeneral->applyDB($db);
|
||||||
}
|
}
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ use \sammo\Command;
|
|||||||
|
|
||||||
use function \sammo\searchDistance;
|
use function \sammo\searchDistance;
|
||||||
use function \sammo\printCitiesBasedOnDistance;
|
use function \sammo\printCitiesBasedOnDistance;
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
use \sammo\Constraint\Constraint;
|
use \sammo\Constraint\Constraint;
|
||||||
use \sammo\Constraint\ConstraintHelper;
|
use \sammo\Constraint\ConstraintHelper;
|
||||||
@@ -294,6 +295,7 @@ class che_화계 extends Command\GeneralCommand
|
|||||||
|
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -327,6 +329,7 @@ class che_화계 extends Command\GeneralCommand
|
|||||||
$general->increaseRankVar('firenum', 1);
|
$general->increaseRankVar('firenum', 1);
|
||||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||||
$general->checkStatChange();
|
$general->checkStatChange();
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ use \sammo\JosaUtil;
|
|||||||
use \sammo\LastTurn;
|
use \sammo\LastTurn;
|
||||||
use \sammo\DB;
|
use \sammo\DB;
|
||||||
|
|
||||||
|
use function sammo\tryRollbackInheritUniqueItem;
|
||||||
|
|
||||||
class 휴식 extends Command\GeneralCommand{
|
class 휴식 extends Command\GeneralCommand{
|
||||||
static protected $actionName = '휴식';
|
static protected $actionName = '휴식';
|
||||||
|
|
||||||
@@ -39,7 +41,7 @@ class 휴식 extends Command\GeneralCommand{
|
|||||||
$logger->pushGeneralActionLog("아무것도 실행하지 않았습니다. <1>$date</>");
|
$logger->pushGeneralActionLog("아무것도 실행하지 않았습니다. <1>$date</>");
|
||||||
|
|
||||||
$this->setResultTurn(new LastTurn());
|
$this->setResultTurn(new LastTurn());
|
||||||
|
tryRollbackInheritUniqueItem($general);
|
||||||
$general->applyDB(DB::db());
|
$general->applyDB(DB::db());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+207
-99
@@ -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,12 +1077,13 @@ 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',
|
||||||
'special', 'special2', 'personal',
|
'special', 'special2', 'personal',
|
||||||
'horse', 'weapon', 'book', 'item', 'last_turn'
|
'horse', 'weapon', 'book', 'item', 'last_turn', 'aux',
|
||||||
];
|
];
|
||||||
$fullColumn = [
|
$fullColumn = [
|
||||||
'no', 'name', 'owner', 'owner_name', 'picture', 'imgsvr', 'nation', 'city', 'troop', 'injury', 'affinity',
|
'no', 'name', 'owner', 'owner_name', 'picture', 'imgsvr', 'nation', 'city', 'troop', 'injury', 'affinity',
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -681,7 +681,7 @@ class GeneralBuilder{
|
|||||||
'turntime'=>$turntime,
|
'turntime'=>$turntime,
|
||||||
'killturn'=>$killturn,
|
'killturn'=>$killturn,
|
||||||
'age'=>$age,
|
'age'=>$age,
|
||||||
'belong'=>1,
|
'belong'=>0,
|
||||||
'personal'=>$this->ego,
|
'personal'=>$this->ego,
|
||||||
'special'=>$this->specialDomestic,
|
'special'=>$this->specialDomestic,
|
||||||
'specage'=>$this->specAge,
|
'specage'=>$this->specAge,
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
class UserLogger
|
||||||
|
{
|
||||||
|
protected $userID;
|
||||||
|
protected $year;
|
||||||
|
protected $month;
|
||||||
|
protected $autoFlush;
|
||||||
|
protected $log = [];
|
||||||
|
|
||||||
|
function __construct(int $userID, ?int $year = null, ?int $month = null, bool $autoFlush = true)
|
||||||
|
{
|
||||||
|
$this->userID = $userID;
|
||||||
|
if ($year === null || $month === null) {
|
||||||
|
$db = DB::db();
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
$gameStor->cacheValues(['year', 'month']);
|
||||||
|
|
||||||
|
if ($year === null) {
|
||||||
|
$year = $gameStor->year;
|
||||||
|
}
|
||||||
|
if ($month === null) {
|
||||||
|
$month = $gameStor->month;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->year = $year;
|
||||||
|
$this->month = $month;
|
||||||
|
$this->autoFlush = $autoFlush;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
if ($this->autoFlush) {
|
||||||
|
$this->flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rollback()
|
||||||
|
{
|
||||||
|
$backup = $this->log;
|
||||||
|
$this->log = [];
|
||||||
|
|
||||||
|
return $backup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function flush()
|
||||||
|
{
|
||||||
|
if(!$this->log){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!$this->userID){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$serverID = UniqueConst::$serverID;
|
||||||
|
$request = array_map(function ($textAndType) use ($date, $serverID) {
|
||||||
|
[$text, $type] = $textAndType;
|
||||||
|
return [
|
||||||
|
'user_id' => $this->userID,
|
||||||
|
'server_id' => $serverID,
|
||||||
|
'log_type' => $type,
|
||||||
|
'year' => $this->year,
|
||||||
|
'month' => $this->month,
|
||||||
|
'date' => $date,
|
||||||
|
'text' => $text
|
||||||
|
];
|
||||||
|
}, array_values($this->log));
|
||||||
|
$db->insert('user_record', $request);
|
||||||
|
$this->log = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function push($text, string $type)
|
||||||
|
{
|
||||||
|
if (!$text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (is_array($text)) {
|
||||||
|
foreach ($text as $textItem) {
|
||||||
|
$this->log[] = [$textItem, $type];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->log[] = [$text, $type];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ class che_반계시도 extends BaseWarUnitTrigger{
|
|||||||
|
|
||||||
public function __construct(WarUnit $unit, int $raiseType = 0, float $prob = 0.4){
|
public function __construct(WarUnit $unit, int $raiseType = 0, float $prob = 0.4){
|
||||||
$this->object = $unit;
|
$this->object = $unit;
|
||||||
|
$this->raiseType = $raiseType;
|
||||||
$this->prob = $prob;
|
$this->prob = $prob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -149,7 +149,7 @@
|
|||||||
<div class="col col-md-1 col-3">
|
<div class="col col-md-1 col-3">
|
||||||
<label
|
<label
|
||||||
><input type="checkbox" v-model="displayInherit" />{{
|
><input type="checkbox" v-model="displayInherit" />{{
|
||||||
displayTable ? "숨기기" : "보이기"
|
displayInherit ? "숨기기" : "보이기"
|
||||||
}}</label
|
}}</label
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
@@ -305,7 +305,7 @@ import {
|
|||||||
CTableRow,
|
CTableRow,
|
||||||
CTableHeaderCell,
|
CTableHeaderCell,
|
||||||
CTableDataCell,
|
CTableDataCell,
|
||||||
} from "@coreui/vue/src";
|
} from "@coreui/vue/src/components/table";
|
||||||
import { getIconPath } from "./util/getIconPath";
|
import { getIconPath } from "./util/getIconPath";
|
||||||
import { isBrightColor } from "./util/isBrightColor";
|
import { isBrightColor } from "./util/isBrightColor";
|
||||||
import {
|
import {
|
||||||
@@ -458,21 +458,21 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
inheritTurnTimeMinute(newValue: number) {
|
inheritTurnTimeMinute(newValue: number) {
|
||||||
if (!this.inheritTurnTimeSet) {
|
if (!this.inheritTurnTimeSet) {
|
||||||
this.args.inheritTurntime = 0;
|
this.args.inheritTurntime = undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.args.inheritTurntime = newValue * 60 + this.inheritTurnTimeSecond;
|
this.args.inheritTurntime = newValue * 60 + this.inheritTurnTimeSecond;
|
||||||
},
|
},
|
||||||
inheritTurnTimeSecond(newValue: number) {
|
inheritTurnTimeSecond(newValue: number) {
|
||||||
if (!this.inheritTurnTimeSet) {
|
if (!this.inheritTurnTimeSet) {
|
||||||
this.args.inheritTurntime = 0;
|
this.args.inheritTurntime = undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.args.inheritTurntime = this.inheritTurnTimeMinute * 60 + newValue;
|
this.args.inheritTurntime = this.inheritTurnTimeMinute * 60 + newValue;
|
||||||
},
|
},
|
||||||
inheritTurnTimeSet(newValue: boolean) {
|
inheritTurnTimeSet(newValue: boolean) {
|
||||||
if (!newValue) {
|
if (!newValue) {
|
||||||
this.args.inheritTurntime = 0;
|
this.args.inheritTurntime = undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.args.inheritTurntime =
|
this.args.inheritTurntime =
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<NumberInputWithInfo
|
<NumberInputWithInfo
|
||||||
v-model="nationPolicy.reqHumanWarUrgentRice"
|
v-model="nationPolicy.reqHumanWarUrgentRice"
|
||||||
:step="100"
|
:step="100"
|
||||||
title="유저전투장 긴급포상 금"
|
title="유저전투장 긴급포상 쌀"
|
||||||
>유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br />0이면
|
>유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br />0이면
|
||||||
기본 병종으로 {{ (defaultStatMax * 100).toLocaleString() }} * 6명 사살
|
기본 병종으로 {{ (defaultStatMax * 100).toLocaleString() }} * 6명 사살
|
||||||
가능한 쌀을 기준으로 하며, 그 수치는 현재
|
가능한 쌀을 기준으로 하며, 그 수치는 현재
|
||||||
|
|||||||
@@ -893,7 +893,7 @@ $(function ($) {
|
|||||||
}
|
}
|
||||||
showBattleResult(result);
|
showBattleResult(result);
|
||||||
|
|
||||||
}, function (result) {
|
}, function () {
|
||||||
alert('전투 개시 실패!');
|
alert('전투 개시 실패!');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -933,7 +933,7 @@ $(function ($) {
|
|||||||
}
|
}
|
||||||
reorderDefender(result.order);
|
reorderDefender(result.order);
|
||||||
|
|
||||||
}, function (result) {
|
}, function () {
|
||||||
alert('재정렬 실패!');
|
alert('재정렬 실패!');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -968,7 +968,7 @@ $(function ($) {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#importModal').on('show.bs.modal', function (e) {
|
$('#importModal').on('show.bs.modal', function () {
|
||||||
if (!initGeneralList) {
|
if (!initGeneralList) {
|
||||||
const $list = $('#modalSelector');
|
const $list = $('#modalSelector');
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
"currentCity": "currentCity.ts",
|
"currentCity": "currentCity.ts",
|
||||||
"hallOfFame": "hallOfFame.ts",
|
"hallOfFame": "hallOfFame.ts",
|
||||||
"history": "history.ts",
|
"history": "history.ts",
|
||||||
"join": "legacy/join.ts",
|
|
||||||
"select_general_from_pool": "select_general_from_pool.ts",
|
"select_general_from_pool": "select_general_from_pool.ts",
|
||||||
"extKingdoms": "extKingdoms.ts",
|
"extKingdoms": "extKingdoms.ts",
|
||||||
"common": "common_deprecated.ts"
|
"common": "common_deprecated.ts"
|
||||||
|
|||||||
+2
-3
@@ -1,5 +1,4 @@
|
|||||||
import { template } from "lodash";
|
import { NPCChiefActions, NPCGeneralActions } from "./defs";
|
||||||
import { NationPolicy, NPCChiefActions, NPCGeneralActions } from "./defs";
|
|
||||||
|
|
||||||
export const NPCPriorityBtnHelpMessage: {
|
export const NPCPriorityBtnHelpMessage: {
|
||||||
[v in NPCChiefActions | NPCGeneralActions]: string;
|
[v in NPCChiefActions | NPCGeneralActions]: string;
|
||||||
@@ -34,7 +33,7 @@ export const NPCPriorityBtnHelpMessage: {
|
|||||||
NPC후방발령:
|
NPC후방발령:
|
||||||
"NPC전투장 중에<br>- 병력이 충분하지 않고,<br>- 도시의 인구가 제자리 징병할 수 있을 정도로 충분하지 않고,<br>- 부대에 탑승하지 않았다면,<br>인구가 충분한 후방도시로 발령합니다.",
|
"NPC전투장 중에<br>- 병력이 충분하지 않고,<br>- 도시의 인구가 제자리 징병할 수 있을 정도로 충분하지 않고,<br>- 부대에 탑승하지 않았다면,<br>인구가 충분한 후방도시로 발령합니다.",
|
||||||
NPC포상:
|
NPC포상:
|
||||||
"금/쌀이 부족한 유저장에게 포상합니다.<br>NPC전투장과 NPC내정장은 각각 기준을 따릅니다.<br>국고 권장량을 가급적 지킵니다.",
|
"금/쌀이 부족한 NPC에게 포상합니다.<br>NPC전투장과 NPC내정장은 각각 기준을 따릅니다.<br>국고 권장량을 가급적 지킵니다.",
|
||||||
NPC전방발령:
|
NPC전방발령:
|
||||||
"후방에 있는 유저장이<br>- 병력을 가지고 있으며,<br>- 곧 훈련/사기진작이 완료될 것 같으면,<br>전방으로 발령합니다.<br><br>도시 관직이 많이 임명된 도시를 선호합니다.",
|
"후방에 있는 유저장이<br>- 병력을 가지고 있으며,<br>- 곧 훈련/사기진작이 완료될 것 같으면,<br>전방으로 발령합니다.<br><br>도시 관직이 많이 임명된 도시를 선호합니다.",
|
||||||
유저장내정발령:
|
유저장내정발령:
|
||||||
|
|||||||
+30
-6
@@ -3,7 +3,12 @@
|
|||||||
<div
|
<div
|
||||||
id="container"
|
id="container"
|
||||||
class="bg0 px-2"
|
class="bg0 px-2"
|
||||||
style="max-width: 1000px; margin: auto; border: solid 1px #888888; overflow:hidden;"
|
style="
|
||||||
|
max-width: 1000px;
|
||||||
|
margin: auto;
|
||||||
|
border: solid 1px #888888;
|
||||||
|
overflow: hidden;
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<div id="inheritance_list" class="row">
|
<div id="inheritance_list" class="row">
|
||||||
<template v-for="(text, key) in inheritanceViewText" :key="key">
|
<template v-for="(text, key) in inheritanceViewText" :key="key">
|
||||||
@@ -235,6 +240,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="bg1 a-center">유산 포인트 변경 내역(최근 30건)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row" v-for="(log, idx) in lastInheritPointLogs" :key="idx">
|
||||||
|
<div class="col a-right" style="max-width:20ch">
|
||||||
|
<small class="text-muted">[{{log.date}}]</small>
|
||||||
|
</div>
|
||||||
|
<div class="col a-left">
|
||||||
|
{{log.text}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -263,6 +282,14 @@ type InheritanceType =
|
|||||||
|
|
||||||
type InheritanceViewType = InheritanceType | "sum" | "new";
|
type InheritanceViewType = InheritanceType | "sum" | "new";
|
||||||
|
|
||||||
|
declare const lastInheritPointLogs: {
|
||||||
|
server_id: string,
|
||||||
|
year: number,
|
||||||
|
month: number,
|
||||||
|
date: string,
|
||||||
|
text: string,
|
||||||
|
}[];
|
||||||
|
|
||||||
declare const items: Record<InheritanceType, number>;
|
declare const items: Record<InheritanceType, number>;
|
||||||
|
|
||||||
const inheritanceViewText: Record<
|
const inheritanceViewText: Record<
|
||||||
@@ -442,6 +469,7 @@ export default defineComponent({
|
|||||||
availableSpecialWar,
|
availableSpecialWar,
|
||||||
availableUnique,
|
availableUnique,
|
||||||
specificUniqueAmount: inheritActionCost.minSpecificUnique,
|
specificUniqueAmount: inheritActionCost.minSpecificUnique,
|
||||||
|
lastInheritPointLogs,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -617,11 +645,7 @@ export default defineComponent({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//TODO: JosaUtil
|
//TODO: JosaUtil
|
||||||
if (
|
if (!confirm(`${amount} 포인트로 ${uniqueName}(을)를 입찰하겠습니까?`)) {
|
||||||
!confirm(
|
|
||||||
`${amount} 포인트로 ${uniqueName}(을)를 입찰하겠습니까?`
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,213 +0,0 @@
|
|||||||
import $ from 'jquery';
|
|
||||||
import { exportWindow } from '../util/exportWindow';
|
|
||||||
import { mb_strwidth } from '../util/mb_strwidth';
|
|
||||||
import { unwrap_any } from '../util/unwrap_any';
|
|
||||||
|
|
||||||
declare const defaultStatTotal: number;
|
|
||||||
declare const defaultStatMax: number;
|
|
||||||
declare const defaultStatMin: number;
|
|
||||||
declare const charInfoText: Record<string, string>;
|
|
||||||
$(function ($) {
|
|
||||||
const $leadership = $('#leadership');
|
|
||||||
const $strength = $('#strength');
|
|
||||||
const $intel = $('#intel');
|
|
||||||
|
|
||||||
function abilityRand(): void {
|
|
||||||
let leadership = Math.random() * 65 + 10;
|
|
||||||
let strength = Math.random() * 65 + 10;
|
|
||||||
let intel = Math.random() * 65 + 10;
|
|
||||||
const rate = leadership + strength + intel;
|
|
||||||
|
|
||||||
leadership = Math.floor(leadership / rate * defaultStatTotal);
|
|
||||||
strength = Math.floor(strength / rate * defaultStatTotal);
|
|
||||||
intel = Math.floor(intel / rate * defaultStatTotal);
|
|
||||||
|
|
||||||
|
|
||||||
while (leadership + strength + intel < defaultStatTotal) {
|
|
||||||
leadership += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership > defaultStatMax || strength > defaultStatMax || intel > defaultStatMax || leadership < defaultStatMin || strength < defaultStatMin || intel < defaultStatMin) {
|
|
||||||
return abilityRand();
|
|
||||||
}
|
|
||||||
|
|
||||||
$leadership.val(leadership);
|
|
||||||
$strength.val(strength);
|
|
||||||
$intel.val(intel);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function abilityLeadpow() {
|
|
||||||
let leadership = Math.random() * 6;
|
|
||||||
let strength = Math.random() * 6;
|
|
||||||
let intel = Math.random() * 1;
|
|
||||||
const rate = leadership + strength + intel;
|
|
||||||
|
|
||||||
leadership = Math.floor(leadership / rate * defaultStatTotal);
|
|
||||||
strength = Math.floor(strength / rate * defaultStatTotal);
|
|
||||||
intel = Math.floor(intel / rate * defaultStatTotal);
|
|
||||||
|
|
||||||
while (leadership + strength + intel < defaultStatTotal) {
|
|
||||||
strength += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intel < defaultStatMin) {
|
|
||||||
leadership -= defaultStatMin - intel;
|
|
||||||
intel = defaultStatMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership > defaultStatMax) {
|
|
||||||
strength += leadership - defaultStatMax;
|
|
||||||
leadership = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strength > defaultStatMax) {
|
|
||||||
leadership += strength - defaultStatMax;
|
|
||||||
strength = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership > defaultStatMax) {
|
|
||||||
intel += leadership - defaultStatMax;
|
|
||||||
leadership = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
$leadership.val(leadership);
|
|
||||||
$strength.val(strength);
|
|
||||||
$intel.val(intel);
|
|
||||||
}
|
|
||||||
|
|
||||||
function abilityLeadint() {
|
|
||||||
let leadership = Math.random() * 6;
|
|
||||||
let strength = Math.random() * 1;
|
|
||||||
let intel = Math.random() * 6;
|
|
||||||
const rate = leadership + strength + intel;
|
|
||||||
|
|
||||||
leadership = Math.floor(leadership / rate * defaultStatTotal);
|
|
||||||
strength = Math.floor(strength / rate * defaultStatTotal);
|
|
||||||
intel = Math.floor(intel / rate * defaultStatTotal);
|
|
||||||
|
|
||||||
while (leadership + strength + intel < defaultStatTotal) {
|
|
||||||
intel += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strength < defaultStatMin) {
|
|
||||||
leadership -= defaultStatMin - strength;
|
|
||||||
strength = defaultStatMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership > defaultStatMax) {
|
|
||||||
intel += leadership - defaultStatMax;
|
|
||||||
leadership = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intel > defaultStatMax) {
|
|
||||||
leadership += intel - defaultStatMax;
|
|
||||||
intel = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership > defaultStatMax) {
|
|
||||||
strength += leadership - defaultStatMax;
|
|
||||||
leadership = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
$leadership.val(leadership);
|
|
||||||
$strength.val(strength);
|
|
||||||
$intel.val(intel);
|
|
||||||
}
|
|
||||||
|
|
||||||
function abilityPowint() {
|
|
||||||
let leadership = Math.random() * 1;
|
|
||||||
let strength = Math.random() * 6;
|
|
||||||
let intel = Math.random() * 6;
|
|
||||||
const rate = leadership + strength + intel;
|
|
||||||
|
|
||||||
leadership = Math.floor(leadership / rate * defaultStatTotal);
|
|
||||||
strength = Math.floor(strength / rate * defaultStatTotal);
|
|
||||||
intel = Math.floor(intel / rate * defaultStatTotal);
|
|
||||||
|
|
||||||
while (leadership + strength + intel < defaultStatTotal) {
|
|
||||||
intel += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leadership < defaultStatMin) {
|
|
||||||
strength -= defaultStatMin - leadership;
|
|
||||||
leadership = defaultStatMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strength > defaultStatMax) {
|
|
||||||
intel += strength - defaultStatMax;
|
|
||||||
strength = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intel > defaultStatMax) {
|
|
||||||
strength += intel - defaultStatMax;
|
|
||||||
intel = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strength > defaultStatMax) {
|
|
||||||
leadership += strength - defaultStatMax;
|
|
||||||
strength = defaultStatMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
$leadership.val(leadership);
|
|
||||||
$strength.val(strength);
|
|
||||||
$intel.val(intel);
|
|
||||||
}
|
|
||||||
|
|
||||||
exportWindow(abilityRand, 'abilityRand');
|
|
||||||
exportWindow(abilityLeadpow, 'abilityLeadpow');
|
|
||||||
exportWindow(abilityLeadint, 'abilityLeadint');
|
|
||||||
exportWindow(abilityPowint, 'abilityPowint');
|
|
||||||
|
|
||||||
const $charInfoText = $('#charInfoText');
|
|
||||||
const $selChar = $('#selChar');
|
|
||||||
$selChar.change(function () {
|
|
||||||
const $this = $(this);
|
|
||||||
const char = unwrap_any<string>($this.val());
|
|
||||||
if (char in charInfoText) {
|
|
||||||
$charInfoText.html(charInfoText[char]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$charInfoText.html('');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const $generalName = $('#generalName');
|
|
||||||
$generalName.on('change keyup paste', function () {
|
|
||||||
const generalName = unwrap_any<string>($generalName.val());
|
|
||||||
const len = mb_strwidth(generalName);
|
|
||||||
if (len == 0 || len > 18) {
|
|
||||||
$generalName.css('color', 'red');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$generalName.css('color', 'white');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#join_form').submit(function () {
|
|
||||||
const generalName = unwrap_any<string>($generalName.val());
|
|
||||||
if (mb_strwidth(generalName) > 18) {
|
|
||||||
alert('장수 이름이 너무 깁니다!');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const currentStatTotal = parseInt(unwrap_any<string>($leadership.val())) + parseInt(unwrap_any<string>($strength.val())) + parseInt(unwrap_any<string>($intel.val()));
|
|
||||||
if (currentStatTotal < defaultStatTotal) {
|
|
||||||
if (!confirm(`현재 능력치 총합은 ${currentStatTotal}으로, ${defaultStatTotal}보다 낮습니다. 그래도 생성할까요?`)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
const randomGenType = Math.floor(Math.random() * 7);
|
|
||||||
if (randomGenType < 3) {
|
|
||||||
abilityLeadpow();
|
|
||||||
}
|
|
||||||
else if (randomGenType < 6) {
|
|
||||||
abilityLeadint();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
abilityPowint();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
+1
-1
@@ -516,7 +516,7 @@ export async function reloadWorldMap(option: loadMapOption, drawTarget = '.world
|
|||||||
//터치스크린 탭
|
//터치스크린 탭
|
||||||
|
|
||||||
if (!option.neutralView && is_touch_device()) {
|
if (!option.neutralView && is_touch_device()) {
|
||||||
$objs.on('touchstart', function (e) {
|
$objs.on('touchstart', function () {
|
||||||
if (window.sam_toggleSingleTap) {
|
if (window.sam_toggleSingleTap) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ $(function ($) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$('#set_my_setting').on('click', async function (e) {
|
$('#set_my_setting').on('click', async function (e) {
|
||||||
|
e.preventDefault();
|
||||||
let result: InvalidResponse;
|
let result: InvalidResponse;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -186,6 +187,9 @@ $(function ($) {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
result = response.data;
|
result = response.data;
|
||||||
|
if(!result.result){
|
||||||
|
throw result.reason;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ function printGenerals(value: NPCToken) {
|
|||||||
const time = Date.now() + value.pickMoreSeconds * 1000;
|
const time = Date.now() + value.pickMoreSeconds * 1000;
|
||||||
$('#btn_pick_more').data('available', time).prop('disabled', true);
|
$('#btn_pick_more').data('available', time).prop('disabled', true);
|
||||||
|
|
||||||
const pick = $.map(value.pick, function (value, key) {
|
const pick = $.map(value.pick, function (value) {
|
||||||
return value;
|
return value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -62,8 +62,10 @@ foreach (array_keys(General::INHERITANCE_KEY) as $key) {
|
|||||||
$items[$key] = $me->getInheritancePoint($key) ?? 0;
|
$items[$key] = $me->getInheritancePoint($key) ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
$resetTurnTimeLevel = $me->getAuxVar('inheritResetTurnTime') ?? 0;
|
$resetTurnTimeLevel = ($me->getAuxVar('inheritResetTurnTime') ?? -1) + 1;
|
||||||
$resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar') ?? 0;
|
$resetSpecialWarLevel = ($me->getAuxVar('inheritResetSpecialWar') ?? -1) + 1;
|
||||||
|
|
||||||
|
$lastInheritPointLogs = $db->query('SELECT server_id, year, month, date, text FROM user_record WHERE log_type = %s AND user_id = %i ORDER BY id desc LIMIT 30', "inheritPoint", $userID);
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@@ -95,6 +97,7 @@ $resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar') ?? 0;
|
|||||||
],
|
],
|
||||||
'availableSpecialWar' => $avilableSpecialWar,
|
'availableSpecialWar' => $avilableSpecialWar,
|
||||||
'availableUnique' => $availableUnique,
|
'availableUnique' => $availableUnique,
|
||||||
|
'lastInheritPointLogs' => $lastInheritPointLogs,
|
||||||
]) ?>
|
]) ?>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -230,7 +230,7 @@ if ($server == $baseServerName) {
|
|||||||
__DIR__ . '/' . $server . '/d_setting/VersionGit.php',
|
__DIR__ . '/' . $server . '/d_setting/VersionGit.php',
|
||||||
[
|
[
|
||||||
'verionGit' => $version,
|
'verionGit' => $version,
|
||||||
'hash' => $hash
|
'hash' => $gitHash
|
||||||
],
|
],
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|||||||
+13
-15
@@ -27,8 +27,8 @@
|
|||||||
"axios": "^0.21.4",
|
"axios": "^0.21.4",
|
||||||
"bootstrap": "^4.6.0",
|
"bootstrap": "^4.6.0",
|
||||||
"bootstrap5": "npm:bootstrap@^5.1.1",
|
"bootstrap5": "npm:bootstrap@^5.1.1",
|
||||||
"core-js": "^3.17.2",
|
"core-js": "^3.17.3",
|
||||||
"date-fns": "^2.23.0",
|
"date-fns": "^2.24.0",
|
||||||
"downloadjs": "^1.4.7",
|
"downloadjs": "^1.4.7",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"js-sha512": "^0.8.0",
|
"js-sha512": "^0.8.0",
|
||||||
@@ -45,39 +45,37 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.15.4",
|
"@babel/cli": "^7.15.4",
|
||||||
"@babel/core": "^7.15.5",
|
"@babel/core": "^7.15.5",
|
||||||
"@babel/preset-env": "^7.15.4",
|
"@babel/preset-env": "^7.15.6",
|
||||||
"@babel/preset-typescript": "^7.15.0",
|
"@babel/preset-typescript": "^7.15.0",
|
||||||
"@coreui/vue": "^4.0.0-beta.2",
|
"@coreui/vue": "^4.0.0-beta.2",
|
||||||
"@types/bootstrap": "^5.1.4",
|
"@types/bootstrap": "^5.1.4",
|
||||||
"@types/jquery": "^3.5.6",
|
"@types/jquery": "^3.5.6",
|
||||||
"@types/lodash": "^4.14.172",
|
"@types/lodash": "^4.14.173",
|
||||||
"@types/node": "^16.7.13",
|
"@types/node": "^16.9.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.31.0",
|
"@typescript-eslint/eslint-plugin": "^4.31.1",
|
||||||
"@typescript-eslint/parser": "^4.31.0",
|
"@typescript-eslint/parser": "^4.31.1",
|
||||||
"@vue/compiler-sfc": "^3.2.10",
|
"@vue/compiler-sfc": "^3.2.12",
|
||||||
"@vue/eslint-config-typescript": "^7.0.0",
|
"@vue/eslint-config-typescript": "^7.0.0",
|
||||||
"babel-loader": "^8.2.2",
|
|
||||||
"babel-plugin-lodash": "^3.3.4",
|
"babel-plugin-lodash": "^3.3.4",
|
||||||
"babel-preset-modern-browsers": "^15.0.2",
|
"babel-preset-modern-browsers": "^15.0.2",
|
||||||
"bootstrap-vue-3": "^0.0.3",
|
"bootstrap-vue-3": "^0.0.3",
|
||||||
"bootswatch": "^5.1.1",
|
"bootswatch": "^5.1.1",
|
||||||
"clean-terminal-webpack-plugin": "^3.0.0",
|
"clean-terminal-webpack-plugin": "^3.0.0",
|
||||||
"css-loader": "^6.2.0",
|
"css-loader": "^6.2.0",
|
||||||
"css-minimizer-webpack-plugin": "^3.0.2",
|
"esbuild-loader": "^2.15.1",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"mini-css-extract-plugin": "^2.2.2",
|
"mini-css-extract-plugin": "^2.3.0",
|
||||||
"pre-commit": "^1.2.2",
|
"pre-commit": "^1.2.2",
|
||||||
"sass": "^1.39.0",
|
"sass": "^1.41.1",
|
||||||
"sass-loader": "^12.1.0",
|
"sass-loader": "^12.1.0",
|
||||||
"style-loader": "^3.2.1",
|
"style-loader": "^3.2.1",
|
||||||
"ts-loader": "^9.2.5",
|
"typescript": "^4.4.3",
|
||||||
"typescript": "^4.4.2",
|
|
||||||
"url-loader": "^4.1.1",
|
"url-loader": "^4.1.1",
|
||||||
"vue-eslint-parser": "^7.11.0",
|
"vue-eslint-parser": "^7.11.0",
|
||||||
"vue-loader": "^16.5.0",
|
"vue-loader": "^16.5.0",
|
||||||
"vue-style-loader": "^4.1.3",
|
"vue-style-loader": "^4.1.3",
|
||||||
"webpack": "^5.52.0",
|
"webpack": "^5.53.0",
|
||||||
"webpack-bundle-analyzer": "^4.4.2",
|
"webpack-bundle-analyzer": "^4.4.2",
|
||||||
"webpack-cli": "^4.8.0"
|
"webpack-cli": "^4.8.0"
|
||||||
},
|
},
|
||||||
|
|||||||
+98
-57
@@ -1,17 +1,17 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { VueLoaderPlugin } = require('vue-loader');
|
const { VueLoaderPlugin } = require('vue-loader');
|
||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
||||||
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
|
|
||||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||||
const { resolve } = require('path');
|
const { resolve } = require('path');
|
||||||
const CleanTerminalPlugin = require('clean-terminal-webpack-plugin');
|
const CleanTerminalPlugin = require('clean-terminal-webpack-plugin');
|
||||||
const TerserPlugin = require('terser-webpack-plugin');
|
const { ESBuildMinifyPlugin } = require('esbuild-loader')
|
||||||
module.exports = (env, argv) => {
|
module.exports = (env, argv) => {
|
||||||
const target = env.target ?? 'hwe';
|
const target = env.target ?? 'hwe';
|
||||||
const mode = argv.mode ?? 'production';
|
const mode = argv.mode ?? 'production';
|
||||||
const tsDir = resolve(__dirname, `${target}/ts/`);
|
const tsDir = resolve(__dirname, `${target}/ts/`);
|
||||||
const build_exports = require(`${tsDir}/build_exports.json`);
|
const build_exports = require(`${tsDir}/build_exports.json`);
|
||||||
|
|
||||||
|
//TODO: esbuild에 browserslist 사용 가능하면 적용
|
||||||
|
|
||||||
//서버마다 ts 파일 구성이 다를 가능성이 높기 때문에 어떤 파일이 필요한지는 ts/build_exports.json을 확인한다.
|
//서버마다 ts 파일 구성이 다를 가능성이 높기 때문에 어떤 파일이 필요한지는 ts/build_exports.json을 확인한다.
|
||||||
const entryIngameVue = {};
|
const entryIngameVue = {};
|
||||||
@@ -58,14 +58,8 @@ module.exports = (env, argv) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimizer: [
|
minimizer: [
|
||||||
new CssMinimizerPlugin(),
|
new ESBuildMinifyPlugin({
|
||||||
new TerserPlugin({
|
css: true
|
||||||
terserOptions: {
|
|
||||||
format: {
|
|
||||||
comments: /@license/i,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
extractComments: true,
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
moduleIds: 'deterministic',
|
moduleIds: 'deterministic',
|
||||||
@@ -74,18 +68,27 @@ module.exports = (env, argv) => {
|
|||||||
rules: [
|
rules: [
|
||||||
//FROM `vue inspect` and some tweaks
|
//FROM `vue inspect` and some tweaks
|
||||||
{
|
{
|
||||||
test: /\.(ts|tsx)$/,
|
test: /\.ts$/,
|
||||||
//exclude: /(node_modules)/,
|
//exclude: /(node_modules)/,
|
||||||
use: [
|
use: [
|
||||||
'babel-loader',
|
|
||||||
{
|
{
|
||||||
loader: 'ts-loader',
|
loader: 'esbuild-loader',
|
||||||
options: {
|
options: {
|
||||||
transpileOnly: true,
|
loader: 'ts',
|
||||||
appendTsSuffixTo: [
|
target: 'es2019',
|
||||||
'\\.vue$'
|
}
|
||||||
],
|
}
|
||||||
happyPackMode: false
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.tsx$/,
|
||||||
|
//exclude: /(node_modules)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'tsx',
|
||||||
|
target: 'es2019',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -94,7 +97,13 @@ module.exports = (env, argv) => {
|
|||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
exclude: /(node_modules)/,
|
exclude: /(node_modules)/,
|
||||||
use: [
|
use: [
|
||||||
'babel-loader',
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'js',
|
||||||
|
target: 'es2019',
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -194,35 +203,51 @@ module.exports = (env, argv) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimizer: [
|
minimizer: [
|
||||||
new CssMinimizerPlugin(),
|
new ESBuildMinifyPlugin({
|
||||||
new TerserPlugin({
|
css: true
|
||||||
terserOptions: {
|
|
||||||
format: {
|
|
||||||
comments: /@license/i,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
extractComments: true,
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
moduleIds: 'deterministic',
|
moduleIds: 'deterministic',
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [{
|
rules: [{
|
||||||
test: /\.(ts|tsx)$/i,
|
test: /\.ts$/,
|
||||||
exclude: /(node_modules)/,
|
exclude: /(node_modules)/,
|
||||||
use: [{
|
use: [
|
||||||
loader: 'babel-loader',
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
options: {
|
options: {
|
||||||
presets: [
|
loader: 'ts',
|
||||||
['@babel/preset-env', {
|
target: 'es2019',
|
||||||
"useBuiltIns": "usage",
|
|
||||||
"corejs": 3,
|
|
||||||
"modules": false
|
|
||||||
}],
|
|
||||||
'@babel/preset-typescript'
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}, 'ts-loader']
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.tsx$/,
|
||||||
|
exclude: /(node_modules)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'tsx',
|
||||||
|
target: 'es2019',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /(node_modules)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'js',
|
||||||
|
target: 'es2019',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /.(s?[ac]ss)$/,
|
test: /.(s?[ac]ss)$/,
|
||||||
@@ -270,35 +295,51 @@ module.exports = (env, argv) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimizer: [
|
minimizer: [
|
||||||
new CssMinimizerPlugin(),
|
new ESBuildMinifyPlugin({
|
||||||
new TerserPlugin({
|
css: true
|
||||||
terserOptions: {
|
|
||||||
format: {
|
|
||||||
comments: /@license/i,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
extractComments: true,
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
moduleIds: 'deterministic',
|
moduleIds: 'deterministic',
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [{
|
rules: [{
|
||||||
test: /\.(ts|tsx)$/i,
|
test: /\.ts$/,
|
||||||
exclude: /(node_modules)/,
|
exclude: /(node_modules)/,
|
||||||
use: {
|
use: [
|
||||||
loader: 'babel-loader',
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
options: {
|
options: {
|
||||||
presets: [
|
loader: 'ts',
|
||||||
['@babel/preset-env', {
|
target: 'es2019',
|
||||||
"useBuiltIns": "usage",
|
}
|
||||||
"corejs": 3,
|
}
|
||||||
"modules": false
|
|
||||||
}],
|
|
||||||
'@babel/preset-typescript'
|
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.tsx$/,
|
||||||
|
exclude: /(node_modules)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'tsx',
|
||||||
|
target: 'es2019',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /(node_modules)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'esbuild-loader',
|
||||||
|
options: {
|
||||||
|
loader: 'js',
|
||||||
|
target: 'es2019',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}, {
|
}, {
|
||||||
test: /.(s?[ac]ss)$/,
|
test: /.(s?[ac]ss)$/,
|
||||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader']
|
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader']
|
||||||
|
|||||||
Reference in New Issue
Block a user