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

Project1

 找回密码
 注册会员
搜索
楼主: y967
打印 上一主题 下一主题

[讨论] 蚂蚁噬心

[复制链接]

Lv4.逐梦者

梦石
0
星屑
17251
在线时间
4218 小时
注册时间
2013-7-18
帖子
2746
11
 楼主| 发表于 前天 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%。
退隐....
回复 支持 反对

使用道具 举报

Lv4.逐梦者

素材区好人

梦石
3
星屑
11579
在线时间
4219 小时
注册时间
2011-7-21
帖子
2542

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

12
发表于 前天 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%,这些应该不用我教吧

点评

是的,基本都是在公共事件中插入,如果涉及脚本,我会提前说清需要改哪段  发表于 昨天 18:34
7是公共事件做的?那是技能放完之后才进入  发表于 昨天 16:25
嗯,要恢复,不过每次战斗后要有惩罚,不能一直猥琐发育,每次永久扣1%血上限好了  发表于 昨天 10:47
扣完战斗结束是否要恢复?  发表于 昨天 10:32
8不是那么简单的,是每次扣20%血上限,如果太狠,就10%,6的话应该是有几个BUFF随机选一个  发表于 昨天 07:23
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
41974
在线时间
5991 小时
注册时间
2006-11-10
帖子
6997
13
发表于 前天 17:45 | 只看该作者
本帖最后由 灯笼菜刀王 于 2026-6-13 21:23 编辑

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

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

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

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


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


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

也可以这样

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

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

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

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

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


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


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

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

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

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

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


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



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

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

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

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

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

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

点评

当你真的设置了条件开启,她也就是执行高低权重的所谓的智力,她海是不会产生权衡利弊的,所以,AI或BI都不会有任何”出错“的可能,非常可怕  发表于 昨天 10:18
机器只是机器,她不会有道德判断,不会有任何情感,弱点,情绪,抑郁,压力,所以她不会执行“错误/次要/人情/不得不/之类的复杂策略,只有人会  发表于 昨天 10:15
这里说的AI并不是如今热门的"人工智能产业", 而仅仅是"你如何制作敌人的行动逻辑", 敌人能有多智能全看你如何给它更多的条件判断   发表于 昨天 09:12
幻觉不好做,知道,因为AI不会“判断”我方是不是幻觉,如果能,那AI就逆天了,她不会有任何策略,AI只能是伪策略,要么逆天,笑。  发表于 昨天 07:10
比如敌人设置防御三个属性的阵法,其中只有一个攻击了造成伤害,其他两个属性伤害为0,复杂点就6个属性,两个有效,变化多点就换阵  发表于 昨天 07:08
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
17251
在线时间
4218 小时
注册时间
2013-7-18
帖子
2746
14
 楼主| 发表于 昨天 08:00 | 只看该作者
伪AI策略中期探索

1,所见即所得

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

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

2,富贵险中求

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

3,延时标记

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

4,减速/加速标记

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

5,残血标记

该技能为血量低于30%/10%的单个队友标记,N回合后加血,加血效果是N*基础加血值,该技能为加血技能,如果中了前面的标记又想富贵险中求,则会产生
奇妙的不可思议的事件。
退隐....
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
41974
在线时间
5991 小时
注册时间
2006-11-10
帖子
6997
15
发表于 昨天 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不够), 敌人就不会随机到该行动

点评

