Project1

标题: 新人请教,XP里如何制作吸血技能,或者持续回复 [打印本页]

作者: 丿饕餮丨    时间: 2017-5-9 17:48
标题: 新人请教,XP里如何制作吸血技能,或者持续回复
RT    脚本事件都可以……小白真的是弄不明白了……
作者: guoxiaomi    时间: 2017-5-9 17:58
看我签名中的《战斗调用公共事件》
作者: 【蛋塔】    时间: 2017-5-12 18:42
现有的吸血脚本:
RUBY 代码复制
  1. #==============================================================================
  2. # - 普通攻击简易吸血 -
  3. # 只有学会特定技能的角色或敌人才可以吸血;
  4. # 敌人要设置发动特技的条件,一个永远不被打开的开关;
  5. # 为了方便起见,技能id越大视为吸血效果越好。
  6. #==============================================================================
  7. module Battler_XiXue
  8.   Attack_Setup = {}
  9.   #----------------------------------------------------------------------------
  10.   # Attack_Setup[技能id] = [回复率, 触发概率, 分散度]
  11.   #----------------------------------------------------------------------------
  12.   Attack_Setup[113] = [20, 100, 1]
  13.   Attack_Setup[114] = [30, 100, 1]
  14. end
  15. #==============================================================================
  16. # - Game_Battler
  17. #==============================================================================
  18. class Game_Battler
  19.   #----------------------------------------------------------------------------
  20.   # 应用普通攻击效果
  21.   #----------------------------------------------------------------------------
  22.   alias :attack_effect_xixue_old :attack_effect
  23.   def attack_effect(attacker)
  24.     attack_effect_xixue_old(attacker)
  25.     #--------------------------------------------------------------------------
  26.     # 吸血判断
  27.     #--------------------------------------------------------------------------
  28.     if attacker.is_a?(Game_Actor)
  29.       jj = attacker.skills & Battler_XiXue::Attack_Setup.keys
  30.     else
  31.       s = []
  32.       for i in $data_enemies[attacker.id].actions
  33.         s << i.skill_id
  34.       end
  35.       jj = s & Battler_XiXue::Attack_Setup.keys
  36.     end
  37.     #--------------------------------------------------------------------------
  38.     # 吸血效果
  39.     #--------------------------------------------------------------------------
  40.     if jj.size > 0
  41.       d = Battler_XiXue::Attack_Setup[jj.max]
  42.       if self.damage.is_a?(Numeric) and self.damage > 0 and rand(100) < d[1]
  43.         attacker.damage = 0 - self.damage * d[0] / 100
  44.         d = attacker.damage * d[2] / 100
  45.         d += 1 if d == 0
  46.         f = 0 - d
  47.         e = 0 - f
  48.         v = [*e..f]
  49.         attacker.damage += v[rand(v.size)]
  50.         attacker.hp -= attacker.damage
  51.       end
  52.     end
  53.   end
  54. end
  55. #==============================================================================
  56. # - Scene_Battle 显示吸血效果 默认用
  57. #==============================================================================
  58. class Scene_Battle
  59.   alias :update_phase4_step5_xixue_old :update_phase4_step5
  60.   def update_phase4_step5
  61.     update_phase4_step5_xixue_old
  62.     if @active_battler.damage
  63.       @active_battler.damage_pop = true
  64.     end
  65.   end
  66. end
  67. =begin
  68. #==============================================================================
  69. # - Scene_Battle 显示吸血效果 真移位用
  70. #==============================================================================
  71. class Scene_Battle
  72.   alias :update_phase4_step4_xixue_old :update_phase4_step4
  73.   def update_phase4_step4
  74.     if @active_battler.damage
  75.       @active_battler.damage_pop = true
  76.     end
  77.     update_phase4_step4_xixue_old
  78.   end
  79. end
  80. #==============================================================================
  81. # - Scene_Battle 显示吸血效果(字体颜色) 真移位追加
  82. #==============================================================================
  83. class Bitmap
  84.   def draw_number(x, y, number,o,picture = RPG::Cache.system("number"))
  85.     w = picture.width / 10
  86.     h = picture.height / 5
  87.     rect = Rect.new(0,0,w,h)
  88.     if number.is_a?(Numeric)
  89.       rect.set(0,h*2,w,h) if number < 0
  90.       number = number.abs
  91.     end
  92.     number = number.to_s
  93.     array = number.split(//)
  94.     for i in 0...array.size
  95.       array[i] = array[i].to_i
  96.     end
  97.     case o
  98.     when 1
  99.       x += 81 - (array.size * 9)
  100.     when 2
  101.     end
  102.     if number == "Miss"
  103.       self.blt(x,y,picture,Rect.new(0,h*3,picture.width,h))
  104.       return
  105.     end
  106.     for sz in array
  107.       rect.x = sz * w
  108.       self.blt(x,y,picture,rect)
  109.       x += w
  110.     end
  111.   end
  112. end
  113. module RPG
  114.   class Sprite < ::Sprite
  115.     def damage(value, critical)
  116.       dispose_damage
  117.       bitmap = Bitmap.new(160, 48)
  118.       bitmap.font.name = "Arial Black"
  119.       bitmap.font.size = 32
  120.       if value.is_a?(Numeric) and value < 0
  121.         bitmap.font.color.set(176, 255, 144)
  122.       else
  123.         bitmap.font.color.set(255, 255, 255)
  124.       end
  125.       bitmap.draw_number(0, 12, value, 1)
  126.       if critical
  127.         bitmap.font.size = 20
  128.         bitmap.font.color.set(0, 0, 0)
  129.         bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  130.         bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  131.         bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  132.         bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  133.         bitmap.font.color.set(255, 255, 255)
  134.         bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  135.       end
  136.       @_damage_sprite = ::Sprite.new(self.viewport)
  137.       @_damage_sprite.bitmap = bitmap
  138.       @_damage_sprite.ox = 80
  139.       @_damage_sprite.oy = 20
  140.       @_damage_sprite.x = self.x
  141.       @_damage_sprite.y = self.y - self.oy / 2
  142.       @_damage_sprite.z = 3000
  143.       @_damage_duration = 40
  144.     end
  145.   end
  146. end
  147. =end

自行修改 Attack_Setup[技能id] = [回复率, 触发概率, 分散度]

持续回血有点麻烦,但可以实现,楼主请跟着我的步骤修改脚本:

搜索 Game_Battler 3 “应用连续伤害效果” 也可以全局搜索def slip_damage_effect
RUBY 代码复制
  1. def slip_damage_effect
  2.     # 设置伤害
  3.     self.damage = self.maxhp / 10
  4.     # 分散
  5.     if self.damage.abs > 0
  6.       amp = [self.damage.abs * 15 / 100, 1].max
  7.       self.damage += rand(amp+1) + rand(amp+1) - amp
  8.     end
  9.     # HP 的伤害减法运算
  10.     self.hp -= self.damage
  11.     # 过程结束
  12.     return true
  13.   end

改为:
RUBY 代码复制
  1. def slip_damage_effect
  2.     # 设定伤害
  3.     if self.state?(20) # 持续回血的状态
  4.       self.damage = -150#(每回合自动回血量)
  5.     else
  6.       self.damage = self.hp / 10
  7.     end
  8.     # 分散
  9.     if self.damage.abs > 0
  10.       amp = [self.damage.abs * 15 / 100, 1].max
  11.       self.damage += rand(amp+1) + rand(amp+1) - amp
  12.     end
  13.     # HP 的伤害减法运算
  14.     self.hp -= self.damage
  15.     # 过程结束
  16.     return true
  17.   end


还有,该状态必须勾选“连续伤害”,比如你要制作一个能持续回血的技能,那么技能就要附加这个状态才行





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