feat(skill): 新增技能击退概率属性并调整相关逻辑
1. 新增knockback_skill_chance属性统一管理技能击退概率 2. 重构击退判定逻辑,支持配置化击退概率而非固定判定 3. 调整红蓝技能预制件的位置、缩放和动画参数 4. 调整角色控制器UI布局参数 5. 为默认普攻配置100%基础击退概率
This commit is contained in:
@@ -7,11 +7,11 @@
|
|||||||
"embeddedPlayerGroups": []
|
"embeddedPlayerGroups": []
|
||||||
},
|
},
|
||||||
"_native": "",
|
"_native": "",
|
||||||
"sample": 30,
|
"sample": 12,
|
||||||
"speed": 1,
|
"speed": 1,
|
||||||
"wrapMode": 1,
|
"wrapMode": 1,
|
||||||
"enableTrsBlending": false,
|
"enableTrsBlending": false,
|
||||||
"_duration": 0.16666666666666666,
|
"_duration": 0.4166666666666667,
|
||||||
"_hash": 500763545,
|
"_hash": 500763545,
|
||||||
"_tracks": [
|
"_tracks": [
|
||||||
{
|
{
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
"__type__": "cc.ObjectCurve",
|
"__type__": "cc.ObjectCurve",
|
||||||
"_times": [
|
"_times": [
|
||||||
0,
|
0,
|
||||||
0.03333333333333333,
|
0.08333333333333333,
|
||||||
0.06666666666666667,
|
0.16666666666666666,
|
||||||
0.1,
|
0.25,
|
||||||
0.13333333333333333
|
0.3333333333333333
|
||||||
],
|
],
|
||||||
"_values": [
|
"_values": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
"embeddedPlayerGroups": []
|
"embeddedPlayerGroups": []
|
||||||
},
|
},
|
||||||
"_native": "",
|
"_native": "",
|
||||||
"sample": 30,
|
"sample": 12,
|
||||||
"speed": 1,
|
"speed": 1,
|
||||||
"wrapMode": 1,
|
"wrapMode": 1,
|
||||||
"enableTrsBlending": false,
|
"enableTrsBlending": false,
|
||||||
"_duration": 0.16666666666666666,
|
"_duration": 0.4166666666666667,
|
||||||
"_hash": 500763545,
|
"_hash": 500763545,
|
||||||
"_tracks": [
|
"_tracks": [
|
||||||
{
|
{
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
"__type__": "cc.ObjectCurve",
|
"__type__": "cc.ObjectCurve",
|
||||||
"_times": [
|
"_times": [
|
||||||
0,
|
0,
|
||||||
0.03333333333333333,
|
0.08333333333333333,
|
||||||
0.06666666666666667,
|
0.16666666666666666,
|
||||||
0.1,
|
0.25,
|
||||||
0.13333333333333333
|
0.3333333333333333
|
||||||
],
|
],
|
||||||
"_values": [
|
"_values": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": -35.811,
|
"y": -100.418,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"_lrot": {
|
"_lrot": {
|
||||||
@@ -99,8 +99,8 @@
|
|||||||
},
|
},
|
||||||
"_lscale": {
|
"_lscale": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0.7,
|
"x": 1.5,
|
||||||
"y": 0.7,
|
"y": 1.5,
|
||||||
"z": 1
|
"z": 1
|
||||||
},
|
},
|
||||||
"_mobility": 0,
|
"_mobility": 0,
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": -35.811,
|
"y": -99.598,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"_lrot": {
|
"_lrot": {
|
||||||
@@ -99,8 +99,8 @@
|
|||||||
},
|
},
|
||||||
"_lscale": {
|
"_lscale": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0.7,
|
"x": 1.5,
|
||||||
"y": 0.7,
|
"y": 1.5,
|
||||||
"z": 1
|
"z": 1
|
||||||
},
|
},
|
||||||
"_mobility": 0,
|
"_mobility": 0,
|
||||||
|
|||||||
@@ -232,7 +232,7 @@
|
|||||||
"_top": 0,
|
"_top": 0,
|
||||||
"_bottom": 546.004,
|
"_bottom": 546.004,
|
||||||
"_horizontalCenter": 0,
|
"_horizontalCenter": 0,
|
||||||
"_verticalCenter": -7,
|
"_verticalCenter": -12,
|
||||||
"_isAbsLeft": true,
|
"_isAbsLeft": true,
|
||||||
"_isAbsRight": true,
|
"_isAbsRight": true,
|
||||||
"_isAbsTop": true,
|
"_isAbsTop": true,
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
"value": {
|
"value": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 633,
|
"y": 628,
|
||||||
"z": 0
|
"z": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export enum Attrs {
|
|||||||
stun_res = "stun_res", // 击晕抗性
|
stun_res = "stun_res", // 击晕抗性
|
||||||
paralyze_chance = "paralyze_chance", // 麻痹概率(百分点,雷电技能默认附带 30)
|
paralyze_chance = "paralyze_chance", // 麻痹概率(百分点,雷电技能默认附带 30)
|
||||||
knockback_chance = "knockback_chance", // 击退强化(原击退概率,现转换为击退距离增量)
|
knockback_chance = "knockback_chance", // 击退强化(原击退概率,现转换为击退距离增量)
|
||||||
|
knockback_skill_chance = "knockback_skill_chance", // 技能击退概率(百分点;由 SkillSet.bck_chance 快照,可被 heroSet overrides 覆写)
|
||||||
knockback_distance = "knockback_distance", // 击退距离强化
|
knockback_distance = "knockback_distance", // 击退距离强化
|
||||||
knockback_res = "knockback_res", // 击退抗性
|
knockback_res = "knockback_res", // 击退抗性
|
||||||
invincible_time = "invincible_time",// 无敌时间
|
invincible_time = "invincible_time",// 无敌时间
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ export interface SkillConfig {
|
|||||||
stun?: number, // 额外击晕概率
|
stun?: number, // 额外击晕概率
|
||||||
para?: number, // 额外麻痹概率(雷电系技能默认 30)
|
para?: number, // 额外麻痹概率(雷电系技能默认 30)
|
||||||
bck?: number, // 额外击退强化(击退距离增量)
|
bck?: number, // 额外击退强化(击退距离增量)
|
||||||
|
bck_chance?: number, // 击退概率(百分点;未配置视为 0 不击退,可由 heroSet overrides 覆写)
|
||||||
buff_type?: Attrs, // Buff 类型 (单一职责)
|
buff_type?: Attrs, // Buff 类型 (单一职责)
|
||||||
timed_buff_id?: number, // 计时性 buff 配置 id(指向 BuffList),存在时走 buffManager 而非永久 add_*
|
timed_buff_id?: number, // 计时性 buff 配置 id(指向 BuffList),存在时走 buffManager 而非永久 add_*
|
||||||
buff_value?: number, // 覆写计时 buff 的修饰数值(modifiers.value / tick.damage_or_heal),由药水卡自定义档位
|
buff_value?: number, // 覆写计时 buff 的修饰数值(modifiers.value / tick.damage_or_heal),由药水卡自定义档位
|
||||||
@@ -171,6 +172,7 @@ export interface SkillOverrides {
|
|||||||
stun?: number;
|
stun?: number;
|
||||||
para?: number;
|
para?: number;
|
||||||
bck?: number;
|
bck?: number;
|
||||||
|
bck_chance?: number;
|
||||||
buff_type?: Attrs;
|
buff_type?: Attrs;
|
||||||
timed_buff_id?: number;
|
timed_buff_id?: number;
|
||||||
buff_value?: number;
|
buff_value?: number;
|
||||||
@@ -225,7 +227,7 @@ export const SkillSet: Record<number, SkillConfig> = {
|
|||||||
6004: {
|
6004: {
|
||||||
uuid: 6004, name: "攻击", sp_name: "atk1", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
uuid: 6004, name: "攻击", sp_name: "atk1", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
||||||
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
|
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
|
||||||
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
|
RType: RType.bezier, EType: EType.collision, bck_chance: 100, info: "造成攻击力100%的伤害",
|
||||||
},
|
},
|
||||||
//中距 射手普通技能
|
//中距 射手普通技能
|
||||||
6006: {
|
6006: {
|
||||||
|
|||||||
@@ -213,15 +213,20 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
// s_uuid 位置是 buffId,据此激活 loss_life/hp/debuff 下的对应 debuff 图标
|
// s_uuid 位置是 buffId,据此激活 loss_life/hp/debuff 下的对应 debuff 图标
|
||||||
targetView.showDamage(damage, isCrit, DEBUFF_ICON_MAP[damageEvent.s_uuid] ?? "");
|
targetView.showDamage(damage, isCrit, DEBUFF_ICON_MAP[damageEvent.s_uuid] ?? "");
|
||||||
} else {
|
} else {
|
||||||
// 击退:受击默认后退,击退属性不再作为概率,而是转换为后退距离的增量
|
// 击退概率判定:概率来自技能配置 bck_chance(heroSet overrides 可覆写),未配置视为 0 不击退。
|
||||||
// 击退增量 = 施法者击退强化(原击退概率)- 被攻击者击退抗性 + 击退距离强化
|
// 不复用 checkChance:其 70% 上限封顶会把 100% 击退(近战普攻 6004)削成 70%
|
||||||
|
const knockbackChance = damageEvent.Attrs[Attrs.knockback_skill_chance] || 0;
|
||||||
|
const isKnockback = knockbackChance >= 100 || (knockbackChance > 0 && Math.random() * 100 < knockbackChance);
|
||||||
|
|
||||||
|
// 击退距离增量 = 施法者击退强化(原击退概率)- 被攻击者击退抗性 + 击退距离强化(仅命中击退时生效)
|
||||||
const knockbackBonus = (damageEvent.Attrs[Attrs.knockback_chance] || 0) - (TAttrsComp.getFinalKnockbackRes() || 0);
|
const knockbackBonus = (damageEvent.Attrs[Attrs.knockback_chance] || 0) - (TAttrsComp.getFinalKnockbackRes() || 0);
|
||||||
const knockbackExtra = Math.max(0, knockbackBonus + (damageEvent.Attrs[Attrs.knockback_distance] || 0));
|
const knockbackExtra = Math.max(0, knockbackBonus + (damageEvent.Attrs[Attrs.knockback_distance] || 0));
|
||||||
|
|
||||||
targetView.do_atked(damage, isCrit, damageEvent.s_uuid, knockbackExtra);
|
targetView.do_atked(damage, isCrit, damageEvent.s_uuid, isKnockback ? knockbackExtra : 0);
|
||||||
targetView.playEnd(skillConf.endAnm);
|
targetView.playEnd(skillConf.endAnm);
|
||||||
|
|
||||||
// 击退位移下沉到 MoveSystem:直接写入 knockbackVelocity,由 MoveSystem 每帧衰减并叠加位移
|
// 击退位移下沉到 MoveSystem:直接写入 knockbackVelocity,由 MoveSystem 每帧衰减并叠加位移
|
||||||
|
if (isKnockback) {
|
||||||
const moveComp = target.get(MoveComp);
|
const moveComp = target.get(MoveComp);
|
||||||
if (moveComp) {
|
if (moveComp) {
|
||||||
const dist = FightSet.BACK_RANG + knockbackExtra;
|
const dist = FightSet.BACK_RANG + knockbackExtra;
|
||||||
@@ -231,6 +236,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
moveComp.knockbackVelocity = isHero ? -knockbackSpeed : knockbackSpeed;
|
moveComp.knockbackVelocity = isHero ? -knockbackSpeed : knockbackSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isFrost) {
|
if (isFrost) {
|
||||||
TAttrsComp.toFrost();
|
TAttrsComp.toFrost();
|
||||||
|
|||||||
@@ -232,6 +232,8 @@ export class Skill extends ecs.Entity {
|
|||||||
sDataCom.Attrs[Attrs.paralyze_chance] = cAttrsComp.getFinalParalyzeChance() + sPara;
|
sDataCom.Attrs[Attrs.paralyze_chance] = cAttrsComp.getFinalParalyzeChance() + sPara;
|
||||||
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.getFinalKnockbackChance() + sBck;
|
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.getFinalKnockbackChance() + sBck;
|
||||||
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.getFinalKnockbackDistance();
|
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.getFinalKnockbackDistance();
|
||||||
|
// 技能击退概率:取合并后配置的 bck_chance(heroSet overrides 可覆写),未配置视为 0 不击退
|
||||||
|
sDataCom.Attrs[Attrs.knockback_skill_chance] = config.bck_chance ?? 0;
|
||||||
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
|
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
|
||||||
sDataCom.Attrs[Attrs.puncture_dmg_bonus] = cAttrsComp.getFinalPunctureDmgBonus(); // 初始化携带施法者的穿透伤害加成
|
sDataCom.Attrs[Attrs.puncture_dmg_bonus] = cAttrsComp.getFinalPunctureDmgBonus(); // 初始化携带施法者的穿透伤害加成
|
||||||
sDataCom.s_uuid = s_uuid
|
sDataCom.s_uuid = s_uuid
|
||||||
|
|||||||
Reference in New Issue
Block a user