아이템을 종류별로 분류하는 스크립트 입니다. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆아이템 분류 - KGC_ItemGrouping◆ #_/---------------------------------------------------------------------------- #_/ 아이템을 종류별로 분류하는 처리를 추가합니다. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #============================================================================== # ★ 커스터마이즈 항목 ★ #============================================================================== module KGC # ◆분류 속성 배열 # 분류에 사용 하는 속성명을 늘어놓는다(0:전종 -1:무기 -2:방어구) ITEM_GROUP_ELEMENTS = ["통상 아이템", "전투용 아이템", -1, -2, "귀중품", 0] # ◆분류 명칭 배열 # 분류 후의 명칭을 늘어놓는다(분류 속성 배열과 같은 위치·수) ITEM_GROUP_NAME = ["통상", "전투용", "무기", "방어구", "귀중품", "전종"] # ◆설명문(분류 속성 배열과 같은 위치·수) ITEM_GROUP_HELP = ["극히 보통 아이템을 표시합니다.", "전투용의 아이템을 표시합니다. ", "소지하고 있는 무기를 표시합니다.", "소지하고 있는 방어구를 표시합니다.", "귀중품을 표시합니다.", "모든 소지 아이템을 표시합니다. "] end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ # 도입이 끝난 플래그를 온 $imported["ItemGrouping"] = true # 비표시 속성 $game_special_elements["item_hide"] = $data_system.elements.index("非表示アイテム") module KGC # 분류 배열 ITEM_GROUP = [] for i in 0...ITEM_GROUP_ELEMENTS.size # 분류 속성이 0 이하의 경우 if ITEM_GROUP_ELEMENTS[i].is_a?(Numeric) && ITEM_GROUP_ELEMENTS[i] <= 0 ITEM_GROUP[i] = ITEM_GROUP_ELEMENTS[i] next end # ハッシュのキ?を設定 key = "item_#{i}}" # ?性ID取得 $game_special_elements[key] = $data_system.elements.index(ITEM_GROUP_ELEMENTS[i]) ITEM_GROUP[i] = $game_special_elements[key] end end class Object include KGC end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Module_RPG #------------------------------------------------------------------------------ # RPGモジュ?ル再定義 #============================================================================== module RPG class Item #-------------------------------------------------------------------------- # ● アイテム使用可否判定 #-------------------------------------------------------------------------- def usable? if $game_party.item_can_use?(self.id) return true end return false end end unless $imported["UsableWeapon"] class Weapon #-------------------------------------------------------------------------- # ● 武器使用可否判定 #-------------------------------------------------------------------------- def usable? return false end end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_Item #------------------------------------------------------------------------------ # アイテム?面、バトル?面で、所持アイテムの一?を表示するウィンドウです。 #============================================================================== class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_KGC_ItemGrouping initialize def initialize # 元の?理を?行 initialize_KGC_ItemGrouping # ??中以外の場合 unless $game_temp.in_battle # [ヘルプウィンドウ?張]を導入していない場合 unless $imported["HelpExtension"] self.y += 64 self.height -= 64 end self.index = -1 # アクティブ化解除 self.active = false end end #-------------------------------------------------------------------------- # ● 非表示判定 # index : アイテムID # type : 種別(0:アイテム 1:武器 2:防具) #-------------------------------------------------------------------------- def hide?(index, type = 0) case type when 0 # アイテム elements = $data_items[index].element_set.dup when 1 # 武器 elements = $data_weapons[index].element_set.dup when 2 # 防具 elements = $data_armors[index].guard_element_set.dup end return elements.include?($game_special_elements["item_hide"]) end #-------------------------------------------------------------------------- # ● 分類後のアイテムリストを取得 # itemkind : アイテムの種別 #-------------------------------------------------------------------------- def itemlist(itemkind) @data = [] # ??中以外なら分類に?って追加 unless $game_temp.in_battle # 「全種」の場合 if ITEM_GROUP[itemkind] == 0 for i in 1...$data_items.size if $game_party.item_number(i) > 0 && !self.hide?(i, 0) @data.push($data_items[i]) end end for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 && !self.hide?(i, 1) @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 && !self.hide?(i, 2) @data.push($data_armors[i]) end end # 「武器」の場合 elsif ITEM_GROUP[itemkind] == -1 for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 && !self.hide?(i, 1) @data.push($data_weapons[i]) end end # 「防具」の場合 elsif ITEM_GROUP[itemkind] == -2 for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 && !self.hide?(i, 2) @data.push($data_armors[i]) end end else for i in 1...$data_items.size # アイテムを所持、かつ???性を持っている場合は追加 if $game_party.item_number(i) > 0 && !self.hide?(i, 0) && $data_items[i].element_set.include?(ITEM_GROUP[itemkind]) @data.push($data_items[i]) end end end # ??中なら、アイテムと?果付き武器のみ追加 else for i in 1...$data_items.size # アイテムを所持している場合は追加 if $game_party.item_number(i) > 0 && !self.hide?(i, 0) @data.push($data_items[i]) end end for i in 1...$data_weapons.size # 武器を所持、かつ使用?果?性を持っている場合 if $game_party.weapon_number(i) > 0 && !self.hide?(i, 1) && $data_weapons[i].usable? @data.push($data_weapons[i]) end end end end #-------------------------------------------------------------------------- # ● リフレッシュ # itemkind : アイテムの分類 #-------------------------------------------------------------------------- def refresh(itemkind = 0) if self.contents != nil self.contents.dispose self.contents = nil end # 分類後のリストを取得 self.itemlist(itemkind) # 項目?が 0 でなければビットマップを作成し、全項目を描? @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end end #-------------------------------------------------------------------------- # ● 項目の描? # index : 項目番? #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] case item when RPG::Item number = $game_party.item_number(item.id) when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) end if (item.is_a?(RPG::Item) && item.usable?) || ($game_temp.in_battle && item.is_a?(RPG::Weapon) && item.usable?) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) self.contents.draw_text(x + 240, y, 16, 32, ":", 1) self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.item == nil ? "" : self.item.descript-xion) end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_ItemGroup #------------------------------------------------------------------------------ # アイテム?面で、分類を選?するウィンドウです。 #============================================================================== class Window_ItemGroup < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 64, 640, 64) self.contents = Bitmap.new(width - 32, height - 32) # コマンド一?を作成 @commands = [] for name in ITEM_GROUP_NAME @commands.push(name) end @item_max = @commands.size @column_max = @commands.size @item_width = (width - 32) / @commands.size self.index = 0 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh for i in 0...@commands.size rect = Rect.new(@item_width * i, 0, @item_width, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.font.color = system_color self.contents.draw_text(rect, @commands[i], 1) end end #-------------------------------------------------------------------------- # ● カ?ソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if index != -1 self.cursor_rect.set(@item_width * index, 0, @item_width, 32) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(ITEM_GROUP_HELP[self.index]) end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ # アイテム?面の?理を行うクラスです。 #============================================================================== class Scene_Item #-------------------------------------------------------------------------- # ● メイン?理 #-------------------------------------------------------------------------- alias main_KGC_ItemGrouping main def main # 分類ウィンドウを作成 @group_window = Window_ItemGroup.new @group_window.back_opacity = 160 if $imported["MenuAlter"] # 元の?理を?行 main_KGC_ItemGrouping # ウィンドウを解放 @group_window.dispose end #-------------------------------------------------------------------------- # ● フレ?ム更新 #-------------------------------------------------------------------------- def update # ウィンドウを初期化していない場合 unless @window_initialize # Z オ?ダ?を調整 @group_window.z = @help_window.z + 1 # ヘルプウィンドウを?連付け @group_window.help_window = @help_window # 初期化フラグをオン @window_initialize = true end # ウィンドウを更新 @help_window.update @item_window.update @target_window.update @group_window.update # アイテムウィンドウがアクティブの場合: update_item を呼ぶ if @item_window.active update_item return end # タ?ゲットウィンドウがアクティブの場合: update_target を呼ぶ if @target_window.active update_target return end # 分類ウィンドウがアクティブの場合: update_group を呼ぶ if @group_window.active update_group return end end #-------------------------------------------------------------------------- # ● フレ?ム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias update_item_KGC_ItemGrouping update_item def update_item # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 分類ウィンドウをアクティブ化 @group_window.active = true @group_window.visible = true @item_window.active = false @item_window.index = -1 return end # 元の?理を?行 update_item_KGC_ItemGrouping end #-------------------------------------------------------------------------- # ● フレ?ム更新 (タ?ゲットウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_target # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # アイテム切れなどで使用できなくなった場合 unless $game_party.item_can_use?(@item.id) # アイテムウィンドウの?容を再作成 @item_window.refresh(@group_window.index) end # タ?ゲットウィンドウを消去 @item_window.active = true @target_window.visible = false @target_window.active = false return end # C ボタンが押された場合 if Input.trigger?(Input::C) # アイテムを使い切った場合 if $game_party.item_number(@item.id) == 0 # ブザ? SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # タ?ゲットが全?の場合 if @target_window.index == -1 # パ?ティ全?にアイテムの使用?果を適用 used = false for i in $game_party.actors used |= i.item_effect(@item) end end # タ?ゲットが??の場合 if @target_window.index >= 0 # タ?ゲットのアクタ?にアイテムの使用?果を適用 target = $game_party.actors[@target_window.index] used = target.item_effect(@item) end # アイテムを使った場合 if used # アイテムの使用時 SE を演奏 $game_system.se_play(@item.menu_se) # 消耗品の場合 if @item.consumable # 使用したアイテムを 1 減らす $game_party.lose_item(@item.id, 1) # アイテムウィンドウの項目を再描? @item_window.draw_item(@item_window.index) end # タ?ゲットウィンドウの?容を再作成 @target_window.refresh # 全滅の場合 if $game_party.all_dead? # ゲ?ムオ?バ??面に切り替え $scene = Scene_Gameover.new return end # コモンイベント ID が有?の場合 if @item.common_event_id > 0 # コモンイベント呼び出し予約 $game_temp.common_event_id = @item.common_event_id # マップ?面に切り替え $scene = Scene_Map.new return end end # アイテムを使わなかった場合 unless used # ブザ? SE を演奏 $game_system.se_play($data_system.buzzer_se) end return end end #-------------------------------------------------------------------------- # ● フレ?ム更新 (分類ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_group if @now_itemkind != @group_window.index # カ?ソル位置によって表示するアイテムの分類を分ける @item_window.refresh(@group_window.index) @now_itemkind = @group_window.index end # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # メニュ??面に切り替え $scene = Scene_Menu.new(0) return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アイテムウィンドウをアクティブ化 @item_window.active = true @item_window.index = 0 @group_window.active = false @group_window.visible = false if $imported["HelpExtension"] return end end end