设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

覆盖自动状态的问题,状态栏覆盖了但状态的效果依旧生效

查看数: 820 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-11-19 00:08

正文摘要:

本来已经问过2次了,不应该问第3次,不过确实出现了这样的问题 在此直接放入工程 下面是关键脚本(虽然上传了工程,但还是放一下吧) 状态覆盖 RUBY 代码复制class Game_Battlerdef stat ...

回复

灯笼菜刀王 发表于 2025-11-25 10:37:11
本帖最后由 灯笼菜刀王 于 2025-11-25 10:44 编辑

原因, 你这个CP脚本为了在状态窗描绘CP槽, 是需要一直刷新状态窗, 但是因为"战斗过程是先进行结算再表演动画", 如果一直刷新状态窗,那你就会看到血先扣了再挨打, 所以状态窗需要在特定的时候才刷新面板数值显示

默认情况是在行动前和行动后刷新一次, 但是这玩意逻辑不同, 什么时候刷新要看作者是怎么设计执行逻辑的, 和你预想的不同很正常

我不想去理解作者怎么设计逻辑的, 所以直接暴力做法, 解除的时候强制刷新窗口

在 Game_Battler 2 里找到   def remove_states_auto 这个函数(219行附近) ,然后把这段内容替换成下面的
  1.   def remove_states_auto
  2.     yes = false
  3.     for i in @states_turn.keys.clone
  4.       if @states_turn[i] > 0
  5.         @states_turn[i] -= 1
  6.       elsif rand(100) < $data_states[i].auto_release_prob
  7.         remove_state(i) ;yes = true
  8.       end
  9.     end
  10.     $scene.instance_variable_get(
  11.     :@status_window).xrxs_bp1_refresh if yes and $game_temp.in_battle
  12.   end
复制代码


这样就可以解决刷新问题, 不过可能会带来其他后果,毕竟这违背了作者特意搞的"特定情况下才会刷新状态窗"的设计, 这咱就不管了,一堆陈年烂屁股擦不完, 真碰到了, 两害相权取其轻吧 (新建个工程把它复制回去就可以还原了)

点评

感谢,确实同步了  发表于 2025-11-27 07:34

评分

参与人数 1+1 收起 理由
无忧谷主幻 + 1 认可答案

查看全部评分

灯笼菜刀王 发表于 2025-11-24 09:32:28
本帖最后由 灯笼菜刀王 于 2025-11-24 09:51 编辑


▲这个是你自己的问题,  这里限制了只有"普通攻击同伴 或者 敌人行动" 时才会调用自动解除状态, 普通攻击敌人和不行动时都不调用, 摊手

我不知道你这样写是要干嘛, 想对无法控制的状态都有效,  那把 == 4 改成 > 1 就行了, 当然, 之后会造成啥其他问题咱可不管了, 毕竟CTB这类脚本在回合判断上就是一堆历史遗留问题, 改起来还不如我重新写一个
无忧谷主幻 发表于 2025-11-23 03:56:42

关于装备方面的覆盖确实解决了,但是又引申出新的问题:常规赋予的状态,即使限定了状态持续的回合数,但无论经过多少回合都无法解除(话说之前是不是遇到过同样的问题?)
灯笼菜刀王 发表于 2025-11-21 09:40:16
  1. class Game_Battler
  2.   def add_state(state_id, force = false)
  3.     return if (st=$data_states[state_id]).nil?
  4.     return if @states.any?{|i| $data_states[i].minus_state_set.include?(
  5.     state_id) and !st.minus_state_set.include?(i)}
  6.     if !state?(state_id)
  7.       @states.push(state_id)
  8.       @hp = 0 if st.zero_hp
  9.       1.step($data_states.size - 1,1){|i| a = i + 1 ;
  10.       add_state(a) if st.plus_state_set.include?(a) ;
  11.       remove_state(a,true) if st.minus_state_set.include?(a)}
  12.       @states.sort! do |a, b| ;state_a = $data_states[a] ;state_b = $data_states[b]
  13.         if state_a.rating > state_b.rating ;-1
  14.         elsif state_a.rating < state_b.rating ;+1
  15.         elsif state_a.restriction > state_b.restriction ;-1
  16.         elsif state_a.restriction < state_b.restriction ;+1
  17.         else ;a <=> b
  18.         end
  19.       end
  20.     end
  21.     @states_turn[state_id] = -1 if force
  22.     @states_turn[state_id] = st.hold_turn if @states_turn[state_id] != -1
  23.     @current_action.clear if !movable?
  24.     @hp = [@hp, self.maxhp].min
  25.     @sp = [@sp, self.maxsp].min
  26.   end
  27.   
  28.   alias old_remove remove_state
  29.   def remove_state(state_id, force = false)
  30.     return if !state?(state_id)
  31.     old_remove(state_id, force)
  32.     return if self.is_a?(Game_Enemy)
  33.     7.times{|i| eval("update_auto_state(nil,$data_armors[@armor#{i+1}_id])")}
  34.   end
  35. end

  36. class Game_Actor < Game_Battler
  37.   def equip(equip_type, id)
  38.     if equip_type == 0
  39.       return unless id == 0 or $game_party.weapon_number(id) > 0
  40.       $game_party.gain_weapon(@weapon_id, 1) ;@weapon_id = id
  41.       $game_party.lose_weapon(id, 1)
  42.     else
  43.       return unless id == 0 or $game_party.armor_number(id) > 0
  44.       a = eval("@armor#{equip_type}_id")
  45.       $game_party.gain_armor(a, 1) ; eval("@armor#{equip_type}_id = #{id}")
  46.       $game_party.lose_armor(id, 1)
  47.     end
  48.     @states_turn.delete_if{|a,b| b < 0}
  49.     @states.delete_if{|i| !@states_turn.include?(i)}
  50.     7.times{|i| eval("update_auto_state(nil,$data_armors[@armor#{i+1}_id])")}
  51.   end
  52. end
复制代码


重新复制脚本吧
无忧谷主幻 发表于 2025-11-21 04:00:20
灯笼菜刀王 发表于 2025-11-19 09:54
看了看, 第二个脚本写法和我好像....
原来就是我写的

测试了一下,不行,角色还是会不受控制行动

另外如果删掉第一个脚本,连遮盖状态都无法遮盖了
灯笼菜刀王 发表于 2025-11-19 09:54:02
本帖最后由 灯笼菜刀王 于 2025-11-19 10:08 编辑

看了看, 第二个脚本写法和我好像....
原来就是我写的

要修改两个地方
第10行,括号里的 i 要改成 a
然后29行下面增加一句 return if !state?(state_id)

第一个脚本删掉, 没任何意义, 不改动@states就是面子工程, 对实际效果没影响

-------------分割线-----------------------------------------------

其实, 如果想要 "防具也可以免疫被动状态"

那全局搜索 def update_auto_state(old_armor, new_armor)
然后在 if new_armor != nil and new_armor.auto_state_id != 0  这句下面加一句
return if state_guard?(new_armor.auto_state_id)

这样, 自动状态就和普通状态一样, 在防具的"状态防御"那打钩就可以免疫掉了
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 17:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表