查看: 1354|回复: 59

[有事请教] 几个脑洞

[复制链接]
梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
发表于 2026-4-29 12:18:38 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 y967 于 2026-4-29 18:24 编辑

我有很多脑洞由于脚本废物,从而搁置了,技术大牛总是令人神往

1,状态或装备无视防御
需要一个装备,然后无视魔防50%,想做一个神通天赋,可以装备,或者带状态也行,物防就不用了。

2,败者组荣耀
就来个败者组荣耀好了,比如不破防就加攻击,或者打不够10%就加攻击,这种弱者神通天赋保命技能,当然不能无限加,上限加到100攻击力

3,封印和解除封印
BOSS被封印技能后如何自救,被硬控只能小怪救,封印技能后自救,即给自己一个标记,当被封印技能后有一次50%机会突破封印,完成自救
主角同理,当然这里就不用了,因为有队友,队友死了怎么办,那就团灭。

4,回合数满就暴走
这个简单,10回合打不掉半血就加50%攻击,败者食尘,败者翻身,难为了。新手期不好过,为免弃坑。

5,回合加攻击/防御
降低难度的方法当然也很多,每5个回合就加一点攻击或防御,不破防的日子很难过的,破防就几下解决了,平衡不容易做的

6,抽蓝
也可以是抽蓝或BOSS防御一次就减攻击,减防御,反正在队伍里都可以设置,可以用脚本,调戏BOSS

7,隐身
替身有了,隐身呢,隐身可以攻击,敌人几回合不能攻击我,如聋如哑

8,舍身精灵
替身娃娃,代替自己死一次,也可以是背包物品

9,守护精灵
死之前一击恢复满血,单次战斗只能触发一次,也可以和上面合并
退隐....

素材区好人

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

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

发表于 2026-4-29 20:04:54 | 显示全部楼层
本帖最后由 无忧谷主幻 于 2026-4-29 20:19 编辑

问的有些多了,我先从好回答的开始回答吧
3,纯事件就能做
1.png
4,依旧算纯事件吧
在条件分歧中输入
[pre lang="ruby"]$game_troop.enemies[0] && $game_troop.enemies[0].hp > $game_troop.enemies[0].maxhp * 0.5[/pre]
敌人数组从 0 开始计数的
​1号敌人 →  enemies[0] 
​2号敌人 →  enemies[1]
(注意区分战斗和回合,战斗是满足条件也只执行一次,回合是满足挑战每回合执行一次)
2.png
5,我们依旧用变量来解决
3.png
之前需要带有固定状态才生效,现在取消掉
[pre lang="ruby"]# ● 获取力量
def str
  n = [[base_str + @str_plus, 1].max, 999].min
  for i in @states
    n *= $data_states.str_rate / 100.0
  end
  # 力量固定增加变量1的数值
  n += $game_variables[1]
  n = [[Integer(n), 1].max, 999].min
  return n
end[/pre]
6,抽蓝直接在公共事件中选择增减敌人SP就好
7,这个应该有人做过了吧,请善用搜索
我把自用的给你吧,不知道你能不能用
[fold=嘲讽加盲点整合][pre lang="ruby"]#==============================================================================
# ▼ 嘲讽 & 盲点 状态效果扩展
#==============================================================================
# 状态 ID 设定:
#   51:嘲讽 —— 敌方单体攻击/技能/物品必定优先攻击自己
#   56:盲点 —— 敌方单体攻击/技能/物品不会将自身作为目标
#==============================================================================

module TauntBlindConfig
  TAUNT_STATE_ID = 51   # 嘲讽状态编号
  BLIND_STATE_ID = 56   # 盲点状态编号
end

#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 应用嘲讽/盲点规则
  #--------------------------------------------------------------------------
  def apply_taunt_blind_target
    action = self.current_action
    return unless action

    # 判断行动是否对敌方单体
    scope = nil
    case action.kind
    when 0  # 基本行动
      scope = 1 if action.basic == 0  # 普通攻击
    when 1  # 技能
      skill = $data_skills[action.skill_id]
      scope = skill.scope if skill
    when 2  # 物品
      item = $data_items[action.item_id]
      scope = item.scope if item
    end

    return unless scope == 1  # 仅处理单体攻击我方

    # 获取可选目标(存活角色)
    possible = $game_party.actors.select { |a| a.exist? }
    return if possible.empty?

    # 查找嘲讽角色
    taunts = possible.select { |a| a.state?(TauntBlindConfig::TAUNT_STATE_ID) }

    if taunts.empty?
      # 无嘲讽:排除盲点角色
      non_blind = possible.select { |a| !a.state?(TauntBlindConfig::BLIND_STATE_ID) }
      if non_blind.empty?
        new_target = possible[rand(possible.size)]
      else
        new_target = non_blind[rand(non_blind.size)]
      end
    else
      new_target = taunts[rand(taunts.size)]
    end

    action.target_index = new_target.index
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 帧更新
  #--------------------------------------------------------------------------
  alias taunt_blind_update_phase4_step2 update_phase4_step2
  def update_phase4_step2
    # 如果当前行动者是敌人,则在执行行动前修正目标
    if @active_battler.is_a?(Game_Enemy)
      @active_battler.apply_taunt_blind_target
    end
    # 调用原始方法
    taunt_blind_update_phase4_step2
  end
