Project1

标题: 软控中期研究 [打印本页]

作者: y967    时间: 2026-6-10 13:05
标题: 软控中期研究
本帖最后由 y967 于 2026-6-17 18:34 编辑

脑洞无用,只会影响剧情,匮乏,甚至会让剧情越来越薄弱,脑洞是魔鬼。

1,蚂蚁噬心

连续伤害,每次只加1伤害,初始为10,或者开始50,第二次100,第三次150,不解就会越来越高

2,刚则易折

伤害超过对方血量1/4,则伤害有50%几率减半

3,拙劣演技

血量还剩30%,则人物会变大,然后伤害会固定为N,对敌人伤害也会固定为N,6回合后解除,人物也会变正常
作者: 无忧谷主幻    时间: 2026-6-10 23:06
本帖最后由 无忧谷主幻 于 2026-6-10 23:47 编辑

使用剩余回合数作为计数
记得设置好回合数,比如20回合
(如果想10回合解除就填11,20就填21)
RUBY 代码复制
  1. if self.state?(17)
  2.   remaining_turns = @states_turn[17]
  3.   calculated_damage = (21 - remaining_turns) * 50
  4.   self.damage = [calculated_damage, 9999].min
  5.       self.hp -= self.damage
  6. end


如果想模拟无法自然解除,可以这样做:解除条件依旧是20回合,但是解除概率改成0,这样第20回合后,每回合都会扣除9999(假设你用某个方法让角色一直存活),反正9999已经是最大值了
该方法未测试,感觉应该没问题

至于还有引入变量的,因为层数是全队共享的,比如1号角色已经叠加到3层,此时2号角色再中这个状态,是从第3层开始计算的,除非你给每个角色都关联一个单独的变量
这个方法太过麻烦,所以看看就可以了
使用变量作为计数

作者: y967    时间: 2026-6-11 05:35
1,定容

伤害有容量,固定为4000,打完伤害就为0,高级技能容量大一点,比如40000

2,变化莫测

属性可变,每次属性在三个之间随机,比如火,风,水,1,2,3号属性

3,认主

装备认主,如果只是一个人可以装备,那其他职业都不打勾就可以,现在要一个认主过程,即认主后其他人不可以装备

4,碎碎念

武器会碎碎念,打多了火鸡,就有几率说,杀鸡狂魔!扩展:打多了火鸡,沾了火鸡血剑会带有火属性
时间长了,打的东西越来越多,剑会不断跳出,杀鸡狂魔,一碗虾,天马游星犬,这种空耳也可以。

5,对等协议

不要琢磨技能伤害了,直接对等协议就可以了,3回合大家都防守好了,只能加血

6,高级协议

对等协议中,双方定容都打完了,还是没死,就开始预判对面的预判,如果双方加血则都减血,双方防御都减血
动作一样就减血

7,最终协议

无论做什么都开始减血,配合假死技能,会绝地得生。敌人会预判你加血给最低血人,则触发萨菲隆一号协议
也即该人即死,要不死就用假死技能。对敌也一样,苟且偷生后偷偷干掉所有敌人,腹黑最高境界。

作者: 灯笼菜刀王    时间: 2026-6-11 11:27
技能限定伤害总量是个不错的主意, 也算是对技能使用的一种限制, 具体做法不难, 难的是"你要怎么让玩家知道每个技能的伤害剩余量", 笑

想在说明里显示变量, 那就需要改动help脚本, 如果你的技能支持多人使用, 那更要考虑"导入使用者参数", 各种麻烦事一堆哦, 笑

UI方面要怎么做自己去想,  咱就帮你实现不难的技能效果吧

首先, 在吸蓝吸血的脚本里,  def 吸蓝 这句下面, 加上一句   def damcost ;@description[/DCT\=(\d+)/] ;return $1.to_i ;end

然后, main前插入这个脚本
RUBY 代码复制
  1. class Game_Battler
  2.   attr_accessor :skill_damcost
  3.   alias caidao_initialize initialize
  4.   def initialize
  5.     caidao_initialize
  6.     @skill_damcost = {}
  7.   end
  8.   def ski_damcost(ski,dam)
  9.     return dam if (r=ski.damcost) == 0
  10.     @skill_damcost[ski.id] = r if @skill_damcost[ski.id].nil?
  11.     d = [@skill_damcost[ski.id],dam].min
  12.     @skill_damcost[ski.id] = [@skill_damcost[ski.id] - d,0].max
  13.     return d
  14.   end
  15.   alias caidao_remove_states_battle remove_states_battle
  16.   def remove_states_battle
  17.     caidao_remove_states_battle
  18.     @skill_damcost.clear
  19.   end
  20. end


然后, 到 def skill_effect 这个脚本下面, 找到  self.hp -= self.damage  在它上面加上一句  self.damage = user.ski_damcost(skill,self.damage)

然后, 要限制伤害量的技能, 说明里加上  DCT=999999 , 这样,一场战斗里这个技能就只能造成999999点伤害(群攻时为伤害总和)
作者: 灯笼菜刀王    时间: 2026-6-11 11:37
本帖最后由 灯笼菜刀王 于 2026-6-11 17:12 编辑

属性变化, 直接用公共事件

f = [1,2,3]
a = f[rand(f.size)] ;ski= $data_skills[10086]
ski.element_set = [a]
ski.animation1_id = 10086+a  #动画根据 随机到的状态id + 固定数值来区分
ski.animation2_id = 10186+a

这样, 每次使用后,技能就会随机变成其他属性,  如果想第一次使用就随机, 那找到  Scene_Title 这个脚本, 在 Graphics.freeze 下面也加上上面那三句


注意, 如果你有使用像"多种战斗特效"这种用勾上技能属性来设置特殊效果的话,  要在 [a] 里填上你用于设置的属性ID , 例如 [a,12,14,18]  需要换行就从逗号处换

----------
其实, 如果只是属性随机变换, 那其实没啥用, 除非你能让玩家知道变换成什么属性, 这样才有一定的战略意义, 笑, 当然,这和上面一样, 如何"让玩家掌握实际信息"方面是个难点, 笑


也可以像这样,增加个被动, 让玩家可以主动控制"随机结果", 也是一种策略, 笑

我同时也有这种技能, 可以配合, 笑



-----------------------------------

另外, 如果你的属性只是体现在伤害不同上, 那属性随机其实也没什么特别之处, 反正对玩家来说, 就是冒的伤害不同罢了, 笑


我的属性攻击是会有标志以及挨打方特效表演的, 笑
作者: y967    时间: 2026-6-11 12:00



第九行,使用技能就出错
作者: 灯笼菜刀王    时间: 2026-6-11 16:47
本帖最后由 灯笼菜刀王 于 2026-6-11 18:59 编辑

装备绑定

把这个脚本塞到 main 前
RUBY 代码复制
  1. module RPG
  2.   #把要装备绑定的ID写到中括号内,武器正数,防具负数
  3.   Arm_only = [1,-2]
  4.   #====================================================
  5.   class Weapon
  6.     def rid ;return @id ;end
  7.     def 绑装? ;return Arm_only.include?(@id) ;end
  8.   end
  9.   class Armor
  10.     def rid ;return -@id ;end
  11.     def 绑装? ;return Arm_only.include?(-@id) ;end
  12.   end
  13. end
  14.  
  15. class Game_System
  16.   attr_accessor :arm_only
  17.   alias caidao_initialize initialize
  18.   def initialize
  19.     caidao_initialize
  20.     @arm_only = {}
  21.   end
  22. end
  23.  
  24. class Game_Actor < Game_Battler
  25.   def only_equip_ok?(tmrid)
  26.     return true if !RPG::Arm_only.include?(tmrid)
  27.     return true if (r=$game_system.arm_only[tmrid]).nil?
  28.     return r == self.id
  29.   end
  30.   def weapon_set
  31.     f=$data_classes[@class_id].weapon_set.find_all{|i| only_equip_ok?(i)}
  32.     return f
  33.   end
  34.   def armor_set
  35.     f=$data_classes[@class_id].armor_set.find_all{|i| only_equip_ok?(-i)}
  36.     return f
  37.   end  
  38.   alias caidao_equippable? equippable?
  39.   def equippable?(item)
  40.     return false if !only_equip_ok?(item.rid)
  41.     return caidao_equippable?(item)
  42.   end
  43.   alias caidao_equip equip
  44.   def equip(equip_type, id)
  45.     caidao_equip(equip_type, id)
  46.     tm = equip_type == 0 ? $data_weapons[@weapon_id] : \
  47.     eval("$data_armors[@armor#{equip_type}_id]")
  48.     return if tm.nil? or !tm.绑装? or $game_system.arm_only[tm.rid] != nil
  49.     $game_system.arm_only[tm.rid] = self.id ; tm.name += "(#{self.name})"
  50.   end
  51. end
  52.  
  53. class Scene_Load < Scene_File
  54.   alias caidao_read_save_data read_save_data
  55.   def read_save_data(file)
  56.     caidao_read_save_data(file)
  57.     for i in $game_system.arm_only
  58.       if i[0] < 0 ;$data_armors[-i[0]].name += "(#{$game_actors[i[1]].name})"
  59.       else ;$data_weapons[i[0]].name += "(#{$game_actors[i[1]].name})"
  60.       end
  61.     end
  62.   end
  63. end


