1082 lines
38 KiB
Ruby
1082 lines
38 KiB
Ruby
#==============================================================================
|
||
# ■ RGSS3 装備拡張&装備拡張画面 Ver1.09 by 星潟
|
||
#------------------------------------------------------------------------------
|
||
# Scene_Equip等を大幅に変更し、装備拡張を実現します。
|
||
# なるべく、素材スクリプト欄の上側に挿入してください。
|
||
# 相当な量の設定項目がありますのでご注意下さい。
|
||
# また、SHIFTキーで装備解除を行えるようになっています。(無効にする事も出来ます)
|
||
# 最強装備・全て外す等を選択する為のコマンドウィンドウについては
|
||
# 「不要・画面描写上の無駄・無駄な操作が増える」と判断した為、消去しています。
|
||
#
|
||
# このスクリプト導入時、以下のイベントスクリプトが使用可能になります。
|
||
#
|
||
# ch_eq(a, b, c)
|
||
#
|
||
# =>アクターナンバーaの装備スロットb番をアイテムcに変更する。
|
||
# (装備スロットは武器を0番とする)
|
||
#
|
||
# ar_eq(a)
|
||
#
|
||
# =>アクターナンバーaの装備を全て解除する。
|
||
#
|
||
# また、導入後は導入前のセーブデータを使用する事が基本的に出来なくなります。
|
||
# この為、未配布のゲームに導入される事を強くお勧めします。
|
||
#
|
||
#
|
||
# スクリプト製作者から二言ほど。
|
||
#
|
||
# いらぬお節介でしょうが、表示項目を増やせるからといって
|
||
# 増やせるだけ増やせばいいというものではありません。
|
||
# プレイして下さる方の事を考えた上で、必要な物を取捨選択して下さい。
|
||
#
|
||
# また、本スクリプトを配布している場所にも書いてあると思いますが
|
||
# 不具合報告は受け付けますが、要望については基本的に受け付けません。
|
||
# 更に変更したい場合は、自力でスクリプトを書き換えてください。
|
||
#
|
||
# Ver1.01 不要な記述二点を消去しました。
|
||
# 設定項目に変更はないので、基本カスタマイズ項目を丸ごと
|
||
# 旧Verから上書きしていただければ、Ver1.00での設定は生かせます。
|
||
#
|
||
# Ver1.02 属性有効度・ステート有効度の表示不具合を修正しました。
|
||
#
|
||
# Ver1.03 大量のスロットを用意した際、一定数以上は表示されなくなる不具合を修正。
|
||
# スロットタイプの判定を大きく修正し、動作を軽量化。
|
||
# 装備タイプの名称決定方式を変更。
|
||
# 旧Verから上書きしていただければ、装備タイプの名称以外は生かせます。
|
||
#
|
||
# Ver1.04 通常アイテムが含まれていた場合にエラーが出る致命的不具合の修正。
|
||
#
|
||
# Ver1.05 特殊能力値の表示を変更しました。
|
||
#
|
||
# Ver1.06 装備解除処理を変更しました。
|
||
# また、競合の都合上コマンドウィンドウの追加処理を行いました。
|
||
# (ただし実際には表示されません)
|
||
#
|
||
# Ver1.07 プチ軽量化を行いしました。
|
||
# 指定した能力の装備後の状態の優劣判定を逆転させる機能を追加しました。
|
||
# デフォルトでMP消費率・物理ダメージ率・魔法ダメージ率を設定しています。
|
||
# その他、物理ダメージ率・魔法ダメージ率の設定名を変更しました。
|
||
#
|
||
# Ver1.08 一部処理を差し戻し。
|
||
#
|
||
# Ver1.09 ステート無効関連・ページ送り関連の処理が異常だった為修正しました。
|
||
# 装備項目増加前のセーブデータをロードした場合でも
|
||
# 装備変更時にエラーにならないように対策しました。
|
||
# 640×480の画面サイズも想定し、設定を見直しました。
|
||
#==============================================================================
|
||
|
||
module EQ_EX
|
||
|
||
#==============================================================================
|
||
#★★★基本カスタマイズ項目はここからです★★★
|
||
#==============================================================================
|
||
|
||
#==============================================================================
|
||
#★装備拡張の為の設定を行います★
|
||
#==============================================================================
|
||
|
||
#装備タイプ設定の為に使用する設定用ワード
|
||
#<装備タイプ:5>、<装備タイプ:8>等と防具のメモ欄に書き込むことで
|
||
#その防具の装備タイプを内部的に変更する事が出来ます。
|
||
#なお、盾だろうと鎧だろうと、メモ欄の装備タイプが優先されます。
|
||
|
||
WORD = "装備タイプ"
|
||
|
||
#通常時の腕装備(デフォルトでは武器・盾)
|
||
|
||
SLT_ARM1 = [0, 1]
|
||
|
||
#二刀流時の腕装備(デフォルトでは武器・武器)
|
||
|
||
SLT_ARM2 = [0, 0]
|
||
|
||
#防具(デフォルトでは頭・身体・装飾品)
|
||
|
||
SLT_ARMOR = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13,14,15]
|
||
|
||
#装備タイプ別の名称を5番から順番に指定します。
|
||
#(1番:盾~4番:装飾品で、それ以降の追加スロットについての名称設定です)
|
||
|
||
SLT_NAME = ["Uterus","Anal","Communicator","Lower","Upper","Shot","Blade",
|
||
"Deco L","Deco R","Amulet","Deco S"]
|
||
|
||
#==============================================================================
|
||
#★装備ステータスウィンドウにおける表示項目をページ別に設定します★
|
||
#==============================================================================
|
||
|
||
#使用数ページ数の定義と、各ページに表示するステータス項目設定を行ってください。
|
||
# 0~7 基本能力値(最大HP~運)
|
||
#
|
||
# 8~17 追加能力値(命中率~TP再生率)
|
||
#
|
||
# 18~27 特殊能力値(狙われ率~経験値効率)
|
||
#
|
||
# 1001~2000 ステータス有効度(ステートID順 例.戦闘不能……1001 混乱……1005)
|
||
#
|
||
# 2001~3000 属性有効度(属性ID順 例.物理……2001 炎……2003)
|
||
#
|
||
# 3001~3008 弱体有効度(最大HP~運)
|
||
|
||
#ページ最大数
|
||
|
||
ESP_MAX = 6
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ1
|
||
|
||
ES_MAX = [0, 1, 2, 3, 4, 5, 6, 7,]
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ2
|
||
|
||
ES_MAX2 = [12, 13, 14, 15, 16, 17, 18, 19]
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ3
|
||
|
||
ES_MAX3 = [20, 21, 22, 23, 24, 25, 26, 27]
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ4
|
||
|
||
ES_MAX4 = [2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ5
|
||
|
||
ES_MAX5 = [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008]
|
||
|
||
#装備ステータスウィンドウ表示項目設定 ページ6
|
||
|
||
ES_MAX6 = [3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008]
|
||
|
||
#装備ステータスウィンドウの各項目の装備後のデータにおいて
|
||
#高い場合と低い場合、どちらを優位と見なすか
|
||
#(デフォルトではMP消費率、物理ダメージ率、魔法ダメージ率を対象)
|
||
|
||
ES_REV = [22,24,25]
|
||
|
||
#==============================================================================
|
||
#★装備ステータスウィンドウについて、表示形式を決定します★
|
||
#==============================================================================
|
||
|
||
#装備ステータスウィンドウフォントサイズ
|
||
|
||
ESFS = 23
|
||
|
||
#装備ステータスウィンドウ桁数(横)
|
||
|
||
ES_CLM = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)(名前欄も1行と見なす)
|
||
|
||
ES_LM = 6
|
||
|
||
#装備ステータスウィンドウ桁数(横)2ページ目
|
||
|
||
ES_CLM2 = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)2ページ目(名前欄も1行と見なす)
|
||
|
||
ES_LM2 = 5
|
||
|
||
#装備ステータスウィンドウ桁数(横)3ページ目
|
||
|
||
ES_CLM3 = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)3ページ目(名前欄も1行と見なす)
|
||
|
||
ES_LM3 = 5
|
||
|
||
#装備ステータスウィンドウ桁数(横)4ページ目
|
||
|
||
ES_CLM4 = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)4ページ目(名前欄も1行と見なす)
|
||
|
||
ES_LM4 = 5
|
||
|
||
#装備ステータスウィンドウ桁数(横)5ページ目
|
||
|
||
ES_CLM5 = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)5ページ目(名前欄も1行と見なす)
|
||
|
||
ES_LM5 = 5
|
||
|
||
#装備ステータスウィンドウ桁数(横)6ページ目
|
||
|
||
ES_CLM6 = 2
|
||
|
||
#装備ステータスウィンドウ桁数(縦)6ページ目(名前欄も1行と見なす)
|
||
|
||
ES_LM6 = 5
|
||
|
||
#ステータスの項目名描画開始位置と現在値描画開始位置の間
|
||
|
||
SNWD1 = 84
|
||
|
||
#ステータスの項目名矢印の位置
|
||
|
||
SNWD2 = 117
|
||
|
||
#ステータスの項目名描画開始位置と変更値描画開始位置の間
|
||
|
||
SNWD3 = 140
|
||
|
||
#ページ切り替えに使用するキーを設定します。使用しない場合はnilにして下さい。
|
||
|
||
ESP_KEY = :nil
|
||
|
||
#==============================================================================
|
||
#★装備品表示ウィンドウについて、表示形式を決定します★
|
||
#==============================================================================
|
||
|
||
#装備品ウィンドウフォントサイズ
|
||
|
||
EQFS = 23
|
||
|
||
#装備品ウィンドウ桁数(横)
|
||
|
||
EW_LM = 2
|
||
|
||
#装備品ウィンドウ桁数(縦)
|
||
|
||
EW_CLM = 4
|
||
|
||
#装備品の項目名描画開始位置とアイテム名描画開始位置の間
|
||
|
||
ENWD = 50
|
||
|
||
#装備解除に使用するキーを設定します。使用しない場合はnilにして下さい。
|
||
|
||
ER_KEY = :nil
|
||
|
||
end
|
||
|
||
#==============================================================================
|
||
#★ステータスの名前を追加定義します★
|
||
#==============================================================================
|
||
|
||
module Vocab
|
||
|
||
#命中率の名称を定義します。
|
||
|
||
X_0 = ""
|
||
|
||
#回避率の名称を定義します。
|
||
|
||
X_1 = ""
|
||
|
||
#会心率の名称を定義します。
|
||
|
||
X_2 = ""
|
||
|
||
#会心回避率の名称を定義します。
|
||
|
||
X_3 = ""
|
||
|
||
#魔法回避率の名称を定義します。
|
||
|
||
X_4 = "魔回率"
|
||
|
||
#魔法反射率の名称を定義します。
|
||
|
||
X_5 = "魔反率"
|
||
|
||
#反撃率の名称を定義します。
|
||
|
||
X_6 = "反撃率"
|
||
|
||
#HP再生率の名称を定義します。
|
||
|
||
X_7 = "H自回"
|
||
|
||
#MP再生率の名称を定義します。
|
||
|
||
X_8 = "M自回"
|
||
|
||
#TP再生率の名称を定義します。
|
||
|
||
X_9 = "T自回"
|
||
|
||
#狙われ率の名称を定義します。
|
||
|
||
X_10 = "狙われ率"
|
||
|
||
#防御効果率の名称を定義します。
|
||
|
||
X_11 = "防御強化"
|
||
|
||
#回復効果率の名称を定義します。
|
||
|
||
X_12 = "回復強化"
|
||
|
||
#薬の知識の名称を定義します。
|
||
|
||
X_13 = "薬の知識"
|
||
|
||
#MP消費率の名称を定義します。
|
||
|
||
X_14 = "M消費率"
|
||
|
||
#TPチャージ率の名称を定義します。
|
||
|
||
X_15 = "TP増幅"
|
||
|
||
#物理ダメージ率の名称を定義します。
|
||
|
||
X_16 = "物理D率"
|
||
|
||
#魔法ダメージ率の名称を定義します。
|
||
|
||
X_17 = "魔法D率"
|
||
|
||
#床ダメージ率の名称を定義します。
|
||
|
||
X_18 = "床D軽減"
|
||
|
||
#経験値効率の名称を定義します。
|
||
|
||
X_19 = "経験増幅"
|
||
|
||
#MP下降の名称を定義します。
|
||
|
||
Xd_0 = "HP下降"
|
||
|
||
#MP下降の名称を定義します。
|
||
|
||
Xd_1 = "MP下降"
|
||
|
||
#攻撃下降の名称を定義します。
|
||
|
||
Xd_2 = "攻撃下降"
|
||
|
||
#防御下降の名称を定義します。
|
||
|
||
Xd_3 = "防御下降"
|
||
|
||
#魔法下降の名称を定義します。
|
||
|
||
Xd_4 = "魔法下降"
|
||
|
||
#魔防下降の名称を定義します。
|
||
|
||
Xd_5 = "魔防下降"
|
||
|
||
#敏捷下降の名称を定義します。
|
||
|
||
Xd_6 = "敏捷下降"
|
||
|
||
#運下降の名称を定義します。
|
||
|
||
Xd_7 = "運下降"
|
||
|
||
end
|
||
|
||
#==============================================================================
|
||
#★★★基本カスタマイズ項目はここまでです。お疲れ様でした★★★
|
||
#==============================================================================
|
||
|
||
module Vocab
|
||
def self.xparam(param_id)
|
||
case param_id
|
||
when 0
|
||
X_0
|
||
when 1
|
||
X_1
|
||
when 2
|
||
X_2
|
||
when 3
|
||
X_3
|
||
when 4
|
||
X_4
|
||
when 5
|
||
X_5
|
||
when 6
|
||
X_6
|
||
when 7
|
||
X_7
|
||
when 8
|
||
X_8
|
||
when 9
|
||
X_9
|
||
end
|
||
end
|
||
def self.sparam(param_id)
|
||
case param_id
|
||
when 0
|
||
X_10
|
||
when 1
|
||
X_11
|
||
when 2
|
||
X_12
|
||
when 3
|
||
X_13
|
||
when 4
|
||
X_14
|
||
when 5
|
||
X_15
|
||
when 6
|
||
X_16
|
||
when 7
|
||
X_17
|
||
when 8
|
||
X_18
|
||
when 9
|
||
X_19
|
||
end
|
||
end
|
||
def self.debuff_rate(param_id)
|
||
case param_id
|
||
when 0
|
||
Xd_0
|
||
when 1
|
||
Xd_1
|
||
when 2
|
||
Xd_2
|
||
when 3
|
||
Xd_3
|
||
when 4
|
||
Xd_4
|
||
when 5
|
||
Xd_5
|
||
when 6
|
||
Xd_6
|
||
when 7
|
||
Xd_7
|
||
end
|
||
end
|
||
def self.etype(etype_id)
|
||
return $data_system.terms.etypes[etype_id] if etype_id < 5
|
||
EQ_EX::SLT_NAME[etype_id - 5]
|
||
end
|
||
end
|
||
class RPG::EquipItem < RPG::BaseItem
|
||
def etype_id
|
||
@true_etype_id ||= /<#{EQ_EX::WORD}[::](\d+)>/ =~ note ? $1.to_i : @etype_id
|
||
end
|
||
end
|
||
class Game_System
|
||
#--------------------------------------------------------------------------
|
||
# ロード後の処理
|
||
#--------------------------------------------------------------------------
|
||
alias on_after_load_equips_nil_break on_after_load
|
||
def on_after_load
|
||
on_after_load_equips_nil_break
|
||
$data_actors.size.times {|i|
|
||
a = $game_actors[i]
|
||
a.equips_nil_break if a}
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Game_Actor
|
||
#==============================================================================
|
||
class Game_Actor < Game_Battler
|
||
#--------------------------------------------------------------------------
|
||
# 装備スロットの配列を取得
|
||
#--------------------------------------------------------------------------
|
||
def equip_slots
|
||
(dual_wield? ? EQ_EX::SLT_ARM2 : EQ_EX::SLT_ARM1) + EQ_EX::SLT_ARMOR
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備品オブジェクトの配列取得
|
||
#--------------------------------------------------------------------------
|
||
def equips_nil_break
|
||
equip_slots.size.times {|i| @equips[i] = Game_BaseItem.new unless @equips[i]}
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Window_SEI
|
||
#------------------------------------------------------------------------------
|
||
# 装備画面で、装備中のアイテムと、選択中のアイテムを表示するウィンドウです。
|
||
#==============================================================================
|
||
class Window_SEI < Window_Base
|
||
attr_accessor :actor # 装備種類
|
||
attr_accessor :e_type # 装備種類
|
||
attr_accessor :equip1 # 装備中アイテム
|
||
attr_accessor :equip2 # 装備対象アイテム
|
||
#--------------------------------------------------------------------------
|
||
# オブジェクト初期化
|
||
#--------------------------------------------------------------------------
|
||
def initialize(x, y)
|
||
super(x, y, window_width, window_height)
|
||
@equip1 = nil
|
||
@equip2 = nil
|
||
@e_type = nil
|
||
refresh
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ウィンドウ幅の取得
|
||
#--------------------------------------------------------------------------
|
||
def window_width
|
||
Graphics.width
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ウィンドウ高さの取得
|
||
#--------------------------------------------------------------------------
|
||
def window_height
|
||
48
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# リフレッシュ
|
||
#--------------------------------------------------------------------------
|
||
def refresh
|
||
contents.clear
|
||
draw_item(0, 0, @equip1, @equip2)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 項目の描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_item(x, y, item1, item2)
|
||
if e_type != nil
|
||
draw_e_type(4, y, @e_type)
|
||
draw_e_item_name(70, y, item1)
|
||
draw_right_arrow(contents_width / 2 + 24, y)
|
||
draw_current_item_param(contents_width / 2 + 48, y, item2)
|
||
end
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備スロットの名前を取得
|
||
#--------------------------------------------------------------------------
|
||
def slot_name(index)
|
||
@actor ? Vocab::etype(@actor.equip_slots[index]) : ""
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備スロットの名前を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_e_type(x, y, e_type)
|
||
change_color(system_color)
|
||
draw_text(x, y, 60, line_height, slot_name(e_type))
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 現在の装備品を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_e_item_name(x, y, equip1)
|
||
draw_item_name(equip1, x + 10, y, enabled = true)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 選択中の装備品を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_current_item_param(x, y, equip2)
|
||
draw_item_name(equip2, x + 10, y, enabled = true)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 右向き矢印を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_right_arrow(x, y)
|
||
change_color(system_color)
|
||
draw_text(x, y, 22, line_height, "→", 1)
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Window_EquipStatus
|
||
#------------------------------------------------------------------------------
|
||
# 装備画面で、アクターの能力値変化を表示するウィンドウです。
|
||
#==============================================================================
|
||
|
||
class Window_EquipStatus < Window_Base
|
||
attr_reader :item_window # アイテムウィンドウ
|
||
attr_accessor :page_data # アイテムウィンドウ
|
||
#--------------------------------------------------------------------------
|
||
# オブジェクト初期化
|
||
#--------------------------------------------------------------------------
|
||
alias initialize_exeq initialize
|
||
def initialize(x, y)
|
||
@page_data = 0
|
||
initialize_exeq(x, y)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ウィンドウ幅の取得
|
||
#--------------------------------------------------------------------------
|
||
def window_width
|
||
Graphics.width
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ウィンドウ高さの取得
|
||
#--------------------------------------------------------------------------
|
||
def window_height
|
||
fitting_height(visible_line_number)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 桁数の取得
|
||
#--------------------------------------------------------------------------
|
||
def col_max
|
||
case @page_data
|
||
when 0;EQ_EX::ES_CLM
|
||
when 1;EQ_EX::ES_CLM2
|
||
when 2;EQ_EX::ES_CLM3
|
||
when 3;EQ_EX::ES_CLM4
|
||
when 4;EQ_EX::ES_CLM5
|
||
when 5;EQ_EX::ES_CLM6
|
||
end
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 表示行数の取得
|
||
#--------------------------------------------------------------------------
|
||
def visible_line_number
|
||
case @page_data
|
||
when 0;EQ_EX::ES_LM
|
||
when 1;EQ_EX::ES_LM2
|
||
when 2;EQ_EX::ES_LM3
|
||
when 3;EQ_EX::ES_LM4
|
||
when 4;EQ_EX::ES_LM5
|
||
when 5;EQ_EX::ES_LM6
|
||
end
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# リフレッシュ
|
||
#--------------------------------------------------------------------------
|
||
def refresh
|
||
contents.clear
|
||
draw_actor_name(@actor, 4, 0) if @actor
|
||
case @page_data
|
||
when 0;data = EQ_EX::ES_MAX
|
||
when 1;data = EQ_EX::ES_MAX2
|
||
when 2;data = EQ_EX::ES_MAX3
|
||
when 3;data = EQ_EX::ES_MAX4
|
||
when 4;data = EQ_EX::ES_MAX5
|
||
when 5;data = EQ_EX::ES_MAX6
|
||
end
|
||
lm = 0
|
||
vlm = 0
|
||
plm = visible_line_number
|
||
pclm = col_max
|
||
self.contents.font.size = EQ_EX::ESFS
|
||
data.each {|p_i|
|
||
vlm += 1
|
||
if vlm == plm
|
||
vlm = 1
|
||
lm += 1
|
||
end
|
||
draw_item((window_width - 32) / pclm * lm, line_height * (vlm), p_i)}
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 項目の描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_item(x, y, param_id)
|
||
draw_param_name(x + 4, y, param_id)
|
||
draw_current_param(x + EQ_EX::SNWD1, y, param_id) if @actor
|
||
draw_right_arrow(x + EQ_EX::SNWD2, y)
|
||
draw_new_param(x + EQ_EX::SNWD3, y, param_id) if @temp_actor
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 能力値の名前を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_param_name(x, y, param_id)
|
||
change_color(system_color)
|
||
if param_id > 3000
|
||
pid = param_id - 3001
|
||
d = Vocab::debuff_rate(pid)
|
||
elsif param_id > 2000
|
||
pid = param_id - 2000
|
||
d = $data_system.elements[pid]
|
||
elsif param_id > 1000
|
||
pid = param_id - 1000
|
||
d = $data_states[pid].name
|
||
elsif param_id > 17
|
||
pid = param_id - 18
|
||
d = Vocab::sparam(pid)
|
||
elsif param_id > 7
|
||
pid = param_id - 8
|
||
d = Vocab::xparam(pid)
|
||
else
|
||
d = Vocab::param(param_id)
|
||
end
|
||
draw_text(x, y, 80, line_height, d)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 現在の能力値を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_current_param(x , y, param_id)
|
||
change_color(normal_color)
|
||
if param_id > 3000
|
||
pid = param_id - 3001
|
||
d = ((@actor.debuff_rate(pid) * -1 + 1) * 100).round
|
||
elsif param_id > 2000
|
||
pid = param_id - 2000
|
||
d = ((@actor.element_rate(pid) * -1 + 1) * 100).round
|
||
elsif param_id > 1000
|
||
pid = param_id - 1000
|
||
d = @actor.state_resist?(pid) ? "無効" : ((@actor.state_rate(pid) * -1 + 1) * 100).round
|
||
elsif param_id > 17
|
||
pid = param_id - 18
|
||
d = ((@actor.sparam(pid) * 100)).round
|
||
elsif param_id > 7
|
||
pid = param_id - 8
|
||
d = (@actor.xparam(pid) * 100).round
|
||
else
|
||
d = @actor.param(param_id)
|
||
end
|
||
draw_text(x-32 +32 , y, 64, line_height, d, 2)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 右向き矢印を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_right_arrow(x, y)
|
||
change_color(system_color)
|
||
draw_text(x, y + 2000, 22, line_height, "→", 1)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備変更後の能力値を描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_new_param(x, y, param_id)
|
||
rev = EQ_EX::ES_REV.include?(param_id)
|
||
if param_id > 3000
|
||
pid = param_id - 3001
|
||
d1 = @temp_actor.debuff_rate(pid) * -1 + 1
|
||
d2 = @actor.debuff_rate(pid) * -1 + 1
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
d3 = (d1 * 100).round
|
||
elsif param_id > 2000
|
||
pid = param_id - 2000
|
||
d1 = @temp_actor.element_rate(pid) * -1 + 1
|
||
d2 = @actor.element_rate(pid) * -1 + 1
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
d3 = (d1 * 100).round
|
||
elsif param_id > 1000
|
||
pid = param_id - 1000
|
||
if @temp_actor.state_resist?(pid)
|
||
if @actor.state_resist?(pid)
|
||
c = normal_color
|
||
else
|
||
c = rev ? power_down_color : power_up_color
|
||
end
|
||
d3 = "無効"
|
||
else
|
||
d1 = @temp_actor.state_rate(pid) * -1 + 1
|
||
d2 = @actor.state_rate(pid) * -1 + 1
|
||
if @actor.state_resist?(pid)
|
||
c = rev ? power_up_color : power_down_color
|
||
else
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
end
|
||
d3 = (d1 * 100).round
|
||
end
|
||
elsif param_id > 17
|
||
pid = param_id - 18
|
||
d1 = @temp_actor.sparam(pid)
|
||
d2 = @actor.sparam(pid)
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
d3 = (d1 * 100).round
|
||
elsif param_id > 7
|
||
pid = param_id - 8
|
||
d1 = @temp_actor.xparam(pid)
|
||
d2 = @actor.xparam(pid)
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
d3 = (d1 * 100).round
|
||
else
|
||
d1 = @temp_actor.param(param_id)
|
||
d2 = @actor.param(param_id)
|
||
c = param_change_color((d1 - d2) * (rev ? -1 : 1))
|
||
d3 = d1
|
||
end
|
||
change_color(c)
|
||
draw_text(x-32, y + 2000, 64, line_height, d3, 2)
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Window_EquipSlot
|
||
#------------------------------------------------------------------------------
|
||
# 装備画面で、アクターが現在装備しているアイテムを表示するウィンドウです。
|
||
#==============================================================================
|
||
|
||
class Window_EquipSlot < Window_Selectable
|
||
attr_reader :index # 装備種類
|
||
#--------------------------------------------------------------------------
|
||
# 表示行数の取得
|
||
#--------------------------------------------------------------------------
|
||
def visible_line_number
|
||
EQ_EX::EW_CLM + 1
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 桁数の取得
|
||
#--------------------------------------------------------------------------
|
||
def col_max
|
||
EQ_EX::EW_LM
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 項目の描画
|
||
#--------------------------------------------------------------------------
|
||
def draw_item(index)
|
||
return unless @actor
|
||
self.contents.font.size = EQ_EX::EQFS
|
||
rect = item_rect_for_text(index)
|
||
change_color(system_color, enable?(index))
|
||
draw_text(rect.x, rect.y, 60, line_height, slot_name(index))
|
||
draw_item_name(@actor.equips[index], rect.x + EQ_EX::ENWD + 10 , rect.y, enable?(index))
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備品の解除
|
||
#--------------------------------------------------------------------------
|
||
def process_release
|
||
if !@actor.equip_change_ok?(index)
|
||
Sound.play_buzzer
|
||
return false
|
||
end
|
||
return if @actor.equips[index] == nil
|
||
Sound.play_equip
|
||
@actor.change_equip(index, nil)
|
||
refresh
|
||
@item_window.refresh
|
||
@status_window.refresh
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ステータスウィンドウページチェンジ
|
||
#--------------------------------------------------------------------------
|
||
def p_change
|
||
return unless self.active
|
||
Sound.play_cursor
|
||
if @status_window.page_data == EQ_EX::ESP_MAX - 1
|
||
@status_window.page_data = 0
|
||
else
|
||
@status_window.page_data += 1
|
||
end
|
||
@status_window.refresh
|
||
end
|
||
alias refresh_ex_eq refresh
|
||
def refresh
|
||
create_contents
|
||
refresh_ex_eq
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Scene_Equip
|
||
#------------------------------------------------------------------------------
|
||
# 装備画面の処理を行うクラスです。
|
||
#==============================================================================
|
||
|
||
class Scene_Equip < Scene_MenuBase
|
||
#--------------------------------------------------------------------------
|
||
# 開始処理
|
||
#--------------------------------------------------------------------------
|
||
def start
|
||
super
|
||
create_help_window
|
||
create_status_window
|
||
create_command_window
|
||
create_sei_window
|
||
create_slot_window
|
||
create_item_window
|
||
@command_window.x = Graphics.width * 2
|
||
@command_window.deactivate
|
||
@command_window.visible = false
|
||
@command_window.close
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備品及び現在選択中の装備品表示用ウィンドウの作成
|
||
#--------------------------------------------------------------------------
|
||
def create_sei_window
|
||
@sei_window = Window_SEI.new(0, @help_window.height + @status_window.height)
|
||
@sei_window.viewport = @viewport
|
||
@sei_window.visible = false
|
||
@sei_window.actor = @actor
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ステータスウィンドウの作成
|
||
#--------------------------------------------------------------------------
|
||
def create_status_window
|
||
@status_window = Window_EquipStatus.new(0, @help_window.height)
|
||
@status_window.viewport = @viewport
|
||
@status_window.actor = @actor
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スロットウィンドウの作成
|
||
#--------------------------------------------------------------------------
|
||
def create_slot_window
|
||
wx = 0
|
||
wy = @status_window.y + @status_window.height
|
||
ww = Graphics.width
|
||
@slot_window = Window_EquipSlot.new(wx, wy, ww)
|
||
@slot_window.height = Graphics.height - wy
|
||
@slot_window.viewport = @viewport
|
||
@slot_window.help_window = @help_window
|
||
@slot_window.status_window = @status_window
|
||
@slot_window.actor = @actor
|
||
@slot_window.set_handler(:ok, method(:on_slot_ok))
|
||
@slot_window.set_handler(:release, method(:off_slot_ok))
|
||
@slot_window.set_handler(:pagechange, method(:p_change))
|
||
@slot_window.set_handler(:cancel, method(:return_scene))
|
||
@slot_window.set_handler(:pagedown, method(:next_actor))
|
||
@slot_window.set_handler(:pageup, method(:prev_actor))
|
||
@slot_window.activate
|
||
@slot_window.select(0)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# アイテムウィンドウの作成
|
||
#--------------------------------------------------------------------------
|
||
def create_item_window
|
||
wx = 0
|
||
wy = @slot_window.y + @sei_window.height
|
||
ww = Graphics.width
|
||
wh = Graphics.height - wy
|
||
@item_window = Window_EquipItem.new(wx, wy, ww, wh)
|
||
@item_window.viewport = @viewport
|
||
@item_window.help_window = @help_window
|
||
@item_window.status_window = @status_window
|
||
@item_window.actor = @actor
|
||
@item_window.set_handler(:ok, method(:on_item_ok))
|
||
@item_window.set_handler(:cancel, method(:on_item_cancel))
|
||
@item_window.set_handler(:pagechange, method(:p_change))
|
||
@slot_window.item_window = @item_window
|
||
@item_window.visible = false
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スロット[決定]
|
||
#--------------------------------------------------------------------------
|
||
def on_slot_ok
|
||
@item_window.visible = true
|
||
@sei_window.visible = true
|
||
@slot_window.visible = false
|
||
@item_window.activate
|
||
@item_window.select(0)
|
||
@sei_window.e_type = @slot_window.index
|
||
@sei_window.equip1 = @slot_window.item
|
||
@sei_window.equip2 = @item_window.item
|
||
@sei_window.refresh
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スロット[解除]
|
||
#--------------------------------------------------------------------------
|
||
def off_slot_ok
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スロット[解除]
|
||
#--------------------------------------------------------------------------
|
||
def p_change
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 更新
|
||
#--------------------------------------------------------------------------
|
||
def update
|
||
super
|
||
@sei_window.equip1 = @slot_window.item
|
||
@sei_window.equip2 = @item_window.item
|
||
@sei_window.refresh
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スロット[キャンセル]
|
||
#--------------------------------------------------------------------------
|
||
def on_slot_cancel
|
||
@slot_window.unselect
|
||
return_scene
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# アイテム[決定]
|
||
#--------------------------------------------------------------------------
|
||
def on_item_ok
|
||
Sound.play_equip
|
||
@actor.change_equip(@slot_window.index, @item_window.item)
|
||
@slot_window.activate
|
||
@slot_window.visible = true
|
||
@sei_window.visible = false
|
||
@item_window.visible = false
|
||
@slot_window.refresh
|
||
@item_window.unselect
|
||
@item_window.refresh
|
||
$game_temp.reserve_common_event(70)
|
||
SceneManager.call(Scene_Map)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# アイテム[キャンセル]
|
||
#--------------------------------------------------------------------------
|
||
def on_item_cancel
|
||
@slot_window.activate
|
||
@slot_window.visible = true
|
||
@sei_window.visible = false
|
||
@item_window.visible = false
|
||
@item_window.unselect
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# アクターの切り替え
|
||
#--------------------------------------------------------------------------
|
||
def on_actor_change
|
||
@status_window.actor = @actor
|
||
@slot_window.actor = @actor
|
||
@item_window.actor = @actor
|
||
@sei_window.actor = @actor
|
||
@slot_window.activate
|
||
end
|
||
end
|
||
class Window_EquipItem < Window_ItemList
|
||
#--------------------------------------------------------------------------
|
||
# アイテムをリストに含めるかどうか
|
||
#--------------------------------------------------------------------------
|
||
alias include_exeq? include?
|
||
def include?(item)
|
||
return true if item == nil
|
||
return false unless item.is_a?(RPG::EquipItem)
|
||
return include_exeq?(item) if item.etype_id < 5
|
||
return false if @slot_id < 0
|
||
return false unless item.etype_id == @actor.equip_slots[@slot_id]
|
||
@actor.equippable?(item)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ヘルプテキスト更新
|
||
#--------------------------------------------------------------------------
|
||
def update_help
|
||
super
|
||
if @actor && @status_window
|
||
temp_actor = Marshal.load(Marshal.dump(@actor))
|
||
temp_actor.force_change_equip(@slot_id, item)
|
||
@status_window.set_temp_actor(temp_actor)
|
||
end
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ステータスウィンドウページチェンジ
|
||
#--------------------------------------------------------------------------
|
||
def p_change
|
||
return unless self.active
|
||
Sound.play_cursor
|
||
if @status_window.page_data == EQ_EX::ESP_MAX - 1
|
||
@status_window.page_data = 0
|
||
else
|
||
@status_window.page_data += 1
|
||
end
|
||
@status_window.refresh
|
||
end
|
||
end
|
||
class Window_Selectable < Window_Base
|
||
#--------------------------------------------------------------------------
|
||
# 決定やキャンセルなどのハンドリング処理
|
||
#--------------------------------------------------------------------------
|
||
alias process_handling_exeq process_handling
|
||
def process_handling
|
||
process_handling_exeq
|
||
return process_release if handle?(:release) && Input.trigger?(EQ_EX::ER_KEY)
|
||
return p_change if handle?(:pagechange) && Input.trigger?(EQ_EX::ESP_KEY)
|
||
end
|
||
end
|
||
class Game_Interpreter
|
||
#--------------------------------------------------------------------------
|
||
# 装備の変更
|
||
#--------------------------------------------------------------------------
|
||
def ch_eq(actor_number, slot_number, item_id)
|
||
actor = $game_actors[actor_number]
|
||
actor.change_equip_by_id(slot_number, item_id) if actor
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 装備の全解除
|
||
#--------------------------------------------------------------------------
|
||
def ar_eq(actor_number)
|
||
actor = $game_actors[actor_number]
|
||
actor.equip_slots.size.times {|i| actor.change_equip_by_id(i, 0)} if actor
|
||
end
|
||
end
|
||
#==============================================================================
|
||
# ■ Game_BattlerBase
|
||
#------------------------------------------------------------------------------
|
||
# バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ
|
||
# のクラスは Game_Battler クラスのスーパークラスとして使用されます。
|
||
#==============================================================================
|
||
|
||
class Game_BattlerBase
|
||
#--------------------------------------------------------------------------
|
||
# 装備可能判定
|
||
#--------------------------------------------------------------------------
|
||
alias equippable_exeq? equippable?
|
||
def equippable?(item)
|
||
return equippable_exeq?(item) unless item
|
||
return equippable_exeq?(item) if item.etype_id < 5
|
||
return false unless item.is_a?(RPG::EquipItem)
|
||
return false if equip_type_sealed?(item.etype_id)
|
||
return equip_wtype_ok?(item.wtype_id) if item.is_a?(RPG::Weapon)
|
||
return equip_atype_ok?(item.atype_id) if item.is_a?(RPG::Armor)
|
||
return false
|
||
end
|
||
end
|