feat: CrewType에 iAction 개념을 넣고 처리할 수 있도록

- GameUnitDetail에 iAction 리스트 추가
This commit is contained in:
2023-05-11 00:50:58 +09:00
parent 486ac65767
commit 8f5d9194f8
9 changed files with 370 additions and 284 deletions
@@ -0,0 +1,20 @@
<?php
namespace sammo\ActionCrewType;
use \sammo\iAction;
use \sammo\General;
class che_성벽선제 implements iAction{
use \sammo\DefaultAction;
protected $name = '성벽선제';
protected $info = '전투 가능한 성벽이라면 선제공격을 합니다.';
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
{
if($statName == 'cityBattleOrder'){
// battleOrder는 스탯과 유사한 수치를 가지므로, 아주 충분히 높은값을 설정한다.
return 10000;
}
return $value;
}
}
+37 -35
View File
@@ -41,7 +41,7 @@ class GameUnitConstBase{
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null
null, null, null
],
[
@@ -51,7 +51,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
@@ -60,7 +60,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
@@ -69,7 +69,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
@@ -78,7 +78,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
@@ -87,7 +87,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
@@ -96,7 +96,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
@@ -105,7 +105,7 @@ class GameUnitConstBase{
[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, ['che_방어력증가5p'], null
],
[
@@ -115,7 +115,7 @@ class GameUnitConstBase{
[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, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
@@ -124,7 +124,7 @@ class GameUnitConstBase{
[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, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
@@ -133,7 +133,7 @@ class GameUnitConstBase{
[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, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
@@ -142,7 +142,7 @@ class GameUnitConstBase{
[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, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
@@ -151,7 +151,7 @@ class GameUnitConstBase{
[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, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
@@ -161,7 +161,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
@@ -170,7 +170,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
@@ -179,7 +179,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
@@ -188,7 +188,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
@@ -197,7 +197,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
@@ -206,7 +206,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
@@ -215,7 +215,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
@@ -224,7 +224,7 @@ class GameUnitConstBase{
[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, ['che_기병병종전투'], null
],
[
@@ -234,7 +234,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
@@ -243,7 +243,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
@@ -252,7 +252,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
@@ -261,7 +261,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
@@ -270,7 +270,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
@@ -279,7 +279,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
@@ -288,7 +288,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
@@ -297,7 +297,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
@@ -306,7 +306,7 @@ class GameUnitConstBase{
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null
null, null, null
],
[
@@ -316,7 +316,7 @@ class GameUnitConstBase{
[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],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동']
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
@@ -325,7 +325,7 @@ class GameUnitConstBase{
[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],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
@@ -334,7 +334,7 @@ class GameUnitConstBase{
[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],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동']
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1503, self::T_SIEGE, '목우',
@@ -343,7 +343,7 @@ class GameUnitConstBase{
[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, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동']
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], ['che_성벽선제']
]
];
@@ -466,6 +466,7 @@ class GameUnitConstBase{
$info,
$initSkillTrigger,
$phaseSkillTrigger,
$iActionList,
] = $rawUnit;
if($reqYear > 0){
@@ -509,7 +510,8 @@ class GameUnitConstBase{
$defenceCoef,
$info,
$initSkillTrigger,
$phaseSkillTrigger
$phaseSkillTrigger,
$iActionList,
);
$constID[$id] = $unit;
+160 -66
View File
@@ -1,7 +1,9 @@
<?php
namespace sammo;
class GameUnitDetail implements iAction{
class GameUnitDetail implements iAction
{
use DefaultAction;
public $id;
@@ -23,6 +25,8 @@ class GameUnitDetail implements iAction{
public $info;
public $initSkillTrigger;
public $phaseSkillTrigger;
/** @var iAction[]|null iActionList */
public $iActionList;
public function __construct(
int $id,
@@ -43,8 +47,9 @@ class GameUnitDetail implements iAction{
array $defenceCoef,
array $info,
?array $initSkillTrigger,
?array $phaseSkillTrigger
){
?array $phaseSkillTrigger,
?array $iActionList,
) {
$this->id = $id;
$this->name = $name;
$this->armType = $armType;
@@ -64,78 +69,84 @@ class GameUnitDetail implements iAction{
$this->info = $info;
$this->initSkillTrigger = $initSkillTrigger;
$this->phaseSkillTrigger = $phaseSkillTrigger;
$this->iActionList = array_map('buildActionCrewTypeClass', $iActionList ?? []);
}
public function getInfo():string{
public function getInfo(): string
{
return join("\n<br>", $this->info);
}
public function getShortName():string{
public function getShortName(): string
{
return StringUtil::subStringForWidth($this->name, 0, 4);
}
public function riceWithTech(int $tech, int $crew=100):float{
public function riceWithTech(int $tech, int $crew = 100): float
{
return $this->rice * getTechCost($tech) * $crew / 100;
}
public function costWithTech(int $tech, int $crew=100):float{
public function costWithTech(int $tech, int $crew = 100): float
{
return $this->cost * getTechCost($tech) * $crew / 100;
}
public function getAttackCoef(GameUnitDetail $opposeCrewType):float{
public function getAttackCoef(GameUnitDetail $opposeCrewType): float
{
$opposeCrewTypeID = $opposeCrewType->id;
if(key_exists($opposeCrewTypeID, $this->attackCoef)){
if (key_exists($opposeCrewTypeID, $this->attackCoef)) {
return $this->attackCoef[$opposeCrewTypeID];
}
$opposeArmType = $opposeCrewType->armType;
return $this->attackCoef[$opposeArmType]??1;
return $this->attackCoef[$opposeArmType] ?? 1;
}
public function getDefenceCoef(GameUnitDetail $opposeCrewType):float{
public function getDefenceCoef(GameUnitDetail $opposeCrewType): float
{
$opposeCrewTypeID = $opposeCrewType->id;
if(key_exists($opposeCrewTypeID, $this->defenceCoef)){
if (key_exists($opposeCrewTypeID, $this->defenceCoef)) {
return $this->defenceCoef[$opposeCrewTypeID];
}
$opposeArmType = $opposeCrewType->armType;
return $this->defenceCoef[$opposeArmType]??1;
return $this->defenceCoef[$opposeArmType] ?? 1;
}
public function getComputedAttack(General $general, int $tech){
if($this->armType == GameUnitConst::T_WIZARD){
$ratio = $general->getIntel(true, true, true)*2 - 40;
}
else if($this->armType == GameUnitConst::T_SIEGE){
$ratio = $general->getLeadership(true, true, true)*2 - 40;
}
else if($this->armType == GameUnitConst::T_MISC){
public function getComputedAttack(General $general, int $tech)
{
if ($this->armType == GameUnitConst::T_WIZARD) {
$ratio = $general->getIntel(true, true, true) * 2 - 40;
} else if ($this->armType == GameUnitConst::T_SIEGE) {
$ratio = $general->getLeadership(true, true, true) * 2 - 40;
} else if ($this->armType == GameUnitConst::T_MISC) {
$ratio = $general->getIntel(true, true, true) +
$general->getLeadership(true, true, true) +
$general->getStrength(true, true, true);
$ratio = $ratio*2/3 - 40;
$ratio = $ratio * 2 / 3 - 40;
} else {
$ratio = $general->getStrength(true, true, true) * 2 - 40;
}
else{
$ratio = $general->getStrength(true, true, true)*2 - 40;
}
if($ratio < 10){
if ($ratio < 10) {
$ratio = 10;
}
if($ratio > 100){
$ratio = 50 + $ratio/2;
if ($ratio > 100) {
$ratio = 50 + $ratio / 2;
}
$att = $this->attack + getTechAbil($tech);
return $att * $ratio / 100;
}
public function getComputedDefence(General $general, int $tech){
public function getComputedDefence(General $general, int $tech)
{
$def = $this->defence + getTechAbil($tech);
$crew = ($general->getVar('crew') / (7000 / 30)) + 70;
return $def * $crew / 100;
}
public function getCriticalRatio(General $general){
if($this->armType == GameUnitConst::T_CASTLE){
public function getCriticalRatio(General $general)
{
if ($this->armType == GameUnitConst::T_CASTLE) {
//성벽은 필살을 사용하지 않는다.
return 0;
}
@@ -143,22 +154,19 @@ class GameUnitDetail implements iAction{
// 무장 무력 : 65 5%, 70 10%, 75 15%, 80 20%
// 지장 지력 : 65 5%, 70 8%, 75 10%, 80 13%
//충차장 통솔: 65 5%, 70 8%, 75 10%, 80 13%
if($this->armType == GameUnitConst::T_WIZARD){
if ($this->armType == GameUnitConst::T_WIZARD) {
$mainstat = $general->getIntel(false, true, true, false);
$coef = 0.4;
}
else if($this->armType == GameUnitConst::T_SIEGE){
} else if ($this->armType == GameUnitConst::T_SIEGE) {
$mainstat = $general->getLeadership(false, true, true, false);
$coef = 0.4;
}
else if($this->armType == GameUnitConst::T_MISC){
} else if ($this->armType == GameUnitConst::T_MISC) {
$mainstat = $general->getIntel(false, true, true, false) +
$general->getLeadership(false, true, true, false) +
$general->getStrength(false, true, true, false);
$general->getLeadership(false, true, true, false) +
$general->getStrength(false, true, true, false);
$mainstat /= 3;
$coef = 0.4;
}
else{
} else {
$mainstat = $general->getStrength(false, true, true, false);
$coef = 0.5;
}
@@ -169,7 +177,8 @@ class GameUnitDetail implements iAction{
return min(50, $ratio) / 100;
}
public function pickScore($tech){
public function pickScore($tech)
{
$defaultWar = GameConst::$armperphase + $this->attack + $this->defence + getTechAbil($tech) * 2;
$defaultWar *= 1 + $this->speed / 2;
$defaultWar /= Util::valueFit(1 - $this->avoid / 100, 0.1);
@@ -177,40 +186,41 @@ class GameUnitDetail implements iAction{
return $defaultWar;
}
public function isValid($ownCities, $ownRegions, $relativeYear, $tech){
public function isValid($ownCities, $ownRegions, $relativeYear, $tech)
{
//음수 없음
$relativeYear = max(0, $relativeYear);
if($relativeYear < $this->reqYear){
if ($relativeYear < $this->reqYear) {
return false;
}
if($tech < $this->reqTech){
if ($tech < $this->reqTech) {
return false;
}
if($this->reqCities !== null){
if ($this->reqCities !== null) {
$valid = false;
foreach($this->reqCities as $reqCity){
if(\key_exists($reqCity, $ownCities)){
foreach ($this->reqCities as $reqCity) {
if (\key_exists($reqCity, $ownCities)) {
$valid = true;
break;
}
}
if(!$valid){
if (!$valid) {
return false;
}
}
if($this->reqRegions !== null){
if ($this->reqRegions !== null) {
$valid = false;
foreach($this->reqRegions as $reqRegion){
if(\key_exists($reqRegion, $ownRegions)){
foreach ($this->reqRegions as $reqRegion) {
if (\key_exists($reqRegion, $ownRegions)) {
$valid = true;
break;
}
}
if(!$valid){
if (!$valid) {
return false;
}
}
@@ -219,17 +229,17 @@ class GameUnitDetail implements iAction{
}
//iAction
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
if(!$this->initSkillTrigger){
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
{
if (!$this->initSkillTrigger) {
return null;
}
$triggerList = [];
foreach($this->initSkillTrigger as $triggerArgs){
if(is_string($triggerArgs)){
foreach ($this->initSkillTrigger as $triggerArgs) {
if (is_string($triggerArgs)) {
$typeName = $triggerArgs;
$triggerList[] = buildWarUnitTriggerClass($typeName, $unit);
}
else{
} else {
$typeName = $triggerArgs[0];
//WarUnit 다음 인자는 $raiseType이며, 0이어야할 것이다
$triggerArgs[0] = 0;
@@ -238,17 +248,17 @@ class GameUnitDetail implements iAction{
}
return new WarUnitTriggerCaller(...$triggerList);
}
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
if(!$this->phaseSkillTrigger){
public function getBattlePhaseSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
{
if (!$this->phaseSkillTrigger) {
return null;
}
$triggerList = [];
foreach($this->phaseSkillTrigger as $triggerArgs){
if(is_string($triggerArgs)){
foreach ($this->phaseSkillTrigger as $triggerArgs) {
if (is_string($triggerArgs)) {
$typeName = $triggerArgs;
$triggerList[] = buildWarUnitTriggerClass($typeName, $unit);
}
else{
} else {
$typeName = $triggerArgs[0];
//WarUnit 다음 인자는 $raiseType이며, 0이어야할 것이다
$triggerArgs[0] = 0;
@@ -256,6 +266,90 @@ class GameUnitDetail implements iAction{
}
}
return new WarUnitTriggerCaller(...$triggerList);
}
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
{
if (!$this->iActionList) {
return $value;
}
foreach ($this->iActionList as $iAction) {
$value = $iAction->onCalcDomestic($turnType, $varType, $value, $aux);
}
return $value;
}
}
public function onCalcStat(General $general, string $statName, $value, $aux = null)
{
if (!$this->iActionList) {
return;
}
foreach ($this->iActionList as $iAction) {
$value = $iAction->onCalcStat($general, $statName, $value, $aux);
}
return $value;
}
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
{
if (!$this->iActionList) {
return;
}
foreach ($this->iActionList as $iAction) {
$value = $iAction->onCalcOpposeStat($general, $statName, $value, $aux);
}
return $value;
}
public function onCalcStrategic(string $turnType, string $varType, $value)
{
if (!$this->iActionList) {
return;
}
foreach ($this->iActionList as $iAction) {
$value = $iAction->onCalcStrategic($turnType, $varType, $value);
}
return $value;
}
public function onCalcNationalIncome(string $type, $amount)
{
if (!$this->iActionList) {
return;
}
foreach ($this->iActionList as $iAction) {
$amount = $iAction->onCalcNationalIncome($type, $amount);
}
return $amount;
}
public function getWarPowerMultiplier(WarUnit $unit): array
{
if (!$this->iActionList) {
return [1, 1];
}
$attack = 1;
$defence = 1;
foreach ($this->iActionList as $iAction) {
$attack *= $iAction->getWarPowerMultiplier($unit)[0];
$defence *= $iAction->getWarPowerMultiplier($unit)[1];
}
return [$attack, $defence];
}
public function onArbitraryAction(General $general, RandUtil $rng, string $actionType, ?string $phase = null, ?array $aux = null): null|array
{
if (!$this->iActionList) {
return null;
}
foreach ($this->iActionList as $iAction) {
$aux = $iAction->onArbitraryAction($general, $rng, $actionType, $phase, $aux);
}
return $aux;
}
}
+32 -97
View File
@@ -30,20 +30,22 @@ class General implements iAction
protected $logActivatedSkill = [];
protected $isFinished = false;
/** @var iAction */
/** @var ?iAction */
protected $nationType = null;
/** @var iAction */
/** @var ?iAction */
protected $officerLevelObj = null;
/** @var iAction */
/** @var ?iAction */
protected $specialDomesticObj = null;
/** @var iAction */
/** @var ?iAction */
protected $specialWarObj = null;
/** @var iAction */
/** @var ?iAction */
protected $personalityObj = null;
/** @var iAction[] */
/** @var ?iAction[] */
protected $itemObjs = [];
/** @var iAction */
/** @var ?iAction */
protected $inheritBuffObj = null;
/** @var ?GameUnitDetail */
protected $crewType = null;
protected $lastTurn = null;
protected $resultTurn = null;
@@ -122,6 +124,8 @@ class General implements iAction
$this->personalityObj = buildPersonalityClass($raw['personal']);
$this->crewType = GameUnitConst::byID($this->getVar('crewtype'));
$this->itemObjs['horse'] = buildItemClass($raw['horse']);
$this->itemObjs['weapon'] = buildItemClass($raw['weapon']);
$this->itemObjs['book'] = buildItemClass($raw['book']);
@@ -325,11 +329,10 @@ class General implements iAction
function getCrewTypeObj(): GameUnitDetail
{
$crewType = GameUnitConst::byID($this->getVar('crewtype'));
if ($crewType === null) {
if($this->crewType === null) {
throw new \InvalidArgumentException('Invalid CrewType:' . $this->getVar('crewtype'));
}
return $crewType;
return $this->crewType;
}
function calcRecentWarTurn(int $turnTerm): int
@@ -853,18 +856,22 @@ class General implements iAction
return $result;
}
public function getPreTurnExecuteTriggerList(General $general): ?GeneralTriggerCaller
{
$caller = new GeneralTriggerCaller();
foreach (array_merge([
protected function getActionList(): array{
return array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->crewType,
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
], $this->itemObjs);
}
public function getPreTurnExecuteTriggerList(General $general): ?GeneralTriggerCaller
{
$caller = new GeneralTriggerCaller();
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
@@ -877,15 +884,7 @@ class General implements iAction
}
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
{
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -898,15 +897,7 @@ class General implements iAction
public function onCalcStat(General $general, string $statName, $value, $aux = null)
{
//xxx: $general?
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -919,15 +910,7 @@ class General implements iAction
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
{
//xxx: $general?
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -939,15 +922,7 @@ class General implements iAction
public function onCalcStrategic(string $turnType, string $varType, $value)
{
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -959,15 +934,7 @@ class General implements iAction
public function onCalcNationalIncome(string $type, $amount)
{
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -979,15 +946,7 @@ class General implements iAction
public function onArbitraryAction(General $general, RandUtil $rng, string $actionType, ?string $phase = null, $aux = null): null|array
{
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -1002,15 +961,7 @@ class General implements iAction
//xxx:$unit
$att = 1;
$def = 1;
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -1024,15 +975,7 @@ class General implements iAction
public function getBattleInitSkillTriggerList(WarUnit $unit): ?WarUnitTriggerCaller
{
$caller = new WarUnitTriggerCaller();
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}
@@ -1053,15 +996,7 @@ class General implements iAction
new WarUnitTrigger\che_계략발동($unit),
new WarUnitTrigger\che_계략실패($unit)
);
foreach (array_merge([
$this->nationType,
$this->officerLevelObj,
$this->specialDomesticObj,
$this->specialWarObj,
$this->personalityObj,
$this->getCrewTypeObj(),
$this->inheritBuffObj,
], $this->itemObjs) as $iObj) {
foreach ($this->getActionList() as $iObj) {
if (!$iObj) {
continue;
}