考虑到你有可能有用装备强化脚本,装备分类脚本之类的, 之后的步骤要你自己去脚本里改,
全局搜索  $data_classes[@actor.class_id].weapon_set  把这部分改成  @actor.weapon_set  ,注意, 只改动搜索的那部分代码, 不管同一句里它前面和后面有啥玩意都不要动

然后搜索 $data_classes[@actor.class_id].armor_set 一样把它改成 @actor.armor_set

最后, 在脚本第三行的中括号内设置好要装备绑定的ID, 该ID的装备以后就只会让第一次装备它的人装备, 别人即使是相同职业也一样不能装备(初始就装备着的情况下无效)

如果想取消绑定, 执行一次 $game_system.arm_only.delete(武器为正防具为负ID)  ,  全部取消就 $game_system.arm_only.clear


作者: 灯笼菜刀王    时间: 2026-6-11 16:55
本帖最后由 灯笼菜刀王 于 2026-6-11 16:59 编辑

4, 碎碎念

给你一个武器附带公共事件, 平砍后就会调用对应的公共事件, 要怎么玩自己去公共事件里搞

把它塞到main前 , 然后, 武器的说明里 一样#后面不显示, 在#后面设置  公事=10086 , 这样平砍后就调用10086号公共事件
  1. module RPG
  2.   class Weapon
  3.     def description ;return @description.split(/#/)[0] ;end
  4.     def common_event_id ;@description[/公事=(\d+)/] ;return $1.to_i ;end
  5.   end
  6. end

  7. class Scene_Battle
  8.   alias caidao_make_basic_action_result make_basic_action_result
  9.   def make_basic_action_result
  10.     if (act=@active_battler).is_a?(Game_Actor) and
  11.     act.current_action.basic == 0 and (wea=$data_weapons[act.weapon_id]) != nil
  12.       @common_event_id = wea.common_event_id
  13.     end
  14.     caidao_make_basic_action_result
  15.   end
  16. end
复制代码


结合之前给你的  受方 这个函数,  去用条件分歧  受方.id == 火鸡id  给变量1 += 1  ,  这样就是砍火鸡一刀 1号变量+1,  然后在去用这个变量分歧去搞你要的表演即可

----

下面那些, 你先搞定"敌人的AI" 再说, 否则没意义, 毕竟XP默认敌人可不会判断什么情况下用什么技能 ,笑

作者: 无忧谷主幻    时间: 2026-6-11 21:35
本帖最后由 无忧谷主幻 于 2026-6-11 22:42 编辑

拙劣演技
血量还剩30%,则人物会变大,然后伤害会固定为N,对敌人伤害也会固定为N,6回合后解除,人物也会变正常

首先是血量30%变大,由于不知道你用的是什么战斗脚本,所以位置只能你自己找了,大约是描绘战斗图坐标的附近
RUBY 代码复制
  1. # ★ 状态87:HP低于30%时 立刻2倍放大
  2. if @battler && !@battler.dead? && !@battler.hidden
  3.   if @battler.state?(87) && @battler.hp <= @battler.maxhp * 0.3
  4.     self.opacity = 255
  5.     self.color = Color.new(0,0,0,0)
  6.     @final_zoom = @battler.real_zoom * 2.0
  7.   else
  8.     self.color = Color.new(0,0,0,0)
  9.     @final_zoom = @battler.real_zoom
  10.   end
  11. end
  12.  
  13. # スプライトの座標を設定
  14. self.x = @battler.screen_x + @effect_ox
  15. self.y = @battler.screen_y + @effect_oy
  16. self.z = @battler.screen_z
  17. # 最终缩放
  18. self.zoom_x = @final_zoom
  19. self.zoom_y = @final_zoom



伤害会固定为N,对敌人伤害也会固定为N
Game_Battler 3 没错,还是这个
RUBY 代码复制
  1. # 分散
  2.       if skill.variance > 0 and self.damage.abs > 0
  3.         amp = [self.damage.abs * skill.variance / 100, 1].max
  4.         self.damage += rand(amp+1) + rand(amp+1) - amp

下面
RUBY 代码复制
  1. # 1. 攻击时造成的伤害固定500
  2.   if user.state?(87) && user.hp <= user.maxhp * 0.3
  3.     self.damage = 500
  4.   # 2. 被攻击者时受到的伤害固定500
  5.   elsif self.state?(87) && self.hp <= self.maxhp * 0.3
  6.     self.damage = 500

不是防御修正,而是分散之后,这是为了不被分散度影响

可能会出现的问题:在播放技能动画的开始,人物可能就会变大,这是因为战斗系统执行顺序的原因,默认的战斗系统是先扣血,再播放技能动画,如果在意的话你可以自己改一改
作者: 风吹处阴凉    时间: 2026-6-11 23:47
都退圈了解决又有啥用?顺便告诉你只要自定义系统逻辑方面的问题想要什么都可以实现。
作者: y967    时间: 2026-6-13 06:59
本帖最后由 y967 于 2026-6-13 10:13 编辑

1 ,迷魂阵

中了此阵,命中率下降,有几率找不到敌人

2,幻境

在幻境中一切攻击都会虚化,也即,看见了伤害,还可能会死,但是幻觉,现实是没有任何伤害,死亡也不存在
解除时恢复到中前原样,不等于加回血和复活

3,大幻觉

幻觉自己死了,迷惑我,叫我不停加血,复活,就不会攻击了,对敌人也一样,极可怕之秘术,小心,不一定,虚实参杂

4,朗朗弄爱

看着BOSS手足无措,不知道该解毒还是复活还是加血,还是解除状态,她可能就没有中状态,十分朗朗弄爱,台湾话,很可爱

5,腹黑最高境界

之我再也预判不了你的预判,你可能真的死了,也可能真的中了幻觉,也可能没有,所以,我判断不了你的状态,可怕拉

所谓战略,没有用了,还可以用BOSS一直加血,但自己也杀不死。可怕

6,等价交换
魔鬼契约1,40%血换取一个增益效果,天使契约,30%换取敌人一个负面BUFF,如果已经有此效果,扣血照旧。

7,苟且偷生
牺牲一名队友,换取自己加满血和一个BUFF,代价是血上限下降10%

8,忍辱偷生
如果只剩自己,使用苟且偷生,则血变为1,增加一个忍辱偷生技能,每次加血20%,但伤害减半。血上限变为扣20%。
作者: 无忧谷主幻    时间: 2026-6-13 12:37
6,纯事件也能做吧,当然可能写成代码更方便
给1号角色附加2号状态,并扣除40%hp
RUBY 代码复制
  1. for actor in $game_party.actors
  2.   next if actor == nil || actor.dead?
  3.   next unless actor.id == 1
  4.   next if actor.state?(2)
  5.   actor.add_state(2)
  6.   actor.hp -= (actor.maxhp * 0.4).to_i
  7. end

6.1,给处于32号状态的敌人附加3号状态,之后1号角色扣除30%hp
RUBY 代码复制
  1. for enemy in $game_troop.enemies
  2.   next if enemy == nil || enemy.dead?
  3.   next unless enemy.state?(32)
  4.   next if enemy.state?(3)
  5.   enemy.add_state(3)
  6. end
  7. actor = $game_actors[1]
  8. if actor != nil && !actor.dead?
  9.   actor.hp -= (actor.maxhp * 0.3).to_i
  10. end

7,如果有数据库非1号的角色在队伍中且存活,随机选取其中一个附加1号状态,之后1号角色恢复全部hp,并附加4号状态与5号状态;若没有,什么都不做
RUBY 代码复制
  1. candidates = []
  2. for actor in $game_party.actors
  3.   next if actor == nil || actor.dead?
  4.   next if actor.id == 1
  5.   candidates.push(actor)
  6. end
  7. if candidates.size > 0
  8.   target = candidates[rand(candidates.size)]
  9.   target.add_state(1)
  10.     actor1 = $game_actors[1]
  11.   if actor1 != nil
  12.     actor1.hp = actor1.maxhp
  13.     actor1.add_state(4)
  14.     actor1.add_state(5)
  15.   end
  16. end

8,仅当1号角色存活,且没有其他存活同伴时,1号角色hp变成1,并附件10号状态,否则什么都不做
RUBY 代码复制
  1. has_other_alive = false
  2. for actor in $game_party.actors
  3.   next if actor == nil || actor.dead?
  4.   if actor.id != 1
  5.     has_other_alive = true
  6.     break
  7.   end
  8. end
  9. actor1 = $game_actors[1]
  10. if actor1 != nil && !actor1.dead? && !has_other_alive
  11.   actor1.hp = 1
  12.   actor1.add_state(10)
  13. end

这是是按照角色编号判断,如果有多人能够学习该技能,也可以改成状态判断

加血20%,伤害减半,血上限变为扣20%,这些应该不用我教吧
作者: 灯笼菜刀王    时间: 2026-6-13 17:45
本帖最后由 灯笼菜刀王 于 2026-6-13 21:23 编辑

  整天想和空气斗智斗勇,  那要有个前提, 你的敌人需要具备一定程度的行动判断能力, 否则, 你觉得默认的这种根据权重随机抽取某个行动,且不管该行动能否实行都一根筋的行动的敌人, 要怎么和你斗智斗勇, 笑

想斗智斗勇, 首先, 你要把你敌人的所有行动都设置行动条件, XP数据库提供的条件设置配合猫姐的"自导开关脚本", 可以一定程度上做到给敌人一些什么情况下不使用技能的判断, 然后,在此基础上,才能去跟他"玩花招", 笑

先不管敌人方面, 给玩家"幻觉"的方法, 一般有这几种做法 (你说的东西看不懂, 自己去参考想要的效果)

1, 信息屏蔽, 最简单的做法就是在玩家习惯了显示血条后, 突然不让你看血条了, 就会骤然觉得难度提升了, 这就是由奢入俭难, 笑


[迷糊]状态: 中了后, 自身和敌人的信息都不可见,且和自身相关的伤害显示全部为 ???


还有更阴的,  [失忆]状态, 自身所有技能和道具全部显示 ???? , 可以使用, 但是你不知道你选择的是什么, 除非, 你把技能列表的位置全部记下来  

也可以这样

把画面全挡了, 技能栏和help全看不到, 只能凭弹窗提示和音效来操作, 体验几个回合瞎猫的感觉, 笑

此外, 隐藏敌人也相当于信息遮蔽, 比如典型的战争迷雾

这是我战棋夜战, 视野外的敌人是不可见的, 光标也无法选中, 只有角色行动结束后, 在其视野内的敌人才会现身, 如果移动过程中撞上敌人,那就强行中止行动
仅仅是无法掌握敌人位置, 难度就提升了几个档次, 笑

除了遮挡, 还可以 "真.隐身"   

敌方的潜艇是看不到的,而且也不会挡路, 只有正好踩到它才会现身(或者它发动攻击)


隐身中的潜艇是无法攻击到的, 可以使用声呐让它现身,然后再让其他人攻击(潜艇现身后也是需要能反潜才可以攻击潜艇的)


或者用深弹盲丢, 看能不能中奖, 笑(只有深弹可以盲丢,其他武器都必须有目标才能攻击)
当然,如果没猜中, 那就浪费深弹和行动机会了

因为看不到敌方潜艇, 且潜艇移动不会受到敌对单位的阻拦, 所以不小心就会被潜艇偷到后方单位(我的敌人有优先攻击弱者的AI),在有潜艇出没的地图, 必须做好反潜工作, 笑

无法掌握战场信息可是比想像中的棘手呦~

2, 信息误导
比起信息遮蔽, 信息误导会更有迷惑性~

我有设计了这个职业 ,这个单位特别之处是, 作为敌方登场的时候 , 它会伪装成其他单位, 行走图,状态信息等全部伪装


上面那张是真实的面板, 而这个是战斗中查看状态面板的样子, 因为单位的属性是根据装备的武器决定的, 所以一般攻击前确认对方装备什么武器是很重要要的操作, 而这也提供了误导的可能, 笑



进入战斗后才会解除,  因为我的属性克制关系很重要, 所以信息误导很可能会造成严重损失, 越是精于计算的玩家越容易上这种当, 火影的中忍考试说过"错误的情报可能会给自己和同伴带来毁灭"

===================================
以上那些只能针对"玩家", 对电脑并不管用, 因为不管信息遮蔽还是误导, 只要你是用获取单位信息的分歧来做敌方AI, 那对电脑来说都是明牌, 除非你特意去让电脑"做出被误导的行动", 但是这样做又会让误导型战术对电脑屡试不爽, 这傻缺一踩一个准一样不好玩, 笑

像上面说的潜艇, 我方一样有潜艇单位, 但是隐身效果对电脑无效, 就算把AI设计成"隐身的时候当它不存在", 但是当电脑具有反潜手段的时候, 它必定能找到你的潜艇, 毕竟对它来说都是明牌, 摊手, 所以我除了给潜艇隐身外, 还有限制必须具备反潜能力才可以攻击到它, 这样,我方的潜艇在确保对方没有反潜能力的时候就可以快乐的偷家了, 笑

同样的,我方的伪装破袭舰也没有伪装功能, 毕竟对敌人来说没意义, 无奈摊手 , 所以我方的伪装破袭舰, 伪装体现在"逆转相克属性"上, 不过该职业的主要用途还是"偷盗", 所以也不至于因为伪装无效就失去了职业特色了

所以, 想玩"智取", 必须结合你现在能让敌人做到的程度, 去设计敌人能中招,但是又不是必定会中的"花招", 这样才好玩

像我之前说的互不攻击协议和不耗蓝协议 , 这些契约技能使用的时候是有概率会失败的(表现为目标反对,协议不成立, 笑), 不攻击协议会根据我方存活数量来增减概率, 当我方只有一个人的时候必定失败, 可不能让敌人太傻, 笑

作者: y967    时间: 2026-6-14 08:00
伪AI策略中期探索

1,所见即所得

一个技能,如果敌人造成伤害超过2000,则下一次攻击该技能造成伤害是敌人的这次伤害,仅下一次有效,完了重新判断。单体

扩展,高级,如果敌人伤害连续超过2000三次,则下一次攻击该技能造成伤害是敌人的三次伤害总和,仅下一次有效,完了重新判断。单体

2,富贵险中求

技能,若我方所有人血量低于30%,则该技能造成伤害2倍,若所有人血量低于10%,则为3倍。单体

3,延时标记

该技能为敌人标记,N回合后,产生爆炸伤害为该技能伤害*N,技能单体伤害为固定。

4,减速/加速标记

该技能为敌人最高速度者标记,N回合内减速/加速30%,配合3可以产生美妙效果。敌人也一样。

5,残血标记

该技能为血量低于30%/10%的单个队友标记,N回合后加血,加血效果是N*基础加血值,该技能为加血技能,如果中了前面的标记又想富贵险中求,则会产生
奇妙的不可思议的事件。
作者: 灯笼菜刀王    时间: 2026-6-14 09:53
本帖最后由 灯笼菜刀王 于 2026-6-14 10:19 编辑

我说的AI可不是现在热门的"人工智能产业", 不是你用来写脚本的那东西, 笑
这里的AI是"你给敌人设置的如何行动的逻辑", 敌人能有多聪明, 全看你有多用心, 笑,  别把它当成别人的事

为了不和你脑袋里的AI混淆, 现在把 "敌人的行动逻辑" 叫 BI 好了

XP默认的敌方BI, 就是

这样设置, 这是最简单的BI, 根据权重来随机行动, 这种敌人, 根本就玩不了你心心念念的"斗智斗勇"

然后呢, 你稍微设置一下

这样, 就有了一个判断, 只有这个"可以治疗"的开关打开的时候, 它才会抽到治疗这个行动, 所以, 你可以通过调整这个开关来"控制它什么时候才能用治疗"

这就让你的BI有了些"智力"

而这个开关, 可以通过猫姐的 自更新开关 脚本, 来进一步提高"智力"

例如, 使用这个脚本后, 把2号开关的名字设置为 =a.hp < a.maxhp / 2   , 然后, 治疗这个行为调用这个2号开关, 这样, 就只有自己的HP剩一半的时候, 治疗这个行为才会参与概率抽取, 也就是说治疗这个技能只会在自己HP剩一半的时候才会有概率使用, 当然, 如果你把权重设置为10, 那就是自己HP一半的时候高概率使用治疗技能,  这样, 这个BI就聪明些喽~

同样, 也可以 设置一个开关 =a.sp > 100 这样就是自己的MP大于100的时候才会执行这个行动, 就不会傻傻的MP不够也一直用技能了

像这样,只要你给敌人的行动设置足够复杂且合理的判断, 那它的表现就比默认XP默认呆呆的概率抽取"聪明" , 这就是我说的"你想和敌人斗智斗勇, 首先要先给敌人智力",笑

我用了大概600多行的脚本做敌人BI, 让敌人可以判断"哪个目标好欺负",可以利用射程优势在目标的攻击范围外攻击, 会更换克制的武器, 会在血不足的时候吃药或者逃跑, 会据守优势地形, 会对一些非攻击目标反应(例如反潜,扫雷,维修建筑)
而这些, 都是通过大量的条件分歧来达成的, 甚至因为要判断这么多东西, 在敌人行动前还会卡一下... , 这也导致了我不敢加入阵型, 支援攻击, 光环效果利用 这些更复杂的判断, 所以上面说的那些"针对玩家的玩意"就算是平衡下了, 笑

在敌人BI上, 我可是投注了大量心血哦,  89的RPG敌人也一样, 我改造了默认的条件判断, 让其具有在相对复杂的条件下,寻找特定目标的能力


这是89敌人的行动BI,  这里的等级血量让我改造成了另外的功能, 默认的设置不一样

======================
鉴于现在要你马上会写表达式有点难度, "斗智斗勇"就作为以后的方向努力吧, 笑

如果你没用其他的行动控制脚本, 用的是XP默认的BI

那可以稍微改造下, 让敌人"聪明"一些些

全局搜索  def make_action , 然后在它下面 找到 available_actions.push(action) 这句, 在上面增加一句   next if action.kind == 1 and !self.skill_can_use?(action.skill_id)

这样, 设置的技能在无法使用的情况下(例如沉默, MP不够), 敌人就不会随机到该行动
作者: 灯笼菜刀王    时间: 2026-6-14 11:02
本帖最后由 灯笼菜刀王 于 2026-6-14 11:21 编辑

BI可以认为是"行为逻辑", 默认的那种随机行动随机目标, 是没有任何逻辑可言的, 只有对方行动上有一定逻辑, 你才可以"预判", 才可以"逗", 这才有"斗智斗勇的基础" , 笑

像我的战棋是有水雷的, 水雷可以设置在地图上, 然后单位移动的时候, 经过水雷所在的格子就会引爆, 会受到伤害并强行终止行动,  是很重要的战略武器


水雷和潜艇一样, 玩家是看不到敌方设置的水雷的, 所以为了公平,敌人的BI也不会作弊去绕过水雷(当然, 扫雷舰这类的单位就会检测水雷的存在了, 笑)

而利用敌人"挑软柿子捏"的BI,也就是基本行动逻辑, 这就可以故意把弱单位暴露在敌人的攻击范围内, 引诱敌人去踩水雷


像这样, 把残血单位放在敌人的攻击范围内


然后布雷(一次布两颗是因为有被动)


结果敌人不上当... 因为吹雪虽然只有1血, 但是她11级且装备机炮, 克制敌人的鱼雷(被克制除了降低伤害,还会降低命中和暴击), 周围还有两个队友提供支援buff, 所以1级的深雪对这个敌人而言才是"软柿子" , 引诱失败.........

重来重来, 这次把吹雪改1级, 装备深弹(无法反击水面舰) ,然后1血, 把队友拉远支援不生效, 现在是100%软柿子了~~

敌人就会过来踩雷啦~

如果敌人没有"逻辑", 就无法引诱, 想让它踩雷就只能随缘了, 那就谈不上"斗智斗勇"啦,  笑
作者: 灯笼菜刀王    时间: 2026-6-14 12:44
本帖最后由 灯笼菜刀王 于 2026-6-14 12:47 编辑

除了玩家和队员的好感度, 我的队员之间也是有好感度的, 在战斗中帮其恢复,或者战斗时站在一起攻击并敌人, 就会增加互相之间的好感度, 然后好感度积累到一定程度, 就可以进行"支援对话"

支援对话可以提升支援等级, 支援等级提升后, 战斗中只要相邻2格内就可以获得支援效果

每对支援有3个等级, 加上初始对话, 一共可以触发4次支援对话, 4次支援对话也相当于一段小剧情了, 笑


因为成员有400个...其CP组合少说也有一两百...做这些支援对话可是大工程,  在"情感"这一块, 我可是投入大量成本的哦


作者: 无忧谷主幻    时间: 2026-6-14 12:58
6改:想要更多状态自己加,数组中每个状态概率均等
RUBY 代码复制
  1. for actor in $game_party.actors
  2.   next if actor == nil || actor.dead?
  3.   next unless actor.id == 1
  4.   state_ids = [2, 5, 6]
  5.   state_id = state_ids[rand(state_ids.size)]
  6.   actor.add_state(state_id)
  7.   actor.hp -= (actor.maxhp * 0.4).to_i
  8. end

8改:这需要用到2个变量作为记录,先用变量1记录角色第一次使用之前的最大hp,再用变量2记录使用次数
RUBY 代码复制
  1. has_other_alive = false
  2. for actor in $game_party.actors
  3.   next if actor == nil || actor.dead?
  4.   if actor.id != 1
  5.     has_other_alive = true
  6.     break
  7.   end
  8. end
  9. actor1 = $game_actors[1]
  10. if actor1 != nil && !actor1.dead? && !has_other_alive
  11.   if $game_variables[1] == 0
  12.     $game_variables[1] = actor1.maxhp
  13.   end
  14.   actor1.hp = 1
  15.   actor1.add_state(10)
  16.   hp_lose = (actor1.maxhp * 0.2).to_i
  17.   actor1.maxhp = [actor1.maxhp - hp_lose, 1].max
  18.   $game_variables[2] += 1
  19. end

最后在战斗结束后执行这段代码即可
RUBY 代码复制
  1. actor = $game_actors[1]
  2. return if actor == nil
  3. if $game_variables[1] != 0
  4.   actor.maxhp = $game_variables[1]
  5.   $game_variables[1] = 0
  6. end
  7. if $game_variables[2] != 0
  8.   actor.maxhp = [actor.maxhp - $game_variables[2], 1].max
  9.   $game_variables[2] = 0
  10. end


作者: 无忧谷主幻    时间: 2026-6-14 13:11
本帖最后由 无忧谷主幻 于 2026-6-14 18:21 编辑

富贵险中求
Game_Battler 3反正跟伤害有关的改这段就可以了,防御修正之前
RUBY 代码复制
  1. if skill.id == 57
  2.     all_below_30 = true
  3.     all_below_10 = true
  4.     # 遍历己方队伍所有存活角色判断HP比例
  5.     for actor in $game_party.actors
  6.       next if actor.nil? || actor.dead?
  7.       if actor.hp * 100 >= 30 * actor.maxhp
  8.         all_below_30 = false
  9.         all_below_10 = false
  10.       elsif actor.hp * 100 >= 10 * actor.maxhp
  11.         all_below_10 = false
  12.       end
  13.     end
  14.     # 倍率判定:10%优先级高于30%
  15.     if all_below_10
  16.       self.damage = self.damage * 300 / 100
  17.     elsif all_below_30
  18.       self.damage = self.damage * 200 / 100
  19.     end
  20.   end

测试


作者: y967    时间: 2026-6-15 11:26
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Battler (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  5. # 超级类来使用。
  6. #==============================================================================
  7.  
  8. class Game_Battler
  9.   #--------------------------------------------------------------------------
  10.   # ● 可以使用特技的判定
  11.   #     skill_id : 特技 ID
  12.   #--------------------------------------------------------------------------
  13.   def skill_can_use?(skill_id)
  14.     # SP 不足的情况下不能使用
  15.     if $data_skills[skill_id].sp_cost > self.sp
  16.       return false
  17.     end
  18.     # 战斗不能的情况下不能使用
  19.     if dead?
  20.       return false
  21.     end
  22.     # 沉默状态的情况下、物理特技以外的特技不能使用
  23.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  24.       return false
  25.     end
  26.     # 获取可以使用的时机
  27.     occasion = $data_skills[skill_id].occasion
  28.     # 战斗中的情况下
  29.     if $game_temp.in_battle
  30.       # [平时] 或者是 [战斗中] 可以使用
  31.       return (occasion == 0 or occasion == 1)
  32.     # 不是战斗中的情况下
  33.     else
  34.       # [平时] 或者是 [菜单中] 可以使用
  35.       return (occasion == 0 or occasion == 2)
  36.     end
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 应用通常攻击效果
  40.   #     attacker : 攻击者 (battler)
  41.   #--------------------------------------------------------------------------
  42.   def attack_effect(attacker)
  43.     # 清除会心一击标志
  44.     self.critical = false
  45.     # 第一命中判定
  46.     hit_result = (rand(100) < attacker.hit)
  47.     # 命中的情况下
  48.     if hit_result == true
  49.       # 计算基本伤害
  50.       atk = [attacker.atk - self.pdef / 2, 0].max
  51.       self.damage = atk * (20 + attacker.str) / 20
  52.       # 属性修正
  53.       self.damage *= elements_correct(attacker.element_set)
  54.       self.damage /= 100
  55.       # 伤害符号正确的情况下
  56.       if self.damage > 0
  57.         # 会心一击修正
  58.         if rand(100) < 4 * attacker.dex / self.agi
  59.           self.damage *= 2
  60.           self.critical = true
  61.         end
  62.         # 防御修正
  63.         if self.guarding?
  64.           self.damage /= 2
  65.         end
  66.       end
  67.       # 分散
  68.       if self.damage.abs > 0
  69.         amp = [self.damage.abs * 15 / 100, 1].max
  70.         self.damage += rand(amp+1) + rand(amp+1) - amp
  71.       end
  72.       # 第二命中判定
  73.       eva = 8 * self.agi / attacker.dex + self.eva
  74.       hit = self.damage < 0 ? 100 : 100 - eva
  75.       hit = self.cant_evade? ? 100 : hit
  76.       hit_result = (rand(100) < hit)
  77.     end
  78.     # 命中的情况下
  79.     if hit_result == true
  80.       # 状态冲击解除
  81.       remove_states_shock
  82.       # HP 的伤害计算
  83.       self.hp -= self.damage
  84.       # 状态变化
  85.       @state_changed = false
  86.       states_plus(attacker.plus_state_set)
  87.       states_minus(attacker.minus_state_set)
  88.     # Miss 的情况下
  89.     else
  90.       # 伤害设置为 "Miss"
  91.       self.damage = "Miss"
  92.       # 清除会心一击标志
  93.       self.critical = false
  94.     end
  95.     # 过程结束
  96.     return true
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 应用特技效果
  100.   #     user  : 特技的使用者 (battler)
  101.   #     skill : 特技
  102.   #--------------------------------------------------------------------------
  103.   def skill_effect(user, skill)
  104.     # 清除会心一击标志
  105.     self.critical = false
  106.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  107.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  108.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  109.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  110.       # 过程结束
  111.       return false
  112.     end
  113.     # 清除有效标志
  114.     effective = false
  115.     # 公共事件 ID 是有效的情况下,设置为有效标志
  116.     effective |= skill.common_event_id > 0
  117.     # 第一命中判定
  118.     hit = skill.hit
  119.     if skill.atk_f > 0
  120.       hit *= user.hit / 100
  121.     end
  122.     hit_result = (rand(100) < hit)
  123.     # 不确定的特技的情况下设置为有效标志
  124.     effective |= hit < 100
  125.     # 命中的情况下
  126.     if hit_result == true
  127.       # 计算威力
  128.       power = skill.power + user.atk * skill.atk_f / 100
  129.       if power > 0
  130.         power -= self.pdef * skill.pdef_f / 200
  131.         power -= self.mdef * skill.mdef_f / 200
  132.         power = [power, 0].max
  133.       end
  134.       # 计算倍率
  135.       rate = 20
  136.       rate += (user.str * skill.str_f / 100)
  137.       rate += (user.dex * skill.dex_f / 100)
  138.       rate += (user.agi * skill.agi_f / 100)
  139.       rate += (user.int * skill.int_f / 100)
  140.       # 计算基本伤害
  141.       self.damage = power * rate / 20
  142.       # 属性修正
  143.       self.damage *= elements_correct(skill.element_set)
  144.       self.damage /= 100
  145.       # 伤害符号正确的情况下
  146.       if self.damage > 0
  147.  
  148.  
  149.              ----------------------------------------------------
  150.    if skill.id == 61
  151.     all_below_30 = true
  152.     all_below_10 = true
  153.     # 遍历己方队伍所有存活角色判断HP比例
  154.     for actor in $game_party.actors
  155.       next if actor.nil? || actor.dead?
  156.       if actor.hp * 100 >= 30 * actor.maxhp
  157.         all_below_30 = false
  158.         all_below_10 = false
  159.       elsif actor.hp * 100 >= 10 * actor.maxhp
  160.         all_below_10 = false
  161.       end
  162.     end
  163.     # 倍率判定:10%优先级高于30%
  164.     if all_below_10
  165.       self.damage = self.damage * 300 / 100
  166.     elsif all_below_30
  167.       self.damage = self.damage * 200 / 100
  168.     end
  169.   end
  170.       ----------------------------------------------------
  171.  
  172.  
  173.  
  174.  
  175.         # 防御修正
  176.         if self.guarding?
  177.           self.damage /= 2
  178.         end
  179.       end
  180.       # 分散
  181.       if skill.variance > 0 and self.damage.abs > 0
  182.         amp = [self.damage.abs * skill.variance / 100, 1].max
  183.         self.damage += rand(amp+1) + rand(amp+1) - amp
  184.       end
  185.       # 第二命中判定
  186.       eva = 8 * self.agi / user.dex + self.eva
  187.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  188.       hit = self.cant_evade? ? 100 : hit
  189.       hit_result = (rand(100) < hit)
  190.       # 不确定的特技的情况下设置为有效标志
  191.       effective |= hit < 100
  192.     end
  193.     # 命中的情况下
  194.     if hit_result == true
  195.       # 威力 0 以外的物理攻击的情况下
  196.       if skill.power != 0 and skill.atk_f > 0
  197.         # 状态冲击解除
  198.         remove_states_shock
  199.         # 设置有效标志
  200.         effective = true
  201.       end
  202.       # HP 的伤害减法运算
  203.       last_hp = self.hp
  204.       self.hp -= self.damage
  205.       effective |= self.hp != last_hp
  206.       # 状态变化
  207.       @state_changed = false
  208.       effective |= states_plus(skill.plus_state_set)
  209.       effective |= states_minus(skill.minus_state_set)
  210.       # 威力为 0 的场合
  211.       if skill.power == 0
  212.         # 伤害设置为空的字串
  213.         self.damage = ""
  214.         # 状态没有变化的情况下
  215.         unless @state_changed
  216.           # 伤害设置为 "Miss"
  217.           self.damage = "Miss"
  218.         end
  219.       end
  220.     # Miss 的情况下
  221.     else
  222.       # 伤害设置为 "Miss"
  223.       self.damage = "Miss"
  224.     end
  225.     # 不在战斗中的情况下
  226.     unless $game_temp.in_battle
  227.       # 伤害设置为 nil
  228.       self.damage = nil
  229.     end
  230.     # 过程结束
  231.     return effective
  232.   end
  233.   #--------------------------------------------------------------------------
  234.   # ● 应用物品效果
  235.   #     item : 物品
  236.   #--------------------------------------------------------------------------
  237.   def item_effect(item)
  238.     # 清除会心一击标志
  239.     self.critical = false
  240.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  241.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  242.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  243.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  244.       # 过程结束
  245.       return false
  246.     end
  247.     # 清除有效标志
  248.     effective = false
  249.     # 公共事件 ID 是有效的情况下,设置为有效标志
  250.     effective |= item.common_event_id > 0
  251.     # 命中判定
  252.     hit_result = (rand(100) < item.hit)
  253.     # 不确定的特技的情况下设置为有效标志
  254.     effective |= item.hit < 100
  255.     # 命中的情况
  256.     if hit_result == true
  257.       # 计算回复量
  258.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  259.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  260.       if recover_hp < 0
  261.         recover_hp += self.pdef * item.pdef_f / 20
  262.         recover_hp += self.mdef * item.mdef_f / 20
  263.         recover_hp = [recover_hp, 0].min
  264.       end
  265.       # 属性修正
  266.       recover_hp *= elements_correct(item.element_set)
  267.       recover_hp /= 100
  268.       recover_sp *= elements_correct(item.element_set)
  269.       recover_sp /= 100
  270.       # 分散
  271.       if item.variance > 0 and recover_hp.abs > 0
  272.         amp = [recover_hp.abs * item.variance / 100, 1].max
  273.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  274.       end
  275.       if item.variance > 0 and recover_sp.abs > 0
  276.         amp = [recover_sp.abs * item.variance / 100, 1].max
  277.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  278.       end
  279.       # 回复量符号为负的情况下
  280.       if recover_hp < 0
  281.         # 防御修正
  282.         if self.guarding?
  283.           recover_hp /= 2
  284.         end
  285.       end
  286.       # HP 回复量符号的反转、设置伤害值
  287.       self.damage = -recover_hp
  288.       # HP 以及 SP 的回复
  289.       last_hp = self.hp
  290.       last_sp = self.sp
  291.       self.hp += recover_hp
  292.       self.sp += recover_sp
  293.       effective |= self.hp != last_hp
  294.       effective |= self.sp != last_sp
  295.       # 状态变化
  296.       @state_changed = false
  297.       effective |= states_plus(item.plus_state_set)
  298.       effective |= states_minus(item.minus_state_set)
  299.       # 能力上升值有效的情况下
  300.       if item.parameter_type > 0 and item.parameter_points != 0
  301.         # 能力值的分支
  302.         case item.parameter_type
  303.         when 1  # MaxHP
  304.           @maxhp_plus += item.parameter_points
  305.         when 2  # MaxSP
  306.           @maxsp_plus += item.parameter_points
  307.         when 3  # 力量
  308.           @str_plus += item.parameter_points
  309.         when 4  # 灵巧
  310.           @dex_plus += item.parameter_points
  311.         when 5  # 速度
  312.           @agi_plus += item.parameter_points
  313.         when 6  # 魔力
  314.           @int_plus += item.parameter_points
  315.         end
  316.         # 设置有效标志
  317.         effective = true
  318.       end
  319.       # HP 回复率与回复量为 0 的情况下
  320.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  321.         # 设置伤害为空的字符串
  322.         self.damage = ""
  323.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  324.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  325.            (item.parameter_type == 0 or item.parameter_points == 0)
  326.           # 状态没有变化的情况下
  327.           unless @state_changed
  328.             # 伤害设置为 "Miss"
  329.             self.damage = "Miss"
  330.           end
  331.         end
  332.       end
  333.     # Miss 的情况下
  334.     else
  335.       # 伤害设置为 "Miss"
  336.       self.damage = "Miss"
  337.     end
  338.     # 不在战斗中的情况下
  339.     unless $game_temp.in_battle
  340.       # 伤害设置为 nil
  341.       self.damage = nil
  342.     end
  343.     # 过程结束
  344.     return effective
  345.   end
  346.   #--------------------------------------------------------------------------
  347.   # ● 应用连续伤害效果
  348.   #--------------------------------------------------------------------------
  349.   def slip_damage_effect
  350.     # 设置伤害
  351.     self.damage = self.maxhp / 10
  352.     # 分散
  353.     if self.damage.abs > 0
  354.       amp = [self.damage.abs * 15 / 100, 1].max
  355.       self.damage += rand(amp+1) + rand(amp+1) - amp
  356.     end
  357.     # HP 的伤害减法运算
  358.     self.hp -= self.damage
  359.     # 过程结束
  360.     return true
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ● 属性修正计算
  364.   #     element_set : 属性
  365.   #--------------------------------------------------------------------------
  366.   def elements_correct(element_set)
  367.     # 无属性的情况
  368.     if element_set == []
  369.       # 返回 100
  370.       return 100
  371.     end
  372.     # 在被赋予的属性中返回最弱的
  373.     # ※过程 element_rate 是、本类以及继承的 Game_Actor
  374.     #   和 Game_Enemy 类的定义
  375.     weakest = -100
  376.     for i in element_set
  377.       weakest = [weakest, self.element_rate(i)].max
  378.     end
  379.     return weakest
  380.   end
  381. end

作者: y967    时间: 2026-6-15 11:52
1,时空间忍术
全部或一半的伤害转化到一个黑洞里,可以是动画,装比牛技能,伤害最好显示在黑洞而不是人物上

2,时空间术

给我方前方一个护罩/电离场/虫洞,敌人攻击碰到就会吸进去,可以有动画,敌人消失,N回合后敌人才会出现,像首斩破裟罗把人拉进黑洞,然后
出来的时候造成伤害,伤害是敌人此次技能威力*N

3,大时空间术

条件极为苛刻,我方全灭只剩一人,血量为1时开启,令敌人全部吸入黑洞/电离场,6回合后出来,伤害为改技能威力*6,6回合你能干什么,复活队友
加血,整个要配合死亡时不死,只剩1点血技能为妙。

4,罪孽的叹息
条件极为苛刻,我方只剩一人且死亡时,不死剩一点血,极为虚弱无攻击能力

5,彼岸の方舟

只剩一人死亡时,召唤一座方舟,人物进入,也就是合体,也可以人物变成方舟,敌人攻击都无效,持续3回合,也可以叫死神契约,用途很广泛。

6,诸神の黄昏

灭世天波发动条件极为苛刻,我方满员,敌人只剩一人死亡前释放,所有人伤害1个亿,就是无限啦,要是我方有5号彼岸の方舟,则去除彼岸の方舟

7,究极空间畸变术/黑暗死神の法典

空间裂开,扭曲,人物进入,也可以变成黑洞,表演中二,进入后任何伤害都无效,免疫一切状态,包括诸神の黄昏,不会被诸神の黄昏移除标记
持续2回合

作者: 灯笼菜刀王    时间: 2026-6-15 19:09
本帖最后由 灯笼菜刀王 于 2026-6-15 19:47 编辑

1,  金钟罩.改  

2,  金钟罩.改 + 给敌人上状态  ; 状态设置为不行动, 动画对象消失, 然后同无敌做法

然后 搜索 def remove_state(state_id, force = false)   在end前加上一句  (self.hp -= 10087 ;self.damage = 10087 ;self.damage_pop = true) if state_id == 10086  
这样在10086号状态解除的时候就会造成10087点伤害 (PS: 你前面的延迟伤害也可以这样做)

3,  保命符.改 ,  写法换成 $game_troop.enemies.each{|i| i.add_state(10086)} if self.is_a?(Game_Actor) and @hp == 1 and self.skills.include?(10087)  

这样学会10087号技能的时候, hp为1就会给全体敌人上10086号状态 , 消失做法同上

4,  保命符.改 ; 所有人死亡时的条件判断为   $game_party.actors.all?{|i| i.dead?}

5, 保命符.改 + 无敌

6, 大时空.改 , 写法换成 $game_party.actors.each{|i| i.hp -= 1000000000 ;i.damage = 1000000000 ;i.damage_pop = true;
i.remove_state(10087)}  if self.is_a?(Game_Enemy) and self.id == 10086 and $game_troop.enemies.all?{|i| !i.exist?}

当敌人ID为10086的时候, 且所有敌人死亡时就给我方全员扣1亿血,并解除10087号状态

7, 无敌.改

=================================

系统做法上不难, 不过, 看样子你想要的是表演效果, 可惜XP默认的动画和战斗流程很难做"挨打方的反馈表演", 尤其你用CP制更是没有给反馈表演留下流程时间(反馈的伤害显示都被中毒覆盖, 笑), 所以, 除非对底层动画和战斗系统大改, 否则你想要的表演默认是做不到的

要么就曲线救一下, 用行动后调用公共事件和状态, 来一个一个去分歧做表演, 方法我之前有和你说过

---


另外, 我是可以做到啦, 挡枪就和你的黑洞一样了,  不过我用的动画和战斗流程早就不是默认的了, 你没法参考就是了


作者: 灯笼菜刀王    时间: 2026-6-16 10:14
看样子你还不了解XP的战斗流程

默认的情况下, XP的战斗流程如下:

步骤1,清除所有单位的行动, 并调取战斗事件,如果没有可执行的事件, 进入步骤2
步骤2, 生成"战斗/逃跑"的窗口, 如果玩家选择逃跑, 则进入逃跑判定,判定成功后中止战斗, 如果选择战斗, 进入步骤3
步骤3, 玩家给所有单位下命令, 然后进入步骤4
步骤4, 正式开打

步骤4也分几流程, 4-0生成敌人行动, 然后和玩家单位塞到一个数组里(之后叫它"行动者数组")并根据速度排序,  执行"回合的战斗事件", 然后判断胜负条件,不满足就进行下一步

4-1,从行动者数组里把第一个单位抽出来, 如果行动者数组是空的 ,则回到步骤1, 如果有行动者, 就执行毒伤害, 然后解除持续结束的状态, 刷新UI, 进行下一步 (我给你的"攻方"这个函数从这里可以使用)

4-2, 判断行动者能不能行动,不能行动直接跳到4-6, 可以行动就按命令生成行动结果(攻击,防御,逃跑,使用技能/道具啥的) ,混乱等改变命令的操作就在这里执行, 战斗公式计算也在这里, 特技名称从这里开始显示(我给你的"受方"这个函数从这里可以使用)

4-3, 行动方播放动画(技能动画1)

4-4, 对象方播放动画(技能动画2)   #如果用的齐时动画, 4-3和4-4是一起的, 就是动画1和动画2一起播放

4-5, 显示伤害,并把技能名称窗口隐藏 ,刷新UI, 进行下一步 (如果用彩虹剑之类的伤害显示是在4-3 4-4和动画一起播放的, 这里不显示伤害)

4-6, 执行公共事件, 然后回到4-1,开始下一个行动者

CP制在流程上有些不同, 它去掉步骤2, 3和4是交替进行的, 先进行步骤4, 等我方行动的时候才执行步骤3

以上每个阶段之间如果有播放动画或者伤害显示, 则会有等待流程,等待播放结束再进行下一步(※CP制各个阶段之间的等待并不严谨)

所以, 如果在同一个阶段里重复执行播放动画或弹伤害, 则会覆盖掉 , 想进行表演, 要么改造战斗流程增加额外阶段, 要么在4-1,4-3,4-4,4-5 的阶段以外插入动画, 笑

所以, 之前你的一些主动技能想表演, 我会让你在公共事件里处理, 这样可以自己安排表演流程,  但是, 挡枪这种不是"主动技能", 所以无法用公共事件的方法, 跳过原本流程在公共事件里表演, 能发挥的效果就很有限喽(最简单的就是在4-2插入动画, 在攻击动画前有流程给它播放)

其他阶段的表演, 可以试试加菲兄的 战斗中多个地方调用公共事件

-----
当然, 改造动画也是一种方式, 我的做法是直接在动画里写表达式, 这样就可以随时随地对脚本进行"干预", 管他流程不流程了, 笑


这就是我挡枪的做法, 当然, 想这样玩, 你要对脚本很熟悉,知道在哪里可以干预,怎么干预, 所以现在你暂时不能这样玩, 还是去用公共事件,想办法在默认流程里偷出额外的动画流程吧, 笑


作者: y967    时间: 2026-6-16 12:07
1,共生术

召唤兽和自己共生共死,技能伤害是宿主的一半,加血量是宿主的2倍,宿主死亡召唤兽也死亡,也可以是同伴。

2,挽尊术/大挽尊术

血量小于50%举白旗/脱裤时,屁股对外,可以是一个循环动画,就像蜡笔小新一样,受伤害减半,自己的技能伤害也减半,
血量小于20%举白旗/脱裤时,屁股对外,可以是一个循环动画,就像蜡笔小新一样,受伤害减70%,自己的技能伤害也减70%

3,颜面扫地

设置一个防御罩,防御加50%,如果敌人破防,则颜面扫地,去除防御罩加个屁股朝天循环动画,速度减半

4,唯快不破

遍历敌人速度最快者,减去其速度30%,也可以其他四维,攻击力/力量/魔力/敏捷,配合颜面扫地,决斗武德

5,武德充沛

如果颜面扫地三回合不死,则加武德充沛状态,可以有动画,消除一切状态,武德充沛为四维加20%。

6,决斗

武德充沛还是不死,则消除,加决斗状态,双方各加四维100%,因为敌人会先加,则只需我方加即可。

都是要遍历的,不是随机。

作者: 灯笼菜刀王    时间: 2026-6-16 17:40
本帖最后由 灯笼菜刀王 于 2026-6-16 18:42 编辑

1, 想召唤者死亡召唤兽消失, 做法 保命符.改 ,判断召唤者hp为0的时候, 强行让指定的召唤兽hp为0就行了(或者 hidden = true) ,至于什么伤害对半加血两倍, 直接数据库设置或者你已经搞过一大堆的伤害增减处理就行了

不过, 问题是, 召唤兽你要怎么做

A,真.召唤

一般做法是数据库搞个召唤兽队员, 然后技能附带公共事件在战斗中加入队伍, 然后战斗结束踢出去, 这种消失的写法是 $game_party.actors.delete(角色ID) #不过战斗中踢出去可能会对UI布局,站位等有影响, 具体情况在说吧

还有邪修做法, 在敌人队伍里塞个隐藏的敌人作为召唤兽, 这个敌人的技能全部是"攻击同伴",这种召唤兽不能控制也不会受到敌人攻击(但会挨我方打, 要特别处理下, 笑) ,这样它的出现和消失就都不影响我方布局喽

B,状态法

用状态模拟召唤兽, 然后以角色强制行动的方式来伪装成召唤兽的攻击(此时就可以伤害减半什么的) ,这种可以用行动后调用公共事件的方式来实现, 状态嘛,在1号状态里- 就直接死亡消除了, 笑

栗子:


因为妖梦是二刀流, 装备两把刀的时候平A是两刀单独结算, 所以半灵模仿本体平A也是两刀单独结算, 也就是说, 开启半灵模式, 妖梦一次平A会砍4刀



C, 特殊机制

和状态法差不多, 但是作为角色的技能存在, 以角色行动时发动技能当做召唤兽的攻击方式, 适合"召唤者"本身没有战斗能力的设计

栗子:
爱丽丝是人偶使, 所以她不能平A, 需要先召唤人偶出来才能进行攻击



召唤人偶后, 她的平A就会由召唤出来的所有人偶发动攻击, 每个人偶都会随机使用技能攻击随机目标, 所以爱丽丝需要先花上几回合来"布局", 然后才能发挥战斗力, 笑

D, 特殊机制.改

结合A和C的做法, 召唤兽为单独个体,但是不存在战场上, 在角色行动后,自己出来行动 ; 类似"八方旅人"里商人和牧师的"佣兵"

我家商人当然也会有佣兵, 笑


佣兵需要在世界各地招募, 自身能带的佣兵为2个(有被动可以扩展), 战斗中一次只能召唤一个,佣兵会在角色行动后自行行动, 有它独立的面板和技能(强大的高手可不容易遇到哦, 笑)


队伍中有商人, 靠近佣兵时右下角就有招募提示, 如果不按Z,按空格对话, 就是一般的聊天, 按Z后才会进行招募对话, 可以自行决定要不要招募, 招募后,能召唤3次, 然后需要重新回来找它招募, 笑 ,当然, 后继有被动技能, 可以直接续约, 笑

因为89还没做佣兵的战斗动画, 所以没有战斗展示喽





作者: y967    时间: 2026-6-17 18:59
本帖最后由 y967 于 2026-6-17 19:48 编辑

1,软控解除

减速沉默缴械,软控解除条件直接技能解除,中毒回合解除,解毒,延时解除,N回合解除

2,伪软控解除

压抑,减攻击,要振奋技能解除,没有学就解除不了,

绝望,只能普攻,遗忘所有技能,除了封印,要普攻解除,不破防就解除不了

死灵,绝望后死亡重生变为灵魂,遗忘所有技能,只能用一种技能,新技能固伤10,解除为BOSS的封印


3,真软控解除

绝望要一个中了混乱的人的技能解除,混乱的人用自身减SAN值,就可以解除绝望,平时用加SAN值,有什么用自己觉得

能力/能量流失,每回合减去魔力5点,MP200点,要敌人精英的特殊技能才解除,这个技能封印我方的特定技能,比如加血,加魔力

打死了敌人精英就解除不了了,

禁锢铠甲,加防御20%,但限制行动只能普攻,解除为敌人小兵的戳刺,小兵死了就解除不了。

BOSS中了绝望,会使用封印绝招的时候,会封印所有技能,双方都一样,那么就只剩普攻互相磨皮了,除非有死灵,先绝望,然后死亡进入死灵
BOSS中绝望使用封印就解除了,这个时候随机学会一种技能。在死灵时打死BOSS不会判作胜利。

4,硬控中期平衡

中了石化,会加防御,中了绝望会持续加血,但加的不多,中了混乱会持续加魔力,但不多,解除的时候会变成疯子,因为攻击力太高失控了

中多了石化会皮肤钙化,再也没有防御力,中多了绝望会即死,中多了压抑会抑郁,会有几率打不出伤害

中多了毒,四维会每次扣一点。单场战斗加多了血,就会按次数逐渐减少加血量,每次减少5%。获得奶瓶头衔。

5,软控中期惩罚

差不多,中多了减速,就真的减速了,永久扣除速度N,中多了缴械就永久扣除攻击力
自己的增益BUFF用多了,就会减少收益,甚至可以收费,每次扣钱,六亲不认,亲兄弟明算账

6,技能中期惩罚

一个技能定量,只能使用12次,单次战斗超过就要减伤,超过24次就会有几率损坏,损坏的技能可以修复,技能有耐久度
耐久度为0,则销毁,超过24次每次损坏就扣耐久度一点。

如果皮肤钙化又技能损坏,就可以看到一个裸奔的人。损坏后要重新打秘籍学。

技能缴械,武器可以缴械,技能也可以,过于强大,就缴械技能N回合不能使用。损一点的,加定量,三回合使用后就损毁。







作者: 无忧谷主幻    时间: 2026-6-18 18:47
本帖最后由 无忧谷主幻 于 2026-6-18 21:03 编辑

1,Game_Battler 2
状态自然解除,改成
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● 状态自然解除 (回合改变时调用)
  3. #--------------------------------------------------------------------------
  4. def remove_states_auto
  5.   for i in @states_turn.keys.clone
  6.     if @states_turn[i] > 0
  7.       @states_turn[i] -= 1
  8.     elsif rand(100) < $data_states[i].auto_release_prob
  9.       remove_state(i)
  10.       if i == 3
  11.         remove_state(2)
  12.       end
  13.     end
  14.   end

当3号状态被自然解除时,额外解除状态2,可以做出延迟解除的效果
2.1减攻击?这个还需要教吗?
2.2
关于状态加减技能我的工程应该有,重点说说普攻破防后,解除自己身上的状态
Game_Battler 3
应对通常攻击效果
RUBY 代码复制
  1. # HP 的伤害计算
  2.       self.hp -= self.damage

下面
RUBY 代码复制
  1. # 判断伤害是否大于0且攻击者拥有10号状态
  2.     if self.damage > 0 && attacker.state?(10)
  3.       # 解除攻击者自身的10号状态
  4.       attacker.remove_state(10)
  5.     end

2.3,Game_Battler 1
战斗不能判定改成
RUBY 代码复制
  1. def dead?
  2.   is_dying = (@hp == 0 && !@immortal)
  3.   if is_dying && self.state?(3)
  4.     self.add_state(17)
  5.   end
  6.   return is_dying
  7. end

角色死亡时若身上有3号状态,则为其附加17号状态
作者: y967    时间: 2026-6-19 07:03
本帖最后由 y967 于 2026-6-19 07:16 编辑

技能/效果异变中期研究

1,软控技能中期异变

减速技能,若敌人速度快于我方,则异变

遍历敌人速度快于我方最高速度/自己预设速度阈值,则异变为只减速敌人最高速度的人,20%,否则按原技能

削弱技能也一样,减攻/减防/减魔,不同的是,可以变异为其中一个,减攻的可以变异为减防,三个中随机一个


2,效果变异

冰冻
遍历敌人速度最快者,若超过阈值,则冰冻变异为冰冻全体,否则为单体

出血
遍历敌人攻击超过阈值,则出血变为全体出血,否则为单体

昏睡
遍历敌人魔力最高者超过阈值,则昏睡变异为麻痹,所有敌人几率出现

大混乱
遍历敌人血量最高者,超过阈值,则混乱变异为四个异常中的一个,全体,否则为单体。


3,技能定量

除了损毁,还可以定量,治疗为1,攻击类为2,控制类为3,大招为4
每次丢股子,出现数字就是能放的技能范围,比如3,就是1-3都可以放,放完扣变量
一共30点,丢股子可以是BONUS,不一定是主要攻击方式。

4,单挑

有几率出现单挑一本目,除了使用方和被攻击方,其他人都陷入不行动,4回合。可以是BONUS,不然挑自己最厉害的一个个击破,最后集火BOSS,赖皮

5,场外配资

赌这把谁先死,如果我方先死则赔率为1:2,如果敌人死则1:5,下注在战斗前,结算在战斗后,适合明雷

6,变异杠杆

出现技能/效果变异则记录变量,场外配资加杠杆,就可以赚点,当然不能随便SL,出现几率一定不会太高就是了。

7,变异成就

记录变量,写入成就,获取头衔/BB/免疫装备,就可以随便设置获得条件了

8,变异范围

变异设置范围,效果就选随机几个,当然要增益的,削弱的,或混合型,所获取的头衔/BB/装备也应该是随机的
冰冻的减速分三档,出血也分三档,大混乱中就随意设置了,增益的可以是加血,效果分散设置到50,加着加着
残血的人可能只加几十点,有点捉急。


9,敌人中期反异变

当然敌人也可以反异变,就是可以让你的技能效果随机更改,比如冰冻变为出血,加血变为分散度80,要命的时候加不上
比直接硬控太失去平衡,变异/反变异可以一定程度影响战局,但不会导致不能攻击的情况。

10,技能策反

人可以策反,技能也可以,把攻击技能范围变为自己人,把加血/增益BUFF范围为敌人,自己加不了血了,只能给敌人加,实现一定
程度的硬控抵抗变异。






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