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

Project1

 找回密码
 注册会员
搜索
查看: 1739|回复: 12
打印 上一主题 下一主题

[原创发布] 【2025.5.28 BUG修复】MZ插件-CTB战斗系统

[复制链接]

Lv2.观梦者

梦石
0
星屑
783
在线时间
174 小时
注册时间
2021-5-1
帖子
11
跳转到指定楼层
1
发表于 2024-4-22 00:27:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 alderpaw 于 2025-5-29 00:11 编辑

插件地址:https://github.com/alderpaw/rmmz ... _CtbBattleSystem.js
附件图片里提供了用于指示行动条位置的箭头图标

2025.5.28:修复了一系列bug,目前S爆发技功能应该不会导致卡死了,另外增加了一系列可以设置的额外属性(如物理伤害增加、魔法伤害增加、硬直减少),基本都是轨迹系列里各种高级回路会附带的特殊属性。

重要:这个插件是基于VisuMZ_1_BattleCore写的,目前必须一起使用!!!
单独使用会报错,这个报错目前我解决不了,因为我的很多处理逻辑都是按照战斗核心修改了以后来写的,不太了解官方原生的哪里有差别。
使用时,将此插件放在战斗核心下面,并将战斗系统设置为“时间制-等待”。


实现类似轨迹的CTB战斗系统,根据人物agi和不同行动的耗时来决定各角色的行动顺序。

*************** v1.10修改 ***************
****** BUG修复和特性修改 ******
1. 修复了有时按键盘1~4键无法爆S技的问题。
2. 修复了角色正在释放技能动画时,对该角色爆S技会导致窗口卡住的问题。
3. 删除了竖向行动条,只保留横向(有bug,懒得做适配了)。
4. 修复了回复/扣血类AT奖励触发时机不固定的问题。现在一定会在轮到角色行动回合
时触发效果,不会在行动结束后再触发。并且,如果这个AT奖励已经对某名角色产生过
效果了,那么爆S技的角色虽然会强制移动到该位置,但不会重复获得该AT奖励。
5. 修复了某些异常状态下战斗系统可能会卡死的问题(还需验证是否完全修复)。
6. 现在本插件将VisuMZ战斗核心指定为了必需的前置插件。
7. 增加对魔石系统(Alderpaw_MagicStone)的适配。

****** 新增功能 ******
1. 新增选择技能/物品时行动条可往下移的选项,避免挡住上方的描述窗口。
2. 新增开局直接插入一定量AT奖励的选项。
3. 改变了状态和BUFF计算回合数的逻辑。现在状态和BUFF都是在一次行动结束后
刷新持续回合数(驱动不消耗回合数)。
4. 可指定敌人等级以及是否为Boss,用于实现你想要的功能。例如,DQ中只对等级为
特定倍数的敌人才生效的即死魔法,闪之轨迹中Boss类敌人只会进入1回合异常状态等。
具体用法请看下面的Notetags部分的说明。
5. 新增很多轨迹系列里经常用到的人物属性,例如暴击增伤、低血增伤、护盾等。这些
参数需要通过备注栏指定,并且一定要在VisuMZ战斗核心中做适当配置才能生效。具体
请看下面的Notetags部分的说明。
6. 本插件里还包含对VisuMZ_2_BattleGrid插件的一些兼容,但这个插件得额外付费20
美刀,大部分人应该不用,所以此处不赘述。

*************** v1.01新增 ***************
1. 获得零驱动AT奖励时,魔法预测的行动位置显示为硬直时间,而不是驱动时间。
2. 增加插件参数,可选择竖向放置ctb行动条。
3. 增加新功能:可为装备设定AT延迟效果,装备上后攻击就能延迟敌人。
4. 增加新功能:S爆发技。类似空轨,按下键盘上的1~4数字键可无视行动顺序瞬发S技。
此时会强制进入S技选择界面,只能使用S技,不能做其他任何操作。
可以在插件参数中设置爆S技时的音效以及需要多少TP才能发动S技。
另外,最好在人物栏创建一个标记,符合发动S技的条件时就亮起。
但由于每个人的UI都不同,这里就不提供了,可以自己简单写一下。


