From 1743ce714a8a71d0514ec9b988d65a5a5fc35225 Mon Sep 17 00:00:00 2001 From: hide_d Date: Wed, 19 Sep 2018 23:29:36 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=ED=88=AC=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=AA=A8=EB=91=90=20generator=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/process_war.php | 40 +++++++++++++++++++++++---------- hwe/sammo/WarUnit.php | 16 +++++++------- hwe/sammo/WarUnitGeneral.php | 43 ++++++++++++++++++------------------ src/sammo/Util.php | 18 +++++++++++++++ 4 files changed, 75 insertions(+), 42 deletions(-) diff --git a/hwe/process_war.php b/hwe/process_war.php index 781a2c7a..0e7cab66 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -270,8 +270,12 @@ function processWar_NG( $attacker->setOppose($defender); $defender->setOppose($attacker); - $attacker->checkBattleBeginSkill(); - $defender->checkBattleBeginSkill(); + foreach(Util::zip( + $attacker->checkBattleBeginSkill(), + $defender->checkBattleBeginSkill() + ) as $b){ + //doNothing + } $attacker->checkBattleBeginItem(); $defender->checkBattleBeginItem(); @@ -283,21 +287,33 @@ function processWar_NG( $attacker->beginPhase(); $defender->beginPhase(); - $attacker->checkPreActiveSkill(); - $defender->checkPreActiveSkill(); + foreach(Util::zip( + $attacker->checkPreActiveSkill(), + $defender->checkPreActiveSkill() + ) as $b){ + //doNothing + } - $attacker->checkActiveSkill(); - $defender->checkActiveSkill(); + foreach(Util::zip( + $attacker->checkActiveSkill(), + $defender->checkActiveSkill() + ) as $b){ + //doNothing + } //NOTE: 마법은 checkActiveSkill, checkPostActiveSkill 내에서 반영 - $attacker->checkPostActiveSkill(); - $defender->checkPostActiveSkill(); + foreach(Util::zip( + $attacker->checkPostActiveSkill(), + $defender->checkPostActiveSkill() + ) as $b){ + //doNothing + } //NOTE: 반계류 등의 스킬을 post에서 반영 - $activeSkillIterator = new \AppendIterator(); - $activeSkillIterator->append($attacker->applyActiveSkill()); - $activeSkillIterator->append($defender->applyActiveSkill()); - foreach($activeSkillIterator as $b){ + foreach(Util::zip( + $attacker->applyActiveSkill(), + $defender->applyActiveSkill() + ) as $b){ //doNothing } diff --git a/hwe/sammo/WarUnit.php b/hwe/sammo/WarUnit.php index d98df674..10ead104 100644 --- a/hwe/sammo/WarUnit.php +++ b/hwe/sammo/WarUnit.php @@ -337,8 +337,8 @@ class WarUnit{ $this->computeWarPower(); } - function checkBattleBeginSkill():bool{ - return false; + function checkBattleBeginSkill(){ + yield true; } function checkBattleBeginItem():bool{ @@ -372,16 +372,16 @@ class WarUnit{ } } - function checkPreActiveSkill():bool{ - return false; + function checkPreActiveSkill(){ + yield true; } - function checkActiveSkill():bool{ - return false; + function checkActiveSkill(){ + yield true; } - function checkPostActiveSkill():bool{ - return false; + function checkPostActiveSkill(){ + yield true; } function applyActiveSkill(){ diff --git a/hwe/sammo/WarUnitGeneral.php b/hwe/sammo/WarUnitGeneral.php index 39de6670..5f61e401 100644 --- a/hwe/sammo/WarUnitGeneral.php +++ b/hwe/sammo/WarUnitGeneral.php @@ -349,8 +349,7 @@ class WarUnitGeneral extends WarUnit{ } ///전투 개시 시에 작동하여 매 장수마다 작동하는 스킬 - function checkBattleBeginSkill():bool{ - $skillResult = false; + function checkBattleBeginSkill(){ $oppose = $this->getOppose(); $specialWar = $this->getSpecialWar(); @@ -361,11 +360,13 @@ class WarUnitGeneral extends WarUnit{ ){ $this->activateSkill('부상무효'); } + yield true; if($specialWar == 62){ $oppose->activateSkill('저격불가'); $this->activateSkill('부상무효'); } + yield true; if ( $specialWar == 70 && @@ -375,10 +376,8 @@ class WarUnitGeneral extends WarUnit{ Util::randBool(1/3) ) { $this->activateSkill('저격'); - $skillResult = true; } - - return $skillResult; + yield true; } ///전투 개시 시에 작동하여 매 장수마다 작동하는 아이템 @@ -509,7 +508,7 @@ class WarUnitGeneral extends WarUnit{ return $this->killed; } - function checkPreActiveSkill():bool{ + function checkPreActiveSkill(){ $activated = false; $oppose = $this->getOppose(); @@ -522,8 +521,8 @@ class WarUnitGeneral extends WarUnit{ $oppose->activateSkill('위압불가'); $oppose->activateSkill('격노불가'); $oppose->activateSkill('계략약화'); - $activated = true; } + yield true; if( $specialWar == 63 && @@ -534,19 +533,16 @@ class WarUnitGeneral extends WarUnit{ !$this->hasActivatedSkill('위압불가') ){ $this->activateSkill('위압'); - $activated = true; } + yield true; if($specialWar == 60){ $oppose->activateSkill('회피불가'); } - - return $activated; + yield true; } - function checkActiveSkill():bool{ - $activated = false; - + function checkActiveSkill(){ $oppose = $this->getOppose(); $specialWar = $this->getSpecialWar(); $item = $this->getItem(); @@ -562,9 +558,9 @@ class WarUnitGeneral extends WarUnit{ $ratio = $this->getComputedAtmos() + $this->getComputedTrain(); if(Util::randBool($ratio / 400)){ $this->activateSkill('특수', '저지'); - $activated = true; } } + yield true; if( !$this->hasActivatedSkill('특수') && @@ -572,8 +568,8 @@ class WarUnitGeneral extends WarUnit{ Util::randBool($this->getComputedCriticalRatio()) ){ $this->activateSkill('특수', '필살시도', '필살'); - $activated = true; } + yield true; if( !$this->hasActivatedSkill('특수') && @@ -581,8 +577,8 @@ class WarUnitGeneral extends WarUnit{ Util::randBool($this->getComputedAvoidRatio()) ){ $this->activateSkill('특수', '회피시도', '회피'); - $activated = true; } + yield true; //계략 if($crewType->magicCoef){ @@ -627,17 +623,16 @@ class WarUnitGeneral extends WarUnit{ } } } + yield true; //의술 if($specialWar == 73 && Util::randBool(0.2)){ $this->activateSkill('치료'); - $activated = true; } - - return $activated; + yield true; } - function checkPostActiveSkill():bool{ + function checkPostActiveSkill(){ $activated = false; $oppose = $this->getOppose(); @@ -667,6 +662,7 @@ class WarUnitGeneral extends WarUnit{ } } } + yield true; if( $specialWar == 74 && @@ -693,6 +689,7 @@ class WarUnitGeneral extends WarUnit{ } } } + yield true; if( ($item == 23 || $item == 24) && @@ -702,6 +699,7 @@ class WarUnitGeneral extends WarUnit{ $this->activateSkill('치료'); $activated = true; } + yield true; //계략 if( @@ -713,6 +711,7 @@ class WarUnitGeneral extends WarUnit{ $oppose->deactivateSkill('계략'); $activated = true; } + yield true; if( $specialWar == 42 && @@ -720,6 +719,7 @@ class WarUnitGeneral extends WarUnit{ ){ $this->warPowerMultiply *= 1.3; } + yield true; if( $specialWar == 43 && @@ -727,8 +727,7 @@ class WarUnitGeneral extends WarUnit{ ){ $this->warPowerMultiply *= 1.5; } - - return $activated; + yield true; } function applyActiveSkill(){ diff --git a/src/sammo/Util.php b/src/sammo/Util.php index 41e84a7d..93732c72 100644 --- a/src/sammo/Util.php +++ b/src/sammo/Util.php @@ -60,6 +60,24 @@ class Util extends \utilphp\util throw new \InvalidArgumentException('올바르지 않은 type 지정'); } + public static function zip(iterable ...$iterators){ + while(true){ + $hasValue = false; + $values = []; + foreach($iterators as $iter){ + if($iter->valid()){ + $values[] = $iter->send(NULL); + $hasValue = true; + } + } + yield $values; + + if(!$hasValue){ + break; + } + } + } + /** * $_POST, $_GET에서 값을 가져오는 함수. Util::array_get($_POST[$name])을 축약 가능. * 타입이 복잡해질 경우 이 함수를 통하지 않고 json으로 요청할 것을 권장.