#============================================================================== # ■ VXAce-RGSS3-9-menu パーティー編集画面 -new- [Ver.1.0.0] by Claimh #------------------------------------------------------------------------------ # メニューのパーティー編集画面を変更します。 #------------------------------------------------------------------------------ # ●入れ替え画面の動作 # ・ターゲット選択状態からターゲットを選択するとメンバーを入れ替えます。 # ・ターゲット選択状態からAddを選択すると戦闘メンバーに加入します。 # ・ターゲット選択状態からRemoveを選択すると待機メンバーに移動します。 # ・最大メンバー未満時にアクターを加入させると戦闘メンバーの終端に加入します。 #------------------------------------------------------------------------------ # ●入れ替え画面の操作 # C … 対象選択/入れ替え実行 # B … メニューに戻る/ターゲット選択解除 # L/R … Window切り替え #------------------------------------------------------------------------------ # ●再定義 # Scene_Menu#command_formation #============================================================================== #============================================================================== # ■ Window_PartyMembers #------------------------------------------------------------------------------ #  パーティー編集画面でメンバーリストを表示するウィンドウ #============================================================================== class Window_PartyMembers < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :pending_index # 保留位置(並び替え用) attr_writer :enable_nil # Add/Remeveの選択可能 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(members, text="") @members = members super(0, 0, 260, 416) @text = text @pending_index = -1 @enable_nil = false @select_actor = false refresh end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @members.size end #-------------------------------------------------------------------------- # ● 項目の高さ #-------------------------------------------------------------------------- alias item_height_text item_height def item_height return 96 end #-------------------------------------------------------------------------- # ● member数[Add/Remove以外] #-------------------------------------------------------------------------- def members @members.select { |m| !m.nil? } end #-------------------------------------------------------------------------- # ● 選択中? #-------------------------------------------------------------------------- def select? @pending_index >= 0 end #-------------------------------------------------------------------------- # ● 選択 #-------------------------------------------------------------------------- def select_on @pending_index = @index draw_item(@index) end #-------------------------------------------------------------------------- # ● 非選択 #-------------------------------------------------------------------------- def select_off @enable_nil = false return unless select? tmp = @pending_index @pending_index = -1 draw_item(tmp) end #-------------------------------------------------------------------------- # ● インデックスを戻す #-------------------------------------------------------------------------- def cancel_index self.index = @pending_index select_off end #-------------------------------------------------------------------------- # ● 保留中アクターIndex #-------------------------------------------------------------------------- def pending_actor_index $game_actors[@members[@pending_index]].index end #-------------------------------------------------------------------------- # ● カーソル上アクターIndex #-------------------------------------------------------------------------- def actor_index $game_actors[@members[@index]].index end #-------------------------------------------------------------------------- # ● アクターID #-------------------------------------------------------------------------- def actor_id index_actor_id(@index) end #-------------------------------------------------------------------------- # ● アクター #-------------------------------------------------------------------------- def actor return nil if actor_id.nil? return $game_actors[actor_id] end #-------------------------------------------------------------------------- # ● アクター #-------------------------------------------------------------------------- def index_actor_id(index) @members[index] end #-------------------------------------------------------------------------- # ● アクター #-------------------------------------------------------------------------- def index_actor(index) return nil if index_actor_id(index).nil? return $game_actors[index_actor_id(index)] end #-------------------------------------------------------------------------- # ● アクターLock? #-------------------------------------------------------------------------- def actor_lock? return false if actor.nil? return actor.lock_change end #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? return false if actor.nil? and !@enable_nil !actor_lock? end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def members=(members) @members = members @pending_index = -1 @enable_nil = false create_contents refresh end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) @members[index].nil? ? draw_text(rect,@text,1) : draw_actor(index) end #-------------------------------------------------------------------------- # ● アクター情報描画 #-------------------------------------------------------------------------- def draw_actor(index) draw_item_background(index) rect = item_rect(index) act = index_actor(index) draw_actor_face(act, rect.x+2, rect.y) l = item_height_text rect.y += l / 2 draw_actor_name(act, rect.x+104, rect.y) if act.lock_change draw_icon(PartyEdit::LOCK_ICON_IDX, rect.x+rect.width-28, rect.y) end draw_actor_hp(act, rect.x+104, rect.y + l * 1) draw_actor_mp(act, rect.x+104, rect.y + l * 2) end #-------------------------------------------------------------------------- # ● 項目の背景を描画 #-------------------------------------------------------------------------- def draw_item_background(index) if index == @pending_index contents.fill_rect(item_rect(index), pending_color) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.refresh(self.actor) end end #============================================================================== # ■ Window_MemberStatus #------------------------------------------------------------------------------ #  パーティー編集画面でメンバーのステータスを表示するウィンドウ #============================================================================== class Window_MemberStatus < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) super(320, 0, 224, 416) @actor = actor refresh end #-------------------------------------------------------------------------- # ● 表示アクター変更 #-------------------------------------------------------------------------- def actor=(actor) return if actor == @actor refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(actor=nil) self.contents.clear @actor = actor if actor.nil? self.contents.draw_text(0,0,contents.width,contents.height,"Empty",1) return end draw_actor_name(@actor, 4, 0) draw_actor_class(@actor, 128, 0) draw_basic_info(4, 28) draw_actor_graphic(@actor, 170, 96) draw_parameters(4, 110) #draw_exp_info(4, 240) draw_equipments(4, 264) end #-------------------------------------------------------------------------- # ● 基本情報の描画 #-------------------------------------------------------------------------- def draw_basic_info(x, y) draw_actor_level(@actor, x, y + line_height * 0) draw_actor_icons(@actor, x + 96, y + line_height * 0) draw_actor_hp(@actor, x, y + line_height * 1) draw_actor_mp(@actor, x, y + line_height * 2) end #-------------------------------------------------------------------------- # ● 能力値の描画 #-------------------------------------------------------------------------- def draw_parameters(x, y) 6.times {|i| draw_actor_param(@actor, x, y + line_height * i, i + 2) } end #-------------------------------------------------------------------------- # ● 経験値情報の描画 #-------------------------------------------------------------------------- def draw_exp_info(x, y) s1 = @actor.max_level? ? "-------" : @actor.exp s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp s_next = sprintf(Vocab::ExpNext, Vocab::level) change_color(system_color) draw_text(x, y + line_height * 0, 180, line_height, Vocab::ExpTotal) draw_text(x, y + line_height * 2, 180, line_height, s_next) change_color(normal_color) draw_text(x, y + line_height * 1, 180, line_height, s1, 2) draw_text(x, y + line_height * 3, 180, line_height, s2, 2) end #-------------------------------------------------------------------------- # ● 装備品の描画 #-------------------------------------------------------------------------- def draw_equipments(x, y) @actor.equips.each_with_index do |item, i| draw_item_name(item, x, y + line_height * i) end end end #============================================================================== # ■ Scene_PartyEdit #------------------------------------------------------------------------------ #  パーティー編集画面の処理を行うクラスです。 #============================================================================== class Scene_PartyEdit < Scene_MenuBase #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_main_window create_sub_window @status_window = Window_MemberStatus.new(@main_window.actor) @front_main = false change_window end #-------------------------------------------------------------------------- # ● メインメンバー生成 #-------------------------------------------------------------------------- def create_main_members members = $game_party.battle_members.collect { |i| i.id } members.push(nil) if members.size < PartyEdit::MAX_MEMBERS members end #-------------------------------------------------------------------------- # ● 待機メンバー生成 #-------------------------------------------------------------------------- def create_sub_members members = $game_party.sub_members.collect { |i| i.id } members.push(nil) if $game_party.battle_members.size > 1 members end #-------------------------------------------------------------------------- # ● メインメンバーWindow生成 #-------------------------------------------------------------------------- def create_main_window @main_window = Window_PartyMembers.new(create_main_members, "Add") @main_window.set_handler(:ok, method(:on_ok)) @main_window.set_handler(:cancel, method(:on_cancel)) @main_window.set_handler(:pageup, method(:change_window)) @main_window.set_handler(:pagedown, method(:change_window)) @main_window.index = 0 end #-------------------------------------------------------------------------- # ● サブメンバーWindow生成 #-------------------------------------------------------------------------- def create_sub_window @sub_window = Window_PartyMembers.new(create_sub_members, "Remove") @sub_window.set_handler(:ok, method(:on_ok)) @sub_window.set_handler(:cancel, method(:on_cancel)) @sub_window.set_handler(:pageup, method(:change_window)) @sub_window.set_handler(:pagedown, method(:change_window)) @sub_window.x = 60 @sub_window.unselect end #-------------------------------------------------------------------------- # ● Widnow #-------------------------------------------------------------------------- def front @front_main ? @main_window : @sub_window end def back @front_main ? @sub_window : @main_window end #-------------------------------------------------------------------------- # ● メンバー再構成 #-------------------------------------------------------------------------- def refresh_members @main_window.members = create_main_members @sub_window.members = create_sub_members end #-------------------------------------------------------------------------- # ● OK #-------------------------------------------------------------------------- def on_ok if back.select? if front.actor.nil? ## Add / Remove insert_actor(back) else ## Exchange front <=> back $game_party.swap_order(front.actor_index, back.pending_actor_index) end refresh_members elsif front.select? if front.actor.nil? ## Add / Remove insert_actor(front) else ## Exchange front <=> front $game_party.swap_order(front.actor_index, front.pending_actor_index) end refresh_members else front.select_on back.enable_nil = true end front.activate end #-------------------------------------------------------------------------- # ● insert(Add / Remove) #-------------------------------------------------------------------------- def insert_actor(window) @front_main ? $game_party.insert_battle_actor(window.pending_actor_index) : $game_party.insert_last_actor(window.pending_actor_index) end #-------------------------------------------------------------------------- # ● Cancel #-------------------------------------------------------------------------- def on_cancel if front.select? front.cancel_index front.activate elsif back.select? back.cancel_index change_window else return_scene end end #-------------------------------------------------------------------------- # ● Window切り替え #-------------------------------------------------------------------------- def change_window front.z = 100 front.deactivate front.contents_opacity = 160 front.help_window = nil back.z = 200 back.activate back.contents_opacity = 255 back.help_window = @status_window back.index = 0 if back.index < 0 @front_main = !@front_main end end #============================================================================== # ■ Scene_Menu #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンド[並び替え] [再定義] #-------------------------------------------------------------------------- def command_formation SceneManager.call(Scene_PartyEdit) end end