수극을 통한 저격 예시

This commit is contained in:
2019-04-29 02:04:45 +09:00
parent 17a59cbdd5
commit 00a6e9798f
8 changed files with 172 additions and 34 deletions
+8
View File
@@ -294,6 +294,13 @@ function processWar_NG(
$attacker->setOppose($defender);
$defender->setOppose($attacker);
$initCaller = $attacker->getGeneral()->getBattleInitSkillTriggerList($attacker);
$initCaller->merge($defender->getGeneral()->getBattleInitSkillTriggerList($defender));
$initCaller->fire([], [$attacker, $defender]);
//스킬류, 아이템, 스킬 및 아이템 적용 순이어야 할 것
/*
foreach(Util::zip(
$attacker->checkBattleBeginSkill(),
$defender->checkBattleBeginSkill()
@@ -306,6 +313,7 @@ function processWar_NG(
$attacker->applyBattleBeginSkillAndItem();
$defender->applyBattleBeginSkillAndItem();
*/
}
$attacker->beginPhase();
@@ -0,0 +1,24 @@
<?php
namespace sammo\ActionNationType;
use \sammo\iAction;
use \sammo\General;
use \sammo\WarUnitTriggerCaller;
use \sammo\WarUnit;
use \sammo\WarInitTrigger\che_저격시도;
use \sammo\WarInitTrigger\che_저격발동;
class che_저격_수극 extends \sammo\BaseItem{
protected static $id = 2;
protected static $name = '수극(저격)';
protected static $info = '[전투] 전투 개시 전 20% 확률로 저격 시도. 1회용';
protected static $cost = 1000;
protected static $consumable = true;
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller([
new che_저격시도($unit, che_저격시도::TYPE_CONSUMABLE_ITEM, 20, 40),
new che_저격발동($unit)
]);
}
}
+43 -1
View File
@@ -3,7 +3,49 @@ namespace sammo;
abstract class BaseWarUnitTrigger extends ObjectTrigger{
/** @var WarUnit $object */
public function __construct(WarUnit $unit){
const TYPE_NONE = 0;
const TYPE_ITEM = 1;
const TYPE_CONSUMABLE_ITEM = 2;
protected $raiseType;
public function __construct(WarUnit $unit, int $raiseType = 0){
$this->object = $unit;
$this->raiseType = $raiseType;
}
public function action(?array $env=null, $arg=null):?array{
/** @var WarUnitGeneral $attacker */
/** @var WarUnit $defender */
[$attacker, $defender] = $arg;
/** @var WarUnit $self */
$self = $this->object;
$isAttacker = $self->isAttacker();
$oppose = $isAttacker?$defender:$attacker;
if($env === null){
$env = [];
}
if(!key_exists('e_attacker', $env)){
$env['e_attacker'] = [];
}
if(!key_exists('e_defender', $env)){
$env['e_defender'] = [];
}
$selfEnv = $isAttacker?$env['e_attacker']:$env['e_defender'];
$opposeEnv = $isAttacker?$env['e_defender']:$env['e_attacker'];
$this->actionWar($self, $oppose, $selfEnv, $opposeEnv);
$env['e_attacker'] = $isAttacker?$selfEnv:$opposeEnv;
$env['e_defender'] = $isAttacker?$opposeEnv:$selfEnv;
return $env;
}
abstract protected function actionWar(WarUnit $self, WarUnit $oppose, array &$selfEnv, array &$opposeEnv):void;
}
+2 -16
View File
@@ -1,24 +1,10 @@
<?php
namespace sammo;
class GameUnitInitTriggerBase extends ObjectTrigger{
class GameUnitInitTriggerBase extends BaseWarUnitTrigger{
static protected $priority = 10000;
public function __construct(WarUnit $unit){
$this->object = $unit;
$this->unitType = $unit->getCrewType();
}
public function action(?array $env=null, $arg=null):?array{
/** @var WarUnitGeneral $attacker */
/** @var WarUnit $defender */
[$attacker, $defender] = $arg;
$attackerCrewType = $attacker->getCrewType();
$defenderCrewType = $defender->getCrewType();
protected function actionWar(WarUnit $self, WarUnit $oppose, array &$selfEnv, array &$opposeEnv):void{
//TODO: 충차는 성벽 상대로 부상입지 않음
return $env;
}
}
+3 -16
View File
@@ -1,23 +1,10 @@
<?php
namespace sammo;
class GameUnitPhaseTriggerBase extends ObjectTrigger{
class GameUnitPhaseTriggerBase extends BaseWarUnitTrigger{
static protected $priority = 10000;
public function __construct(WarUnit $unit){
$this->object = $unit;
$this->unitType = $unit->getCrewType();
}
public function action(?array $env=null, $arg=null):?array{
/** @var WarUnitGeneral $attacker */
/** @var WarUnit $defender */
[$attacker, $defender] = $arg;
$attackerCrewType = $attacker->getCrewType();
$defenderCrewType = $defender->getCrewType();
//TODO: 목우
return $env;
protected function actionWar(WarUnit $self, WarUnit $oppose, array &$selfEnv, array &$opposeEnv):void{
//TODO: 목우 목우
}
}
+3 -1
View File
@@ -81,6 +81,8 @@ abstract class TriggerCaller{
return;
}
//NOTE: array_merge로 계속 가야하는가? merge가 많으면 SPL의 LinkedList가 낫지 않나?
$newTriggerList = [];
$iterLhs = new \ArrayIterator($this->triggerListByPriority);
$iterRhs = new \ArrayIterator($other->triggerListByPriority);
@@ -96,7 +98,7 @@ abstract class TriggerCaller{
$iterRhs->next();
continue;
}
$newTriggerList[$iterLhs->key()] = $iterLhs->current() + $iterRhs->current();
$newTriggerList[$iterLhs->key()] = array_merge($iterLhs->current(), $iterRhs->current());
$iterLhs->next();
$iterRhs->next();
}
@@ -0,0 +1,32 @@
<?php
namespace sammo\WarInitTrigger;
use sammo\BaseWarUnitTrigger;
use sammo\WarUnitGeneral;
use sammo\WarUnitCity;
use sammo\WarUnit;
use sammo\GameUnitDetail;
use sammo\Util;
class che_저격발동 extends BaseWarUnitTrigger{
static protected $priority = 20000;
protected function actionWar(WarUnit $self, WarUnit $oppose, array &$selfEnv, array &$opposeEnv):void{
if(!$oppose->hasActivatedSkill('저격')){
return;
}
if($selfEnv['저격발동']){
return;
}
$selfEnv['저격발동'] = true;
$general = $self->general;
$oppose->getLogger()->pushGeneralActionLog("상대를 <C>저격</>했다!", ActionLogger::PLAIN);
$oppose->getLogger()->pushGeneralBattleDetailLog("상대를 <C>저격</>했다!", ActionLogger::PLAIN);
$self->getLogger()->pushGeneralActionLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
$self->getLogger()->pushGeneralBattleDetailLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
$general->increaseVarWithLimit('injury', Util::randRangeInt($opposeEnv['woundMin'], $opposeEnv['woundMax']), null, 80);
}
}
@@ -0,0 +1,57 @@
<?php
namespace sammo\WarInitTrigger;
use sammo\BaseWarUnitTrigger;
use sammo\WarUnitGeneral;
use sammo\WarUnitCity;
use sammo\WarUnit;
use sammo\GameUnitDetail;
class che_저격시도 extends BaseWarUnitTrigger{
static protected $priority = 20000;
protected $woundMin;
protected $woundMax;
public function __construct(WarUnit $unit, int $raiseType, float $woundMin, float $woundMax){
$this->object = $unit;
$this->raiseType = $raiseType;
}
protected function actionWar(WarUnit $self, WarUnit $oppose, array &$selfEnv, array &$opposeEnv):void{
assert($self instanceof WarUnitGeneral, 'General만 발동 가능');
if(!$oppose instanceof WarUnitGeneral){
return;
}
if($self->hasActivatedSkill('저격')){
return;
}
if($self->hasActivatedSkill('저격불가')){
return;
}
if(!Util::randBool(1/5)){
return;
}
$this->activateSkill('저격');
$selfEnv['woundMin'] = $this->woundMin;
$selfEnv['woundMax'] = $this->woundMax;
if(!($this->raiseType & static::TYPE_ITEM)){
return;
}
$self->activateSkill('아이템사용');
$item = $self->getGeneral()->getItem();
$itemName = $item->getName();
$self->activateSkill($itemName);
if (!($this->raiseType & static::TYPE_CONSUMABLE_ITEM)) {
return;
}
$self->activateSkill('아이템소모');
$josaUl = JosaUtil::pick($itemName, '을');
$self->getLogger()->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
$self->general->deleteItem();
}
}