RMXP脚本解析(十五):Game_Battler(分割定义三)

目录

前言

Game_Battler(分割定义三)代码解析

第一命中与第二命中

计算公式(真)

effective(攻击有效标志)的生效条件

属性修正

对象是Game_Actor类实例的情况

对象是Game_Enemy类实例的情况


前言

本节中超级类Game_Battler面向两个派生类的属性调用增加,有很多地方需要联系Game_Actor与Game_Enemy类共同理解。

Game_Battler(分割定义三)代码解析

#==============================================================================

# ■ Game_Battler (分割定义 3)

#------------------------------------------------------------------------------

#  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的

# 超级类来使用。

#==============================================================================

class Game_Battler

    #--------------------------------------------------------------------------

    # ● 可以使用特技的判定

    #     skill_id : 特技 ID

    #--------------------------------------------------------------------------

    def skill_can_use?(skill_id)

      # SP 不足的情况下不能使用

      if $data_skills[skill_id].sp_cost > self.sp

        return false

      end

      # 战斗不能的情况下不能使用

      if dead?

        return false

      end

      # 沉默状态的情况下、物理特技以外的特技不能使用

      if $data_skills[skill_id].atk_f == 0 and self.restriction == 1

        return false

      end

      # 获取可以使用的时机

      occasion = $data_skills[skill_id].occasion ##RPG::Skill.occasion 返回可以使用的情况

      # 战斗中的情况下

      if $game_temp.in_battle ##Game_Temp.inbattle 返回是否在战斗中

        # [平时] 或者是 [战斗中] 可以使用

        return (occasion == 0 or occasion == 1)

      # 不是战斗中的情况下

      else

        # [平时] 或者是 [菜单中] 可以使用

        return (occasion == 0 or occasion == 2)

      end

    end

    #--------------------------------------------------------------------------

    # ● 应用通常攻击效果

    #     attacker : 攻击者 (battler)

    #--------------------------------------------------------------------------

    def attack_effect(attacker)

      # 清除会心一击标志

      self.critical = false

      # 第一命中判定

      hit_result = (rand(100) < attacker.hit) ##当rand(100)小于攻击者的命中率时返回真

      # 命中的情况下

      if hit_result == true

        # 计算基本伤害

        atk = [attacker.atk - self.pdef / 2, 0].max 

        self.damage = atk * (20 + attacker.str) / 20 ##基本伤害公式为(攻击-物防/2)*(20+力量)

        # 属性修正

        self.damage *= elements_correct(attacker.element_set) ##根据攻击者携带的攻击属性,计算出角色的属性修正

        self.damage /= 100 ##可以计算出属性为A,B,C,D,E所带来的的属性修正分别为2,1.5,1,0.5,0,-1

        # 伤害符号正确的情况下

        if self.damage > 0

          # 会心一击修正

          if rand(100) < 4 * attacker.dex / self.agi ##攻击者的灵巧/己方的速度>随机数时,造成会心一击(暴击)

            self.damage *= 2 ##会心一击造成的伤害*2

            self.critical = true

          end

          # 防御修正

          if self.guarding? ##如果此时角色在防御,则伤害/2

            self.damage /= 2

          end

        end

        # 分散 ##伤害的浮动

        if self.damage.abs > 0 ##伤害大于0

          amp = [self.damage.abs * 15 / 100, 1].max 

          self.damage += rand(amp+1) + rand(amp+1) - amp ##伤害在-0.15damage~0.15damage+2浮动

        end

        # 第二命中判定 ##第二命中在伤害计算完毕之后判定,并且于伤害的正负有关

        eva = 8 * self.agi / attacker.dex + self.eva ##自身的速度*8/攻击者的灵巧+自身的回避修正

        hit = self.damage < 0 ? 100 : 100 - eva ##命中率在伤害小于0时为一百,其余情况为100-计算出的回避修正

        hit = self.cant_evade? ? 100 : hit ##如果无法回避,命中率为100

        hit_result = (rand(100) < hit)

      end

      # 命中的情况下

      if hit_result == true

        # 状态冲击解除

        remove_states_shock

        # HP 的伤害计算

        self.hp -= self.damage

        # 状态变化

        @state_changed = false

        states_plus(attacker.plus_state_set)

        states_minus(attacker.minus_state_set)

      # Miss 的情况下

      else

        # 伤害设置为 "Miss"

        self.damage = "Miss"

        # 清除会心一击标志

        self.critical = false

      end

      # 过程结束

      return true

    end

    #--------------------------------------------------------------------------

    # ● 应用特技效果

    #     user  : 特技的使用者 (battler)

    #     skill : 特技

    #--------------------------------------------------------------------------

    def skill_effect(user, skill)

      # 清除会心一击标志

      self.critical = false

      # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、

      # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下

      if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

         ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

        # 过程结束

        return false

      end

      # 清除有效标志

      effective = false

      # 公共事件 ID 是有效的情况下,设置为有效标志

      effective |= skill.common_event_id > 0 ##有些特技可以调用公共事件,参考口袋妖怪绿叶里的居合斩

      # 第一命中判定

      hit = skill.hit

      if skill.atk_f > 0 ##如果这个特技是带有伤害的

        hit *= user.hit / 100 

      end

      hit_result = (rand(100) < hit)

      # 不确定的特技的情况下设置为有效标志

      effective |= hit < 100 

      # 命中的情况下

      if hit_result == true

        # 计算威力

        power = skill.power + user.atk * skill.atk_f / 100 ##威力=特技威力+使用者攻击*特技攻击/100

        if power > 0

          power -= self.pdef * skill.pdef_f / 200 

          power -= self.mdef * skill.mdef_f / 200

          power = [power, 0].max ##最终威力=特技威力+使用者攻击*特技攻击/100-(己方物防*特技物防+己方法防*特技法防)/200

        end

        # 计算倍率

        rate = 20 ##倍率=使用者的其他四个属性与特技的对应_f属性乘积/100的和

        rate += (user.str * skill.str_f / 100)

        rate += (user.dex * skill.dex_f / 100)

        rate += (user.agi * skill.agi_f / 100)

        rate += (user.int * skill.int_f / 100)

        # 计算基本伤害

        self.damage = power * rate / 20 ##伤害值等于威力*倍率/20

        # 属性修正

        self.damage *= elements_correct(skill.element_set) ##修正和普攻修正一样

        self.damage /= 100

        # 伤害符号正确的情况下

        if self.damage > 0

          # 防御修正

          if self.guarding?

            self.damage /= 2

          end

        end

        # 分散

        if skill.variance > 0 and self.damage.abs > 0

          amp = [self.damage.abs * skill.variance / 100, 1].max

          self.damage += rand(amp+1) + rand(amp+1) - amp

        end ##只有伤害值大于0的时候才计算分散

        # 第二命中判定

        eva = 8 * self.agi / user.dex + self.eva

        hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100

        hit = self.cant_evade? ? 100 : hit ##如果无法回避,命中率就是100

        hit_result = (rand(100) < hit)

        # 不确定的特技的情况下设置为有效标志

        effective |= hit < 100

      end

      # 命中的情况下

      if hit_result == true

        # 威力 0 以外的物理攻击的情况下

        if skill.power != 0 and skill.atk_f > 0 

          # 状态冲击解除

          remove_states_shock ##如果这个特技是带有物理攻击的,进行解除状态的判定

          # 设置有效标志

          effective = true

        end

        # HP 的伤害减法运算

        last_hp = self.hp

        self.hp -= self.damage

        effective |= self.hp != last_hp ##如果做完了hp伤害加减法hp没有变化,那么这次攻击可能无效

        # 状态变化

        @state_changed = false

        effective |= states_plus(skill.plus_state_set)

        effective |= states_minus(skill.minus_state_set) ##状态但凡有变化,这次攻击就有效

        # 威力为 0 的场合

        if skill.power == 0

          # 伤害设置为空的字串

          self.damage = ""

          # 状态没有变化的情况下

          unless @state_changed

            # 伤害设置为 "Miss"

            self.damage = "Miss" ##Miss只发生在没有伤害且没有状态变化的情况,比如“毒”特技不会带Miss,尽管它没有伤害

          end

        end

      # Miss 的情况下

      else

        # 伤害设置为 "Miss"

        self.damage = "Miss"

      end

      # 不在战斗中的情况下

      unless $game_temp.in_battle

        # 伤害设置为 nil

        self.damage = nil

      end

      # 过程结束

      return effective

    end

    #--------------------------------------------------------------------------

    # ● 应用物品效果

    #     item : 物品

    #--------------------------------------------------------------------------

    def item_effect(item)

      # 清除会心一击标志

      self.critical = false

      # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、

      # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下

      if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or

         ((item.scope == 5 or item.scope == 6) and self.hp >= 1)

        # 过程结束

        return false

      end

      # 清除有效标志

      effective = false

      # 公共事件 ID 是有效的情况下,设置为有效标志

      effective |= item.common_event_id > 0 ##物品也可以调用公共事件

      # 命中判定

      hit_result = (rand(100) < item.hit) 

      # 不确定的特技的情况下设置为有效标志

      effective |= item.hit < 100

      # 命中的情况

      if hit_result == true

        # 计算回复量

        recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp 

        recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp

        if recover_hp < 0 ##如果此物品扣减体力(带来伤害)

          recover_hp += self.pdef * item.pdef_f / 20

          recover_hp += self.mdef * item.mdef_f / 20

          recover_hp = [recover_hp, 0].min ##会根据抗性增减伤害值

        end

        # 属性修正

        recover_hp *= elements_correct(item.element_set)

        recover_hp /= 100

        recover_sp *= elements_correct(item.element_set)

        recover_sp /= 100

        # 分散

        if item.variance > 0 and recover_hp.abs > 0

          amp = [recover_hp.abs * item.variance / 100, 1].max

          recover_hp += rand(amp+1) + rand(amp+1) - amp

        end

        if item.variance > 0 and recover_sp.abs > 0

          amp = [recover_sp.abs * item.variance / 100, 1].max

          recover_sp += rand(amp+1) + rand(amp+1) - amp

        end

        # 回复量符号为负的情况下

        if recover_hp < 0

          # 防御修正

          if self.guarding?

            recover_hp /= 2

          end ##脑海中瞬间出现反派把???丢到正在防御的主角身上的场景,简直有点sjb

        end

        # HP 回复量符号的反转、设置伤害值

        self.damage = -recover_hp

        # HP 以及 SP 的回复

        last_hp = self.hp

        last_sp = self.sp

        self.hp += recover_hp

        self.sp += recover_sp

        effective |= self.hp != last_hp

        effective |= self.sp != last_sp

        # 状态变化

        @state_changed = false

        effective |= states_plus(item.plus_state_set)

        effective |= states_minus(item.minus_state_set)

        # 能力上升值有效的情况下

        if item.parameter_type > 0 and item.parameter_points != 0 ##也就是魔力之种那些能永久提升能力值的物品

          # 能力值的分支

          case item.parameter_type

          when 1  # MaxHP

            @maxhp_plus += item.parameter_points

          when 2  # MaxSP

            @maxsp_plus += item.parameter_points

          when 3  # 力量

            @str_plus += item.parameter_points

          when 4  # 灵巧

            @dex_plus += item.parameter_points

          when 5  # 速度

            @agi_plus += item.parameter_points

          when 6  # 魔力

            @int_plus += item.parameter_points

          end

          # 设置有效标志

          effective = true

        end

        # HP 回复率与回复量为 0 的情况下

        if item.recover_hp_rate == 0 and item.recover_hp == 0

          # 设置伤害为空的字符串

          self.damage = ""

          # SP 回复率与回复量为 0、能力上升值无效的情况下

          if item.recover_sp_rate == 0 and item.recover_sp == 0 and

             (item.parameter_type == 0 or item.parameter_points == 0)

            # 状态没有变化的情况下

            unless @state_changed

              # 伤害设置为 "Miss"

              self.damage = "Miss"

            end

          end

        end

      # Miss 的情况下

      else

        # 伤害设置为 "Miss"

        self.damage = "Miss"

      end

      # 不在战斗中的情况下

      unless $game_temp.in_battle

        # 伤害设置为 nil

        self.damage = nil

      end

      # 过程结束

      return effective

    end

    #--------------------------------------------------------------------------

    # ● 应用连续伤害效果

    #--------------------------------------------------------------------------

    def slip_damage_effect ##毒状态就是一种连续伤害状态

      # 设置伤害

      self.damage = self.maxhp / 10 ##连续伤害的基础伤害为最高hp的/10

      # 分散

      if self.damage.abs > 0

        amp = [self.damage.abs * 15 / 100, 1].max

        self.damage += rand(amp+1) + rand(amp+1) - amp

      end

      # HP 的伤害减法运算

      self.hp -= self.damage

      # 过程结束

      return true

    end

    #--------------------------------------------------------------------------

    # ● 属性修正计算

    #     element_set : 属性

    #--------------------------------------------------------------------------

    def elements_correct(element_set) ##element_set为Battler携带的属性的数组,没有程度轻重

      # 无属性的情况

      if element_set == []

        # 返回 100

        return 100

      end

      # 在被赋予的属性中返回最弱的

      # ※过程 element_rate 是、本类以及继承的 Game_Actor

      #   和 Game_Enemy 类的定义

      weakest = -100

      for i in element_set

        weakest = [weakest, self.element_rate(i)].max ##element_rate根据被攻击者对各个属性的抗性计算出最终的修正值

      end

      return weakest

    end

  end

