#============================================================================== # ■ RGSS3 成長効果の操作 Ver2.02 by 星潟 #------------------------------------------------------------------------------ # パーティーメンバーの成長効果をプレイヤーの手で操作する事が出来ます。 # 各能力値の成長効果が1以上の時にのみ操作出来ます。 # 0から、これまでに上げた能力補正値までの間でに限定していますので # 成長効果があるアイテムが大量に入手できるゲームにおいて # プレイヤーの手で成長効果を調整することが可能になります。 #============================================================================== # イベントコマンドのスクリプトで記述。 #------------------------------------------------------------------------------ # sts_execute # # 成長操作場面を呼び出します。 #============================================================================== # 特徴を有する項目(アクター・職業・ステート・装備等)のメモ欄に記述。 #------------------------------------------------------------------------------ # <成長操作無効> # # この特徴を有するアクターは成長効果の操作を行う事が出来ない。 #============================================================================== module STS #空のハッシュを用意。(変更不要) H = {} #ハッシュ内の対応するキーに更にハッシュを用意。(変更不要) H[:main] = {} H[:status] = {} #成長操作無効の設定用キーワードを指定。 Word = "成長操作無効" #操作可能な能力値を指定します。 #0が最大HP 〜 7が運です。 Method = [0,1,2,3,4,5,6,7] #メイン処理コマンド内の全て全最大化コマンドを有効にします。 AM_ABL1 = true #メイン処理コマンド内の全て全最小化コマンドを有効にします。 AM_ABL2 = true #個別処理コマンド内の全て全有効化コマンドを有効にします。 AM_ABL3 = true #個別処理コマンド内の全て全無効化コマンドを有効にします。 AM_ABL4 = true #個別処理コマンド内の全て全最大化コマンドを有効にします。 AM_ABL5 = true #個別処理コマンド内の全て全最小化コマンドを有効にします。 AM_ABL6 = true #個別処理コマンド内の全て全有効化/全無効化コマンドを有効にします。 AM_ABL7 = true #個別処理コマンド名を指定。 Individual = "個別処理" #以下4つはパーティメンバー全体に対する物とアクター個別に対する物とで共通。 #成長値の全最大化コマンド名を指定。 ALLMAX = "全最大化" #成長値の全最小化コマンド名を指定。 ALLMIN = "全最小化" #成長値の全有効化コマンド名を指定。 ALLON = "全有効化" #成長値の全無効化コマンド名を指定。 ALLOFF = "全無効化" #アクター名選択用のコマンドウィンドウの横幅を指定。 COMMANDW = 160 #成長値の数値設定用ウィンドウの横幅を指定。 NUMBERW = 168 #メニューに追加するか否かを指定。 #trueで追加。falseで追加しない。 MenuCommand = true #メニューに表示する際のコマンド名を指定。 Name = "成長操作" #以下5種、メインコマンドウィンドウのコマンドに対応する #ヘルプテキストを設定。 #個別処理コマンドのヘルプテキストを指定。 H[:main][:main] = "個別に成長値の操作を実行します。" #全最大化コマンドのヘルプテキストを指定。 H[:main][:allmax] = "一括で全員の成長値による強化を現在の最大値にします。" #全最小化コマンドのヘルプテキストを指定。 H[:main][:allmin] = "一括で全員の成長値による強化を現在の最小値にします。" #全有効化コマンドのヘルプテキストを指定。 H[:main][:allon] = "一括で全員の成長値による強化を有効にします。" #全無効化コマンドのヘルプテキストを指定。 H[:main][:alloff] = "一括で全員の成長値による強化を無効にします。" #個別処理コマンド選択時のアクター選択中のヘルプテキストを指定。 H[:actor] = "成長値を操作するアクターを選択して下さい。" #以下12種、個別処理中のアクター選択後の #項目に対応するヘルプテキストを設定。 #最大HP成長値操作のヘルプテキストを指定。 H[:status][0] = "最大HPの成長値を操作します。" #最大MP成長値操作のヘルプテキストを指定。 H[:status][1] = "最大MPの成長値を操作します。" #攻撃力成長値操作のヘルプテキストを指定。 H[:status][2] = "攻撃力の成長値を操作します。" #防御力成長値操作のヘルプテキストを指定。 H[:status][3] = "防御力の成長値を操作します。" #魔法力成長値操作のヘルプテキストを指定。 H[:status][4] = "魔法力の成長値を操作します。" #魔法防御成長値操作のヘルプテキストを指定。 H[:status][5] = "魔法防御の成長値を操作します。" #敏捷性成長値操作のヘルプテキストを指定。 H[:status][6] = "敏捷性の成長値を操作します。" #運成長値操作のヘルプテキストを指定。 H[:status][7] = "運の成長値を操作します。" #全最大化コマンドのヘルプテキストを指定。 H[:status][:allmax] = "全ての成長値を現在の最大値にします。" #全最小化コマンドのヘルプテキストを指定。 H[:status][:allmin] = "全ての成長値を現在の最小値にします。" #全有効化コマンドのヘルプテキストを指定。 H[:status][:allon] = "成長値による能力値の強化を有効にします。" #全無効化コマンドのヘルプテキストを指定。 H[:status][:alloff] = "成長値による能力値の強化を無効にします。" #最大HP〜運を選択した場合の数値操作中のヘルプテキストを指定。 #R L X Yはそれぞれキーボードではなくボタン配置上での名称なので注意。 H[:control] = "上:+1 下:-1 右:+10 左:-10 R:+100 L:-100 X:最大 Y:最小" end class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_command_window_sts_origin create_command_window def create_command_window create_command_window_sts_origin @command_window.set_handler(:sts_origin,method(:command_sts_origin)) end #-------------------------------------------------------------------------- # 成長操作コマンド追加 #-------------------------------------------------------------------------- def command_sts_origin SceneManager.call(Scene_STS) end end if STS::MenuCommand class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # 独自コマンドの追加用 #-------------------------------------------------------------------------- alias add_original_commands_sts_origin add_original_commands def add_original_commands add_original_commands_sts_origin add_command(STS::Name, :sts_origin, main_commands_enabled) end end end class Window_STMCommand < Window_HorzCommand #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list add_command(STS::Individual,:main, true) add_command(STS::ALLMAX,:allmax, true) if STS::AM_ABL1 add_command(STS::ALLMIN,:allmin, true) if STS::AM_ABL2 add_command(STS::ALLON,:allon, true) if STS::AM_ABL3 add_command(STS::ALLOFF,:alloff, true) if STS::AM_ABL4 end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # 桁数の取得 #-------------------------------------------------------------------------- def col_max @list.size end #-------------------------------------------------------------------------- # ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(STS::H[:main][current_symbol]) if @help_window end end class Window_STSCommand < Window_Command attr_accessor :status_window attr_accessor :actor #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) @actor = $game_party.members[0] super(x, y) unselect deactivate end #-------------------------------------------------------------------------- # アクター #-------------------------------------------------------------------------- def actor $game_party.members[self.index] end #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list $game_party.members.each do |member| add_command(member.name, :sts, !member.sts_seal, member.id) end end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width STS::COMMANDW end #-------------------------------------------------------------------------- # ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help if @help_window && @status_window @status_window.actor = self.actor @status_window.refresh if self.active @help_window.set_text(STS::H[:actor]) end end end class Window_STS < Window_Command attr_accessor :stsc attr_accessor :actor #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) @actor = nil super(x, y) unselect deactivate end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - STS::COMMANDW end #-------------------------------------------------------------------------- # 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok if current_item_enabled? Sound.play_ok Input.update call_ok_handler end end #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list return if !@actor flag1 = false STS::Method.each do |param_id| flag2 = !@actor.param_plus_all_off && @actor.origin_param_plus(param_id) > 0 add_command(Vocab.param(param_id), :sts, flag2, param_id) flag1 = true if flag2 end add_command(STS::ALLMAX, :allmax, flag1) if STS::AM_ABL5 add_command(STS::ALLMIN, :allmin, flag1) if STS::AM_ABL6 if STS::AM_ABL7 if @actor.param_plus_all_off add_command(STS::ALLON, :allon) else add_command(STS::ALLOFF, :alloff) end end end #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) return if !@actor pw = (contents_width - 8) / 5 r = item_rect_for_text(index) e = command_enabled?(index) i = @list[index][:ext] f = i ? (@actor.origin_param_minus(i) == 0 && @actor.origin_param_plus(i) != 0) : false change_color(f ? (@actor.origin_param_plus(i) < 0 ? power_down_color : power_up_color) : normal_color, e) draw_text(r, command_name(index)) return unless i pb = @actor.param_base(i) pp = @actor.origin_param_plus(i) pn = pp - @actor.origin_param_minus(i) draw_text(4 + pw, r.y, pw, r.height, pb + pn, 2) draw_text(4 + pw * 3, r.y, pw, r.height, pn, 2) change_color(normal_color, e) draw_text(4 + pw * 2, r.y, pw, r.height, pb, 2) draw_text(4 + pw * 4, r.y, pw, r.height, pp, 2) end #-------------------------------------------------------------------------- # 全項目の描画 #-------------------------------------------------------------------------- def draw_all_items return if !@actor pw = (contents_width - 8) / 5 lh = line_height change_color(system_color) draw_text(4, 0,pw, lh, "能力値") draw_text(4 + pw * 1,0,pw, lh, "現在値", 2) draw_text(4 + pw * 2,0,pw, lh, "基礎値", 2) draw_text(4 + pw * 3,0,pw, lh, "補正値", 2) draw_text(4 + pw * 4,0,pw, lh, "限界値", 2) change_color(normal_color) super end #-------------------------------------------------------------------------- # 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = super(index) rect.y += line_height rect end #-------------------------------------------------------------------------- # ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help if @help_window s = current_symbol key = s == :sts ? current_ext : s text = STS::H[:status][key] @help_window.set_text(text) if text end end end class Window_STC < Window_Selectable #-------------------------------------------------------------------------- # 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :sts attr_accessor :stsc attr_accessor :type attr_accessor :number attr_accessor :actor #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @type = 0 @number = 0 @actor = $game_party.members[0] super(0, 0, STS::NUMBERW, 96) self.x = (Graphics.width - self.width) / 2 self.y = (Graphics.height - self.height) / 2 hide deactivate refresh end #-------------------------------------------------------------------------- # 数字の変更処理 #-------------------------------------------------------------------------- def update super return unless self.visible last_number = @number if Input.repeat?(:Y) @number = actor.origin_param_plus(type) elsif Input.repeat?(:X) @number = 0 elsif Input.repeat?(:R) num_right(100) elsif Input.repeat?(:L) num_left(100) elsif Input.repeat?(:RIGHT) num_right(10) elsif Input.repeat?(:LEFT) num_left(10) elsif Input.repeat?(:UP) num_right(1) elsif Input.repeat?(:DOWN) num_left(1) end if last_number != @number Sound.play_cursor draw_number end flag = false if Input.trigger?(:C) Sound.play_ok actor.sts_control(type, @number) sts.refresh flag = true elsif Input.trigger?(:B) Sound.play_cancel flag = true end if flag @number = 0 self.hide self.deactivate sts.activate end end #-------------------------------------------------------------------------- # 成長値減少 #-------------------------------------------------------------------------- def num_right(num) n = actor.origin_param_plus(type) - @number if n > 0 if n >= num @number += num else @number += n end end end #-------------------------------------------------------------------------- # 成長値還元 #-------------------------------------------------------------------------- def num_left(num) if @number != 0 if num > @number @number = 0 else @number -= num end end end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear cw = contents_width cw_half = (cw - 24) / 2 lh = line_height draw_text(0, lh * 0, cw, lh, Vocab.param(type) + "補正値", 1) draw_text(0, lh * 1, cw_half, lh, "現在値", 1) draw_text(cw_half + 24, lh * 1, cw_half, lh, "限界値", 1) draw_number end #-------------------------------------------------------------------------- # 成長値の描写 #-------------------------------------------------------------------------- def draw_number cw = contents_width cw_half = (cw - 24) / 2 lh = line_height contents.clear_rect(0,lh * 2,cw,lh) change_color(text_color(3)) if @number == @actor.origin_param_plus(type) draw_text(0, lh * 2, cw_half, lh, @number, 2) change_color(normal_color) draw_text(cw_half + 24, lh * 2, cw_half, lh, actor.origin_param_plus(type), 2) end #-------------------------------------------------------------------------- # ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(STS::H[:control]) if @help_window end end class Scene_STS < Scene_MenuBase #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- def start super create_help_window create_main_window create_command_window create_status_window create_stc_window end #-------------------------------------------------------------------------- # 終了処理 #-------------------------------------------------------------------------- def terminate $game_party.members.each {|m| m.refresh} super end #-------------------------------------------------------------------------- # ヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_help_window @help_window = Window_Help.new(1) @help_window.viewport = @viewport end #-------------------------------------------------------------------------- # メインウィンドウの作成 #-------------------------------------------------------------------------- def create_main_window @main_window = Window_STMCommand.new(0, @help_window.y + @help_window.height) @main_window.set_handler(:ok, method(:actor_select)) @main_window.set_handler(:allmax,method(:allallmax)) @main_window.set_handler(:allmin,method(:allallmin)) @main_window.set_handler(:allon,method(:allallon)) @main_window.set_handler(:alloff,method(:allalloff)) @main_window.set_handler(:cancel,method(:return_scene)) @main_window.help_window = @help_window end #-------------------------------------------------------------------------- # コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window y = @main_window.y + @main_window.height @command_window = Window_STSCommand.new(0, y) @command_window.height = Graphics.height - y @command_window.set_handler(:ok, method(:sts_execute)) @command_window.set_handler(:cancel,method(:return_main)) @command_window.help_window = @help_window end #-------------------------------------------------------------------------- # ステータスウィンドウの作成 #-------------------------------------------------------------------------- def create_status_window y = @main_window.y + @main_window.height @status_window = Window_STS.new(@command_window.width, y) @status_window.height = Graphics.height - y @status_window.stsc = @command_window @status_window.set_handler(:sts, method(:sts_control)) @status_window.set_handler(:allmax,method(:allmax_execute)) @status_window.set_handler(:allmin,method(:allmin_execute)) @status_window.set_handler(:alloff,method(:param_plus_all_off)) @status_window.set_handler(:allon, method(:param_plus_all_on)) @status_window.set_handler(:cancel,method(:sts_cancel)) @status_window.help_window = @help_window @command_window.status_window = @status_window end #-------------------------------------------------------------------------- # 変更ウィンドウの作成 #-------------------------------------------------------------------------- def create_stc_window @stc_window = Window_STC.new @stc_window.stsc = @command_window @stc_window.sts = @status_window @stc_window.actor = @command_window.actor @stc_window.help_window = @help_window end #-------------------------------------------------------------------------- # メインウィンドウの操作に戻る #-------------------------------------------------------------------------- def return_main @main_window.activate @command_window.unselect @command_window.deactivate @status_window.actor = nil @status_window.refresh end #-------------------------------------------------------------------------- # アクターの選択 #-------------------------------------------------------------------------- def actor_select @command_window.index = 0 @command_window.activate @main_window.deactivate @status_window.actor = @command_window.actor @status_window.refresh end #-------------------------------------------------------------------------- # アクターの能力の個別操作開始 #-------------------------------------------------------------------------- def sts_control n = @status_window.current_ext @stc_window.actor = @status_window.actor @stc_window.type = n @stc_window.number = @stc_window.actor.origin_param_plus(n) - @stc_window.actor.origin_param_minus(n) @stc_window.show @stc_window.refresh @stc_window.activate @status_window.deactivate end #-------------------------------------------------------------------------- # パーティメンバーの全アクターの能力成長を最大化 #-------------------------------------------------------------------------- def allallmax $game_party.members.each do |member| member.sts_allmax if !member.sts_seal end @main_window.activate end #-------------------------------------------------------------------------- # パーティメンバーの全アクターの能力成長を最小化 #-------------------------------------------------------------------------- def allallmin $game_party.members.each do |member| member.sts_allmin if !member.sts_seal end @main_window.activate end #-------------------------------------------------------------------------- # パーティメンバーの全アクターの能力成長を無効化 #-------------------------------------------------------------------------- def allallon $game_party.members.each do |member| member.param_plus_all_off = false if !member.sts_seal end @main_window.activate end #-------------------------------------------------------------------------- # パーティメンバーの全アクターの能力成長を有効化 #-------------------------------------------------------------------------- def allalloff $game_party.members.each do |member| member.param_plus_all_off = true if !member.sts_seal end @main_window.activate end #-------------------------------------------------------------------------- # 能力成長を最大化 #-------------------------------------------------------------------------- def allmax_execute Sound.play_ok @status_window.actor.sts_allmax @status_window.refresh end #-------------------------------------------------------------------------- # 能力成長を最小化 #-------------------------------------------------------------------------- def allmin_execute Sound.play_ok @status_window.actor.sts_allmin @status_window.refresh end #-------------------------------------------------------------------------- # 能力成長を無効化 #-------------------------------------------------------------------------- def param_plus_all_off @status_window.actor.param_plus_all_off = true @status_window.refresh @status_window.update_help end #-------------------------------------------------------------------------- # 能力成長を有効化 #-------------------------------------------------------------------------- def param_plus_all_on @status_window.actor.param_plus_all_off = false @status_window.refresh @status_window.update_help end #-------------------------------------------------------------------------- # アクターの能力の個別選択を開始 #-------------------------------------------------------------------------- def sts_execute Sound.play_ok @status_window.activate @status_window.select(0) end #-------------------------------------------------------------------------- # アクターの能力の個別選択を終了 #-------------------------------------------------------------------------- def sts_cancel @command_window.activate @status_window.unselect end end class Game_Actor < Game_Battler attr_accessor :param_plus_all_off #-------------------------------------------------------------------------- # 通常能力値の加算値取得 #-------------------------------------------------------------------------- alias param_plus_sts_origin param_plus def param_plus(param_id) data = param_plus_sts_origin(param_id) data -= origin_param_minus(param_id) data end #-------------------------------------------------------------------------- # 成長によって得られた通常能力値の加算値取得 #-------------------------------------------------------------------------- def origin_param_plus(param_id) @param_plus[param_id] end #-------------------------------------------------------------------------- # 成長によって得られた通常能力値を打ち消す為の値を取得 #-------------------------------------------------------------------------- def origin_param_minus(param_id) @param_minus ||= [0] * 8 if STS::Method.include?(param_id) && @param_plus_all_off && origin_param_plus(param_id) > 0 return origin_param_plus(param_id) end if @param_plus[param_id] < @param_minus[param_id] @param_minus[param_id] = @param_plus[param_id] end if @param_minus[param_id] < 0 @param_minus[param_id] = 0 end @param_minus[param_id] end #-------------------------------------------------------------------------- # 成長によって得られた通常能力値を打ち消す為の値の操作 #-------------------------------------------------------------------------- def sts_control(type, number) @param_minus ||= [0] * 8 @param_minus[type] = origin_param_plus(type) - number end #-------------------------------------------------------------------------- # 成長値を現在の最大に(打ち消す値を最小に) #-------------------------------------------------------------------------- def sts_allmax @param_minus = [0] * 8 STS::Method.each {|i| @param_minus[i] = 0} end #-------------------------------------------------------------------------- # 成長値を現在の最小に(打ち消す値を最大に) #-------------------------------------------------------------------------- def sts_allmin @param_minus = [0] * 8 STS::Method.each {|i| @param_minus[i] = @param_plus[i] @param_minus[i] = 0 if @param_plus[i] < 0} end #-------------------------------------------------------------------------- # 特徴の成長値変動無効判定 #-------------------------------------------------------------------------- def sts_seal feature_objects.any? {|f| f.sts_seal} end end class RPG::BaseItem #-------------------------------------------------------------------------- # 成長値変動無効判定 #-------------------------------------------------------------------------- def sts_seal (@sts_seal ||= /<#{STS::Word}>/ =~ note ? 1 : 0) == 1 end end class Game_Interpreter #-------------------------------------------------------------------------- # 操作画面の呼び出し #-------------------------------------------------------------------------- def sts_execute SceneManager.call(Scene_STS) if $game_party.members.size > 0 end end