查看: 2405|回复: 12

[有事请教] 如何添加无敌状态也无法免疫的状态,以及状态变化解除无敌

[复制链接]

素材区好人

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

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

发表于 2025-8-31 07:03:13 | 显示全部楼层 |阅读模式

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

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

×
想制作一个不受伤害的状态,于是找到了无敌状态脚本,结果发现了2个问题
1,这个状态连不能抵抗的状态都无法添加,这样想靠状态法做一些事情都做不了(毕竟状态法的前提是先添加上状态)
2,由于这个状态太无敌,我又制作了一个可以解除无敌状态的技能,结果发现根本行不通,即使在状态变化勾上减号也无法解除对方的无敌状态(其实只要解决1,便可以利用状态法解决这个问题,当然会很麻烦)
1.png
[pre lang="ruby"]#_/  ◆无敌状态 - KGC_Invincible◆
#_/----------------------------------------------------------------------------
#_/ 在状态中设置个“无敌”二字的状态即可使用。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

$imported = {} if $imported == nil
$imported["Invincible"] = true

if $game_special_states == nil
  $game_special_states = {}
  $data_states = load_data("Data/States.rxdata")
end
# 無敵状態ステートIDa取得
state = $data_states.compact.find { |s| s.name == "回避" }
$game_special_states["invincible"] = state != nil ? state.id : 0

#==============================================================================
# ■ Game_Battler (分割定義 2)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● ステート [無敵] 判定
  #     act : 処理対象
  #--------------------------------------------------------------------------
  def invincible?(act = nil)
    # ステート[無敵]が付加されている場合
    if self.states.include?($game_special_states["invincible"])
      # 処理対象で分岐
      case act
      when RPG::Skill
        return true if act.scope == 1 || act.scope == 2
      when RPG::Item
        return true if act.scope == 1 || act.scope == 2
      when nil
        return true
      end
    end
    return false
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler (分割定義 3)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #--------------------------------------------------------------------------
  alias attack_effect_KGC_Invincible attack_effect
  def attack_effect(attacker)
    # 無敵状態の場合
    if self.invincible?
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return attack_effect_KGC_Invincible(attacker)
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_Invincible skill_effect
  def skill_effect(user, skill)
    # 無敵状態の場合
    if self.invincible?(skill)
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return skill_effect_KGC_Invincible(user, skill)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの効果適用
  #--------------------------------------------------------------------------
  alias item_effect_KGC_Invincible item_effect
  def item_effect(item)
    # 無敵状態の場合
    if self.invincible?(item)
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return item_effect_KGC_Invincible(item)
  end
end[/pre]
梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2025-8-31 14:00:13 | 显示全部楼层
这个状态一点也不无敌呀,如果自己有无敌状态的话也可以自己给自己投毒的,只是敌人没法给你投毒 XD
[pre lang="ruby"]class Game_Battler
  def add_state_nonresistance(target,item)
    nonresistance = item.plus_state_set.select {|id| $data_states[id].nonresistance}
    target.states_plus nonresistance
  end
end[/pre]
插入上面的脚本,然后在主楼放的脚本中直接写入红色字体的脚本即可实现遇到无法抵抗的状态时会无视无敌状态的存在(但仅仅会附加无法抵抗的状态,不会造成伤害或附加非无法抵抗的状态)
alias attack_effect_KGC_Invincible attack_effect
  def attack_effect(attacker)
    # 無敵状態の場合
    if self.invincible?
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      
      add_state_nonresistance(self,$data_weapons[attacker.weapon_id])
      
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return attack_effect_KGC_Invincible(attacker)
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_Invincible skill_effect
  def skill_effect(user, skill)
    # 無敵状態の場合
    if self.invincible?(skill)
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      
      add_state_nonresistance(self,skill)
      
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return skill_effect_KGC_Invincible(user, skill)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの効果適用
  #--------------------------------------------------------------------------
  alias item_effect_KGC_Invincible item_effect
  def item_effect(item)
    # 無敵状態の場合
    if self.invincible?(item)
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      
      add_state_nonresistance(self,item)
      # 偽を返す
      return false
    end

    # 元の処理を実行
    return item_effect_KGC_Invincible(item)
  end
笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

素材区好人

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

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

 楼主| 发表于 2025-8-31 22:55:56 | 显示全部楼层
魔法丶小肉包 发表于 2025-8-31 14:00
这个状态一点也不无敌呀,如果自己有无敌状态的话也可以自己给自己投毒的,只是敌人没法给你投毒 XD
class  ...

呃,这样的话其他增益状态都无法附加上了
1.png
如果直接施加无敌状态,有时候就会报错(也有时候暂时不报错,等施加另一个增益状态时报错)
2.png
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2025-9-1 02:04:00 | 显示全部楼层
照道理这个可能用事件就能解除
回复

