设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1625|回复: 0
打印 上一主题 下一主题

[已经过期] HP护盾脚本和自发技能脚本的冲突

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
帖子
813

开拓者

跳转到指定楼层
1
发表于 2016-3-22 23:57:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 jianyulei 于 2016-3-22 23:59 编辑

当HP护盾存在的情况下受到攻击,同时自发技能的触发条件和伤害相关的话就会报错。自己不知道该怎么办,希望有好心人能帮我改改脚本。

RUBY 代码复制
  1. #==============================================================================
  2. # +++ 角色生命护盾 +++
  3. #==============================================================================
  4. # 作者 By 三途亚梦
  5. #  -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。
  6. #==============================================================================
  7. # 本脚本的作用是给玩家人物、敌人添加一个新的能力值“生命护盾”,
  8. # 生命护盾会吸收该角色受到的来自技能造成的体力伤害。
  9. #==============================================================================
  10. #
  11. # ★再次强调,生命护盾仅仅吸收来自“技能”造成的体力伤害!
  12. #
  13. # ★人物的生命护盾是amuhsp,
  14. # 可以通过$game_actors[1].amuhsp之类的方式在事件中改变它的数值。
  15. #
  16. # ★HspClear = true 时,人物的生命护盾将在战斗结束时清零。
  17. # 如果不想清零请将 true改为false
  18. #
  19. # ★HspNoAddition = true 时,
  20. # 生命护盾的恢复将不享受恢复效果、物理及魔法伤害比率的加成,
  21. # 但是会对 make_damage_value 的方法做出改变,会降低本脚本的兼容性。
  22. #
  23. # 设定部分所有文字信息的描述方法修改时请保留“”引号。
  24. #
  25. # ★将技能设置成体力值恢复,并在技能备注栏备注“[护盾恢复]”,
  26. # 那么这个技能将变成增加目标角色的生命护盾值
  27. # ★备注的时候不需要写入“”引号
  28. #
  29. # 角色的生命护盾没有上限,下限为0
  30. #
  31. # 如果需要设置一个技能为角色体力值的10%,又不想令护盾无限的加下去
  32. # 技能公式请参照这个写法:
  33. # b.hp * 0.1 - b.amuhsp [护盾恢复]
  34. #
  35. #==============================================================================
  36. # ★ 设定部分 ★
  37. #==============================================================================
  38. module Amu
  39.   module Hsp
  40.  
  41.   HspClear = true  #是否在战斗结束时清除掉玩家剩余的生命护盾
  42.  
  43.   HspNoAddition = false #是否采用本脚本的计算伤害的方法
  44.  
  45.   HspName = "生命护盾"  #生命护盾的名字
  46.  
  47.   HspABonus = "%s的%s剩余%s点!"  #玩家人物的生命护盾损伤后显示剩余值的文字
  48.  
  49.   HspEBonus = "%s的%s还剩%s点!"  #敌人的生命护盾损伤后显示剩余值的文字
  50.  
  51.   HspADamage = "%s的%s受到%s点伤害!"  #玩家人物的生命护盾受到伤害的文字
  52.  
  53.   HspEDamage = "%s的%s受到%s点伤害!"  #敌人的生命护盾受到伤害的文字
  54.  
  55.   HspARecovery  = "%s获得了一个%s点的%s保护!" #玩家的生命护盾得到提高的文字
  56.  
  57.   HspERecovery  = "%s接受了一个%s点的%s保护!" #敌人的生命护盾得到提高的文字
  58.  
  59.   HspADestory  = "%s的%s受到%s点伤害而遭到击破!" #玩家的生命护盾被击破时的文字
  60.  
  61.   HspEDestroy  = "%s的%s受到%s点伤害而被击破了!" #敌人的生命护盾被击破时的文字
  62.  
  63.   def self.play_actor_amuhspdamage  # 玩家的生命护盾受到伤害的音效
  64.     Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  65.   end
  66.  
  67.   def self.play_enemy_amuhspdamage   # 敌人的生命护盾受到伤害的音效
  68.     Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  69.   end
  70.  
  71.   def self.play_amuhsp_destory   # 生命护盾被击破时的音效
  72.     Audio.se_play("Audio/SE/Crash.ogg", 60, 90)
  73.   end
  74.  
  75.   end
  76. end
  77.  
  78. class Game_ActionResult
  79.   #--------------------------------------------------------------------------
  80.   # ● 定义实例变量
  81.   #--------------------------------------------------------------------------
  82.   attr_accessor :amuhsp_damage                # 生命护盾 伤害
  83.   #--------------------------------------------------------------------------
  84.   # ● 清除伤害值`
  85.   #--------------------------------------------------------------------------
  86.   alias amu_20141125_clear_damage_values clear_damage_values
  87.   def clear_damage_values
  88.     amu_20141125_clear_damage_values
  89.      @amuhsp_damage = 0
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 生成伤害
  93.   #--------------------------------------------------------------------------
  94.   alias amu_20141125_make_damage make_damage
  95.   def make_damage(value, item)
  96.     amu_20141125_make_damage(value, item)
  97.     @amuhsp_damage = value if item.damage.to_hp? && @battler.amuhsp > 0 && value > 0
  98.     @amuhsp_damage = value if item.damage.to_hp? && item.damage.recover? && item.note.include?("[护盾恢复]")
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 获取具有生命护盾时 HP 伤害的文字
  102.   #--------------------------------------------------------------------------
  103.   def hp_damage_text
  104.     if @hp_drain > 0
  105.       fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  106.       sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  107.     elsif @hp_damage > 0
  108.       fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
  109.       sprintf(fmt, @battler.name, @hp_damage)
  110.     elsif @hp_damage < 0
  111.       fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  112.       sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  113.     elsif @hp_damage = 0 && @battler.amuhsp > 0
  114.       fmt = @battler.actor? ? Amu::Hsp::HspABonus : Amu::Hsp::HspEBonus
  115.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @battler.amuhsp)
  116.     else
  117.       fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  118.       sprintf(fmt, @battler.name)
  119.     end
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 获取 生命护盾 伤害的文字
  123.   #--------------------------------------------------------------------------
  124.   def amuhsp_damage_text
  125.     if @amuhsp_damage > 0 && @battler.amuhsp > 0
  126.       fmt = @battler.actor? ? Amu::Hsp::HspADamage : Amu::Hsp::HspEDamage
  127.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
  128.     elsif @amuhsp_damage > 0 && @battler.amuhsp == 0
  129.       fmt = @battler.actor? ? Amu::Hsp::HspADestory : Amu::Hsp::HspEDestroy
  130.       sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
  131.     elsif @amuhsp_damage < 0
  132.       fmt = @battler.actor? ? Amu::Hsp::HspARecovery : Amu::Hsp::HspERecovery
  133.       sprintf(fmt, @battler.name, -@amuhsp_damage, Amu::Hsp::HspName)
  134.     else
  135.       ""
  136.     end
  137.   end
  138. end
  139.  
  140.  
  141. class Game_BattlerBase
  142.   attr_reader   :amuhsp                       # 生命护盾
  143.   #--------------------------------------------------------------------------
  144.   # ● 初始化对象
  145.   #--------------------------------------------------------------------------
  146.   alias amu_20141125_initialize initialize
  147.   def initialize
  148.     amu_20141125_initialize
  149.     @amuhsp = 0
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 更改 HSP
  153.   #--------------------------------------------------------------------------
  154.   def amuhsp=(amuhsp)
  155.     @amuhsp = amuhsp
  156.     refresh
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 刷新
  160.   #--------------------------------------------------------------------------
  161.   alias amu_20141125_refresh refresh
  162.   def refresh
  163.     amu_20141125_refresh
  164.     @amuhsp = [@amuhsp, 0].max
  165.   end
  166. end
  167.  
  168. class Game_Battler < Game_BattlerBase
  169.   #--------------------------------------------------------------------------
  170.   # ● 计算伤害
  171.   #--------------------------------------------------------------------------
  172.   if Amu::Hsp::HspNoAddition == true
  173.     def make_damage_value(user, item)
  174.       value = item.damage.eval(user, self, $game_variables)
  175.       value *= item_element_rate(user, item)
  176.       value *= pdr if item.physical? && !make_amuhsp?(item)
  177.       value *= mdr if item.magical? && !make_amuhsp?(item)
  178.       value *= rec if item.damage.recover? && !make_amuhsp?(item)
  179.       value = apply_critical(value) if @result.critical
  180.       value = apply_variance(value, item.damage.variance)
  181.       value = apply_guard(value)
  182.       if make_amuhsp?(item)
  183.         def actor_amuhsp?
  184.           return true
  185.         end
  186.       end
  187.       @result.make_damage(value.to_i, item)
  188.     end
  189.   else
  190.     alias amu_20141125_make_damage_value make_damage_value
  191.     def make_damage_value(user, item)
  192.       amu_20141125_make_damage_value(user, item)
  193.       if make_amuhsp?(item)
  194.         def actor_amuhsp?
  195.           return true
  196.         end
  197.       end
  198.     end
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 处理伤害
  202.   #    调用前需要设置好
  203.   #    @result.hp_damage   @result.mp_damage
  204.   #    @result.hp_drain    @result.mp_drain
  205.   #--------------------------------------------------------------------------
  206.   def execute_damage(user)
  207.     on_damage(@result.hp_damage) if @result.hp_damage > 0
  208.     if self.amuhsp > 0 && @result.hp_damage > 0
  209.       eamuhsp = self.amuhsp
  210.       self.amuhsp -= @result.hp_damage
  211.       self.amuhsp <= 0 ? @result.hp_damage -= eamuhsp : @result.hp_damage = 0
  212.     end
  213.     if actor_amuhsp?
  214.       self.amuhsp -= @result.hp_damage
  215.       @result.hp_damage = 0
  216.       def actor_amuhsp?
  217.         return false
  218.       end
  219.     else
  220.       self.hp -= @result.hp_damage
  221.     end
  222.     self.mp -= @result.mp_damage
  223.     user.hp += @result.hp_drain
  224.     user.mp += @result.mp_drain
  225.   end
  226.   #--------------------------------------------------------------------------
  227.   # ● 判断技能是否用来增加生命护盾
  228.   #--------------------------------------------------------------------------
  229.   def make_amuhsp?(item)
  230.     return false unless item.is_a?(RPG::Skill)
  231.     return item.note.include?("[护盾恢复]")
  232.   end
  233.   def actor_amuhsp?
  234.     return false
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # ● 清除 生命护盾
  238.   #--------------------------------------------------------------------------
  239.   def clear_amuhsp
  240.     self.amuhsp = 0
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 战斗结束处理
  244.   #--------------------------------------------------------------------------
  245.   alias amu_20141125_on_battle_end on_battle_end
  246.   def on_battle_end
  247.     amu_20141125_on_battle_end
  248.     clear_amuhsp if Amu::Hsp::HspClear == true
  249.   end
  250. end
  251.  
  252. class Game_Actor < Game_Battler
  253.   #--------------------------------------------------------------------------
  254.   # ● 设置具有生命护盾时玩家被击的效果
  255.   #--------------------------------------------------------------------------
  256.   def perform_hspdamage_effect
  257.     $game_troop.screen.start_shake(5, 5, 10)
  258.     @sprite_effect_type = :blink
  259.     Amu::Hsp.play_actor_amuhspdamage
  260.   end
  261. end
  262.  
  263. class Game_Enemy < Game_Battler
  264.   #--------------------------------------------------------------------------
  265.   # ● 设置具有生命护盾时敌人被击的效果
  266.   #--------------------------------------------------------------------------
  267.   def perform_hspdamage_effect
  268.     $game_troop.screen.start_shake(5, 5, 10)
  269.     @sprite_effect_type = :blink
  270.     Amu::Hsp.play_enemy_amuhspdamage
  271.   end
  272. end
  273.  
  274. class Window_BattleLog < Window_Selectable
  275.   #--------------------------------------------------------------------------
  276.   # ● 显示伤害
  277.   #--------------------------------------------------------------------------
  278.   def display_damage(target, item)
  279.     if target.result.missed
  280.       display_miss(target, item)
  281.     elsif target.result.evaded
  282.       display_evasion(target, item)
  283.     else
  284.       display_amuhsp_damage(target, item)
  285.       display_hp_damage(target, item)
  286.       display_mp_damage(target, item)
  287.       display_tp_damage(target, item)
  288.     end
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # ● 显示 生命护盾 伤害
  292.   #--------------------------------------------------------------------------
  293.   def display_amuhsp_damage(target, item)
  294.     return if target.dead? || target.result.amuhsp_damage == 0
  295.     if target.result.amuhsp_damage > 0 && target.amuhsp > 0 && target.result.hp_drain == 0
  296.       target.perform_hspdamage_effect
  297.     end
  298.     Amu::Hsp.play_amuhsp_destory if target.result.amuhsp_damage > 0 && target.amuhsp == 0
  299.     Sound.play_recovery if target.result.amuhsp_damage < 0
  300.     add_text(target.result.amuhsp_damage_text)
  301.     wait
  302.   end
  303. end


