############################ アイテム鑑定システム ############################ # # # 「鑑定アイテム」を使用することで効果が分かるアイテムを作成します。 # # 「要:鑑定」の属性が含まれている武器・防具・道具の効果は、 # # 道具ならば「攻撃力」の欄、防具ならば「物理防御」の欄、 # # 道具ならば「HP回復量」の欄に書かれた数字のIDのアイテムと同じになります。 # # # # これら未鑑定のアイテムを鑑定するアイテムは「効果:鑑定」の属性がついた道具。# # ただし、この道具はどういう設定にしても戦闘中は使うことができません。 # # Scene_Itemからのみ呼び出しが可能な設定にしているためです。 # # # # CAN_USE_UNJUDGE を true にすると、未鑑定アイテムも使用可能になります。 # # 使用効果はHP回復量で指定したIDのアイテムと同じになります。 # # この時、FORCE_USE_ITEM を true にするとアイテムを強制的に使用します。 # # (つまり未鑑定品で消耗品の場合、効果が無くても強制的に消耗する) # # CAN_EQUIP_UNJUDGE を true にすると、未鑑定アイテムも装備可能になります。 # # # # CAN_SELL_UNJUDGE を true にすると、未鑑定のアイテムも売れるようになります。# # ただし、この時参照される値段は鑑定前のアイテムに設定された価格です。 # # # # REPEAT_UNJUDGE は アイテムを並べる際に未鑑定品を重複させるか否か。 # # falseにした場合は同じアイテムも分割してそれぞれ一つとして表示します。 # # つまりブロンズソードの未鑑定品「銅製の剣」を十個持っている場合 # # trueならば「銅製の剣 : 10」と表示されるますが、 # # falseならば「銅製の剣 : 1」が10個表示される、ということです。 # # # # また、これに合わせて未鑑定品は名前順に、全てのアイテムが出た後に並びます。 # # # ############################################################################## # 設定ここから module Annex APPRAISE_ELEMENT = "効果:鑑定" # 鑑定アイテムにつける属性 UNJUDGE_ITEM = "要:鑑定" # 鑑定が必要な道具 / 武器 / 防具 の属性名 CAN_USE_UNJUDGE = true # 未鑑定品でも使用可能か否か FORCE_USE_ITEM = true # 未鑑定品を使用した場合強制的に使用したことにするか CAN_EQUIP_UNJUDGE = true # 未鑑定品でも装備可能か否か CAN_SELL_UNJUDGE = true # 未鑑定品でも販売可能か否か REPEAT_UNJUDGE = false # 未鑑定品の重複許可 JUDGE_SUCCESS_SE = ["056-Right02", 70, 100] # 鑑定成功 JUDGE_FAILURE_SE = ["039-Switch08", 70, 100] # 鑑定失敗 # 鑑定時に流れるSE (名前、 ボリューム、 ピッチの順) # 省略した場合(ITEM_JUDGE_SE = nilとする)は音が鳴らない。 end # 設定ここまで module RPG #============================================================================ # ■ Item #============================================================================ class Item #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に規定の属性名が含まれるか #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end #-------------------------------------------------------------------------- # ◎ 追加:道具が未鑑定品か否か #-------------------------------------------------------------------------- def is_unjudge? return include_element?(@element_set, Annex::UNJUDGE_ITEM) end #-------------------------------------------------------------------------- # ◎ 追加:鑑定後のアイテムのID #-------------------------------------------------------------------------- def true_id if is_unjudge? return @recover_hp else return @id end end end #============================================================================ # ■ Weapon #============================================================================ class Weapon #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に規定の属性名が含まれるか #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end #-------------------------------------------------------------------------- # ◎ 追加:武器が未鑑定品か否か #-------------------------------------------------------------------------- def is_unjudge? return include_element?(@element_set, Annex::UNJUDGE_ITEM) end #-------------------------------------------------------------------------- # ◎ 追加:鑑定後のアイテムのID (装備可能確認に使用) #-------------------------------------------------------------------------- def true_id if is_unjudge? return @atk else return @id end end #-------------------------------------------------------------------------- # ● 使用者アニメーションIDの取得 (再定義) #-------------------------------------------------------------------------- def animation1_id if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].animation1_id else return @animation1_id end end #-------------------------------------------------------------------------- # ● 対象アニメーションIDの取得 (再定義) #-------------------------------------------------------------------------- def animation2_id if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].animation2_id else return @animation2_id end end #-------------------------------------------------------------------------- # ● 攻撃力の取得 (再定義) #-------------------------------------------------------------------------- def atk if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].atk else return @atk end end #-------------------------------------------------------------------------- # ● 物理防御力の取得 (再定義) #-------------------------------------------------------------------------- def pdef if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].pdef else return @pdef end end #-------------------------------------------------------------------------- # ● 魔法防御力の取得 (再定義) #-------------------------------------------------------------------------- def mdef if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].mdef else return @mdef end end #-------------------------------------------------------------------------- # ● 腕力の取得 (再定義) #-------------------------------------------------------------------------- def str_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].str_plus else return @str_plus end end #-------------------------------------------------------------------------- # ● 器用さの取得 (再定義) #-------------------------------------------------------------------------- def dex_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].dex_plus else return @dex_plus end end #-------------------------------------------------------------------------- # ● 素早さの取得 (再定義) #-------------------------------------------------------------------------- def agi_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].agi_plus else return @agi_plus end end #-------------------------------------------------------------------------- # ● 魔力の取得 (再定義) #-------------------------------------------------------------------------- def int_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].int_plus else return @int_plus end end #-------------------------------------------------------------------------- # ● 属性修正の取得 (再定義) #-------------------------------------------------------------------------- def element_set if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].element_set else return @element_set end end #-------------------------------------------------------------------------- # ● 付加ステートの取得 (再定義) #-------------------------------------------------------------------------- def plus_state_set if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].plus_state_set else return @plus_state_set end end #-------------------------------------------------------------------------- # ● 解除ステートの取得 (再定義) #-------------------------------------------------------------------------- def minus_state_set if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_weapons[@atk].minus_state_set else return @minus_state_set end end end #============================================================================ # ■ Armor #============================================================================ class Armor #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に規定の属性名が含まれるか #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end #-------------------------------------------------------------------------- # ◎ 追加:武器が未鑑定品か否か #-------------------------------------------------------------------------- def is_unjudge? return include_element?(@guard_element_set, Annex::UNJUDGE_ITEM) end #-------------------------------------------------------------------------- # ◎ 追加:鑑定後のアイテムのID #-------------------------------------------------------------------------- def true_id if is_unjudge? return @pdef else return @id end end #-------------------------------------------------------------------------- # ● 装備の種類 (再定義) #-------------------------------------------------------------------------- def kind if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].kind else return @kind end end #-------------------------------------------------------------------------- # ● オートステート (再定義) #-------------------------------------------------------------------------- def auto_state_id if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].auto_state_id else return @auto_state_id end end #-------------------------------------------------------------------------- # ● 物理防御力の取得 (再定義) #-------------------------------------------------------------------------- def pdef if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].pdef else return @pdef end end #-------------------------------------------------------------------------- # ● 魔法防御力の取得 (再定義) #-------------------------------------------------------------------------- def mdef if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].mdef else return @mdef end end #-------------------------------------------------------------------------- # ● 腕力の取得 (再定義) #-------------------------------------------------------------------------- def str_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].str_plus else return @str_plus end end #-------------------------------------------------------------------------- # ● 器用さの取得 (再定義) #-------------------------------------------------------------------------- def dex_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].dex_plus else return @dex_plus end end #-------------------------------------------------------------------------- # ● 素早さの取得 (再定義) #-------------------------------------------------------------------------- def agi_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].agi_plus else return @agi_plus end end #-------------------------------------------------------------------------- # ● 魔力の取得 (再定義) #-------------------------------------------------------------------------- def int_plus if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].int_plus else return @int_plus end end #-------------------------------------------------------------------------- # ● 回避修正 (再定義) #-------------------------------------------------------------------------- def eva if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].eva else return @eva end end #-------------------------------------------------------------------------- # ● 属性防御 (再定義) #-------------------------------------------------------------------------- def guard_element_set if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].guard_element_set else return @guard_element_set end end #-------------------------------------------------------------------------- # ● ステート防御 (再定義) #-------------------------------------------------------------------------- def guard_state_set if is_unjudge? and Annex::CAN_EQUIP_UNJUDGE return $data_armors[@pdef].guard_state_set else return @guard_state_set end end end end #============================================================================== # ■ Game_Party #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ○ アイテムの使用可能判定 # item_id : アイテム ID #-------------------------------------------------------------------------- alias appraise_item_can_use? item_can_use? def item_can_use?(item_id) item = $data_items[item_id] # 鑑定効果の属性を持つアイテムの場合 if include_element?(item.element_set, Annex::APPRAISE_ELEMENT) # 戦闘中なら false を返す if $game_temp.in_battle return false end end # 未鑑定アイテムが使えない場合は元を呼び出す if Annex::CAN_USE_UNJUDGE == false if item.is_unjudge? return false end return appraise_item_can_use?(item_id) end # アイテムの個数が 0 個の場合 if item_number(item_id) == 0 # 使用不能 return false end if item.is_unjudge? # itemの状況を変更 use_item = $data_items[item.true_id] end # 使用可能時を取得 occasion = $data_items[use_item.id].occasion # バトルの場合 if $game_temp.in_battle # 使用可能時が 0 (常時) または 1 (バトルのみ) なら使用可能 return (occasion == 0 or occasion == 1) end # 使用可能時が 0 (常時) または 2 (メニューのみ) なら使用可能 return (occasion == 0 or occasion == 2) end #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に指定した属性名が含まれているか # element_set : 属性テーブル # name : 属性名 #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ アイテムの効果適用 # item : アイテム #-------------------------------------------------------------------------- alias appraise_item_effect item_effect def item_effect(item) use_item = item.dup # 未鑑定品の場合 if item.is_unjudge? # アイテムを変更 use_item = $data_items[use_item.true_id] # アイテム処理実行 bool = appraise_item_effect(use_item) # アイテムの使用を強制しているならtrueを返す。 return Annex::FORCE_USE_ITEM ? true : bool end return appraise_item_effect(use_item) end #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に指定した属性名が含まれているか # element_set : 属性テーブル # name : 属性名 #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 装備可能判定 # item : アイテム #-------------------------------------------------------------------------- alias appraise_equippable? equippable? def equippable?(item) # 複製 temp_item = item.dup # 未鑑定品が装備不可能な場合強制的に装備を不可能にする if Annex::CAN_EQUIP_UNJUDGE == false and temp_item.is_unjudge? return false end # 未鑑定品の場合IDを再取得 if temp_item.is_unjudge? # 武器の場合 if temp_item.is_a?(RPG::Weapon) temp_item = $data_weapons[temp_item.true_id] end # 防具の場合 if item.is_a?(RPG::Armor) temp_item = $data_armors[temp_item.true_id] end end # 呼び戻し return appraise_equippable?(temp_item) end end #============================================================================== # ■ Window_Item #============================================================================== class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ (再定義) #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] # ☆ ココから追加 unjudge_data = [] # 未鑑定品を入れる配列 # ☆ ココまで追加 # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 # ☆ ココから変更 if $data_items[i].is_unjudge? unjudge_data.push($data_items[i]) else @data.push($data_items[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも使用可能な場合 if Annex::CAN_USE_UNJUDGE # 未鑑定アイテムのソート実行 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # ☆ ココまで追加 # 戦闘中以外なら武器と防具も追加 unless $game_temp.in_battle for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 # ☆ ココから変更 if $data_weapons[i].is_unjudge? unjudge_data.push($data_weapons[i]) else @data.push($data_weapons[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも装備可能な場合 if Annex::CAN_EQUIP_UNJUDGE # 未鑑定アイテムのソート実行 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # ☆ ココまで追加 for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 # ☆ ココから変更 if $data_armors[i].is_unjudge? unjudge_data.push($data_armors[i]) else @data.push($data_armors[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも装備可能な場合 if Annex::CAN_EQUIP_UNJUDGE # 未鑑定アイテムのソート実行 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # ☆ ココまで追加 end # ☆ ココから追加 # 今までソートしてなかったらソート実行 if unjudge_data != [] @data += sort_unjudge(unjudge_data) end @item_max = @data.size # ☆ ココまで追加 # 項目数が 0 でなければビットマップを作成し、全項目を描画 if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@data.size draw_item(i) end end end #-------------------------------------------------------------------------- # ○ 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- alias appraise_draw_item draw_item def draw_item(index) if Annex::REPEAT_UNJUDGE appraise_draw_item(index) else item = @data[index] # アイテムが未鑑定品かのチェック flag = item.is_unjudge? # 未鑑定アイテムで無い場合は呼び戻す if flag == false appraise_draw_item(index) return end # 未鑑定アイテムの所持数は1限定 number = 1 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 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 end #-------------------------------------------------------------------------- # ◎ 追加:未鑑定品のソート # items : ソートする配列 #-------------------------------------------------------------------------- def sort_unjudge(items) temp = [] for item in items if Annex::REPEAT_UNJUDGE temp.push(item) else # 重複を許可していない場合アイテムの所持数の数だけtempにプッシュ 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 for i in 0...number temp.push(item) end end end temp.sort!{|a, b| a.name <=> b.name} return temp end end #============================================================================== # ■ Window_ShopSell #============================================================================== class Window_ShopSell < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ (再定義) #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] # ☆ ココから追加 unjudge_data = [] # 未鑑定品を入れる配列 # ☆ ココまで追加 # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 # ☆ ココから変更 if $data_items[i].is_unjudge? unjudge_data.push($data_items[i]) else @data.push($data_items[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも使用可能な場合 if Annex::CAN_USE_UNJUDGE # 未鑑定アイテムのソート実行し、@dataに追加 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # ☆ ココまで追加 for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 # ☆ ココから変更 if $data_weapons[i].is_unjudge? unjudge_data.push($data_weapons[i]) else @data.push($data_weapons[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも装備可能な場合 if Annex::CAN_EQUIP_UNJUDGE # 未鑑定アイテムのソート実行 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # ☆ ココまで追加 for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 # ☆ ココから変更 if $data_armors[i].is_unjudge? unjudge_data.push($data_armors[i]) else @data.push($data_armors[i]) end # ☆ ココまで変更 end end # ☆ ココから追加 # 未鑑定アイテムも装備可能な場合 if Annex::CAN_EQUIP_UNJUDGE # 未鑑定アイテムのソート実行 @data += sort_unjudge(unjudge_data) # 未鑑定アイテムの配列を初期化 unjudge_data = [] end # 今までソートしてなかったらソート実行 if unjudge_data != [] @data += sort_unjudge(unjudge_data) end @item_max = @data.size # ☆ ココまで追加 # 項目数が 0 でなければビットマップを作成し、全項目を描画 if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@data.size draw_item(i) end end end #-------------------------------------------------------------------------- # ○ 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- alias appraise_draw_item draw_item def draw_item(index) if @data[index].is_unjudge? item = @data[index] if Annex::REPEAT_UNJUDGE == false # 未鑑定アイテムの所持数は1限定 number = 1 else 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 end if item.price > 0 and Annex::CAN_SELL_UNJUDGE 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) else # 呼び戻し appraise_draw_item(index) end end #-------------------------------------------------------------------------- # ◎ 追加:未鑑定品のソート # items : ソートする配列 #-------------------------------------------------------------------------- def sort_unjudge(items) temp = [] for item in items if Annex::REPEAT_UNJUDGE temp.push(item) else # 重複を許可していない場合アイテムの所持数の数だけtempにプッシュ 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 for i in 0...number temp.push(item) end end end temp.sort!{|a, b| a.name <=> b.name} return temp end end #============================================================================== # □ 追加:Window_UnJudge_Item #------------------------------------------------------------------------------ #  アイテム画面とスキル画面で、鑑定対象のアイテムを選択するウィンドウです。 #============================================================================== class Window_UnJudge_Item < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 64, 336, 480-64) self.contents = Bitmap.new(width - 32, height - 32) @column_max = 1 self.z += 10 self.visible = true self.active = true refresh end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end unjudge_data = [] # アイテムを追加 for i in 1...$data_items.size if $game_party.item_number(i) > 0 if $data_items[i].is_unjudge? unjudge_data.push($data_items[i]) end end end for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 if $data_weapons[i].is_unjudge? unjudge_data.push($data_weapons[i]) end end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_armors[i].is_unjudge? unjudge_data.push($data_armors[i]) end end end # データ生成 @data = [] for item in unjudge_data if Annex::REPEAT_UNJUDGE @data.push(item) else # 重複を許可していない場合アイテムの所持数の数だけtempにプッシュ 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 for i in 0...number @data.push(item) end end end # 名前順ソート @data.sort!{|a, b| a.name <=> b.name} @item_max = @data.size # 項目数が 0 でなければビットマップを作成し、全項目を描画 if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@data.size draw_item(i) end end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if not Annex::REPEAT_UNJUDGE number = 1 else 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 end self.contents.font.color = normal_color x = 4 + index % @column_max * (288 + 32) y = index / @column_max * 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.description) end #-------------------------------------------------------------------------- # ● 未鑑定アイテムが存在しなければtrueを返す確認用メソッド #-------------------------------------------------------------------------- def itemless? return @data.size == 0 end end #============================================================================== # □ 追加:Window_Judge_Result #------------------------------------------------------------------------------ #  鑑定結果を一時的に表示するウィンドウです #============================================================================== class Window_Judge_Result < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(164, 176, 312, 128) self.contents = Bitmap.new(width - 32, height - 32) self.z = 1000 self.visible = false @item = nil refresh end #-------------------------------------------------------------------------- # ● アイテム取得 #-------------------------------------------------------------------------- def set_item(item) @item = item refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.visible = false # @item が nil だったらここまで return if @item == nil self.contents.clear self.visible = true if @item != "Miss" self.contents.draw_text(0, 0, 280, 32, "鑑定した結果", 0) # アイテムアイコン表示 bitmap = RPG::Cache.icon(@item.icon_name) self.contents.blt(20, 36, bitmap, Rect.new(0, 0, 24, 24), 255) self.contents.draw_text(48, 32, 212, 32, @item.name, 0) self.contents.draw_text(0, 64, 280, 32, "だと判明しました。", 2) else text = "鑑定に失敗しました。" self.contents.draw_text(0, 32, 280, 32, text, 1) end end end #============================================================================== # ■ Window_EquipItem #============================================================================== class Window_EquipItem < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ (再定義) #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] # ☆ ココから変更 unjudge_data = [] # 装備可能かどうかの確認方式をequippable?を通すように変更 # 装備可能な武器を追加 if @equip_type == 0 for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 weapon = $data_weapons[i] # 装備不可能なら次へ next if @actor.equippable?(weapon) == false if $data_weapons[i].is_unjudge? unjudge_data.push($data_weapons[i]) else @data.push($data_weapons[i]) end end end end # 装備可能な防具を追加 if @equip_type != 0 for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 armor = $data_armors[i] # 装備不可能なら次へ next if @actor.equippable?(armor) == false # 種類が違うなら次へ next if armor.kind != @equip_type-1 if $data_armors[i].is_unjudge? unjudge_data.push($data_armors[i]) else @data.push($data_armors[i]) end end end end temp = [] for item in unjudge_data if Annex::REPEAT_UNJUDGE temp.push(item) else # 重複を許可していない場合アイテムの所持数の数だけtempにプッシュ 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 for i in 0...number temp.push(item) end end end temp.sort!{|a, b| a.name <=> b.name} # @data を 更新 @data = @data + temp # ☆ ココまで変更 # 空白を追加 @data.push(nil) # ビットマップを作成し、全項目を描画 @item_max = @data.size self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max-1 draw_item(i) end end #-------------------------------------------------------------------------- # ○ 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- alias appraise_draw_item draw_item def draw_item(index) if Annex::REPEAT_UNJUDGE appraise_draw_item(index) else item = @data[index] flag = item.is_unjudge? # 未鑑定アイテムで無い場合は呼び戻す if flag == false appraise_draw_item(index) return end # 未鑑定アイテムの所持数は1限定 number = 1 bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.color = normal_color 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 end #============================================================================== # ■ Window_ShopNumber #============================================================================== class Window_ShopNumber < Window_Base #-------------------------------------------------------------------------- # ○ アイテム、最大個数、価格の設定 #-------------------------------------------------------------------------- alias appraise_set set def set(item, max, price) # 重複が許可されていない場合は最大個数は1 if item.is_unjudge? and (not Annex::REPEAT_UNJUDGE) max = [max, 1].min end # 呼び戻し appraise_set(item, max, price) end end #============================================================================== # ■ Window_ShopStatus #============================================================================== class Window_ShopStatus < Window_Base #-------------------------------------------------------------------------- # ● リフレッシュ (再定義) #-------------------------------------------------------------------------- def refresh self.contents.clear if @item == nil return end 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 # ☆ ココから追加 # 未鑑定品で重複を許可していない場合は持っている数は1になる。 if @item.is_unjudge? and (not Annex::REPEAT_UNJUDGE) number = [number, 1].min end # ☆ ココまで追加 self.contents.font.color = system_color self.contents.draw_text(4, 0, 200, 32, "持っている数") self.contents.font.color = normal_color self.contents.draw_text(204, 0, 32, 32, number.to_s, 2) if @item.is_a?(RPG::Item) return end # ☆ ココから追加 # 未鑑定品の装備を許可していない場合は表示されない if @item.is_unjudge? and (not Annex::CAN_EQUIP_UNJUDGE) return end # ☆ ココまで追加 # 装備品追加情報 for i in 0...$game_party.actors.size # アクターを取得 actor = $game_party.actors[i] # 装備可能なら通常文字色に、不可能なら無効文字色に設定 if actor.equippable?(@item) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end # アクターの名前を描画 self.contents.draw_text(4, 64 + 64 * i, 120, 32, actor.name) # 現在の装備品を取得 if @item.is_a?(RPG::Weapon) item1 = $data_weapons[actor.weapon_id] elsif @item.kind == 0 item1 = $data_armors[actor.armor1_id] elsif @item.kind == 1 item1 = $data_armors[actor.armor2_id] elsif @item.kind == 2 item1 = $data_armors[actor.armor3_id] else item1 = $data_armors[actor.armor4_id] end # 装備可能な場合 if actor.equippable?(@item) # 武器の場合 if @item.is_a?(RPG::Weapon) atk1 = item1 != nil ? item1.atk : 0 atk2 = @item != nil ? @item.atk : 0 change = atk2 - atk1 end # 防具の場合 if @item.is_a?(RPG::Armor) pdef1 = item1 != nil ? item1.pdef : 0 mdef1 = item1 != nil ? item1.mdef : 0 pdef2 = @item != nil ? @item.pdef : 0 mdef2 = @item != nil ? @item.mdef : 0 change = pdef2 - pdef1 + mdef2 - mdef1 end # パラメータの変化値を描画 self.contents.draw_text(124, 64 + 64 * i, 112, 32, sprintf("%+d", change), 2) end # アイテムを描画 if item1 != nil x = 4 y = 64 + 64 * i + 32 bitmap = RPG::Cache.icon(item1.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, item1.name) end end end end #============================================================================== # ■ Scene_Item #============================================================================== class Scene_Item #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- alias appraise_update update def update # 未鑑定アイテムウィンドウがアクティブの場合: update_unjudge を呼ぶ if @unjudge_window != nil # ウィンドウを更新 @help_window.update @unjudge_window.update @result_window.update if @result_window.visible == true update_appraisal_result return end update_appraisal return end # 呼び戻し appraise_update end #-------------------------------------------------------------------------- # ○ フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias appraise_update_item update_item def update_item # C ボタンが押された場合 + 鑑定アイテムの場合 if @item_window.item.is_a?(RPG::Item) and include_element?(@item_window.item.element_set, Annex::APPRAISE_ELEMENT) if Input.trigger?(Input::C) # アイテムウィンドウで現在選択されているデータを取得 @item = @item_window.item # 使用できない場合 unless $game_party.item_can_use?(@item.id) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 鑑定ウィンドウの設定 @unjudge_window = Window_UnJudge_Item.new @unjudge_window.help_window = @help_window # 未鑑定アイテムが無い場合 if @unjudge_window.itemless? # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) # 鑑定ウィンドウを解放 @unjudge_window.dispose @unjudge_window = nil return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @item_window.active = false # x 座標の調整 @unjudge_window.x = (@item_window.index + 1) % 2 * 304 @unjudge_window.index = 0 # 鑑定結果を表示するウィンドウを作成 @result_window = Window_Judge_Result.new return end end # 未鑑定アイテムの場合 if @item_window.item.is_a?(RPG::Item) and @item_window.item.is_unjudge? and Annex::CAN_USE_UNJUDGE if Input.trigger?(Input::C) # アイテムウィンドウで現在選択されているデータを取得 @item = @item_window.item unless @item.is_a?(RPG::Item) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 使用できない場合 unless $game_party.item_can_use?(@item.id) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # 鑑定後のアイテムを取得 use_item = $data_items[@item.true_id] # 効果範囲が味方の場合 if use_item.scope >= 3 # ターゲットウィンドウをアクティブ化 @item_window.active = false @target_window.x = (@item_window.index + 1) % 2 * 304 @target_window.visible = true @target_window.active = true # 効果範囲 (単体/全体) に応じてカーソル位置を設定 if use_item.scope == 4 || use_item.scope == 6 @target_window.index = -1 else @target_window.index = 0 end # 効果範囲が味方以外の場合 else # コモンイベント ID が有効の場合 if use_item.common_event_id > 0 # コモンイベント呼び出し予約 $game_temp.common_event_id = use_item.common_event_id # アイテムの使用時 SE を演奏 $game_system.se_play(use_item.menu_se) # 消耗品の場合 if @item.consumable # 使用したアイテムを 1 減らす $game_party.lose_item(@item.id, 1) # アイテムウィンドウの項目を再描画 @item_window.refresh end # マップ画面に切り替え $scene = Scene_Map.new return end end return end end # 呼び戻し appraise_update_item end #-------------------------------------------------------------------------- # ○ フレーム更新 (ターゲットウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias appraise_update_target update_target def update_target if Input.trigger?(Input::C) # 呼び戻し appraise_update_target # 未鑑定アイテムを使用し、それが重複不許可の場合はtargetから戻る if @item.is_unjudge? and Annex::REPEAT_UNJUDGE == false @item_window.refresh # ターゲットウィンドウを消去 @item_window.active = true @target_window.visible = false @target_window.active = false end return end return appraise_update_target end #-------------------------------------------------------------------------- # ◎ 追加:フレーム更新 (未鑑定アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_appraisal # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # アイテム鑑定終了 end_appraisal return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 未鑑定アイテムウィンドウで現在選択されているデータを取得 unjudge_item = @unjudge_window.item # 鑑定後のアイテムを取得 new_item = get_appraisal_item(unjudge_item) # now_item = 鑑定後のアイテムを既にいくつもっているか # get_item = 鑑定によって増加するアイテム数 case new_item when RPG::Item now_item = $game_party.item_number(new_item.id) get_item = $game_party.item_number(unjudge_item.id) when RPG::Weapon now_item = $game_party.weapon_number(new_item.id) get_item = $game_party.weapon_number(unjudge_item.id) when RPG::Armor now_item = $game_party.armor_number(new_item.id) get_item = $game_party.armor_number(unjudge_item.id) end # 重複を許可していない場合は get_item は1に。 if not Annex::REPEAT_UNJUDGE get_item = 1 end # 鑑定アイテムが消耗品の場合 if @item.consumable # 鑑定に使用したアイテムを消費 $game_party.lose_item(@item.id, 1) # アイテムウィンドウを再描画 @item_window.refresh end # ウェイトカウントをとりあえず設定しておく @change_wait_count = 50 # 所持限界を超えている場合 if (now_item + get_item) > 99 # 変化失敗 SE を演奏 if Annex::JUDGE_FAILURE_SE != nil s = Annex::JUDGE_FAILURE_SE if s[0] != "" Audio.se_play("Audio/SE/" + s[0], s[1], s[2]) end end # リザルトウィンドウに失敗の旨を表示 @result_window.set_item("Miss") return end # 鑑定 SE を演奏 if Annex::JUDGE_SUCCESS_SE != nil s = Annex::JUDGE_SUCCESS_SE if s[0] != "" Audio.se_play("Audio/SE/" + s[0], s[1], s[2]) end end # 鑑定後のアイテムを入手し、鑑定前のアイテムを減少させる case new_item when RPG::Item $game_party.gain_item(new_item.id, get_item) $game_party.lose_item(unjudge_item.id, get_item) when RPG::Weapon $game_party.gain_weapon(new_item.id, get_item) $game_party.lose_weapon(unjudge_item.id, get_item) when RPG::Armor $game_party.gain_armor(new_item.id, get_item) $game_party.lose_armor(unjudge_item.id, get_item) end # 未鑑定アイテムウィンドウの再描画 @unjudge_window.refresh @unjudge_window.active = false # 鑑定結果のアイテムを表示する @result_window.set_item(new_item) end end #-------------------------------------------------------------------------- # ◎ 追加:フレーム更新 (鑑定結果ウィンドウが表示状態の場合) #-------------------------------------------------------------------------- def update_appraisal_result # ウェイトカウントの減算 @change_wait_count -= 1 # 最初の 10 フレームは 操作を受け付けない return if @change_wait_count > 30 # C ボタンが押された場合 if Input.trigger?(Input::C) or @change_wait_count == 0 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # リザルトウィンドウの消去 @result_window.visible = false # 鑑定アイテムが残っている場合は続行 if $game_party.item_number(@item.id) > 0 and (not @unjudge_window.itemless?) @unjudge_window.active = true @unjudge_window.index = 0 return end # 残っていない場合は終了 end_appraisal return end if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # アイテム鑑定終了 end_appraisal return end end #-------------------------------------------------------------------------- # ◎ 追加:鑑定後のアイテムを読み込み # item : 鑑定前のアイテム #-------------------------------------------------------------------------- def get_appraisal_item(item) return if item == nil appraisal_item = nil # 未鑑定アイテムならば以下を実行 if item.is_unjudge? case item when RPG::Item appraisal_item = $data_items[item.true_id] when RPG::Weapon appraisal_item = $data_weapons[item.true_id] when RPG::Armor appraisal_item = $data_armors[item.true_id] end end # 鑑定不可能な場合(鑑定結果のIDが不正である場合)は # 鑑定後のアイテムも鑑定前と同じになる。 appraisal_item = item if appraisal_item == nil return appraisal_item end #-------------------------------------------------------------------------- # ◎ 追加:フレーム更新 (未鑑定アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def end_appraisal # ウィンドウ戻し @unjudge_window.dispose @unjudge_window = nil @result_window.dispose @result_window = nil @item_window.active = true end #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列に指定した属性名が含まれているか # element_set : 属性テーブル # name : 属性名 #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end end #============================================================================== # ■ Scene_Shop #============================================================================== class Scene_Shop #-------------------------------------------------------------------------- # ○ フレーム更新 (売却ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias appraise_update_sell update_sell def update_sell # C ボタンが押された場合 if Annex::CAN_SELL_UNJUDGE == false and @sell_window.item.is_unjudge? if Input.trigger?(Input::C) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end end # 呼び戻し return appraise_update_sell end end