#============================================================================== # ■ RGSS3 アイテム入手履歴 Ver1.02 by 星潟 #------------------------------------------------------------------------------ # アイテム・武器・防具・大事なものの # 入手履歴を表示するシーンクラスを実装します。 # メニューコマンドに追加し、メニューから確認する事も可能です。 # スイッチを利用した、履歴への追加禁止機能もあります。 # なお、購入したものは履歴追加の対象となりません。 #------------------------------------------------------------------------------ # 以下のコマンドをイベントコマンドのスクリプトで利用可能になります。 # # call_get_record # # アイテム入手履歴シーンを呼び出します。 # # get_record_delete # # アイテム入手履歴を全て削除します。 #------------------------------------------------------------------------------ # Ver1.01 種類描写の項目幅を修正しました。 # 項目描写内容を既存設定に準じるように変更する機能を追加しました。 # 一回の戦闘で同一アイテムを複数個入手した場合 # 履歴にまとめて表示する機能を追加しました。 #------------------------------------------------------------------------------ # Ver1.02 お金を入手した際にも処理を行ってしまい # エラーが発生する致命的不具合を修正しました。 #============================================================================== module ITEM_GET_RECORD #入手履歴をメニューに追加するか?(trueで追加 falseで追加しない) MENU = true #戦闘後のドロップアイテムにも有効にするか?(trueで有効 falseで無効) DROP = true #敵が同一アイテムを複数ドロップした際に #それぞれ1個ずつ履歴に追加するかどうかを決定します。 D_NUM = true #メニューでのコマンド名を指定します。 NAME = "入手履歴" #入手履歴の最大保存件数(超過した場合、古い物から消去する) #表示領域の都合上、最大でも9999件まででの設定を推奨します。 #(5桁数を超えると、数字が圧縮表示されます) NUMBER = 1000 #入手履歴への追加を一時的に禁止する為のスイッチIDを指定します。 #ここで指定したスイッチIDがONの時、アイテム入手による #入手履歴への追加が行われなくなります。(※要確認) #なお、番号ではなくnilを指定した場合、この機能は無効化されます。 SWITCH = 100 #種別名の描写を既存の物に準じるかどうかを指定します。 #trueで既存、falseで新規に設定します。 D_NAME = true #種別名の描写を既存の物に準じない場合のみ #以下の新規設定が有効になります。 #アイテムの種別名を指定します。 TYPEN1 = "アイテム" #武器の種別名を指定します。 TYPEN2 = "武器" #防具の種別名を指定します。 TYPEN3 = "防具" #大事なものの種別名を指定します。 TYPEN4 = "大事なもの" #=========================================================================== #以下は基本的にデフォルト設定を推奨します。不用意に変更しないほうが吉。 #=========================================================================== #1ページに表示する履歴数を指定 ONE_PN = 15 #説明ウィンドウへの操作方法表示を行毎に指定 #配列内の最初に文字列、次に文字色を指定します。 #文字色を指定しない場合は通常色になり #配列内に何もない場合は表示しません。 TEXT = [ ["操作方法", 3], ["←キー", 16], ["1ページ戻る"], ["→キー", 16], ["1ページ進む"], ["SHIFTキー", 16], ["降/昇順切替え"], ["決定/キャンセル", 16], ["終了"] ] #説明ウィンドウへの水平線表示を指定します。 #水平線を入れる行を配列に加えて下さい。 #[1,2,3]等、「,」で区切る事で複数設定できます。 LINE = [1] end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #各種アイテム入手系イベントコードに #入手履歴への履歴登録処理を追加 alias command_126_get_record command_126 def command_126 command_126_get_record value = operate_value(@params[1], @params[2], @params[3]) $game_party.add_get_record(0, @params[0], value) if value > 0 end alias command_127_get_record command_127 def command_127 command_127_get_record value = operate_value(@params[1], @params[2], @params[3]) $game_party.add_get_record(1, @params[0], value) if value > 0 end alias command_128_get_record command_128 def command_128 command_128_get_record value = operate_value(@params[1], @params[2], @params[3]) $game_party.add_get_record(2, @params[0], value) if value > 0 end #-------------------------------------------------------------------------- # ● アイテム入手履歴シーン呼び出し用イベントコマンド #-------------------------------------------------------------------------- def call_get_record SceneManager.call(Scene_Igr) end #-------------------------------------------------------------------------- # ● アイテム入手履歴削除用イベントコマンド #-------------------------------------------------------------------------- def get_record_delete $game_party.get_record_delete end end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。所持金やアイテムなどの情報が含まれます。このクラ # スのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ● 入手履歴の取得/生成 #-------------------------------------------------------------------------- def get_record if @get_record != nil #既存の入手履歴の保存件数と最新設定での保存件数との差を計算 data = @get_record.size - ITEM_GET_RECORD::NUMBER #もしも最新設定よりも保存件数が多い場合は入手履歴を削る if data > 0 data.times do data.pop end end #入手履歴を返す return @get_record else #入手履歴が存在しない場合は入手履歴の配列を生成 @get_record = [] end end #-------------------------------------------------------------------------- # ● 入手履歴への追加/生成 #-------------------------------------------------------------------------- def add_get_record(type, id, value) #指定スイッチがONの時、 return if ITEM_GET_RECORD::SWITCH != nil && $game_switches[ITEM_GET_RECORD::SWITCH] #アイテム/武器/防具/大事なもの以外の場合は処理を中止 return if type > 2 #入手数が0より大きくない場合は処理を中止 return unless value > 0 #入手履歴が存在しない場合は入手履歴の配列を生成 get_record #入手履歴の戦闘に履歴を1件追加 @get_record.unshift([type, id, value]) #履歴保存件数が最大数を超えている場合、入手履歴配列の最後尾を1件削除 @get_record.pop if @get_record.size > ITEM_GET_RECORD::NUMBER end #-------------------------------------------------------------------------- # ● 入手履歴の削除 #-------------------------------------------------------------------------- def get_record_delete @get_record = [] end end class Scene_Igr < Scene_MenuBase #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super #各種ウィンドウを生成 create_igr_window create_sub_igr_window #処理用の変数を作成 @page_number = 0 @max_page_number = [(($game_party.get_record.size - 1)/ ITEM_GET_RECORD::ONE_PN), 0].max #1ページ目の情報をウィンドウに描画 draw_igr_item_data(@page_number) end #-------------------------------------------------------------------------- # ● メインウィンドウの作成 #-------------------------------------------------------------------------- def create_igr_window #履歴を表示するメインウィンドウを生成 @igr_window = Window_Igr.new(0, 0, Graphics.width - 150, Graphics.height) #ビューポートへの関連付け @igr_window.viewport = @viewport end #-------------------------------------------------------------------------- # ● サブウィンドウの作成 #-------------------------------------------------------------------------- def create_sub_igr_window #メインウィンドウの幅から、X座標の位置を決定する x = @igr_window.width #現在のページ情報や操作方法を記述するサブウィンドウ2つを生成 @igr_sub_window1 = Window_SubIgr.new(x, 0, Graphics.width - x, Graphics.height / 5 * 2) @igr_sub_window2 = Window_SubIgr.new(x, Graphics.height / 5 * 2, Graphics.width - x, Graphics.height / 5 * 3) #ビューポートへの関連付け @igr_sub_window1.viewport = @viewport @igr_sub_window2.viewport = @viewport #サブウィンドウ2に操作方法を描画 @igr_sub_window2.text_data_set end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if Input.trigger?(:LEFT)#1ページ戻す Sound.play_cursor page_minus elsif Input.trigger?(:RIGHT)#1ページ進む Sound.play_cursor page_plus elsif Input.trigger?(:SHIFT)#反転させる Sound.play_ok page_reverse elsif Input.trigger?(:C) or Input.trigger?(:B)#元のシーンに戻す Sound.play_cancel return_scene end end #-------------------------------------------------------------------------- # ● 1ページ戻す #-------------------------------------------------------------------------- def page_minus @page_number = @page_number == 0 ? @max_page_number : (@page_number - 1) draw_igr_item_data(@page_number) end #-------------------------------------------------------------------------- # ● 1ページ進む #-------------------------------------------------------------------------- def page_plus @page_number = @page_number == @max_page_number ? 0 : (@page_number + 1) draw_igr_item_data(@page_number) end #-------------------------------------------------------------------------- # ● 反転させる #-------------------------------------------------------------------------- def page_reverse @igr_window.reverse_flag = @igr_window.reverse_flag ? false : true @page_number = 0 draw_igr_item_data(@page_number) end #-------------------------------------------------------------------------- # ● 現在ページの情報でメインウィンドウとサブウィンドウ1を更新 #-------------------------------------------------------------------------- def draw_igr_item_data(page_number) @igr_window.draw_igr_item_data(page_number) @igr_sub_window1.draw_page_updata(page_number, @max_page_number) end end #============================================================================== # ■ Window_Igr #------------------------------------------------------------------------------ #  入手履歴を表示するメインウィンドウです。 #============================================================================== class Window_Igr < Window_Base attr_accessor :reverse_flag #-------------------------------------------------------------------------- # ● 水平線の描画 #-------------------------------------------------------------------------- def draw_horz_line(y) line_y = y + line_height / 2 - 1 contents.fill_rect(0, line_y, contents_width, 2, line_color) end #-------------------------------------------------------------------------- # ● 水平線の色を取得 #-------------------------------------------------------------------------- def line_color color = normal_color color.alpha = 48 color end #-------------------------------------------------------------------------- # ● 入手履歴ウィンドウ内データの描画 #-------------------------------------------------------------------------- def draw_igr_item_data(page_number) #ウィンドウをクリア contents.clear #入手履歴を取得 record = $game_party.get_record.clone @reverse_flag = false if @reverse_flag == nil @record = @reverse_flag ? record.reverse.clone : record.clone #フォントサイズを調整 self.contents.font.size = 20 #項目名を描写 draw_text(0, 0, 40, line_height, !@reverse_flag ? "昇順" : "降順") draw_text(64, 0, 100, line_height, "アイテム名") draw_text(170, 0, 100, line_height, "入手数" , 2) draw_text(290, 0, 100, line_height, "種別", 0) draw_horz_line(12) #これまで入手履歴がない場合は処理を終える return if record.empty? #今のページに描写するデータを取得する為の配列を生成 data = [] #Y座標調整用のデータを作成 y_hosei = line_height * 1 #ページ別の入手履歴番号に対応する為の補正値を作成 pn_plus_number = page_number * ITEM_GET_RECORD::ONE_PN #1ページに表示する件数分だけ処理を行い、データを取得する ITEM_GET_RECORD::ONE_PN.times do |i| #データがない場合は中止する break if @record[i + pn_plus_number] == nil break if @record[i + pn_plus_number] == [0,0,0] #データを配列に入れる data.push(@record[i + pn_plus_number]) end #描写色をシステムカラーに変更 change_color(system_color) #記述回数をデータサイズから作成 number = data.size #指定回数分の履歴番号を描写する number.times do |i| text = !@reverse_flag ? (i + 1 + pn_plus_number).to_s : (@record.size - pn_plus_number - i).to_s text += "." draw_text(0, y_hosei + line_height * i, 42, line_height, text, 2) end # #描写色をノーマルカラーに変更 change_color(normal_color) #指定回数分の履歴データを描写する number.times do |i| #フォントサイズを調整 self.contents.font.size = 20 #Y座標データを作成 y = line_height * i case data[i][0] when 0#アイテム item_data = $data_items[data[i][1]] #アイテムの場合、通常アイテムか大事な物かを分別して処理 if ITEM_GET_RECORD::D_NAME type_name = $data_items[data[i][1]].itype_id == 1 ? Vocab::item : Vocab::key_item else type_name = $data_items[data[i][1]].itype_id == 1 ? ITEM_GET_RECORD::TYPEN1 : ITEM_GET_RECORD::TYPEN4 end when 1#武器 item_data = $data_weapons[data[i][1]] type_name = ITEM_GET_RECORD::D_NAME ? Vocab::weapon : ITEM_GET_RECORD::TYPEN2 when 2#防具 item_data = $data_armors[data[i][1]] type_name = ITEM_GET_RECORD::D_NAME ? Vocab::armor : ITEM_GET_RECORD::TYPEN3 end #アイテムの入手個数文字列を取得 item_number = data[i][2] > 9 ? data[i][2].to_s : (" " + data[i][2].to_s) #アイテムアイコン・アイテム名を描写 draw_item_name(item_data, 40, y_hosei + y) #アイテム入手数を描写 draw_text(170, y_hosei + y, 100, line_height, ("×" + item_number), 2) #フォントサイズを調整 self.contents.font.size = 16 #アイテム種別を描写 draw_text(290, y_hosei + y, 90, line_height, type_name, 0) end end end #============================================================================== # ■ Window_SubIgr #------------------------------------------------------------------------------ #  入手履歴の補助的なデータを表示するウィンドウです。 #  サブウィンドウ1と2はまとめてこれを使います。 #============================================================================== class Window_SubIgr < Window_Igr #-------------------------------------------------------------------------- # ● ウィンドウその1のデータをページ数に合わせて更新します。 #-------------------------------------------------------------------------- def draw_page_updata(page_number, max_page) #ウィンドウをクリア contents.clear #フォントサイズを調整 self.contents.font.size = 20 #記述用の各種データを生成 w = self.contents.width h = line_height size_data = $game_party.get_record.size text1 = "現在のページ" text2 = (page_number + 1).to_s text3 = "/" text4 = (max_page + 1).to_s + "P" text5 = "現在の保存件数" text6 = size_data.to_s + "件" text7 = "最大保存件数" text8 = ITEM_GET_RECORD::NUMBER.to_s + "件" #先にシステムカラーで表示する内容を描画 change_color(system_color) draw_text(0, h * 0, w, h, text1 , 0) draw_horz_line(12) draw_text(0, h * 2, w, h, text5, 0) draw_horz_line(60) draw_text(0, h * 4, w, h, text7, 0) draw_horz_line(104) #ノーマルカラーで表示する内容を描画 change_color(normal_color) draw_text(0, h * 1, w / 2 - 10, h, text2 , 2) draw_text(0, h * 1, w - 10, h, text3 , 1) draw_text(0, h * 1, w, h, text4 , 2) draw_text(0, h * 3, w, h, text6, 2) draw_text(0, h * 5, w, h, text8, 2) end #-------------------------------------------------------------------------- # ● ウィンドウその2のデータをページ数に合わせて更新します。 #-------------------------------------------------------------------------- def text_data_set #ウィンドウをクリア contents.clear #フォントサイズを調整 self.contents.font.size = 20 #記述用の各種データを生成 w = self.contents.width h = line_height text_data = ITEM_GET_RECORD::TEXT number = text_data.size #データを描画 number.times do |i| #データがない場合は飛ばす draw_horz_line(12 + h * i) if ITEM_GET_RECORD::LINE.include?(i + 1) next if ITEM_GET_RECORD::TEXT[i].empty? change_color(ITEM_GET_RECORD::TEXT[i][1] != nil ? text_color(ITEM_GET_RECORD::TEXT[i][1]) : normal_color) draw_text(0, h * i, w, h, ITEM_GET_RECORD::TEXT[i][0]) if ITEM_GET_RECORD::TEXT[i][0] != "" end end end #ドロップにも履歴追加が有効な時のみ、以下の処理を実行します。 if ITEM_GET_RECORD::DROP class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # ● ドロップアイテムの獲得と表示 #-------------------------------------------------------------------------- alias make_drop_items_get_record make_drop_items def make_drop_items data = make_drop_items_get_record #ドロップアイテム配列が空の場合は処理を中断する。 return data if data.empty? #ドロップアイテムを履歴に追加。 #複数個表示の設定で条件分岐を行う。 if ITEM_GET_RECORD::D_NUM#複数個入手しても、1つずつ履歴に追加する。 data.each do |item| next if item == nil if item.is_a?(RPG::Item) $game_party.add_get_record(0, item.id, 1) elsif item.is_a?(RPG::Weapon) $game_party.add_get_record(1, item.id, 1) elsif item.is_a?(RPG::Armor) $game_party.add_get_record(2, item.id, 1) end end else#複数個入手したら、まとめて履歴に追加する。 sub_data = data.uniq sub_data.each do |item| number = 0 data.each do |i| number += 1 if i == item end if item.is_a?(RPG::Item) $game_party.add_get_record(0, item.id, number) elsif item.is_a?(RPG::Weapon) $game_party.add_get_record(1, item.id, number) elsif item.is_a?(RPG::Armor) $game_party.add_get_record(2, item.id, number) end end end return data end end end #メニューに追加する場合のみ、以下の処理を実行します。 if ITEM_GET_RECORD::MENU #============================================================================== # ■ Window_MenuCommand #------------------------------------------------------------------------------ #  メニュー画面で表示するコマンドウィンドウです。 #============================================================================== class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # ● 独自コマンドの追加用 #-------------------------------------------------------------------------- alias add_original_commands_get_record add_original_commands def add_original_commands add_original_commands_get_record add_command(ITEM_GET_RECORD::NAME, :getrecord) end end #============================================================================== # ■ Scene_Menu #------------------------------------------------------------------------------ #  メニュー画面の処理を行うクラスです。 #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_command_window_get_record create_command_window def create_command_window create_command_window_get_record @command_window.set_handler(:getrecord, method(:command_getrecord)) end #-------------------------------------------------------------------------- # ● 入手履歴コマンド選択時の処理 #-------------------------------------------------------------------------- def command_getrecord SceneManager.call(Scene_Igr) end end end