查看: 3993|回复: 9

[已经过期] 请问这样的报错如何解决

[复制链接]
梦石
0
星屑
2213
在线时间
759 小时
注册时间
2017-10-13
回帖
53
发表于 2018-1-29 17:53:35 | 显示全部楼层 |阅读模式

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

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

×
37HF4)IGN(JT}WXS6J7H($X.png


[pre lang="ruby"]#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
#  处理同伴的类。包含金钱以及物品的信息。本类的实例
# 请参考 $game_party。
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :actors                   # 角色
  attr_reader   :gold                     # 金钱
  attr_reader   :steps                    # 步数
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    # 建立角色序列
    @actors = []
    # 初始化金钱与步数
    @gold = 0
    @steps = 0
    # 生成物品、武器、防具的所持数 hash
    @items = {}
    @weapons = {}
    @armors = {}
  end
  #--------------------------------------------------------------------------
  # ● 设置初期同伴
  #--------------------------------------------------------------------------
  def setup_starting_members
    @actors = []
    for i in $data_system.party_members
      @actors.push($game_actors)
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置战斗测试用同伴
  #--------------------------------------------------------------------------
  def setup_battle_test_members
    @actors = []
    for battler in $data_system.test_battlers
      actor = $game_actors[battler.actor_id]
      actor.level = battler.level
      gain_weapon(battler.weapon_id, 1)
      gain_armor(battler.armor1_id, 1)
      gain_armor(battler.armor2_id, 1)
      gain_armor(battler.armor3_id, 1)
      gain_armor(battler.armor4_id, 1)
      actor.equip(0, battler.weapon_id)
      actor.equip(1, battler.armor1_id)
      actor.equip(2, battler.armor2_id)
      actor.equip(3, battler.armor3_id)
      actor.equip(4, battler.armor4_id)
      actor.recover_all
      @actors.push(actor)
    end
    @items = {}
    for i in 1...$data_items.size
      if $data_items.name != ""
        occasion = $data_items.occasion
        if occasion == 0 or occasion == 1
          @items = 99
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 同伴成员的还原
  #--------------------------------------------------------------------------
  def refresh
    # 游戏数据载入后角色对像直接从 $game_actors
    # 分离。
    # 回避由于载入造成的角色再设置的问题。
    new_actors = []
    for i in 0...@actors.size
      if $data_actors[@actors.id] != nil
        new_actors.push($game_actors[@actors.id])
      end
    end
    @actors = new_actors
  end
  #--------------------------------------------------------------------------
  # ● 获取最大等级
  #--------------------------------------------------------------------------
  def max_level
    # 同伴人数为 0 的情况下
    if @actors.size == 0
      return 0
    end
    # 初始化本地变量 level
    level = 0
    # 求得同伴的最大等级
    for actor in @actors
      if level < actor.level
        level = actor.level
      end
    end
    return level
  end
#--------------------------------------------------------------------------
# ● 加入同伴
#     actor_id : 角色 ID
#--------------------------------------------------------------------------
def add_actor(actor_id)
   # 获取角色
   actor = $game_actors[actor_id]
   # 同伴人数未满 5 人、本角色不在队伍中的情况下
   if @actors.size < 5 and not @actors.include?(actor)
     # 添加角色
     @actors.push(actor)
     # 还原主角
     $game_player.refresh
   end
end
  #--------------------------------------------------------------------------
  # ● 角色离开
  #     actor_id : 角色 ID
  #--------------------------------------------------------------------------
  def remove_actor(actor_id)
    # 删除觉得
    @actors.delete($game_actors[actor_id])
    # 还原主角
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  # ● 增加金钱 (减少)
  #     n : 金额
  #--------------------------------------------------------------------------
  def gain_gold(n)
    @gold = [[@gold + n, 0].max, 9999999].min
  end
  #--------------------------------------------------------------------------
  # ● 减少金钱
  #     n : 金额
  #--------------------------------------------------------------------------
  def lose_gold(n)
    # 调用数值逆转 gain_gold
    gain_gold(-n)
  end
  #--------------------------------------------------------------------------
  # ● 增加步数
  #--------------------------------------------------------------------------
  def increase_steps
    @steps = [@steps + 1, 9999999].min
  end
  #--------------------------------------------------------------------------
  # ● 获取物品的所持数
  #     item_id : 物品 ID
  #--------------------------------------------------------------------------
  def item_number(item_id)
    # 如果 hash 个数数值不存在就返回 0
    return @items.include?(item_id) ? @items[item_id] : 0
  end
  #--------------------------------------------------------------------------
  # ● 获取武器所持数
  #     weapon_id : 武器 ID
  #--------------------------------------------------------------------------
  def weapon_number(weapon_id)
    # 如果 hash 个数数值不存在就返回 0
    return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  end
  #--------------------------------------------------------------------------
  # ● 获取防具所持数
  #     armor_id : 防具 ID
  #--------------------------------------------------------------------------
  def armor_number(armor_id)
    # 如果 hash 个数数值不存在就返回 0
    return @armors.include?(armor_id) ? @armors[armor_id] : 0
  end
  #--------------------------------------------------------------------------
  # ● 增加物品 (减少)
  #     item_id : 物品 ID
  #     n       : 个数
  #--------------------------------------------------------------------------
  def gain_item(item_id, n)
    # 更新 hash 的个数数据
    if item_id > 0
      @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加武器 (减少)
  #     weapon_id : 武器 ID
  #     n         : 个数
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n)
    # 更新 hash 的个数数据
    if weapon_id > 0
      @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加防具 (减少)
  #     armor_id : 防具 ID
  #     n        : 个数
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n)
    # 更新 hash 的个数数据
    if armor_id > 0
      @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 减少物品
  #     item_id : 物品 ID
  #     n       : 个数
  #--------------------------------------------------------------------------
  def lose_item(item_id, n)
    # 调用 gain_item 的数值逆转
    gain_item(item_id, -n)
  end
  #--------------------------------------------------------------------------
  # ● 减少武器
  #     weapon_id : 武器 ID
  #     n         : 个数
  #--------------------------------------------------------------------------
  def lose_weapon(weapon_id, n)
    # 调用 gain_weapon 的数值逆转
    gain_weapon(weapon_id, -n)
  end
  #--------------------------------------------------------------------------
  # ● 减少防具
  #     armor_id : 防具 ID
  #     n        : 个数
  #--------------------------------------------------------------------------
  def lose_armor(armor_id, n)
    # 调用 gain_armor 的数值逆转
    gain_armor(armor_id, -n)
  end
  #--------------------------------------------------------------------------
  # ● 判断物品可以使用
  #     item_id : 物品 ID
  #--------------------------------------------------------------------------
  def item_can_use?(item_id)
    # 物品个数为 0 的情况
    if item_number(item_id) == 0
      # 不能使用
      return false
    end
    # 获取可以使用的时候
    occasion = $data_items[item_id].occasion
    # 战斗的情况
    if $game_temp.in_battle
      # 可以使用时为 0 (平时) 或者是 1 (战斗时) 可以使用
      return (occasion == 0 or occasion == 1)
    end
    # 可以使用时为 0 (平时) 或者是 2 (菜单时) 可以使用
    return (occasion == 0 or occasion == 2)
  end
  #--------------------------------------------------------------------------
  # ● 清除全体的行动
  #--------------------------------------------------------------------------
  def clear_actions
    # 清除全体同伴的行为
    for actor in @actors
      actor.current_action.clear
    end
  end
  #--------------------------------------------------------------------------
  # ● 可以输入命令的判定
  #--------------------------------------------------------------------------
  def inputable?
    # 如果一可以输入命令就返回 true
    for actor in @actors
      if actor.inputable?
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 全灭判定
  #--------------------------------------------------------------------------
  def all_dead?
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      return false
    end
    # 同伴中无人 HP 在 0 以上
    for actor in @actors
      if actor.hp > 0
        return false
      end
    end
    # 全灭
    return true
  end
  #--------------------------------------------------------------------------
  # ● 检查连续伤害 (地图用)
  #--------------------------------------------------------------------------
  def check_map_slip_damage
    for actor in @actors
      if actor.hp > 0 and actor.slip_damage? and actor.state?(62)
        actor.hp -= [actor.maxhp / 100, 1].max
        if actor.hp == 0
          $game_system.se_play($data_system.actor_collapse_se)
        end
        $game_screen.start_flash(Color.new(255,0,0,128), 4)
        $game_temp.gameover = $game_party.all_dead?
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 对像角色的随机确定
  #     hp0 : 限制为 HP 0 的角色
  #--------------------------------------------------------------------------
  def random_target_actor(hp0 = false)
    # 初始化轮流
    roulette = []
    # 循环
    for actor in @actors
      # 符合条件的场合
      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
        # 获取角色职业的位置 [位置]
        #position = $data_classes[actor.class_id].position
        #$data_classes[$game_actors[角色编号].class_id].position
        #position = $game_party.actors[actor.id].id     
        position = actor.index  
        # 前卫的话 n = 4、中卫的话 n = 3、后卫的话 n = 2
        case position
        when 0
          n = 10
        when 1
          n = 8
        when 2
          n = 6
        when 3
          n = 4
        when 4
          n = 2
        end  
        if actor.state?(38)
          n += 70
        end  
        if actor.element_rate(7) == 50
          n += 30
        end
        #n = 40 - position
        # 添加角色的轮流 n 回
        n.times do
          roulette.push(actor)
        end
      end
    end
    # 轮流大小为 0 的情况
    if roulette.size == 0
      return nil
    end
    # 转轮盘赌,决定角色
    return roulette[rand(roulette.size)]
  end
  #--------------------------------------------------------------------------
  # ● 对像角色的随机确定 (HP 0)
  #--------------------------------------------------------------------------
  def random_target_actor_hp0
    return random_target_actor(true)
  end
  #--------------------------------------------------------------------------
  # ● 对像角色的顺序确定
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def smooth_target_actor(actor_index)
    # 取得对像
    actor = @actors[actor_index]
    # 对像存在的情况下
    if actor != nil and actor.exist?
      return actor
    end
    # 循环
    for actor in @actors
      # 对像存在的情况下
      if actor.exist?
        return actor
      end
    end
  end
