feat: 유저장의 수뇌 임명 불가 penalty

This commit is contained in:
2024-06-08 15:55:26 +00:00
parent fba5fbdb6b
commit 552d73430c
2 changed files with 111 additions and 98 deletions
+110 -98
View File
@@ -1,6 +1,8 @@
<?php
namespace sammo;
use sammo\Enums\GeneralColumn;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\Enums\GeneralQueryMode;
use sammo\Enums\MessageType;
@@ -22,92 +24,95 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['startyear','year','month','scenario']);
$gameStor->cacheValues(['startyear', 'year', 'month', 'scenario']);
$me = $db->queryFirstRow('SELECT no,nation,officer_level from general where owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,penalty from general where owner=%i', $userID);
$myOfficerLevel = $me['officer_level'];
$nationID = $me['nation'];
$myPenalty = Json::decode($me['penalty'] ?? '{}');
//수뇌가 아니면 아무것도 할 수 없음
if($myOfficerLevel < 5){
if ($myOfficerLevel < 5) {
Json::die([
'result'=>false,
'reason'=>'수뇌가 아닙니다.'
'result' => false,
'reason' => '수뇌가 아닙니다.'
]);
}
if($action === '추방' && $destGeneralID==0){
if ($action === '추방' && $destGeneralID == 0) {
Json::die([
'result'=>false,
'reason'=>'장수가 지정되지 않았습니다.'
'result' => false,
'reason' => '장수가 지정되지 않았습니다.'
]);
}
if($destGeneralID==0){
if ($destGeneralID == 0) {
$general = new DummyGeneral(true);
$general->setVar('nation', $nationID);
}
else{
} else {
$general = General::createObjFromDB($destGeneralID);
if($general instanceof DummyGeneral){
if ($general instanceof DummyGeneral) {
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 장수입니다.'
'result' => false,
'reason' => '올바르지 않은 장수입니다.'
]);
}
if($nationID != $general->getNationID()){
if ($nationID != $general->getNationID()) {
Json::die([
'result'=>false,
'reason'=>'아국 장수가 아닙니다'
'result' => false,
'reason' => '아국 장수가 아닙니다'
]);
}
}
if($officerLevel == 12){
if ($officerLevel == 12) {
Json::die([
'result'=>false,
'reason'=>'군주를 대상으로 할 수 없습니다.'
'result' => false,
'reason' => '군주를 대상으로 할 수 없습니다.'
]);
}
function do수뇌임명(General $general, int $targetOfficerLevel):?string{
function do수뇌임명(General $general, int $targetOfficerLevel): ?string
{
global $myPenalty;
if ($myPenalty[PenaltyKey::NoChiefChange->value] ?? false) {
return '수뇌를 임명할 수 없는 상태입니다.';
}
$generalID = $general->getID();
$nationID = $general->getNationID();
$db = DB::db();
[$chiefSet, $nationLevel] = $db->queryFirstList('SELECT chief_set,level FROM nation WHERE nation = %i',$nationID);
[$chiefSet, $nationLevel] = $db->queryFirstList('SELECT chief_set,level FROM nation WHERE nation = %i', $nationID);
// 임명가능 레벨
// 임명가능 레벨
$lv = getNationChiefLevel($nationLevel);
if($targetOfficerLevel < $lv){
if ($targetOfficerLevel < $lv) {
return '임명불가능한 관직입니다.';
}
if(isOfficerSet($chiefSet, $targetOfficerLevel)){
if (isOfficerSet($chiefSet, $targetOfficerLevel)) {
return '지금은 임명할 수 없습니다.';
}
//기존 장수 일반으로
$db->update('general', [
'officer_level'=>1,
'officer_city'=>0,
'officer_level' => 1,
'officer_city' => 0,
], 'nation=%i AND officer_level=%i AND no!=%i', $nationID, $targetOfficerLevel, $generalID);
if($targetOfficerLevel === 11){
}
else if($targetOfficerLevel % 2 == 0){
if($general->getVar('strength') < GameConst::$chiefStatMin){
if ($targetOfficerLevel === 11) {
} else if ($targetOfficerLevel % 2 == 0) {
if ($general->getVar('strength') < GameConst::$chiefStatMin) {
return '무력이 부족합니다.';
}
}
else{
if($general->getVar('intel') < GameConst::$chiefStatMin){
} else {
if ($general->getVar('intel') < GameConst::$chiefStatMin) {
return '지력이 부족합니다.';
}
}
@@ -116,52 +121,59 @@ function do수뇌임명(General $general, int $targetOfficerLevel):?string{
$general->setVar('officer_level', $targetOfficerLevel);
$general->setVar('officer_city', 0);
$db->update('nation', [
'chief_set'=> $db->sqleval('chief_set | %i', doOfficerSet(0, $targetOfficerLevel)),
'chief_set' => $db->sqleval('chief_set | %i', doOfficerSet(0, $targetOfficerLevel)),
], 'nation=%i', $nationID);
$general->applyDB($db);
return null;
}
function do도시임명(General $general, int $cityID, int $targetOfficerLevel):?string{
function do도시임명(General $general, int $cityID, int $targetOfficerLevel): ?string
{
global $myPenalty;
$nationID = $general->getNationID();
$db = DB::db();
if(CityConst::byID($cityID) === null){
if (CityConst::byID($cityID) === null) {
return '올바르지 않은 도시입니다';
}
if ($general->getVar(GeneralColumn::officer_level) >= 4 && $myPenalty[PenaltyKey::NoChiefChange->value] ?? false) {
return '수뇌인 장수를 변경할 수 없는 상태입니다.';
}
$officerSet = $db->queryFirstField('SELECT officer_set FROM city WHERE nation=%i AND city=%i', $nationID, $cityID);
if($officerSet === null){
if ($officerSet === null) {
return '아국 도시가 아닙니다';
}
if(isOfficerSet($officerSet, $targetOfficerLevel)){
if (isOfficerSet($officerSet, $targetOfficerLevel)) {
return '이미 다른 장수가 임명되어있습니다';
}
//기존 장수 일반으로
$db->update('general', [
'officer_level'=>1,
'officer_city'=>0,
'officer_level' => 1,
'officer_city' => 0,
], 'officer_level=%i AND officer_city=%i AND no!=%i', $targetOfficerLevel, $cityID, $general->getID());
if($general instanceof DummyGeneral){
if ($general instanceof DummyGeneral) {
return null;
}
if($targetOfficerLevel === 4 && $general->getVar('strength') < GameConst::$chiefStatMin){
if ($targetOfficerLevel === 4 && $general->getVar('strength') < GameConst::$chiefStatMin) {
return '무력이 부족합니다.';
}
if($targetOfficerLevel === 3 && $general->getVar('intel') < GameConst::$chiefStatMin){
if ($targetOfficerLevel === 3 && $general->getVar('intel') < GameConst::$chiefStatMin) {
return '지력이 부족합니다.';
}
//신임 장수
$db->update('city', [
'officer_set'=>$db->sqleval('officer_set | %i', doOfficerSet(0, $targetOfficerLevel)),
'officer_set' => $db->sqleval('officer_set | %i', doOfficerSet(0, $targetOfficerLevel)),
], 'city=%i AND nation=%i', $cityID, $nationID);
$general->setVar('officer_level', $targetOfficerLevel);
$general->setVar('officer_city', $cityID);
@@ -170,24 +182,25 @@ function do도시임명(General $general, int $cityID, int $targetOfficerLevel):
return null;
}
function do추방(General $general, int $myOfficerLevel):?string{
function do추방(General $general, int $myOfficerLevel): ?string
{
$generalID = $general->getID();
$generalName = $general->getVar('name');
$nationID = $general->getNationID();
if($general->hasPenalty(PenaltyKey::NoBanGeneral)){
if ($myPenalty[PenaltyKey::NoBanGeneral->value] ?? false) {
return '추방할 수 없는 상태입니다.';
}
//추방할사람이 외교권자이면 불가
$permission = checkSecretPermission($general->getRaw());
if($permission == 4){
if ($permission == 4) {
return '외교권자는 추방할 수 없습니다.';
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getValues(['startyear','year','month','scenario']);
$env = $gameStor->getValues(['startyear', 'year', 'month', 'scenario']);
$nation = $db->queryFirstRow('SELECT name,chief_set,color FROM nation WHERE nation=%i', $nationID);
$nationName = $nation['name'];
@@ -195,17 +208,17 @@ function do추방(General $general, int $myOfficerLevel):?string{
$logger = $general->getLogger();
//이미 지정했다면 무시
if(isOfficerSet($nation['chief_set'], $myOfficerLevel) || ($myOfficerLevel == 0 && $myOfficerLevel == 12)) {
if (isOfficerSet($nation['chief_set'], $myOfficerLevel) || ($myOfficerLevel == 0 && $myOfficerLevel == 12)) {
return '이미 추방 권한을 사용했습니다.';
}
$gold = 0;
$rice = 0;
// 금쌀1000이상은 남김
if($general->getVar('gold') > GameConst::$defaultGold) {
if ($general->getVar('gold') > GameConst::$defaultGold) {
$gold = $general->getVar('gold') - GameConst::$defaultGold;
$general->setVar('gold', GameConst::$defaultGold);
}
if($general->getVar('rice') > GameConst::$defaultRice) {
if ($general->getVar('rice') > GameConst::$defaultRice) {
$rice = $general->getVar('rice') - GameConst::$defaultRice;
$general->setVar('rice', GameConst::$defaultRice);
}
@@ -223,27 +236,26 @@ function do추방(General $general, int $myOfficerLevel):?string{
$logger->pushGeneralActionLog("<D><b>{$nationName}</b></>에서 <R>추방</>당했습니다.", ActionLogger::PLAIN);
// 명성/공헌 N*10%감소
if($env['year'] <= $env['startyear'] && $general->getNPCType() < 2){
if ($env['year'] <= $env['startyear'] && $general->getNPCType() < 2) {
$general->setVar('makelimit', $oldMakeLimit);
}
else{
} else {
$betrayCnt = $general->getVar('betray');
$general->addExperience(-$general->getVar('experience')*0.15*$betrayCnt);
$general->addDedication(-$general->getVar('dedication')*0.15*$betrayCnt);
$general->addExperience(-$general->getVar('experience') * 0.15 * $betrayCnt);
$general->addDedication(-$general->getVar('dedication') * 0.15 * $betrayCnt);
$general->increaseVarWithLimit('betray', 1, null, GameConst::$maxBetrayCnt);
}
//부대장일 경우
if($general->getVar('troop') == $generalID){
if ($general->getVar('troop') == $generalID) {
// 모두 탈퇴
$db->update('general', [
'troop'=>0,
'troop' => 0,
], 'troop = %i', $generalID);
$db->delete('troop', 'troop_leader=%i', $generalID);
}
$general->setVar('troop', 0);
if($general->getNPCType() >= 2){
if ($general->getNPCType() >= 2) {
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'BanNPC',
@@ -282,24 +294,24 @@ function do추방(General $general, int $myOfficerLevel):?string{
}
}
if($env['year'] < $env['startyear']+3) {
if ($env['year'] < $env['startyear'] + 3) {
//초반엔 군주 부상 증가(엔장 임관지양)
$db->update('general', [
'injury'=>$db->sqleval('least(injury + 1, %i)', 80),
'injury' => $db->sqleval('least(injury + 1, %i)', 80),
], 'nation=%i AND officer_level=12', $nationID);
$db->update('nation', [
'gennum'=>$db->sqleval('gennum - %i', $general->getNPCType()!=5?1:0),
'gold'=>$db->sqleval('gold + %i', $gold),
'rice'=>$db->sqleval('rice + %i', $rice),
'gennum' => $db->sqleval('gennum - %i', $general->getNPCType() != 5 ? 1 : 0),
'gold' => $db->sqleval('gold + %i', $gold),
'rice' => $db->sqleval('rice + %i', $rice),
], 'nation = %i', $nationID);
} else {
//이번분기는 추방불가(초반 제외)
$db->update('nation', [
'chief_set'=>$db->sqleval('chief_set | %i', doOfficerSet(0, $myOfficerLevel)),
'gennum'=>$db->sqleval('gennum - %i', $general->getNPCType()!=5?1:0),
'gold'=>$db->sqleval('gold + %i', $gold),
'rice'=>$db->sqleval('rice + %i', $rice),
'chief_set' => $db->sqleval('chief_set | %i', doOfficerSet(0, $myOfficerLevel)),
'gennum' => $db->sqleval('gennum - %i', $general->getNPCType() != 5 ? 1 : 0),
'gold' => $db->sqleval('gold + %i', $gold),
'rice' => $db->sqleval('rice + %i', $rice),
], 'nation = %i', $nationID);
}
@@ -311,62 +323,62 @@ function do추방(General $general, int $myOfficerLevel):?string{
if($action == "임명") {
if(2 <= $officerLevel && $officerLevel <= 4){
if(!$destCityID){
if ($action == "임명") {
if (2 <= $officerLevel && $officerLevel <= 4) {
if (!$destCityID) {
Json::die([
'result'=>false,
'reason'=>'도시가 지정되지 않았습니다.'
'result' => false,
'reason' => '도시가 지정되지 않았습니다.'
]);
}
$result = do도시임명($general, $destCityID, $officerLevel);
if($result !== null){
if ($result !== null) {
Json::die([
'result'=>false,
'reason'=>$result
'result' => false,
'reason' => $result
]);
}
Json::die([
'result'=>true,
'reason'=>'success'
'result' => true,
'reason' => 'success'
]);
}
if(5 <= $officerLevel && $officerLevel < 12){
if (5 <= $officerLevel && $officerLevel < 12) {
$result = do수뇌임명($general, $officerLevel);
if($result !== null){
if ($result !== null) {
Json::die([
'result'=>false,
'reason'=>$result
'result' => false,
'reason' => $result
]);
}
Json::die([
'result'=>true,
'reason'=>'success'
'result' => true,
'reason' => 'success'
]);
}
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 지정입니다.'
'result' => false,
'reason' => '올바르지 않은 지정입니다.'
]);
}
if($action == "추방") {
if ($action == "추방") {
$result = do추방($general, $myOfficerLevel);
if($result !== null){
if ($result !== null) {
Json::die([
'result'=>false,
'reason'=>$result
'result' => false,
'reason' => $result
]);
}
Json::die([
'result'=>true,
'reason'=>'success'
'result' => true,
'reason' => 'success'
]);
}
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 명령입니다.'
]);
'result' => false,
'reason' => '올바르지 않은 명령입니다.'
]);
+1
View File
@@ -12,5 +12,6 @@ enum PenaltyKey: string{
case NoAmbassador = 'noAmbassador';
case NoBanGeneral = 'noBanGeneral';
case NoChiefTurnInput = 'noChiefTurnInput';
case NoChiefChange = 'noChiefChange';
}