ステートの効果を行動の強制に入れ替えるスクリプト【解決済み】

ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

ステートの効果を行動の強制に入れ替えるスクリプト【解決済み】

投稿記事by ズッキー » 2022年12月03日(土) 13:12

先制で『きあいパンチ』のステートになるスキルを使用した後、ステート発動タイミングがターン終了時かつステートが解除されていなかった場合、ターン終了のタイミングできあいパンチを放てる・・・といった挙動を実現したいです。
このようなスクリプトはないでしょうか?
最後に編集したユーザー ズッキー on 2022年12月06日(火) 23:25 [ 編集 1 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by 名無し蛙 » 2022年12月04日(日) 14:48

Game_Battler#on_turn_end...ではなくScene_Battle#turn_endを改造すれば出来そうな気がしますね。
ターンエンド処理が完了するまでに
@subjectにバトラーを入れて処理を中断すれば動きそうなので。

コード: 全て選択

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ○ ターン終了
  #--------------------------------------------------------------------------
  alias :_old_turn_end :turn_end
  def turn_end
    battler = all_battle_members.find{|battler| battler.state?(30)}
    if battler
      battler.remove_state(30)
      battler.force_action(69, -1)
      @subject = battler
      return
    end
    _old_turn_end
  end 
end

ベタ書きだとこんな感じじゃないですか。
30は判定に用いるステート,69は発動させるスキル,-1はターゲット(ランダム)ですね。
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by ズッキー » 2022年12月04日(日) 20:14

名無し蛙様
ご返信ありがとうございます。
試してみたところうまく起動しました。

効果のバリエーションを増やすには
battler = all_battle_members.find{|battler| battler.state?(30)}
if battler
battler.remove_state(30)
battler.force_action(69, -1)
@subject = battler
return
end
の記述を増やせばよいでしょうか?
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by 名無し蛙 » 2022年12月05日(月) 05:49

どれくらい増やすかにもよりますねぇ
愚直に増やしても良いんですけど(その場合はaliasの名前が被らないように)
マジックナンバー抜き出してハッシュと配列使ってforeachで判定増やしても良いです。

コード: 全て選択

TURN_END_SKILLS = [
  {state_id: 30, skill_id: 69, target: -1},
  {state_id: 31, skill_id: 69, target: -1},
  {state_id: 32, skill_id: 69, target: -1},
  {state_id: 33, skill_id: 69, target: -1},
]

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ○ ターン終了
  #--------------------------------------------------------------------------
  alias :_old_turn_end :turn_end
  def turn_end
    TURN_END_SKILLS.each do |tes|
      battler = all_battle_members.find{|battler| battler.state?(tes[:state_id])}
      if battler
        battler.remove_state(tes[:state_id])
        battler.force_action(tes[:skill_id], tes[:target])
        @subject = battler
        return
      end
    end
    _old_turn_end
  end
end
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by ズッキー » 2022年12月05日(月) 23:11

名無し蛙様
かなり使いやすくなりそうです。
ありがとうございます。

ところで質問したいのですが、このスクリプトで対象ステートをターン終了時に解除する処理はどこに記述しているのでしょうか?
ついでのようで悪いのですがおねがいします。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by 名無し蛙 » 2022年12月06日(火) 06:24

それは当然battler.remove_state(tes[:state_id])です
これがないと無限循環するんじゃないですかね
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: ステートの効果を行動の強制に入れ替えるスクリプト

投稿記事by ズッキー » 2022年12月06日(火) 23:25

名無し蛙様
返信ありがとうございます。

はい、実際にターンエンドスキルに『対象ステートを100%味方に付与』を設定したところ無限ループが発生しておりました。
出来る事なら効果を2ターン継続できるものを作ってみたかったのですが、ステートを残したままループを抜け出す事は難しいのですね。
ですが副産物として、この性質を利用して面白いものが作れそうです。

今回はありがとうございました。

“VX / Ace:質問” へ戻る