end
[/pre]

还会出现其他BUG。总的来说就是挂掉后会出现bug    Data.rar (1.68 MB, 下载次数: 89)



梦石
0
星屑
1397
在线时间
185 小时
注册时间
2007-2-28
回帖
139
发表于 2018-1-29 18:37:29 | 显示全部楼层
本帖最后由 梦幻想 于 2018-1-29 18:40 编辑

n为nil的时候不能调用times方法,试试加个条件
[pre lang="ruby"]
if (n != nil)
        n.times do
        roulette.push(actor)
        end
end[/pre]
回复

使用道具 举报

梦石
0
星屑
2213
在线时间
759 小时
注册时间
2017-10-13
回帖
53
 楼主| 发表于 2018-1-29 19:15:35 | 显示全部楼层
梦幻想 发表于 2018-1-29 18:37
n为nil的时候不能调用times方法,试试加个条件

if (n != nil)

这样会造成一直轮回 结束不了战斗吧
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-1-29 20:37:35 | 显示全部楼层
那就很可能说明你的队伍角色 大于5个 了
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
2709
在线时间
166 小时
注册时间
2018-1-19
回帖
88
发表于 2018-1-29 20:51:00 | 显示全部楼层
  1. # 前卫的话 n = 4、中卫的话 n = 3、后卫的话 n = 2
  2.         case position
  3.         when 0
  4.           n = 10
  5.         when 1
  6.           n = 8
  7.         when 2
  8.           n = 6
  9.         when 3
  10.           n = 4
  11.         when 4
  12.           n = 2
  13.         end  
