Project1

标题: 哪位帮忙把这脚本里的所有伤害公式帮我解释翻译一下?谢 [打印本页]

作者: xj5234140    时间: 2011-5-20 16:38
标题: 哪位帮忙把这脚本里的所有伤害公式帮我解释翻译一下?谢
本帖最后由 传说VS天涯 于 2011-5-21 08:09 编辑
  1. #==============================================================================
  2. # ■ Game_Battler (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  5. # 超级类来使用。
  6. #==============================================================================

  7. class Game_Battler
  8.   #--------------------------------------------------------------------------
  9.   # ● 可以使用特技的判定
  10.   #     skill_id : 特技 ID
  11.   #--------------------------------------------------------------------------
  12.   def skill_can_use?(skill_id)
  13.     # SP 不足的情况下不能使用
  14.     if $data_skills[skill_id].sp_cost > self.sp
  15.       return false
  16.     end
  17.     # 战斗不能的情况下不能使用
  18.     if dead?
  19.       return false
  20.     end
  21.     # 沉默状态的情况下、物理特技以外的特技不能使用
  22.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  23.       return false
  24.     end
  25.     # 获取可以使用的时机
  26.     occasion = $data_skills[skill_id].occasion
  27.     # 战斗中的情况下
  28.     if $game_temp.in_battle
  29.       # [平时] 或者是 [战斗中] 可以使用
  30.       return (occasion == 0 or occasion == 1)
  31.     # 不是战斗中的情况下
  32.     else
  33.       # [平时] 或者是 [菜单中] 可以使用
  34.       return (occasion == 0 or occasion == 2)
  35.     end
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 应用通常攻击效果
  39.   #     attacker : 攻击者 (battler)
  40.   #--------------------------------------------------------------------------
  41.   def attack_effect(attacker)
  42.     # 清除会心一击标志
  43.     $必杀 = 0
  44.     @active_battler = attacker
  45.     self.critical = false
  46.     # 第一命中判定
  47.     hit_result = (rand(100) < attacker.hit)
  48.     # 命中的情况下
  49.     if hit_result == true
  50.       # 计算基本伤害
  51.       atk = [attacker.atk - self.pdef / 1, attacker.atk / 10].max
  52.        if  @active_battler.is_a?(Game_Actor)
  53.          for kds in self.actions
  54.            if $data_skills[kds.skill_id].element_set.include?(42)
  55.               atk = [@active_battler.atk - self.pdef*120/100, @active_battler.atk / 12].max
  56.               break
  57.            elsif $data_skills[kds.skill_id].element_set.include?(41)
  58.               atk = [@active_battler.atk - self.pdef*110/100, @active_battler.atk / 11].max
  59.            end
  60.          end
  61.        end
  62.        if  @active_battler.is_a?(Game_Enemy)
  63.          for kds in self.skills
  64.            if $data_skills[kds].element_set.include?(42)
  65.               atk = [@active_battler.atk - self.pdef*120/100, @active_battler.atk / 12].max
  66.               break
  67.            elsif $data_skills[kds].element_set.include?(41)
  68.               atk = [@active_battler.atk - self.pdef*110/100, @active_battler.atk / 11].max
  69.            end
  70.          end
  71.        end
  72.       self.damage = atk*2 + attacker.str/5
  73.       # 属性修正
  74.       self.damage *= elements_correct(attacker.element_set)
  75.       self.damage /= 100
  76.       @kds_30 = nil
  77.       @kds_32 = nil
  78.       
  79.     if  @active_battler.is_a?(Game_Enemy)
  80.        for kds in @active_battler.actions
  81.          if $data_skills[kds.skill_id].element_set.include?(30)
  82.             self.damage = self.damage*125/100
  83.             @kds_30 = 0
  84.          elsif $data_skills[kds.skill_id].element_set.include?(29) and @kds_30 == nil
  85.             self.damage = self.damage*113/100
  86.          end
  87.          if $data_skills[kds.skill_id].element_set.include?(32)
  88.             $必杀 += 25
  89.             @kds_32 = 0
  90.          elsif $data_skills[kds.skill_id].element_set.include?(31) and @kds_32 == nil
  91.             $必杀 += 13
  92.          end
  93.        end
  94.     end

  95.     if  @active_battler.is_a?(Game_Actor)
  96.        for kds in @active_battler.skills
  97.          if $data_skills[kds].element_set.include?(30)
  98.             self.damage = self.damage*120/100
  99.             @kds_30 = 0
  100.          elsif $data_skills[kds].element_set.include?(29) and @kds_30 == nil
  101.             self.damage = self.damage*110/100
  102.          end
  103.          if $data_skills[kds].element_set.include?(32)
  104.             $必杀 += 20
  105.             @kds_32 = 0
  106.          elsif $data_skills[kds].element_set.include?(31) and @kds_32 == nil
  107.             $必杀 += 10
  108.          end
  109.        end
  110.     end

  111.       
  112.       # 伤害符号正确的情况下
  113.       if self.damage > 0
  114.        # 会心一击修正
  115.         if rand(100) < 5 * attacker.dex / self.agi + $必杀
  116.           self.damage *= 2
  117.           self.critical = true
  118.         end
  119.         # 防御修正
  120.         if self.guarding?
  121.           self.damage /= 2
  122.         end
  123.       end
  124.       
  125.    
  126.       # 分散
  127.       if self.damage.abs > 0
  128.         amp = [self.damage.abs * 15 / 100, 1].max
  129.         self.damage += rand(amp+1) + rand(amp+1) - amp
  130.       end
  131.       # 第二命中判定
  132.       eva = 8 * self.agi / attacker.dex + self.eva
  133.       hit = self.damage < 0 ? 100 : 100 - eva
  134.       hit = self.cant_evade? ? 100 : hit
  135.       hit_result = (rand(100) < hit)
  136.     end
  137.     # 命中的情况下
  138.     if hit_result == true

  139.      #保护系统-内部伤害计算
  140.       if self.is_a?(Game_Actor) and self.baohu.size >= 1
  141.          @baohu_agi = []
  142.          for i in 0..self.baohu.size-1
  143.           @baohu_agi[i] = $game_party.actors[self.baohu[i]].agi
  144.          end
  145.         for a in [email]0..@baohu_agi.size[/email]-1
  146.          for s in [email]0..@baohu_agi.size[/email]-1
  147.           if s < @baohu_agi.size-1 and @baohu_agi[s] < @baohu_agi[s+1]
  148.           elsif s < @baohu_agi.size-1 and @baohu_agi[s] > @baohu_agi[s+1]
  149.            @abc = @baohu_agi[s]
  150.            @baohu_agi[s] = @baohu_agi[s+1]
  151.            @baohu_agi[s+1] = @abc
  152.            
  153.            @bcd = self.baohu[s]
  154.            self.baohu[s] = self.baohu[s+1]
  155.            self.baohu[s+1] = @bcd
  156.           end
  157.          end
  158.         end
  159.           @baohu_duixiang = 1

  160.            for i in 1..self.baohu.size
  161.              if $game_party.actors[self.baohu[self.baohu.size-i]].hp <= 0
  162.                @baohu_duixiang += 1
  163.              else
  164.                break
  165.              end
  166.            end
  167.           if @baohu_duixiang == self.baohu.size + 1
  168.             self.hp -= self.damage
  169.           else
  170.             $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].damage = self.damage*80/100
  171.             if $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].damage <= 0
  172.                $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].damage = rand(6)+4
  173.             end
  174.             $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].hp -= self.damage*80/100
  175.             self.damage = self.damage*20/100
  176.             if self.damage <= 0
  177.               self.damage = rand(2)+1
  178.             end
  179.             self.hp -= self.damage*20/100

  180.             if self.baohu_dx == nil
  181.               self.baohu_dx = $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].ac_id
  182.             else
  183.               self.baohu_dxb = $game_party.actors[self.baohu[self.baohu.size-@baohu_duixiang]].ac_id
  184.             end
  185.            
  186.            self.baohu.delete(self.baohu[self.baohu.size-@baohu_duixiang])
  187.           end
  188.        else
  189.         self.hp -= self.damage
  190.        end
  191.       
  192.       
  193.     if  @active_battler.is_a?(Game_Actor) and self.is_a?(Game_Enemy)
  194.        for kds in self.actions
  195.          if $data_skills[kds.skill_id].element_set.include?(36)
  196.              if rand(100) < 35 and self.hp <= 0
  197.               self.damage = -self.maxhp
  198.               self.hp += self.maxhp
  199.               self.sp += self.maxsp
  200.               self.critical = false
  201.              end
  202.             break
  203.          elsif $data_skills[kds.skill_id].element_set.include?(35)
  204.              if rand(100) < 25 and self.hp <= 0
  205.               self.damage = -self.maxhp/2
  206.               self.hp += self.maxhp/2
  207.               self.sp += self.maxsp/2
  208.               self.critical = false
  209.              end
  210.             break
  211.          end
  212.        end
  213.     end

  214.     if  @active_battler.is_a?(Game_Enemy) and self.is_a?(Game_Actor)
  215.        for kds in self.skills
  216.          if $data_skills[kds].element_set.include?(36)
  217.              if rand(100) < 35 and self.hp <= 0
  218.               self.damage = -self.maxhp
  219.               self.hp += self.maxhp
  220.               self.sp += self.maxsp
  221.               self.critical = false
  222.              end
  223.             break
  224.          elsif $data_skills[kds].element_set.include?(35)
  225.              if rand(100) < 25 and self.hp <= 0
  226.               self.damage = -self.maxhp/2
  227.               self.hp += self.maxhp/2
  228.               self.sp += self.maxsp/2
  229.               self.critical = false
  230.              end
  231.             break
  232.          end
  233.        end
  234.     end
  235.       
  236.       
  237.       # 状态冲击解除
  238.       remove_states_shock
  239.       # HP 的伤害计算
  240.       # 状态变化
  241.       @state_changed = false
  242.       states_plus(attacker.plus_state_set)
  243.       states_minus(attacker.minus_state_set)
  244.     # Miss 的情况下
  245.     else
  246.       # 伤害设置为 "Miss"
  247.       self.damage = "Miss"
  248.       # 清除会心一击标志
  249.       self.critical = false
  250.     end
  251.     # 过程结束
  252.     return true
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ● 应用特技效果
  256.   #     user  : 特技的使用者 (battler)
  257.   #     skill : 特技
  258.   #--------------------------------------------------------------------------
  259.   def skill_effect(user, skill)
  260.     # 清除会心一击标志
  261.     $必杀 = 0
  262.     @active_battler = user
  263.     attacker = user
  264.     self.critical = false
  265.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  266.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  267.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  268.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  269.       # 过程结束
  270.       return false
  271.     end
  272.     # 清除有效标志
  273.     effective = false
  274.     # 公共事件 ID 是有效的情况下,设置为有效标志
  275.     effective |= skill.common_event_id > 0
  276.     # 第一命中判定
  277.     hit = skill.hit
  278.     if skill.atk_f > 0
  279.       hit *= user.hit / 100
  280.     end
  281.     hit_result = (rand(100) < hit)
  282.     # 不确定的特技的情况下设置为有效标志
  283.     effective |= hit < 100
  284.     # 命中的情况下
  285.     if hit_result == true
  286.       # 计算威力
  287.       power = (skill.power + user.int * skill.atk_f / 100)* user.int / self.mdef
  288.       if power > 0
  289.         power -= self.pdef * skill.pdef_f / 200
  290.         power -= self.mdef * skill.mdef_f / 200
  291.         power = [power, 0].max
  292.       end
  293.       # 计算倍率
  294.       rate = 20
  295.       rate += (user.str * skill.str_f / 100)
  296.       rate += (user.dex * skill.dex_f / 100)
  297.       rate += (user.agi * skill.agi_f / 100)
  298.       rate += (user.int * skill.int_f / 100)
  299.       # 计算基本伤害
  300.       self.damage = power * rate / 30
  301.       # 伤害符号正确的情况下
  302.       if self.damage > 0
  303.         # 防御修正
  304.         if self.guarding?
  305.           self.damage /= 1
  306.         end
  307.       end
  308.       
  309.      if skill.element_set.include?(13)
  310.        atk = [@active_battler.atk - self.pdef / 1, @active_battler.atk / 10].max
  311.        if  @active_battler.is_a?(Game_Actor)
  312.          for kds in self.actions
  313.            if $data_skills[kds.skill_id].element_set.include?(42)
  314.               atk = [@active_battler.atk - self.pdef*120/100, @active_battler.atk / 12].max
  315.               break
  316.            elsif $data_skills[kds.skill_id].element_set.include?(41)
  317.               atk = [@active_battler.atk - self.pdef*110/100, @active_battler.atk / 11].max
  318.            end
  319.          end
  320.        end
  321.        if  @active_battler.is_a?(Game_Enemy)
  322.          for kds in self.skills
  323.            if $data_skills[kds].element_set.include?(42)
  324.               atk = [@active_battler.atk - self.pdef*120/100, @active_battler.atk / 12].max
  325.               break
  326.            elsif $data_skills[kds].element_set.include?(41)
  327.               atk = [@active_battler.atk - self.pdef*110/100, @active_battler.atk / 11].max
  328.            end
  329.          end
  330.        end
  331.       self.damage = atk + @active_battler.str * 2
  332.      end

  333.     kds_24 = nil
  334.     kds_30 = nil
  335.     kds_32 = nil
  336.     kds_28 = nil

  337.     if  @active_battler.is_a?(Game_Actor)
  338.        for kds in @active_battler.skills
  339.          if $data_skills[kds].element_set.include?(24) and skill.element_set.include?(13) == false
  340.             self.damage = self.damage*120/100
  341.             kds_24 = 0
  342.          elsif $data_skills[kds].element_set.include?(23) and skill.element_set.include?(13) == false and kds_24 == nil
  343.             self.damage = self.damage*110/100
  344.          end
  345.          if $data_skills[kds].element_set.include?(30) and skill.element_set.include?(13)
  346.             kds_30 = 0
  347.             self.damage = self.damage*116/100
  348.          elsif $data_skills[kds].element_set.include?(29) and skill.element_set.include?(13) and kds_30 == nil
  349.             self.damage = self.damage*108/100
  350.          end
  351.          if $data_skills[kds].element_set.include?(32) and skill.element_set.include?(13)
  352.             kds_32 = 0
  353.             $必杀 += 20
  354.          elsif $data_skills[kds].element_set.include?(31) and skill.element_set.include?(13) and kds_32 == nil
  355.             $必杀 += 10
  356.          end
  357.        end
  358.       if self.is_a?(Game_Enemy)
  359.        for kds in self.actions
  360.          if $data_skills[kds.skill_id].element_set.include?(28) and skill.element_set.include?(13) == false
  361.             kds_28 = 0
  362.             self.damage = self.damage*80/100
  363.          elsif $data_skills[kds.skill_id].element_set.include?(27) and skill.element_set.include?(13) == false and kds_28 == nil
  364.             self.damage = self.damage*90/100
  365.          end
  366.        end
  367.       end
  368.     end
  369.    
  370.     if  @active_battler.is_a?(Game_Enemy)
  371.        for kds in @active_battler.actions
  372.          if $data_skills[kds.skill_id].element_set.include?(24) and skill.element_set.include?(13) == false
  373.             kds_24 = 0
  374.             self.damage = self.damage*120/100
  375.          elsif $data_skills[kds.skill_id].element_set.include?(23) and skill.element_set.include?(13) == false and kds_24 == nil
  376.             self.damage = self.damage*110/100
  377.          end
  378.          if $data_skills[kds.skill_id].element_set.include?(30) and skill.element_set.include?(13)
  379.             kds_30 = 0
  380.             self.damage = self.damage*116/100
  381.          elsif $data_skills[kds.skill_id].element_set.include?(29) and skill.element_set.include?(13) and kds_30 == nil
  382.             self.damage = self.damage*108/100
  383.          end
  384.          if $data_skills[kds.skill_id].element_set.include?(32) and skill.element_set.include?(13)
  385.             kds_32 = 0
  386.             $必杀 += 20
  387.          elsif $data_skills[kds.skill_id].element_set.include?(31) and skill.element_set.include?(13) and kds_32 == nil
  388.             $必杀 += 10
  389.          end
  390.        end
  391.       if self.is_a?(Game_Actor)
  392.        for kds in self.skills
  393.          if $data_skills[kds].element_set.include?(28) and skill.element_set.include?(13) == false
  394.             kds_28 = 0
  395.             self.damage = self.damage*80/100
  396.          elsif $data_skills[kds].element_set.include?(27) and skill.element_set.include?(13) == false and kds_28 == nil
  397.             self.damage = self.damage*90/100
  398.          end
  399.        end
  400.       end
  401.     end
  402.    
  403.       if skill.element_set.include?(43) and skill.element_set.include?(13)
  404.        self.damage = self.damage*78/100
  405.      end
  406.      
  407.       if skill.element_set.include?(46) and skill.element_set.include?(13)
  408.        self.damage = self.damage*190/100
  409.       
  410.      end
  411.      if skill.element_set.include?(47) and skill.element_set.include?(13)
  412.        self.damage = self.damage*60/100
  413.       
  414.      end

  415.      
  416.       if skill.element_set.include?(49) and skill.element_set.include?(13)
  417.        self.damage = self.damage*90/100
  418.      end
  419.          if skill.element_set.include?(50) and skill.element_set.include?(13)
  420.        self.damage = self.damage*40/100
  421.      end
  422.      
  423.      
  424.       # 属性修正
  425.       self.damage *= elements_correct(user.element_set)
  426.       self.damage /= 100
  427.    
  428.       if skill.element_set.include?(13)
  429.        if self.damage > 0
  430.         if rand(100) < 10 + $必杀
  431.           self.damage *= 2
  432.           self.critical = true
  433.         end
  434.         if self.guarding?
  435.           self.damage /= 2
  436.         end
  437.        end
  438.       end
  439.       # 分散
  440.       if skill.variance > 0 and self.damage.abs > 0
  441.         amp = [self.damage.abs * skill.variance / 100, 1].max
  442.         self.damage += rand(amp+1) + rand(amp+1) - amp
  443.       end
  444.       
  445.       
  446.       if skill.element_set.include?(44)
  447.        self.damage = @active_battler.level * 5
  448.      end
  449.      if skill.element_set.include?(51)
  450.        self.damage = @active_battler.level * 8
  451.      end
  452.      
  453.       if skill.element_set.include?(45)
  454.        if rand(100) < 75
  455.          self.damage *= 9 / 5
  456.        else
  457.          self.damage /= - 3 / 1
  458.        end
  459.       end
  460.       
  461.       # 第二命中判定
  462.       eva = 8 * self.agi / user.dex + self.eva
  463.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  464.       hit = self.cant_evade? ? 100 : hit
  465.       hit_result = (rand(100) < hit)
  466.       # 不确定的特技的情况下设置为有效标志
  467.       effective |= hit < 100
  468.     end
  469.     # 命中的情况下
  470.     if hit_result == true
  471.       # 威力 0 以外的物理攻击的情况下
  472.       if skill.power != 0 and skill.atk_f > 0
  473.         # 状态冲击解除
  474.         remove_states_shock
  475.         # 设置有效标志
  476.         effective = true
  477.       end
  478.       # HP 的伤害减法运算
  479.       last_hp = self.hp
  480.       self.hp -= self.damage
  481.       
  482.     if  @active_battler.is_a?(Game_Actor) and self.is_a?(Game_Enemy)
  483.        for kds in self.actions
  484.          if $data_skills[kds.skill_id].element_set.include?(36)
  485.              if rand(100) < 25 and self.hp <= 0
  486.               self.damage = -self.maxhp
  487.               self.hp += self.maxhp
  488.               self.sp += self.maxsp
  489.               self.critical = false
  490.              end
  491.             break
  492.          elsif $data_skills[kds.skill_id].element_set.include?(35)
  493.              if rand(100) < 20 and self.hp <= 0
  494.               self.damage = -self.maxhp/2
  495.               self.hp += self.maxhp/2
  496.               self.sp += self.maxsp/2
  497.               self.critical = false
  498.              end
  499.             break
  500.          end
  501.        end
  502.     end

  503.     if  @active_battler.is_a?(Game_Enemy) and self.is_a?(Game_Actor)
  504.        for kds in self.skills
  505.          if $data_skills[kds].element_set.include?(36)
  506.              if rand(100) < 25 and self.hp <= 0
  507.               self.damage = -self.maxhp
  508.               self.hp += self.maxhp
  509.               self.sp += self.maxsp
  510.               self.critical = false
  511.              end
  512.             break
  513.          elsif $data_skills[kds].element_set.include?(35)
  514.              if rand(100) < 20 and self.hp <= 0
  515.               self.damage = -self.maxhp/2
  516.               self.hp += self.maxhp/2
  517.               self.sp += self.maxsp/2
  518.               self.critical = false
  519.              end
  520.             break
  521.          end
  522.        end
  523.     end
  524.       
  525.       
  526.       effective |= self.hp != last_hp
  527.       # 状态变化
  528.       @state_changed = false
  529.       effective |= states_plus(skill.plus_state_set)
  530.       effective |= states_minus(skill.minus_state_set)
  531.       # 威力为 0 的场合
  532.       if skill.power == 0 and skill.element_set.include?(13) == false
  533.         # 伤害设置为空的字串
  534.         self.damage = ""
  535.        # 状态没有变化的情况下
  536.        unless (@state_changed || skill.common_event_id > 0)
  537.          # 伤害设置为 "Miss"
  538.          self.damage = "Miss"
  539.        end
  540.       end
  541.     # Miss 的情况下
  542.     else
  543.       # 伤害设置为 "Miss"
  544.       self.damage = "Miss"
  545.     end
  546.     # 不在战斗中的情况下
  547.     unless $game_temp.in_battle
  548.       # 伤害设置为 nil
  549.       self.damage = nil
  550.     end
  551.     # 过程结束
  552.     return effective
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # ● 应用物品效果
  556.   #     item : 物品
  557.   #--------------------------------------------------------------------------
  558.   def item_effect(item)
  559.     # 清除会心一击标志
  560.     self.critical = false
  561.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  562.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  563.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  564.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  565.       # 过程结束
  566.       return false
  567.     end
  568.     # 清除有效标志
  569.     effective = false
  570.     # 公共事件 ID 是有效的情况下,设置为有效标志
  571.     effective |= item.common_event_id > 0
  572.     # 命中判定
  573.     hit_result = (rand(100) < item.hit)
  574.     # 不确定的特技的情况下设置为有效标志
  575.     effective |= item.hit < 100
  576.     # 命中的情况
  577.     if hit_result == true
  578.       # 计算回复量
  579.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  580.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  581.       if recover_hp < 0
  582.         recover_hp += self.pdef * item.pdef_f / 20
  583.         recover_hp += self.mdef * item.mdef_f / 20
  584.         recover_hp = [recover_hp, 0].min
  585.       end
  586.       # 属性修正
  587.       recover_hp *= elements_correct(item.element_set)
  588.       recover_hp /= 100
  589.       recover_sp *= elements_correct(item.element_set)
  590.       recover_sp /= 100
  591.       # 分散
  592.       if item.variance > 0 and recover_hp.abs > 0
  593.         amp = [recover_hp.abs * item.variance / 100, 1].max
  594.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  595.       end
  596.       if item.variance > 0 and recover_sp.abs > 0
  597.         amp = [recover_sp.abs * item.variance / 100, 1].max
  598.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  599.       end
  600.       # 回复量符号为负的情况下
  601.       if recover_hp < 0
  602.         # 防御修正
  603.         if self.guarding?
  604.           recover_hp /= 2
  605.         end
  606.       end
  607.       # HP 回复量符号的反转、设置伤害值
  608.       self.damage = -recover_hp
  609.       # HP 以及 SP 的回复
  610.       last_hp = self.hp
  611.       last_sp = self.sp
  612.       self.hp += recover_hp
  613.       self.sp += recover_sp
  614.       
  615.     if  @active_battler.is_a?(Game_Actor) and self.is_a?(Game_Enemy)
  616.        for kds in self.actions
  617.          if $data_skills[kds.skill_id].element_set.include?(36)
  618.              if rand(100) < 25 and self.hp <= 0
  619.               self.damage = -self.maxhp
  620.               self.hp += self.maxhp
  621.               self.sp += self.maxsp
  622.               self.critical = false
  623.              end
  624.             break
  625.          elsif $data_skills[kds.skill_id].element_set.include?(35)
  626.              if rand(100) < 20 and self.hp <= 0
  627.               self.damage = -self.maxhp/2
  628.               self.hp += self.maxhp/2
  629.               self.sp += self.maxsp/2
  630.               self.critical = false
  631.              end
  632.             break
  633.          end
  634.        end
  635.     end

  636.     if  @active_battler.is_a?(Game_Enemy) and self.is_a?(Game_Actor)
  637.        for kds in self.skills
  638.          if $data_skills[kds].element_set.include?(36)
  639.              if rand(100) < 25 and self.hp <= 0
  640.               self.damage = -self.maxhp
  641.               self.hp += self.maxhp
  642.               self.sp += self.maxsp
  643.               self.critical = false
  644.              end
  645.             break
  646.          elsif $data_skills[kds].element_set.include?(35)
  647.              if rand(100) < 20 and self.hp <= 0
  648.               self.damage = -self.maxhp/2
  649.               self.hp += self.maxhp/2
  650.               self.sp += self.maxsp/2
  651.               self.critical = false
  652.              end
  653.             break
  654.          end
  655.        end
  656.     end
  657.       
  658.       
  659.       effective |= self.hp != last_hp
  660.       effective |= self.sp != last_sp
  661.       # 状态变化
  662.       @state_changed = false
  663.       effective |= states_plus(item.plus_state_set)
  664.       effective |= states_minus(item.minus_state_set)
  665.       # 能力上升值有效的情况下
  666.       if item.parameter_type > 0 and item.parameter_points != 0
  667.         # 能力值的分支
  668.         case item.parameter_type
  669.         when 1  # MaxHP
  670.           @maxhp_plus += item.parameter_points
  671.         when 2  # MaxSP
  672.           @maxsp_plus += item.parameter_points
  673.         when 3  # 力量
  674.           @str_plus += item.parameter_points
  675.         when 4  # 灵巧
  676.           @dex_plus += item.parameter_points
  677.         when 5  # 速度
  678.           @agi_plus += item.parameter_points
  679.         when 6  # 魔力
  680.           @int_plus += item.parameter_points
  681.         end
  682.         # 设置有效标志
  683.         effective = true
  684.       end
  685.       # HP 回复率与回复量为 0 的情况下
  686.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  687.         # 设置伤害为空的字符串
  688.         self.damage = ""
  689.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  690.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  691.            (item.parameter_type == 0 or item.parameter_points == 0)
  692.        # 状态没有变化的情况下
  693.        unless (@state_changed || item.common_event_id > 0)
  694.          # 伤害设置为 "Miss"
  695.          self.damage = "Miss"
  696.        end
  697.         end
  698.       end
  699.     # Miss 的情况下
  700.     else
  701.       # 伤害设置为 "Miss"
  702.       self.damage = "Miss"
  703.     end
  704.     # 不在战斗中的情况下
  705.     unless $game_temp.in_battle
  706.       # 伤害设置为 nil
  707.       self.damage = nil
  708.     end
  709.     # 过程结束
  710.     return effective
  711.   end
  712.   #--------------------------------------------------------------------------
  713.   # ● 应用连续伤害效果
  714.   #--------------------------------------------------------------------------

  715. def slip_damage_effect

  716.     # 毒

  717.     if self.state?(7)

  718.       # 设置伤害

  719.       self.damage = self.maxhp / 20

  720.       # 分散

  721.       if self.damage.abs > 0

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

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

  724.       end

  725.       # HP 的伤害减法运算

  726.       self.hp -= self.damage
  727.       #剧毒
  728.        elsif  self.state?(20)

  729.       # 设置伤害

  730.       self.damage = self.maxhp / 10

  731.       # 分散

  732.       if self.damage.abs > 0

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

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

  735.       end

  736.       # HP 的伤害减法运算

  737.       self.hp -= self.damage


  738.     # 回血

  739.     elsif self.state?(5)

  740.       # 设置伤害

  741.       self.damage = -self.maxhp / 8

  742.       # HP 的伤害减法运算

  743.       self.hp -= self.damage      
  744.           # 群回血

  745.     elsif self.state?(17)

  746.       # 设置伤害

  747.       self.damage = -self.maxhp / 12

  748.       # HP 的伤害减法运算

  749.       self.hp -= self.damage   

  750.     # 老化

  751.     elsif self.state?(19)

  752.       # 设置伤害

  753.       self.damage = "Being aged!"

  754.       # 能力值下

  755.       $data_states[19].pdef_rate *= 0.98

  756.       $data_states[19].mdef_rate *= 0.98

  757.       $data_states[19].atk_rate *= 0.98

  758.       $data_states[19].str_rate *= 0.98

  759.       $data_states[19].dex_rate *= 0.98

  760.       $data_states[19].int_rate *= 0.98

  761.       $data_states[19].agi_rate *= 0.98

  762.       $data_states[19].eva -= 0.3

  763.       $data_states[19].eva = [$data_states[19].eva, -100].max

  764.     end

  765.     # 过程结束

  766.     return true

  767. end
  768.   #--------------------------------------------------------------------------
  769.   # ● 属性修正计算
  770.   #     element_set : 属性
  771.   #--------------------------------------------------------------------------
  772.   def elements_correct(element_set)
  773.     # 無属性的情况
  774.     if element_set == []
  775.       # 返回 100
  776.       return 100
  777.     end
  778.     # 在被赋予的属性中返回最弱的
  779.     # ※过程 element_rate 是、本类以及继承的 Game_Actor
  780.     #   和 Game_Enemy 类的定义
  781.     weakest = -100
  782.     for i in element_set
  783.       weakest = [weakest, self.element_rate(i)].max
  784.     end
  785.     return weakest
  786.   end
  787. end
