ボスステータスパワーアップ



ボス戦においてボスのステータスを主人公ズのステータスの平均値みたいなものを使用して底上げします。

※実は使い勝手はかなり微妙・・・

変更点
2008:04:11
 ・トループのイベントで設定をしなかった場合、次の戦闘で同じエネミーが出ると
  エラー落ちするバグを修正
 ・イベントコマンドを1つに統合

2008:10:05
 ・複数のボスとのバトル時にボスの攻撃力を低く設定できるように改良

2008:11:16
 ・装備によって勝てなくなる場合の救済っぽいものを追加
 ・カスタマイズポイントを設定

2011:03:05
・インタープリターに関数を追加することで、呼び出し関数名を省略化

2016:08:01
・エネミーステータス保存領域拡張

2017:11:03
・エネミーステータス保存領域を統合(変数削減)
・初期化されない場合でもエラー落ちしないように修正

#==============================================================================
# ボスをボス然とさせる By 貪藻矢射妥←
#------------------------------------------------------------------------------
# ボスキャラを主人公ズのレベルに応じてパワーアップさせます。
# (と、いうか、トループのイベントでボスのステータスを加算していたんだけど
#  それにTYPE74RX-T様のスクリプト、バトルのリトライ/リセットを併用すると
#  ボスキャラの能力が際限なく能力が上がることなっていた自分の不手際に対する
#  修正だったり・・・)
# 
# デフォルトで腕力、魔力、攻撃力をセーブしていますが、それ以外もセーブしたい
# 場合はご自由に増やしてください
# 
# 使用方法(トループのイベントにて・・・ターンの一番最初に行うのがベスト)
# 
# change_str(ID, def倍率, agi倍率[, atk倍率])
# 
# にてエネミーのステータスを変更します。
# 
#==============================================================================
# 更新っぽいもの
# 
# 2008:04:11
# ・トループのイベントで設定をしなかった場合、次の戦闘で同じエネミーが出ると
#  エラー落ちするバグを修正
# ・イベントコマンドを1つに統合
#
# 2008:10:05
# ・複数のボスとのバトル時にボスの攻撃力を低く設定できるように改良
#
# 2008:11:16
# ・装備によって勝てなくなる場合の救済っぽいものを追加
# ・カスタマイズポイントを設定
#
# 2011:03:05
# ・インタープリターに関数を追加することで、呼び出し関数名を省略化
# 
# 2016:08:01
# ・エネミーステータス保存領域拡張
# 
# 2017:11:03
# ・エネミーステータス保存領域を統合(変数削減)
# ・初期化されない場合でもエラー落ちしないように修正

module DIAMOND
  # レベルによる補正の最小値/最大値
  MIN_LV_F = Math.sqrt(5) / 2
  MAX_LV_F = 2 * Math.sqrt(6)
  # 防御補正値の最小値/最大値
  MIN_DEF_F = 1 / 3
  MAX_DEF_F = Math.sqrt(5)
end

class Game_System
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :Change_org_sts   # オリジナルステータス
  
  #--------------------------------------------------------------------------
  # ● ボスの能力の初期化
  #--------------------------------------------------------------------------
  def init_str(id)
    # バトルの始まりで無理だった場合の救済処置
    if @Change_org_sts[id] == nil
      @Change_org_sts[id] = [false, 0, 0, 0, 0, 0, 0, 0]
    end
    
    if @Change_org_sts[id][0] == true
      return_str(id)
    end
    
    save_str(id)
    @Change_org_sts[id][0] = true
  end
  #--------------------------------------------------------------------------
  # ● ボスのオリジナルの能力値のセーブ
  #--------------------------------------------------------------------------
  def save_str(id)
    enemy = $data_enemies[id]
    
    @Change_org_sts[id][1] = enemy.str
    @Change_org_sts[id][2] = enemy.int
    @Change_org_sts[id][3] = enemy.atk
    @Change_org_sts[id][4] = enemy.agi
    @Change_org_sts[id][5] = enemy.dex
    @Change_org_sts[id][6] = enemy.pdef
    @Change_org_sts[id][7] = enemy.mdef
  end
  #--------------------------------------------------------------------------
  # ● ボスのオリジナルの能力値のロード
  #--------------------------------------------------------------------------
  def return_str(id)
    enemy = $data_enemies[id]
    
    enemy.str  = @Change_org_sts[id][1]
    enemy.int  = @Change_org_sts[id][2]
    enemy.atk  = @Change_org_sts[id][3]
    enemy.agi  = @Change_org_sts[id][4]
    enemy.dex  = @Change_org_sts[id][5]
    enemy.pdef = @Change_org_sts[id][6]
    enemy.mdef = @Change_org_sts[id][7]
  end
  #--------------------------------------------------------------------------
  # ● ボスの能力値の変更
  #--------------------------------------------------------------------------
  def change_str(id, tdef, agi, atk=1)
    init_str(id)
    enemy = $data_enemies[id]
    
    $game_party.init_avg
    
    enemy.pdef = Integer($game_party.C_pdef_plus * tdef)
    enemy.mdef = Integer($game_party.C_mdef_plus * tdef)
    enemy.agi  = Integer($game_party.avg_agi     * agi)
    
    enemy.str += Integer($game_party.C_mdef_plus * atk)
    enemy.int += Integer($game_party.C_pdef_plus * atk)
    enemy.atk += Integer($game_party.C_mdef_plus * atk)
  end