复制代码

这一段可能需要修改下, position可能不止这几个值,导致n没有获得值才出现乃这种错误
求勾搭QwQ(bu)会使用脚本和事件QwQ虽然脚本还只是初级程度,还在学习ingQwQ
平常很闲,特别想回答问题和解决问题。再求勾搭呜呜呜QWQ
QQ:841155947
回复

使用道具 举报

梦石
0
星屑
2213
在线时间
759 小时
注册时间
2017-10-13
回帖
53
 楼主| 发表于 2018-1-30 12:38:57 | 显示全部楼层
芯☆淡茹水 发表于 2018-1-29 20:37
那就很可能说明你的队伍角色 大于5个 了

上次用大神给的脚本7人在队伍。5人上阵的。。现在我修改了下282行
    for actor in @actors[0..4]
偶尔战斗结束报错。。
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-1-30 13:06:43 | 显示全部楼层
huangke 发表于 2018-1-30 12:38
上次用大神给的脚本7人在队伍。5人上阵的。。现在我修改了下282行
    for actor in @actors[0..4]
偶尔 ...

或者把那个函数改成这样,无论多少人,这里都没问题。

  1.   #--------------------------------------------------------------------------
  2.   def random_target_actor(hp0 = false)
  3.     # 初始化轮流
  4.     roulette = []
  5.     @actors.each do |actor|
  6.       if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
  7.         n = [10 - actor.index * 2, 2].max
  8.         n += actor.state?(38) ? 70 : 0;
  9.         n += actor.element_rate(7) == 50 ? 30 : 0
  10.         n.times{roulette.push(actor)}
  11.       end
  12.     end
  13.     return roulette[rand(roulette.size)]
  14.   end
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
2213
在线时间
759 小时
注册时间
2017-10-13
回帖
53
 楼主| 发表于 2018-1-31 15:08:38 | 显示全部楼层
芯☆淡茹水 发表于 2018-1-30 13:06
或者把那个函数改成这样,无论多少人,这里都没问题。

这样的话还是有问题。。
回复

使用道具 举报

梦石
0
星屑
2213
在线时间
759 小时
注册时间
2017-10-13
回帖
53
 楼主| 发表于 2018-1-31 17:52:17 | 显示全部楼层
芯☆淡茹水 发表于 2018-1-30 13:06
或者把那个函数改成这样,无论多少人,这里都没问题。

@`ZG4ZD%1]MVG}(CX4ALL{I.png
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2018-1-31 19:00:25 | 显示全部楼层
你在334行附近添加一个else呗:
  1. when 4
  2.   n = 2
  3. else
  4.   n = 0
  5. end
复制代码
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部