第一命中与第二命中

RMXP对于角色发起的进攻一共会计算两次命中率,即为第一命中与第二命中。其中,第一命中在伤害数字结算之前计算,第二命中在伤害数字结算之后计算,并且第二命中的值与伤害数字的符号有关。

计算公式(真)

无法抵抗等情况另算。

第一命中:攻击者的命中率>随机数1…100?True:False

第二命中(伤害符号为+):自身的速度*8/攻击者的灵巧+自身的回避修正>随机数1…100

第二命中(伤害符号为-):True

也就是说,游戏中治疗等技能带来增益的效果会被技能作用者(受到技能者)的灵巧和回避修正影响。

effective(攻击有效标志)的生效条件

-特技/物品的公共事件id有效。

-行动的伤害不为0

-特技命中且威力不为0并带有物理攻击

-行动导致状态有变化

-使用物品后状态/属性有变化

属性修正

属性修正是RMXP对于角色伤害结算带有的附加系数,它的计算依赖于角色的属性有效度与攻击者所携带的属性。

每个角色对于每个属性都有一个属性有效度等级,等级的范围是A…F。与此对应的修正系数为[200,150,100,50,0,-100]。每个角色的攻击(普通攻击和特技)与物品都可能带有零个或一个或多个属性。

当攻击者发出的攻击(使用的特技)或者使用在对象身上的物品带有多个属性时,属性修正的值为其中计算结果最低的属性的修正值,属性修正的最低值不超过-100。

属性修正以修正系数/100的值作为乘积附加到伤害上。

对象是Game_Actor类实例的情况

对于Game_Actor类实例也就是玩家所操控的角色,属性修正需要考虑到角色的职业、防具、武器和一些带有属性防御的状态。

Game_Actor类实例对单个属性的修正计算公式:本属性的修正系数/2^(角色携带的能防御本属性的防具数量+角色拥有的能防御本属性的状态数量)

对象是Game_Enemy类实例的情况

对于Game_Enemy类实例也就是敌人,属性修正只需要考虑敌人的状态。

Game_Enemy类实例对单个属性的修正计算公式:本属性的修正系数/2^(敌人拥有的能防御本属性的状态数量)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值