SP消費の改造



スキルの消費ポイントをMaxSPの割合、HP、MaxHPの割合で設定したい・・・ってな人にオススメ。

※以下のモジュールが別途導入必要です。
 貪藻矢射妥←ダイヤモンドベースモジュール
 VXA風SE
 Window VXA

変更点
2007:02:16
・HP消費スキルでもスキルの使用可能判定にSPが関与していたバグを修正

2007:06:28
・消費軽減属性を設定可能に・・・

2007:07:13
・消費軽減、、増加属性を設定可能に・・・
・スクリプトを微調整

2007:10:01
・HP消費スキルなどが使える場合でも、アイコンが半透明だったバグを修正

2008:09:18
・スキルのコストの色変え機能を追加
・カスタマイズポイント:色の変更

2008:11:23
・ベースモジュールを別スクリプトとして定義

2009:06:03
・スキルの使用可能判定を若干修正

2009:10:01
・コスト消費増加でも減少していたバグを修正
・ステートによる判定を追加

2010:07:17
・省エネモード、全力モードを追加

2015:10:01
・VXA風Sound対応

2016:03:01
・武器による命中精度対応

2017:11:03
・沈黙の拡張対応

2020:10:01
・Window VXA対応

2020:11:01
・他スクリプト併用時のアップデート反映
・外部フラグ追加

#==============================================================================
# ■ 特殊消費スキル By 貪藻矢射妥←
#------------------------------------------------------------------------------
#  スキルの消費SPをMaxSPの割合で消費する、あるいはHPで消費するってなヤツ
#  
#  MaxSPにおける割合もHPの場合も全てスキルのSP消費量にて設定します。
#  また、消費軽減属性を使用することでSP(HP)の消費を増減することが可能です。
#
#  ※消費軽減属性のついた防具を複数装備することでさらに消費が増加/軽減されます。
#    (故に消費『半減』、『倍増』ではなく、『軽減』、『増加』なのです。)
#
#==============================================================================
# 更新っぽいもの
# 
# 2007:02:16
# ・HP消費スキルでもスキルの使用可能判定にSPが関与していたバグを修正
# 
# 2007:06:28
# ・消費軽減属性を設定可能に・・・
# 
# 2007:07:13
# ・消費軽減、、増加属性を設定可能に・・・
# ・スクリプトを微調整
# 
# 2007:10:01
# ・HP消費スキルなどが使える場合でも、アイコンが半透明だったバグを修正
# 
# 2008:09:18
# ・スキルのコストの色変え機能を追加
# ・カスタマイズポイント:色の変更
# 
# 2009:06:03
# ・スキルの使用可能判定を若干修正
# 
# 2009:10:01
# ・コスト消費増加でも減少していたバグを修正
# ・ステートによる判定を追加
# 
# 2010:07:17
# ・省エネモード、全力モードを追加
#
# 2015:10:01
# ・VXA風Sound対応
# 
# 2016:03:01
# ・武器による命中精度対応
# 
# 2017:11:03
# ・沈黙の拡張対応
# 
# 2020:10:01
# ・Window VXA対応
# 
# 2020:11:01
# ・他スクリプト併用時のアップデート反映
# ・外部フラグ追加

$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Skill_Specialite"] = true

module ChangeSC
  include BM
  include DIAMOND
  # HP消費スキルの文字色(使用可能時)
  INDIS_RED = Color.new(255, 100, 100, MAX8BIT)
  # HP消費スキルの文字色(使用不可時)
  DIS_RED   = INDIS_RED.clone
  DIS_RED.alpha = HARF8BIT
  # スキルのコストの表示色(使用可能時)
  COSTCOLOR = Color.new(180, 240, 180, MAX8BIT)
  # スキルのコストの表示色(使用不可時)
  COSTDISCL = COSTCOLOR.clone
  COSTDISCL.alpha = HARF8BIT
  # スキルのコストの表示色色変え機能フラグ
  COSTCLFLG = true
  # SP割合消費の属性番号
  SP_P_C = 32
  # HP消費の属性番号
  HP_C   = 33
  # HP割合消費の属性番号
  HP_P_C = 34
  # 消費軽減の属性番号
  EX_RED = 27
  # 消費増加の属性番号
  EX_INC = 29
  # 消費軽減のステート番号
  ST_RED = 233
  # 消費増加のステート番号
  ST_INC = 248
  # 消費増減レート
  # [[属性による増減倍率], [ステートによる増減倍率]]
  COST_RATE = [[0.9, 1.1], [0.9, 1.2]]
  # 省エネのステート番号
  ST_ECO = 205
  # 全力のステート番号
  ST_FuP = 206
  # コストと威力の対応レート
  # [[省エネ],[全力]]
  COST_POW = [[0.85, 0.85], [1.15, 1.15]]
