查看: 1310|回复: 5

[有事请教] 关于覆盖被装备赋予的自动状态及延伸问题

[复制链接]

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

发表于 2025-8-16 20:54:08 | 显示全部楼层 |阅读模式

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

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

×
首先,之前提问过的【如何让一个状态能够覆盖被装备赋予的自动状态】
虽然成功得到了一串代码,然而这串代码却衍生了其他问题
[pre lang="ruby"]class Game_Battler
def states
    s=@states.clone
    for a in s
     for i in $data_states[a].minus_state_set
     s.delete(i) if s.include?(i)
   end
   end
    return s
    end
  end
end[/pre]
1,这并非覆盖了装备赋予的状态,而是让装备赋予的状态不显示,但效果还在。关于这点,我其实想到了用事件解决的方法(虽然很复杂)
2,关于状态和显示动画不同步
首先,角色赋予了比坚盾更高一级的镜盾状态
之后,镜盾消失,变回坚盾,此时可以看到,状态动画已经切换回坚盾的状态动画了,然而状态栏里的名字依然还是镜盾,必须再次行动后,状态名才被改回来

关于这点,我也尝试自行解决
具体为在Window_BattleStatus加了检测状态变化并刷新
[fold=检测状态变化并刷新][pre lang="ruby"]#==============================================================================
# ■ Window_BattleStatus
#------------------------------------------------------------------------------
#  显示战斗画面同伴状态的窗口。
#==============================================================================

class Window_BattleStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 320, 640, 160)
    self.contents = Bitmap.new(width - 32, height - 32)
    @level_up_flags = [false, false, false, false]
    # 记录初始状态,用于后续对比
    @last_states = $game_party.actors.map { |actor| actor.states.clone }
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    super
  end
  #--------------------------------------------------------------------------
  # ● 设置升级标志
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def level_up(actor_index)
    @level_up_flags[actor_index] = true
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.actors.size
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      actor_x = i * 160 + 4
      draw_actor_name(actor, actor_x, 0)
      draw_actor_hp(actor, actor_x, 32, 120)
      draw_actor_sp(actor, actor_x, 64, 120)
      if @level_up_flags
        self.contents.font.color = normal_color
        self.contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")
      else
        draw_actor_state(actor, actor_x, 96)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 检测状态变化并刷新
    check_state_change
    # 主界面的不透明度调整
    if $game_temp.battle_main_phase
      self.contents_opacity -= 4 if self.contents_opacity > 191
    else
      self.contents_opacity += 4 if self.contents_opacity < 255
    end
  end
  #--------------------------------------------------------------------------
  # ● 检测状态变化
  #--------------------------------------------------------------------------
  def check_state_change
    # 获取当前所有角色的状态
    current_states = $game_party.actors.map { |actor| actor.states.clone }
    # 对比上一帧状态,不同则刷新
    if @last_states != current_states
      refresh
      @last_states = current_states.clone
    end
  end
end[/pre]
[/fold]
结果发现,在角色使用技能并还在播放技能动画的的时候,状态便已经被附加上了


2 (1).png
11.png
梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2025-8-17 02:11:47 | 显示全部楼层
本帖最后由 soulsaga 于 2025-8-17 02:13 编辑

这并非覆盖了装备赋予的状态
而是让减号生效
你这个只是动画刷新时机跟状态不同
状态持续3回合实际要第4回合你懂的吧?
回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

 楼主| 发表于 2025-8-19 12:55:15 | 显示全部楼层
1,又测试了一遍,除了没有绕过系统检测外,确实不是叠加,这样的话只要改一下设置应该不是问题
1.png
2,如果我不改Window_BattleStatus的话,就会出现这样的问题
但改了之后又会在播放技能动画之前就赋予状态
2.png
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2025-8-19 15:51:00 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2025-8-20 10:25 编辑

原因:  动画只是表演给你看的, 战斗其实在你按下确定键的时候就已经结束了, 所以直接搞"源头" 当然会"不同步啦"

要让自动状态和默认一样处理只要改动几个地方就行了
  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?(i) ;
  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.     old_remove(state_id, force = false)
  31.     return if self.is_a?(Game_Enemy)
  32.     7.times{|i| eval("update_auto_state(nil,$data_armors[@armor#{i+1}_id])")}
  33.   end
  34. end

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


把它塞到main前即可
回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

 楼主| 发表于 2025-8-19 19:56:52 | 显示全部楼层
灯笼菜刀王 发表于 2025-8-19 15:51
原因:  动画只是表演给你看的, 战斗其实在你按下确定键的时候就已经结束了, 所以直接搞"源头" 当然会"不同 ...

感谢,很接近了,仅仅只会在状态回合交替且实行普通攻击的瞬间会出现不同步,可以说基本可以忽略了
然而,却还是衍生了新的问题
如果角色装备一个带有坚盾的装备后再卸下来,坚盾不会消失
11.png

点评

更新了下脚本再试试, 你说平A不同步, 搜索update_auto_state, 把除了 def equip 和 def setup 下面外, 其他位置的update_auto_state都删除  发表于 2025-8-20 10:25
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部