end
[/pre]
[/fold]
8&9
这个也是我之前做过的,第一个就是
https://rpg.blue/thread-498382-1-1.html
把 @hp+=1改成 @hp+=9999就好了

点评

如果有队友敌人放群攻确实比较难了,那就显示为MISS好了  发表于 2026-4-29 21:57
什么都不做,不放技能,也不治疗,行动里就有一个什么都不做的。等于瞎了  发表于 2026-4-29 21:51
无队友不攻击是指什么都不做吗?还是说不会释放攻击技能,但是会释放治疗之类的技能?还有敌人如果释放群体攻击又会怎么样?  发表于 2026-4-29 21:46
好,那4就解决了,隐身不是无敌,是敌人打不到自己,有队友打队友,没队友不攻击,就是什么都不做。可以敌人有个嗅探技能,标记自己为不能攻击  发表于 2026-4-29 21:38
通过网盘分享的文件:大雄的魔界大冒险.zip 链接: https://pan.baidu.com/s/1NCv4ibXdF_OntrJgCYYZzg?pwd=qqvk 提取码: qqvk  发表于 2026-4-29 21:35

评分

参与人数 1赞 +1 收起 理由
y967 + 1 精品文章

查看全部评分

回复

使用道具 举报

素材区好人

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

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

发表于 2026-4-29 21:44:09 | 显示全部楼层
本帖最后由 无忧谷主幻 于 2026-4-29 21:46 编辑

无敌脚本,经过soulsaga修改,已经加上可以被状态变化解除来解除无敌
[fold=无敌][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][/fold]


2我也帮你弄好了
[pre lang="ruby"]if self.damage == 0 && $game_variables[1] < 100
  $game_variables[1] += 1
end[/pre]
只有伤害等于0(不破防)变量才会增加,且增加的数值不会超过100
之后代入即可

点评

不错,非常美妙,技术大佬总是令人敬仰  发表于 2026-4-30 17:22
1个G呢,刚下完,晚上我去研究下  发表于 2026-4-30 16:45
工程中不是已经有了吗?实在不行,把整段脚本都复制进去,或者我的游戏工程中也有类似的,不过是直接执行公共事件  发表于 2026-4-30 15:44
记不住啊,脚本那么难学呢 ,为什么记不住呢,需要肾气。  发表于 2026-4-30 07:09
抹去变量我之前也教过你,和明雷暗雷没关系,战斗结束时自动触发,三个位置分别代表胜利,失败,逃跑  发表于 2026-4-29 22:14

评分

参与人数 1赞 +1 收起 理由
y967 + 1 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 11:12:37 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2026-4-30 11:27 编辑

1, 直接在公式里判断攻方持有对应的状态, 然后让防御减半就行了

找到 power -= self.mdef * skill.mdef_f / 200  这句
改成 power -= (user.state?(10086) ? self.mdef / 2 : self.mdef) * skill.mdef_f / 200

涉及战斗公式方面全可以这样改, 你这些脑洞大部分都是在公式里增加判断, 然后改变某个参数值就可以实现了


--------想实现脑洞, 对脚本小幅度修改是必备的技能---

更高级的做法, 开放式的设置方式
未标题-1.jpg
未标题-2.jpg
这样就可以持有多种比例的词条/被动了, 笑



点评

看起来我还要学习演出效果了,词条,感觉和大佬的距离太遥远了,不是我能理解的存在。  发表于 2026-4-30 16:44
我所有效果 技能/装备/状态/地形/天气/阵型/支援 都是用词条实现的, 直接添加词条就可以设置对应的特效,所以会有复数效果处理的情况  发表于 2026-4-30 16:00
你还做了词条,果然辣手,就是演出效果咯,差距太大了,如果有穿甲和反穿甲,策略上就出来了,反穿甲后还来个词条,那多么嘲讽,BOSS拉轰时刻  发表于 2026-4-30 12:38
目前我有护盾,吸血,吸蓝脚本,穿甲这种高级操作,穿透别人的护盾,这种要改脚本,不属于我这种菜鸡能做的,我的护盾是伤害一半转化为扣篮  发表于 2026-4-30 12:30
好吧,对了,这是你的游戏的基操是吗,恐怖了,如果其他技能有无视防御的情况呢,比如不到50%,或者超过50%的情况  发表于 2026-4-30 12:23

