【解決済み】 Ace 瀕死時に××

nira
記事: 13
登録日時: 2016年8月23日(火) 22:07

【解決済み】 Ace 瀕死時に××

投稿記事by nira » 2016年12月08日(木) 23:15

失礼致します。

現在、瀕死時(戦闘中)に自動回復するような防具を作りたいと考えております。

大変恐縮ではありますが、防具のメモ帳欄を使って、瀕死時にコモンイベントを呼び出す事が出来るスクリプトを
どなたか作っていただけないでしょうか?

宜しくお致します。
最後に編集したユーザー nira on 2016年12月10日(土) 00:40 [ 編集 1 回目 ]

奈々(なな)
記事: 71
登録日時: 2016年11月06日(日) 16:57

Re: Ace 瀕死時に××

投稿記事by 奈々(なな) » 2016年12月09日(金) 07:24

瀕死、とは戦闘不能状態のことで良いのですかね?

もしそうなら、うちの素材に戦闘不能時に自動回復させるものがありますので
http://heptanas.mamagoto.com/Entry/4/
これを判定コモンなどで装備条件に応じて付与する手もありますね。
http://heptanas.mamagoto.com/Entry/17/
http://heptanas.mamagoto.com/Entry/39/

もし、要望のスクリプトを作るとなると

・戦闘不能になる毎に、何度もなのか一度だけなのか
・複数が同時に戦闘不能になった場合の挙動
・想定される防具の数はどれくらいなのか

あたりの情報が欲しいです。
------------------------------------------------------------------------------------
へぷたなすくろーる
http://heptanas.mamagoto.com/

VXAceのスクリプト素材及びイベント講座などをやっています。
------------------------------------------------------------------------------------
nira
記事: 13
登録日時: 2016年8月23日(火) 22:07

Re: Ace 瀕死時に××

投稿記事by nira » 2016年12月09日(金) 12:30

言葉足らずで申し訳ありません。

瀕死時というのは、HPが黄色くなるライン(たしか20%以下だと思います)です。
戦闘中1回のみの発動を想定しています。
アクター複数が同時に瀕死時になった場合はアクターIDの小さい順若しくは、メニュー欄の上のキャラ順でお願いします。
防具は30以上は作る予定です。

イメージとしては、FF6のバリアリングのような感じです。

可能であれば、是非宜しくお願いします。
faida
記事: 241
登録日時: 2015年12月17日(木) 16:44

Re: Ace 瀕死時に××

投稿記事by faida » 2016年12月09日(金) 18:46

なんとなく作ってみました。色々無駄な機能がついているので、競合の可能性が高いと思います。
なお、動作はデフォルト戦闘でのみ保証されます。ATBとかは動作保証対象外なのでお許しください。

※スクリプトは修正したので、下の返信からDLしてください。



ちなみに、瀕死(HPが黄色くなる状態)はHP25%未満となります。
最後に編集したユーザー faida on 2016年12月09日(金) 21:11 [ 編集 1 回目 ]
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
nira
記事: 13
登録日時: 2016年8月23日(火) 22:07

Re: Ace 瀕死時に××

投稿記事by nira » 2016年12月09日(金) 20:01

迅速な対応、大変感謝申し上げます。

デフォルトでは要求通り、きちんと作動してくれます。

ただ、戦闘終了後フィールドにおいて、一度戦闘中にする処理を行うスクリプトを使用しているため
条件を満たす場合、フィールドでも作動してしまいます。

大変申し訳ないのですが、スイッチor変数が特定の番号の場合、処理を無効する仕様を付け加えては
いただけないでしょうか?

お時間があるならば、何卒宜しくお願いします。
faida
記事: 241
登録日時: 2015年12月17日(木) 16:44

Re: Ace 瀕死時に××

投稿記事by faida » 2016年12月09日(金) 21:10

スイッチor変数が特定の番号の場合、処理を無効する仕様

スイッチにしました。ついでにいらない処理を消したりなんだりしたので、
スイッチ無効化がいらない方もお手数ですが再DLをお願いします。

コード: 全て選択

=begin
◆概要
瀕死時に効果を発動したり特徴を付加したりします。

◆機能
・メモ欄に<瀕死時効果 id, n>と記入すると、瀕死時に以下の効果を発揮します。
idが0…指定コモンイベント予約(予約するだけ)
    1…HPをn回復 2…HPをn%回復 3、4は1、2のMP版
    5…IDnのステート付加 6…パラメータnの弱体解除しつつ強化付加(2段階)
・メモ欄に<瀕死時特徴 [code, data_id, value]>と記入すると、
その特徴を付加します。
・ステートのメモ欄に<瀕死付加時アニメ id>と記入すると、瀕死付加時のみ
そのアニメを再生します。
・地味にコモンイベント複数予約のおまけつき。

