武器の形状変化スキル



スキルによって形状変化する武器を作ってみます。

※以下のモジュールが別途導入必要です。
 Window VXA

※戦闘時には使用しない方がいいです

2020:10:01
・Window VXA対応

2023:08:01
・マジックナンバーをハッシュサイズに修正
・現在選択中の武器を色変え
・形状変化ウィンドウ表示時にBボタンで戻ると自動的に一番最初の武器に戻ってしまうバグを修正

2024:03:01
・多刀流対応

#==============================================================================
# 武器の形状変化スキル By 貪藻矢射妥←
#------------------------------------------------------------------------------
# スキルによって形状変化する武器を作ってみます。
# 
# ※1ゲームプロジェクトにつき1キャラのみ形状変化ができるという仕様です
#  複数キャラに適応はできません
# 
# ※戦闘時には使用しない方がいいです
#  未検証なので・・・
# 
#==============================================================================
# 更新っぽいもの
# 
# 2020:10:01
# ・Window VXA対応
# 
# 2023:08:01
# ・マジックナンバーをハッシュサイズに修正
# ・現在選択中の武器を色変え
# ・形状変化ウィンドウ表示時にBボタンで戻ると自動的に一番最初の武器に
#  戻ってしまうバグを修正
# 
# 2024:03:01
# ・多刀流対応

module MODEL_CHANGE
  # モデルチェンジ用スキルID
  MODEL_CHG_SKILL_ID = 491
  
  # モデルチェンジ用リスト
  # 表示名と武器IDのハッシュ
  MODEL_CHG_HASH = {
    "刀" => 615, 
    "鎌" => 616, 
    "剣" => 617, 
    "槍" => 618, 
    "棍" => 619, 
    "鋒" => 620, 
    "斧" => 621
  }
  
  # 現在選択中の武器
  MODEL_CHG_SELECTED_COLOR  = Color.new(128, 255, 128, 255)
end

class Window_ModelChangeCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(160, 320, 320, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max   = MODEL_CHANGE::MODEL_CHG_HASH.length
    @column_max = MODEL_CHANGE::MODEL_CHG_HASH.length
    @commands   = MODEL_CHANGE::MODEL_CHG_HASH.keys
    refresh
    self.index = 0
    
    if $OuterFlgs["Window_BG"]
      @bg_sprite = nil
      make_bg("p_cmd_back", 220)
    end
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      color = i == $game_system.model_chg_slct ? 
        MODEL_CHANGE::MODEL_CHG_SELECTED_COLOR : normal_color
      draw_item(i, color)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    x = 4 + index * 43
    draw_shadow_text([x, 0, 64, 32], @commands[index], color)
  end
end

#==============================================================================
# ■ Game_System
#==============================================================================

class Game_System
  attr_accessor :model_chg_slct   # 現在選択中アイテム
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias model_change_initialize initialize
  def initialize
    # 元の処理を実行
    model_change_initialize

    @model_chg_slct = 0
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias model_change_main main
  def main
    # コマンドウィンドウを作成
    @model_change_window = Window_ModelChangeCommand.new
    @model_change_window.deactivate
    @model_change_window.hide
    
    model_change_main
    
    # ウィンドウを解放
    @model_change_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias model_change_update update
  def update
    # ウィンドウを更新
    @model_change_window.update
    
    model_change_update
    
    # モデルチェンジウィンドウがアクティブの場合: update_model_change を呼ぶ
    if @model_change_window.active
      update_model_change
      return
    end
  end
  
  #--------------------------------------------------------------------------
  # ● フレーム更新 (スキルウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  alias model_change_update_skill update_skill
  def update_skill
    # モデルチェンジの場合
    if @skill.id == MODEL_CHANGE::MODEL_CHG_SKILL_ID
      # 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
        @model_change_window.activate
        @model_change_window.show
        if $game_system.model_chg_slct != nil
          @model_change_window.index = $game_system.model_chg_slct
        end
        @skill_window.deactivate
      end
    else
      # もとの処理を実行
      model_change_update_skill
    end

  end
  
  #--------------------------------------------------------------------------
  # ● フレーム更新 (コマンドウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_model_change
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      Sound.play_cancel
      @model_change_window.deactivate
      @model_change_window.hide
      @skill_window.activate
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      
      actor = $game_party.actors[@actor_index]
      
      list = [actor.weapon_id]
if $OuterFlgs["Equip_Extend"] # 多刀流用
      arm_list = [actor.armor1_id, actor.armor2_id, actor.armor6_id, 
                  actor.armor3_id, actor.armor4_id, actor.armor5_id, 
                  actor.armor7_id, actor.armor8_id]
      for i in 0...actor.armors_weapon.size
        if actor.armors_weapon[i]
          list.push(arm_list[i])
        end
      end
end # $OuterFlgs["Equip_Extend"]
      
      tmp_wep_id = -1
      for i in 0...list.size
        if MODEL_CHANGE::MODEL_CHG_HASH.has_value?(list[i])
          tmp_wep_id = i
        end
      end
      
      wep_set = MODEL_CHANGE::MODEL_CHG_HASH.values
      
      # 形状変化前の武器を装備中なら実施
      if tmp_wep_id != -1
        actor.equip(tmp_wep_id, 0)
        
        # 形状変化後の武器を追加
        $game_party.gain_weapon(wep_set[@model_change_window.index], 1)
        
        # 形状変化後の装備変更
if $OuterFlgs["Equip_Extend"] # 多刀流用
        if tmp_wep_id == 0
          actor.equip(tmp_wep_id, wep_set[@model_change_window.index])
        else
          actor.equip(tmp_wep_id, wep_set[@model_change_window.index], true)
        end
else # 通常の場合
        actor.equip(tmp_wep_id, wep_set[@model_change_window.index])
end # $OuterFlgs["Equip_Extend"]
      
        # 形状変化前の装備を削減
        $game_party.lose_weapon(list[tmp_wep_id], 1)
        
        $game_system.model_chg_slct = @model_change_window.index
        
        Sound.play_ok
        # リフレッシュ
        @model_change_window.refresh
      else
        Sound.play_buzzer
      end
      
      # 以下を実施すると選択する間もなく終わっちゃうのでコメントアウト
      #@model_change_window.deactivate
      #@model_change_window.hide
      #@skill_window.activate
      return
    end
  end
end

戻る