when a minion dies.... - aharalabMeiji/fireplaceAharaLab GitHub Wiki

class Attack, class BG_Attack

攻撃を行う。(双方向にHitしあう。)

class Hit

打撃を与える。Predamageがトリガーされる。

class Predamage

ダメージの前処理を行う。Damageがトリガーされる。

class Damage

  1. ダメージの量と形態が決定される。(ここではヒットポイントの減少は行われない。)関数 _hit で行われ、ヘルス=0になったならば to_be_destroyedフラグを立てる。

  2. divine_shield, lifesteal, poisonousの処理はDamageで行われる。

1.(2022/6/9 - )Damageをtriggerするとき、Deathsもtriggerするようにした。

class Destroy

  1. Zone.PLAY であるならば to_be_destroyedフラグを立てる。

  2. さもなくば、zone=GRAVEYARD にする。(_set_zone が4階層呼び出される。)

class Deaths

Deathsはつぎの場所でtriggerされる

  1. Spellカードが実行されたとき

  2. card.destroyが実行されたとき

実行内容:game.process_deaths()がコールされる。

game.process_death()

  1. game.process_death()Deathsで実行される。

  2. 生きている entity 全体(game.live_entities)のなかからto_be_destroyedフラグが立っているものだけをピックアップする。(live_entities の範囲はハンド、デッキ、フィールド、シークレット、クエスト、リウォード、ウェポンを含む。バフやオーラバフは含まない。)

  3. _action_stack+=1

  4. ピックアップされたentityについてzoneをGRAVEYARDにしたのちにDeathをtriggerする

  5. _action_stack-=1

  6. そのあとにself.check_for_end_game()をコール

class Death

  1. オーラをリフレッシュ

  2. death_log に記録、

  3. このタイミングで、ブロードキャストのONがコールされる。(AFTER扱いのような気もする。)

  4. 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