#============================================================================== # ■ Game_BattlerBase #------------------------------------------------------------------------------ #  バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ # のクラスは Game_Battler クラスのスーパークラスとして使用されます。 #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # ● 定数(特徴) #-------------------------------------------------------------------------- FEATURE_ELEMENT_RATE = 11 # 属性有効度 FEATURE_DEBUFF_RATE = 12 # 弱体有効度 FEATURE_STATE_RATE = 13 # ステート有効度 FEATURE_STATE_RESIST = 14 # ステート無効化 FEATURE_PARAM = 21 # 通常能力値 FEATURE_XPARAM = 22 # 追加能力値 FEATURE_SPARAM = 23 # 特殊能力値 FEATURE_ATK_ELEMENT = 31 # 攻撃時属性 FEATURE_ATK_STATE = 32 # 攻撃時ステート FEATURE_ATK_SPEED = 33 # 攻撃速度補正 FEATURE_ATK_TIMES = 34 # 攻撃追加回数 FEATURE_STYPE_ADD = 41 # スキルタイプ追加 FEATURE_STYPE_SEAL = 42 # スキルタイプ封印 FEATURE_SKILL_ADD = 43 # スキル追加 FEATURE_SKILL_SEAL = 44 # スキル封印 FEATURE_EQUIP_WTYPE = 51 # 武器タイプ装備 FEATURE_EQUIP_ATYPE = 52 # 防具タイプ装備 FEATURE_EQUIP_FIX = 53 # 装備固定 FEATURE_EQUIP_SEAL = 54 # 装備封印 FEATURE_SLOT_TYPE = 55 # スロットタイプ FEATURE_ACTION_PLUS = 61 # 行動回数追加 FEATURE_SPECIAL_FLAG = 62 # 特殊フラグ FEATURE_COLLAPSE_TYPE = 63 # 消滅エフェクト FEATURE_PARTY_ABILITY = 64 # パーティ能力 #-------------------------------------------------------------------------- # ● 定数(特殊フラグ) #-------------------------------------------------------------------------- FLAG_ID_AUTO_BATTLE = 0 # 自動戦闘 FLAG_ID_GUARD = 1 # 防御 FLAG_ID_SUBSTITUTE = 2 # 身代わり FLAG_ID_PRESERVE_TP = 3 # TP持ち越し #-------------------------------------------------------------------------- # ● 定数(能力強化/弱体アイコンの開始番号) #-------------------------------------------------------------------------- ICON_BUFF_START = 64 # 強化(16 個) ICON_DEBUFF_START = 80 # 弱体(16 個) #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :hp # HP attr_reader :mp # MP attr_reader :tp # TP #-------------------------------------------------------------------------- # ● 各種能力値の略称によるアクセスメソッド #-------------------------------------------------------------------------- def mhp; param(0); end # 最大HP Maximum Hit Point def mmp; param(1); end # 最大MP Maximum Magic Point def atk; param(2); end # 攻撃力 ATtacK power def def; param(3); end # 防御力 DEFense power def mat; param(4); end # 魔法力 Magic ATtack power def mdf; param(5); end # 魔法防御 Magic DeFense power def agi; param(6); end # 敏捷性 AGIlity def luk; param(7); end # 運 LUcK def hit; xparam(0); end # 命中率 HIT rate def eva; xparam(1); end # 回避率 EVAsion rate def cri; xparam(2); end # 会心率 CRItical rate def cev; xparam(3); end # 会心回避率 Critical EVasion rate def mev; xparam(4); end # 魔法回避率 Magic EVasion rate def mrf; xparam(5); end # 魔法反射率 Magic ReFlection rate def cnt; xparam(6); end # 反撃率 CouNTer attack rate def hrg; xparam(7); end # HP再生率 Hp ReGeneration rate def mrg; xparam(8); end # MP再生率 Mp ReGeneration rate def trg; xparam(9); end # TP再生率 Tp ReGeneration rate def tgr; sparam(0); end # 狙われ率 TarGet Rate def grd; sparam(1); end # 防御効果率 GuaRD effect rate def rec; sparam(2); end # 回復効果率 RECovery effect rate def pha; sparam(3); end # 薬の知識 PHArmacology def mcr; sparam(4); end # MP消費率 Mp Cost Rate def tcr; sparam(5); end # TPチャージ率 Tp Charge Rate def pdr; sparam(6); end # 物理ダメージ率 Physical Damage Rate def mdr; sparam(7); end # 魔法ダメージ率 Magical Damage Rate def fdr; sparam(8); end # 床ダメージ率 Floor Damage Rate def exr; sparam(9); end # 経験獲得率 EXperience Rate #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @hp = @mp = @tp = 0 @hidden = false clear_param_plus clear_states clear_buffs end #-------------------------------------------------------------------------- # ● 能力値に加算する値をクリア #-------------------------------------------------------------------------- def clear_param_plus @param_plus = [0] * 8 end #-------------------------------------------------------------------------- # ● ステート情報をクリア #-------------------------------------------------------------------------- def clear_states @states = [] @state_turns = {} @state_steps = {} end #-------------------------------------------------------------------------- # ● ステートの消去 #-------------------------------------------------------------------------- def erase_state(state_id) @states.delete(state_id) @state_turns.delete(state_id) @state_steps.delete(state_id) end #-------------------------------------------------------------------------- # ● 能力強化情報をクリア #-------------------------------------------------------------------------- def clear_buffs @buffs = Array.new(8) { 0 } @buff_turns = {} end #-------------------------------------------------------------------------- # ● ステートの検査 #-------------------------------------------------------------------------- def state?(state_id) @states.include?(state_id) end #-------------------------------------------------------------------------- # ● 戦闘不能ステートの検査 #-------------------------------------------------------------------------- def death_state? state?(death_state_id) end #-------------------------------------------------------------------------- # ● 戦闘不能のステート ID を取得 #-------------------------------------------------------------------------- def death_state_id return 1 end #-------------------------------------------------------------------------- # ● 現在のステートをオブジェクトの配列で取得 #-------------------------------------------------------------------------- def states @states.collect {|id| $data_states[id] } end #-------------------------------------------------------------------------- # ● 現在のステートをアイコン番号の配列で取得 #-------------------------------------------------------------------------- def state_icons icons = states.collect {|state| state.icon_index } icons.delete(0) icons end #-------------------------------------------------------------------------- # ● 現在の強化/弱体をアイコン番号の配列で取得 #-------------------------------------------------------------------------- def buff_icons icons = [] @buffs.each_with_index {|lv, i| icons.push(buff_icon_index(lv, i)) } icons.delete(0) icons end #-------------------------------------------------------------------------- # ● 強化/弱体に対応するアイコン番号を取得 #-------------------------------------------------------------------------- def buff_icon_index(buff_level, param_id) if buff_level > 0 return ICON_BUFF_START + (buff_level - 1) * 8 + param_id elsif buff_level < 0 return ICON_DEBUFF_START + (-buff_level - 1) * 8 + param_id else return 0 end end #-------------------------------------------------------------------------- # ● 特徴を保持する全オブジェクトの配列取得 #-------------------------------------------------------------------------- def feature_objects states end #-------------------------------------------------------------------------- # ● 全ての特徴オブジェクトの配列取得 #-------------------------------------------------------------------------- def all_features feature_objects.inject([]) {|r, obj| r + obj.features } end #-------------------------------------------------------------------------- # ● 特徴オブジェクトの配列取得(特徴コードを限定) #-------------------------------------------------------------------------- def features(code) all_features.select {|ft| ft.code == code } end #-------------------------------------------------------------------------- # ● 特徴オブジェクトの配列取得(特徴コードとデータ ID を限定) #-------------------------------------------------------------------------- def features_with_id(code, id) all_features.select {|ft| ft.code == code && ft.data_id == id } end #-------------------------------------------------------------------------- # ● 特徴値の総乗計算 #-------------------------------------------------------------------------- def features_pi(code, id) features_with_id(code, id).inject(1.0) {|r, ft| r *= ft.value } end #-------------------------------------------------------------------------- # ● 特徴値の総和計算(データ ID を指定) #-------------------------------------------------------------------------- def features_sum(code, id) features_with_id(code, id).inject(0.0) {|r, ft| r += ft.value } end #-------------------------------------------------------------------------- # ● 特徴値の総和計算(データ ID は非指定) #-------------------------------------------------------------------------- def features_sum_all(code) features(code).inject(0.0) {|r, ft| r += ft.value } end #-------------------------------------------------------------------------- # ● 特徴の集合和計算 #-------------------------------------------------------------------------- def features_set(code) features(code).inject([]) {|r, ft| r |= [ft.data_id] } end #-------------------------------------------------------------------------- # ● 通常能力値の基本値取得 #-------------------------------------------------------------------------- def param_base(param_id) return 0 end #-------------------------------------------------------------------------- # ● 通常能力値の加算値取得 #-------------------------------------------------------------------------- def param_plus(param_id) @param_plus[param_id] end #-------------------------------------------------------------------------- # ● 通常能力値の最小値取得 #-------------------------------------------------------------------------- def param_min(param_id) return 0 if param_id == 1 # MMP return 1 end #-------------------------------------------------------------------------- # ● 通常能力値の最大値取得 #-------------------------------------------------------------------------- def param_max(param_id) return 999999 if param_id == 0 # MHP return 9999 if param_id == 1 # MMP return 999 end #-------------------------------------------------------------------------- # ● 通常能力値の変化率取得 #-------------------------------------------------------------------------- def param_rate(param_id) features_pi(FEATURE_PARAM, param_id) end #-------------------------------------------------------------------------- # ● 通常能力値の強化/弱体による変化率取得 #-------------------------------------------------------------------------- def param_buff_rate(param_id) @buffs[param_id] * 0.25 + 1.0 end #-------------------------------------------------------------------------- # ● 通常能力値の取得 #-------------------------------------------------------------------------- def param(param_id) value = param_base(param_id) + param_plus(param_id) value *= param_rate(param_id) * param_buff_rate(param_id) [[value, param_max(param_id)].min, param_min(param_id)].max.to_i end #-------------------------------------------------------------------------- # ● 追加能力値の取得 #-------------------------------------------------------------------------- def xparam(xparam_id) features_sum(FEATURE_XPARAM, xparam_id) end #-------------------------------------------------------------------------- # ● 特殊能力値の取得 #-------------------------------------------------------------------------- def sparam(sparam_id) features_pi(FEATURE_SPARAM, sparam_id) end #-------------------------------------------------------------------------- # ● 属性有効度の取得 #-------------------------------------------------------------------------- def element_rate(element_id) features_pi(FEATURE_ELEMENT_RATE, element_id) end #-------------------------------------------------------------------------- # ● 弱体有効度の取得 #-------------------------------------------------------------------------- def debuff_rate(param_id) features_pi(FEATURE_DEBUFF_RATE, param_id) end #-------------------------------------------------------------------------- # ● ステート有効度の取得 #-------------------------------------------------------------------------- def state_rate(state_id) features_pi(FEATURE_STATE_RATE, state_id) end #-------------------------------------------------------------------------- # ● 無効化するステートの配列を取得 #-------------------------------------------------------------------------- def state_resist_set features_set(FEATURE_STATE_RESIST) end #-------------------------------------------------------------------------- # ● 無効化されているステートの判定 #-------------------------------------------------------------------------- def state_resist?(state_id) state_resist_set.include?(state_id) end #-------------------------------------------------------------------------- # ● 攻撃時属性の取得 #-------------------------------------------------------------------------- def atk_elements features_set(FEATURE_ATK_ELEMENT) end #-------------------------------------------------------------------------- # ● 攻撃時ステートの取得 #-------------------------------------------------------------------------- def atk_states features_set(FEATURE_ATK_STATE) end #-------------------------------------------------------------------------- # ● 攻撃時ステートの発動率取得 #-------------------------------------------------------------------------- def atk_states_rate(state_id) features_sum(FEATURE_ATK_STATE, state_id) end #-------------------------------------------------------------------------- # ● 攻撃速度補正の取得 #-------------------------------------------------------------------------- def atk_speed features_sum_all(FEATURE_ATK_SPEED) end #-------------------------------------------------------------------------- # ● 攻撃追加回数の取得 #-------------------------------------------------------------------------- def atk_times_add [features_sum_all(FEATURE_ATK_TIMES), 0].max end #-------------------------------------------------------------------------- # ● 追加スキルタイプの取得 #-------------------------------------------------------------------------- def added_skill_types features_set(FEATURE_STYPE_ADD) end #-------------------------------------------------------------------------- # ● スキルタイプ封印の判定 #-------------------------------------------------------------------------- def skill_type_sealed?(stype_id) features_set(FEATURE_STYPE_SEAL).include?(stype_id) end #-------------------------------------------------------------------------- # ● 追加スキルの取得 #-------------------------------------------------------------------------- def added_skills features_set(FEATURE_SKILL_ADD) end #-------------------------------------------------------------------------- # ● スキル封印の判定 #-------------------------------------------------------------------------- def skill_sealed?(skill_id) features_set(FEATURE_SKILL_SEAL).include?(skill_id) end #-------------------------------------------------------------------------- # ● 武器装備可能の判定 #-------------------------------------------------------------------------- def equip_wtype_ok?(wtype_id) features_set(FEATURE_EQUIP_WTYPE).include?(wtype_id) end #-------------------------------------------------------------------------- # ● 防具装備可能の判定 #-------------------------------------------------------------------------- def equip_atype_ok?(atype_id) features_set(FEATURE_EQUIP_ATYPE).include?(atype_id) end #-------------------------------------------------------------------------- # ● 装備固定の判定 #-------------------------------------------------------------------------- def equip_type_fixed?(etype_id) features_set(FEATURE_EQUIP_FIX).include?(etype_id) end #-------------------------------------------------------------------------- # ● 装備封印の判定 #-------------------------------------------------------------------------- def equip_type_sealed?(etype_id) features_set(FEATURE_EQUIP_SEAL).include?(etype_id) end #-------------------------------------------------------------------------- # ● スロットタイプの取得 #-------------------------------------------------------------------------- def slot_type features_set(FEATURE_SLOT_TYPE).max || 0 end #-------------------------------------------------------------------------- # ● 二刀流の判定 #-------------------------------------------------------------------------- def dual_wield? slot_type == 1 end #-------------------------------------------------------------------------- # ● 行動回数追加確率の配列を取得 #-------------------------------------------------------------------------- def action_plus_set features(FEATURE_ACTION_PLUS).collect {|ft| ft.value } end #-------------------------------------------------------------------------- # ● 特殊フラグ判定 #-------------------------------------------------------------------------- def special_flag(flag_id) features(FEATURE_SPECIAL_FLAG).any? {|ft| ft.data_id == flag_id } end #-------------------------------------------------------------------------- # ● 消滅エフェクトの取得 #-------------------------------------------------------------------------- def collapse_type features_set(FEATURE_COLLAPSE_TYPE).max || 0 end #-------------------------------------------------------------------------- # ● パーティ能力判定 #-------------------------------------------------------------------------- def party_ability(ability_id) features(FEATURE_PARTY_ABILITY).any? {|ft| ft.data_id == ability_id } end #-------------------------------------------------------------------------- # ● 自動戦闘の判定 #-------------------------------------------------------------------------- def auto_battle? special_flag(FLAG_ID_AUTO_BATTLE) end #-------------------------------------------------------------------------- # ● 防御の判定 #-------------------------------------------------------------------------- def guard? special_flag(FLAG_ID_GUARD) && movable? end #-------------------------------------------------------------------------- # ● 身代わりの判定 #-------------------------------------------------------------------------- def substitute? special_flag(FLAG_ID_SUBSTITUTE) && movable? end #-------------------------------------------------------------------------- # ● TP持ち越しの判定 #-------------------------------------------------------------------------- def preserve_tp? special_flag(FLAG_ID_PRESERVE_TP) end #-------------------------------------------------------------------------- # ● 能力値の加算 #-------------------------------------------------------------------------- def add_param(param_id, value) @param_plus[param_id] += value refresh end #-------------------------------------------------------------------------- # ● HP の変更 #-------------------------------------------------------------------------- def hp=(hp) @hp = hp refresh end #-------------------------------------------------------------------------- # ● MP の変更 #-------------------------------------------------------------------------- def mp=(mp) @mp = mp refresh end #-------------------------------------------------------------------------- # ● HP の増減(イベント用) # value : 増減値 # enable_death : 戦闘不能を許可 #-------------------------------------------------------------------------- def change_hp(value, enable_death) if !enable_death && @hp + value <= 0 self.hp = 1 else self.hp += value end end #-------------------------------------------------------------------------- # ● TP の変更 #-------------------------------------------------------------------------- def tp=(tp) @tp = [[tp, max_tp].min, 0].max end #-------------------------------------------------------------------------- # ● TP の最大値を取得 #-------------------------------------------------------------------------- def max_tp return 100 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh state_resist_set.each {|state_id| erase_state(state_id) } @hp = [[@hp, mhp].min, 0].max @mp = [[@mp, mmp].min, 0].max @hp == 0 ? add_state(death_state_id) : remove_state(death_state_id) end #-------------------------------------------------------------------------- # ● 全回復 #-------------------------------------------------------------------------- def recover_all clear_states @hp = mhp @mp = mmp end #-------------------------------------------------------------------------- # ● HP の割合を取得 #-------------------------------------------------------------------------- def hp_rate @hp.to_f / mhp end #-------------------------------------------------------------------------- # ● MP の割合を取得 #-------------------------------------------------------------------------- def mp_rate mmp > 0 ? @mp.to_f / mmp : 0 end #-------------------------------------------------------------------------- # ● TP の割合を取得 #-------------------------------------------------------------------------- def tp_rate @tp.to_f / 100 end #-------------------------------------------------------------------------- # ● 隠れる #-------------------------------------------------------------------------- def hide @hidden = true end #-------------------------------------------------------------------------- # ● 現れる #-------------------------------------------------------------------------- def appear @hidden = false end #-------------------------------------------------------------------------- # ● 隠れ状態取得 #-------------------------------------------------------------------------- def hidden? @hidden end #-------------------------------------------------------------------------- # ● 存在判定 #-------------------------------------------------------------------------- def exist? !hidden? end #-------------------------------------------------------------------------- # ● 戦闘不能判定 #-------------------------------------------------------------------------- def dead? exist? && death_state? end #-------------------------------------------------------------------------- # ● 生存判定 #-------------------------------------------------------------------------- def alive? exist? && !death_state? end #-------------------------------------------------------------------------- # ● 正常判定 #-------------------------------------------------------------------------- def normal? exist? && restriction == 0 end #-------------------------------------------------------------------------- # ● コマンド入力可能判定 #-------------------------------------------------------------------------- def inputable? normal? && !auto_battle? end #-------------------------------------------------------------------------- # ● 行動可能判定 #-------------------------------------------------------------------------- def movable? exist? && restriction < 4 end #-------------------------------------------------------------------------- # ● 混乱状態判定 #-------------------------------------------------------------------------- def confusion? exist? && restriction >= 1 && restriction <= 3 end #-------------------------------------------------------------------------- # ● 混乱レベル取得 #-------------------------------------------------------------------------- def confusion_level confusion? ? restriction : 0 end #-------------------------------------------------------------------------- # ● アクターか否かの判定 #-------------------------------------------------------------------------- def actor? return false end #-------------------------------------------------------------------------- # ● 敵キャラか否かの判定 #-------------------------------------------------------------------------- def enemy? return false end #-------------------------------------------------------------------------- # ● ステートの並び替え # 配列 @states の内容を表示優先度の大きい順に並び替える。 #-------------------------------------------------------------------------- def sort_states @states = @states.sort_by {|id| [-$data_states[id].priority, id] } end #-------------------------------------------------------------------------- # ● 制約の取得 # 現在付加されているステートから最大の restriction を取得する。 #-------------------------------------------------------------------------- def restriction states.collect {|state| state.restriction }.push(0).max end #-------------------------------------------------------------------------- # ● 最重要のステート継続メッセージを取得 #-------------------------------------------------------------------------- def most_important_state_text states.each {|state| return state.message3 unless state.message3.empty? } return "" end #-------------------------------------------------------------------------- # ● スキルの必要武器を装備しているか #-------------------------------------------------------------------------- def skill_wtype_ok?(skill) return true end #-------------------------------------------------------------------------- # ● スキルの消費 MP 計算 #-------------------------------------------------------------------------- def skill_mp_cost(skill) (skill.mp_cost * mcr).to_i end #-------------------------------------------------------------------------- # ● スキルの消費 TP 計算 #-------------------------------------------------------------------------- def skill_tp_cost(skill) skill.tp_cost end #-------------------------------------------------------------------------- # ● スキル使用コストの支払い可能判定 #-------------------------------------------------------------------------- def skill_cost_payable?(skill) tp >= skill_tp_cost(skill) && mp >= skill_mp_cost(skill) end #-------------------------------------------------------------------------- # ● スキル使用コストの支払い #-------------------------------------------------------------------------- def pay_skill_cost(skill) self.mp -= skill_mp_cost(skill) self.tp -= skill_tp_cost(skill) end #-------------------------------------------------------------------------- # ● スキル/アイテムの使用可能時チェック #-------------------------------------------------------------------------- def occasion_ok?(item) $game_party.in_battle ? item.battle_ok? : item.menu_ok? end #-------------------------------------------------------------------------- # ● スキル/アイテムの共通使用可能条件チェック #-------------------------------------------------------------------------- def usable_item_conditions_met?(item) movable? && occasion_ok?(item) end #-------------------------------------------------------------------------- # ● スキルの使用可能条件チェック #-------------------------------------------------------------------------- def skill_conditions_met?(skill) usable_item_conditions_met?(skill) && skill_wtype_ok?(skill) && skill_cost_payable?(skill) && !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id) end #-------------------------------------------------------------------------- # ● アイテムの使用可能条件チェック #-------------------------------------------------------------------------- def item_conditions_met?(item) usable_item_conditions_met?(item) && $game_party.has_item?(item) end #-------------------------------------------------------------------------- # ● スキル/アイテムの使用可能判定 #-------------------------------------------------------------------------- def usable?(item) return skill_conditions_met?(item) if item.is_a?(RPG::Skill) return item_conditions_met?(item) if item.is_a?(RPG::Item) return false end #-------------------------------------------------------------------------- # ● 装備可能判定 #-------------------------------------------------------------------------- def equippable?(item) return false unless item.is_a?(RPG::EquipItem) return false if equip_type_sealed?(item.etype_id) return equip_wtype_ok?(item.wtype_id) if item.is_a?(RPG::Weapon) return equip_atype_ok?(item.atype_id) if item.is_a?(RPG::Armor) return false end #-------------------------------------------------------------------------- # ● 通常攻撃のスキル ID を取得 #-------------------------------------------------------------------------- def attack_skill_id return 1 end #-------------------------------------------------------------------------- # ● 防御のスキル ID を取得 #-------------------------------------------------------------------------- def guard_skill_id return 2 end #-------------------------------------------------------------------------- # ● 通常攻撃の使用可能判定 #-------------------------------------------------------------------------- def attack_usable? usable?($data_skills[attack_skill_id]) end #-------------------------------------------------------------------------- # ● 防御の使用可能判定 #-------------------------------------------------------------------------- def guard_usable? usable?($data_skills[guard_skill_id]) end end