end


class Game_Actor < Game_Battler
  include ChangeSC
  #--------------------------------------------------------------------------
  # ● SP消費増加/軽減のレート取得
  #--------------------------------------------------------------------------
  def get_cost_rate(index, flg=0)
    case flg
    when 0
      case COST_RATE.size
      when 1
        return COST_RATE[0][index % 2]
      when 2
        return COST_RATE[index / 2][index % 2]
      else
        p "消費増減レートの設定が異常です"
      end
    when 1
      case COST_POW.size
      when 1
        return COST_POW[0][index % 2]
      when 2
        return COST_POW[index / 2][index % 2]
      else
        p "コストと威力の対応レートの設定が異常です"
      end
    else
      p "フラグが異常です。"
    end
  end
  
  #--------------------------------------------------------------------------
  # ● SP消費増加/軽減のためのアレ(アレって何さ?)
  #--------------------------------------------------------------------------
  def armor_cost_exp
    crate = 100
    # 属性防御による判定
    for i in [@armor1_id, @armor2_id, @armor6_id, @armor3_id, @armor4_id, 
              @armor5_id, @armor7_id]
      armor = $data_armors[i]
      # コスト減少
      if armor != nil and armor.guard_element_set.include?(EX_RED)
        crate /= get_cost_rate(0)
      end
      # コスト増加
      if armor != nil and armor.guard_element_set.include?(EX_INC)
        crate /= get_cost_rate(1)
      end
    end
    # ステートによる判定
    # コスト減少
    if @states.include?(ST_RED)
      crate /= get_cost_rate(2)
    end
    # コスト増加
    if @states.include?(ST_INC)
      crate /= get_cost_rate(3)
    end
    # モードによる判定
    # 省エネモード
    if self.states.include?(ST_ECO)
      crate /= get_cost_rate(0, 1)
    end
    # 全力モード
    if self.states.include?(ST_FuP)
      crate /= get_cost_rate(2, 1)
    end
    
    return crate
  end
  
  def actor_pow_rate
    crate = 100
    
    # モードによる判定
    # 省エネモード
    if self.states.include?(ST_ECO)
      crate /= get_cost_rate(1, 1)
    end
    # 全力モード
    if self.states.include?(ST_FuP)
      crate /= get_cost_rate(3, 1)
    end
    
    return crate
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● エネミーの場合無視するためのアレ(アレって何さ?)
  #--------------------------------------------------------------------------
  def armor_cost_exp
    return 100
  end
  def actor_pow_rate
    return 100
  end
end

#==============================================================================
# ■ Window_Skill
#------------------------------------------------------------------------------
#  スキル画面、バトル画面で、使用できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_Skill < Window_Selectable
  include RUBY_SYS
  include BM
  include ChangeSC
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      if skill.element_set.include?(HP_C) || skill.element_set.include?(HP_P_C)
        rootcolor = NDIS_RED
      else
        rootcolor = normal_color
      end
      cost_color = COSTCOLOR
    else
      if skill.element_set.include?(HP_C) || skill.element_set.include?(HP_P_C)
        rootcolor = DIS_RED
      else
        rootcolor = disabled_color
      end
      cost_color = COSTDISCL
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, NILCOLOR)
    bitmap = RPG::Cache.icon(skill.icon_name)
    if rootcolor == normal_color || rootcolor == INDIS_RED
      opacity = MAX8BIT
    else
      opacity = HARF8BIT
    end
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.font.color = rootcolor
    skill.name = transfer(skill.name)
    draw_ex_text(x + 28, y, skill.name, 0)
    
    rate = 1
if $OuterFlgs["Skill_Specialite"]
    crate = @actor.armor_cost_exp / 100
    rate *= crate
