when a minion dies.... - aharalabMeiji/fireplaceAharaLab GitHub Wiki
class Attack, class BG_Attack
攻撃を行う。(双方向にHitしあう。)
class Hit
打撃を与える。Predamageがトリガーされる。
class Predamage
ダメージの前処理を行う。Damageがトリガーされる。
class Damage
-
ダメージの量と形態が決定される。(ここではヒットポイントの減少は行われない。)関数 _hit で行われ、ヘルス=0になったならば to_be_destroyedフラグを立てる。
-
divine_shield, lifesteal, poisonous
の処理はDamageで行われる。
1.(2022/6/9 - )Damage
をtriggerするとき、Deaths
もtriggerするようにした。
class Destroy
-
Zone.PLAY であるならば to_be_destroyedフラグを立てる。
-
さもなくば、zone=GRAVEYARD にする。(_set_zone が4階層呼び出される。)
class Deaths
Deaths
はつぎの場所でtriggerされる
-
Spell
カードが実行されたとき -
card.destroy
が実行されたとき
実行内容:game.process_deaths()
がコールされる。
game.process_death()
-
game.process_death()
はDeaths
で実行される。 -
生きている entity 全体(
game.live_entities
)のなかからto_be_destroyedフラグが立っているものだけをピックアップする。(live_entities の範囲はハンド、デッキ、フィールド、シークレット、クエスト、リウォード、ウェポンを含む。バフやオーラバフは含まない。) -
_action_stack+=1
-
ピックアップされたentityについてzoneをGRAVEYARDにしたのちに
Death
をtriggerする -
_action_stack-=1
-
そのあとにself.check_for_end_game()をコール
class Death
-
オーラをリフレッシュ
-
death_log に記録、
-
このタイミングで、ブロードキャストのONがコールされる。(AFTER扱いのような気もする。)
-
DeathrattleとRebonrnがtriggerされる
例題
問題
バトグラにおいて「グウル」が相手を攻撃し、3ダメを受けてグウルは死亡。断末魔が発生し、すべてのミニオンに1ダメ。この1ダメをうけて、敵側の1/1インプが死亡。インプの断末魔が発生し、インプが2体召喚される。
注目点
まず、連鎖的に死亡が発生しているが、正しく断末魔が1回動くためにはDeathが1回triggerされる必要がある。そのうえで無限ループに陥らないことが肝要。
BG_Attack(グウル,敵)
Hit(グウル,3)
PreDamage(グウル,3)
Damage(グウル,3)
(グウル.to_be_destroyed:=1)(ここでcard.damageが加算され、実質的に死亡するかの条件が得られる。)Deaths()
game.process_death()
game.action_start(BlockType.DEATHS, self, 0, None)
(self._action_stack := 1
)グウル.zone:=Zone.GRAVEYARD
Death(グウル)
Deathrattle(グウル)
Hit(インプ,1)
Predamage(インプ,1)
Damage(インプ,1)
Deaths()
game.process_death()
game.action_start(BlockType.DEATHS, self, 0, None)
(self._action_stack := 2
)インプ.zone:=Zone.GRAVEYARD
Death(インプ)
Deathrattle(インプ)
(以下略)
- action_end(self, type, source):(
self._action_stack := 1
)
- action_end(self, type, source):(
self._action_stack := 0
)