#============================================================================== #◆アイテムソート ver 1.0 #   by 黒豹は月夜に踊る #     http://hunters.nobody.jp/ #------------------------------------------------------------------------------ # ▼効能 #  ・アイテムを取得順にソートする # ・アイテムを種別ごとにソートする # ▼用語定義 # ソート    :アイテムの並べ替え # ソートモード :ソートの種類(の現在の状況) # ソートセレクタ:ソートの選択状況を示すカーソル(みたいなもの) # ▼注意 # ゲームの進行上 Graphics.frame_count をリセットする仕様になっている場合、新規 # 取得ソートが正常に動作ない場合もありますので、予めご了承ください。 # #============================================================================== module Constants #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- COLORING = 5 SELECTOR_WIDTH = 32 NEWESTMODE = 0 SORT = [ "sort_newest", "sort_waste", "sort_weapon", "sort_shield", "sort_helm", "sort_armor", "sort_accessory", "sort_treasure", "sort_all"] SICON = [ "036-Item05", "021-Potion01", "001-Weapon01", "009-Shield01", "010-Head01", "013-Body01", "017-Accessory02", "034-Item03", "032-Item01"] STEXT = [ "新規アイテム", "消費アイテム", "武器", "盾", "兜", "鎧", "アクセサリー", "貴重品", "全てのアイテム"] SE = "Audio/SE/046-Book01" #------------------------------------------------------------------------------ # COLORING : 色をつける最高アイテム数 # SELECTOR_WIDTH : ソートセレクタの幅 # NEWESTMODE : SORT内で"sort_newest"が格納されている番号です。SORTの順 # 番を変更した時、"sort_newest"の格納位置が変わっていたら # 必ずこれをその格納番号に変更してください。 # SORT : ソート命令の配列 # ソートの順番を入れ替えることが出来ます。 # 順番を変えるときはテキストの内容を変更しないようにしない # と正常に動作しなくなるので気をつけてください。 # SICON : ソートアイコン # STEXT : ソートの名称 # ソートの名称に"File::"が含まれる場合、画像ファイルを呼び # 出したいのだとみなします。画像サイズは320*32以内なら切れ # 目無しで表示されます。 # 例) # "File::test" # SE : ソートモードを変更した時のSEです。 #------------------------------------------------------------------------------ #-------------------------------------------------------------------------- # ● 関数 #-------------------------------------------------------------------------- def newest_color return Color.new(255,90,35) #新規取得アイテム色 end def selector_color return Color.new(160,190,255,64) #ソートセレクタメインカラー end def selector_border return Color.new(255,255,255,64) #ソートセレクタボーダーカラー end def se_changesort Audio.se_play(SE,80) end end module RPG class Item #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :latest_get # 最新取得時間(フレーム数) end class Weapon #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :latest_get # 最新取得時間(フレーム数) end class Armor #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :latest_get # 最新取得時間(フレーム数) end end class Game_Party #-------------------------------------------------------------------------- # ● エイリアス #-------------------------------------------------------------------------- alias gain_item_old gain_item alias gain_weapon_old gain_weapon alias gain_armor_old gain_armor #-------------------------------------------------------------------------- # ● アイテムの増加 (減少) # item_id : アイテム ID # n : 個数 #-------------------------------------------------------------------------- def gain_item(item_id, n) if n > 0 $data_items[item_id].latest_get = Graphics.frame_count end gain_item_old(item_id,n) end #-------------------------------------------------------------------------- # ● 武器の増加 (減少) # weapon_id : 武器 ID # n : 個数 #-------------------------------------------------------------------------- def gain_weapon(weapon_id, n) if n > 0 $data_weapons[weapon_id].latest_get = Graphics.frame_count end gain_weapon_old(weapon_id,n) end #-------------------------------------------------------------------------- # ● 防具の増加 (減少) # armor_id : 防具 ID # n : 個数 #-------------------------------------------------------------------------- def gain_armor(armor_id, n) if n > 0 $data_armors[armor_id].latest_get = Graphics.frame_count end gain_armor_old(armor_id,n) end end #エラー回避 class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 装備の変更 # equip_type : 装備タイプ # id : 武器 or 防具 ID (0 なら装備解除) #-------------------------------------------------------------------------- def equip(equip_type, id) case equip_type when 0 # 武器 if id == 0 or $game_party.weapon_number(id) > 0 $game_party.gain_weapon_old(@weapon_id, 1) @weapon_id = id $game_party.lose_weapon(id, 1) end when 1 # 盾 if id == 0 or $game_party.armor_number(id) > 0 update_auto_state($data_armors[@armor1_id], $data_armors[id]) $game_party.gain_armor_old(@armor1_id, 1) @armor1_id = id $game_party.lose_armor(id, 1) end when 2 # 頭 if id == 0 or $game_party.armor_number(id) > 0 update_auto_state($data_armors[@armor2_id], $data_armors[id]) $game_party.gain_armor_old(@armor2_id, 1) @armor2_id = id $game_party.lose_armor(id, 1) end when 3 # 身体 if id == 0 or $game_party.armor_number(id) > 0 update_auto_state($data_armors[@armor3_id], $data_armors[id]) $game_party.gain_armor_old(@armor3_id, 1) @armor3_id = id $game_party.lose_armor(id, 1) end when 4 # 装飾品 if id == 0 or $game_party.armor_number(id) > 0 update_auto_state($data_armors[@armor4_id], $data_armors[id]) $game_party.gain_armor_old(@armor4_id, 1) @armor4_id = id $game_party.lose_armor(id, 1) end end end end class Window_Base include Constants end class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :sortmode # ソートモード #-------------------------------------------------------------------------- # ● オブジェクト初期化 # sort : 初期ソートモード #-------------------------------------------------------------------------- def initialize(sort = 0) super(0, 96, 640, 416 - 32) @column_max = 2 refresh self.index = 0 # 戦闘中の場合はウィンドウを画面中央へ移動し、半透明にする if $game_temp.in_battle self.y = 64 self.height = 256 self.back_opacity = 160 end @sortmode = sort end #-------------------------------------------------------------------------- # ● ソート:新規取得順 #-------------------------------------------------------------------------- def sort_newest @data = [] # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 @data.push($data_items[i]) end end # 戦闘中以外なら武器と防具も追加 unless $game_temp.in_battle for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 @data.push($data_armors[i]) end end end @data.sort!{|x,y| y.latest_get <=> x.latest_get} return 0 end #-------------------------------------------------------------------------- # ● ソート:消費アイテム #-------------------------------------------------------------------------- def sort_waste @data = [] # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 if $data_items[i].occasion != 3 @data.push($data_items[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:武器 #-------------------------------------------------------------------------- def sort_weapon @data = [] for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 @data.push($data_weapons[i]) end end return 0 end #-------------------------------------------------------------------------- # ● ソート:盾 #-------------------------------------------------------------------------- def sort_shield @data = [] for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_armors[i].kind == 0 @data.push($data_armors[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:頭防具 #-------------------------------------------------------------------------- def sort_helm @data = [] for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_armors[i].kind == 1 @data.push($data_armors[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:身体防具 #-------------------------------------------------------------------------- def sort_armor @data = [] for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_armors[i].kind == 2 @data.push($data_armors[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:装飾品 #-------------------------------------------------------------------------- def sort_accessory @data = [] for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_armors[i].kind == 3 @data.push($data_armors[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:貴重品 #-------------------------------------------------------------------------- def sort_treasure @data = [] # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 if $data_items[i].occasion == 3 @data.push($data_items[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● ソート:登録順 #-------------------------------------------------------------------------- def sort_all @data = [] # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 @data.push($data_items[i]) end end # 戦闘中以外なら武器と防具も追加 unless $game_temp.in_battle for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 @data.push($data_armors[i]) end end end return 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end # バグ対策 if @sortmode == nil @sortmode = 0 end # ソート eval(SORT[@sortmode]) # 項目数が 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) and $game_party.item_can_use?(item.id) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end if @sortmode == NEWESTMODE if index < COLORING self.contents.font.color = newest_color end 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) 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 end class Scene_Item include Constants #-------------------------------------------------------------------------- # ● エイリアス #-------------------------------------------------------------------------- alias update_itme_old update_item #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # ヘルプウィンドウ、アイテムウィンドウを作成 @help_window = Window_Help.new @item_window = Window_Item.new # ヘルプウィンドウを関連付け @item_window.help_window = @help_window # ターゲットウィンドウを作成 (不可視・非アクティブに設定) @target_window = Window_Target.new @target_window.visible = false @target_window.active = false # ソートモード表示 #=========================================================================== axisy = 64 + 16 # アイコンを描画 @icons = [] for i in 0...SICON.size @icons[i] = Sprite.new @icons[i].bitmap = RPG::Cache.icon(SICON[i]) @icons[i].ox = @icons[i].bitmap.width/2 @icons[i].oy = @icons[i].bitmap.height/2 @icons[i].x = 640-(9-i)*SELECTOR_WIDTH + SELECTOR_WIDTH/2 @icons[i].y = axisy @icons[i].z = 80 end # ソート名を描画 @sortmode = Sprite.new @sortmode.bitmap = Bitmap.new(640,32) @sortmode.ox = @sortmode.bitmap.width/2 @sortmode.oy = @sortmode.bitmap.height/2 @sortmode.x = 320 @sortmode.y = axisy @sortmode.z = 10 sort_name(0) # ソートセレクタを描画 @selector = Sprite.new @selector.bitmap = Bitmap.new(SELECTOR_WIDTH,32) @selector.blend_type = 1 @selector.y = 64 @selector.z = 180 @selector.bitmap.fill_rect(0,0,SELECTOR_WIDTH,32,selector_border) @selector.bitmap.fill_rect(1,1,SELECTOR_WIDTH-2,30,selector_color) move_selector(0) # ソートモードを0にしてリフレッシュ @item_window.sortmode = 0 change_mode(0) @item_window.refresh #=========================================================================== # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @help_window.dispose @item_window.dispose @target_window.dispose @sortmode.dispose @selector.dispose for i in 0...@icons.size @icons[i].dispose end end #-------------------------------------------------------------------------- # ● フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_item if Input.trigger?(Input::R) se_changesort @item_window.sortmode += 1 if @item_window.sortmode > 8 @item_window.sortmode = 0 end change_mode(@item_window.sortmode) @item_window.index = 0 @item_window.refresh end if Input.trigger?(Input::L) se_changesort @item_window.sortmode -= 1 if @item_window.sortmode < 0 @item_window.sortmode = 8 end change_mode(@item_window.sortmode) @item_window.index = 0 @item_window.refresh end update_itme_old end #-------------------------------------------------------------------------- # ● ソートモード変更 # n : ソートモード #-------------------------------------------------------------------------- def change_mode(n) # アイコンのZ座標を変更 for i in 0...@icons.size if i == n @icons[i].z = 120 else @icons[i].z = 80 end end # ソート名を描画 sort_name(n) move_selector(n) @item_window.refresh end #-------------------------------------------------------------------------- # ● ソートセレクタ移動 # n : 指定番号の位置へ移動 #-------------------------------------------------------------------------- def move_selector(n) @selector.x = 640-(9-n)*SELECTOR_WIDTH end #-------------------------------------------------------------------------- # ● ソート名描画 # n : 指定番号のソート名を描画 #-------------------------------------------------------------------------- def sort_name(n) @sortmode.bitmap.clear if STEXT[n][/File::/] # ファイル名抽出 file = STEXT[n].dup file[/File::/] = "" @sortmode.bitmap.blt(0, 0, RPG::Cache.picture(file), RPG::Cache.picture(file).rect) else @sortmode.bitmap.draw_text(0,0,320,32,STEXT[n]) end end end