#==============================================================================
# 武器の形状変化スキル 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
|