Project1

标题: 捕捉时宠物加入 [打印本页]

作者: 黑米馒头    时间: 2022-5-18 11:24
标题: 捕捉时宠物加入
本帖最后由 黑米馒头 于 2022-5-20 17:31 编辑

在脚本里用了个捕捉功能,

敌人对应角色ID,现在是单个敌人对应单个角色,如何改成单个敌人对应多个角色ID?

现在是8号敌人对应80号角色,如何改成8号对应80-100号角色,

当捕捉8号敌人的时候,队伍里有80-100角色的话,就去除已经获得的角色编号,当80-100号角色全在队伍里了,在次捕捉该敌人就捕捉不了了

注:一次只能捕捉1只宠物

# 捕捉系统设置
module BUZHUO_BABY
     ACID = [] # 敌人对应相应的角色  ACID[敌人id] = 角色id
  ACID[8] = 80
end



#获得宠物
@active_battler.kds_baby.push(BUZHUO_BABY::ACID[en.id])
$game_actors[BUZHUO_BABY::ACID[en.id]].zhuren = @active_battler.id


作者: qq634488405    时间: 2022-5-20 11:02
# 捕捉系统设置
module BUZHUO_BABY
  ACID = {1=>[a,b,c,d,e...],
               2=>[f,g,h,i...],
               …………} # 敌人对应相应的角色  ACID[敌人id] = [角色id数组]
end

# ACID = {敌人ID=>[对应角色ID数组]}

#获得宠物
BUZHUO_BABY::ACID[en.id].each do |i|
  unless @active_battler.kds_baby.include?(i)
    @active_battler.kds_baby.push(i)
    $game_actors[i].zhuren = @active_battler.id
    break
  end
end

没太明白楼主的意思,这段的意思是每个敌人ID可以对应多个角色id
获得时依次判定是否已有对应角色id,没有就加入,这个只能加入一个,如果要改为加入所有不存在的就去掉break