评分

参与人数 1赞 +1 收起 理由
y967 + 1 我很赞同

查看全部评分

回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 11:49:26 | 显示全部楼层
3,  状态可以增加一个"自解除概率"的设置,  也就是在状态持续期间, 有一定概率自动解除, 这样就可以避免无限控的情况, 当然可以给boss特权, 自解除概率翻倍之类的

不过, XP的数据库没有备注栏, 所以要增加新的参数比较麻烦, 最终还是要抛弃数据库才能解除你的洪荒之力, 笑
目前, 就在状态名称后面备注吧,  毒<A10> 这样写, 表示 中毒后每回合有10%的概率会自行解除

  1. module RPG
  2.   class State
  3.     def name ;return @name.sub(/\<A(\d+)\>/,"") ;end
  4.     def 自解率 ;@name[/\<A(\d+)\>/] ;return $1.to_i ;end
  5.   end
  6. end
  7. class Game_Battler
  8.   def remove_states_auto
  9.     for i in @states_turn.keys.clone
  10.       if @states_turn[i] > 0
  11.         @states_turn[i] -= 1
  12.         remove_state(i) if rand(100) < $data_states[i].自解率
  13.       elsif rand(100) < $data_states[i].auto_release_prob
  14.         remove_state(i)
  15.       end
  16.     end
  17.   end
  18. end
复制代码

脚本, 把它塞到main前


-----------------
我的做法, 状态除了有自动解除概率, 还有最大持续回合, 超过这个回合就算解除概率不是100%也必定解除, 这样做那种 持续时间结束后不是100%解除的状态就有个保底了, 笑

当然, 像增加解除概率, 缩短持续回合之类的 词条/被动 也是有的, 笑

点评

设计师要会调戏BOSS,也要调戏会玩家,才是好的设计师,个人认为,笑  发表于 2026-4-30 12:43
也要给BOSS一定的反转机会的,显示策略/伪策略,笑,解除封印后来个回合满暴走,一击反杀,本来要赢了,观察玩家扭曲的表情,也是一种乐趣所在..  发表于 2026-4-30 12:41
确实如此,我发现我为什么成不了伟大的大佬了,我与大佬差一个脚本师的距离,终身不可能了。我就只能拿来用了哈  发表于 2026-4-30 12:27

评分

参与人数 1赞 +1 收起 理由
y967 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 12:14:03 | 显示全部楼层
7, 隐身, 隐身的做法不难, 判断有该状态的时候, 不把单位放入 @target_battlers 就行了

找到 if (not hp0 and actor.exist?) or (hp0 and actor.hp0?) 这句, 下面加一句 next if actor.state?(10086)  #10086为隐身状态id

这样就可以实现单体攻击的时候都不会打隐身的人(群体攻击可以)

但是, 有个表演上的问题,  就是如果我方只有一个隐身人, 那敌方除非使用群体攻击, 否则就直接结束本回合, 观感上会莫名其妙的, 笑

所以重点上是要怎么表演

我的做法~
45.gif

当然, 这就不是简单的修改就可以实现的了, 笑

点评

我草,这不是数字哥的游戏吗,这演出效果搞笑了,你还做了半透明,确实群攻很难搞到隐身,但这个透明效果已经不错了感觉  发表于 2026-4-30 12:26

评分

参与人数 1赞 +1 收起 理由
y967 + 1 精品文章

查看全部评分

回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 16:24:43 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2026-4-30 16:27 编辑

要隐身能不被群攻攻击也不难, 找到

   when 2  # 敌全体
        for actor in $game_party.actors
          if actor.exist? and !actor.state?(10086)

加上红色部分就行了

我设计的隐身能被群攻攻击到是避免隐身变成无敌, 笑,  而且我的隐身也是可以让敌人用的, 群攻则可以作为对付隐身的敌人的反制手段

46_compress.gif
单体攻击无法选择隐身的敌人

当然想让隐身也能被敌人使用, 就要改操作逻辑了,这部分就要对脚本有些理解喽

点评

个人认为群攻可以保留,如果敌人也会用隐身,那群攻也可以作为破解手段,敌人也一样,反而更有策略性,不然就没法破了  发表于 2026-4-30 16:52
我靠了,这效果刚刚的,我已经仿佛看到了BOSS隐身起来全屏的嘲讽:汝等低级生物,感受我北地大魔王的力量吧,hiahiahia......魔王终于雄起一回  发表于 2026-4-30 16:39