********** 战斗系统介绍 **********
每名敌我角色都有一个AT(Action Time)值,AT=0时该名角色就可以行动。
战斗开始时,每名角色都有一个随机的AT值,agi越高则AT值小的概率就越大。
战斗开始时以及每次行动结束时,都会同步减少所有角色的AT,直到有角色的AT减至0。
不同的行动(技能、物品、普攻等)具有不同的耗时,称之为ST(Skill Time)。
对于ST,可以分别设置驱动时间castST和硬直时间delayST。
-驱动时间:技能使用后需要读条才能释放,一般这种技能就是魔法。
-硬直时间:技能结束后,角色需要等待多久才能再次行动。
每次行动后,根据ST和agi可以计算得知该名角色的AT会增加多少。
AT计算公式为ΔAT=100*ST/agi,向下取整。
然后,根据AT重新对所有角色进行排队。
行动结束的角色会插到相应的位置,从而实现CTB战斗系统的循环。

此外,行动条上还会随机出现AT奖励,会使当前行动的角色受到一些增益或减益效果。
你可以控制AT奖励的出现概率,并定义AT奖励的种类。

在轨迹系列中,技能一般是分为战技和魔法。所有“命中类型”为物理攻击的技能就是战技,
所有“命中类型”为魔法攻击的技能就是魔法。注意战技和魔法的区分只和命中类型相关,而
与伤害的计算公式无关,例如部分战技也可以是魔法伤害,伤害公式考虑使用者的魔攻和目
标的魔防。下文中所有的“战技”和“魔法”都遵循这里的定义。
一般来说普通攻击也会设置为物理命中类型,所以普通攻击也属于战技。
魔法需要驱动时间,战技不需要,本系统计算驱动时间时也只会考虑上面定义的“魔法”。

********** VisuMZ战斗核心设置 **********
如果你希望本插件新增的人物属性能实际生效的话,必须在VisuMZ战斗核心中做以下设置。
建议打开本插件的.js文件再复制,格式更好看。
1. 把Damage Settings的Formulas的JS: Overall Formula改成以下内容:
const user = this.subject();
const target = arguments[0];
const critical = arguments[1];
const item = this.item();
const stunStateId = 13;
// Get Base Damage
const baseValue = this.evalDamageFormula(target);
// Calculate Element Modifiers
let value = baseValue * this.calcElementRate(target);
// Calculate Physical and Magical Modifiers
if (this.isPhysical()) {
value *= target.pdr;
value *= user.pdr_to_target;
//计算残血和满血增伤
value *= (1 + (user.low_hp_craft_damage_rate - 1) * (1 - user.hp / user.mhp));
value *= (1 + (user.high_hp_craft_damage_rate - 1) * (user.hp / user.mhp));
}
if (this.isMagical()) {
value *= target.mdr;
value *= user.mdr_to_target;
//计算残血和满血增伤
value *= (1 + (user.low_hp_magic_damage_rate - 1) * (1 - user.hp / user.mhp));
value *= (1 + (user.high_hp_magic_damage_rate - 1) * (user.hp / user.mhp));
}
// Apply Healing Modifiers
if (baseValue < 0) {
value *= target.rec;
if (item.isSkill()) {
value *= user.extra_heal_rate;
}
}
// Apply Critical Modifiers
if (critical) {
value = this.applyCritical(value);
}
// Apply Variance and Guard Modifiers
value = this.applyVariance(value, item.damage.variance);
value = this.applyGuard(value, target);
//破防增伤
if (target.isStateAffected(stunStateId)) {
value *= 1.2;
}
// 伤害取整后,减去护盾
value = Math.round(value);
if (target._shieldHp > 0) {
const originalShieldHp = target._shieldHp;
target._shieldHp = Math.max(0, target._shieldHp - value);
value = Math.max(0, value - originalShieldHp);
if (target._shieldHp === 0) {
for (const state of target.states()) {
if (state.meta["Shield Hp Value"]) {
target.removeState(state.id);
break;
}
}
}
}
return value;