RUBY 代码复制
  1. module AutoSkill; Ask, Msk = {}, {}
  2.  
  3.  
  4. Ask[50] = {'范围' => 'user','条件' => 'state?(58) && !user.actor? && item.physical? && dmg(:hp) > $game_actors[2].hp*0.08 && $game_actors[2].level >=4','几率' => '100','时机' => '受伤后'}
  5.  
  6.  
  7.  
  8. #------------------------------------------------------------------------------
  9. end # Do not remove
  10.  
  11. #==============================================================================
  12. #
  13. # 自发技能 by Silentever(夜光云)
  14. #    (自动发动技能)
  15. #
  16. #    2015-10-28 更新:修复BUG,最终版
  17. #    2015-10-09 更新:修复BUG,写法优化,追加无视行动限制的自发技能,追加简化定义
  18. #                     删除:自发技能使用成功分歧判定
  19. #    2015-09-19 更新:追加:last_act定义,自发技能使用成功分歧判定
  20. #    2015-09-12 更新:修复BUG,支持让敌人也使用自发技能,追加地图自发技能,追加对象选择机制
  21. #    2015-08-17 发布
  22. #
  23. #==============================================================================
  24. # ▼ 设定
  25. #    填入【 Ask[ID] = { '参数名' => '算法' (用','分开) } 】
  26. #
  27. #  ID.......技能ID。对指定的技能无任何要求(可以发动任何技能)。
  28. #
  29. #  参数列表:
  30. #    几率...发动几率(0~100),不填写时为默认100。
  31. #           只要是返回数字,可以用变量计算;超出范围不会出错请安心。
  32. #    条件...发动先置条件(返回true/false),不填写时为默认true(无先置条件)。
  33. #    时机...限定发动的时机,详细在下面1。
  34. #    范围...设置方法请看下面2。
  35. #    强制...设定为true的场合,技能将会无视此脚本设置的条件与学会条件以外的,
  36. #           任何技能的常规发动条件(MP不足,行动不能等)。
  37. #
  38. #  例子:
  39. #    Ask[1] = {}                         => 使用1号技能(没有任何参数用空'{}')
  40. #    Ask[2] = { '几率' => '50' }         => 50%几率使用2号技能
  41. #    Ask[3] = { '条件' => 'luk > 50' }   => 幸运高于50(不包括等于)使用3号技能
  42. #    Ask[4] = { '条件' => 'state?(2)',
  43. #               '几率' => '100 - @state_turns[2] * 10'}
  44. #        => 持有2号状态的情况下,以(100-2号状态剩余回合数*10)的几率发动
  45. #
  46. #  填写时请把所有的参数跟其内容用 '' 或 "" 号包封。
  47. #  【注意】使用自发技能的第一个先置条件是学会(不论升级或特性添加),
  48. #  有必要让想让使用该技能的角色学会;另外敌人必须使用特性添加技能才能使用
  49. #  技能的使用会受到基础使用条件的限制(MP不足,使用场合不符,角色无法行动等)。
  50. #   
  51. #  补充:
  52. #  1) 重复添加相同的ID技能,【没办法】重复使用,写在后面的内容会覆盖先前的内容。
  53. #  2) 同一个时机中有复数自发技能行动角色时,会根据行动速度进行排列。
  54. #  3) 只能在战斗中使用,关于地图技能请看下面。
  55. #  4) 填写时注意使用全部半角的标点符号。
  56. #
  57. #
  58. #  ■【时机】(2015-10-09 更新中自发技能从发动时机分离)
  59. #  在参数中加入【 '时机' => '战斗开始, 战斗结束' 】
  60. #  可以把自发技能的使用锁定在后面填入的时机中。以上例子是把时机限定在了战斗开始跟结束。
  61. #  因为不填写时会每个时机都使用一次,因此【强烈】建议填写。
  62. #
  63. #  时机与以往不变:
  64. #    战斗开始,战斗结束  => 敌人出现时,胜利或逃跑后
  65. #    回合开始,回合结束  => 全部选择好行动后,回合正式开始的时候,以及回合结束
  66. #    行动前,行动后      => 自己进行主要行动(使用技能/道具)的前后
  67. #    受伤前,受伤后      => 自己成为技能/道具的对象,效果处理前/后
  68. #  直接把以上部分直接输入,用 , 分开。
  69. #
  70. #
  71. #  ■【范围】
  72. #  因为这部分比较复杂,慎入。注意在最后全部都用 '' 或 "" 号包封。
  73. #  不填写时,会自动选择对象(遵守原使用范围)。
  74. #  设置对象群体时,将会无视技能本身的使用范围。
  75. #
  76. #  设置时,可以放3部分,用“,”互相分开。其中1号是必须放在最前,其余可以随意排序。
  77. #  1) 范围的对象群体。用“+”追加,“-”排除。此外必须在每个运算符号前后留个空格。
  78. #     self是使用者自己。last是最后一个对象。重复加入会复数处理效果。
  79. #     最后一个对象指最后一次输入指令时选择的对象索引(每个角色独立)。
  80. #  2) 定成“max或min : 比较数值 : 采取数量”,不填写数量时当作1处理。
  81. #     会从范围中选择该数量的,持有最高/最低指定数值的单位。
  82. #  3) 用代码进行计算返回true/false,从范围选择所有符合条件的单位。
  83. #     计算代码可以使用跟伤害公式一样的变量:a=使用者,b=单独对象,v=游戏变量。
  84. #     不存在可选对象时,技能不发动。
  85. #
  86. #  例子:
  87. #  Ask[5] = { '范围' => 'self + last' }
  88. #      => 将目标对象锁定成自身与自身的最后对象
  89. #  Ask[6] = { '范围' => 'party - self, max:hp:2' }
  90. #      => 在玩家队伍成员中,除使用者以外,选择HP最高的2个角色
  91. #  Ask[7] = { '范围' => 'troop, b.state?(10)' }
  92. #      => 从敌群中选择所有持有10号状态的成员
  93. #  Ask[8] = { '范围' => 'allies, b.state?(1), max:mhp' }
  94. #      => 从持有1号状态的同伴中选择HP上限最高的1个成员(敌人使用会选择敌人)
  95. #  Ask[9] = { '范围' => 'party + self, min:hp:3, b.hp > 0' }
  96. #      => 从HP高于0的玩家队伍以及自身中选取3个HP最低的成员。
  97. #         注意角色使用的场合会把自身计算2此,因此会占有2个对象,并受到2次技能效果。
  98. #
  99. #
  100. #  ■【仅限伤害处理】
  101. #  仅在伤害处理可以使用user与item。
  102. #  User...攻击使用者的单位(敌人)。在对象组中填入“user”可以指定该单位做对象。
  103. #  Item...攻击单位所使用的技能。
  104. #  此外,受到伤害之后还能调用“dmg(:hp)”等变量获得伤害量,
  105. #
  106. #  例子2:
  107. #  Ask[10] = { '时机' => '受伤前',
  108. #              '范围' => 'user' }
  109. #      => 对攻击单位使用技能10号反击。
  110. #  Ask[11] = { '时机' => '受伤后',
  111. #              '条件' => 'dmg(:hp) >= 20' }
  112. #      => 受到20HP以上的伤害时发动(限伤害后)。
  113. #
  114. #  其他方法(限定在受伤后使用):
  115. #    dmg( )    => 获取伤害量,括号中填入种类“:hp”,“:mp”或“:tp”
  116. #    drn( )    => 获取吸收量,括号中填入“:hp”或“:mp”
  117. #    missed?   => 是否击中(输出true/false)
  118. #    evaded?   => 是否被回避(输出true/false)
  119. #    critical? => 是否暴击成功(输出true/false)
  120. #
  121. #
  122. #  ■【追加定义:party/troop/allies/oppons】
  123. #  为了方便输入简化了队伍与敌群的变量名。
  124. #
  125. #  party    => 获取玩家队伍(数组)
  126. #  party(1) => 获取队伍中首位的角色(角色)
  127. #  troop    => 获取全体敌群(数组)
  128. #  troop(1) => 获取1号敌人(敌人)
  129. #
  130. #  allies    => 获取使用者的同伴,角色的场合玩家队伍,敌人的场合敌群
  131. #  allies(1) => 获取同伴1号
  132. #  oppons    => 获取使用者的对手,角色的场合敌群,敌人的场合玩家队伍
  133. #  oppons(1) => 获取对手1号
  134. #
  135. #
  136. #  ■【追加定义:last_act】
  137. #  获取玩家输入的行动指令,玩家在游戏中输入攻击行动,可以通过此方法获取。
  138. #  注意获取的是行动而不是技能(道具的使用也是行动)。
  139. #  只有重新输入行动后才会更新,因此会保留到下次战斗。
  140. #  因为这个行动不会被执行所以没有修改的意义。
  141. #  具体参考Game_Action。
  142. #
  143. #  方法预览:
  144. #  last_act.attack?     => 是否普通攻击(true/false)
  145. #  last_act.guard?      => 是否防御(true/false)
  146. #
  147. #  last_act.skill?      => 是否技能(true/false)
  148. #  last_act.skill?(id)  => 是否为id号技能(true/false)
  149. #
  150. #  last_act.item?       => 是否道具(true/false)
  151. #  last_act.item?(id)   => 是否为id号道具(true/false)
  152. #
  153. #  last_act.valid?      => 判断角色是否可以执行该行动(true/false)
  154. #  last_act.item        => 获取行动的技能或使用道具(对象物品)
  155. #
  156. #------------------------------------------------------------------------------
  157. #
  158. # ▼ 地图发动的自发技能
  159. #    使用【 Msk[ID] = { '参数名' => '算法' (用','分开) } 】
  160. #    注意参数与战斗用的设置不一定相同。
  161. #
  162. #  频率...发动频率,玩家每行走此数值的步数使用1次。不填入不会发动。
  163. #         默认系统中20步会算作1回合(参考用)。
  164. #  条件...同战斗设置。
  165. #  范围...同战斗设置。注意在地图上不存在$game_troop。
  166. #  显示...是否显示使用消息,填入true会弹出对话框,否则无任何提示。
  167. #
  168. #==============================================================================
  169.  
  170.  
  171.  
  172. #==============================================================================
  173. # ▼ 脚本内容:不可编辑
  174. #==============================================================================
  175. class Game_Battler < Game_BattlerBase
  176.   #--------------------------------------------------------------------------
  177.   include AutoSkill
  178.   Ask.each_value {|s| s.default = ''}
  179.   Msk.each_value {|s| s.default = ''}
  180.  
  181.   # NewMethods: 追加简易定义
  182.   def party(n = nil)
  183.     return $game_party.members unless n
  184.     return $game_party.members[n] end
  185.   def troop(n = nil)
  186.     return $game_troop.members unless n
  187.     return $game_troop.members[n] end
  188.   def allies(n = nil)
  189.     return party(n) if actor?
  190.     return troop(n) if enemy?; end
  191.   def oppons(n = nil)
  192.     return party(n) if enemy?
  193.     return troop(n) if actor?; end
  194.  
  195.   def dmg(type = :hp); eval "@result_log.#{type.to_s}_damage" end
  196.   def drn(type = :hp); eval "@result_log.#{type.to_s}_drain" end
  197.   def missed?;   @result_log.missed end
  198.   def evaded?;   @result_log.evaded end
  199.   def critical?; @result_log.critical end
  200.  
  201.   def user; @attack_user end
  202.   def item; @attack_item end
  203.   def last
  204.     return allies(last_act.target_index) if last_act.item.for_friend?
  205.     return oppons(last_act.target_index) if last_act.item.for_opponent?
  206.   end
  207.  
  208.   # NewMethod: 最后一个主要行动
  209.   def last_act; @last_act; end
  210.   def set_last_action
  211.     @last_act = current_action if !current_action.is_a? Game_AutoAction
  212.   end
  213.   # AliasMethod: 记录战斗结果
  214.   attr_reader :result_log
  215.   def set_result_log
  216.     @result_log = @result.clone end
  217.   # AliasMethod: 初始化
  218.   alias :initialize_ask :initialize
  219.   def initialize; initialize_ask
  220.     @last_act = Game_Action.new(self)
  221.     @result_log = Game_ActionResult.new(self) end
  222.  
  223.   # NewMethod: 自发技能处理
  224.   def proc_auto_skill(timing = nil, user = nil, item = nil)
  225.     return unless SceneManager.scene_is?(Scene_Battle)
  226.     @attack_user, @attack_item = user, item
  227.     Ask.each {|i, v| skill = $data_skills[i]
  228.       next unless skills.include?(skill)
  229.       set_auto_skill(i, v, timing)}
  230.   end
  231.  
  232.   # NewMethod: 自发技能设置
  233.   def set_auto_skill(i, v, t)
  234.     return unless v['时机'].empty? or v['时机'].split(',').map{|s|s.strip}.include?(t)
  235.     return unless v['几率'].empty? or eval(v['几率']).to_i > rand(100)
  236.     return unless v['条件'].empty? or eval(v['条件'])
  237.     action = Game_AutoAction.new(self, eval(v['强制']), i)
  238.     unless make_auto_targets(action, v['范围']).empty?
  239.       @actions.insert(0, action)
  240.       BattleManager.autoskill_users.push(self)
  241.   end end
  242.  
  243.   # NewMethod: 设置行动对象
  244.   def make_auto_targets(action, scope)
  245.     if !scope.empty?; scope = scope.split(',')
  246.       unit = []; scope.shift.split(' ').each_with_index{|s, i|
  247.         @oper = '+' unless @oper; if i % 2 == 1; @oper = s; next end
  248.         unit.push(eval(s)) if @oper['+']
  249.         unit.reject!{|bat| [eval(s)].flatten.include?(bat)} if @oper['-']
  250.         unit.flatten!}; remove_instance_variable :@oper
  251.       if requir = scope.reject{|s| s[/max|min/]}[0]; unit.select!{|member|
  252.         a, b, v = self, member, $game_variables; eval requir}; end
  253.       if prior = scope.find{|s| s[/max|min/]}; prior = prior.split(':').map{|s|s.strip}
  254.         unit = unit.sort_by(&prior[1].to_sym); n = eval(prior[2]) rescue n = 1
  255.         unit = unit.first(n) if prior[0]['min']
  256.         unit = unit.last(n)  if prior[0]['max']
  257.       end end
  258.     return action.auto_targets = unit if unit
  259.     return action.auto_targets = [:rand]
  260.   end
  261.  
  262.   # NewMethod: 地图技能
  263.   def proc_map_skill
  264.     return unless SceneManager.scene_is?(Scene_Map)
  265.     Msk.each {|i, v| skill = $data_skills[i]
  266.       h = {}; v.each {|i, v| h[i] = v.split(',').map{|s| s.strip}}
  267.       next unless skills.include?(skill)
  268.       next unless usable?(skill)
  269.       next unless h['步数'].empty? or $game_party.steps % eval(h['步数']) == 0
  270.       next unless h['条件'].empty? or eval(h['条件'])
  271.       pay_skill_cost(skill)
  272.       item.effects.each {|effect| item_global_effect_apply(effect)} if
  273.         eval(h['消息'])
  274.       make_auto_targets(action, h['范围']).each {|target|
  275.         skill.repeats.times {target.item_apply(self, skill)}}}
  276.   end
  277.   #--------------------------------------------------------------------------
  278. end
  279. #==============================================================================
  280. class Game_Actor < Game_Battler
  281.   #--------------------------------------------------------------------------
  282.   # AliasMethod: 地图画面上回合结束的处理
  283.   alias :turn_end_on_map_ask :turn_end_on_map
  284.   def turn_end_on_map; turn_end_on_map_ask
  285.     proc_map_skill end
  286.   #--------------------------------------------------------------------------
  287. end
  288. #==============================================================================
  289. class Game_Enemy < Game_Battler
  290.   #--------------------------------------------------------------------------
  291.   # NewMethod: 获取技能实例的数组
  292.   def skills
  293.     added_skills.sort.collect {|id| $data_skills[id] }
  294.   end
  295.   #--------------------------------------------------------------------------
  296. end
  297. #==============================================================================
  298. class Game_Action
  299.   #--------------------------------------------------------------------------
  300.   # 判断用定义
  301.   def guard?; item == $data_skills[subject.guard_skill_id] end
  302.   def skill?(id = 0)
  303.     return item == $data_skills[id] if id > 0
  304.     return item.is_a?(RPG::Skill) end
  305.   def item?(id = 0)
  306.     return item == $data_items[id] if id > 0
  307.     return item.is_a?(RPG::Item) end
  308.   #--------------------------------------------------------------------------
  309. end
  310. #==============================================================================
  311. class Game_AutoAction < Game_Action
  312.   #--------------------------------------------------------------------------
  313.   attr_accessor :auto_action
  314.   attr_accessor :auto_targets
  315.  
  316.   # 初始化对象
  317.   def initialize(subject, forcing, skill_id)
  318.     super(subject, forcing)
  319.     set_skill(skill_id) end
  320.  
  321.   # 清除
  322.   def clear; super
  323.     @auto_action = false
  324.     @auto_targets = [] end
  325.  
  326.   # 生成目标数组
  327.   def make_targets
  328.     return super if @auto_targets.include?(:rand)
  329.     return @auto_targets end
  330.  
  331.   # 目标为队友
  332.   def targets_for_friends
  333.     @target_index = rand(subject.friends_unit.members.size) if
  334.       @auto_targets.include?(:rand)
  335.     super end
  336.   #--------------------------------------------------------------------------
  337. end
  338. #==============================================================================
  339. class Scene_Battle < Scene_Base
  340.   #--------------------------------------------------------------------------
  341.   # AliasMethod: 更新画面
  342.   alias :update_ask :update
  343.   def update; update_ask
  344.     BattleManager.terminate unless process_autoskill
  345.   end
  346.  
  347.   # AliasMethod: 开始队伍指令的选择
  348.   alias :start_party_command_selection_ask :start_party_command_selection
  349.   def start_party_command_selection
  350.     return if BattleManager.judge_win_loss
  351.     start_party_command_selection_ask
  352.   end
  353.  
  354.   # AliasMethod: 回合开始
  355.   alias :turn_start_ask :turn_start
  356.   def turn_start; turn_start_ask
  357.     all_battle_members.each {|battler| battler.set_last_action}
  358.     check_auto_skills(all_battle_members, '回合开始')
  359.   end
  360.  
  361.   # AliasMethod: 回合结束
  362.   alias :turn_end_ask :turn_end
  363.   def turn_end
  364.     check_auto_skills(all_battle_members, '回合结束')
  365.     turn_end_ask end
  366.  
  367.   # OverWrite: 处理战斗行动
  368.   def process_action
  369.     return if scene_changing?
  370.     if !@subject || !@subject.current_action
  371.       @subject = BattleManager.next_subject end
  372.     return turn_end unless @subject
  373.     return unless @subject
  374.     check_auto_skills([@subject], '行动前')
  375.     process_action_b
  376.     process_action_end unless @subject.current_action
  377.     check_auto_skills([@subject], '行动后')
  378.   end
  379.  
  380.   # NewMethod: 处理战斗行动
  381.   def process_action_b
  382.     if @subject.current_action
  383.       @subject.current_action.prepare
  384.       if @subject.current_action.valid?
  385.         @status_window.open
  386.         execute_action
  387.       end
  388.       @subject.remove_current_action
  389.     end
  390.   end
  391.  
  392.   # NewMethod: 处理自动技能
  393.   def process_autoskill
  394.     return false if BattleManager.autoskill_users.empty?
  395.     @log_window.wait
  396.     last_subject = @subject if @subject
  397.     @subject = BattleManager.autoskill_users.shift
  398.     @using_auto_skill = true
  399.     process_action_b
  400.     @subject = last_subject if last_subject
  401.     @using_auto_skill = false
  402.     return true
  403.   end
  404.  
  405.   # AliasMethod: 使用技能/物品
  406.   alias :use_item_ask :use_item
  407.   def use_item
  408.     if @using_auto_skill
  409.       use_item_ask
  410.     else; use_item_no_autoskill end
  411.   end
  412.  
  413.   # NewMethod: 使用非自发技能/物品
  414.   def use_item_no_autoskill
  415.     item = @subject.current_action.item
  416.     @log_window.display_use_item(@subject, item)
  417.     @subject.use_item(item)
  418.     refresh_status
  419.     targets = @subject.current_action.make_targets.compact
  420.     show_animation(targets, item.animation_id)
  421.     check_auto_skills(targets, '受伤前', @subject, item)
  422.     targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  423.     check_auto_skills(targets, '受伤后', @subject, item)
  424.   end
  425.  
  426.   # AliasMethod: 应用技能/物品效果
  427.   alias :apply_item_effects_ask :apply_item_effects
  428.   def apply_item_effects(target, item)
  429.     apply_item_effects_ask(target, item)
  430.     target.set_result_log
  431.   end
  432.  
  433.   # NewMethod: 使用自发技能
  434.   def check_auto_skills(subjects = [], *args)
  435.     subjects.each {|subject| subject.proc_auto_skill(*args) if subject}
  436.     while process_autoskill
  437.   end end
  438.   #--------------------------------------------------------------------------
  439. end
  440. #==============================================================================
  441. module BattleManager
  442.   #--------------------------------------------------------------------------
  443.   class << self
  444.     alias :battle_start_ask :battle_start
  445.     alias :on_encounter_ask :on_encounter; end
  446.  
  447.   # AliasMethod: 战斗开始
  448.   def self.battle_start
  449.     @battle_result = nil
  450.     battle_start_ask
  451.     SceneManager.scene.check_auto_skills($game_party.members+$game_troop.members, '战斗开始')
  452.     on_encounter_ask
  453.     if @preemptive
  454.       $game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
  455.     elsif @surprise
  456.       $game_message.add(sprintf(Vocab::Surprise, $game_party.name))
  457.     end
  458.     wait_for_message
  459.   end
  460.  
  461.   # AliasMethod: 遇敌时的处理
  462.   def self.on_encounter; end
  463.  
  464.   # OverWrite: 胜利时的处理
  465.   def self.process_victory
  466.     play_battle_end_me
  467.     replay_bgm_and_bgs
  468.     $game_message.add(sprintf(Vocab::Victory, $game_party.name))
  469.     display_exp
  470.     gain_gold
  471.     gain_drop_items
  472.     gain_exp
  473.     battle_end(0)
  474.     return true
  475.   end
  476.  
  477.   # OverWrite: 中止时的处理
  478.   def self.process_abort
  479.     replay_bgm_and_bgs
  480.     battle_end(1)
  481.     return true
  482.   end
  483.  
  484.   # OverWrite: 全灭时的处理
  485.   def self.process_defeat
  486.     $game_message.add(sprintf(Vocab::Defeat, $game_party.name))
  487.     wait_for_message
  488.     replay_bgm_and_bgs if @can_lose
  489.     battle_end(2)
  490.     return true
  491.   end
  492.  
  493.   # OverWrite: 战斗结束 > 结果(0:胜利 1:撤退 2:全灭)
  494.   def self.battle_end(result)
  495.     @phase = nil
  496.     @battle_result = result
  497.     $game_party.on_battle_end
  498.     $game_troop.on_battle_end
  499.     SceneManager.scene.check_auto_skills($game_party.members, '战斗结束')
  500.   end
  501.  
  502.   # NewMethod: 退出管理器
  503.   def self.terminate
  504.     return unless @battle_result
  505.     revive_battle_members if @battle_result == 2 && @can_lose
  506.     @event_proc.call(@battle_result) if @event_proc
  507.     SceneManager.return
  508.     SceneManager.goto(Scene_Gameover) if @battle_result == 2 && !@can_lose
  509.     SceneManager.exit if $BTEST
  510.   end
  511.  
  512.   # NewMethod: 自发技能行动列表
  513.   def self.autoskill_users
  514.     @autoskill_users ||= []
  515.     @autoskill_users.each {|battler| battler.make_speed }
  516.     @autoskill_users.sort! {|a,b| b.speed - a.speed }
  517.     return @autoskill_users
  518.   end
  519.   #--------------------------------------------------------------------------
  520. end
  521. #==============================================================================
  522. # ▼ END
  523. #==============================================================================

QQ图片20160322235024.png (2.95 KB, 下载次数: 10)

报错提示

报错提示

QQ图片20160322235040.png (8.85 KB, 下载次数: 15)

提示指向的目标

提示指向的目标
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-28 06:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表