Compare commits

..
Author SHA1 Message Date
Hide_D 1a3ef20a35 fix: 다병종 밸런스 누락분 수정정 2025-02-08 13:54:01 +00:00
Hide_D fba966177d fix: 고급모드 연구턴 커맨드 창 넘치는 문제 2025-01-25 19:52:28 +00:00
Hide_D 62c72dfdbe fix: 척사 버그 수정 2025-01-24 15:26:56 +09:00
Hide_D 1ae1ff9b72 refac,fix: reqTech, reqRegions, reqCities 간이 호출 추가 2025-01-24 15:23:13 +09:00
Hide_D c1e12c2737 fix: 버그 수정 2025-01-24 15:19:23 +09:00
Hide_D de09a66d6f fix: 병종 연구 커맨드에서 금쌀 검새 안하는 문제 해결 2025-01-24 10:07:56 +09:00
Hide_D 3c2012da46 fix: 사령턴에서 불가능한 턴이 별도 강조가 없는 문제 수정 2025-01-23 17:32:36 +00:00
Hide_D d55be54320 fix: 연구커맨드 검사 조건 2025-01-23 17:27:20 +00:00
Hide_D dcbefa1a96 fix: 연구 커맨드에 금쌀 표기 없음 2025-01-23 17:20:10 +00:00
Hide_D be8f1fff96 fix: 버그 수정 2025-01-23 17:17:37 +00:00
Hide_D 6117dbdcc0 fix: 이벤트 다병종 화시병 위치 2025-01-23 17:14:35 +00:00
Hide_D 0a39ba1023 fix: NPC AI가 현재 병종 기술등급을 고려하지 않는 문제 수정
- 아직 사용하지 않는 징병 페이지 요구 기술 항목도 수정
2025-01-23 17:13:11 +00:00
Hide_D dae5f65baa fix: 특성초토화시에만 did_특성초토화 증가 2025-01-23 17:08:50 +00:00
Hide_D 080bb30103 fix: 버그수정2 2025-01-22 19:42:43 +00:00
Hide_D 9e647c7ce5 fix: 도시 규모조건 징병 불가 2025-01-22 19:41:20 +00:00
Hide_D 73606b0fb4 feat: 초토화시 내부 카운트 추가 2025-01-22 18:54:23 +00:00
Hide_D e62eb36cc2 feat: event 연구 커맨드 추가 2025-01-22 18:53:08 +00:00
Hide_D 6b81f744d4 feat: event용 연구 추가 2025-01-22 18:41:24 +00:00
Hide_D 1a9b3b78cb fix: 화륜차 조건 추가 2025-01-22 18:40:59 +00:00
Hide_D c3cbf956d0 fix: 병종 조건에서 같은 키가 여러개인 경우 대비 2025-01-22 18:40:49 +00:00
Hide_D 91188c555d fix: 커맨드의 aux값값 2025-01-22 18:16:37 +00:00
Hide_D 913028dd6c fix: 병종 특성관련 발생 버그 수정 2025-01-22 18:08:18 +00:00
Hide_D dfb3f6478d game(wip): 다병종 시나리오에 병종 지정 2025-01-22 17:56:17 +00:00
Hide_D 6afc6221d3 feat: 특정 등급 이상 도시 보유 조건 추가 2025-01-22 17:48:49 +00:00
Hide_D 7b5a02487e misc: ReqCitiesWithCityLevel 설명 보완 2025-01-22 17:36:17 +00:00
Hide_D 533b79762e game(wip): 다병종 깃수 준비 2025-01-22 17:29:58 +00:00
Hide_D 53b7dbfdd0 feat: 병종 징병 조건 추가
- 군주 및 수뇌
- 군주 및 수뇌 아님
- 도시의 규모 요구
- 특정 Nation Aux 값 요구
2025-01-22 17:17:30 +00:00
Hide_D fd14c5403b feat: NationAuxKey Enum 2025-01-22 16:57:23 +00:00
Hide_D dc476e73a1 feat: 병종 검사에서 $nation['aux']를 정식 입력 2025-01-22 16:54:27 +00:00
Hide_D e60150705e refac: Constraint의 generalObj destGeneralObj로 General 객체 입력 2025-01-22 16:53:39 +00:00
Hide_D 2869ba5c42 feat,refac: GameUnitConstraint 개념 추가
- GameUnitDetail의 요구 기술, 지역, 도시, 연도를 GameUnitConstraint로 통합
- GameUnitConstraint는 조건 검사, 설명 제공
- 병종 정의를 GameUnitConstraint 이용 재정의
- test 함수에 General 객체 요구,
- test 함수의 ownCities에 단순 도시 외 도시 정보 추가
- 변경된 값에 맞게 호출 함수 변경
2025-01-22 16:26:15 +00:00
37 changed files with 2017 additions and 61 deletions
@@ -15,7 +15,7 @@ class che_척사_오악진형도 extends \sammo\BaseItem{
public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.15, 0.85];
}
return [1, 1];
@@ -17,7 +17,7 @@ class event_전투특기_척사 extends \sammo\BaseItem{
public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8];
}
return [1, 1];
@@ -21,7 +21,7 @@ class che_event_척사 extends \sammo\BaseSpecial{
public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8];
}
return [1, 1];
+1 -1
View File
@@ -21,7 +21,7 @@ class che_척사 extends \sammo\BaseSpecial{
public function getWarPowerMultiplier(WarUnit $unit):array{
$opposeCrewType = $unit->getOppose()->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
if($opposeCrewType->reqCities() || $opposeCrewType->reqRegions()){
return [1.2, 0.8];
}
return [1, 1];
+14 -7
View File
@@ -5,6 +5,7 @@ use \sammo\{
Util, JosaUtil, DB,
General, GameConst,
ActionLogger,
Json,
LastTurn,
NotInheritedMethodException,
RandUtil
@@ -118,6 +119,7 @@ abstract class BaseCommand{
$nationID = $this->generalObj->getNationID();
if($nationID == 0){
$this->nation = $this->generalObj->getStaticNation();
$this->nation['aux'] = [];
return;
}
@@ -138,7 +140,8 @@ abstract class BaseCommand{
'gold'=>0,
'rice'=>2000,
'tech'=>0,
'gennum'=>1
'gennum'=>1,
'aux'=>'{}',
];
if($this->nation && $this->nation['nation'] === $nationID){
@@ -170,6 +173,10 @@ abstract class BaseCommand{
else{
$this->nation = $nation;
}
if(is_string($this->nation['aux'] ?? null)){
$this->nation['aux'] = Json::decode($this->nation['aux']);
}
}
protected function setDestGeneral(General $destGeneralObj){
@@ -312,12 +319,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux();
$constraintInput = [
'general'=>$this->generalObj->getRaw(),
'general'=>$this->generalObj,
'city'=>$this->city,
'nation'=>$this->nation,
'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null,
'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity,
'destNation'=>$this->destNation,
];
@@ -346,12 +353,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux();
$constraintInput = [
'general'=>$this->generalObj->getRaw(),
'general'=>$this->generalObj,
'city'=>$this->city,
'nation'=>$this->nation,
'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null,
'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity,
'destNation'=>$this->destNation,
];
@@ -384,12 +391,12 @@ abstract class BaseCommand{
$this->generalObj->unpackAux();
$constraintInput = [
'general'=>$this->generalObj->getRaw(),
'general'=>$this->generalObj,
'city'=>$this->city,
'nation'=>$this->nation,
'cmd_arg'=>$this->arg,
'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null,
'destGeneral'=>$this->destGeneralObj??null,
'destCity'=>$this->destCity,
'destNation'=>$this->destNation,
];
+1 -1
View File
@@ -183,7 +183,7 @@ class che_건국 extends Command\GeneralCommand
$general->addExperience($exp);
$general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? [];
$aux = $this->nation['aux'];
$aux['can_국기변경'] = 1;
$db->update('city', [
@@ -194,7 +194,7 @@ class che_무작위건국 extends Command\GeneralCommand
$general->addExperience($exp);
$general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? [];
$aux = $this->nation['aux'];
$aux['can_국기변경'] = 1;
$aux['can_무작위수도이전'] = 1;
+3 -3
View File
@@ -79,7 +79,7 @@ class che_징병 extends Command\GeneralCommand
protected function init()
{
$this->setCity();
$this->setNation(['tech']);
$this->setNation(['tech', 'aux']);
$this->minConditionConstraints = [
ConstraintHelper::NotBeNeutral(),
@@ -281,14 +281,14 @@ class che_징병 extends Command\GeneralCommand
$crewObj->id = $unit->id;
/** @var ?\sammo\GameUnitConstraints\ReqTech */
$reqTechObj = $unit->reqConstraints['reqTech'] ?? null;
$reqTechObj = $unit->reqConstraints['ReqTech'] ?? null;
$crewObj->reqTech = $reqTechObj ? $reqTechObj->reqTech : 0;
/** @var ?\sammo\GameUnitConstraint\ReqMinRelYear */
$reqMinRelYearObj = $unit->reqConstraints['reqMinRelYear'] ?? null;
$crewObj->reqYear = $reqMinRelYearObj ? $reqMinRelYearObj->reqMinRelYear : 0;
$crewObj->notAvailable = !$unit->isValid($general, $ownCities, $ownRegions, $relativeYear, $tech);
$crewObj->notAvailable = !$unit->isValid($general, $ownCities, $ownRegions, $relativeYear, $tech, $this->nation['aux']);
$crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]);
$crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]);
+1 -1
View File
@@ -180,7 +180,7 @@ class cr_건국 extends Command\GeneralCommand
$general->addExperience($exp);
$general->addDedication($ded);
$aux = Json::decode($this->nation['aux']) ?? [];
$aux = $this->nation['aux'];
$aux['can_국기변경'] = 1;
$db->update('city', [
@@ -122,7 +122,7 @@ class che_국기변경 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']);
$aux = $this->nation['aux'];
$aux["can_{$actionName}"] = 0;
$db->update('nation', [
@@ -140,7 +140,7 @@ class che_국호변경 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']);
$aux = $this->nation['aux'];
$aux["can_{$actionName}"] = 0;
$db->update('nation', [
@@ -119,7 +119,7 @@ class che_무작위수도이전 extends Command\NationCommand
$josaYi = JosaUtil::pick($generalName, '이');
$josaYiNation = JosaUtil::pick($nationName, '이');
$aux = Json::decode($this->nation['aux']);
$aux = $this->nation['aux'];
$aux["can_무작위수도이전"] -= 1;
$db->update('city', [
+9 -1
View File
@@ -13,12 +13,14 @@ use \sammo\{
Message,
CityConst,
CityInitialDetail,
Json,
StaticEventHandler
};
use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use sammo\Event\Action;
class che_초토화 extends Command\NationCommand{
@@ -52,7 +54,7 @@ class che_초토화 extends Command\NationCommand{
$env = $this->env;
$this->setCity();
$this->setNation(['surlimit', 'gold', 'rice', 'capital']);
$this->setNation(['surlimit', 'gold', 'rice', 'capital', 'aux']);
$this->minConditionConstraints=[
ConstraintHelper::OccupiedCity(),
@@ -157,6 +159,11 @@ class che_초토화 extends Command\NationCommand{
$josaYiNation = JosaUtil::pick($nationName, '이');
$amount = $this->calcReturnAmount($destCity);
$aux = $this->nation['aux'];
if($destCity['level'] >= 8){
$aux[NationAuxKey::did_특성초토화->value] = $aux[NationAuxKey::did_특성초토화->value] ?? 0 + 1;
}
$db->update('general', [
'experience'=>$db->sqleval('experience * 0.9')
@@ -184,6 +191,7 @@ class che_초토화 extends Command\NationCommand{
'gold' => $db->sqleval('gold + %i', $amount),
'rice' => $db->sqleval('rice + %i', $amount),
'surlimit' => $db->sqleval('surlimit + %i', $this->getPostReqTurn()),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
\sammo\refreshNationStaticInfo();
@@ -0,0 +1,108 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_극병연구 extends Command\NationCommand{
static protected $actionName = '극병 연구';
static protected $auxType = NationAuxKey::can_극병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_대검병연구 extends Command\NationCommand{
static protected $actionName = '대검병 연구';
static protected $auxType = NationAuxKey::can_대검병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_무희연구 extends Command\NationCommand{
static protected $actionName = '무희 연구';
static protected $auxType = NationAuxKey::can_무희사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_산저병연구 extends Command\NationCommand{
static protected $actionName = '산저병 연구';
static protected $auxType = NationAuxKey::can_산저병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_상병연구 extends Command\NationCommand{
static protected $actionName = '상병 연구';
static protected $auxType = NationAuxKey::can_상병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_원융노병연구 extends Command\NationCommand{
static protected $actionName = '원융노병 연구';
static protected $auxType = NationAuxKey::can_원융노병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_음귀병연구 extends Command\NationCommand{
static protected $actionName = '음귀병 연구';
static protected $auxType = NationAuxKey::can_음귀병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_화륜차연구 extends Command\NationCommand{
static protected $actionName = '화륜차 연구';
static protected $auxType = NationAuxKey::can_화륜차사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 23;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [100000, 100000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -0,0 +1,107 @@
<?php
namespace sammo\Command\Nation;
use \sammo\Command;
use sammo\Constraint\ConstraintHelper;
use sammo\DB;
use sammo\Enums\InheritanceKey;
use sammo\Enums\NationAuxKey;
use \sammo\Util;
use \sammo\JosaUtil;
use sammo\Json;
use sammo\LastTurn;
use sammo\StaticEventHandler;
use sammo\GameConst;
class event_화시병연구 extends Command\NationCommand{
static protected $actionName = '화시병 연구';
static protected $auxType = NationAuxKey::can_화시병사용;
protected function argTest():bool{
return true;
}
protected function init(){
$this->setCity();
$this->setNation(['gold','rice','aux']);
$this->fullConditionConstraints=[];
$name = static::$actionName;
[$reqGold, $reqRice] = $this->getCost();
$this->minConditionConstraints = [
ConstraintHelper::OccupiedCity(),
ConstraintHelper::BeChief(),
ConstraintHelper::ReqNationAuxValue(static::$auxType->value, 0, "<", 1, "{$name}가 이미 완료되었습니다."),
ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold),
ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice),
];
$this->fullConditionConstraints = $this->minConditionConstraints;
}
public function getCommandDetailTitle():string{
$name = $this->getName();
[$reqGold, $reqRice] = $this->getCost();
$reqTurn = $this->getPreReqTurn()+1;
$reqGoldD5 = number_format($reqGold / 10000);
$reqRiceD5 = number_format($reqRice / 10000);
return "{$name}/{$reqTurn}턴(금/쌀 {$reqGoldD5}만)";
}
public function getPreReqTurn():int{
return 11;
}
public function getPostReqTurn():int{
return 0;
}
public function getCost():array{
return [50000, 50000];
}
public function run(\Sammo\RandUtil $rng):bool{
if(!$this->hasFullConditionMet()){
throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도');
}
$db = DB::db();
$general = $this->generalObj;
$nationID = $general->getNationID();
$actionName = static::$actionName;
$aux = $this->nation['aux'];
$aux[static::$auxType->value] = 1;
[$reqGold, $reqRice] = $this->getCost();
$logger = $general->getLogger();
$general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1));
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$db->update('nation', [
'gold' => $db->sqleval('gold - %i', $reqGold),
'rice' => $db->sqleval('rice - %i', $reqRice),
'aux' => Json::encode($aux),
], 'nation=%i', $nationID);
$logger->pushGeneralActionLog("<M>{$actionName}</> 완료");
$logger->pushGeneralHistoryLog("<M>{$actionName}</> 완료");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <M>{$actionName}</> 완료");
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
StaticEventHandler::handleEvent($this->generalObj, $this->destGeneralObj, $this::class, $this->env, $this->arg ?? []);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db);
return true;
}
}
@@ -6,9 +6,10 @@ use \sammo\GameUnitConst;
use \sammo\DB;
use \sammo\KVStorage;
use \sammo\CityConst;
use sammo\Json;
class AvailableRecruitCrewType extends Constraint{
const REQ_VALUES = Constraint::REQ_NATION|Constraint::REQ_INT_ARG;
const REQ_VALUES = Constraint::REQ_GENERAL|Constraint::REQ_NATION|Constraint::REQ_INT_ARG;
public function checkInputValues(bool $throwExeception=true):bool{
if(!parent::checkInputValues($throwExeception) && !$throwExeception){
@@ -47,13 +48,22 @@ class AvailableRecruitCrewType extends Constraint{
$ownCities = [];
$ownRegions = [];
foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i', $nationID) as $ownCity){
$ownCities[$ownCity] = 1;
$ownRegions[CityConst::byId($ownCity)->region] = 1;
foreach($db->query('SELECT city, region, secu, level FROM city WHERE nation = %i', $nationID) as $ownCity){
$ownCityID = $ownCity['city'];
$ownCities[$ownCityID] = [
'secu'=>$ownCity['secu'],
'level'=>$ownCity['level'],
];
$ownRegions[CityConst::byId($ownCityID)->region] = 1;
}
$nationAux = $this->nation['aux'] ?? null;
if($nationAux === null){
$nationAux = Json::decode($db->queryFirstField('SELECT aux FROM nation WHERE id = %i', $nationID) ?? "{}");
}
$crewType = GameUnitConst::byID($this->arg);
if($crewType->isValid($ownCities, $ownRegions, $year - $startyear, $tech)){
if($crewType->isValid($this->generalObj, $ownCities, $ownRegions, $year - $startyear, $tech, $nationAux)){
return true;
}
+12 -4
View File
@@ -2,6 +2,8 @@
namespace sammo\Constraint;
use sammo\General;
abstract class Constraint
{
private function __construct()
@@ -24,6 +26,8 @@ abstract class Constraint
const REQ_VALUES = 0;
/** @var ?General */
protected $generalObj = null;
protected $general = null;
protected $city = null;
protected $nation = null;
@@ -33,6 +37,8 @@ abstract class Constraint
protected $cmd_arg = null;
/** @var ?General */
protected $destGeneralObj = null;
protected $destGeneral = null;
protected $destCity = null;
protected $destNation = null;
@@ -48,9 +54,10 @@ abstract class Constraint
return static::REQ_VALUES;
}
public function setGeneral(array $general)
public function setGeneral(General $general)
{
$this->general = $general;
$this->generalObj = $general;
$this->general = $general->getRaw();
$this->tested = false;
$this->reason = null;
}
@@ -85,9 +92,10 @@ abstract class Constraint
$this->reason = null;
}
public function setDestGeneral(array $general)
public function setDestGeneral(General $general)
{
$this->destGeneral = $general;
$this->destGeneralObj = $general;
$this->destGeneral = $general->getRaw();
$this->tested = false;
$this->reason = null;
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\Enums;
// Nation['aux'] 에서 지정될 수 있는 키
enum NationAuxKey: string
{
case can_국기변경 = 'can_국기변경';
case can_국호변경 = 'can_국호변경';
case did_특성초토화 = 'did_특성초토화';
// 이벤트
case can_무작위수도이전 = 'can_무작위수도이전';
case can_대검병사용 = 'can_대검병사용';
case can_극병사용 = 'can_극병사용';
case can_화시병사용 = 'can_화시병사용';
case can_원융노병사용 = 'can_원융노병사용';
case can_산저병사용 = 'can_산저병사용';
case can_상병사용 = 'can_상병사용';
case can_음귀병사용 = 'can_음귀병사용';
case can_무희사용 = 'can_무희사용';
case can_화륜차사용 = 'can_화륜차사용';
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqChief extends BaseGameUnitConstraint
{
public function __construct()
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if($general->getVar('officer_level') >= 5){
return true;
}
return false;
}
public function getInfo(): string
{
return "군주 및 수뇌부만 가능";
}
}
@@ -0,0 +1,51 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
use function sammo\getCityLevelList;
class ReqCitiesWithCityLevel extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(
public readonly int $reqCityLevel,
...$reqCities)
{
$dstReqCities = [];
if (count($reqCities) == 0) {
$this->reqCities = [];
return;
}
foreach ($reqCities as $city) {
$dstReqCities[CityConst::byName($city)->id] = $city;
}
$this->reqCities = $dstReqCities;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqCities as $cityID => $cityName) {
if (!key_exists($cityID, $ownCities)) {
continue;
}
if($ownCities[$cityID]['level'] >= $this->reqCityLevel) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$cityLevelText = getCityLevelList()[$this->reqCityLevel];
$cityNameText = implode(', ', $this->reqCities);
return "{$cityNameText} {$cityLevelText}성 소유시 가능";
}
}
@@ -0,0 +1,39 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use function sammo\getCityLevelList;
class ReqHighLevelCities extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(
public readonly int $reqCityLevel,
public readonly int $reqCityCount
) {}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
$cnt = 0;
foreach ($ownCities as $cityItem) {
if ($cityItem['level'] >= $this->reqCityLevel) {
$cnt++;
}
}
if($cnt >= $this->reqCityCount) {
return true;
}
return false;
}
public function getInfo(): string
{
$cityLevelText = getCityLevelList()[$this->reqCityLevel];
return "{$cityLevelText}{$this->reqCityCount}개 이상 소유시 가능";
}
}
@@ -0,0 +1,122 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\Enums\NationAuxKey;
use sammo\General;
class ReqNationAux extends BaseGameUnitConstraint
{
const AVAILABLE_CMP = [
'==' => true,
'!=' => true,
'<' => true,
'>' => true,
'<=' => true,
'>=' => true,
];
public function __construct(
public readonly NationAuxKey $reqNationAuxKey,
public readonly string $cmp,
public readonly int|float $value
) {
if (!array_key_exists($cmp, self::AVAILABLE_CMP)) {
throw new \InvalidArgumentException('올바르지 않은 비교연산자입니다');
}
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
$lhs = $nationAux[$this->reqNationAuxKey->value] ?? 0;
$rhs = $this->value;
$value = false;
switch ($this->cmp) {
case '==':
$value = ($lhs == $rhs);
break;
case '!=':
$value = ($lhs != $rhs);
break;
case '<=':
$value = ($lhs <= $rhs);
break;
case '>=':
$value = ($lhs >= $rhs);
break;
case '<':
$value = ($lhs < $rhs);
break;
case '>':
$value = ($lhs > $rhs);
break;
}
return $value;
}
public function getInfo(): string
{
//Enum별 특수한 경우
switch ($this->reqNationAuxKey) {
case NationAuxKey::can_대검병사용:
if ($this->cmp == "==" && $this->value == 1) return "대검병 연구 시 가능";
break;
case NationAuxKey::can_극병사용:
if ($this->cmp == "==" && $this->value == 1) return "극병 연구 시 가능";
break;
case NationAuxKey::can_화시병사용:
if ($this->cmp == "==" && $this->value == 1) return "화시병 연구 시 가능";
break;
case NationAuxKey::can_원융노병사용:
if ($this->cmp == "==" && $this->value == 1) return "원융노병 연구 시 가능";
break;
case NationAuxKey::can_산저병사용:
if ($this->cmp == "==" && $this->value == 1) return "산저병 연구 시 가능";
break;
case NationAuxKey::can_상병사용:
if ($this->cmp == "==" && $this->value == 1) return "상병 연구 시 가능";
break;
case NationAuxKey::can_음귀병사용:
if ($this->cmp == "==" && $this->value == 1) return "음귀병 연구 시 가능";
break;
case NationAuxKey::can_무희사용:
if ($this->cmp == "==" && $this->value == 1) return "무희 연구 시 가능";
break;
case NationAuxKey::can_화륜차사용:
if ($this->cmp == "==" && $this->value == 1) return "화륜차 연구 시 가능";
break;
case NationAuxKey::did_특성초토화:
if ($this->cmp == ">=" && $this->value == 1) return "특성 초토화 시 가능";
break;
}
//범용
switch ($this->cmp) {
case '==': {
if ($this->value == 0) {
return "{$this->reqNationAuxKey->value} 없을 때";
}
if ($this->value == 1) {
return "{$this->reqNationAuxKey->value} 있을 때";
}
return "{$this->reqNationAuxKey->value} = {$this->value} 일 때";
};
case '!=': {
if ($this->value == 0) {
return "{$this->reqNationAuxKey->value} 없을 때";
}
if ($this->value == 1) {
return "{$this->reqNationAuxKey->value} 있을 때";
}
return "{$this->reqNationAuxKey->value} != {$this->value} 일 때";
};
default:
return "{$this->reqNationAuxKey->value} {$this->cmp} {$this->value} 일 때";
}
}
}
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqNotChief extends BaseGameUnitConstraint
{
public function __construct()
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if($general->getVar('officer_level') < 5){
return true;
}
return false;
}
public function getInfo(): string
{
return "군주 및 수뇌부는 불가";
}
}
+34 -2
View File
@@ -59,7 +59,12 @@ class GameUnitDetail implements iAction
$this->reqConstraints = [];
foreach($reqConstraints as $constraint){
$className = Util::getClassNameFromObj($constraint);
$this->reqConstraints[$className] = $constraint;
if(!key_exists($className, $this->reqConstraints)){
$this->reqConstraints[$className] = $constraint;
}
else{
$this->reqConstraints[] = $constraint;
}
}
$this->attackCoef = $attackCoef;
$this->defenceCoef = $defenceCoef;
@@ -75,6 +80,33 @@ class GameUnitDetail implements iAction
}
}
public function reqTech(): int {
$reqTechObj = $this->reqConstraints['ReqTech'] ?? null;
if($reqTechObj === null){
return 0;
}
return $reqTechObj->reqTech;
}
public function reqRegions(): ?array {
$reqRegionsObj = $this->reqConstraints['ReqRegions'] ?? null;
if($reqRegionsObj === null){
return null;
}
return $reqRegionsObj->reqRegions;
}
public function reqCities(): ?array {
$reqCitiesObj = $this->reqConstraints['ReqCities'] ?? null;
if($reqCitiesObj === null){
return null;
}
return $reqCitiesObj->reqCities;
}
public function getInfo(): string
{
return join("\n<br>", $this->info);
@@ -189,7 +221,7 @@ class GameUnitDetail implements iAction
return $defaultWar;
}
public function isValid(General $general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux = [])
public function isValid(General $general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux)
{
//음수 없음
$relativeYear = max(0, $relativeYear);
+4 -4
View File
@@ -2570,7 +2570,7 @@ class GeneralAI
$types = [];
foreach (GameUnitConst::byType($armType) as $crewtype) {
if ($crewtype->isValid($general, $cities, $regions, $relYear, $tech)) {
if ($crewtype->isValid($general, $cities, $regions, $relYear, $tech, $this->nation['aux'])) {
$score = $crewtype->pickScore($tech);
$types[$crewtype->id] = $score;
}
@@ -2584,10 +2584,10 @@ class GeneralAI
if ($this->generalPolicy->can고급병종) {
$currCrewType = $general->getCrewTypeObj();
if ($currCrewType->isValid($general, $cities, $regions, $relYear, $tech)) {
$reqTechObj = $currCrewType->reqConstraints['reqTech'] ?? null;
if ($currCrewType->isValid($general, $cities, $regions, $relYear, $tech, $this->nation['aux'])) {
$reqTechObj = $currCrewType->reqConstraints['ReqTech'] ?? null;
if($reqTechObj){
$reqTech = $reqTechObj->getValue($tech);
$reqTech = $reqTechObj->reqTech;
if ($reqTech >= 2000) {
$type = $currCrewType->id;
} else if ($currCrewType->armType != $armType && $reqTech >= 1000) {
+182
View File
@@ -0,0 +1,182 @@
{
"title":"【공백지】 다병종",
"startYear":180,
"map":{
"mapName":"miniche",
"unitSet":"event_more_crewtype"
},
"history":[
],
"const": {
"joinRuinedNPCProp":0,
"npcBanMessageProb":1,
"availableSpecialWar":[
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
"che_보병", "che_궁병", "che_기병", "che_공성",
"che_돌격", "che_무쌍", "che_위압",
"che_저격", "che_필살", "che_징병", "che_의술", "che_격노", "che_척사"
],
"availableChiefCommand":{
"휴식" : [
"휴식"
],
"인사" : [
"che_발령",
"che_포상",
"che_몰수",
"che_부대탈퇴지시"
],
"외교" : [
"che_물자원조",
"che_불가침제의",
"che_선전포고",
"che_종전제의",
"che_불가침파기제의"
],
"특수" : [
"che_초토화",
"che_천도",
"che_증축",
"che_감축"
],
"전략" : [
"che_필사즉생",
"che_백성동원",
"che_수몰",
"che_허보",
"che_의병모집",
"che_이호경식",
"che_급습",
"che_피장파장"
],
"기타" : [
"che_국기변경",
"che_국호변경"
],
"연구": [
"event_대검병연구",
"event_극병연구",
"event_화시병연구",
"event_원융노병연구",
"event_산저병연구",
"event_음귀병연구",
"event_무희연구",
"event_상병연구",
"event_화륜차연구"
]
},
"allItems":{
"horse":{
"che_명마_01_노기":0, "che_명마_02_조랑":0, "che_명마_03_노새":0,
"che_명마_04_나귀":0, "che_명마_05_갈색마":0, "che_명마_06_흑색마":0,
"che_명마_07_백마" : 2, "che_명마_07_기주마" : 2, "che_명마_07_오환마" : 2, "che_명마_07_백상" : 2,
"che_명마_08_양주마" : 2, "che_명마_08_흉노마" : 2, "che_명마_09_과하마" : 2, "che_명마_09_의남백마" : 2,
"che_명마_10_대완마" : 2, "che_명마_10_옥추마" : 2, "che_명마_11_서량마" : 2, "che_명마_11_화종마" : 2,
"che_명마_12_사륜거" : 2, "che_명마_12_옥란백용구": 2, "che_명마_13_절영" : 2, "che_명마_13_적로" : 2,
"che_명마_14_적란마" : 2, "che_명마_14_조황비전" : 2, "che_명마_15_한혈마" : 2, "che_명마_15_적토마" : 2
},
"weapon":{
"che_무기_01_단도":0, "che_무기_02_단궁":0, "che_무기_03_단극":0,
"che_무기_04_목검":0, "che_무기_05_죽창":0, "che_무기_06_소부":0,
"che_무기_07_동추":2, "che_무기_07_철편":2, "che_무기_07_철쇄":2, "che_무기_07_맥궁":2,
"che_무기_08_유성추":2, "che_무기_08_철질여골":2, "che_무기_09_쌍철극":2, "che_무기_09_동호비궁":2,
"che_무기_10_삼첨도":2, "che_무기_10_대부":2, "che_무기_11_고정도":2, "che_무기_11_이광궁":2,
"che_무기_12_철척사모":2, "che_무기_12_칠성검":2, "che_무기_13_사모":2, "che_무기_13_양유기궁":2,
"che_무기_14_언월도":2, "che_무기_14_방천화극":2, "che_무기_15_청홍검":2, "che_무기_15_의천검":2
},
"book":{
"che_서적_01_효경전":0, "che_서적_02_회남자":0, "che_서적_03_변도론":0,
"che_서적_04_건상역주":0, "che_서적_05_여씨춘추":0, "che_서적_06_사민월령":0,
"che_서적_07_위료자":2, "che_서적_07_사마법":2, "che_서적_07_한서":2, "che_서적_07_논어":2,
"che_서적_08_전론":2, "che_서적_08_사기":2, "che_서적_09_장자":2, "che_서적_09_역경":2,
"che_서적_10_시경":2, "che_서적_10_구국론":2, "che_서적_11_상군서":2, "che_서적_11_춘추전":2,
"che_서적_12_산해경":2, "che_서적_12_맹덕신서":2, "che_서적_13_관자":2, "che_서적_13_병법24편":2,
"che_서적_14_한비자":2, "che_서적_14_오자병법":2, "che_서적_15_노자":2, "che_서적_15_손자병법":2
},
"item":{
"che_치료_환약":0, "che_저격_수극":0, "che_사기_탁주":0,
"che_훈련_청주":0, "che_계략_이추":0, "che_계략_향낭":0,
"event_전투특기_격노":0, "event_전투특기_공성":0, "event_전투특기_궁병":0,
"event_전투특기_귀병":0, "event_전투특기_기병":0, "event_전투특기_돌격":0, "event_전투특기_무쌍":0,
"event_전투특기_반계":0, "event_전투특기_보병":0, "event_전투특기_신산":0, "event_전투특기_신중":0,
"event_전투특기_위압":0, "event_전투특기_의술":0, "event_전투특기_저격":0, "event_전투특기_집중":0,
"event_전투특기_징병":0, "event_전투특기_척사":0, "event_전투특기_필살":0, "event_전투특기_환술":0
}
}
},
"events":[
[
"month", 1000,
["or", ["Date", "==", null, 12], ["Date", "==", null, 6]],
["CreateManyNPC", 10, 10],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 1],
["ChangeCity", "occupied", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 7],
["ChangeCity", "occupied", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 1],
["ChangeCity", "occupied", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 7],
["ChangeCity", "occupied", {
"trade":100
}],
["DeleteEvent"]
],
[
"destroy_nation", 1000,
["and",
["Date", ">=", 183, 1],
["RemainNation", "==", 1]
],
["BlockScoutAction"],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 1],
["RaiseNPCNation"],
["DeleteEvent"]
],
[
"month", 999,
["Date", "==", 181, 1],
["OpenNationBetting", 4, 5000],
["OpenNationBetting", 1, 2000],
["DeleteEvent"]
],
[
"month", 999,
["and",
["Date", ">=", 183, 1],
["RemainNation", "<=", 8]
],
["OpenNationBetting", 1, 1000],
["DeleteEvent"]
]
]
}
+451
View File
@@ -0,0 +1,451 @@
<?php
namespace sammo;
use sammo\Enums\NationAuxKey;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqChief;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqCitiesWithCityLevel;
use sammo\GameUnitConstraint\ReqHighLevelCities;
use sammo\GameUnitConstraint\ReqMinRelYear;
use sammo\GameUnitConstraint\ReqNotChief;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqTech;
use sammo\GameUnitConstraint\ReqNationAux;
class GameUnitConst extends GameUnitConstBase
{
protected static function getBuildData(): array {
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], // 성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11,
[new ReqTech(1000), new ReqRegions('중원')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10,
[new ReqTech(1000), new ReqRegions('오월')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10,
[new ReqTech(2000), new ReqCities('저')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10,
[new ReqTech(1000), new ReqRegions('남중')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
91100, self::T_FOOTMAN, '대검병',
150, 225, 7, 10, 0, 13, 13,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '완'), new ReqNationAux(NationAuxKey::can_대검병사용, '==', 1)],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['대형 검을 사용합니다.'],
null, ['che_방어력증가5p'], null
],
[
91101, self::T_FOOTMAN, '강습병',
175, 200, 7, 10, 0, 13, 13,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '북평')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['철퇴를 사용합니다.'],
null, ['che_방어력증가5p'], null
],
[
91102, self::T_FOOTMAN, '극병',
250, 150, 7, 0, 0, 18, 18,
[new ReqTech(5000), new ReqCitiesWithCityLevel(8, '저'), new ReqNationAux(NationAuxKey::can_극병사용, '==', 1)],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['긴 극을 사용합니다.'],
null, ['che_방어력증가5p'], null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
[],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12,
[new ReqTech(1000), new ReqRegions('동이')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11,
[new ReqTech(1000), new ReqRegions('서촉')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('양양')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('건업')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
91200, self::T_ARCHER, '화랑',
150, 150, 8, 25, 0, 14, 14,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '위례')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['궁술 실력이 뛰어납니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
91201, self::T_ARCHER, '화시병',
225, 100, 7, 10, 0, 14, 14,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '장사'), new ReqNationAux(NationAuxKey::can_화시병사용, '==', 1)],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['불이 붙은 화살을 날립니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
91202, self::T_ARCHER, '원융노병',
250, 100, 7, 10, 0, 20, 19,
[new ReqTech(5000), new ReqCitiesWithCityLevel(8, '흉노'), new ReqNationAux(NationAuxKey::can_원융노병사용, '==', 1)],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['먼 거리에서 적을 제압합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
[],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13,
[new ReqTech(1000), new ReqRegions('하북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12,
[new ReqTech(1000), new ReqRegions('서북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11,
[new ReqTech(2000), new ReqCities('흉노')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
100, 250, 7, 5, 0, 11, 13,
[new ReqTech(2000), new ReqCities('강')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12,
[new ReqTech(2000), new ReqCities('산월')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
[new ReqTech(2000), new ReqCities('남만')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
[new ReqTech(3000), new ReqCities('허창')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
91300, self::T_CAVALRY, '양마기병',
200, 175, 7, 5, 0, 15, 15,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '한중')],
[self::T_FOOTMAN=>1.1, self::T_ARCHER=>0.9, self::T_SIEGE=>1.1],
[self::T_FOOTMAN=>0.9, self::T_ARCHER=>1.1, self::T_SIEGE=>0.9],
['험준한 지형에서 뛰어납니다.', '불리한 싸움도 버텨냅니다.'],
null, ['che_기병병종전투'], null
],
[
91301, self::T_CAVALRY, '산저병',
225, 150, 7, 5, 0, 15, 15,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '수춘'), new ReqNationAux(NationAuxKey::can_산저병사용, '==', 1)],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['무식할 정도로 전장을 누빕니다.'],
null, ['che_기병병종전투'], null
],
[
91302, self::T_CAVALRY, '상병',
225, 250, 5, 0, 0, 24, 24,
[new ReqTech(5000), new ReqCitiesWithCityLevel(8, '남만'), new ReqNationAux(NationAuxKey::can_상병사용, '==', 1)],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['거대한 코끼리와 함께합니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('초')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11,
[new ReqTech(2000), new ReqCities('오환')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9,
[new ReqTech(2000), new ReqCities('왜')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
[new ReqTech(3000), new ReqCities('장안')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
[new ReqTech(1000)],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11,
[new ReqTech(3000), new ReqCities('업')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null, null
],
[
91400, self::T_WIZARD, '음귀병',
110, 110, 7, 15, 0.7, 13, 11,
[new ReqTech(4000), new ReqCitiesWithCityLevel(8, '강릉'), new ReqNationAux(NationAuxKey::can_음귀병사용, '==', 1)],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['악기를 연주하여 적을 혼란시킵니다.'],
null, null, null
],
[
91401, self::T_WIZARD, '향귀병',
100, 120, 8, 5, 0.6, 12, 12,
[new ReqTech(4000), new ReqHighLevelCities(8, 4), new ReqNotChief()],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['독특한 향을 피웁니다.'],
null, null, null
],
[
91402, self::T_WIZARD, '무희',
180, 80, 7, 10, 0.6, 18, 17,
[new ReqTech(5000), new ReqCitiesWithCityLevel(8, '왜'), new ReqNationAux(NationAuxKey::can_무희사용, '==', 1)],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['검무를 추는 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
[new ReqMinRelYear(3)],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112, 91300=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067, 91300=>1.112],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4, 1106=>1.112, 91300=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067, 91300=>1.067],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
[new ReqTech(3000), new ReqCities('업')],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112, 91300=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067, 91300=>1.112],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
],
[
91500, self::T_SIEGE, '화륜차',
300, 0, 5, 0, 0, 40, 5,
[new ReqTech(5000), new ReqNationAux(NationAuxKey::did_특성초토화, '>=', 1), new ReqChief(), new ReqNationAux(NationAuxKey::can_화륜차사용, '==', 1)],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.25, 1106=>1.112, 91300=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067, 91300=>1.067],
['불타는 바퀴로 적진을 붕괴시킵니다.'],
['che_성벽부상무효'], null, null
]
];
}
}
-23
View File
@@ -31,29 +31,6 @@
font-size: 0;
}
.compensatePositive {
color: $cyan;
display: inline-block;
width: 1rem;
}
.compensateNegative {
color: $red;
display: inline-block;
width: 1rem;
}
.compensateNeutral{
display: inline-block;
width: 1rem;
}
.commandImpossible {
color: $red;
text-decoration: line-through $red;
}
.t_date {
font-size: 0.75em;
}
+28 -1
View File
@@ -205,7 +205,10 @@ defineExpose({
});
</script>
<style scoped>
<style scoped lang="scss">
@import "@scss/common/variables.scss";
@import "@scss/common/bootswatch_custom_variables.scss";
.commandItem {
border: gray 1px solid;
border-radius: 0.5em;
@@ -219,4 +222,28 @@ defineExpose({
justify-content: center;
}
.compensatePositive {
color: $cyan;
display: inline-block;
width: 1rem;
}
.compensateNegative {
color: $red;
display: inline-block;
width: 1rem;
}
.compensateNeutral{
display: inline-block;
width: 1rem;
}
.commandImpossible {
color: $red;
text-decoration: line-through $red;
}
</style>
+1 -1
View File
@@ -40,7 +40,7 @@ if($userInfo['delete_after']){
]);
}
$penaltyList = JSON::decode($userInfo['penalty']??'{}');
$penaltyList = Json::decode($userInfo['penalty']??'{}');
foreach($penaltyList as $penaltyKey=>$penaltyValue){
if($penaltyValue['expire'] ?? 0 > TimeUtil::now()){
Json::die([