评分

参与人数 1赞 +1 收起 理由
y967 + 1 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 17:19:44 | 显示全部楼层
8, 救命符, 这个实现方法不难, 按无忧谷的做法来就行了 , 但是直接在脚本里处理其实并不理想, 因为这样做, 显示的是, UI显示还剩1血, 然后敌人一刀砍过来, 变成满血

尤其是给敌人使用, 玩家根本感觉不到这个效果, 毕竟默认是看不到敌人剩多少血的, 笑

所以这种触发型特效, 主要还是要考虑如何表演, 尤其是强力效果,更是要用表演来体现牛X

未标题-1.jpg
47_compress.gif

点评

你可以使用状态法来实现行动后演出 , 具体看下面  发表于 2026-4-30 19:50
还有多状态脚本,演出大概需要一个动画?RPG好像更直观一点,要添加的是技能和装备的注释可能  发表于 2026-4-30 17:33
敌人显血我有,RPG就没有这种困扰,你这个属于SLG看不到血。确实需要词条演出,对了,我应该不用了,因为血蓝还有怒气大招都是直接显示的  发表于 2026-4-30 17:31
死前加一个圣光救度动画可以伐?然后再加血,避免忽然满血莫名其妙,摸不着头脑。  发表于 2026-4-30 17:29
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-4-30 17:58:17 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2026-4-30 20:02 编辑

如果不需要表现"死而复活", 那可以直接播放个动画, 如果需要先躺下去,然后再站起来, 那就比较麻烦喽, 笑

RPG最好用状态, 毕竟如果用道具的话, 那塞99个, boss要砍多久, 笑
3.jpg
48.gif

不过直接播放动画也需要处理"公式结算在动画表演之前"的问题

我使用的方法是, 用公共事件来复活, 在hp判断为0时, 在公共事件里添加动画和加血复活, 当然, 这个添加事件我是用脚本写的, 笑

你可以用状态法, 在需要播放动画的地方先附加一个没卵用的状态(定量设置为0就不会显示了), 然后找个"行动后执行指定公共事件"的脚本,  在这个公共事件里, 每个单位都判断一次是否有对应状态, 有的话就播放动画, 然后解除状态, 这样就可以实现"行动后再播放动画了"(需要在行动后表演的都可以用这个方法)

点评

所以,只要你不"滞后显示",那不管是状态还是HP数值调整还是战斗图切换, 它都会在你按下确定的时候立刻生效,然后才是技能动画表演  发表于 2026-5-4 09:58
当你按下确定键的时候, 战斗结果就立刻得到了,之后的那些动画都是表演给你看的, 笑  发表于 2026-5-4 09:56
倒地后在battler 1里加无忧的那个不屈脚本,再在状态变化时显示一次救度动画  发表于 2026-5-1 12:00
个人感觉公共事件判断血再加动画还是有点麻烦,我记得有个脚本可以在状态改变时显示动画的,我记得有的,印象里有的,剩下要做的就是倒地后..  发表于 2026-5-1 11:57
回复

使用道具 举报

梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
 楼主| 发表于 2026-5-2 10:05:25 | 显示全部楼层
本帖最后由 y967 于 2026-5-3 07:16 编辑

10,攻击平衡球
如果我方8回合内杀不掉敌人,那么就增加攻击力,每回合增加20,这个攻击力不用抹掉了,可以带到下一场,如果四回合就干掉了,那么开始减攻击力,每次减10。

11,防御平衡球
如果不破防,已经做过了,如果敌人频繁防御,打出伤害不足200,那么开始增加我方攻击力每回合20,或者减去敌人防御力每次减掉10.

12,啃咬者幻想
敌人单次伤害超过本方1/4血的时候,造成啃咬对方20%血效果,此招对付BOSS。


13,最终杀
敌人大招杀死我方前,我方爆起怒杀对方50-70%血,然后我方死去,不留血。


14,领头羊荣耀
如果6回合我方解决不掉敌人,则搜索敌方攻击力最高的那个,减去攻击最高的敌方攻击力20,腐蚀他。还可以控制他两个回合,不管减速还是定住,还是封印技能都行。一般游戏都有这种削弱机制。

15,软猬甲/反射镜像
伤我100,自扣50,自穿软猬甲,敌人也穿,镜像无限反射

16,抗性叠叠乐
抗性数字化,火抗5,可以叠,叠一次5,叠到50,火伤害就减50。百分比也可以。

点评

都是你之前问过的同样做法, 一样从公式入手就行了  发表于 2026-5-4 11:23
退隐....
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部