end # $OuterFlgs["Skill_Specialite"]
    
    if skill.element_set.include?(SP_P_C)
      @C_cost = (skill.sp_cost * @actor.maxsp / 100) / rate
    elsif skill.element_set.include?(HP_P_C)
      @C_cost = (skill.sp_cost * @actor.maxhp / 100) / rate
    else
      @C_cost = skill.sp_cost / rate
    end
    if COSTCLFLG
      self.contents.font.color = cost_color
    end
    self.contents.draw_text(x + 232, y, 48, 32, Integer(@C_cost).to_s, 2)
    self.contents.font.color = normal_color
  end
end

#==============================================================================
# ■ Game_Battler (分割定義 3)
#------------------------------------------------------------------------------
#  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================

class Game_Battler
  include DIAMOND
  include ChangeSC
  #--------------------------------------------------------------------------
  # ● スキルの真のコスト取得
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  def get_change_skill_cost(skill_id)
    rate = 1
    crate = 1
if $OuterFlgs["Skill_Specialite"]
    crate = self.armor_cost_exp / 100
    rate *= crate
end # $OuterFlgs["Skill_Specialite"]
    @cost = $data_skills[skill_id].sp_cost
    # HP割合消費の場合
    if $data_skills[skill_id].element_set.include?(HP_P_C)
      return Integer(@cost * self.maxhp / 100 / rate)
    # SP割合消費の場合
    elsif $data_skills[skill_id].element_set.include?(SP_P_C)
      return Integer(@cost * self.maxsp / 100 / rate)
    # HP/SPの通常消費の場合
    else
      return Integer(@cost / rate)
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  def skill_can_use?(skill_id)
    
    @cost = get_change_skill_cost(skill_id)
    target_of_cost = 0
    
    # 消費SP or HP が足りない場合は使用不可
    if ($data_skills[skill_id].element_set.include?(HP_C) || 
      $data_skills[skill_id].element_set.include?(HP_P_C))
      target_of_cost = self.hp
    else
      target_of_cost = self.sp
    end
    
    if (@cost > target_of_cost) && ($game_temp.counter_mode == 0 && $SilfeedArks["Special_Attack"])
      return false
    end
    
    # 戦闘不能の場合は使用不可
    if dead?
      return false
    end
    # 沈黙状態の場合、スキルは使用不可
if $OuterFlgs["Silent_Extend"]
    if !user_is_silence?(skill_id)
      return false
    end
else # 元の処理
    if $data_skills[skill_id].atk_f == 0 && self.restriction == 1
      return false
    end
end # $OuterFlgs["Silent_Extend"]
    # 使用可能時を取得
    occasion = $data_skills[skill_id].occasion
    # 戦闘中の場合
    if $game_temp.in_battle
      # [常時] または [バトルのみ] なら使用可
      return (occasion == 0 or occasion == 1)
    # 戦闘中ではない場合
    else
      # [常時] または [メニューのみ] なら使用可
      return (occasion == 0 or occasion == 2)
    end
  end
end

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

class Scene_Battle
  include ChangeSC
  include BM
  
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  def make_skill_action_result
    # スキルを取得
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # 強制アクションでなければ
    unless @active_battler.current_action.forcing or @critical_skill
      # SP 切れなどで使用できなくなった場合
      unless @active_battler.skill_can_use?(@skill.id)
        # アクション強制対象のバトラーをクリア
        $game_temp.forcing_battler = nil
        # ステップ 1 に移行
        @phase4_step = 1
        return
      end
    end
    @critical_skill = false
    rate = 1
if $OuterFlgs["Skill_Specialite"]
    crate = @active_battler.armor_cost_exp / 100
    rate *= crate
end # $OuterFlgs["Skill_Specialite"]
    
if $SilfeedArks["Special_Attack"]
    unless ( $game_temp.counter_mode >= 1 ) && ( @active_battler.counter[0] == 4 )
      # Rand_Select
      # 初回のみ実施
      if @selected_num == 0
        # SP 消費
        if @skill.element_set.include?(SP_P_C)
          @active_battler.sp -= Integer(@skill.sp_cost * @active_battler.maxsp / 100 / rate)
        elsif @skill.element_set.include?(HP_C)
          @active_battler.hp -= Integer(@skill.sp_cost / rate)
        elsif @skill.element_set.include?(HP_P_C)
          @active_battler.hp -= Integer(@skill.sp_cost * @active_battler.maxhp / 100 / rate)
        else
          @active_battler.sp -= Integer(@skill.sp_cost / rate)
        end
        # ステータスウィンドウをリフレッシュ
        @status_window.refresh
        # ヘルプウィンドウにスキル名を表示
        @help_window.set_text(@skill.name, 1)
      end
      # Rand_Select
    else
      # 当身、スキルそのまま返す場合 スキル名を元の物に
      @status_window.refresh
      @help_window.set_text($data_skills[@counter_temp].name, 1)
    end
