#============================================================================== # ■ ブラッドダメージ #============================================================================== if $ukra_system == nil $ukra_system = {} end $ukra_system[1] = true #------------------------------------------------------------------------------ # ◆ module UKRA_001_SYSTEM #------------------------------------------------------------------------------ module UKRA_001_SYSTEM #-------------------------------------------------------------------------- # カスタマイズポイント #-------------------------------------------------------------------------- # ◆ブラッドダメージで減少する最大HPの最低値 # 元々の最大HPの(指定値)%が最低値となります。 # また、現在HPよりも最大HPが低くなる事はありません。 BLOODDMG_HP_BOTTOM = 10 # ◆ブラッドダメージのデフォルト割合 # 攻撃で与えたダメージの(指定値)%がブラッドダメージとして入ります。 # 特に指定のないスキル等は、このブラッドダメージ率を適用します。 DEFAULT_BLOODDMG_RATE = 0 # ◆ブラッドダメージ下限 # ブラッドダメージの最低値を設定します。 # 最終ダメージの(指定値)%は、ブラッドダメージとして保証されます。 DEFAULT_BLOODDMG_UNDER = 0 # ◆戦闘終了後のブラッドダメージ回復 # 戦闘終了後、回復するブラッドダメージの割合を設定します。 # DEFAULT_RECOVER_BD_WINは勝利時の、 # DEFAULT_RECOVER_BD_ESCは逃走時の回復率を設定します。 # 一応、_LOSで敗北時の回復率も設定できます。 # 受けていたブラッドダメージの(指定値)%を戦闘終了後に回復します。 DEFAULT_RECOVER_BD_WIN = 50 DEFAULT_RECOVER_BD_ESC = 25 DEFAULT_RECOVER_BD_LOS = 0 end #============================================================================== # #============================================================================== module UKRA_001 ATK_BDMG = /\\attack_bdmg\[([+-]?[\d]+)\]/i RES_BDMG = /\\resist_bdmg\[([+-]?[\d]+)\]/i BLD_SUCK = /\\blood_suck\[([+-]?[\d]+)\]/i BLD_SLIP = /\\blood_slip\[([+-]?[\d]+)\]/i def atk_bdmg result = 0 @note.gsub(/#{ATK_BDMG}/) do result += $1.to_i end return result end def res_bdmg result = 0 @note.gsub(/#{RES_BDMG}/) do result += $1.to_i end return result end def bld_suck result = 0 @note.gsub(/#{BLD_SUCK}/) do result += $1.to_i end return result end def bld_slip result = 0 @note.gsub(/#{BLD_SLIP}/) do result += $1.to_i end return result end end class RPG::BaseItem include UKRA_001 end class RPG::State include UKRA_001 end class RPG::Enemy include UKRA_001 end class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :hp_blood_damage #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ukra_bt_blooddmg_initialize initialize def initialize ukra_bt_blooddmg_initialize @hp_blood_damage = 0 end #-------------------------------------------------------------------------- # ● MaxHP の取得 #-------------------------------------------------------------------------- alias original_maxhp maxhp def maxhp n = original_maxhp a = UKRA_001_SYSTEM::BLOODDMG_HP_BOTTOM return [[n - @hp_blood_damage, n * a / 100].max, maxhp_limit].min end #-------------------------------------------------------------------------- # ● 全回復 #-------------------------------------------------------------------------- alias ukra001_bt_bd_recover_all recover_all def recover_all @hp_blood_damage = 0 ukra001_bt_bd_recover_all end #-------------------------------------------------------------------------- # ● HPブラッド の変更 # blood_hp : 新しい ブラッド HP #-------------------------------------------------------------------------- def hp_blood_damage=(blood_hp) z = blood_hp a = UKRA_001_SYSTEM::BLOODDMG_HP_BOTTOM b = original_maxhp * (100 - a) / 100 c = original_maxhp - hp @hp_blood_damage = [[[z, c].min, b].min, 0].max end #-------------------------------------------------------------------------- # ○ 基本ブラッドダメージ率(Game_Actor, Game_Enemyで再定義) #-------------------------------------------------------------------------- def base_blood_attack return 0 end #-------------------------------------------------------------------------- # ○ 基本ブラッドダメージ抵抗率(Game_Actor, Game_Enemyで再定義) #-------------------------------------------------------------------------- def base_blood_resist return 0 end #-------------------------------------------------------------------------- # ○ 基本ブラッドスリップ(Game_Actor, Game_Enemyで再定義) #-------------------------------------------------------------------------- def base_blood_slip return 0 end #-------------------------------------------------------------------------- # ○ 基本ブラッドダメージ回収率(Game_Actor, Game_Enemyで再定義) #-------------------------------------------------------------------------- def base_blood_suck return 0 end #-------------------------------------------------------------------------- # ○ ブラッドダメージ率の決定 #-------------------------------------------------------------------------- def call_blood_damage_rate(attacker, obj = nil) z = UKRA_001_SYSTEM::DEFAULT_BLOODDMG_UNDER n = attacker.blood_attack a = self.blood_resist if obj n += obj.atk_bdmg a = 0 if obj.base_damage < 0 end if n < 0 result = n else #------------------------------------------------------------------- # ☆ UKRA003:「弱点」との併用による連動機能 # 弱点攻撃をすると、ブラッドダメージ率2倍。 #------------------------------------------------------------------- if $ukra_system[3] ele = (obj ? obj.element_set : attacker.element_set) wek = self.weak_point if (ele & wek).size > 0 n *= 2 end end result = (n <= a ? z : n - a) result /= 2 if self.guarding? end return Integer(result) end #-------------------------------------------------------------------------- # ○ ブラッドアタック #-------------------------------------------------------------------------- def blood_attack n = self.base_blood_attack for state in states.compact do n += state.atk_bdmg end return n end #-------------------------------------------------------------------------- # ○ ブラッドレジスト #-------------------------------------------------------------------------- def blood_resist n = self.base_blood_resist for state in states.compact n += state.res_bdmg end return n end #-------------------------------------------------------------------------- # ○ ブラッドスリップ #-------------------------------------------------------------------------- def blood_slip n = self.base_blood_slip for state in states.compact n += state.bld_slip end return n end #-------------------------------------------------------------------------- # ○ ブラッド回収率 #-------------------------------------------------------------------------- def blood_suck n = self.base_blood_suck for state in states.compact n += state.bld_suck end return n end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 # skill : スキル #-------------------------------------------------------------------------- def skill_effect(user, skill) clear_action_results unless skill_effective?(user, skill) @skipped = true return end if rand(100) >= calc_hit(user, skill) # 命中判定 @missed = true return end if rand(100) < calc_eva(user, skill) # 回避判定 @evaded = true return end make_obj_damage_value(user, skill) # ダメージ計算 make_obj_absorb_effect(user, skill) # 吸収効果計算 execute_damage(user, skill) # ダメージ反映 ※変更点 if skill.physical_attack and @hp_damage == 0 # 物理ノーダメージ判定 return end apply_state_changes(skill) # ステート変化 end #-------------------------------------------------------------------------- # ● アイテムの効果適用 # user : アイテムの使用者 # item : アイテム #-------------------------------------------------------------------------- def item_effect(user, item) clear_action_results unless item_effective?(user, item) @skipped = true return end if rand(100) >= calc_hit(user, item) # 命中判定 @missed = true return end if rand(100) < calc_eva(user, item) # 回避判定 @evaded = true return end hp_recovery = calc_hp_recovery(user, item) # HP 回復量計算 mp_recovery = calc_mp_recovery(user, item) # MP 回復量計算 make_obj_damage_value(user, item) # ダメージ計算 @hp_damage -= hp_recovery # HP 回復量を差し引く @mp_damage -= mp_recovery # MP 回復量を差し引く make_obj_absorb_effect(user, item) # 吸収効果計算 execute_damage(user, item) # ダメージ反映 ※変更点 item_growth_effect(user, item) # 成長効果適用 if item.physical_attack and @hp_damage == 0 # 物理ノーダメージ判定 return end apply_state_changes(item) # ステート変化 end #-------------------------------------------------------------------------- # ● ダメージの反映 # user : スキルかアイテムの使用者 # obj : スキルまたはアイテム(初期値nil) # 呼び出し前に @hp_damage、@mp_damage、@absorbed が設定されていること。 #-------------------------------------------------------------------------- def execute_damage(user, obj = nil) if @hp_damage > 0 # ダメージが正の数 remove_states_shock # 衝撃によるステート解除 end # ----- 追加ここから ---------------------------------------------------- n = call_blood_damage_rate(user, obj) m = user.blood_suck + (obj == nil ? 0 : obj.bld_suck) # ----------------------------------------------------------------------- user.hp_blood_damage -= @hp_damage * m / 100 # ----------------------------------------------------------------------- if @hp_damage < 0 self.hp_blood_damage += @hp_damage * n / 100 end # ----- 追加ここまで ---------------------------------------------------- self.hp -= @hp_damage self.mp -= @mp_damage # ----- 追加ここから ---------------------------------------------------- if @hp_damage > 0 self.hp_blood_damage += @hp_damage * n / 100 end # ----- 追加ここまで ---------------------------------------------------- if @absorbed # 吸収の場合 user.hp += @hp_damage user.mp += @mp_damage end end #-------------------------------------------------------------------------- # ○ スリップダメージの効果適用 # ※ スリップダメージに加えてブラッドスリップも追加 #-------------------------------------------------------------------------- alias ukra001_bd_slip_damage_effect slip_damage_effect def slip_damage_effect ukra001_bd_slip_damage_effect self.hp_blood_damage += original_maxhp * blood_slip / 100 end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 通常攻撃ブラッドダメージ率 #-------------------------------------------------------------------------- def base_blood_attack n = 0 for item in equips.compact do n += item.atk_bdmg end return n end #-------------------------------------------------------------------------- # ○ ブラッドダメージ抵抗率 #-------------------------------------------------------------------------- def base_blood_resist n = 0 for item in equips.compact do n += item.res_bdmg end return n end #-------------------------------------------------------------------------- # ○ ブラッドスリップ基本値 #-------------------------------------------------------------------------- def base_blood_slip n = 0 for item in equips.compact do n += item.bld_slip end return n end #-------------------------------------------------------------------------- # ○ ブラッドスリップ基本値 #-------------------------------------------------------------------------- def base_blood_suck n = 0 for item in equips.compact do n += item.bld_suck end return n end #-------------------------------------------------------------------------- # ○ 戦闘後のブラッドダメージ回復 #-------------------------------------------------------------------------- def battleend_bd_recovery(br) a = UKRA_001_SYSTEM::DEFAULT_RECOVER_BD_WIN b = UKRA_001_SYSTEM::DEFAULT_RECOVER_BD_ESC c = UKRA_001_SYSTEM::DEFAULT_RECOVER_BD_LOS n = [a, b, c] @hp_blood_damage = [(@hp_blood_damage * (100 - n[br]) / 100), 0].max end end class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ○ 戦闘後のブラッドダメージ回復 #-------------------------------------------------------------------------- def p_battleend_bd_recovery(br) for actor in members actor.battleend_bd_recovery(br) end end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ○ 基本ブラッドダメージ率の設定 #-------------------------------------------------------------------------- def base_blood_attack return enemy.atk_bdmg end #-------------------------------------------------------------------------- # ○ ブラッドダメージ抵抗率の設定 #-------------------------------------------------------------------------- def base_blood_resist return enemy.res_bdmg end #-------------------------------------------------------------------------- # ○ ブラッドスリップ基本値 #-------------------------------------------------------------------------- def base_blood_slip return enemy.bld_slip end #-------------------------------------------------------------------------- # ○ ブラッドダメージ回収率基本値 #-------------------------------------------------------------------------- def base_blood_suck return enemy.bld_suck end end class Window_Base < Window #-------------------------------------------------------------------------- # ● ブラッド HP ゲージの色 1 の取得 #-------------------------------------------------------------------------- def blood_hp_gauge_color1 return text_color(18) end #-------------------------------------------------------------------------- # ● ブラッド HP ゲージの色 2 の取得 #-------------------------------------------------------------------------- def blood_hp_gauge_color2 return text_color(10) end #-------------------------------------------------------------------------- # ● HP の文字色を取得 # actor : アクター #-------------------------------------------------------------------------- def hp_color(actor) return knockout_color if actor.hp == 0 return crisis_color if actor.hp < actor.original_maxhp / 4 return normal_color end #-------------------------------------------------------------------------- # ● 最大HP の文字色を取得 # actor : アクター #-------------------------------------------------------------------------- def maxhp_color(actor) return knockout_color if actor.maxhp < actor.original_maxhp / 4 return crisis_color if actor.maxhp < actor.original_maxhp / 2 return normal_color end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 120) draw_actor_hp_gauge(actor, x, y, width) self.contents.font.color = system_color self.contents.draw_text(x, y, 30, WLH, Vocab::hp_a) self.contents.font.color = hp_color(actor) xr = x + width if width < 120 self.contents.draw_text(xr - 40, y, 40, WLH, actor.hp, 2) else self.contents.draw_text(xr - 90, y, 40, WLH, actor.hp, 2) self.contents.font.color = normal_color self.contents.draw_text(xr - 50, y, 10, WLH, "/", 2) self.contents.font.color = maxhp_color(actor) self.contents.draw_text(xr - 40, y, 40, WLH, actor.maxhp, 2) end end #-------------------------------------------------------------------------- # ● HP ゲージの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_hp_gauge(actor, x, y, width = 120) gw = width * actor.hp / actor.original_maxhp gc1 = hp_gauge_color1 gc2 = hp_gauge_color2 bgw = width * actor.maxhp / actor.original_maxhp bgc1 = blood_hp_gauge_color1 bgc2 = blood_hp_gauge_color2 self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color) self.contents.gradient_fill_rect(x, y + WLH - 8, bgw, 6, bgc1, bgc2) self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2) end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 戦闘終了 # result : 結果 (0:勝利 1:逃走 2:敗北) #-------------------------------------------------------------------------- alias ukra001_bt_battle_end battle_end def battle_end(result) ukra001_bt_battle_end(result) $game_party.p_battleend_bd_recovery(result) end end