你要情感,你要推翻规则,你要创造新的秩序, 那是你的事, 我只在游戏层面上, 和你说"你的想法想要实现需要怎么做", 仅此而已  发表于 昨天 11:10
能让敌人和你斗得有来有回才好玩, 我不追求什么推翻,追求什么革命, 我只想让游戏能有更多的玩法, 我不谈宏达叙事,只着手能做到的  发表于 昨天 11:08
而BI并不需要什么技术, 就是列出各种条件分歧,纯粹的体力活, 笑, 只要会写基本的表达式即可,任何人学一下脚本规则都可以做到  发表于 昨天 11:06
不, 执着的是你, 看你前面那些脑洞就想和敌人"斗智斗勇", 所以我才打了这么多字来和你说, 想要敌人能和你斗智斗勇, 需要怎么做, 笑  发表于 昨天 11:04
所以我的游戏基本都会有碎碎念,你打多了小怪会吐槽你过于凶残啦,”你拿我当经验包,不和你玩了,召唤大哥来整你“,再打不过就丢盔弃甲  发表于 昨天 10:36
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
41974
在线时间
5991 小时
注册时间
2006-11-10
帖子
6997
16
发表于 昨天 11:02 | 只看该作者
本帖最后由 灯笼菜刀王 于 2026-6-14 11:21 编辑

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

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


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

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


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


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


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

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

敌人就会过来踩雷啦~

如果敌人没有"逻辑", 就无法引诱, 想让它踩雷就只能随缘了, 那就谈不上"斗智斗勇"啦,  笑

点评

因为队员主要来源是"抽卡", 笑, 所以,相关的角色剧情触发前提是你已经拥有这个角色,加上好感度什么的,线性不了一点, 笑,所以我的剧情是小故事集合   发表于 昨天 12:23
我的剧情不是线性, 是通过接任务来触发的, 主线支线全部是任务驱动, 玩家不会满世界旅行, 毕竟主角是镇守一方的"军阀",所以剧情基本在港区推进   发表于 昨天 12:20
战棋的胜利条件本来就是多种多样的,实际上你说的撤退为条件, 第二场剧情战斗就是了(顺便让玩家理解撤退和失败), 笑  发表于 昨天 12:12
目前也是我线性叙事的弱点,增加周旋难度,多条件满足开启,设置封印等,主要方向就是这些,增加剧情曲折,获得道具难度,戏外剧情  发表于 昨天 12:08
每次条件足了,你自然打过了,每次都要解决条件不足,精英和BOSS都需要5-8个条件满足,然后你才能打的过,大概就是你脑洞不足的高级战屡匮乏  发表于 昨天 12:06
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
41974
在线时间
5991 小时
注册时间
2006-11-10
帖子
6997
17
发表于 昨天 12:44 | 只看该作者
本帖最后由 灯笼菜刀王 于 2026-6-14 12:47 编辑

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

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

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


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

点评

没有什么选择困难, 我的玩家可是港区最高指挥官, 当然是大人做法,"我全都要", 笑  发表于 11 小时前
cp100多,真够勤劳的,也太多了,选择困难的我,最后可能光棍,笑  发表于 昨天 16:14
回复 支持 反对

使用道具 举报

Lv4.逐梦者

素材区好人

梦石
3
星屑
11579
在线时间
4219 小时
注册时间
2011-7-21
帖子
2542

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

18
发表于 昨天 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

点评

这么快,辛苦了  发表于 昨天 16:10
回复 支持 反对

使用道具 举报

Lv4.逐梦者

素材区好人

梦石
3
星屑
11579
在线时间
4219 小时
注册时间
2011-7-21
帖子
2542

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

19
发表于 昨天 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

测试

点评

估计是改了哪些原生脚本吧,这个不上工程还真不好判断  发表于 9 小时前
20楼,就是原版的B3复制过来,再把你的脚本贴进去,删去所有其他脚本,也是出错,新工程就没事  发表于 10 小时前
但我把B3重新复制过来,再贴进去也不行啊,肯定是整个工程哪里错了。一般我不会直接改原脚本,都是复制一份  发表于 10 小时前
估计Game_Battler 3加了太多东西,有出错截图吗?最好把修改后的 Game_Battler 3直接贴出来  发表于 10 小时前
我重新开新工程,又可以了,这就是我最怕的情况,一旦P1出错,就建立P2工程,就不知道那里冲突了  发表于 11 小时前
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
17251
在线时间
4218 小时
注册时间
2013-7-18
帖子
2746
20
 楼主| 发表于 10 小时前 | 只看该作者
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
退隐....
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2026-6-15 22:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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