# ▽▽▽ XRXSv50. アイテムマテリアル/トラッシュ ▽▽▽ # # publish 2011/ 1/ 3 # update - /22a # # ※素材セクション指定 - 「アーマーアレンジVX」より下 # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV50 # # 「アイテム」をマテリアル化する? # MaterializeItem = true # # 「武器・防具」をマテリアル化する? # MaterializeEquipments = true # # 「だいじなもの」(価格が0のアイテム)のマテリアル化を禁止する? # EssentialItemMaterializeBan = false # # マテリアル化したら、個人バッグに送る? (false で直接パーティバッグへ) # MyBagEnable = true # # アクター個人マテリアルバッグ - 所持最大数(〜8) # BagMAX = 8 # # パーティ共有バッグの所持最大ページ #  ( 8倍したものが所持数になります。 #   0 を指定するとこの機能(限界設定)を無効化になり、アイテム持ち放題に。 #   ※この機能の動作のためにはMeLTアイテム「マテリアルソート+」が必要です。) # PartyBagPageMAX = 4 # # 「アイテム」の基本スタック数 #  ( 2以上にすると基本的に全てのアイテムがグラインダー/合成ベースの対象外になります #   また、アイテムのメモに \stack[99] の様に記述する事で #   そのアイテムごとに個別のスタック数を指定できます #   メモに \stack[1] とする事で個別にグラインダー/合成ベースの対象にできます。 ) # ItemStack = 12 # # 「だいじなもの」(価格0)は↑を問わずスタック1に設定する? # NecessaryItemUnstackable = true # # 「だいじなもの」(価格0)は一括してグラインド・合成先の対象外にする? # NecessaryItemUngrindable = true # # バトル中使用可能・または\quick表記のある「アイテム」を # 一括してスタック1に設定する? # BattleItemUnstack = true # # ドロップアイテム入手時に下記の確率で-1〜+3ランダム発生させる? # RandomGPDrop = true # # イベントコマンド ◆武器/防具の増減 時に下記の確率で-1〜+3ランダム発生させる? #  (グラインド対象外のものはランダム化されません。) # RandomGPGain = true # # 一時的にランダム化を禁止するスイッチID # RandomGPBanSwitchID = 0 # # アイテム-1〜+3出現確率 [単位 : n / 32] # NumeratorMinus1 = 0 NumeratorPlus1 = 8 NumeratorPlus2 = 4 NumeratorPlus3 = 2 # # # ---- [トラッシュ] -------------------------------------------------------- # # # アイテムを消費した時、トラッシュに送る? # Trashable = true # # MeLTアイテム「マテリアルソート+」で「すてる」をした時、トラッシュに送る? # DumpToTrash = true # # 「◆全回復:パーティ全体」の実行時、自動的にトラッシュをすべて消す? # AutoCleaning = false # # 価格 0 のアイテムは全消去↑の対象外にする? # EssentialItemDumpBan = true # # # ---- [グラインダー] ------------------------------------------------------ # # # グラインドポイント+1につきアップする性能 #   (装備性能、HPMP回復率、HP回復量、MP回復量) # EquipGrindPointRate = 1 HPMPRRGrindPointRate = 5 HPRGrindPointRate = 100 MPRGrindPointRate = 20 # # マテリアルグラインド限界基本値 #  (メモに \maxgp[20] のように既述する事で、固有の限界値を設定できます。) # GrindMAX = 99 # # 「アイテム(装備品でない)」であるものは一括してグラインダー対象外にする? # ItemUngrindable = false # # # ---- [マテリアル合成] --------------------------------------------------- # # # マテリアル合成許容量 # ComposeMax = 2 # # 許容量を超えた場合の処理タイプ # (0:古いものから消える、 1: 合成できなくなる) # OverComposingType = 0 # # マテリアル合成数によって追加される接尾文字 # ComposeSuffix = "+" # # 属性セットを合算する? # ElementSetCombine = true # # 装備品に HPMP回復アイテム を合成した場合に発生する最大HPMP上昇率 #  ( HP回復量÷この値 → 最大HP+ ) #  ( HP回復率÷この値 → 最大HP+% ) # この効果を発揮させるためにはXRXSV4「特殊効果詰め合わせ ExtraVX」が必要です。 # HerbalSwordRate = 5 # # マテリアル合成時に合算対象外とする\文字列配列 # UntakableEffectNotes = ["\\grinder", "\\composer", "\\maxgp", "\r\n"] end #============================================================================== # 参照機能 #============================================================================== class Game_Temp attr_accessor :last_gain_material attr_accessor :last_gain_holder end class Game_Party < Game_Unit def overcarry? return @overcarry end end #============================================================================== # 属性活性エネルギーへの対応 #============================================================================== class Game_Unit def element_energies @element_energies ||= [] return @element_energies end end #============================================================================== # アイテムマテリアル機能 #============================================================================== class RPG::BaseItem attr_accessor :material def materialized? return self.material.is_a?(Material) end end class Material attr_reader :id attr_reader :compose_materials attr_accessor :gp attr_accessor :note_plus attr_accessor :number attr_reader :item_class attr_accessor :spiritual attr_accessor :location def initialize(item) @item_class = item.class @id = item.id @use_ok = true @spiritual = false @gp = 0 @number = 1 @compose_materials = [] end def stack_max max = 1 if self.original_item.is_a?(RPG::Item) if XRXSV50::BattleItemUnstack and (self.original_item.occasion <= 1 or self.original_item.note[/\\quick/]) # elsif XRXSV50::NecessaryItemUnstackable and self.original_item.price == 0 # else max = XRXSV50::ItemStack end end self.original_item.note.gsub(/\\stack\[([0-9]+?)\]/) do max = $1.to_i end return max end def stackable? return stack_max >= 2 end def trash! @use_ok = false end def original_item if @item_class == RPG::Weapon item = $data_weapons[@id] elsif @item_class == RPG::Armor item = $data_armors[@id] elsif @item_class == RPG::Item item = $data_items[@id] else item = nil end return item end def item item = self.original_item if item item = item.dup item.material = self if not @use_ok item.occasion = 3 end if @gp != 0 item.name += "+" if @gp >= 1 item.name += @gp.to_s if item.is_a?(RPG::Weapon) or item.is_a?(RPG::Armor) n = @gp * XRXSV50::EquipGrindPointRate max = [item.atk, item.def, item.spi, item.agi, 1].max item.atk += n if item.atk == max item.def += n if item.def == max item.spi += n if item.spi == max item.agi += n if item.agi == max elsif item.is_a?(RPG::Item) n1 = @gp * XRXSV50::HPMPRRGrindPointRate n2 = @gp * XRXSV50::HPRGrindPointRate n3 = @gp * XRXSV50::MPRGrindPointRate item.hp_recovery_rate += n1 if item.hp_recovery_rate >= 1 item.mp_recovery_rate += n1 if item.mp_recovery_rate >= 1 item.hp_recovery += n2 if item.hp_recovery >= 1 item.mp_recovery += n3 if item.mp_recovery >= 1 item.parameter_points += @gp if item.parameter_points >= 1 end end for material in @compose_materials note1 = material.item.note.dup for note2 in XRXSV50::UntakableEffectNotes note1.gsub!(note2) {""} end if material.item.is_a?(RPG::Item) and (item.is_a?(RPG::Weapon) or item.is_a?(RPG::Armor)) n = material.item.hp_recovery / XRXSV50::HerbalSwordRate note1 += sprintf("\\hp\[%s\]", n.to_s) if n >= 1 n = material.item.hp_recovery_rate / XRXSV50::HerbalSwordRate note1 += sprintf("\\hppercent\[%s\]", n.to_s) if n >= 1 n = material.item.mp_recovery / XRXSV50::HerbalSwordRate note1 += sprintf("\\mp\[%s\]", n.to_s) if n >= 1 n = material.item.mp_recovery_rate / XRXSV50::HerbalSwordRate note1 += sprintf("\\mppercent\[%s\]", n.to_s) if n >= 1 end if (material.item.fast_attack rescue false) and not note1.include?("\\fast_attack") note1 += "\\fast_attack" end if (material.item.dual_attack rescue false) and not note1.include?("\\dual_attack") note1 += "\\dual_attack" end if (material.item.prevent_critical rescue false) and not note1.include?("\\prevent_critical") note1 += "\\prevent_critical" end if (material.item.half_mp_cost rescue false) and not note1.include?("\\half_mp_cost") note1 += "\\half_mp_cost" end if (material.item.double_exp_gain rescue false) and not note1.include?("\\double_exp_gain") note1 += "\\double_exp_gain" end if (material.item.late_attack rescue false) and not note1.include?("\\late_attack") note1 += "\\late_attack" end if (material.item.slip_guard rescue false) and not note1.include?("\\slip_guard") note1 += "\\slip_guard" end if (material.item.eye_guard rescue false) and not note1.include?("\\eye_guard") note1 += "\\eye_guard" end if (material.item.wstar rescue false) and not note1.include?("\\wstar") note1 += "\\wstar" end item.note += note1 if XRXSV50::ElementSetCombine item.element_set = item.element_set.dup item.element_set += material.item.element_set item.element_set.uniq! end item.name += XRXSV50::ComposeSuffix end if self.spiritual item.occasion = 1 end end return item end def price item = self.item return (item ? item.price : 0) end def is_a?(obj_class) return (super(obj_class) or self.item.is_a?(obj_class)) end def maxgp maxgp = nil text = self.original_item.note.dup text.gsub(/\\maxgp\[([0-9]+?)\]/) do maxgp = $1.to_i if maxgp == nil or maxgp < $1.to_i end maxgp = XRXSV50::GrindMAX unless maxgp return maxgp end def gp_max? return (self.gp >= self.maxgp) end def grindable? return false if stackable? return false if XRXSV50::ItemUngrindable and self.original_item.is_a?(RPG::Item) return false if XRXSV50::NecessaryItemUngrindable and self.original_item.is_a?(RPG::Item) and self.price == 0 return false if gp_max? return true end def composable? return false if stackable? return false if XRXSV50::NecessaryItemUngrindable and self.original_item.is_a?(RPG::Item) and self.price == 0 return false if @compose_materials.size >= XRXSV50::ComposeMax and XRXSV50::OverComposingType == 1 return true end def compose_usable? return false if self.original_item.price == 0 return true end def spiritualizable? return (not self.spiritual and self.original_item.is_a?(RPG::Item) and not self.stackable? and self.original_item.quick?) end def gp_plus(p) return false unless grindable? max = maxgp self.gp = [[self.gp + p, max].min, -1 * max].max return true end def compose(material) return false unless composable? return false unless material.is_a?(Material) if @compose_materials.size >= XRXSV50::ComposeMax @compose_materials.shift end gp_plus(material.gp) material.gp = 0 @compose_materials.push(material) return true end end #============================================================================== # マテリアル用の追加判定 #============================================================================== class Game_Party < Game_Unit alias xrxs50_items items def items set = xrxs50_items for holder in self.members + [self] for material in holder.bag set.push(material.item) end end return set end alias xrxsv50_has_item? has_item? def has_item?(item, include_equip = false) if item and include_equip for actor in self.members for material in actor.equip_materials if material and item == material.original_item return true end end end end return xrxsv50_has_item?(item, include_equip) end #-------------------------------------------------------------------------- # アイテム個数の取得 #-------------------------------------------------------------------------- alias xrxsv50_item_number item_number def item_number(item) if item and item.materialized? number = item.material.number else number = xrxsv50_item_number(item) for holder in self.members + [self] for material in holder.bag if material.original_item == item number += material.number end end end end return number end end #============================================================================== # マテリアルの交換処理 #============================================================================== class Material def self.replace(bag1, index1, bag2, index2) material1 = bag1[index1] material2 = bag2[index2] bag1[index1] = material2 bag2[index2] = material1 #material2.location = bag1 if material2 #material1.location = bag2 if material1 bag1.compact! bag2.compact! end end #============================================================================== # マテリアルの入手処理 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ● アイテムの増加 (減少) #-------------------------------------------------------------------------- alias xrxsv50_gain_item gain_item def gain_item(item, n, include_equip = false) if for_material?(item) if n >= 1 n.times do material = (item.materialized? ? item.material : Material.new(item)) gain_material(material) end elsif n <= -1 if item.materialized? lose_material(item.material, n.abs, include_equip) else lose_material_by_item(item, n.abs, include_equip) end end check_material_overcarry else xrxsv50_gain_item(item, n, include_equip) end end #-------------------------------------------------------------------------- # マテリアル化するアイテム種類のカスタマイズ分岐(for_material?の定義を分岐) #-------------------------------------------------------------------------- if XRXSV50::MaterializeItem and XRXSV50::MaterializeEquipments if XRXSV50::EssentialItemMaterializeBan def for_material?(item) return (item and item.price >= 1) end else def for_material?(item) return (item != nil) end end elsif XRXSV50::MaterializeItem if XRXSV50::EssentialItemMaterializeBan def for_material?(item) return (item.is_a?(RPG::Item) and item.price >= 1) end else def for_material?(item) return item.is_a?(RPG::Item) end end elsif XRXSV50::MaterializeEquipments def for_material?(item) return (item.is_a?(RPG::Weapon) or item.is_a?(RPG::Armor)) end else def for_material?(item) return false end end #-------------------------------------------------------------------------- # マテリアルの入手 #-------------------------------------------------------------------------- def gain_material(new_material) got = false if XRXSV50::MyBagEnable for actor in self.members got = check_stackable_material(actor, new_material) break if got if actor.bag.size < XRXSV50::BagMAX actor.bag.push(new_material) #new_material.location = actor.bag $game_temp.last_gain_holder = actor got = true break end end end unless got got = check_stackable_material(self, new_material) end unless got self.bag.push(new_material) #new_material.location = self.bag $game_temp.last_gain_holder = self end $game_temp.last_gain_material = new_material end #-------------------------------------------------------------------------- # スタック可能なものの検索と、スタック可能ならその場で入手 #-------------------------------------------------------------------------- def check_stackable_material(holder, new_material) got = false for material in holder.bag if material.item_class == new_material.item_class and material.id == new_material.id and material.number < material.stack_max material.number += 1 $game_temp.last_gain_holder = holder got = true break end end return got end #-------------------------------------------------------------------------- # 「アイテムを持ちきれない」の判定 #-------------------------------------------------------------------------- if XRXSV50::PartyBagPageMAX >= 1 def check_material_overcarry @overcarry = (self.bag.size > XRXSV50::PartyBagPageMAX * 8) end else def check_material_overcarry end end #-------------------------------------------------------------------------- # マテリアルを捨てる - マテリアル(Material)指定 #-------------------------------------------------------------------------- def lose_material(material, n, include_equip = false) #material.number -= n #if material.number <= 0 # material.number = 1 # material.location.delete(material) # check_material_overcarry #end if self.element_energies.include?(material) self.element_energies.delete(material) else deleted = false for holder in self.members + [self] for bag_material in holder.bag if bag_material == material bag_material.number -= n if bag_material.number <= 0 bag_material.number = 1 holder.bag.delete(bag_material) check_material_overcarry end deleted = true break end end if not deleted and include_equip and holder.is_a?(Game_Actor) holder.equip_materials.delete(material) deleted = true end end end end #-------------------------------------------------------------------------- # マテリアルを捨てる - アイテム(RPG::Item)指定で検索 #-------------------------------------------------------------------------- def lose_material_by_item(item, include_equip = false) deleted = false for holder in self.members + [self] for material in holder.bag if item == material.original_item material.number -= 1 if material.number <= 0 material.number = 1 holder.bag.delete(material) end deleted = true break end end if not deleted and include_equip and holder.is_a?(Game_Actor) for i in 0...holder.equip_materials.size material = holder.equip_materials[i] if material and item == material.original_item holder.discard_equip(item) holder.equip_materials[i] = nil deleted = true break end end end break if deleted end end end #============================================================================== # マテリアルバッグ/トラッシュ機能 #============================================================================== class Game_Party < Game_Unit def bag @bag ||= [] return @bag end def trash @trash ||= [] return @trash end end class Game_Actor < Game_Battler def bag @bag ||= [] return @bag end end #============================================================================== # アイテムトラッシュ化 #============================================================================== class Game_Party < Game_Unit def trash_item(item) if item.is_a?(Material) material = item else material = Material.new(item) material.trash! end self.trash.unshift(material) end end #============================================================================== # マテリアルダンプ時の追加処理 #============================================================================== if XRXSV50::DumpToTrash module XRXSV50_DumpItem def dump_material(material, n) super material.trash! self.trash.unshift(material) end end class Game_Party < Game_Unit include XRXSV50_DumpItem end end #============================================================================== # アイテムの消耗時の追加判定 #============================================================================== if XRXSV50::Trashable class Game_Party < Game_Unit alias xrxsv50_consume_item consume_item def consume_item(item) n1 = $game_party.item_number(item) xrxsv50_consume_item(item) n2 = $game_party.item_number(item) if n1 != n2 and item $game_party.trash_item(item) end end end end #============================================================================== # トラッシュクリーンアップ #============================================================================== if XRXSV50::AutoCleaning class Game_Interpreter alias xrxsv50_command_314 command_314 def command_314 if @params[0] == 0 if XRXSV50::EssentialItemDumpBan for_dump = [] for material in $game_party.trash if material.price >= 1 for_dump.push(material) end end for material in for_dump $game_party.trash.delete(material) end else $game_party.trash.clear end end return xrxsv50_command_314 end end end #============================================================================== # マテリアル装備機能 #============================================================================== class Game_Actor < Game_Battler attr_accessor :equip_materials def equip_materials @equip_materials ||= [] return @equip_materials end if XRXSV50::MaterializeEquipments alias xrxsv50_weapons weapons def weapons set = xrxsv50_weapons weapon1 = self.equip_materials[0] set[0] = weapon1.item if weapon1.is_a?(RPG::Weapon) weapon2 = self.equip_materials[1] set[1] = weapon2.item if weapon2.is_a?(RPG::Weapon) return set end alias xrxsv50_armors armors def armors set = xrxsv50_armors n = two_swords_style ? -1 : 0 for i in 1...self.equip_materials.size armor = self.equip_materials[i] set[n + i - 1] = armor.item if armor.is_a?(RPG::Armor) end return set end #-------------------------------------------------------------------------- # ● 装備の変更 (オブジェクトで指定) #-------------------------------------------------------------------------- alias xrxsv50_change_equip change_equip def change_equip(equip_type, item, test = false) equip_index = equip_type new_location = nil if test or $game_party.item_number(item) >= 1 if test self.equip_materials = self.equip_materials.dup end if item and item.materialized? self.equip_materials[equip_index] = item.material new_location = self.equip_materials end end xrxsv50_change_equip(equip_type, item, test) if item == nil and self.equip_materials[equip_index] self.equip_materials[equip_index] = nil end if new_location #item.material.location = new_location end end end end #============================================================================== # アイテムの増減 の追加処理 #============================================================================== if XRXSV50::RandomGPGain class Game_Interpreter alias xrxsv50_command_127 command_127 def command_127 value = operate_value(@params[1], @params[2], @params[3]) if not $game_switches[XRXSV50::RandomGPBanSwitchID] and value >= 1 item = $data_weapons[@params[0]] material = Material.new(item) material.gp_plus(XRXSV50::random_gp!) last_param = @params[0] n = $data_weapons.size @params[0] = n $data_weapons[n] = material.item # xrxsv50_command_127 # @params[0] = last_param $data_weapons.delete(material.item) else xrxsv50_command_127 end end alias xrxsv50_command_128 command_128 def command_128 value = operate_value(@params[1], @params[2], @params[3]) if not $game_switches[XRXSV50::RandomGPBanSwitchID] and value >= 1 item = $data_armors[@params[0]] material = Material.new(item) material.gp_plus(XRXSV50::random_gp!) last_param = @params[0] n = $data_armors.size @params[0] = n $data_armors[n] = material.item # xrxsv50_command_128 # @params[0] = last_param $data_weapons.delete(material.item) else xrxsv50_command_128 end end end end module XRXSV50 def self.random_gp! n = rand(32) set = [3] * XRXSV50::NumeratorPlus3 + [2] * XRXSV50::NumeratorPlus2 + [1] * XRXSV50::NumeratorPlus1 + [-1]* XRXSV50::NumeratorMinus1 set += [0] * [32 - set.size, 0].max gp = set[n] return gp end end #============================================================================== # ドロップアイテムの追加処理 #============================================================================== if XRXSV50::RandomGPDrop class Game_Troop < Game_Unit alias xrxsv50_make_drop_items make_drop_items def make_drop_items items = xrxsv50_make_drop_items materialized_items = [] for item in items gp = XRXSV50.random_gp! material = Material.new(item) material.gp_plus(gp) materialized_items.push(material.item) end return materialized_items end end end #============================================================================== # 「持ちきれないアイテム」選択画面 #============================================================================== if XRXSV50::PartyBagPageMAX >= 1 class Window_OverCarrySelectItemCommand < Window_ItemCommand def command_id_data return [14] end end class Scene_OverCarrySelect < Scene_Item def auto_command_select? return true end def create_command_window @command_window = Window_OverCarrySelectItemCommand.new @actorstatus_window = Window_OverCarryHelp.new @actorstatus_window.refresh @material_windowset.enable_type(4) end def return_scene if $game_party.overcarry? Sound.play_buzzer else $scene = Scene_Map.new end end end class Window_OverCarryHelp < Window_Help def initialize super self.opacity = 0 @back_window = Window_Base.new(-16,10,self.width+32, 36) @back_window.z = self.z - 3 @back_window.opacity = 160 end def dispose super @back_window.dispose end def refresh if $game_party.overcarry? @back_window.visible = true self.set_text("アイテムが持ちきれません。") else @back_window.visible = false self.set_text("") end end end end #============================================================================== # 持ちきれないアイテム選択画面コール処理 #============================================================================== if XRXSV50::PartyBagPageMAX >= 1 class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● 画面切り替えの実行 #-------------------------------------------------------------------------- alias xrxsv50_update_scene_change update_scene_change def update_scene_change return if $game_player.moving? # プレイヤーの移動中? if $game_party.overcarry? call_overcarry else xrxsv50_update_scene_change end end #-------------------------------------------------------------------------- # 持ちきれないアイテム選択画面への切り替え #-------------------------------------------------------------------------- def call_overcarry $game_temp.next_scene = nil $scene = Scene_OverCarrySelect.new end end end