◆仕様
・特徴が分かりづらいのは仕様です。わかりやすいようにリメイク予定。

◆使用上の注意
・★……エイリアス ●……再定義 ○……新規定義

◆作者:faida @faida3983

◆更新履歴
ver1.0 : 公開
ver1.1 : 拙作「ログ出力」に対応
ver1.2 : 戦闘途中からアクターが加入する場合のエラー修正
     ステートごとにアニメ指定できるように
ver1.3 : 割合回復の不具合修正

=end

module FAI_CECF
  # 設定項目:コモンイベント予約時にアクターID(か敵の並び順)を代入する変数ID
  # 代入しない場合は0
  COMMON_EVENT_VAR_ID = 1
  # 設定項目:HP回復時に表示するアニメーション(表示しない場合は0)
  HP_RECOVER_ANI_ID = 37
  # 設定項目:MP回復時に表示するアニメーション(表示しない場合は0)
  MP_RECOVER_ANI_ID = 38
  # 設定項目:指定なしステート付加時に表示するアニメーション(表示しない場合は0)
  ADD_STATE_ANI_ID = 43
  # 設定項目:強化付加時に表示するアニメーション(表示しない場合は0)
  ADD_BUFF_ANI_ID = 43
  # 設定項目:強化付加時に持続するターン数
  # "$game_variables[2]"ってやると(変数ID2)ターン続きます。
  ADD_BUFF_TURN = "5"
  # 設定項目:無効化するスイッチID(使用しない場合は0)
  FORBID_SW_ID = 0
end

class RPG::BaseItem
  def crisis_effects
    return @crisis_effects if @crisis_effects
    @crisis_effects = []
    note.each_line{|line|
      if line =~ /<瀕死時効果\s*(\d+)\s*\,\s*(\d+)>/
        @crisis_effects << [$1.to_i, $2.to_i]
        @crisis_effects[-1][1]/=100.0 if [2,4].include?(@crisis_effects[-1][0])
      end
    }
    @crisis_effects
  end
  def crisis_features
    return @crisis_features if @crisis_features
    @crisis_features = []
    note.each_line{|line|
      if line =~ /<瀕死時特徴\s*(\[.+\])>/
        @crisis_features << eval($1)
      end
    }
    @crisis_features
  end
end

class RPG::State
  def crisis_add_anime
    return @crisis_add_anime if @crisis_add_anime
    @crisis_add_anime = FAI_CECF::ADD_STATE_ANI_ID
    @crisis_add_anime = $1.to_i if note =~ /<瀕死付加時アニメ\s*(\d+)>/
    @crisis_add_anime
  end
end

#==============================================================================
# ■ Game_Temp
#==============================================================================

class Game_Temp
  include FAI_CECF
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :reserved_ce_battlers        # なんか
  #--------------------------------------------------------------------------
  # ★ オブジェクト初期化
  #--------------------------------------------------------------------------
  alias fai_cecf_initialize initialize
  def initialize
    fai_cecf_initialize
    @reserved_common_event_ids = []
    @reserved_ce_battlers = []
  end
  #--------------------------------------------------------------------------
  # ★ コモンイベントの呼び出しを予約
  #--------------------------------------------------------------------------
  alias fai_cecf_reserve_common_event reserve_common_event
  def reserve_common_event(common_event_id)
    if @common_event_id > 0
      return @reserved_common_event_ids << common_event_id
    end
    fai_cecf_reserve_common_event(common_event_id)
  end
  #--------------------------------------------------------------------------
  # ★ コモンイベントの呼び出し予約をクリア
  #--------------------------------------------------------------------------
  alias fai_cecf_clear_common_event clear_common_event
  def clear_common_event
    fai_cecf_clear_common_event
    if !@reserved_common_event_ids.empty?
      fai_cecf_reserve_common_event(@reserved_common_event_ids.shift)
    end
  end
end

class Game_BattlerBase
  include FAI_CECF
  alias fai_cecf_initialize initialize
  def initialize
    fai_cecf_initialize
    @crisis_effects = []
  end
  def crisis_effects
    feature_objects.collect{|obj|obj.crisis_effects}.flatten(1)
  end
  def crisis_features
    return [] if !$game_party.in_battle
    return [] if FORBID_SW_ID > 0 && $game_switches[FORBID_SW_ID]
    return [] if hp == 0 || !@mhp || hp >= @mhp / 4
    feature_objects.collect{|obj|obj.crisis_features}.flatten(1).collect{|arr|
      RPG::BaseItem::Feature.new(arr[0], arr[1], arr[2])
    }
  end
  alias fai_cecf_all_features all_features
  def all_features
    fai_cecf_all_features + crisis_features
  end
  #--------------------------------------------------------------------------
  # ★ リフレッシュ
  #--------------------------------------------------------------------------
  alias fai_cecf_refresh refresh
  def refresh
    fai_cecf_refresh
    @mhp = mhp
  end
