fix(skill&hero): 添加击退属性配置与处理逻辑
1. 移除英雄配置注释里废弃属性的提示 2. 为小刺客技能添加击退概率覆盖参数 3. 补全技能系统中击退属性的计算逻辑 4. 修复代码格式与缩进问题
This commit is contained in:
@@ -213,7 +213,6 @@ export interface HeroEvolve {
|
||||
* fend 辅助 每波结束触发,跨波次累积增益
|
||||
*
|
||||
* 触发节奏:atked 3次/5次,atking 5次/7次,fstart/fend 1次/波
|
||||
* 废弃属性:frz(冰冻)、bck(击退) — 怪物固定不移动,无效
|
||||
*
|
||||
* 设定中的英雄都是1级,最高可以升级到3级(不在列表内提现,升级在游戏内进行)
|
||||
* skills[0]是普通攻击技能
|
||||
@@ -258,7 +257,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
// ========== atking 类 — 刺客(自身强化) ==========
|
||||
5021: {
|
||||
uuid: 5021, name: "小刺客", path: "hc1", fac: FacSet.HERO, pool_lv: 1, lv: 1, type: HType.Melee, hp: 300, ap: 28,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0, overrides: { bck: 20 } } },
|
||||
atking: [{ s_uuid: 6401, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 8 } }],
|
||||
info: "每攻击5次永久提升自身攻击力8点"
|
||||
},
|
||||
|
||||
@@ -101,14 +101,14 @@ export class Skill extends ecs.Entity {
|
||||
this.addComponents<SMoveDataComp>(SMoveDataComp);
|
||||
}
|
||||
load(startPos: Vec3, parent: Node, s_uuid: number, targetPos: Vec3,
|
||||
caster:HeroViewComp,cAttrsComp:HeroAttrsComp, skill_lv:number=0, ext_dmg:number=0, overrides?: SkillOverrides) {
|
||||
caster: HeroViewComp, cAttrsComp: HeroAttrsComp, skill_lv: number = 0, ext_dmg: number = 0, overrides?: SkillOverrides) {
|
||||
let config = SkillSet[s_uuid];
|
||||
if (!config) {
|
||||
mLogger.error(this.debugMode, 'Skill', "[Skill] 技能配置不存在:", s_uuid);
|
||||
return;
|
||||
}
|
||||
config = mergeSkillParams(config, overrides);
|
||||
|
||||
|
||||
const path = `game/skill/atk/${config.sp_name}`;
|
||||
const initSkillNode = (prefab: Prefab) => {
|
||||
const node: Node = Skill.getFromPool(path) || instantiate(prefab);
|
||||
@@ -119,7 +119,7 @@ export class Skill extends ecs.Entity {
|
||||
|
||||
this.prefabPath = path;
|
||||
this.skillNode = node;
|
||||
|
||||
|
||||
let skillParent: Node | null = null;
|
||||
if (smc.map && smc.map.MapView && smc.map.MapView.scene && smc.map.MapView.scene.entityLayer && smc.map.MapView.scene.entityLayer.node) {
|
||||
skillParent = smc.map.MapView.scene.entityLayer.node.getChildByName("SKILL");
|
||||
@@ -127,18 +127,18 @@ export class Skill extends ecs.Entity {
|
||||
if (!skillParent || !skillParent.isValid) {
|
||||
skillParent = parent;
|
||||
}
|
||||
|
||||
|
||||
if (!skillParent || !skillParent.isValid) {
|
||||
mLogger.error(this.debugMode, 'Skill', "[Skill] 父节点无效");
|
||||
if(node.isValid) node.destroy();
|
||||
return;
|
||||
mLogger.error(this.debugMode, 'Skill', "[Skill] 父节点无效");
|
||||
if (node.isValid) node.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
node.parent = skillParent;
|
||||
node.active = true;
|
||||
// 设置节点属性
|
||||
let face=caster.node.scale.x < 0 ? -1 : 1
|
||||
node.setScale(v3(Math.abs(node.scale.x)*face,node.scale.y,1))
|
||||
let face = caster.node.scale.x < 0 ? -1 : 1
|
||||
node.setScale(v3(Math.abs(node.scale.x) * face, node.scale.y, 1))
|
||||
// 初始视图
|
||||
const SView = node.getComponent(SkillView);
|
||||
if (!SView) {
|
||||
@@ -146,21 +146,21 @@ export class Skill extends ecs.Entity {
|
||||
if (node.isValid) node.destroy();
|
||||
return;
|
||||
}
|
||||
if(config.EType!=EType.collision){
|
||||
const collider=node.getComponent(BoxCollider2D);
|
||||
if(collider){
|
||||
collider.enabled=false
|
||||
if (config.EType != EType.collision) {
|
||||
const collider = node.getComponent(BoxCollider2D);
|
||||
if (collider) {
|
||||
collider.enabled = false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问
|
||||
// 核心标识
|
||||
SView.s_uuid= s_uuid
|
||||
SView.group= caster.box_group
|
||||
// 核心标识
|
||||
SView.s_uuid = s_uuid
|
||||
SView.group = caster.box_group
|
||||
|
||||
this.add(SView);
|
||||
startPos.x=startPos.x+SView.atk_x*face
|
||||
startPos.y=startPos.y+SView.atk_y
|
||||
startPos.x = startPos.x + SView.atk_x * face
|
||||
startPos.y = startPos.y + SView.atk_y
|
||||
|
||||
node.setPosition(startPos);
|
||||
|
||||
@@ -179,7 +179,7 @@ export class Skill extends ecs.Entity {
|
||||
sMoveCom.bezierStartHeight = config.bezier_start_y ?? sMoveCom.bezierStartHeight;
|
||||
sMoveCom.bezierMidHeight = config.bezier_mid_y ?? sMoveCom.bezierMidHeight;
|
||||
sMoveCom.bezierArc = config.bezier_arc ?? sMoveCom.bezierArc;
|
||||
// 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理
|
||||
// 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理
|
||||
sMoveCom.atk_x = SView.atk_x;
|
||||
sMoveCom.atk_y = SView.atk_y;
|
||||
|
||||
@@ -199,30 +199,31 @@ export class Skill extends ecs.Entity {
|
||||
if (!sDataCom) {
|
||||
sDataCom = this.add(SDataCom);
|
||||
}
|
||||
sDataCom.reset();
|
||||
sDataCom.group=caster.box_group
|
||||
sDataCom.casterEid=caster.ent.eid
|
||||
sDataCom.reset();
|
||||
sDataCom.group = caster.box_group
|
||||
sDataCom.casterEid = caster.ent.eid
|
||||
sDataCom.Attrs = {};
|
||||
const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001];
|
||||
const sCrt = (config.crt ?? 0)+(SUp.crt*skill_lv);
|
||||
const sFrz = (config.frz ?? 0)+(SUp.frz*skill_lv);
|
||||
const sStun = (config.stun ?? 0)+(SUp.stun*skill_lv);
|
||||
const sAp =config.ap+(SUp.ap*skill_lv);
|
||||
const sHit=config.hit_count+(SUp.hit_count*skill_lv);
|
||||
sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp/100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100,不然会出现ap为90%变0
|
||||
const SUp = SkillUpList[s_uuid] ? SkillUpList[s_uuid] : SkillUpList[1001];
|
||||
const sCrt = (config.crt ?? 0) + (SUp.crt * skill_lv);
|
||||
const sFrz = (config.frz ?? 0) + (SUp.frz * skill_lv);
|
||||
const sStun = (config.stun ?? 0) + (SUp.stun * skill_lv);
|
||||
const sBck = (config.bck ?? 0) + (SUp.bck * skill_lv);
|
||||
const sAp = config.ap + (SUp.ap * skill_lv);
|
||||
const sHit = config.hit_count + (SUp.hit_count * skill_lv);
|
||||
sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap * sAp / 100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100,不然会出现ap为90%变0
|
||||
sDataCom.Attrs[Attrs.critical] = cAttrsComp.getRuntimeCritical() + sCrt;
|
||||
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus();
|
||||
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getRuntimeFreezeChance() + sFrz;
|
||||
sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.getRuntimeStunChance() + sStun;
|
||||
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance || 0;
|
||||
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance + sBck;
|
||||
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.knockback_distance || 0;
|
||||
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率
|
||||
sDataCom.s_uuid=s_uuid
|
||||
sDataCom.s_uuid = s_uuid
|
||||
sDataCom.skill_lv = Math.max(0, skill_lv);
|
||||
sDataCom.fac=cAttrsComp.fac
|
||||
sDataCom.ext_dmg=ext_dmg
|
||||
sDataCom.fac = cAttrsComp.fac
|
||||
sDataCom.ext_dmg = ext_dmg
|
||||
sDataCom.hit_count = 0
|
||||
sDataCom.max_hit_count = Math.max(1,sHit)
|
||||
sDataCom.max_hit_count = Math.max(1, sHit)
|
||||
SView.init();
|
||||
};
|
||||
|
||||
@@ -248,10 +249,10 @@ export class Skill extends ecs.Entity {
|
||||
this.remove(SDataCom);
|
||||
this.remove(SMoveDataComp)
|
||||
this.remove(StimeDataComp)
|
||||
|
||||
|
||||
// 移除组件会触发 reset,但我们在 reset 中移除了 destroy
|
||||
this.remove(SkillView)
|
||||
|
||||
|
||||
// 回收节点到对象池
|
||||
if (this.skillNode && this.skillNode.isValid && this.prefabPath) {
|
||||
Skill.putToPool(this.prefabPath, this.skillNode);
|
||||
|
||||
Reference in New Issue
Block a user