复制代码
dsu_plus_rewardpost_czw
作者: piaoy    时间: 2011-5-20 21:22
好像是(人物攻击力-敌人防御力)乘2乘 人物力量的5倍
#(以上是基础伤害,不包括技能的伤害加成和属性)

#好悬看坏我的泰拉石眼。。。。
作者: 双叶GL    时间: 2011-5-21 06:52
你先用这吧,太长了回来在翻译,现在要上班
http://rpg.blue/thread-163781-1-1.html
作者: 小传子    时间: 2011-5-21 08:14
  @active_battler = attacker
楼主的脚本好熟悉,- -看样子是梦幻群侠传的吧
这里已经定义了,@active_battler就是使用者,
str
力量。
dex
灵巧。
agi
速度。
int
魔力。
atk
攻击力。
pdef
物理防御。
mdef
魔法防御。
为什么不用F1查查看呢,这些很简单。
self.pdef  就是使用对象物理防御,至于加减乘除神马的,不用说你也明白的



作者: xj5234140    时间: 2011-5-21 13:40
回复 piaoy 的帖子

完全错误
作者: 双叶GL    时间: 2011-5-21 20:03
本帖最后由 双叶GL 于 2011-5-21 20:15 编辑

基本伤害,就是你的攻击数据-对方防御数据在除以2,最低伤害为0
      atk = [attacker.atk - self.pdef / 2, 0].max