2. 把Damage Settings的Critical Hits的JS: Damage Formula改成以下内容:
// Declare Constants
const user = this.subject();
let damage = arguments[0];
let multiplier = 1.5;
let bonusDamage = this.subject().luk * this.subject().cri;
if (this.isHpRecover() || this.isMpRecover()) {
bonusDamage *= -1;
}
if (this.isPhysical()) {
multiplier *= user.extra_critical_damage_rate;
}
// Apply Notetags
const note = this.item().note;
if (note.match(/<MODIFY CRITICAL MULTIPLIER:[ ](\d+)([%%])>/i)) {
multiplier = Number(RegExp.$1) / 100;
}
if (note.match(/<MODIFY CRITICAL MULTIPLIER:[ ]([\+\-]\d+)([%%])>/i)) {
multiplier += Number(RegExp.$1) / 100;
}
if (note.match(/<MODIFY CRITICAL BONUS DAMAGE:[ ](\d+)([%%])>/i)) {
bonusDamage *= Number(RegExp.$1) / 100;
}
if (note.match(/<MODIFY CRITICAL BONUS DAMAGE:[ ]([\+\-]\d+)([%%])>/i)) {
bonusDamage += bonusDamage * (RegExp.$1) / 100;
}
if (note.match(/<JS CRITICAL DAMAGE>\s*([\s\S]*)\s*<\/JS CRITICAL DAMAGE>/i)) {
const code = String(RegExp.$1);
try {
eval(code);
} catch (e) {
if ($gameTemp.isPlaytest()) console.log(e);
}
}
// Return Damage
return damage * multiplier;

3. 把Mechanics Settings的JS: Action Related的JS: Post-Damage改成以下内容:
const value = arguments[0];
const target = arguments[1];
const user = this.subject();
const a = user;
const b = target;
const action = this;
const item = this.item();
const skill = this.item();
if (this.isMagical() && user.attack_mp_absorb_rate > 0) {
user.gainMp(Math.floor(value * user.attack_mp_absorb_rate));
}
if (this.isPhysical() && user.attack_hp_absorb_rate > 0) {
user.gainHp(Math.floor(value * user.attack_hp_absorb_rate));
}
if (value >= target.hp && user.kill_tp_absorb_value > 0) {
user.gainTpReward(user.kill_tp_absorb_value);
}
return value;

********** Notetags **********
扩展功能通过将特定标签写在备注栏来实现。注意,以下所有的冒号都是英文冒号。

1. 设定技能的驱动时间和硬直时间
填写位置:技能的备注栏
<castST:50> 该技能的驱动时间为50,若不设置则驱动时间默认为0(即不需要驱动)。
<delayST:120> 该技能的硬直时间为120,若不设置则硬直时间默认为100。

2. 增加命中目标的AT,可用于实现具有延迟效果的技能或装备
填写位置:技能、装备的备注栏
<AT Delay By Value:+x> 命中后固定将目标的AT增加x,这种延迟与agi无关。
<AT Delay By ST:+x> 命中后使目标的硬直增加x,实际AT延迟量为100*x/target.agi。
<AT Delay Chance:0.x> 有0.x的概率触发延迟,不写默认100%触发(若敌人有延迟抗性,会相应折算)。
另外,可以在插件参数中指定哪些类型的技能会触发装备的延迟特效。比如轨迹系列中,
一般魔法不会触发这类特效,只有普通攻击和战技可以。

3. 减少命中目标的AT,可用于实现提行动条的技能
填写位置:技能的备注栏
<AT Advance By Value:+x>表示技能命中后使目标的AT减少x,与agi无关。
<AT Advance By ST:+x>表示技能命中后使目标的硬直减少x,通过100*x/target.agi计算得到AT减少量。

4. 设置本技能具有解除正在驱动的魔法的功能
填写位置:技能的备注栏
<Cancel Cast>

5. 特定状态下才能/不能使用的技能
填写位置:技能的备注栏
<Disabled In State: x>表示该技能在x号状态下无法使用。
<Enabled In State: x>表示该技能只有在x号状态下才能使用。

6. 指定技能为S爆发技
填写位置:技能的备注栏
<奥义技>表示将此技能设定为S爆发技,可以设定多个,爆S时选择一个使用。

7. 指定敌人的等级以及是否为Boss
填写位置:敌人的备注栏
<Level: x> 表示将敌人等级设定为x
<Boss> 表示将该敌人设定为Boss
Game_Enemy类新增一个isBoss()方法,用于判断敌人是否为Boss。

