#============================================================================== # □ パーティ編成システム (for VX Ace) #------------------------------------------------------------------------------ # Version : 1_20120731 # by サリサ・タイクーン # http://www.tycoon812.com/rgss/ #============================================================================== #============================================================================== # □ 素材スイッチ #============================================================================== $rgsslab = {} if $rgsslab == nil $rgsslab["パーティ編成システム"] = true if $rgsslab["パーティ編成システム"] #============================================================================== # □ カスタマイズポイント #============================================================================== module RGSSLAB end module RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ 待機メンバーのソート機能 # trueにすると、待機メンバーの加入・離脱・パーティ編成システム画面において # 常にID順にソートされるようになります。 #-------------------------------------------------------------------------- SORT = true #-------------------------------------------------------------------------- # ○ 強制フラグ # trueにすると、待機メンバーに加える際に、パーティメンバーにいる場合は # 強制的に待機メンバーへ移動させます。 # (falseにすると、移動しない代わりに待機メンバーに加える事ができません) #-------------------------------------------------------------------------- FORCE = true #-------------------------------------------------------------------------- # ○ パーティ編成画面の一行辺りの待機メンバーの人数 # 横に並べる際に、何人目で改行するのかを設定します。 # # 空欄(それを選ぶと外れると言う意味)の分も含まれる為 # 正確には、現在の待機メンバー+1の数で割り当てられる事に # ご注意下さい。 #-------------------------------------------------------------------------- COLUMN_MAX = 9 #-------------------------------------------------------------------------- # ○ 外す事のできないアクターの設定 # IMPOSSIBLLITYに外す事のできないアクターIDを記述します。 # # ここに記述されたアクターIDは、編成画面において # 選択する事ができなくなります。 # # ・イベントコマンドのスクリプトでの変更方法 # $game_system.rgsslab028.impossibillity = [アクターID, …] #-------------------------------------------------------------------------- IMPOSSIBILLITY = [] end # カスタマイズポイントは、ここまで #============================================================================== # □ RGSSLAB::Party_Organization_System [module] #============================================================================== module RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ 素材設定用の定数定義 #-------------------------------------------------------------------------- MATERIAL_NAME = "パーティ編成システム" VERSION = 1 RELEASE = 20120731 end #============================================================================== # ■ Game_System [class] #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :rgsslab028 #-------------------------------------------------------------------------- # ● オブジェクト初期化 [エイリアス] #-------------------------------------------------------------------------- alias party_organization_initialize initialize def initialize party_organization_initialize @rgsslab028 = RgssLab_028.new end end #============================================================================== # □ RgssLab_028 [class] #============================================================================== class RgssLab_028 #-------------------------------------------------------------------------- # ○ モジュールの設定 #-------------------------------------------------------------------------- RGSSLAB_028 = RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :impossibillity #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @impossibillity = RGSSLAB_028::IMPOSSIBILLITY end end #============================================================================== # ■ Game_Party [class] #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ○ モジュールの設定 #-------------------------------------------------------------------------- RGSSLAB_028 = RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :standby attr_reader :actors #-------------------------------------------------------------------------- # ● オブジェクト初期化 [エイリアス] #-------------------------------------------------------------------------- alias party_organization_initialize initialize def initialize party_organization_initialize @standby = [] end #-------------------------------------------------------------------------- # ○ メンバーの入れ替え # new_members : 新しいパーティメンバーの配列 #-------------------------------------------------------------------------- def all_members=(new_members) @actors.clear count = 0 for i in new_members @actors[count] = i count += 1 end end #-------------------------------------------------------------------------- # ○ 待機メンバーを加える # actor_id : アクター ID #-------------------------------------------------------------------------- def add_actor_organization_system(actor_id) @standby.push(actor_id) unless @standby.include?(actor_id) && @actors.include?(actor_id) @standby.uniq! standby_sort $game_player.refresh setup_pos if $rgsslab["陣形導入"] && $rgsslab["アクターバトラー実装"] end #-------------------------------------------------------------------------- # ○ 待機メンバーを外す # actor_id : アクター ID #-------------------------------------------------------------------------- def remove_actor_organization_system(actor_id) @standby.delete(actor_id) standby_sort $game_player.refresh setup_pos if $rgsslab["陣形導入"] && $rgsslab["アクターバトラー実装"] end #-------------------------------------------------------------------------- # ○ 待機メンバーのソート #-------------------------------------------------------------------------- def standby_sort return unless RGSSLAB_028::SORT @standby.sort!{|a, b| a <=> b } end end #============================================================================== # ■ Game_Interpreter [class] #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ○ モジュールの設定 #-------------------------------------------------------------------------- RGSSLAB_028 = RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ 待機メンバーを加える # actor_id : アクターID #-------------------------------------------------------------------------- def add_standby(actor_id) return if actor_id < 1 $game_party.remove_actor(actor_id) if $game_party.actors.include?(actor_id) && RGSSLAB_028::FORCE && $game_party.actors.size > 1 $game_party.add_actor_organization_system(actor_id) end #-------------------------------------------------------------------------- # ○ 待機メンバーを外す # actor_id : アクターID # back : パーティ加入フラグ #-------------------------------------------------------------------------- def remove_standby(actor_id, back = true) return if actor_id < 1 $game_party.add_actor(actor_id) if back && $game_party.standby.include?(actor_id) $game_party.remove_actor_organization_system(actor_id) end #-------------------------------------------------------------------------- # ○ パーティ編成システムの呼び出し #-------------------------------------------------------------------------- def call_standby SceneManager.call(Scene_Party_Organization_System) Fiber.yield end end #============================================================================== # □ Window_Party_Organization_Help [class] #============================================================================== class Window_Party_Organization_Help < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :text_index #-------------------------------------------------------------------------- # ○ オブジェクト初期化 [オーバーライド] #-------------------------------------------------------------------------- def initialize super(0, 0, Graphics.width, fitting_height(1)) @text_index = 0 refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear case @text_index when 0 str = "Cボタン:決定 Bボタン:編成終了" rect = contents.text_size(str) when 1 str = "Cボタン:決定 Bボタン:キャンセル" rect = contents.text_size(str) end contents.draw_text(4, 0, rect.width, line_height, str) end end #============================================================================== # □ Window_Party_Member #============================================================================== class Window_Party_Member < Window_Selectable #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize max = $game_party.all_members.size + 1 @column_max = max @item_max = max super(0, 96, Graphics.width, 80) self.opacity = 0 self.index = 0 self.z = 101 refresh end #-------------------------------------------------------------------------- # ○ 桁数の取得 [オーバーライド] #-------------------------------------------------------------------------- def col_max return @column_max end #-------------------------------------------------------------------------- # ○ 項目数の取得 [オーバーライド] #-------------------------------------------------------------------------- def item_max return @item_max end #-------------------------------------------------------------------------- # ○ リフレッシュ [オーバーライド] #-------------------------------------------------------------------------- def refresh contents.clear for actor in $game_party.all_members do draw_actor(actor, actor.index) end end #-------------------------------------------------------------------------- # ○ アクターグラフィックの描画 # actor : アクター # index : 項目番号 #-------------------------------------------------------------------------- def draw_actor(actor, index) if $game_system.rgsslab028.impossibillity.include?(actor.id) draw_actor_graphic_impossibillity(actor, 24 + 48 * index, 40) else draw_actor_graphic(actor, 24 + 48 * index, 40) end end #-------------------------------------------------------------------------- # ○ 入れ替えのできないアクターの歩行グラフィック描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_graphic_impossibillity(actor, x, y) return if actor.name == nil bitmap = Cache.character(actor.character_name) sign = actor.name[/^[\!\$]./] if sign != nil and sign.include?('$') cw = bitmap.width / 3 ch = bitmap.height / 4 else cw = bitmap.width / 12 ch = bitmap.height / 8 end n = actor.character_index src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch) self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect, 64) end #-------------------------------------------------------------------------- # ○ カーソルの更新 [オーバーライド] #-------------------------------------------------------------------------- def update_cursor if @index < 0 self.cursor_rect.empty else self.cursor_rect.set(@index * 48, 0, 48, 48) end end #-------------------------------------------------------------------------- # ○ 最大値の再設定 #-------------------------------------------------------------------------- def max_reset @item_max = $game_party.members.size + 1 end end #============================================================================== # □ Window_Standby_Member [class] #============================================================================== class Window_Standby_Member < Window_Selectable #-------------------------------------------------------------------------- # ○ モジュールの設定 #-------------------------------------------------------------------------- RGSSLAB_028 = RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ オブジェクト初期化 [オーバーライド] #-------------------------------------------------------------------------- def initialize max = $game_party.standby.size if max == 0 max = 1 else max += 1 end @column_max = RGSSLAB_028::COLUMN_MAX @item_max = max super(0, 208, Graphics.width, 128) self.opacity = 0 self.index = -1 self.active = false self.z = 101 refresh end #-------------------------------------------------------------------------- # ○ 桁数の取得 [オーバーライド] #-------------------------------------------------------------------------- def col_max return @column_max end #-------------------------------------------------------------------------- # ○ 項目数の取得 [オーバーライド] #-------------------------------------------------------------------------- def item_max return @item_max end #-------------------------------------------------------------------------- # ○ リフレッシュ [オーバーライド] #-------------------------------------------------------------------------- def refresh contents.clear if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 48) end count = 0 for actor in $game_party.standby draw_actor($game_actors[actor], count) count += 1 end end #-------------------------------------------------------------------------- # ○ アクターグラフィックの描画 # actor : アクター # index : 項目番号 #-------------------------------------------------------------------------- def draw_actor(actor, index) draw_actor_graphic(actor, 24 + 48 * (index % @column_max), 40 + (index / @column_max * 48)) end #-------------------------------------------------------------------------- # ○ 先頭の行の取得 [オーバーライド] #-------------------------------------------------------------------------- def top_row return self.oy / line_height end #-------------------------------------------------------------------------- # ○ 先頭の行の設定 [オーバーライド] # row : 先頭に表示する行 #-------------------------------------------------------------------------- def top_row=(row) row = 0 if row < 0 row = row_max - 1 if row > row_max - 1 self.oy = row * line_height end #-------------------------------------------------------------------------- # ○ 1 ページに表示できる行数の取得 [オーバーライド] #-------------------------------------------------------------------------- def page_row_max return height / line_height end #-------------------------------------------------------------------------- # ○ カーソルの更新 [オーバーライド] #-------------------------------------------------------------------------- def update_cursor if @index < 0 self.cursor_rect.empty return end row = @index / @column_max if row < self.top_row self.top_row = row end if row > self.top_row + (self.page_row_max - 1) self.top_row = row - (self.page_row_max - 1) end x = @index % @column_max * 48 y = @index / @column_max * 48 - self.oy self.cursor_rect.set(x, y, 48, 48) end #-------------------------------------------------------------------------- # ○ 最大値の再設定 #-------------------------------------------------------------------------- def max_reset max = $game_party.standby.size if max == 0 max = 1 else max += 1 end @item_max = max end end #============================================================================== # □ Window_Actor_Information [class] #============================================================================== class Window_Actor_Information < Window_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 [オーバーライド] # actor : 一番最初のアクター情報 #-------------------------------------------------------------------------- def initialize(actor) super(0, 322, Graphics.width, 78) refresh(actor) end #-------------------------------------------------------------------------- # ○ リフレッシュ # actor : アクター情報 #-------------------------------------------------------------------------- def refresh(actor) contents.clear if actor != nil actor = $game_actors[actor] if actor.is_a?(Numeric) draw_actor_graphic(actor, 22, 48) draw_actor_name(actor, 64, 0) draw_actor_class(actor, 208, 0) draw_actor_level(actor, 64, 24) draw_actor_hp(actor, 208, 24) draw_actor_mp(actor, 336, 24) end end end #============================================================================== # □ Window_Party_Organization [class] #============================================================================== class Window_Party_Organization < Window_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 [オーバーライド] #-------------------------------------------------------------------------- def initialize super(0, 48, Graphics.width, 274) self.opacity = 255 refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear contents.draw_text(4, 0, 155, line_height, "パーティメンバー") contents.draw_text(4, 112, 155, line_height, "待機メンバー" ) end end #============================================================================== # □ Scene_Party_Organization_System [class] #============================================================================== class Scene_Party_Organization_System < Scene_Base #-------------------------------------------------------------------------- # ○ モジュールの設定 #-------------------------------------------------------------------------- RGSSLAB_028 = RGSSLAB::Party_Organization_System #-------------------------------------------------------------------------- # ○ 開始処理 #-------------------------------------------------------------------------- def start super create_windows @temporary_actor = nil end #-------------------------------------------------------------------------- # ○ ウィンドウの作成 #-------------------------------------------------------------------------- def create_windows @help_window = Window_Party_Organization_Help.new @party_member_window = Window_Party_Member.new @standby_member_window = Window_Standby_Member.new @information_window = Window_Actor_Information.new($game_party.all_members[0]) @organization_window = Window_Party_Organization.new @party_member_window.active = true end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- def update super if @party_member_window.active update_party_member_window return end if @standby_member_window.active update_standby_member_window return end end #-------------------------------------------------------------------------- # ○ フレーム更新:パーティメンバーウィンドウ #-------------------------------------------------------------------------- def update_party_member_window @information_window.refresh($game_party.members[@party_member_window.index]) if Input.trigger?(Input::B) Sound.play_cancel SceneManager.return return end if Input.trigger?(Input::C) if $game_party.members[@party_member_window.index] if $game_system.rgsslab028.impossibillity.include?($game_party.members[@party_member_window.index].id) Sound.play_buzzer return end end Sound.play_ok @temporary_actor = $game_party.members[@party_member_window.index] @party_member_window.active = false @standby_member_window.active = true @standby_member_window.index = 0 @help_window.text_index = 1 @help_window.refresh return end end #-------------------------------------------------------------------------- # ○ フレーム更新:待機メンバーウィンドウ #-------------------------------------------------------------------------- def update_standby_member_window @information_window.refresh($game_party.standby[@standby_member_window.index]) if Input.trigger?(Input::B) Sound.play_cancel return_party_member_process return end if Input.trigger?(Input::C) temp = $game_party.standby[@standby_member_window.index] if @temporary_actor != nil if $game_party.standby[@standby_member_window.index] != nil $game_party.standby[@standby_member_window.index] = @temporary_actor.id temp_members = [] for i in $game_party.all_members temp_members.push(i.id) end temp_members[@party_member_window.index] = temp $game_party.all_members = temp_members else if $game_party.members.size == 1 Sound.play_buzzer return end temp = $game_party.members[@party_member_window.index] $game_party.remove_actor($game_party.members[@party_member_window.index].id) $game_party.add_actor_organization_system(temp.id) end else if $game_party.standby[@standby_member_window.index] == nil Sound.play_buzzer return end $game_party.add_actor($game_party.standby[@standby_member_window.index]) $game_party.remove_actor_organization_system($game_party.standby[@standby_member_window.index]) end Sound.play_ok $game_party.standby_sort $game_player.refresh @party_member_window.refresh @standby_member_window.refresh return_party_member_process return end end #-------------------------------------------------------------------------- # ○ パーティメンバーウィンドウ復帰処理 #-------------------------------------------------------------------------- def return_party_member_process @temporary_actor = nil @party_member_window.active = true @standby_member_window.active = false @standby_member_window.index = -1 @party_member_window.max_reset @standby_member_window.max_reset @help_window.text_index = 0 @help_window.refresh end end end