else # 元の処理
    # SP 消費
    if @skill.element_set.include?(SP_P_C)
      @active_battler.sp -= Integer(@skill.sp_cost * @active_battler.maxsp / 100 / rate)
    elsif @skill.element_set.include?(HP_C)
      @active_battler.hp -= Integer(@skill.sp_cost / rate)
    elsif @skill.element_set.include?(HP_P_C)
      @active_battler.hp -= Integer(@skill.sp_cost * @active_battler.maxhp / 100 / rate)
    else
      @active_battler.sp -= Integer(@skill.sp_cost / rate)
    end
    # ステータスウィンドウをリフレッシュ
    @status_window.refresh
    # ヘルプウィンドウにスキル名を表示
    @help_window.set_text(@skill.name, 1)
end # $SilfeedArks["Special_Attack"]
    # アニメーション ID を設定
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # コモンイベント ID を設定
    @common_event_id = @skill.common_event_id
    # 対象側バトラーを設定
    set_target_battlers(@skill.scope)
    # Skill_Sys Add
    miss_flag = true
    # Skill_Sys End
    # スキルの効果を適用
    for target in @target_battlers
if $SilfeedArks["Special_Attack"]
      # 当身判定
      if (target.counter[2].include?(1) &&
          @skill.element_set.include?(target.counter[3])) ||
          (target.counter[2].include?(2) && @skill.int_f >= 1) || 
          (target.counter[2].include?(3) && @skill.atk_f >= 1) || 
          (target.counter[2].include?(4)) ||
          (target.counter[2].include?(5))
        target.counter[6] = true
      end
end # $SilfeedArks["Special_Attack"]
      
if $OuterFlgs["Decoy_De_Koi"]
      $game_system.act_tgt = target
end # $OuterFlgs["Decoy_De_Koi"]
      
      target.skill_effect(@active_battler, @skill)
      
    end
  end
end

#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
#  スキル画面の処理を行うクラスです。
#==============================================================================

class Scene_Skill
  include ChangeSC
  #--------------------------------------------------------------------------
  # ● フレーム更新 (スキルウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_skill
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      Sound.play_cancel
      # メニュー画面に切り替え
      $scene = Scene_Menu.new(1)
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # スキルウィンドウで現在選択されているデータを取得
      @skill = @skill_window.skill
      # 使用できない場合
      if @skill == nil or not @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        Sound.play_buzzer
        return
      end
      # 決定 SE を演奏
      Sound.play_ok
      # 効果範囲が味方の場合
      if @skill.scope >= 3
        # ターゲットウィンドウをアクティブ化
        @skill_window.deactivate
        @target_window.x = (@skill_window.index + 1) % 2 * 304
        @target_window.show
        @target_window.activate
        # 効果範囲 (単体/全体) に応じてカーソル位置を設定
        if @skill.scope == 4 || @skill.scope == 6
          @target_window.index = -1
        elsif @skill.scope == 7
          @target_window.index = @actor_index - 10
        else
          @target_window.index = 0
        end
      # 効果範囲が味方以外の場合
      else
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # スキルの使用時 SE を演奏
          $game_system.se_play(@skill.menu_se)
          
          rate = 1
if $OuterFlgs["Skill_Specialite"]
          crate = @actor.armor_cost_exp * 100
          rate *= crate