使用道具 举报

素材区好人

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

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

 楼主| 发表于 2025-9-1 02:49:07 | 显示全部楼层
soulsaga 发表于 2025-9-1 02:04
照道理这个可能用事件就能解除

如果使用是单体技能,那么系统并不知道你刚刚攻击的是谁
至于靠状态法判断,首先要挂的上状态
回复

使用道具 举报

梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2025-9-1 15:22:36 | 显示全部楼层
无忧谷主幻 发表于 2025-8-31 22:55
呃,这样的话其他增益状态都无法附加上了

如果直接施加无敌状态,有时候就会报错(也有时候暂时不报错, ...

忘记考虑角色不拿武器的情况了,改成这样
[pre lang="ruby"]class Game_Battler
  def add_state_nonresistance(target,item)
    return unless item
    nonresistance = item.plus_state_set.select {|id| $data_states[id].nonresistance}
    target.states_plus nonresistance
  end
end[/pre]
笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

素材区好人

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

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

 楼主| 发表于 2025-9-2 06:11:36 | 显示全部楼层
魔法丶小肉包 发表于 2025-9-1 15:22
忘记考虑角色不拿武器的情况了,改成这样
class Game_Battler
  def add_state_nonresistance(target,ite ...

还是一样,其他状态上不去,回避出错,不过这次是111行
2345截图20250902060450.png
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2025-9-2 06:39:53 | 显示全部楼层
[pre lang="ruby"]class Scene_Battle  
  attr_accessor :active_battler
  attr_accessor :target_battlers
end[/pre]

插入这个后
在事件用$scene.target_battlers[0]
就是你单体攻击的目标
回复

使用道具 举报

素材区好人

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

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

 楼主| 发表于 2025-9-2 07:10:12 | 显示全部楼层
soulsaga 发表于 2025-9-2 06:39
class Scene_Battle  
  attr_accessor :active_battler
  attr_accessor :target_battlers

然后如何用条件分歧给刚刚攻击的目标附加或解除状态?
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2025-9-2 07:38:43 | 显示全部楼层
本帖最后由 soulsaga 于 2025-9-2 07:59 编辑

其实只要照抄默认的脚本过来就可以了[

quote]无忧谷主幻 发表于 2025-9-2 07:10
然后如何用条件分歧给刚刚攻击的目标附加或解除状态?[/quote]

[pre lang="ruby"]#_/  ◆无敌状态 - KGC_Invincible◆
#_/----------------------------------------------------------------------------
#_/ 在状态中设置个“无敌”二字的状态即可使用。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

$imported = {} if $imported == nil
$imported["Invincible"] = true

if $game_special_states == nil
  $game_special_states = {}
  $data_states = load_data("Data/States.rxdata")
end
# 無敵状態ステートIDa取得
state = $data_states.compact.find { |s| s.name == "回避" }
$game_special_states["invincible"] = state != nil ? state.id : 0

#==============================================================================
# ■ Game_Battler (分割定義 2)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● ステート [無敵] 判定
  #     act : 処理対象
  #--------------------------------------------------------------------------
  def invincible?(act = nil)
    # ステート[無敵]が付加されている場合
    if self.states.include?($game_special_states["invincible"])
      # 処理対象で分岐
      case act
      when RPG::Skill
        return true if act.scope == 1 || act.scope == 2
      when RPG::Item
        return true if act.scope == 1 || act.scope == 2
      when nil
        return true
      end
    end
    return false
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler (分割定義 3)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #--------------------------------------------------------------------------
  alias attack_effect_KGC_Invincible attack_effect
  def attack_effect(attacker)
    # 無敵状態の場合
    if self.invincible?
      effective=true
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      effective |= states_plus(attacker.plus_state_set)
      effective |= states_minus(attacker.minus_state_set)
      return effective
    end

    # 元の処理を実行
    return attack_effect_KGC_Invincible(attacker)
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_Invincible skill_effect
  def skill_effect(user, skill)
    # 無敵状態の場合
    if self.invincible?(skill)
      effective=true
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      return effective
    end

    # 元の処理を実行
    return skill_effect_KGC_Invincible(user, skill)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの効果適用
  #--------------------------------------------------------------------------
  alias item_effect_KGC_Invincible item_effect
  def item_effect(item)
    # 無敵状態の場合
    if self.invincible?(item)
      effective=true
      # ダメージに "Miss" を設定
      self.damage = "Miss"
      # クリティカルフラグをクリア
      self.critical = false
      effective |= states_plus(item.plus_state_set)
      effective |= states_minus(item.minus_state_set)
      return effective
    end

    # 元の処理を実行
    return item_effect_KGC_Invincible(item)
  end
end[/pre]

之后给攻击技能解除状态打勾就行
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部