refactor(battle): 使用GameConst统一管理魔法数字
将战斗系统中的硬编码数字替换为GameConst中的常量定义,包括AI检测频率、技能延迟、索敌范围等
This commit is contained in:
36
assets/script/game/common/config/GameConst.ts
Normal file
36
assets/script/game/common/config/GameConst.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏通用常量定义
|
||||||
|
* 用于替换硬编码数字,统一管理魔法数字
|
||||||
|
*/
|
||||||
|
export const GameConst = {
|
||||||
|
/** 战斗系统常量 */
|
||||||
|
Battle: {
|
||||||
|
/** AI检测频率(秒):降低频率以优化性能 */
|
||||||
|
AI_CHECK_INTERVAL: 0.2,
|
||||||
|
|
||||||
|
/** 技能施放延迟(秒):用于动画表现衔接 */
|
||||||
|
SKILL_CAST_DELAY: 0.3,
|
||||||
|
|
||||||
|
/** 默认索敌/攻击范围 */
|
||||||
|
DEFAULT_SEARCH_RANGE: 300,
|
||||||
|
|
||||||
|
/** 默认目标X坐标(右侧阵营) */
|
||||||
|
DEFAULT_TARGET_X_RIGHT: 400,
|
||||||
|
|
||||||
|
/** 默认目标X坐标(左侧阵营) */
|
||||||
|
DEFAULT_TARGET_X_LEFT: -400,
|
||||||
|
|
||||||
|
/** 默认目标Z坐标 */
|
||||||
|
DEFAULT_TARGET_Z: 1,
|
||||||
|
|
||||||
|
/** 索敌时的Y轴偏移修正 */
|
||||||
|
SEARCH_Y_OFFSET: 30,
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 技能相关常量 */
|
||||||
|
Skill: {
|
||||||
|
/** 最小目标数量 */
|
||||||
|
MIN_TARGET_COUNT: 1,
|
||||||
|
}
|
||||||
|
};
|
||||||
9
assets/script/game/common/config/GameConst.ts.meta
Normal file
9
assets/script/game/common/config/GameConst.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "553dfb74-22f0-490d-a17e-b67757160d9b",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import { smc } from "../common/SingletonModuleComp";
|
|||||||
import { TalComp } from "./TalComp";
|
import { TalComp } from "./TalComp";
|
||||||
import { TalEffet, TriType } from "../common/config/TalSet";
|
import { TalEffet, TriType } from "../common/config/TalSet";
|
||||||
import { BoxSet, FacSet } from "../common/config/GameSet";
|
import { BoxSet, FacSet } from "../common/config/GameSet";
|
||||||
|
import { GameConst } from "../common/config/GameConst";
|
||||||
import { Attrs } from "../common/config/HeroAttrs";
|
import { Attrs } from "../common/config/HeroAttrs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,7 +41,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
|
|
||||||
// AI 降频:每0.2秒执行一次
|
// AI 降频:每0.2秒执行一次
|
||||||
skills.ai_timer += this.dt;
|
skills.ai_timer += this.dt;
|
||||||
if (skills.ai_timer < 0.2) return;
|
if (skills.ai_timer < GameConst.Battle.AI_CHECK_INTERVAL) return;
|
||||||
skills.ai_timer = 0;
|
skills.ai_timer = 0;
|
||||||
|
|
||||||
const heroAttrs = e.get(HeroAttrsComp);
|
const heroAttrs = e.get(HeroAttrsComp);
|
||||||
@@ -186,7 +187,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
}
|
}
|
||||||
// 2.1 普通攻击逻辑
|
// 2.1 普通攻击逻辑
|
||||||
if (hset === HSSet.atk){
|
if (hset === HSSet.atk){
|
||||||
let delay = 0.3
|
let delay = GameConst.Battle.SKILL_CAST_DELAY
|
||||||
let ext_dmg = heroAttrs.useCountValTal(TalEffet.ATK_DMG);
|
let ext_dmg = heroAttrs.useCountValTal(TalEffet.ATK_DMG);
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
this.createSkill(s_uuid, heroView,targets,ext_dmg);
|
this.createSkill(s_uuid, heroView,targets,ext_dmg);
|
||||||
@@ -194,7 +195,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
//风怒wfuny 只针对 普通攻击起效
|
//风怒wfuny 只针对 普通攻击起效
|
||||||
if (heroAttrs.useCountTal(TalEffet.WFUNY)){
|
if (heroAttrs.useCountTal(TalEffet.WFUNY)){
|
||||||
let ext2_dmg = heroAttrs.useCountValTal(TalEffet.ATK_DMG);
|
let ext2_dmg = heroAttrs.useCountValTal(TalEffet.ATK_DMG);
|
||||||
let delay = 0.3
|
let delay = GameConst.Battle.SKILL_CAST_DELAY
|
||||||
heroView.playSkillEffect(s_uuid);
|
heroView.playSkillEffect(s_uuid);
|
||||||
//需要再添加 风怒动画
|
//需要再添加 风怒动画
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
@@ -204,7 +205,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
}
|
}
|
||||||
// 2.2 技能攻击逻辑
|
// 2.2 技能攻击逻辑
|
||||||
if(hset === HSSet.skill){
|
if(hset === HSSet.skill){
|
||||||
let delay = 0.3
|
let delay = GameConst.Battle.SKILL_CAST_DELAY
|
||||||
let ext_dmg = heroAttrs.useCountValTal(TalEffet.SKILL_DMG);
|
let ext_dmg = heroAttrs.useCountValTal(TalEffet.SKILL_DMG);
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
this.createSkill(s_uuid, heroView,targets,ext_dmg);
|
this.createSkill(s_uuid, heroView,targets,ext_dmg);
|
||||||
@@ -212,7 +213,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
// 双技能 只针对 技能起效
|
// 双技能 只针对 技能起效
|
||||||
if(heroAttrs.useCountTal(TalEffet.D_SKILL)){
|
if(heroAttrs.useCountTal(TalEffet.D_SKILL)){
|
||||||
let ext2_dmg = heroAttrs.useCountValTal(TalEffet.SKILL_DMG);
|
let ext2_dmg = heroAttrs.useCountValTal(TalEffet.SKILL_DMG);
|
||||||
let delay = 0.3
|
let delay = GameConst.Battle.SKILL_CAST_DELAY
|
||||||
heroView.playSkillEffect(s_uuid);
|
heroView.playSkillEffect(s_uuid);
|
||||||
//需要再添加 双技能动画
|
//需要再添加 双技能动画
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
@@ -222,7 +223,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
}
|
}
|
||||||
// 2.3 必杀技能逻辑
|
// 2.3 必杀技能逻辑
|
||||||
if(hset === HSSet.max){
|
if(hset === HSSet.max){
|
||||||
let delay = 0.3
|
let delay = GameConst.Battle.SKILL_CAST_DELAY
|
||||||
heroView.playSkillEffect(s_uuid);
|
heroView.playSkillEffect(s_uuid);
|
||||||
//需要再添加 最大伤害动画
|
//需要再添加 最大伤害动画
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
@@ -275,7 +276,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
if (!heroAttrs) return [];
|
if (!heroAttrs) return [];
|
||||||
const config = SkillSet[s_uuid];
|
const config = SkillSet[s_uuid];
|
||||||
if (!config) return this.sDefaultTargets(caster, heroAttrs.fac);
|
if (!config) return this.sDefaultTargets(caster, heroAttrs.fac);
|
||||||
const maxTargets = Math.max(1, config.t_num ?? 1);
|
const maxTargets = Math.max(GameConst.Skill.MIN_TARGET_COUNT, config.t_num ?? 1);
|
||||||
const targets = this.sDamageTargets(caster, config, maxTargets);
|
const targets = this.sDamageTargets(caster, config, maxTargets);
|
||||||
if (targets.length === 0) {
|
if (targets.length === 0) {
|
||||||
targets.push(...this.sDefaultTargets(caster, heroAttrs.fac));
|
targets.push(...this.sDefaultTargets(caster, heroAttrs.fac));
|
||||||
@@ -291,7 +292,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
const heroAttrs = caster.ent.get(HeroAttrsComp);
|
const heroAttrs = caster.ent.get(HeroAttrsComp);
|
||||||
if (!heroAttrs) return targets;
|
if (!heroAttrs) return targets;
|
||||||
|
|
||||||
const range = Number(config.dis ?? 300);
|
const range = Number(config.dis ?? GameConst.Battle.DEFAULT_SEARCH_RANGE);
|
||||||
const enemyPositions = this.findNearbyEnemies(caster, heroAttrs.fac, range);
|
const enemyPositions = this.findNearbyEnemies(caster, heroAttrs.fac, range);
|
||||||
|
|
||||||
// 选择最多maxTargets个目标
|
// 选择最多maxTargets个目标
|
||||||
@@ -315,8 +316,8 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
*/
|
*/
|
||||||
private sDefaultTargets(caster: HeroViewComp, fac: number): Vec3[] {
|
private sDefaultTargets(caster: HeroViewComp, fac: number): Vec3[] {
|
||||||
const targets: Vec3[] = [];
|
const targets: Vec3[] = [];
|
||||||
const defaultX = fac === 0 ? 400 : -400;
|
const defaultX = fac === 0 ? GameConst.Battle.DEFAULT_TARGET_X_RIGHT : GameConst.Battle.DEFAULT_TARGET_X_LEFT;
|
||||||
targets.push(v3(defaultX, BoxSet.GAME_LINE, 1));
|
targets.push(v3(defaultX, BoxSet.GAME_LINE, GameConst.Battle.DEFAULT_TARGET_Z));
|
||||||
return targets;
|
return targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,7 +336,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
if (model.is_dead) return false;
|
if (model.is_dead) return false;
|
||||||
if (model.fac === fac) return false;
|
if (model.fac === fac) return false;
|
||||||
const pos = view.node.position.clone();
|
const pos = view.node.position.clone();
|
||||||
pos.y += 30;
|
pos.y += GameConst.Battle.SEARCH_Y_OFFSET;
|
||||||
const dist = Math.abs(currentPos.x - pos.x);
|
const dist = Math.abs(currentPos.x - pos.x);
|
||||||
if (dist <= range) {
|
if (dist <= range) {
|
||||||
const laneBias = Math.abs(currentPos.y - pos.y);
|
const laneBias = Math.abs(currentPos.y - pos.y);
|
||||||
@@ -427,7 +428,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
const targets = this.sBuffTargets(casterEntity, heroView, hAttrsCom, config);
|
const targets = this.sBuffTargets(casterEntity, heroView, hAttrsCom, config);
|
||||||
if (targets.length === 0) return false;
|
if (targets.length === 0) return false;
|
||||||
|
|
||||||
const delay = 0.3;
|
const delay = GameConst.Battle.SKILL_CAST_DELAY;
|
||||||
|
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
for (const targetEntity of targets) {
|
for (const targetEntity of targets) {
|
||||||
@@ -451,7 +452,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
/**
|
/**
|
||||||
* 选择Buff目标
|
* 选择Buff目标
|
||||||
*/
|
*/
|
||||||
private sBuffTargets(casterEntity: ecs.Entity, casterView: HeroViewComp, heroAttrs: HeroAttrsComp, config: any): ecs.Entity[] {
|
private sBuffTargets(casterEntity: ecs.Entity, casterView: HeroViewComp, heroAttrs: HeroAttrsComp, config: SkillConfig): ecs.Entity[] {
|
||||||
const targets: ecs.Entity[] = [];
|
const targets: ecs.Entity[] = [];
|
||||||
const tGroup = config.TGroup;
|
const tGroup = config.TGroup;
|
||||||
|
|
||||||
@@ -463,8 +464,8 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
|
|
||||||
// 2. 团队/友军
|
// 2. 团队/友军
|
||||||
if (tGroup === TGroup.Team || tGroup === TGroup.Ally) {
|
if (tGroup === TGroup.Team || tGroup === TGroup.Ally) {
|
||||||
const maxTargets = Math.max(1, Number(config.t_num ?? 1));
|
const maxTargets = Math.max(GameConst.Skill.MIN_TARGET_COUNT, Number(config.t_num ?? 1));
|
||||||
const range = Number(config.dis ?? 300);
|
const range = Number(config.dis ?? GameConst.Battle.DEFAULT_SEARCH_RANGE);
|
||||||
|
|
||||||
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
||||||
const model = e.get(HeroAttrsComp);
|
const model = e.get(HeroAttrsComp);
|
||||||
@@ -497,7 +498,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
if (targets.length === 0) return false;
|
if (targets.length === 0) return false;
|
||||||
|
|
||||||
const healAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX]/100;
|
const healAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX]/100;
|
||||||
const delay = 0.3;
|
const delay = GameConst.Battle.SKILL_CAST_DELAY;
|
||||||
|
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
for (const targetEntity of targets) {
|
for (const targetEntity of targets) {
|
||||||
@@ -526,7 +527,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
if (targets.length === 0) return false;
|
if (targets.length === 0) return false;
|
||||||
|
|
||||||
const shieldAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX]/100;
|
const shieldAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX]/100;
|
||||||
const delay = 0.3;
|
const delay = GameConst.Battle.SKILL_CAST_DELAY;
|
||||||
|
|
||||||
heroView.scheduleOnce(() => {
|
heroView.scheduleOnce(() => {
|
||||||
for (const targetEntity of targets) {
|
for (const targetEntity of targets) {
|
||||||
@@ -546,10 +547,10 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
/**
|
/**
|
||||||
* 选择治疗目标
|
* 选择治疗目标
|
||||||
*/
|
*/
|
||||||
private sHealTargets(caster: HeroViewComp, heroAttrs: HeroAttrsComp, config: any): ecs.Entity[] {
|
private sHealTargets(caster: HeroViewComp, heroAttrs: HeroAttrsComp, config: SkillConfig): ecs.Entity[] {
|
||||||
const targets: ecs.Entity[] = [];
|
const targets: ecs.Entity[] = [];
|
||||||
const maxTargets = Math.max(1, Number(config.t_num ?? 1));
|
const maxTargets = Math.max(GameConst.Skill.MIN_TARGET_COUNT, Number(config.t_num ?? 1));
|
||||||
const range = Number(config.dis ?? 300);
|
const range = Number(config.dis ?? GameConst.Battle.DEFAULT_SEARCH_RANGE);
|
||||||
|
|
||||||
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
||||||
const model = e.get(HeroAttrsComp);
|
const model = e.get(HeroAttrsComp);
|
||||||
@@ -577,10 +578,10 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
/**
|
/**
|
||||||
* 选择护盾目标
|
* 选择护盾目标
|
||||||
*/
|
*/
|
||||||
private sShieldTargets(caster: HeroViewComp, heroAttrs: HeroAttrsComp, config: any): ecs.Entity[] {
|
private sShieldTargets(caster: HeroViewComp, heroAttrs: HeroAttrsComp, config: SkillConfig): ecs.Entity[] {
|
||||||
const targets: ecs.Entity[] = [];
|
const targets: ecs.Entity[] = [];
|
||||||
const maxTargets = Math.max(1, Number(config.t_num ?? 1));
|
const maxTargets = Math.max(GameConst.Skill.MIN_TARGET_COUNT, Number(config.t_num ?? 1));
|
||||||
const range = Number(config.dis ?? 300);
|
const range = Number(config.dis ?? GameConst.Battle.DEFAULT_SEARCH_RANGE);
|
||||||
|
|
||||||
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp)).forEach(e => {
|
||||||
const model = e.get(HeroAttrsComp);
|
const model = e.get(HeroAttrsComp);
|
||||||
|
|||||||
Reference in New Issue
Block a user