8. 人物新增属性
填写位置:装备、状态的备注栏,角色佩戴该装备或拥有该状态时触发相应效果。
<Craft DelayST Rate: x.y>
角色所有行动的硬直时间(ST)变为x.y倍。多个装备·状态的该效果之间乘算。
<CastST Rate: x.y>
角色使用魔法时的驱动时间变为x.y倍。多个装备·状态的该效果之间乘算。
<Magic Critical Rate: +0.x>
轨迹系列里,魔法是无法暴击的,因此我推荐在数据库里把魔法的暴击设置为“无”。
而这个标签可以使魔法有0.x的概率暴击。多个效果之间加算。
<Extra Critical Damage Rate: +0.x>
角色的暴击伤害额外增加0.x,多个效果之间加算。内部加算后,和原始暴击伤害倍率
之间则是乘算。比如原始暴击伤害1.5倍,有2个装备设置了这个标签,分别是+0.1和
+0.2,那么最终暴击伤害倍率为1.5*(1+0.2+0.1)=1.95。
<Extra Heal Rate: +0.x>
角色使用回复技能时,对目标的治疗效果额外提升0.x倍。多个效果之间加算。
<Craft Damage Rate: +0.x>
角色使用战技(命中类型为物理的技能)时,伤害增加0.x倍,多个效果之间加算。
<Magic Damage Rate: +0.x>
角色使用魔法(命中类型为魔法的技能)时,伤害增加0.x倍,多个效果之间加算。
<Mp Absorb Rate: +0.x>
角色使用魔法命中敌人时,按照伤害的0.x倍回复MP,多个效果之间加算。
<Hp Absorb Rate: +0.x>
角色使用战技命中敌人时,按照伤害的0.x倍回复HP,多个效果之间加算。
<Kill Tp Absorb Value: +x>
角色击杀敌人时,回复x点TP。多个效果之间加算。
<Low Hp Craft Damage Rate: +0.x>
角色HP越低则战技伤害越高,1血时增加0.x倍,满血时不增伤(线性关系),多个效果之间加算。
<Low Hp Magic Damage Rate: +0.x>
角色HP越低则魔法伤害越高,1血时增加0.x倍,满血时不增伤(线性关系),多个效果之间加算。
<High Hp Craft Damage Rate: +0.x>
角色HP越高则战技伤害越高,满血时增加0.x倍,1血时不增伤(线性关系),多个效果之间加算。
<High Hp Magic Damage Rate: +0.x>
角色HP越高则魔法伤害越高,满血时增加0.x倍,1血时不增伤(线性关系),多个效果之间加算。

9. 护盾相关
填写位置:状态的备注栏
<Shield Hp Value: x> 此状态提供护盾效果,护盾的承伤上限为x(x是正整数)。
这个护盾是黎轨里的机制,而不是空零碧闪那样的按次数来完全防御,因为我一直
觉得空轨的盾太强了,黎轨的平衡一点。对于护盾状态,需要将持续回合数设置为
无效,护盾HP消耗完后会自动移除。另外,最好是给护盾做一个UI,用来显示角色
当前的护盾值。本插件实现了一个Sprite_Gauge_Shield类,可以像HP那样显示一
个类似血条的“护盾条”,但是需要一定的JS基础才能将其放到战斗UI上去。由于每
个人使用的战斗UI都不同,本插件没有实现UI的修改,只是提供了护盾的机制。
更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 2+2 收起 理由
hanyilun + 1 精品文章
言物之石 + 1 塞糖

查看全部评分

Lv4.逐梦者

梦石
0
星屑
7044
在线时间
451 小时
注册时间
2021-12-4
帖子
484
2
发表于 2024-4-22 08:31:42 | 只看该作者
顶一个。最近正在拿古早的psvita玩空轨fc,楼主的截图不但有CTB还有【移动】指令真是太棒啦w CTB系统最大的亮点之一就是bonus,另一个亮点是S-Break不知道楼主有没有兴趣做一下w
CTB系统里最纠结的点感觉是【buff / state 持续时间】的问题,按固定AT值或按自己行动回合数感觉各有各的问题(后者还要额外考虑cast回合是否应该不消耗层数),似乎要取决于这个 buff/state 是在打人还是挨打时获益。

点评

欸,我还以为你退圈了呢  发表于 2024-5-18 18:57
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
783
在线时间
174 小时
注册时间
2021-5-1
帖子
11
3
 楼主| 发表于 2024-4-22 08:50:30 手机端发表。 | 只看该作者
本帖最后由 alderpaw 于 2024-4-22 09:03 编辑
小秋橙 发表于 2024-4-22 08:31
顶一个。最近正在拿古早的psvita玩空轨fc,楼主的截图不但有CTB还有【移动】指令真是太棒啦w CTB系统最大的 ...