这要保留为self.damage = atk这个是攻击数据=你的攻击力然后在乘以20+力量数据,
所以简单就是,攻击数据=你的攻击力*(20+力量数据)然后在除以20,然后在减对方防御的伤害在除以2就是最终伤害,
      self.damage = atk * (20 + attacker.str) / 20
这下面就是伤害幅度多少,简单理解就是,最终伤害的最大最小伤害,去掉就变成了以上数据无浮动
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
假如你看了这还无法理解特技的伤害计算,就先放一边去看看动漫,慢慢来就懂了


双叶GL于2011-5-21 20:10补充以下内容:
      atk = [attacker.atk - self.pdef / 1, attacker.atk / 10].max  伤害=攻击数据 -防御数据除以1,最低伤害为攻击数据除以10
一般的都是这样的结果计算,然后是计算过程,
过程就是,吧结果中的那些数据变成公式后最终得出伤害是多少在怎么改,也是伤害=[数学公式(就是最基本的数学)].的最大值MAX

另外,attacker.atk - self.pdef / 1,这个1基本不需要,可以直接attacker.atk - self.pdef , attacker.atk / 10
作者: xj5234140    时间: 2011-5-23 16:07
双叶GL 发表于 2011-5-21 20:03
基本伤害,就是你的攻击数据-对方防御数据在除以2,最低伤害为0
      atk = [attacker.atk - self.pdef / 2, ...

那技能伤害计算公式呢?
作者: 双叶GL    时间: 2011-5-23 17:31
xj5234140 发表于 2011-5-23 16:07
那技能伤害计算公式呢?

      # 计算威力
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 计算倍率
      rate = 20
      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
      # 属性修正
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # 伤害符号正确的情况下
      if self.damage > 0
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
这里就是原本的特技伤害
作者: 双叶GL    时间: 2011-5-23 17:32
maxhp 最大生命值
hp 当前生命值
maxsp 最大魔法值
sp 当前魔法值
str 力量
dex 灵巧
agi 速度
int 魔力
atk 攻击力
pdef 物理防御
mdef 魔法防御
eva 躲避

# 计算倍率
rate局部变量被赋值为 20
rate = 20
从下面这4行可以看出
数据库里设置的 这4个属性的 F 越大则倍率越高
如果这些F设置为100的话
那么其对应的那个使用者的属性就直接是前面计算的power的倍率
数据库里特技的那些 力量F 灵巧F什么的
其实就是倍率的百分比.倍率就是使用者的对应的那个属性值.
比如使用者的力量是150点
一个特技的力量F 是 10
那么这个power的倍率就是 150的10%
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)

# 计算基本伤害
power 前面计算的威力
rate是倍率
self.damage 被攻击者受到的伤害值
前面计算的 power 乘以 倍率 再 除以 20
self.damage = power * rate / 20

# 属性修正
特技的属性与被攻击者的属性 对伤害值的影响
self.damage *= elements_correct(skill.element_set)
self.damage /= 100

# 伤害符号正确的情况下
if self.damage > 0
# 防御修正
if self.guarding?
self.damage /= 2
end
end




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