#=========================================================================== # ◆ A1 Scripts ◆ # 装備拡張(RGSS3) # # バージョン : 1.00 (2012/01/21) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・矢や弾などの消耗品装備を実装します # ・矢や弾などの消耗品装備を装備しないと、弓や銃に攻撃力を持たせなくします # ・装備タイプの追加ができます # ・二刀流でも盾を持てるようになります # ・「装備封印」「盾」では両手持ちを実現できないことを解消 # ・右手に盾、左手に武器が自由に装備できます # ・利き腕の設定ができます # ・利き腕と装備箇所によって攻撃力に変化をもたせることができます # ・追加装備タイプや、既存タイプの初期装備を設定できます # ・装備画面で、Aボタンを押すと装備を外せます #--------------------------------------------------------------------------- # 更新履歴   :2012/01/21 Ver1.00 リリース #--------------------------------------------------------------------------- # 設置場所 # A1バトル共通スクリプト以下 # (バトルアクション以下) # (サイドビューバトル以上) # # 必要スクリプト # A1バトル共通スクリプト #--------------------------------------------------------------------------- # 使い方 # ■ 設定項目 に設定します # # データベース「武器」のメモ欄に記述します # # <両手持ち> # 「装備封印」「盾」では、盾を装備できなくなっても # 二刀流では他の武器を装備できたりします # # それを解消して、両手持ちなら武器も1本しか装備できなくします # # <逆手推奨> # # 利き腕と逆の手に装備すると本領発揮する武器になります # 弓などに活用できます # # <装備タイプ id|name> # 拡張装備タイプを設定します # # <装備タイプ 5> # <装備タイプ 消耗品> # # は、同じ意味を持ちます # # データベース「スキル」のメモ欄に記述します # # <消耗装備消耗なし> # # 該当するスキルを使用しても、矢や弾などを消耗しなくなります # # データベース「アクター」のメモ欄に記述します # # <利き腕 右|左|両> ※ 省略した場合、右になります # # 設定項目の「利き腕の攻撃レート」「二刀流の攻撃力レート」に影響します # # <初期装備 タイプ,武器|防具,id,num> # # タイプ:設定項目の「装備タイプの名称」を記述します # 武器 :データベース「武器」の中から選びます # 防具 :データベース「防具」の中から選びます # id :武器、または防具のIDを指定します # num :消耗品の場合、装備している数量を指定します #============================================================================== $imported ||= {} if $imported["A1_BattleCommonScript"] $imported["A1_ConsumerEquip"] = true old_common_script("装備拡張", "4.30") if common_version < 4.30 #============================================================================== # ■ 設定項目 #============================================================================== module A1_System::ConsumerEquipConfig #-------------------------------------------------------------------------- # ○ セットになる消耗品装備と装備の武器タイプ名 # 消耗品武器タイプ名 => [武器タイプ名,武器タイプ名...] #-------------------------------------------------------------------------- SET_WEAPONS = { "矢" => ["弓"], "弾" => ["銃"], } #-------------------------------------------------------------------------- # ○ 追加装備タイプ # 表示名 => タイプID #-------------------------------------------------------------------------- EX_EQUIP_TYPES = { "消耗品" => 5, } #-------------------------------------------------------------------------- # ○ 消耗品の装備タイプのID #-------------------------------------------------------------------------- CONSUMA_EQUIP = 5 #-------------------------------------------------------------------------- # ○ 装備タイプの並び順 # 0:武器 1:盾 2:頭 3:体 4:装飾品 5以降:上で追加したタイプ #-------------------------------------------------------------------------- EQUIP_TYPES = [0, 1, 2, 3, 4, 5] #-------------------------------------------------------------------------- # ○ 二刀流時の装備タイプの並び順 # 0:武器 1:盾 2:頭 3:体 4:装飾品 5以降:上で追加したタイプ #-------------------------------------------------------------------------- DUAL_WIRLD = [0, 0, 2, 3, 4, 5] #-------------------------------------------------------------------------- # ○ 装備タイプの名称 # データベース「アクター」のメモ欄に記述した追加初期装備で使用します # 上の「装備タイプの並び順」に合わせてください #-------------------------------------------------------------------------- EQUIP_TYPES_NAME = ["右手", "左手", "頭", "体", "装飾品", "消耗品"] #-------------------------------------------------------------------------- # ○ 装備タイプの中での、右手の位置 #-------------------------------------------------------------------------- RIGHT_INDEX = 0 #-------------------------------------------------------------------------- # ○ 装備タイプの中での、左手の位置 #-------------------------------------------------------------------------- LEFT_INDEX = 1 #-------------------------------------------------------------------------- # ○ 右手/左手表記 #-------------------------------------------------------------------------- DRAW_HAND_SIDE = true #-------------------------------------------------------------------------- # ○ 利き腕の攻撃力レート [利き腕, 利き腕じゃない方] #-------------------------------------------------------------------------- DOMINANT_RATE = [1.0, 0.75] #-------------------------------------------------------------------------- # ○ 二刀流の攻撃力レート [利き腕, 利き腕じゃない方] #-------------------------------------------------------------------------- DUAL_WIRLD_RATE = [1.0, 0.5] #-------------------------------------------------------------------------- # ○ 二刀流の基本攻撃力レート # 基本攻撃力 * 攻撃力レート * 利き腕レート を左右の分だけ足します # # 基本攻撃力100 攻撃力レート0.75 利き腕レート[1.0, 0.5]の場合 # 利き腕が 75 利き腕じゃない方が 37.5 # 足した値 112.5 を四捨五入した 113 が基本攻撃力になります #-------------------------------------------------------------------------- DUAL_BASIC_RATE = 0.75 end #============================================================================== # ■ RPG::EquipItem #============================================================================== class RPG::EquipItem < RPG::BaseItem #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EX_EQUIP_TYPES = A1_System::ConsumerEquipConfig::EX_EQUIP_TYPES #-------------------------------------------------------------------------- # ○ 両手持ち武器? #-------------------------------------------------------------------------- def two_hand_weapon? @two_hand_weapon = $a1_common.note_data(self.note, "両手持ち") if @two_hand_weapon == nil return @two_hand_weapon end #-------------------------------------------------------------------------- # ○ 装備タイプ #-------------------------------------------------------------------------- def etype_id @etype_id = $a1_common.note_data_one(self.note, "装備タイプ", @etype_id) @etype_id = EX_EQUIP_TYPES[@etype_id] if @etype_id.is_a?(String) return @etype_id end #-------------------------------------------------------------------------- # ○ 逆手推奨 #-------------------------------------------------------------------------- def un_dominant @un_dominant = $a1_common.note_data(self.note, "逆手推奨") if @two_hand_weapon == nil return @un_dominant end end #============================================================================== # ■ RPG::Skill #============================================================================== class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # ○ 消耗品を消耗しないスキル #-------------------------------------------------------------------------- def no_consumer @no_consumer = $a1_common.note_data(self.note, "消耗装備消耗なし") if @no_consumer == nil return @no_consumer end end #============================================================================== # ■ RPG::BaseItem #============================================================================== class RPG::BaseItem #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EQUIP_TYPES_NAME = A1_System::ConsumerEquipConfig::EQUIP_TYPES_NAME #-------------------------------------------------------------------------- # ○ 利き腕 #-------------------------------------------------------------------------- def dominant_hand @dominant_hand ||= $a1_common.note_data_one(self.note, "利き腕", "右") return @dominant_hand end #-------------------------------------------------------------------------- # ○ 追加初期装備 #-------------------------------------------------------------------------- def init_ex_equips @init_ex_equips ||= $a1_common.note_data_split(self.note, "初期装備", []) return @init_ex_equips end end #============================================================================== # ■ DataManager #------------------------------------------------------------------------------ #  データベースとゲームオブジェクトを管理するモジュールです。ゲームで使用する # ほぼ全てのグローバル変数はこのモジュールで初期化されます。 #============================================================================== module DataManager #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EX_EQUIP_TYPES = A1_System::ConsumerEquipConfig::EX_EQUIP_TYPES #-------------------------------------------------------------------------- # ○ エイリアス用特異メソッド #-------------------------------------------------------------------------- class << self alias :a1_ex_equip_load_normal_database :load_normal_database alias :a1_ex_equip_load_battle_test_database :load_battle_test_database end #-------------------------------------------------------------------------- # ☆ 通常のデータベースをロード #-------------------------------------------------------------------------- def self.load_normal_database a1_ex_equip_load_normal_database load_ex_equips end #-------------------------------------------------------------------------- # ☆ 戦闘テスト用のデータベースをロード #-------------------------------------------------------------------------- def self.load_battle_test_database a1_ex_equip_load_battle_test_database load_ex_equips end #-------------------------------------------------------------------------- # ○ エイリアス用特異メソッド #-------------------------------------------------------------------------- def self.load_ex_equips EX_EQUIP_TYPES.each_pair {|key, value| $data_system.terms.etypes[value] = key } end end #============================================================================== # ■ Scene_Equip #------------------------------------------------------------------------------ #  装備画面の処理を行うクラスです。 #============================================================================== class Scene_Equip < Scene_MenuBase #-------------------------------------------------------------------------- # ☆ スロットウィンドウの作成 #-------------------------------------------------------------------------- alias a1_ex_equip_se_create_slot_window create_slot_window def create_slot_window a1_ex_equip_se_create_slot_window @slot_window.set_handler(:on_slot_un_equip, method(:on_slot_un_equip)) end #-------------------------------------------------------------------------- # ○ 装備を外す #-------------------------------------------------------------------------- def on_slot_un_equip Sound.play_equip @actor.change_equip(@slot_window.index, nil) @slot_window.refresh @status_window.refresh @item_window.refresh end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP #-------------------------------------------------------------------------- # ☆ スキル/アイテムの発動 #-------------------------------------------------------------------------- alias a1_ex_equip_sb_invoke_item invoke_item def invoke_item(target, item) a1_ex_equip_sb_invoke_item(target, item) return if !@subject.actor? || !item.is_a?(RPG::Skill) return if item.no_consumer return unless @subject.use_consumer? @subject.consumer_equip_num -= 1 @subject.force_change_equip(@subject.equip_slots.index(CONSUMA_EQUIP) , nil) if @subject.consumer_equip_num == 0 end end #============================================================================== # ■ Window_Status #------------------------------------------------------------------------------ #  ステータス画面で表示する、フル仕様のステータスウィンドウです。 #============================================================================== class Window_Status < Window_Selectable #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EQUIP_TYPES = A1_System::ConsumerEquipConfig::EQUIP_TYPES CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP #-------------------------------------------------------------------------- # ★ リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear draw_block1 (line_height * 0) draw_horz_line(line_height * 1) draw_block2 (line_height * 2) draw_horz_line(line_height * 6) draw_block3 (line_height * 7) draw_horz_line(line_height * (13 + (EQUIP_TYPES.size - 6))) draw_block4 (line_height * (14 + (EQUIP_TYPES.size - 6))) end #-------------------------------------------------------------------------- # ★ 装備品の描画 #-------------------------------------------------------------------------- def draw_equipments(x, y) @actor.equips.each_with_index {|item, i| draw_equip_item_name(item, x, y, i) } end #-------------------------------------------------------------------------- # ○ 装備品の名前を描画 #-------------------------------------------------------------------------- def draw_equip_item_name(item, x, y, i) draw_item_name(item, x, y + line_height * i) draw_item_number(x, y + line_height * i, item) if item && item.etype_id == CONSUMA_EQUIP end #-------------------------------------------------------------------------- # ○ アイテムの個数を描画 #-------------------------------------------------------------------------- def draw_item_number(x, y, item) rect = Rect.new(x, y, 210, line_height) draw_text(rect, sprintf(":%2d", @actor.consumer_equip_num), 2) end end #============================================================================== # ■ Window_EquipSlot #------------------------------------------------------------------------------ #  装備画面で、アクターが現在装備しているアイテムを表示するウィンドウです。 #============================================================================== class Window_EquipSlot < Window_Selectable #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EQUIP_TYPES = A1_System::ConsumerEquipConfig::EQUIP_TYPES CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP DRAW_HAND_SIDE = A1_System::ConsumerEquipConfig::DRAW_HAND_SIDE #-------------------------------------------------------------------------- # ★ 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number EQUIP_TYPES.size end #-------------------------------------------------------------------------- # ★ ステータスウィンドウの設定 #-------------------------------------------------------------------------- def status_window=(status_window) @status_window = status_window height = self.height + (self.y - @status_window.y) @status_window.height = height > @status_window.height ? height : @status_window.height call_update_help end #-------------------------------------------------------------------------- # ☆ 項目の描画 #-------------------------------------------------------------------------- alias a1_ex_equip_wei_draw_item draw_item def draw_item(index) a1_ex_equip_wei_draw_item(index) rect = item_rect_for_text(index) item = @actor.equips[index] draw_item_number(rect, item) if item && item.etype_id == CONSUMA_EQUIP @hand = @hand == "右手" ? @hand : nil end #-------------------------------------------------------------------------- # ☆ 装備スロットの名前を取得 #-------------------------------------------------------------------------- alias a1_ex_equip_wei_slot_name slot_name def slot_name(index) return "" unless @actor return a1_ex_equip_wei_slot_name(index) if @actor.equip_slots[index] > 1 || !DRAW_HAND_SIDE @hand = @hand ? "左手" : "右手" return @hand end #-------------------------------------------------------------------------- # ○ アイテムの個数を描画 #-------------------------------------------------------------------------- def draw_item_number(rect, item) draw_text(rect, sprintf(":%2d", @actor.consumer_equip_num), 2) end #-------------------------------------------------------------------------- # ○ 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- def process_handling super return unless open? && active return on_slot_un_equip if handle?(:on_slot_un_equip) && Input.trigger?(:A) end #-------------------------------------------------------------------------- # ○ 装備を外す #-------------------------------------------------------------------------- def on_slot_un_equip return Sound.play_buzzer unless current_item_enabled? call_handler(:on_slot_un_equip) end end #============================================================================== # ■ Window_EquipItem #------------------------------------------------------------------------------ #  装備画面で、装備変更の候補となるアイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_EquipItem < Window_ItemList #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- SET_WEAPONS = A1_System::ConsumerEquipConfig::SET_WEAPONS CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP #-------------------------------------------------------------------------- # ☆ アイテムをリストに含めるかどうか #-------------------------------------------------------------------------- alias a1_ex_equip_wei_include? include? def include?(item) return a1_ex_equip_wei_include?(item) if @slot_id > 1 && @slot_id < CONSUMA_EQUIP return true if item == nil return false unless item.is_a?(RPG::EquipItem) return false if @slot_id < 0 return item.etype_id == @actor.equip_slots[@slot_id] && @actor.check_consumer(item) if item.etype_id == CONSUMA_EQUIP return false if item.etype_id > 1 return false if @actor.equip_slots[@slot_id] > 1 return @actor.equippable?(item) end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- EQUIP_TYPES = A1_System::ConsumerEquipConfig::EQUIP_TYPES DUAL_WIRLD = A1_System::ConsumerEquipConfig::DUAL_WIRLD #-------------------------------------------------------------------------- # ○ 装備スロットの配列を取得 #-------------------------------------------------------------------------- def equip_slots return dual_wield? ? DUAL_WIRLD.clone : EQUIP_TYPES.clone unless @equip_slots @equip_slots end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  敵キャラを扱うクラスです。このクラスは Game_Troop クラス($game_troop)の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ○ 消耗品装備を使う? #-------------------------------------------------------------------------- def use_consumer? return false end end #============================================================================== # ■ Game_BattlerBase #------------------------------------------------------------------------------ #  バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ # のクラスは Game_Battler クラスのスーパークラスとして使用されます。 #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP #-------------------------------------------------------------------------- # ☆ 二刀流? #-------------------------------------------------------------------------- alias a1_ex_equip_gbb_two_sword_style? two_sword_style? def two_sword_style? ret = a1_ex_equip_gbb_two_sword_style? return ret unless self.actor? return false unless ret return weapons.select {|weapon| weapon.etype_id != CONSUMA_EQUIP }.size == 2 end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors) # の内部で使用され、Game_Party クラス($game_party)からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- SET_WEAPONS = A1_System::ConsumerEquipConfig::SET_WEAPONS CONSUMA_EQUIP = A1_System::ConsumerEquipConfig::CONSUMA_EQUIP EX_EQUIP_TYPES = A1_System::ConsumerEquipConfig::EX_EQUIP_TYPES EQUIP_TYPES_NAME = A1_System::ConsumerEquipConfig::EQUIP_TYPES_NAME DOMINANT_RATE = A1_System::ConsumerEquipConfig::DOMINANT_RATE DUAL_WIRLD_RATE = A1_System::ConsumerEquipConfig::DUAL_WIRLD_RATE DUAL_BASIC_RATE = A1_System::ConsumerEquipConfig::DUAL_BASIC_RATE RIGHT_INDEX = A1_System::ConsumerEquipConfig::RIGHT_INDEX LEFT_INDEX = A1_System::ConsumerEquipConfig::LEFT_INDEX HAND_INDEX = {"右" => RIGHT_INDEX, "左" => LEFT_INDEX} #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :consumer_equip_num attr_accessor :dominant_rate attr_accessor :dual_wirld_rate #-------------------------------------------------------------------------- # ☆ セットアップ #-------------------------------------------------------------------------- alias a1_ex_equip_ga_setup setup def setup(actor_id) a1_ex_equip_ga_setup(actor_id) @equip_slots = equip_slots @slot_id = 0 @consumer_equip_num = 0 init_ex_equips(actor.init_ex_equips) end #-------------------------------------------------------------------------- # ○ 追加初期装備を装備する #-------------------------------------------------------------------------- def init_ex_equips(ex_equips) ex_equips.each{|equip| force_change_equip(ex_slot(equip[0]), ex_item(equip)) } end #-------------------------------------------------------------------------- # ○ 追加初期装備のスロットを取得 #-------------------------------------------------------------------------- def ex_slot(type) EQUIP_TYPES_NAME.index(type) end #-------------------------------------------------------------------------- # ○ 追加初期装備のアイテムを取得 #-------------------------------------------------------------------------- def ex_item(data) item = data[1] == "武器" ? $data_weapons[data[2]] : $data_armors[data[2]] @consumer_equip_num = data[3] if item.is_a?(RPG::Weapon) && EX_EQUIP_TYPES[data[0]] == CONSUMA_EQUIP return item end #-------------------------------------------------------------------------- # ○ 二刀流時の攻撃力レート #-------------------------------------------------------------------------- def dual_wirld_rate @dual_wirld_rate ||= DUAL_WIRLD_RATE return @dual_wirld_rate end #-------------------------------------------------------------------------- # ○ 利き腕の攻撃力レート #-------------------------------------------------------------------------- def dominant_rate @dominant_rate ||= DOMINANT_RATE return @dominant_rate end #-------------------------------------------------------------------------- # ☆ 装備の変更 # slot_id : 装備スロット ID # item : 武器/防具(nil なら装備解除) #-------------------------------------------------------------------------- alias a1_ex_equip_ga_change_equip change_equip def change_equip(slot_id, item) return a1_ex_equip_ga_change_equip(slot_id, item) if slot_id > 1 return unless trade_item_with_party(item, equips[slot_id]) chenge_equip_slot(slot_id, item) if item @equips[slot_id].object = item check_two_hand_weapon(item, slot_id) refresh end #-------------------------------------------------------------------------- # ☆ 装備の強制変更 # slot_id : 装備スロット ID # item : 武器/防具(nil なら装備解除) #-------------------------------------------------------------------------- alias a1_ex_equip_ga_force_change_equip force_change_equip def force_change_equip(slot_id, item) return a1_ex_equip_ga_force_change_equip(slot_id, item) if slot_id > 1 chenge_equip_slot(slot_id, item) if item @equips[slot_id].object = item check_two_hand_weapon(item, slot_id, false) release_unequippable_items(false) refresh end #-------------------------------------------------------------------------- # ★ 装備できない装備品を外す # item_gain : 外した装備品をパーティに戻す #-------------------------------------------------------------------------- def release_unequippable_items(item_gain = true) @equips.each_with_index {|item, i| release_equip(item, item_gain) unless check_equip(item, i)} end #-------------------------------------------------------------------------- # ○ スロットのチェック #-------------------------------------------------------------------------- def check_equip_slots(slot_id, item) item.etype_id == equip_slots[slot_id] end #-------------------------------------------------------------------------- # ○ 両手装備かチェック #-------------------------------------------------------------------------- def check_two_hand_weapon(item, slot_id, item_gain = true) side_hand_slot = slot_id == 0 ? 1 : 0 return unless item flag = equips[side_hand_slot] && (item.two_hand_weapon? || equips[side_hand_slot].two_hand_weapon?) release_equip(@equips[side_hand_slot], item_gain) if flag end #-------------------------------------------------------------------------- # ○ 装備可能チェック #-------------------------------------------------------------------------- def check_equip(item, slot_id) return check_consumer(item.object) if equip_slots[slot_id] == CONSUMA_EQUIP equippable?(item.object) && check_equip_slots(slot_id, item.object) end #-------------------------------------------------------------------------- # ○ 消耗品チェック #-------------------------------------------------------------------------- def check_consumer(item) @equips.any? {|e_item| check_consumer_equip(item, e_item.object) } end #-------------------------------------------------------------------------- # ○ 消耗品装備チェック #-------------------------------------------------------------------------- def check_consumer_equip(item, e_item) return false unless item return false unless e_item return false unless SET_WEAPONS[e_type_name(item)] SET_WEAPONS[e_type_name(item)].include?(e_type_name(e_item)) end #-------------------------------------------------------------------------- # ○ 装備タイプ名を取得 #-------------------------------------------------------------------------- def e_type_name(item) return $data_system.weapon_types[item.wtype_id] if item.is_a?(RPG::Weapon) return $data_system.armor_types[item.atype_id] if item.is_a?(RPG::Armor) end #-------------------------------------------------------------------------- # ○ 装備品を外す #-------------------------------------------------------------------------- def release_equip(item, item_gain) trade_item_with_party(nil, item.object) if item_gain item.object = nil end #-------------------------------------------------------------------------- # ○ 装備スロットの変更 #-------------------------------------------------------------------------- def chenge_equip_slot(slot_id, item) return unless item @equip_slots ||= equip_slots @equip_slots[slot_id] = item.etype_id @equip_slots[HAND_INDEX["左"]] = item.etype_id == 0 ? 1 : 0 if slot_id == HAND_INDEX["右"] @equip_slots[HAND_INDEX["右"]] = item.etype_id == 0 ? 1 : 0 if slot_id == HAND_INDEX["左"] return if item.etype_id != 0 || !dual_wield? || (dual_wield? && weapons.size == 0) return if weapons[0].two_hand_weapon? @equip_slots[HAND_INDEX["左"]] = 0 @equip_slots[HAND_INDEX["右"]] = 0 end #-------------------------------------------------------------------------- # ☆ 通常能力値の基本値取得 #-------------------------------------------------------------------------- alias a1_ex_equip_ga_param_base param_base def param_base(param_id) ret = a1_ex_equip_ga_param_base(param_id) return ret if param_id != 2 || weapons.empty? return comp_dominant? ? (ret * dominant_rate[0]).round.to_i : (ret * dominant_rate[1]).round.to_i unless two_sword_style? return (ret * DUAL_BASIC_RATE * dominant_dual_wirld_rate(0) + ret * DUAL_BASIC_RATE * dominant_dual_wirld_rate(1)).round.to_i end #-------------------------------------------------------------------------- # ○ 二刀流の利き腕のレート #-------------------------------------------------------------------------- def dominant_dual_wirld_rate(index) return dual_wirld_rate[0] if actor.dominant_hand == "両" return dual_wirld_rate[index] end #-------------------------------------------------------------------------- # ○ 通常能力値の加算値取得 #-------------------------------------------------------------------------- def param_plus(param_id) ret = super return ret if param_id != 2 return ret - dominant_param_plus - use_consumer_param_plus end #-------------------------------------------------------------------------- # ○ 利き腕の減算値を取得 #-------------------------------------------------------------------------- def dominant_param_plus(ret = 0) weapons.each_with_index {|weapon, i| ret += calc_param_rate(weapon.params[2], i) } return ret.round.to_i end #-------------------------------------------------------------------------- # ○ 利き腕と武器が合致? #-------------------------------------------------------------------------- def calc_param_rate(value, index) return value - value * hand_rate[1] unless comp_dominant?(index) return value - value * hand_rate[0] end #-------------------------------------------------------------------------- # ○ 利き腕のレート #-------------------------------------------------------------------------- def hand_rate two_sword_style? ? dual_wirld_rate : dominant_rate end #-------------------------------------------------------------------------- # ○ 利き腕と武器が合致? #-------------------------------------------------------------------------- def comp_dominant?(index = 0) return true if actor.dominant_hand == "両" return true if weapons.empty? return true if weapons[index].etype_id == CONSUMA_EQUIP return true if use_consumer_weapon?(index) && !use_consumer? w_index = equips.index(weapons[index]) d_index = HAND_INDEX[actor.dominant_hand] return true if w_index != d_index && weapons[index].un_dominant return index == HAND_INDEX[actor.dominant_hand] if two_sword_style? return true if w_index == d_index && !weapons[index].un_dominant return false end #-------------------------------------------------------------------------- # ○ 両手持ち装備? #-------------------------------------------------------------------------- def two_hand_weapon? weapons.compact.any? {|weapon| weapon.two_hand_weapon? } end #-------------------------------------------------------------------------- # ○ 必要消耗品武器の減算値を取得 #-------------------------------------------------------------------------- def use_consumer_param_plus(ret = 0) weapons.compact.each {|weapon| ret += weapon.params[2] if need_calc_atk?(weapon) } return ret end #-------------------------------------------------------------------------- # ○ 必要消耗品の名前を取得 #-------------------------------------------------------------------------- def need_consumer_name(weapon) SET_WEAPONS.each_pair {|key, value| return key if value.include?(e_type_name(weapon))} return false end #-------------------------------------------------------------------------- # ○ 必要消耗品を装備している? #-------------------------------------------------------------------------- def equip_need_consumer?(item, need_consumer) return false unless item return item.name == need_consumer end #-------------------------------------------------------------------------- # ○ 攻撃力減算処理が必要? #-------------------------------------------------------------------------- def need_calc_atk?(weapon) need_consumer = need_consumer_name(weapon) return false unless need_consumer return !match_set_weapon?(weapon, need_consumer) end #-------------------------------------------------------------------------- # ○ 消耗品装備を使う? #-------------------------------------------------------------------------- def use_consumer? weapons.compact.any? {|weapon| check_use_consumer(weapon) } end #-------------------------------------------------------------------------- # ○ 消耗品装備を使う武器かチェック #-------------------------------------------------------------------------- def use_consumer_weapon?(index) need_consumer = need_consumer_name(weapons[index]) return false unless need_consumer return true end #-------------------------------------------------------------------------- # ○ 消耗品装備を使うかチェック #-------------------------------------------------------------------------- def check_use_consumer(weapon) need_consumer = need_consumer_name(weapon) return false unless need_consumer return match_set_weapon?(weapon, need_consumer) end #-------------------------------------------------------------------------- # ○ セット武器がマッチしている? #-------------------------------------------------------------------------- def match_set_weapon?(weapon, need_consumer) return slot_list(CONSUMA_EQUIP).any? {|id| equip_need_consumer?(@equips[id].object, need_consumer) } end #-------------------------------------------------------------------------- # ○ 消耗品との交換? #-------------------------------------------------------------------------- def trade_with_consumer?(new_item, old_item) return true if new_item && new_item.etype_id == CONSUMA_EQUIP return true if old_item && old_item.etype_id == CONSUMA_EQUIP return false end #-------------------------------------------------------------------------- # ☆ パーティとアイテムを交換する # new_item : パーティから取り出すアイテム # old_item : パーティに返すアイテム #-------------------------------------------------------------------------- alias a1_ex_equip_ga_trade_item_with_party trade_item_with_party def trade_item_with_party(new_item, old_item) return trade_consumer_with_party(new_item, old_item) if trade_with_consumer?(new_item, old_item) return a1_ex_equip_ga_trade_item_with_party(new_item, old_item) end #-------------------------------------------------------------------------- # ○ パーティと消耗品アイテムを交換する #-------------------------------------------------------------------------- def trade_consumer_with_party(new_item, old_item) return false if new_item && !$game_party.has_item?(new_item) $game_party.gain_item(old_item, @consumer_equip_num) @consumer_equip_num = $game_party.item_number(new_item) $game_party.lose_item(new_item, @consumer_equip_num) return true end #-------------------------------------------------------------------------- # ○ 消耗品装備の取得 #-------------------------------------------------------------------------- def consumer_equip weapons.compact.select {|weapon| weapon.etype_id == CONSUMA_EQUIP } end #-------------------------------------------------------------------------- # ☆ 通常攻撃 アニメーション ID の取得 #-------------------------------------------------------------------------- alias a1_ex_equip_ga_atk_animation_id1 atk_animation_id1 def atk_animation_id1 return a1_ex_equip_ga_atk_animation_id1 unless use_consumer? consumer_equip.empty? ? 1 : consumer_equip[0].animation_id end #-------------------------------------------------------------------------- # ☆ 通常攻撃 アニメーション ID の取得(二刀流:武器2) #-------------------------------------------------------------------------- alias a1_ex_equip_ga_atk_animation_id2 atk_animation_id2 def atk_animation_id2 return a1_ex_equip_ga_atk_animation_id2 unless use_consumer? consumer_equip.empty? ? 1 : consumer_equip[0].animation_id end end end