作者: 黑米馒头    时间: 2022-5-20 17:32
qq634488405 发表于 2022-5-20 11:02
# 捕捉系统设置
module BUZHUO_BABY
  ACID = {1=>[a,b,c,d,e...],

应该是上次卡了,问题没打全,现在写全了,你帮我看看
作者: 黑米馒头    时间: 2022-5-20 22:29
qq634488405 发表于 2022-5-20 11:02
# 捕捉系统设置
module BUZHUO_BABY
  ACID = {1=>[a,b,c,d,e...],

发现1个问题,我把敌人数组改成  ACID = {8=>[51,52,53]} ,3个宠物ID

然后捕捉的时候队伍里设置2个角色,当角色1和2同时捕捉敌人1的时候,
会同时出现捕捉数组里面同1个宠物的情况,如何改成,同时捕捉同1个敌人的时候,
宠物在队里了,就去除一个ID,比如1先行动,捕捉敌人,然后51号宠物入队了,
2号捕捉的时候只能捕捉其它两只,当这个数组里面的所有宠物都被捕捉了,
然后再次去捕捉改敌人的时候,就显示,无法继续捕捉该宠物了



下面是我的捕捉系统

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 4)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Battle
  8.  
  9.   #======================================================
  10.   # 【捕捉系统】
  11.   # 生成提示窗口
  12.   alias bnzz main
  13.   def main
  14.     @tip_window = Window_Tip1.new
  15.     bnzz
  16.     @tip_window.dispose
  17.   end
  18.   alias tgbmj update
  19.   def update
  20.     @tip_window.update
  21.     tgbmj
  22.   end
  23.   def make_buzhuo_action_result # 捕捉
  24.     # 设置动画ID
  25.     @animation1_id = BUZHUO_BABY::ANI[@active_battler.id][0]
  26.     @animation2_id = BUZHUO_BABY::ANI[@active_battler.id][1]
  27.     # 法术值消耗
  28.     if @active_battler.sp - BUZHUO_BABY::COMP >= 0
  29.       @active_battler.sp -= BUZHUO_BABY::COMP
  30.     end
  31.     # 应用动画
  32.     index = @active_battler.current_action.target_index
  33.     en = $game_troop.smooth_target_enemy(index)
  34.     @target_battlers = [en]
  35.  
  36.     # 帮助窗口显示"捕捉"
  37.     @help_window.set_text(@active_battler.name + "发动了捕捉", 1)   
  38.  
  39.     # 队伍中的宠物
  40.     acca = []
  41.     for i in $game_party.actors
  42.       acca += i.kds_baby
  43.     end
  44.     # 限制处理
  45.     if @active_battler.kds_baby.size >= 8  # 测试用,身上8只宠物【仓库满】
  46.       @active_battler.damage = "!c[4]" + @active_battler.name + "!c[6]携带的宠物已满!无法继续捕捉!c[2]" + en.name+"!c[6]!"
  47.       @phase4_step = 3
  48.       return
  49.     elsif @active_battler.sp < BUZHUO_BABY::COMP     #【MP不足】
  50.       @active_battler.damage = "!c[4]" + @active_battler.name + "!c[6]的!c[1]MP!c[6]不足!无法捕捉!c[2]" + en.name+"!c[6]!"
  51.       @phase4_step = 3
  52.       return
  53.     elsif BUZHUO_BABY::LV[en.id] > @active_battler.level#【等级不够】
  54.       @active_battler.damage = "!c[4]" + @active_battler.name + "!c[6]的等级低于!c[2]"+BUZHUO_BABY::LV[en.id].to_s+"!c[6]无法捕捉!c[2]" + en.name+"!c[6]!"
  55.       @phase4_step = 3
  56.       return
  57.     elsif BUZHUO_BABY::UNENID.include?(en.id)#【无效目标】
  58.       @active_battler.damage = "!c[4]" + @active_battler.name + "!c[6]无法捕捉该目标!c[2]" + en.name+"!c[6]!"
  59.       @phase4_step = 3
  60.       return
  61.     elsif acca.include?(BUZHUO_BABY::ACID[en.id])#【无效目标】
  62.       @active_battler.damage = "!c[2]" + en.name + "!c[6]已经在队伍中的召唤兽!"
  63.       @phase4_step = 3
  64.       return
  65.     end
  66.     # 突破限制捕捉处理
  67.     if rand(10 + 100 * en.hp / en.maxhp) < BUZHUO_BABY::PC[@active_battler.id]
  68.       @active_battler.damage = "!c[6]恭喜!c[4]"+@active_battler.name+"!c[6]成功捕获了!c[2]"+en.name+"!c[6]作为召唤兽!"
  69.  
  70.       #获得宠物
  71.   #    @active_battler.kds_baby.push(BUZHUO_BABY::ACID[en.id])
  72.   #    $game_actors[BUZHUO_BABY::ACID[en.id]].zhuren = @active_battler.id
  73.  
  74.       #获得宠物
  75.       BUZHUO_BABY::ACID[en.id].each do |i|
  76.         unless @active_battler.kds_baby.include?(i)
  77.           @active_battler.kds_baby.push(i)
  78.           $game_actors[i].zhuren = @active_battler.id
  79.           break
  80.         end
  81.       end      
  82.  
  83.  
  84.       # 在update_phase4_step5中让其死亡,被捕捉标志
  85.       en.damage = "捕捉"
  86.     else
  87.       @active_battler.damage = "!c[2]" + en.name+"!c[6]十分机智的逃脱了!c[4]"+@active_battler.name+"!c[6]的捕捉!"
  88.     end
  89.   end

作者: qq634488405    时间: 2022-5-20 22:33
黑米馒头 发表于 2022-5-20 17:32
应该是上次卡了,问题没打全,现在写全了,你帮我看看

意思是捕捉8号后添加到$game_party,放在80-100的空位?
作者: 黑米馒头    时间: 2022-5-20 22:38
qq634488405 发表于 2022-5-20 22:33
意思是捕捉8号后添加到$game_party,放在80-100的空位?


是的,8号是个例子,后面还要设置好多宠物,因为我这个宠物系统,里面的宠物等同于角色,同个ID的宠物又不能同时出现在2个以上的角色身上,所以只能弄得这么复杂,弄多点数组,看起来好像捕捉敌人可以捕捉好多次一样~
作者: qq634488405    时间: 2022-5-21 00:50
黑米馒头 发表于 2022-5-20 22:38
是的,8号是个例子,后面还要设置好多宠物,因为我这个宠物系统,里面的宠物等同于角色,同个ID的宠物又 ...

那这个捕捉系统要大改,ACID单对多ACID[en.id]的类型是数组,而原脚本ACID[en.id]是数字,所有用到这个的地方都要改
作者: 黑米馒头    时间: 2022-5-21 06:51
本帖最后由 黑米馒头 于 2022-5-21 06:54 编辑
qq634488405 发表于 2022-5-21 00:50
那这个捕捉系统要大改,ACID单对多ACID[en.id]的类型是数组,而原脚本ACID[en.id]是数字,所有用到这个的 ...


RUBY 代码复制
  1. # 捕捉系统设置
  2. module BUZHUO_BABY
  3.  
  4.   UNENID = [1,2,9,10] # 不可以捕捉的敌人id
  5.   COMP = 20 # 消耗MP
  6.  
  7.   LV = [] # 敌人等级  LV[敌人ID] = 等级
  8.   LV[1] = 1  
  9.   LV[2] = 1   
  10.   LV[8] = 1
  11.   LV[9] = 10
  12.   LV[10] = 1
  13.  
  14.   PC = [] # 成功概率 PC[角色id] = 概率
  15.   PC[1] = 100
  16.   PC[2] = 100
  17.   PC[3] = 100
  18.   PC[4] = 100
  19.   PC[5] = 100
  20.  
  21.   ANI = [] # 动画   ANI[角色id] = [我方动画id, 敌方动画id]
  22.   ANI[1] = [136, 69]
  23.   ANI[2] = [70, 69]
  24.   ANI[3] = [70, 69]
  25.   ANI[4] = [70, 69]
  26.   ANI[5] = [70, 69]
  27.  
  28.   ACID = [] # 敌人对应相应的角色  ACID[敌人id] = 角色id
  29.  
  30.   ACID[8] = 51
  31.  
  32. end



整个捕捉系统就这两段脚本
作者: qq634488405    时间: 2022-5-21 09:42
    elsif acca.include?(BUZHUO_BABY::ACID[en.id])#【无效目标】
      @active_battler.damage = "!c[2]" + en.name + "!c[6]已经在队伍中的召唤兽!"
      @phase4_step = 3
      return
    end
这一段的判断条件改一下就好,用数组交集运算判断是否有重复
作者: 黑米馒头    时间: 2022-5-21 09:47
qq634488405 发表于 2022-5-21 09:42
elsif acca.include?(BUZHUO_BABY::ACID[en.id])#【无效目标】
      @active_battler.damage = "!c[2] ...

大佬帮忙改下吧,自己表示看都看不太懂
作者: qq634488405    时间: 2022-5-21 09:56
elsif acca & BUZHUO_BABY::ACID[en.id] != nil
作者: 黑米馒头    时间: 2022-5-21 10:11
qq634488405 发表于 2022-5-21 09:56
elsif acca & BUZHUO_BABY::ACID[en.id] != nil

  #  elsif acca.include?(BUZHUO_BABY::ACID[en.id]) #【无效目标】
    elsif acca & BUZHUO_BABY::ACID[en.id] != nil
      @active_battler.damage = "!c[2]" + en.name + "!c[6]已经在队伍中的召唤兽!"
      @phase4_step = 3
      return
    end
这样不行,捕捉的时候,直接显示 “已经在队伍中的召唤兽", 然后敌人也捕捉不了
作者: qq634488405    时间: 2022-5-21 10:13
这个是有任意一个对应ID在队伍就不行,要全部都在队伍就不能捕捉那就是
elsif acca & BUZHUO_BABY::ACID[en.id] == BUZHUO_BABY::ACID[en.id]
作者: 黑米馒头    时间: 2022-5-21 10:43
qq634488405 发表于 2022-5-21 10:13
这个是有任意一个对应ID在队伍就不行,要全部都在队伍就不能捕捉那就是
elsif acca & BUZHUO_BABY::ACID[en ...

这样能捕捉了,可是当两个队友同时开始捕捉的时候,只有1个队伍进宠物,而且是同一个ID的宠物,是不是因为第一个数组里的宠物被捕捉了,后面那个宠物没有填补上去?
作者: qq634488405    时间: 2022-5-21 11:08
本帖最后由 qq634488405 于 2022-5-21 14:55 编辑

原来的判断是单个角色单独判断是否有ID
#获得宠物
BUZHUO_BABY::ACID[en.id].each do |i|
  unless acca.include?(i)
…………
作者: 黑米馒头    时间: 2022-5-21 11:22
本帖最后由 黑米馒头 于 2022-5-21 13:23 编辑
qq634488405 发表于 2022-5-21 11:08
原来的判断是单个角色单独判断是否有ID
#获得宠物
BUZHUO_BABY::ACID[en.id].each do |i|


报错了..

还发现1个Bug,

正常情况
当数组里的ID全被捕捉了,你在次捕捉这个敌人显示不能捕捉了【这一点正常了】,

Bug
当把宠物放生了,在次捕捉的时候竟然可以无限捕捉?
作者: qq634488405    时间: 2022-5-21 16:44
改成acca还有BUG?
作者: 黑米馒头    时间: 2022-5-21 18:20
本帖最后由 黑米馒头 于 2022-5-21 21:28 编辑
qq634488405 发表于 2022-5-21 16:44
改成acca还有BUG?

Bug:现在数组里的宠物全在队伍里了,也能继续捕捉

    # 已经在队伍的情况
      elsif acca & BUZHUO_BABY::ACID[en.id] == BUZHUO_BABY::ACID[en.id]
      @active_battler.damage = "!c[2]" + en.name + "!c[6]捕捉数量已达上限!"
      @phase4_step = 3
      return
    end

     #获得宠物
      BUZHUO_BABY::ACID[en.id].each do |i|
        unless acca.include?(i)
          @active_battler.kds_baby.push(i)
          $game_actors.zhuren = @active_battler.id
          break
        end
      end      

      
我大概排查出BUG了,按照上面这样修改,战斗的时候除非数组里的宠物全在1个队员身上,你在继续捕捉才会显示无法继续捕捉了,
不然的话就会出现能无限捕捉的情况,举例:数组设置3只宠物,角色1身上捕捉了1只,角色2身上捕捉了2只,那么上面的判定就没用了,
你可以无限捕捉,除非角色1或角色2其中一个身上有这3只宠物,那么上面的判定才生效,你继续捕捉会显示 捕捉数量已达到上限。
elsif acca & BUZHUO_BABY::ACID[en.id] == BUZHUO_BABY::ACID[en.id]
这句是不是 数组里的宠物数量  =  单个角色身上宠物的数量?
我的理解是,应该改成 ,数组里宠物的数量 = 队伍里宠物的数量
作者: qq634488405    时间: 2022-5-21 23:45
黑米馒头 发表于 2022-5-21 18:20
Bug:现在数组里的宠物全在队伍里了,也能继续捕捉

    # 已经在队伍的情况

acca是所有角色宠物总集合。acca & BUZHUO_BABY::ACID[en.id]返回的是角色宠物总集合与敌人对应ID的交集,这个交集与BUZHUO_BABY::ACID[en.id]相同意味着acca包含所有这个敌人对应的ID,所以要显示捕捉到上限。而获得宠物那里是取这个敌人对应的ID,依次判断acca中是否含有这个ID,没有就加入宠物
作者: 黑米馒头    时间: 2022-5-22 00:22
qq634488405 发表于 2022-5-21 23:45
acca是所有角色宠物总集合。acca & BUZHUO_BABY::ACID[en.id]返回的是角色宠物总集合与敌人对应ID的交集 ...

这是范例,你进去看下,用1个角色捕捉宠物的话,捕捉玩3只就不能捕捉了,但是你如果用别的角色去捕捉,就不行了

捕捉宠物.rar

1.35 MB, 下载次数: 2


作者: 黑米馒头    时间: 2022-5-22 21:49
解决了 谢谢
作者: qq634488405    时间: 2022-5-22 23:13
黑米馒头 发表于 2022-5-22 00:22
这是范例,你进去看下,用1个角色捕捉宠物的话,捕捉玩3只就不能捕捉了,但是你如果用别的角色去捕捉,就 ...

知道原因了,因为不同角色捕捉的顺序不同,导致即便抓满了acca & BUZHUO_BABY::ACID[en.id]的结果顺序不唯一,所以== BUZHUO_BABY::ACID[en.id]时不一定为true,改成(acca & BUZHUO_BABY::ACID[en.id]).size == BUZHUO_BABY::ACID[en.id].size就好了
作者: 黑米馒头    时间: 2022-5-23 00:19
本帖最后由 黑米馒头 于 2022-5-23 00:20 编辑
qq634488405 发表于 2022-5-22 23:13
知道原因了,因为不同角色捕捉的顺序不同,导致即便抓满了acca & BUZHUO_BABY::ACID[en.id]的结果顺序不 ...


上面这个判定完美解决了,非常感谢,
    #【等级不够】  
    elsif BUZHUO_BABY::LV[en.id] > @active_battler.level
这句好像是敌人等级比角色等级高级不能捕捉,但是每个都设置等级太麻烦了,能不能把条件在改一下,改成 敌人等级>角色等级不可以捕捉,如果敌人没设置等级也可以捕捉,因为想偷懒一下,不然每个怪都设置等级太繁琐了,好几百个怪...... 我现在在敌人等级库里没设置敌人等级的话,一捕捉就报错
作者: qq634488405    时间: 2022-5-23 09:38
elsif BUZHUO_BABY::LV[en.id] !=nil and BUZHUO_BABY::LV[en.id] > @active_battler.level
作者: 黑米馒头    时间: 2022-5-23 21:04
完美解决




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