=begin よくある武器とか防具とかの改造システムの基幹部分です。 武器や防具を自動生成してみたり、アイテム集めて改造してみたり 生きている装備品が成長したりとか そういうのを出来るようにしてみたいけど、 (主に)データベースとかどうやって弄ればいいのかわかんね。 っていう人向けのスクリプトです。 ただしこのスクリプトは建造物に例えるなら基礎の部分であり家屋は付属していません。 っていうか上に上げた武器防具に対しての各種アルゴリズムって 普通自分で考えるんじゃね? 放置でよくね? 特徴 ・エディタのデータベースを一切弄らない ・$data_weaponsの1000〜3000番を使用するので使わないでください、  とかそういう事言わない。柔軟剤使ったくらいには柔軟。 ・できるかぎりシンプル。驚きの白さ。 ・ただし作った物が行方不明になりやすい  (正確に言うと、アイテムとIDの対応が製作者には全く予想不可能。   どのアイテムのIDが:100か判らない。   逆にID:101のアイテムがなんのことかさっぱり。   尤もこの手のシステムすべてが抱えている問題ではある。) ・デフォルトのアイテム群と自然な共存が可能。 ・改造自体は容易 ・改造を施すシーンやシステムは丸投げ ・イベント組んで頑張れ(´ω`) メソッド(重要な物) $game_system.clone_item( symbol , id_or_name) symbolには :weapons :armors :items :skills のいずれか id_or_nameはIDか名前を入力 ・オブジェクトのコピー ・IDの作成 ・データベースへ登録 各種処理を行った上でアイテムのオブジェクトを返す item = $game_system.clone_item(:weapons , "ロングソード") item.atk += 10 $game_party.gain_item(item, 1) で通常より攻撃力の高いロングソードをゲッツ可。 または item = $game_system.clone_item(:armors , 3) item.def += 10 $game_party.gain_item(item, 1) 以上で通常より防御力の大きなフレイムシールド入手。 =end # データベースクラス # ゲーム進行中に変更された改造アイテムどもと # エディタで作ったアイテムを纏めて管理します。 # 内部はオリジナルのデータベースと # 改造済みデータのハッシュで構成されています。 # 改造済みのデータは@db。 # このハッシュはゲームシステム内からも参照されているため、 # セーブ時には自動的にセーブが行われます。 # オリジナルの添字は「IDの数字」で ex => 111 # 改造データの添字は「連番の数字のシンボル」です。 ex => :555 class Data_Base def initialize(original_data,hash) @original = original_data @db = hash end def size return @original.size end def push(obj) if obj.id.kind_of?(Symbol) @db[obj.id] = obj else @original << obj end end alias << push def []=(id,obj) if n.kind_of?(Symbol) @db[id] = obj else @original[id] = obj end end def [](id) if id.kind_of?(Symbol) return @db[id] else return @original[id] end rescue p caller end def object_list return @db.values end def original_list return @original end def +@(arr) return @original + @db.values + arr end def delete(obj) @db.delete(obj.id) end def inspect return @db.inspect end end # RPGモジュール内のクラスに対して各メソッドを追加します # 主な物はオリジナルのIDやオリジナルオブジェクトを参照するための # メソッドとインスタンス変数です。 module RPG class UsableItem < BaseItem def original_id return @original_id ||= @id end end class Skill < UsableItem def original return $data_skills[self.original_id] end end class Item < UsableItem def original return $data_items[self.original_id] end end class Weapon def original_id return @original_id ||= @id end def original return $data_weapons[self.original_id] end end class Armor def original_id return @original_id ||= @id end def original return $data_armors[self.original_id] end end end # 一部データベースを配列から新造クラスに変更します # DBオブジェクト内部のハッシュは$game_systemからも参照されているため、 # セーブの際に別に何かを弄る必要はありません。 class Scene_Title < Scene_Base alias new_data_base_create create_game_objects def create_game_objects new_data_base_create $data_weapons = Data_Base.new($data_weapons,$game_system.weapons_exdb) $data_armors = Data_Base.new ($data_armors ,$game_system.armors_exdb) $data_items = Data_Base.new ($data_items ,$game_system.items_exdb) $data_skills = Data_Base.new ($data_skills ,$game_system.skills_exdb) end end # ファイルのロード class Scene_File < Scene_Base alias new_data_base_read read_save_data def read_save_data(file) new_data_base_read(file) $data_weapons = Data_Base.new($data_weapons,$game_system.weapons_exdb) $data_armors = Data_Base.new ($data_armors ,$game_system.armors_exdb) $data_items = Data_Base.new ($data_items ,$game_system.items_exdb) $data_skills = Data_Base.new ($data_skills ,$game_system.skills_exdb) end end # ゲームシステムへのメソッド定義 # #get_weapons_id # シンボル化されたシンボルのゲッタ # 自動的に連番になります # #weapons_exdb # ゲーム内で生成されたアイテムを保存しておくハッシュ class Game_System def clone_item(type , id_or_name) data = eval("$data_#{type.to_s}") if id_or_name.kind_of?(Integer) item = data[id_or_name] else item = data.original_list.compact.find{|item| item.name == id_or_name} end item = Marshal.load(Marshal.dump(item)) #コピる item.original_id #オリジナルのID定義 item.id = eval("$game_system.get_#{type.to_s}_id") # ID変更 data << item return item rescue p "存在しないアイテム、或いはデータベースが指定されました。 $game_system.clone_item(:*** , *** )を確認してください" end %w(weapons armors items skills).each{|name| eval( "def get_name_id @exdb_id_name ||= -1 return ( @exdb_id_name += 1 ).to_s.to_sym end def name_exdb return @name_exdb ||= {} end ".gsub!("name"){name} ) } end # 以下再定義群 class Game_Actor < Game_Battler def learn_skill(skill_id) unless skill_learn?($data_skills[skill_id]) @skills.push(skill_id) @skills.sort!{ | a , b | $data_skills[a].original_id <=> $data_skills[b].original_id} end end def equippable?(item) if item.is_a?(RPG::Weapon) return self.class.weapon_set.include?(item.original_id) elsif item.is_a?(RPG::Armor) return false if two_swords_style and item.kind == 0 return self.class.armor_set.include?(item.original_id) end return false end end class Game_Party < Game_Unit def items items = [] for i in @items.keys items.push($data_items[i]) if @items[i] > 0 end weapons = [] for i in @weapons.keys weapons.push($data_weapons[i]) if @weapons[i] > 0 end armors = [] for i in @armors.keys armors.push($data_armors[i]) if @armors[i] > 0 end items.sort!{|a,b|a.original_id <=> b.original_id} weapons.sort!{|a,b|a.original_id <=> b.original_id} armors.sort!{|a,b|a.original_id <=> b.original_id} return items + weapons + armors end end # ■ Scene_Shop # データベースからアイテムを削除する処理の追加 # 基本的にアイテムの失う機会はショップでの売却だけを想定しています。 class Scene_Shop < Scene_Base # ● 個数入力の決定 def decide_number_input Sound.play_shop @number_window.active = false @number_window.visible = false case @command_window.index when 0 # 購入する $game_party.lose_gold(@number_window.number * @item.price) $game_party.gain_item(@item, @number_window.number) @gold_window.refresh @buy_window.refresh @status_window.refresh @buy_window.active = true @buy_window.visible = true when 1 # 売却する $game_party.gain_gold(@number_window.number * (@item.price / 2)) $game_party.lose_item(@item, @number_window.number) unless $game_party.has_item?(@item, include_equip = true) case @item when RPG::Weapon ; $data_weapons.delete @item when RPG::Armor ; $data_armors.delete @item when RPG::Item ; $data_items.delete @item end end @gold_window.refresh @sell_window.refresh @status_window.refresh @sell_window.active = true @sell_window.visible = true @status_window.visible = false end end end