#============================================================================== # ●装備する事で戦闘中にアイテムを使えるようになるスクリプト # # Ver1.01 # パーティアイテムを戦闘中に使えるアイテムを追加 # 装備可能な防具数を拡張できるようになった。 # # 重くなるのと、実用性の観点から意味はありませんが、 # 装備数30個とかでも動作します。 # 装備拡張系スクリプトの性によって、種類数増えたり、所持品多いと重いです。 # # ステータス画面のほうも多少弄ってあります。 # いらんことするなーって人は、一番下のほうにありますので適宜修正。 # 装備画面弄りたい人は、 #ER_Windowジャンプで検索してジャンプ。 # # ■防具のメモ欄に ER_装備拡張[4] と書けば、種類ID4の防具になります # ■アイテムメモ欄に、 ER_バックパック と書けば、 # パーティアイテムを使うためのトリガーアイテムになります。 # # テストだと出なかったけど、一応F12問題に対応。 # せっかく教えてもらったんだから、実装しないと意味が無いよな! #============================================================================== # 防御装備が種類による制限がなくなるスクリプトを改造 # 装飾品は何種類でも装備できますが、 # 他の装備は重ねて装備する事はできません。 # # 武器と盾の場所は固定です。 # # アイテムは種類ID-1と判定され、装飾品(ID3)と同じように # 何個でも装備する事ができます。 # # なーんか、思ったより大規模になったなぁ。 # よくよく見るとけっこうムダがあるかも…。 # バグが出ませんように。(願掛け) # # 戦闘スクリプトと競合する可能性大。execute_action_itemを治せば併用できるはず。 # そういや戦闘テストに対応してないかも。でも正直、私あれ使ったことないんですよ。 # #============================================================================== #アイテム装備システムを使用するかどうか ER_BP_USE_EQUIPITEM_SYS = true #防具に共通の種類名を使用するかどうか ER_BP_USE_ARMOR_KIND_NAME = true #共通の種類名 ER_BP_NORMAL_ARMOR_NAME = "装備" #拡張するアイテム所持数 ER_BP_EXPANSION_EQUIP_TYPE_MAX = 3 #他種類の装備ができない防具の種類ID。盾は固定を外すと処理がまずいかも。 #0:盾 1:頭防具 2:鎧 3:装飾品。 ER_BP_LOCKED_ARMOR_KIND = [0] #重複が可能な防具種類ID。 ER_BP_ENABLE_REPITITION_ARMOR_KIND = [-1,3] #拡張した装備種類の名前を設定。とりあえずサンプルとしてテキトーに何個か。 ER_EXPANSION_ARMOR_KIND = { 4=>"足防具" , 5=>"小手" , 6=>"眼鏡" } class Game_Actor < Game_Battler #戦闘中使用可能なアイテムなら装備可能。 #戦闘中使用可能設定でも装備できなくしたいならここ弄る alias er_bp_equippable? equippable? unless $@ def equippable?(item) return item.battle_ok? if item.is_a?(RPG::Item) return er_bp_equippable?(item) end #使用した装備アイテムの消耗。消耗なしだと消耗しない。 #アイテム選択時の位置による差がなく、装備の上から順に消耗していきます def er_bp_consume_equip(equip) if @back_pack_item_id != nil result = $game_party.consume_item(equip) bp = $data_items[@back_pack_item_id] @back_pack_item_id = nil er_bp_consume_equip(bp) return result end return true if not equip.is_a?(RPG::Item) or not equip.consumable index = armors.index(equip) eval("@armor#{index+1}_id = 0") if index.is_a?(Numeric) return true end def set_back_pack_item(item) return @back_pack_item_id = nil if item == nil @back_pack_item_id = item.id end end class Window_EquipItem < Window_Item #-------------------------------------------------------------------------- # ● アイテムをリストに含めるかどうか # item : アイテム #  ※再定義 #-------------------------------------------------------------------------- def include?(item) return true if item == nil if @equip_type == 0 return false unless item.is_a?(RPG::Weapon) elsif ER_BP_LOCKED_ARMOR_KIND.include?(@equip_type-1) return false if not item.is_a?(RPG::Armor) return false if not item.kind == @equip_type - 1 else return false if not item.is_a?(RPG::Armor) and (not item.is_a?(RPG::Item) or not ER_BP_USE_EQUIPITEM_SYS) return false if ER_BP_LOCKED_ARMOR_KIND.include?(item.kind) end return @actor.equippable?(item) end #-------------------------------------------------------------------------- # ● アイテムを許可状態で表示するかどうか # item : アイテム #-------------------------------------------------------------------------- #同じ種類の別装備と重複できない場合、ここでfalseを返す alias enb enable? unless $@ def enable?(item) if not @actor.equippable_type?(item,@equip_type) return false end return enb(item) end end class Scene_Battle < Scene_Base #$sceneからactive_battlerを取得できるように。 def active_battler return @active_battler end #戦闘スクリプトと競合する場合、おそらくここが原因。 def execute_action_item item = @active_battler.action.item text = sprintf(Vocab::UseItem, @active_battler.name, item.name) @message_window.add_instant_text(text) targets = @active_battler.action.make_targets display_animation(targets, item.animation_id) #$game_party.consume_item(item)を↓のように変更しました if ER_BP_USE_EQUIPITEM_SYS result = @active_battler.er_bp_consume_equip(item) else result = $game_party.consume_item(item) end return if not result #アイテム消費に失敗した場合、効果が出ない。 #=====================================================ココマデ $game_temp.common_event_id = item.common_event_id for target in targets target.item_effect(@active_battler, item) display_action_effects(target, item) end end alias er_bp_update_item_selection update_item_selection unless $@ def update_item_selection if Input.trigger?(Input::B) and $game_temp.er_bp_back_pack Sound.play_cancel @active_battler.set_back_pack_item(nil) end_item_selection start_item_selection return elsif Input.trigger?(Input::C) @item = @item_window.item if @item != nil and @item.back_pack Sound.play_decision @active_battler.set_back_pack_item(@item) $game_party.last_item_id = 0 end_item_selection $game_temp.er_bp_back_pack = true start_item_selection return end end er_bp_update_item_selection end alias er_bp_end_item_selection end_item_selection unless $@ def end_item_selection er_bp_end_item_selection $game_temp.er_bp_back_pack = false end end class Game_Temp attr_accessor :er_bp_back_pack alias er_bp_initialize initialize unless $@ def initialize @er_bp_back_pack = false er_bp_initialize end end class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● アイテムを許可状態で表示するかどうか # item : アイテム #-------------------------------------------------------------------------- alias er_bp_enable? enable? unless $@ def enable?(item) return false unless item.is_a?(RPG::Item) return item.battle_ok? if $game_temp.in_battle return er_bp_enable?(item) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- #戦闘中かつ、アイテム装備システム仕様使用する場合は、 #@dataが装備してるアイテムのみになる。 def refresh @data = [] if select_equip_item items = [] if $scene.active_battler != nil for item in $scene.active_battler.armors items.push(item) if item.is_a?(RPG::Item) end end else items = $game_party.items end for item in items next unless include?(item) next if $game_temp.er_bp_back_pack and item.back_pack @data.push(item) if item.is_a?(RPG::Item) and item.id == $game_party.last_item_id self.index = @data.size - 1 end end @data.push(nil) if include?(nil) @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) item = @data[index] if item != nil number = $game_party.item_number(item) enabled = enable?(item) rect.width -= 4 draw_item_name(item, rect.x, rect.y, enabled) return if select_equip_item self.contents.draw_text(rect, sprintf(":%2d", number), 2) end end def select_equip_item if ($game_temp.in_battle and ER_BP_USE_EQUIPITEM_SYS and not $game_temp.er_bp_back_pack) return true end return false end end class Game_Actor def equippable_type?(item,equip_type)#装備タイプがかぶらないかチェック return true if item.is_a?(RPG::Weapon) or item == nil #武器等は弾く #無制限装備可能な防具は無条件で装備可能に。 return true if ER_BP_ENABLE_REPITITION_ARMOR_KIND.include?(item.kind) armors = []#[@armor1_id,@armor2_id,@armor3_id,@armor4_id] for i in 1..4 + ER_BP_EXPANSION_EQUIP_TYPE_MAX armors.push(er_bp_read_armor_id(i)) ; end armors.delete_at(equip_type-1) #変更する装備は除去 for equip_id in armors equip = $data_armors[equip_id] next if equip == nil return false if equip.kind == item.kind end return true end def gain_kind_armor(equip_type) result = armors.compact return nil if result.size == 0 return result.find{|a|a.kind == equip_type} end #-------------------------------------------------------------------------- # ● 防具オブジェクトの配列取得 #-------------------------------------------------------------------------- alias er_bp_armors armors unless $@ def armors result = [] unless two_swords_style result.push(er_bp_gain_equip_item(@armor1_id)) end for i in 2...5 + ER_BP_EXPANSION_EQUIP_TYPE_MAX result.push(er_bp_gain_equip_item(er_bp_read_armor_id(i))) end return result end def er_bp_read_armor_id(id) eval("@armor#{id}_id = 0") if eval("@armor#{id}_id") == nil return eval("@armor#{id}_id") end def er_bp_set_armor_id(id,num) eval("@armor#{id}_id = num") end def er_bp_gain_equip_item(id) if id > 0 return $data_armors[id] elsif id < 0 return $data_items[-id] end return nil end end class Scene_Equip < Scene_Base #-------------------------------------------------------------------------- #装備種類が被った場合は、あらかじめ本処理の前に弾く。 alias uis update_item_selection unless $@ def update_item_selection if Input.trigger?(Input::C) if not @actor.equippable_type?(@item_window.item,@equip_window.index) Sound.play_buzzer return end end uis end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 装備の変更 (オブジェクトで指定) #再定義。えっと、確か装備したのがアイテムの場合、 #IDを正負反転させて@armor*_idに格納してるハズ。 def change_equip(equip_type, item, test = false) last_item = equips[equip_type] unless test return if $game_party.item_number(item) == 0 if item != nil if last_item.id < 0 last_item = $data_items[last_item.id.abs] end $game_party.gain_item(last_item, 1) $game_party.lose_item(item, 1) end item_id = item == nil ? 0 : item.id item_id *= -1 if item.is_a?(RPG::Item) case equip_type when 0 # 武器 @weapon_id = item_id unless two_hands_legal? # 両手持ち違反の場合 change_equip(1, nil, test) # 逆の手の装備を外す end when 1 # 盾 @armor1_id = item_id unless two_hands_legal? # 両手持ち違反の場合 change_equip(0, nil, test) # 逆の手の装備を外す end else er_bp_set_armor_id(equip_type,item_id) end end end class Game_Party alias er_bp_consume_item consume_item unless $@ def consume_item(item) result = item_number(item) er_bp_consume_item(item) return (result > 0) end alias er_bp_item_can_use? item_can_use? unless $@ def item_can_use?(item) return false unless item.is_a?(RPG::Item) return item.battle_ok? if $game_temp.in_battle return er_bp_item_can_use?(item) end end class Window_ShopStatus < Window_Base #-------------------------------------------------------------------------- # ● アクターの現装備と能力値変化の描画 ※再定義 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_parameter_change(actor, x, y) return if @item.is_a?(RPG::Item) enabled = actor.equippable?(@item) self.contents.font.color = normal_color self.contents.font.color.alpha = enabled ? 255 : 128 self.contents.draw_text(x, y, 200, WLH, actor.name) if @item.is_a?(RPG::Weapon) item1 = weaker_weapon(actor) elsif actor.two_swords_style and @item.kind == 0 item1 = nil else item1 = actor.gain_kind_armor(@item.kind) #actor.equips[1 + @item.kind] end if enabled if @item.is_a?(RPG::Weapon) atk1 = item1 == nil ? 0 : item1.atk atk2 = @item == nil ? 0 : @item.atk change = atk2 - atk1 else def1 = item1 == nil ? 0 : item1.def def2 = @item == nil ? 0 : @item.def change = def2 - def1 end self.contents.draw_text(x, y, 200, WLH, sprintf("%+d", change), 2) end draw_item_name(item1, x, y + WLH, enabled) end end class Window_Equip < Window_Selectable #ER_Windowジャンプ def initialize(x, y, actor) super(x, y, 336, WLH * 5+ 32) @actor = actor self.contents.dispose h = 5 + ER_BP_EXPANSION_EQUIP_TYPE_MAX self.contents = Bitmap.new(width-32,WLH * h) refresh self.index = 0 end def refresh self.contents.clear @data = [] for item in @actor.equips do @data.push(item) end @item_max = @data.size self.contents.font.color = system_color if @actor.two_swords_style self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab::weapon1) self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab::weapon2) else self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab::weapon) self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab::armor1) end for i in 2..4 text = eval("Vocab::armor#{i}") text = ER_BP_NORMAL_ARMOR_NAME if ER_BP_USE_ARMOR_KIND_NAME self.contents.draw_text(4, WLH * i, 92, WLH, text) end for i in 0...ER_BP_EXPANSION_EQUIP_TYPE_MAX text = ER_EXPANSION_ARMOR_KIND[i+4] text = ER_BP_NORMAL_ARMOR_NAME if ER_BP_USE_ARMOR_KIND_NAME self.contents.draw_text(4, WLH * (i+5), 92, WLH, text) end for i in 0...@data.size draw_item_name(@data[i], 92, WLH * i) end #draw_item_name(@data[0], 92, WLH * 0) #draw_item_name(@data[1], 92, WLH * 1) #draw_item_name(@data[2], 92, WLH * 2) #draw_item_name(@data[3], 92, WLH * 3) #draw_item_name(@data[4], 92, WLH * 4) end end class Scene_Equip < Scene_Base #-------------------------------------------------------------------------- # ● アイテムウィンドウの作成 #-------------------------------------------------------------------------- #装備の種類分だけウィンドウ作成。 #コレが重くなる原因ですね。アイテム装備種類制限なしの仕様なら、 #もうちょっと軽くできそうな気もするんですが、 #処理がさらに複雑になりそうなので妥協。 alias er_bp_create_item_windows create_item_windows unless $@ def create_item_windows er_bp_create_item_windows for i in 0...ER_BP_EXPANSION_EQUIP_TYPE_MAX i += 5 @item_windows[i] = Window_EquipItem.new(0, 208, 544, 208, @actor, i) @item_windows[i].help_window = @help_window @item_windows[i].visible = (@equip_index == i) @item_windows[i].y = 208 @item_windows[i].height = 208 @item_windows[i].active = false @item_windows[i].index = -1 end end def update_item_windows for i in 0...@item_windows.size @item_windows[i].visible = (@equip_window.index == i) @item_windows[i].update end @item_window = @item_windows[@equip_window.index] end end module RPG #ArmorとItemの拡張。 #Itemは装備するとArmor関連のエラーが多発するので、 #いっそArmorが持ってるほとんどの機能を付加しました。 #いじれば装備する事で能力の変わるアイテムも作成可能。 class Armor < BaseItem def kind if not note.include?("ER_装備拡張") return @kind end text = note.clone text.sub!(/ER_装備拡張\[([0-9]+)\]/, "") return $1.to_i end end class Item < UsableItem def back_pack return note.include?("ER_バックパック") end def kind return -1 end def eva return 0 end def atk return 0 end def def return 0 end def spi return 0 end def agi return 0 end def prevent_critical return false end def half_mp_cost return false end def double_exp_gain return false end def auto_hp_recover return false end def state_set return [] end end end #ステータス画面。 class Window_Status < Window_Base #ER_Windowジャンプ def draw_equipments(x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 120, WLH, Vocab::equip) for i in 0..4 + ER_BP_EXPANSION_EQUIP_TYPE_MAX draw_item_name(@actor.equips[i], x + 16, y + WLH * (i + 1)) end end end