Project1

标题: 角色生命值护盾(SideView向) [打印本页]

作者: 三途亚梦    时间: 2015-2-19 13:51
标题: 角色生命值护盾(SideView向)
本帖最后由 三途亚梦 于 2015-9-8 19:15 编辑

RUBY 代码复制
  1. #==============================================================================
  2. # +++ 角色生命护盾 +++
  3. #==============================================================================
  4. # 作者 By 三途亚梦
  5. #  -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。
  6. #==============================================================================
  7. # 本脚本的作用是给玩家人物、敌人添加一个新的能力值“生命护盾”,
  8. # 生命护盾会吸收该角色受到的来自技能造成的体力伤害。
  9. #==============================================================================
  10. #
  11. # ★再次强调,生命护盾仅仅吸收来自“技能”造成的体力伤害!
  12. # 这个脚本是针对SideView战斗系统做出兼容调整的版本,
  13. # 使用请加载在SideView战斗系统的下方。
  14. #
  15. # ★人物的生命护盾是amuhsp,
  16. # 可以以a.amuhsp的形式运用在伤害公式中,
  17. # 也可以通过$game_actors[1].amuhsp之类的方式在事件中改变它的数值。
  18. #
  19. # ★HspClear = true 时,人物的生命护盾将在战斗结束时清零。
  20. # 如果不想清零请将 true改为false
  21. #
  22. # ★HspNoAddition = true 时,
  23. # 生命护盾的恢复将不享受恢复效果、物理及魔法伤害比率的加成,
  24. # 但是会对 make_damage_value 的方法做出变更,略降低脚本的兼容性。
  25. #
  26. # 设定部分所有文字信息的描述方法修改时请保留“”引号。
  27. #
  28. # ★将技能设置成体力值恢复,并在技能备注栏备注“[护盾恢复]”,
  29. # 那么这个技能将变成增加目标角色的生命护盾值
  30. # ★备注的时候不需要写入“”引号
  31. #
  32. # 角色的生命护盾没有上限,下限为0
  33. #
  34. # 如果需要设置一个技能为角色体力值的10%,又不想令护盾无限的加下去
  35. # 技能公式请参照这个写法:
  36. # b.hp * 0.1 - b.amuhsp
  37. #
  38. #==============================================================================
  39. # ★ 设定部分 ★
  40. #==============================================================================
  41. module Amu
  42.   module Hsp
  43.  
  44.   HspClear = true  #是否在战斗结束时清除掉玩家剩余的生命护盾
  45.  
  46.   HspNoAddition = true #是否采用本脚本的计算伤害的方法
  47.  
  48.   HspName = "生命护盾"  #生命护盾的名字
  49.  
  50.   HspABonus = "%s的%s剩余%s点!"  #玩家人物的生命护盾损伤后显示剩余值的文字
  51.  
  52.   HspEBonus = "%s的%s还剩%s点!"  #敌人的生命护盾损伤后显示剩余值的文字
  53.  
  54.   HspADamage = "%s的%s受到%s点伤害!"  #玩家人物的生命护盾受到伤害的文字
  55.  
  56.   HspEDamage = "%s的%s受到%s点伤害!"  #敌人的生命护盾受到伤害的文字
  57.  
  58.   HspARecovery  = "%s获得了一个%s点的%s保护!" #玩家的生命护盾得到提高的文字
  59.  
  60.   HspERecovery  = "%s接受了一个%s点的%s保护!" #敌人的生命护盾得到提高的文字
  61.  
  62.   HspADestory  = "%s的%s受到%s点伤害而遭到击破!" #玩家的生命护盾被击破时的文字
  63.  
  64.   HspEDestroy  = "%s的%s受到%s点伤害而被击破了!" #敌人的生命护盾被击破时的文字
  65.  
  66.   def self.play_actor_amuhspdamage  # 玩家的生命护盾受到伤害的音效
  67.     Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  68.   end
  69.  
  70.   def self.play_enemy_amuhspdamage   # 敌人的生命护盾受到伤害的音效
  71.     Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  72.   end
  73.  
  74.   def self.play_amuhsp_destory   # 生命护盾被击破时的音效
  75.     Audio.se_play("Audio/SE/Crash.ogg", 60, 90)
  76.   end
  77.  
  78.   end
  79. end
  80.  
  81. class Game_ActionResult
  82.   #--------------------------------------------------------------------------
  83.   # ● 定义实例变量
  84.   #--------------------------------------------------------------------------
  85.   attr_accessor :amuhsp_damage                # 生命护盾 伤害
  86.   #--------------------------------------------------------------------------
  87.   # ● 清除伤害值`
  88.   #--------------------------------------------------------------------------
  89.   alias amu_20141125_clear_damage_values clear_damage_values
  90.   def clear_damage_values
  91.     amu_20141125_clear_damage_values
  92.     @amuhsp_damage = 0
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● 生成伤害
  96.   #--------------------------------------------------------------------------
  97.   alias amu_20141125_make_damage make_damage
  98.   def make_damage(value, item)
  99.     amu_20141125_make_damage(value, item)
  100.     @amuhsp_damage = value if item.damage.to_hp? && @battler.amuhsp > 0 && value > 0
  101.     @amuhsp_damage = value if item.damage.to_hp? && item.damage.recover? && item.note.include?("[护盾恢复]")
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 获取具有生命护盾时 HP 伤害的文字
  105.   #--------------------------------------------------------------------------
  106.   def hp_damage_text
  107.     if @hp_drain > 0
  108.       fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  109.       sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  110.     elsif @hp_damage > 0
  111.       fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
  112.       sprintf(fmt, @battler.name, @hp_damage)
  113.     elsif @hp_damage < 0
  114.       fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  115.       sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  116.     elsif @hp_damage = 0 && @battler.amuhsp > 0
  117.       fmt = @battler.actor? ? Amu::Hsp::HspABonus : Amu::Hsp::HspEBonus
  118.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @battler.amuhsp)
  119.     else
  120.       fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  121.       sprintf(fmt, @battler.name)
  122.     end
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 获取 生命护盾 伤害的文字
  126.   #--------------------------------------------------------------------------
  127.   def amuhsp_damage_text
  128.     if @amuhsp_damage > 0 && @battler.amuhsp > 0
  129.       fmt = @battler.actor? ? Amu::Hsp::HspADamage : Amu::Hsp::HspEDamage
  130.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
  131.     elsif @amuhsp_damage > 0 && @battler.amuhsp == 0
  132.       fmt = @battler.actor? ? Amu::Hsp::HspADestory : Amu::Hsp::HspEDestroy
  133.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
  134.     elsif @amuhsp_damage < 0
  135.       fmt = @battler.actor? ? Amu::Hsp::HspARecovery : Amu::Hsp::HspERecovery
  136.       sprintf(fmt, @battler.name, -@amuhsp_damage, Amu::Hsp::HspName)
  137.     else
  138.       ""
  139.     end
  140.   end
  141. end
  142.  
  143.  
  144. class Game_BattlerBase
  145.   attr_reader   :amuhsp                       # 生命护盾
  146.   #--------------------------------------------------------------------------
  147.   # ● 初始化对象
  148.   #--------------------------------------------------------------------------
  149.   alias amu_20141125_initialize initialize
  150.   def initialize
  151.     amu_20141125_initialize
  152.     @amuhsp = 0
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 更改 HSP
  156.   #--------------------------------------------------------------------------
  157.   def amuhsp=(amuhsp)
  158.     @amuhsp = amuhsp
  159.     refresh
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 刷新
  163.   #--------------------------------------------------------------------------
  164.   alias amu_20141125_refresh refresh
  165.   def refresh
  166.     amu_20141125_refresh
  167.     @amuhsp = [@amuhsp, 0].max
  168.   end
  169. end
  170.  
  171. class Game_Battler < Game_BattlerBase
  172.   #--------------------------------------------------------------------------
  173.   # ● 计算伤害
  174.   #--------------------------------------------------------------------------
  175.   alias amu_20141125_make_damage_value make_damage_value
  176.   def make_damage_value(user, item)
  177.     if Amu::Hsp::HspNoAddition
  178.      value = item.damage.eval(user, self, $game_variables)
  179.       value = 100 if (user.skills.include?($data_skills[51]) if user.is_a?(Game_Actor))
  180.       value *= item_element_rate(user, item)
  181.       value *= pdr if item.physical? && !make_amuhsp?(item)
  182.       value *= mdr if item.magical? && !make_amuhsp?(item)
  183.       value *= rec if item.damage.recover? && !make_amuhsp?(item)
  184.       value = apply_critical(value) if @result.critical
  185.       value = apply_variance(value, item.damage.variance)
  186.       value = apply_guard(value)
  187.       if make_amuhsp?(item)
  188.         def actor_amuhsp?
  189.           return true
  190.         end
  191.       end
  192.       @result.make_damage(value.to_i, item)
  193.     end
  194.   else
  195.     amu_20141125_make_damage_value(user, item)
  196.     if make_amuhsp?(item)
  197.       def actor_amuhsp?
  198.         return true
  199.       end
  200.     end
  201.   end
  202.   #--------------------------------------------------------------------------
  203.   # ● 处理伤害
  204.   #    调用前需要设置好
  205.   #    @result.hp_damage   @result.mp_damage
  206.   #    @result.hp_drain    @result.mp_drain
  207.   #--------------------------------------------------------------------------
  208.   def execute_damage(user)
  209.     on_damage(@result.hp_damage) if @result.hp_damage > 0
  210.     if self.amuhsp > 0 && @result.hp_damage > 0
  211.       eamuhsp = self.amuhsp
  212.       self.amuhsp -= @result.hp_damage
  213.       self.amuhsp <= 0 ? @result.hp_damage -= eamuhsp : @result.hp_damage = 0
  214.     end
  215.     if actor_amuhsp?
  216.       self.amuhsp -= @result.hp_damage
  217.       @result.hp_damage = 0
  218.       def actor_amuhsp?
  219.         return false
  220.       end
  221.     else
  222.       self.hp -= @result.hp_damage
  223.     end
  224.     self.mp -= @result.mp_damage
  225.     user.hp += @result.hp_drain
  226.     user.mp += @result.mp_drain
  227.   end
  228.   #--------------------------------------------------------------------------
  229.   # ● 判断技能是否用来增加生命护盾
  230.   #--------------------------------------------------------------------------
  231.   def make_amuhsp?(item)
  232.     return false unless item.is_a?(RPG::Skill)
  233.     return item.note.include?("[护盾恢复]")
  234.   end
  235.   def actor_amuhsp?
  236.     return false
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 清除 生命护盾
  240.   #--------------------------------------------------------------------------
  241.   def clear_amuhsp
  242.     self.amuhsp = 0
  243.   end
  244.   #--------------------------------------------------------------------------
  245.   # ● 回合结束的处理(SideView)
  246.   #--------------------------------------------------------------------------
  247.   def on_turn_end
  248.     on_turn_end_game_battler_n03
  249.     @sv.add_state = []
  250.     @sv.result_damage = [@result.hp_damage, @result.mp_damage, @result.amuhsp_damage]
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # ● 战斗结束处理
  254.   #--------------------------------------------------------------------------
  255.   alias amu_20141125_on_battle_end on_battle_end
  256.   def on_battle_end
  257.     amu_20141125_on_battle_end
  258.     clear_amuhsp if Amu::Hsp::HspClear == true
  259.   end
  260. end
  261.  
  262. class Game_Actor < Game_Battler
  263.   #--------------------------------------------------------------------------
  264.   # ● 设置玩家具有生命护盾时被击的效果
  265.   #--------------------------------------------------------------------------
  266.   def perform_hspdamage_effect
  267.     $game_troop.screen.start_shake(5, 5, 10)
  268.     @sprite_effect_type = :blink
  269.     Amu::Hsp.play_actor_amuhspdamage
  270.   end
  271. end
  272.  
  273. class Game_Enemy < Game_Battler
  274.   #--------------------------------------------------------------------------
  275.   # ● 设置敌人具有生命护盾时被击的效果
  276.   #--------------------------------------------------------------------------
  277.   def perform_hspdamage_effect
  278.     $game_troop.screen.start_shake(5, 5, 10)
  279.     @sprite_effect_type = :blink
  280.     Amu::Hsp.play_enemy_amuhspdamage
  281.   end
  282. end
  283.  
  284. class Window_BattleLog < Window_Selectable
  285.   #--------------------------------------------------------------------------
  286.   # ● 显示伤害
  287.   #--------------------------------------------------------------------------
  288.   alias amu_20141125_display_damage display_damage
  289.   def display_damage(target, item)
  290.     if target.result.missed
  291.       display_miss(target, item)
  292.     elsif target.result.evaded
  293.       display_evasion(target, item)
  294.     else
  295.       display_amuhsp_damage(target, item)
  296.       display_hp_damage(target, item)
  297.       display_mp_damage(target, item)
  298.       display_tp_damage(target, item)
  299.     end
  300.   end
  301.   #--------------------------------------------------------------------------
  302.   # ● 显示 生命护盾 伤害
  303.   #--------------------------------------------------------------------------
  304.   def display_amuhsp_damage(target, item)
  305.     return if target.dead? || target.result.amuhsp_damage == 0
  306.     if target.result.amuhsp_damage > 0 && target.amuhsp > 0 && target.result.hp_drain == 0
  307.       target.perform_hspdamage_effect
  308.     end
  309.     Amu::Hsp.play_amuhsp_destory if target.result.amuhsp_damage > 0 && target.amuhsp == 0
  310.     Sound.play_recovery if target.result.amuhsp_damage < 0
  311.     add_text(target.result.amuhsp_damage_text)
  312.     wait
  313.   end
  314. end
  315.  
  316. #==============================================================================
  317. # ★ SideView的兼容部分,请勿修改 ★
  318. #==============================================================================
  319. module N03
  320.  
  321.   # MPダメージ数字画像のファイル名(Systemフォルダを参照します)
  322.   DAMAGE_AMUHSP = "damage_hsp"
  323.  
  324. end
  325.  
  326. class SideView
  327.   #--------------------------------------------------------------------------
  328.   # ● 初期化
  329.   #--------------------------------------------------------------------------
  330.   alias amu_20141126_reset reset
  331.   def reset
  332.     amu_20141126_reset
  333.     @result_damage = [0,0,0]
  334.   end
  335.   #--------------------------------------------------------------------------
  336.   # ● 设置 被治疗 的标识
  337.   #--------------------------------------------------------------------------
  338.   alias amu_20141126_recovery? recovery?
  339.   def recovery?
  340.     recovery = false
  341.     @battler.result.hp_damage = -1 if @battler.result.hp_damage == true
  342.     recovery = true if @battler.result.hp_damage < 0
  343.     recovery = true if @battler.result.mp_damage < 0
  344.     recovery = true if @battler.result.tp_damage < 0
  345.     recovery = true if @battler.result.amuhsp_damage < 0
  346.     return recovery
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ● 判断是否有伤害
  350.   #--------------------------------------------------------------------------
  351.   def damage_zero?
  352.     return @battler.result.amuhsp_damage == 0 && @battler.result.hp_damage == 0 && @battler.result.mp_damage == 0 && @battler.result.tp_damage == 0
  353.   end
  354. end
  355.  
  356. class Sprite_Damage < Sprite
  357.   #--------------------------------------------------------------------------
  358.   # ● 显示伤害的数值
  359.   #--------------------------------------------------------------------------
  360.   def set_damage
  361.     return @action_end = true if !N03::DAMAGE_POP
  362.     damage = @battler.result.hp_damage if @battler.result.hp_damage != 0
  363.     damage = @battler.result.hp_drain  if @battler.result.hp_drain  != 0
  364.     damage = @battler.result.mp_damage if @battler.result.mp_damage != 0
  365.     damage = @battler.result.mp_drain  if @battler.result.mp_drain  != 0
  366.     damage = @battler.result.tp_damage if @battler.result.tp_damage != 0
  367.     damage = @battler.result.amuhsp_damage if @battler.result.amuhsp_damage != 0
  368.     if !damage or damage == 0
  369.       @action_end = true if @st == nil
  370.       return # ステートだけPOPする設定を考慮して@action_endは返さない
  371.     end
  372.     hit_count
  373.     #@hit = @battler.sv.hit
  374.     #@battler.sv.hit += 1 if damage != 0
  375. #~     damage = 1 if damage == true
  376.     file = N03::DAMAGE_PLUS if damage > 0
  377.     file = N03::DAMAGE_MINUS if damage < 0
  378.     add_file = N03::DAMAGE_MP if @battler.result.mp_damage != 0
  379.     add_file = N03::DAMAGE_TP if @battler.result.tp_damage != 0
  380.     add_file = N03::DAMAGE_AMUHSP if @battler.result.amuhsp_damage != 0
  381.     adjust_x = N03::DAMAGE_ADJUST
  382.     @num = []
  383.     @num_base = []
  384.     damage = damage.abs
  385.     max_num = damage.to_s.size
  386.     max_num += 1 if add_file != nil
  387.     for i in 0...max_num
  388.       @num[i] = Sprite.new
  389.       if add_file != nil && i == max_num - 1
  390.         @num[i].bitmap = Cache.system(add_file)
  391.         cw = (damage % (10 * 10 ** i))/(10 ** i)
  392.         sw = 0 if sw == nil
  393.       else
  394.         @num[i].bitmap = Cache.system(file)
  395.         cw = (damage % (10 * 10 ** i))/(10 ** i)
  396.         sw = @num[i].bitmap.width / 10
  397.         @num[i].src_rect.set(cw * sw, 0, sw, @num[i].bitmap.height)
  398.       end
  399.       @num_base[i] = []
  400.       @num_base[i][0] = (sw + adjust_x) * i * -1 + (@battler.sv.x / 100)
  401.       @num_base[i][1] =  -(@num[i].bitmap.height / 3) - i * 2 - @hit * 2 + (@battler.sv.y - @battler.sv.h - @battler.sv.j - @battler.sv.oy_adjust)/ 100
  402.       @num_base[i][0] -= @num[i].bitmap.width / 2 - adjust_x if add_file != nil && i == max_num - 1
  403.       @num[i].z = 1000 + i + @hit * 10
  404.     end
  405.     @Time = @pop_time = 80
  406.   end
  407. end
  408.  
  409. module N03
  410.   #--------------------------------------------------------------------------
  411.   # ● ダメージの作成
  412.   #--------------------------------------------------------------------------
  413.   def self.set_damage(battler, hp_damage, mp_damage, amuhsp_damage)
  414.     battler.result.hp_damage = hp_damage
  415.     battler.result.mp_damage = mp_damage
  416.     battler.result.amuhsp_damage = amuhsp_damage
  417.   end
  418. end
  419.  
  420. class Scene_Battle < Scene_Base
  421.   #--------------------------------------------------------------------------
  422.   # ● ダメージ戦闘アニメ処理
  423.   #--------------------------------------------------------------------------
  424.   def damage_anime(targets, target, item)
  425.     @log_window.back_to(1) if @log_window.line_number == 5
  426.     return if item.scope != 9 && item.scope != 10 && target.dead?
  427.     @miSs = false
  428.     invoke_item(target,item)
  429.     if target.result.missed
  430.       target.sv.miss_action(@subject, item)
  431.       return @miss = true
  432.     elsif target.result.evaded or target.sv.counter_id != 0
  433.       target.sv.evasion_action(@subject, item)
  434.       return @miss = true
  435.     elsif target.sv.reflection_id != 0
  436.       N03.set_damage_anime_data(targets, target, [target.sv.reflection_id, false, false, true])
  437.       target.sv.reflection_id = 0
  438.       @reflection_data = [] if @reflection_data == nil
  439.       return @reflection_data.push([N03.get_attack_anime_id(-3, @subject), false, false, true])
  440.     end
  441.     target.sv.damage_action(@subject, item)
  442.     N03.set_damage(@subject, -target.result.hp_drain, -target.result.mp_drain, nil) if target != @subject
  443.     @spriteset.set_damage_pop(target)
  444.     @spriteset.set_damage_pop(@subject) if target != @subject && (@subject.result.hp_damage != 0 or @subject.result.mp_damage != 0 or @subject.result.amuhsp_damage != 0)
  445.     N03.set_damage_anime_data(targets, target, @subject.sv.damage_anime_data) if @subject.sv.damage_anime_data != []
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ● ターン終了
  449.   #--------------------------------------------------------------------------
  450.   def turn_end
  451.     turn_end_scene_battle_n03
  452.     for member in $game_troop.members + $game_party.members
  453.       N03.set_damage(member, member.sv.result_damage[0],member.sv.result_damage[1],member.sv.result_damage[2])
  454.       member.sv.result_damage = [0,0,0]
  455.       @spriteset.set_damage_pop(member) if member.result.hp_damage != 0 or member.result.mp_damage != 0 or member.result.amuhsp_damage != 0
  456.     end
  457.     set_camera_wait(N03::TURN_END_WAIT)
  458.     N03.camera(nil, N03::BATTLE_CAMERA["ターン開始前"].dup) if $game_party.inputable?
  459.     @log_window.clear
  460.   end
  461. end
  
作者: chd114    时间: 2015-2-21 00:26
  1. ······群组也不能用代码框吗?
复制代码

作者: ♂雨    时间: 2015-9-8 14:29





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1