Project1

标题: 關於使用暗器的問題~! [打印本页]

作者: 鲔鱼吐司    时间: 2009-5-19 06:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-19 09:34
還是在老地方——Game_Battler 3,item_effect 中添加裝備的判斷~
不過 item_effect 有個問題,就是在這個方法中不知道使用物品的是誰,所以我們應該添加一個參數,讓調用者傳遞使用物品的 Battler 進來~然后在命中后且回復量為負的分歧下判斷當前受傷害的是我方角色,且所有防具中有一個的 ID 是 10(因為不確定你的防具是盾還是頭部防具之類的),如果滿足條件的話就讓 recover_hp 自乘 5 即可:
  #--------------------------------------------------------------------------
  # ● 应用物品效果
  #     item : 物品
  #--------------------------------------------------------------------------
  def item_effect(item, user = nil)
    # 清除会心一击标志
    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
        # 10 号防具装备时投掷伤害变为 5 倍
        if user.class == Game_Actor && (user.armor1_id == 10 ||
          user.armor2_id == 10 || user.armor3_id == 10 ||
          user.armor4_id == 10)
          recover_hp *= 5
        end

        # 防御修正
        if self.guarding?
          recover_hp /= 2
        end
      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

最后就是在戰斗中調用 item_effect 的時候把使用物品的人,也就是 @active_battler 傳遞進來即可~這個過程是在 Scene_Battle 4 的 make_item_action_result 中,將調用 item_effect 的那一段改為:
    # 应用物品效果
    for target in @target_battlers
      target.item_effect(@item, @active_battler)
    end
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: 鲔鱼吐司    时间: 2009-5-19 18:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-19 19:53
具體的錯誤信息是?我測試確實沒報錯的說……
作者: 鲔鱼吐司    时间: 2009-5-19 20:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-19 20:30
你一定是用了什么腳本,覆蓋了 item_effect 這個方法~搜索一下你的腳本,看除了默認腳本以外還有哪里有“def item_effect”
作者: 鲔鱼吐司    时间: 2009-5-19 20:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 鲔鱼吐司    时间: 2009-5-19 21:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 鲔鱼吐司    时间: 2009-5-19 21:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 鲔鱼吐司    时间: 2009-5-20 06:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-20 07:47
第二段腳本應該在前吧,將里面的 item_effect 改為:
def item_effect(item, user = nil)
   self.critical = false
   if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
      ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
     # 过程结束(effective = false)
     return false
   end
   effective = false
   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
       # 10 号防具装备时投掷伤害变为 5 倍
       if user.class == Game_Actor && (user.armor1_id == 10 ||
         user.armor2_id == 10 || user.armor3_id == 10 ||
         user.armor4_id == 10)
         recover_hp *= 5
       end

       if self.guarding?
         recover_hp /= 2
       end
     end
     self.damage = -recover_hp
     last_hp = self.hp
     last_sp = self.sp
     self.hp += recover_hp
     self.sp += recover_sp
     if recover_sp != 0
     self.damage = -recover_sp
     end
     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_plus += item.parameter_points
       when 2
         @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
     if item.recover_hp_rate == 0 and item.recover_hp == 0 and item.recover_sp_rate == 0 and item.recover_sp == 0
       self.damage = ""
       if item.recover_sp_rate == 0 and item.recover_sp == 0 and
          (item.parameter_type == 0 or item.parameter_points == 0)
         unless @state_changed
           self.damage = "Miss"
         end
       end
     end
   else
     self.damage = "Miss"
   end
   unless $game_temp.in_battle
     self.damage = nil
   end
   # 血玲珑
   if item.element_set.include?(hp_storage_id)
     self.damage = nil
     differ_hp = self.maxhp - self.hp
     if $game_variables[STORAGE::HP_VAR] > differ_hp
       $game_variables[STORAGE::HP_VAR] -= differ_hp
       self.damage = -differ_hp if differ_hp !=0
       self.hp = self.maxhp
     else
       self.damage = -$game_variables[STORAGE::HP_VAR] if $game_variables[STORAGE::HP_VAR] != 0
       self.hp += $game_variables[STORAGE::HP_VAR]
       $game_variables[STORAGE::HP_VAR] = 0
     end
     num = $game_party.item_number(item.id)
     num_remain = [1 + $game_variables[STORAGE::HP_VAR] / STORAGE::HP_MAX, num].min
     num_costed = num - num_remain
     if $game_variables[STORAGE::HP_VAR] == 0
       num_costed = num
     end
     $game_party.gain_storage(item.id, -num_costed)
     effective |= differ_hp > 0
   end
   # 法玲珑
   if item.element_set.include?(sp_storage_id)
     self.damage = nil
     differ_sp = self.maxsp - self.sp
     if $game_variables[STORAGE::SP_VAR] > differ_sp
       $game_variables[STORAGE::SP_VAR] -= differ_sp
       self.damage = -differ_sp if differ_sp != 0
       self.sp = self.maxsp
     else
       self.damage = -$game_variables[STORAGE::SP_VAR] if $game_variables[STORAGE::SP_VAR] != 0
       self.sp += $game_variables[STORAGE::SP_VAR]
       $game_variables[STORAGE::SP_VAR] = 0
     end
     num = $game_party.item_number(item.id)
     num_remain = [1 + $game_variables[STORAGE::SP_VAR] / STORAGE::SP_MAX, num].min
     num_costed = num - num_remain
     if $game_variables[STORAGE::SP_VAR] == 0
       num_costed = num
     end
     $game_party.gain_storage(item.id, -num_costed)
     effective |= differ_sp > 0
   end
   # 过程结束
   return effective
end
end

然后把第一段腳本的 item_effect 改為:
def item_effect(item, user = nil)
  if self.is_a?(Game_Actor) and self.name.include?("幻影")
    self.damage = "False"
    return
  end
  ac_item_effect(item, user)
end

作者: 鲔鱼吐司    时间: 2009-5-20 08:33
提示: 作者被禁止或删除 内容自动屏蔽




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