【解決済み】エラー修正

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

【解決済み】エラー修正

投稿記事by nira » 2018年2月26日(月) 04:58

失礼致します。

以前、faida様にこちらのスクリプト(viewtopic.php?f=46&t=2666)を作って頂いたのですが、
戦闘途中で仲間を加入させ、その仲間が瀕死状態になると、each_with_indexのno methodエラーが生じます。

恐らく、戦闘開始処理でinit_crisis_effectsが実行されている為、途中で加入する仲間の処理が定義されてないと
思われます。恐縮ではありますが、このエラーを修正していただけないでしょうか?

又、こちらのスクリプト(viewtopic.php?f=46&t=1927)に関しても、スキルに設定されたMPが現在MPと同じである場合、エネミーがスキルを使用(その瞬間MPは0)してしまって、そのままエラーを吐いてしまいます。

よろしくお願いします。
最後に編集したユーザー nira on 2018年2月28日(水) 09:58 [ 編集 1 回目 ]

TOMO
記事: 171
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: エラー修正

投稿記事by TOMO » 2018年2月28日(水) 07:01

前者の方は、問題の行の前に

コード: 全て選択

init_crisis_effects if @crisis_effects.nil?
を入れれば直ると思います



後者の方は、
とりあえず前者の方と同じようにエラー内容を書いて下さい
多分Scene_Battle584行目のNoMethodErrorだと思いますが

【追記】問題があった為、スクリプトを削除しました
本来の機能の事を忘れて作ってた…
最後に編集したユーザー TOMO on 2018年2月28日(水) 17:16 [ 編集 2 回目 ]
ツクマテに投稿した私のスクリプトのいくつかを移動しました
移動先→http://tomorgss.web.fc2.com/omake1/omake1.html
faida
記事: 203
登録日時: 2015年12月17日(木) 16:44

Re: エラー修正

投稿記事by faida » 2018年2月28日(水) 09:29

大変遅くなりました。
前者は加入処理時にも瀕死効果の初期化を行うようにしました。
あと、ステート付加時のアニメーションをステートごとに指定できるようにアップデートしています。

コード: 全て選択

=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 : 戦闘途中からアクターが加入する場合のエラー修正
     ステートごとにアニメ指定できるように

=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
        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
        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
後者は「MPがちょうどなくなる時に使えるようにするのか使えないようにするのか」が判別できなかったので
とりあえずオプションで付けました。
あと、普通にHP0で倒してもMP0でない場合に復活する不具合を修正しました。

コード: 全て選択

# MP戦闘不能を持つキャラはMPがちょうど0になる場合スキルを使用できない
BATTLER_NOUSEMP_DEATH = true

class RPG::BaseItem
  def mp0_death
    return @mp0_death if !@mp0_death.nil?
    @mp0_death = (note =~ /<MP戦闘不能>/ ? true : false)
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias mp0_death_refresh refresh
  def refresh
    mp0_death_refresh
    check_mp0_death
  end
  def check_mp0_death
    if mp0_death?
      (@hp == 0 || @mp == 0) ? add_state(death_state_id) :
                               remove_state(death_state_id)
    end
  end
  def mp0_death?
    feature_objects.any?{|a|a.mp0_death}
  end
end

if BATTLER_NOUSEMP_DEATH

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● スキル使用コストの支払い可能判定
  #--------------------------------------------------------------------------
  alias mp0_death_skill_cost_payable? skill_cost_payable?
  def skill_cost_payable?(skill)
    return false if !mp0_death_skill_cost_payable?(skill)
    !mp0_death? || mp > skill_mp_cost(skill)
  end
end

else

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    mp0_death_refresh
    return if SceneManager.scene.instance_variable_get(:@subject) == self
    check_mp0_death
  end
end

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 戦闘行動終了時の処理
  #--------------------------------------------------------------------------
  alias mp0_death_process_action_end process_action_end
  def process_action_end
    @subject.check_mp0_death
    @log_window.display_changed_states(@subject)
    mp0_death_process_action_end
  end
end

end
大変どうでもいいことなのですが、TOMO様の後半のスクリプトだとMPダメージでトドメがさせないんですよね……。だから拙作はこんな変な形になってるんですが
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
nira
記事: 13
登録日時: 2016年8月23日(火) 22:07

Re: エラー修正

投稿記事by nira » 2018年2月28日(水) 09:58

TOMO様、faida様ありがとうございます。

TOMO様が書いていただいたスクリプトで前者も後者もエラーは表示されなくなりました。

また、faida様のアップデートのスクリプトでも、エラーが解消されました。

お二方のご厚意に対し、厚く御礼申し上げます。

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