end

class Game_Battler < Game_BattlerBase
  include FAI_CECF
  #--------------------------------------------------------------------------
  # ★ ステートの付加
  #--------------------------------------------------------------------------
  alias fai_cecf_add_state add_state
  def add_state(state_id)
    cf = self.crisis_effects
    fai_cecf_add_state(state_id)
    if cf != self.crisis_effects
      a = self.crisis_effects; cf.each{|eff|i = a.index(eff); a[i] = nil if i}
      @crisis_effects += a.compact
    end
  end
  #--------------------------------------------------------------------------
  # ★ 戦闘開始処理
  #--------------------------------------------------------------------------
  alias fai_cecf_on_battle_start on_battle_start
  def on_battle_start
    fai_cecf_on_battle_start
    init_crisis_effects
  end
  def init_crisis_effects
    @crisis_effects = self.crisis_effects
  end
  def check_crisis_effects
    return if FORBID_SW_ID > 0 && $game_switches[FORBID_SW_ID]
    return if hp >= mhp / 4 || hp == 0
    @crisis_effects.each_with_index{|arr|
      case arr[0]
      when 0
        if COMMON_EVENT_VAR_ID > 0
          $game_temp.reserved_ce_battlers <<  i = actor? ? id : -index
        end
        $game_temp.reserve_common_event(arr[1])
      when 1
        self.hp += arr[1]
        self.animation_id = HP_RECOVER_ANI_ID if HP_RECOVER_ANI_ID > 0
      when 2
        self.hp += (arr[1] * mhp).to_i
        self.animation_id = HP_RECOVER_ANI_ID if HP_RECOVER_ANI_ID > 0
      when 3
        self.mp += arr[1]
        self.animation_id = MP_RECOVER_ANI_ID if MP_RECOVER_ANI_ID > 0
      when 4
        self.mp += (arr[1] * mmp).to_i
        self.animation_id = MP_RECOVER_ANI_ID if MP_RECOVER_ANI_ID > 0
      when 5
        add_state(arr[1])
        anime_id = $data_states[arr[1]].crisis_add_anime
        self.animation_id = anime_id if anime_id > 0
      when 6
        remove_buff(arr[1]) if @buffs[arr[1]] < 0
        add_buff(arr[1], 1); add_buff(arr[1], eval(ADD_BUFF_TURN))
        self.animation_id = ADD_BUFF_ANI_ID if ADD_BUFF_ANI_ID > 0
      end
      @crisis_effects[@crisis_effects.index(arr)] = nil
    }
    @crisis_effects.compact!
  end
end

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ● アクターを加える
  #--------------------------------------------------------------------------
  alias fai_cecf_add_actor add_actor
  def add_actor(actor_id)
    $game_actors[actor_id].init_crisis_effects unless @actors.include?(actor_id)
    fai_cecf_add_actor(actor_id)
  end
end

class Game_Interpreter
  include FAI_CECF
  #--------------------------------------------------------------------------
  # ★ 呼び出し予約されたコモンイベントを検出/セットアップ
  #--------------------------------------------------------------------------
  alias fai_cecf_setup_reserved_common_event setup_reserved_common_event
  def setup_reserved_common_event
    if $game_temp.common_event_reserved?
      if !$game_temp.reserved_ce_battlers.empty?
        n = $game_temp.reserved_ce_battlers.shift
        $game_variables[COMMON_EVENT_VAR_ID] = n
      end
    end
    fai_cecf_setup_reserved_common_event
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ★ イベントの処理
  #--------------------------------------------------------------------------
  alias fai_cecf_process_event process_event
  def process_event
    fai_cecf_process_event
    all_battle_members.each{|a|a.check_crisis_effects}
  end
  #--------------------------------------------------------------------------
  # ★ 戦闘行動の処理
  #--------------------------------------------------------------------------
  alias fai_cecf_process_action process_action
  def process_action
    fai_cecf_process_action
    all_battle_members.each{|a|a.check_crisis_effects}
  end
end


※2018/2/28 こちらのトピックで出た不具合の修正ついでにステート個別アニメ機能追加
※2019/10/3 こちらのトピックの指摘事項(バグ修正)を反映
最後に編集したユーザー faida on 2019年10月03日(木) 22:03 [ 編集 2 回目 ]
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
nira
記事: 13
登録日時: 2016年8月23日(火) 22:07

Re: Ace 瀕死時に××

投稿記事by nira » 2016年12月10日(土) 00:40

修正ありがとうございます。

動作を確認しましたが、無事にスイッチで管理する事が出来ました。

faida様には以前もリクエストスクリプトを作ってくださったので、制作の上で非常に助かっています。
心より、感謝申し上げます。



この返信をもちまして、解決済みとさせて頂きます。

“VX / Ace:スクリプト素材のリクエスト” へ戻る