end # $OuterFlgs["Skill_Specialite"]
          
          # SP 消費
          if @skill.element_set.include?(SP_P_C)
            @actor.sp -= Integer(@skill.sp_cost * @actor.maxsp / 100 / rate)
          elsif @skill.element_set.include?(HP_C)
            @actor.hp -= Integer(@skill.sp_cost / rate)
          elsif @skill.element_set.include?(HP_P_C)
            @actor.hp -= Integer(@skill.sp_cost * @actor.maxhp / 100 / rate)
          else
            @actor.sp -= Integer(@skill.sp_cost / rate)
          end
          # 各ウィンドウの内容を再作成
          @status_window.refresh
          @skill_window.refresh
          @target_window.refresh
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    # R ボタンが押された場合
    if Input.trigger?(Input::R)
      # カーソル SE を演奏
      Sound.play_cursor
      # 次のアクターへ
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 別のスキル画面に切り替え
      $scene = Scene_Skill.new(@actor_index)
      return
    end
    # L ボタンが押された場合
    if Input.trigger?(Input::L)
      # カーソル SE を演奏
      Sound.play_cursor
      # 前のアクターへ
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 別のスキル画面に切り替え
      $scene = Scene_Skill.new(@actor_index)
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      Sound.play_cancel
      # ターゲットウィンドウを消去
      @skill_window.activate
      @target_window.hide
      @target_window.deactivate
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # SP 切れなどで使用できなくなった場合
      unless @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        Sound.play_buzzer
        return
      end
      # ターゲットが全体の場合
      if @target_window.index == -1
        # パーティ全体にスキルの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # ターゲットが使用者の場合
      if @target_window.index <= -2
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # ターゲットが単体の場合
      if @target_window.index >= 0
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # スキルを使った場合
      if used
        # スキルの使用時 SE を演奏
        $game_system.se_play(@skill.menu_se)
        
        rate = 1
if $OuterFlgs["Skill_Specialite"]
        crate = @actor.armor_cost_exp / 100
        rate *= crate
end # $OuterFlgs["Skill_Specialite"]
        
        # SP 消費
        if @skill.element_set.include?(SP_P_C)
          @actor.sp -= Integer(@skill.sp_cost * @actor.maxsp / 100 / rate)
        elsif @skill.element_set.include?(HP_C)
          @actor.hp -= Integer(@skill.sp_cost / rate)
        elsif @skill.element_set.include?(HP_P_C)
          @actor.hp -= Integer(@skill.sp_cost * @actor.maxhp / 100 / rate)
        else
          @actor.sp -= Integer(@skill.sp_cost / rate)
        end
        # 各ウィンドウの内容を再作成
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 全滅の場合
        if $game_party.all_dead?
          # ゲームオーバー画面に切り替え
          $scene = Scene_Gameover.new
          return
        end
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      # スキルを使わなかった場合
      unless used
        # ブザー SE を演奏
        #Sound.play_buzzer
      end
      return
    end
  end
end
カスタマイズポイントについて(ってか見れば分かると思いますが・・・)
INDIS_RED/DIS_RED HP消費スキルのための文字色。(HP消費スキルを分かり易くするため)
COSTCOLOR/COSTDLSCL スキルのコストの文字色。
COSTCLFLG スキルのコストの文字色を変えるか否かのフラグ
SP_P_C SP割合消費の属性番号(システムの属性の番号を代入)
HP_C HP消費の属性番号(システムの属性の番号を代入)
HP_P_C HP割合消費の属性番号(システムの属性の番号を代入)
EX_RED 消費コスト軽減属性の属性番号(システムの属性の番号を代入) 薄緑色の1番目の部分の数字を変更することでどれだけ軽減されるかを設定できます。
EX_INC 消費コスト増加属性の属性番号(システムの属性の番号を代入) 薄黄色の1番目の部分の数字を変更することでどれだけ増加されるかを設定できます。
ST_RED 消費コスト軽減ステートのステート番号(システムのステートの番号を代入) 薄緑色の2番目の部分の数字を変更することでどれだけ軽減されるかを設定できます。
ST_INC 消費コスト増加ステートのステート番号(システムのステートの番号を代入) 薄黄色の2番目の部分の数字を変更することでどれだけ増加されるかを設定できます。
COST_RATE 消費コストの増減のレートを記述 [[消費コスト軽減レート(属性), 消費コスト増加レート(属性)],  [消費コスト軽減レート(ステート), 消費コスト増加レート(ステート)]] と記載。 ※ステートでのレートが属性と同じ場合は属性の記述のみでもOKです。
ST_ECO 省エネのステート番号(システムのステートの番号を代入)
ST_FuP 全力のステート番号(システムのステートの番号を代入)
COST_POW コストと威力の対応レート [[省エネ],[全力]] 省エネの場合、全力の場合でそれぞれ消費スキルと効果がどれだけ変動するかを設定します。
※SP割合消費、HP消費、HP割合消費を同時に利用するようなスキルは設定できません。 (前回のバージョンでは出来ると書いてあったけどアレは間違いでした。) ・・・まぁ、スクリプトを変更すれば出来なくはないと思うけど・・・ ※ステートでの判定を追加したことで某ポケモンの『プレッシャー』のようなスキルが作成可能です

戻る