移动和战斗网格不是我写的,是用的yep最近发的一个20刀的battleGrid插件,完全自己写一套移动+网格+技能范围还要兼容战斗核心的话有点麻烦。
S-Break有空会做一下的。
另外状态计数我采用的就是mz原生的逻辑,按回合算且cast不消耗回合数,这样比较方便,而且跟闪轨以后是一样的。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7044
在线时间
451 小时
注册时间
2021-12-4
帖子
484
4
发表于 2024-4-22 11:39:15 | 只看该作者
本帖最后由 小秋橙 于 2024-4-22 11:41 编辑

确实,grid的瞄准感觉就超级麻烦,闪轨战场是圆形的所以我偏向于零碧(但cast不消耗层数),技能范围有圆(有半径大小,但方格用圆挺奇怪的,应该提供曼哈顿和切比雪夫邻域)和射线(有宽度大小),瞄准有指定敌人(还要考虑死亡自动更改)、指定绝对位置(如果是射线那么技能使用者因为挨打而偏移会导致射线被旋转)、指定相对位置(还要考虑挨打是否转身及其影响,如果不转身的话射线会保持和原来平行)
状态计数按自己的回合算我觉得比较适合「中毒、灼烧、封技、封魔」这些,但可能不太适合某些挨打时获益的状态,否则会出现「速度越慢越有利」的尴尬情况?
说起来除了S-Break,空轨从sc开始还有了chain craft这种东西,都可以安排上(基本的AT Delay和AT Advance截图中已经看到了)。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
783
在线时间
174 小时
注册时间
2021-5-1
帖子
11
5
 楼主| 发表于 2024-4-22 15:27:18 手机端发表。 | 只看该作者
小秋橙 发表于 2024-4-22 11:39
确实,grid的瞄准感觉就超级麻烦,闪轨战场是圆形的所以我偏向于零碧(但cast不消耗层数),技能范围有圆( ...

我之前做过玩具性质的战场网格,但只做到了方形范围的技能,其他的有各种困难。比如直线技,最好是根据方向不同人物的方向也要调整,但目前sv战斗图只有左右方向的,上下直线和斜向直线没法很好的展现;带位移的技能,在战斗核心下各种bug,而且yep加密不好解决;大型怪物占多个格子,碰撞体积也要解决;还有rm战场不够大,最好是camera能跟着玩家的位置动来扩展范围,这个超出了能力范围。如果只是简略版的,圆形技+直线技且不需要对齐方位,应该还能做做。
关于挨打增益的状态,应该也就防御提升、回避提升这些算spd慢的时候有益的了吧,护盾反射之类的都是挨打就没了,感觉总体影响不算大。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
783
在线时间
174 小时
注册时间
2021-5-1
帖子
11
6
 楼主| 发表于 2024-4-27 10:25:58 | 只看该作者
增加S爆发技的功能,但是目前不搭配yep战斗核心一起使用的话会报错,且暂时没法解决。
所以如果想使用或参考的话,请和VisuMZ_1_BattleCore一起用吧。

点评

@小秋橙 其实不管加不加S爆发技,没有战斗核心时运行都不太稳定。报错基本都来源于选择行动时action为空,比如爆S后点击选技能的界面。  发表于 2024-4-27 21:12
好哦,我有空看看能不能解决这个报错,目前能确定是s爆发技还是还是0驱动bonus引起的吗?  发表于 2024-4-27 18:52
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7044
在线时间
451 小时
注册时间
2021-12-4
帖子
484
7
发表于 2024-4-29 15:08:23 | 只看该作者
报个bug,第824行:
//画当前行动的角色
        if (this._battlers[0].isEnemy()) {
            this._battlerFaces[0].setFrame(24, 0, 96, 96);
        }
        else {
            this._battlerFaces[0].setFrame(24 + (this._battlers[i]._faceIndex % 4) * 144, 24 + Math.floor(this._battlers[i]._faceIndex / 4) * 144, 96, 96); // i is not defined
        }
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4022
在线时间
735 小时
注册时间
2016-2-28
帖子
148
8
发表于 2024-5-10 11:35:26 | 只看该作者
楼主真是太棒了!用了几年的RM,都没有找到和轨迹一样的ctb系统,终于看到有人做了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
783
在线时间
174 小时
注册时间
2021-5-1
帖子
11
9
 楼主| 发表于 5 天前 | 只看该作者
上次论坛被攻击前更新了版本,做一下补档
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1249
在线时间
91 小时
注册时间
2020-2-24
帖子
38
10
发表于 3 天前 | 只看该作者
alderpaw 发表于 2025-5-29 00:12
上次论坛被攻击前更新了版本,做一下补档

好好好,前排支持!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-6-3 02:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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