end

class Game_Party
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :avg_lv
  attr_accessor :avg_agi
  attr_accessor :avg_pdef
  attr_accessor :avg_mdef
  attr_accessor :C_pdef_plus
  attr_accessor :C_mdef_plus
  attr_accessor :C_lv_plus
  
  #--------------------------------------------------------------------------
  # ● 主人公ズの能力値の平均値をリセット+
  #--------------------------------------------------------------------------
  def init_avg
    @avg_lv      = 0
    @avg_pdef    = 0
    @avg_mdef    = 0
    @avg_agi     = 0
    @C_pdef_plus = 0
    @C_mdef_plus = 0
    
    avg_set
  end
  include DIAMOND
  #--------------------------------------------------------------------------
  # ● 主人公ズの能力値の平均値を算出
  #--------------------------------------------------------------------------
  def avg_set
    pas = $game_party.actors.size
    for i in 0...pas
      @avg_lv   += @actors[i].level
      @avg_pdef += @actors[i].pdef
      @avg_mdef += @actors[i].mdef
      @avg_agi  += @actors[i].agi
    end
    
    @avg_lv   /= pas
    @avg_pdef /= pas
    @avg_mdef /= pas
    @avg_agi  /= pas
    
    log10_avg_lv = Math.log10(@avg_lv)
    sqr5 = Math.sqrt(5)
    @C_lv_plus = [[log10_avg_lv * 2 - Math::E,  MIN_LV_F].max,  MAX_LV_F].min
    def_factor = [[log10_avg_lv - Math.sqrt(2), MIN_DEF_F].max, MAX_DEF_F].min

    if @avg_pdef / @avg_mdef < 1.5
      @C_pdef_plus = Integer(@avg_pdef * @C_lv_plus * def_factor)
      @C_mdef_plus = Integer(@avg_mdef * @C_lv_plus)
    else
      @C_pdef_plus = Integer(@avg_pdef * @C_lv_plus)
      @C_mdef_plus = Integer(@avg_mdef * @C_lv_plus * def_factor)
    end
  end
end

#==============================================================================
# ■ Scene_Battle (分割定義 1)
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_diamond_boss_hyper main
  def main
    if $game_system.Change_org_sts == nil
      $game_system.Change_org_sts = Array.new(1000)
      $game_system.Change_org_sts[0] = false
    end
    # 初期化
    for enemy in $game_troop.enemies
      if $game_system.Change_org_sts[enemy.id] == nil
        $game_system.Change_org_sts[enemy.id] = [false, 0, 0, 0, 0, 0, 0, 0]
      end
    end
    
    main_diamond_boss_hyper
  end
  #--------------------------------------------------------------------------
  # ● バトル終了
  #     result : 結果 (0:勝利 1:敗北 2:逃走)
  #--------------------------------------------------------------------------
  alias battle_end_diamond_boss_hyper battle_end
  def battle_end(result)
    for enemy in $game_troop.enemies
      if $game_system.Change_org_sts[enemy.id]!= nil && $game_system.Change_org_sts[enemy.id][0] == true
        $game_system.return_str(enemy.id)
        $game_system.Change_org_sts[enemy.id][0] = false
      end
    end
    
    battle_end_diamond_boss_hyper(result)
  end
end

class Interpreter
  #--------------------------------------------------------------------------
  # ● ボスの能力値の変更
  #--------------------------------------------------------------------------
  def change_str(id, tdef, agi, atk=1)
    if id.is_a?(Numeric) && tdef.is_a?(Numeric) && agi.is_a?(Numeric) && 
      atk.is_a?(Numeric)
      $game_system.change_str(id, tdef, agi, atk)
    else
      p "入力パラメーターが不正です。"
    end
  end
end
トループのイベントにて change_str(エネミーID, def倍率, agi倍率[, atk倍率]) ※atk倍率は省略できます。(省略すると1が入る) を実行してください。 ↓実行例↓ ちなみに、ボスのステータスを底上げする値の計算式は・・・ レベルによる補正:MIN_LV_F < log10パーティーの平均レベル × 2 - e < MAX_LV_F 物理防御補正  :Int(パーティーの平均物理防御 × レベルによる補正) 魔法防御補正  :Int(パーティーの平均魔法防御 × レベルによる補正) をベースに ボスの物理防御:物理防御補正 × def倍率 ボスの魔法防御:魔法防御補正 × def倍率 ボスの敏捷性 :パーティーの平均捷性 × agi倍率 ボスの腕力  :魔法防御補正 × atk倍率 ボスの魔力  :物理防御補正 × atk倍率 ボスの攻撃力 :魔法防御補正 × atk倍率 としています。 (余談だけどボスの攻撃力にも防御力を用いているのは相手の防御を貫いて攻撃を当てるためとか・・・  武器を弱くすれば勝てるんだろ?とかいう思わくを外させるためだったり・・・また、敏捷性だけ平均値じゃ  ないのはボスはボスらしく味方パーティーを圧倒するスピードで攻撃を繰り出してほしいからです。) ↑じゃ、防具を外せばその分弱くなるのか・・・と問われたら・・・いや、なるとは思うけど・・・  ダメージはそんなに変わらない気が・・・ 上記の式が気に入らなかったら変更してください。

戻る