refactor(game): 重构天赋系统配置和组件逻辑
重构天赋系统配置,包括: 1. 调整天赋类型枚举和效果枚举 2. 移除旧的天赋配置数据 3. 简化天赋组件实现 4. 更新设计文档中的天赋描述 同时修正地图组件中的英雄位置坐标和缩放值
This commit is contained in:
@@ -9,20 +9,30 @@
|
|||||||
普攻和一般技能自动触发,必杀技能默认自动触发,可以手动触发
|
普攻和一般技能自动触发,必杀技能默认自动触发,可以手动触发
|
||||||
|
|
||||||
## 天赋
|
## 天赋
|
||||||
风怒: 普通攻击3次后, 攻击会攻击目标额外一次
|
风怒: 普通攻击3次后, 目标额外收到1次150%伤害
|
||||||
溅射: 普通攻击3次后, 会对目标100像素外的敌人额外造成30%伤害
|
溅射: 普通攻击3次后, 会对目标100像素外的敌人额外造成30%伤害
|
||||||
|
|
||||||
回蓝: 普通攻击3次后,恢复5%的蓝值
|
回蓝: 普通攻击3次后,恢复5%的蓝值
|
||||||
回血: 普通攻击3次后, 恢复5%的生命值
|
回血: 普通攻击3次后, 恢复5%的生命值
|
||||||
|
|
||||||
冰封: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)冻结受到伤害的目标,目标无法移动和攻击(cd继续), 3秒后自动解冻
|
冰封: 普通攻击3次后, 获得5%的冻结率(可叠加,触发清零) :冻结受到伤害的目标,目标无法移动和攻击(cd继续), 3秒后自动解冻
|
||||||
沉默: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)沉默收到伤害的目标,目标一般技能和必杀技能技能cd清零
|
沉默: 普通攻击3次后, 获得5%的沉默率(可叠加,触发清零) :沉默收到伤害的目标,目标一般技能和必杀技能技能cd清零
|
||||||
击晕: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)击晕收到伤害的目标,目标无移动和cd暂停
|
击晕: 普通攻击3次后, 获得5%的击晕率(可叠加,触发清零) :击晕收到伤害的目标,目标无移动和cd暂停
|
||||||
击退: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)击退收到伤害的目标, cd减少5点,
|
击退: 普通攻击3次后, 获得5%的击退率(可叠加,触发清零) :击退收到伤害的目标, cd减少5点,
|
||||||
|
会心: 普通攻击1次后, 获得5%的暴击率(可叠加,触发清零)
|
||||||
|
|
||||||
熟练: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)触发2次一般技能
|
熟练: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)触发2次一般技能
|
||||||
会心: 普通攻击3次后, 获得5%的机率(触发特效前效果可以叠加)触发暴击伤害
|
|
||||||
|
|
||||||
反击: 被攻击3次后, 给于目标50%的伤害
|
反击: 被攻击3次后, 给于目标50%的伤害
|
||||||
护盾: 被攻击3次后,获得5秒的护盾保护(20%生命值)
|
护盾: 被攻击3次后,获得20%生命值护盾
|
||||||
减伤: 被攻击3次后,减少本次攻击伤害50%
|
减伤: 被攻击3次后,下1次伤害减50%
|
||||||
|
|
||||||
|
背水: 每失去50%生命值,获得下10次普通攻击暴击
|
||||||
|
|
||||||
|
勤勉: 每升1级,获得下5次技能暴击
|
||||||
|
|
||||||
|
## 特殊状态说明
|
||||||
|
冰封: 目标无法移动和攻击(cd继续), 3秒后自动解冻
|
||||||
|
沉默: 目标一般技能和必杀技能技能cd清零
|
||||||
|
击晕: 目标无移动和cd暂停
|
||||||
|
击退: 后退15像素,cd减少5点,
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
* 支持定义英雄的特殊能力或特性
|
* 支持定义英雄的特殊能力或特性
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import * as exp from "constants";
|
||||||
import { Attrs, BType } from "./HeroAttrs";
|
import { Attrs, BType } from "./HeroAttrs";
|
||||||
import { SkillSet } from "./SkillSet";
|
import { SkillSet } from "./SkillSet";
|
||||||
|
|
||||||
@@ -12,30 +13,53 @@ import { SkillSet } from "./SkillSet";
|
|||||||
* 天赋类型枚举,也是触发条件
|
* 天赋类型枚举,也是触发条件
|
||||||
*/
|
*/
|
||||||
export enum TalType {
|
export enum TalType {
|
||||||
LEVEL = 1, // 基于特定等级触发
|
LUP_1 = 1, // 等级升级1级触发
|
||||||
LEVEL_UP = 2, // 基于等级升级触发
|
LUP_5 = 2, // 等级升级5级触发
|
||||||
ACTION_COUNT = 3, // 基于普通攻击触发, skills[0]计数触发
|
LUP_10 = 3, // 等级升级10级触发
|
||||||
SKILL_COUNT = 4, // 基于技能触发, > skills[0]计数触发
|
ATK_1 = 4, //普通攻击1次触发
|
||||||
DAMAGE_COUNT = 5, // 基于受伤次数触发
|
ATK_3 = 5, // 普通攻击3次触发
|
||||||
INIT = 6, // 初始触发,如:多1个技能
|
ATK_5 = 6, // 普通攻击5次触发
|
||||||
DEAD = 7 // 基于死亡触发
|
DMG_1 = 7, // 受伤1次触发
|
||||||
|
DMG_3 = 8, // 受伤3次触发
|
||||||
|
DMG_5 = 9, // 受伤5次触发
|
||||||
|
SKILL_1 = 10, // 技能1次触发
|
||||||
|
SKILL_3 = 11, // 技能3次触发
|
||||||
|
SKILL_5 = 12, // 技能5次触发
|
||||||
|
LHP_50 = 13, // 失去生命值50%触发
|
||||||
|
LHP_30 = 14, // 失去生命值30%触发
|
||||||
|
AHP_100 = 15, // 获得生命值100%触发
|
||||||
|
AHP_200 = 16, // 获得生命值200%触发
|
||||||
|
|
||||||
|
INIT = 17, // 初始触发,如:多1个技能
|
||||||
|
DEAD = 18 // 基于死亡触发
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 触发效果
|
* 触发效果
|
||||||
*/
|
*/
|
||||||
export enum TalEType {
|
export enum TalETag {
|
||||||
ATTRS = 1, // 属性修改
|
Wfuny = 1, // 风怒
|
||||||
SKILL = 2, // 技能触发
|
|
||||||
SKILL_MORE = 3, // 天生多1个技能
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum TalEffet {
|
||||||
|
DMG=1, // 伤害
|
||||||
|
ATTR=2, // 属性hp,mp数值,持久添加
|
||||||
|
BUFF = 3, // 暴击率,闪避率等,可叠加的触发后清零
|
||||||
|
STATS=3, // 状态
|
||||||
|
N_ATK = 4, // 下n次普通攻击 需要特殊处理
|
||||||
|
N_SKILL=5, // 下n次技能攻击 需要特殊处理
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum TalTager {
|
||||||
|
SELF = 1, // 自己触发
|
||||||
|
ENEMY = 2, // 敌人触发
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 天赋配置接口
|
* 天赋配置接口
|
||||||
* 定义一个完整的天赋效果
|
* 定义一个完整的天赋效果
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export interface ItalConf {
|
export interface ItalConf {
|
||||||
uuid: number; // 天赋ID
|
uuid: number; // 天赋ID
|
||||||
name: string; // 天赋名称
|
name: string; // 天赋名称
|
||||||
@@ -70,44 +94,7 @@ export interface ItalConf {
|
|||||||
* 4. 技能触发类:当特定条件满足时自动触发指定技能
|
* 4. 技能触发类:当特定条件满足时自动触发指定技能
|
||||||
*/
|
*/
|
||||||
export const talConf: Record<number, ItalConf> = {
|
export const talConf: Record<number, ItalConf> = {
|
||||||
// ========== 等级类天赋 ==========
|
|
||||||
|
|
||||||
// 剑意提升 - 刘邦专属 | 每5级 | 攻击力+10%
|
|
||||||
7001: {uuid: 7001, name: "剑意提升", desc: "每升5级,攻击力增加10%", type: TalType.LEVEL_UP, triggerType: TalEType.ATTRS,
|
|
||||||
chance: 100, t_value: 5, e_value: 0.10, e_name: Attrs.AP, e_type: BType.RATIO, e_scaling: 1, e_count: 1, stackable: true, maxStack: 10},
|
|
||||||
|
|
||||||
// 胡服骑射 - 赵武灵王专属 | 每3级 | 攻击速度+5%
|
|
||||||
7002: {uuid: 7002, name: "胡服骑射", desc: "每升3级,攻击速度增加5%", type: TalType.LEVEL_UP, triggerType: TalEType.ATTRS,
|
|
||||||
chance: 100, t_value: 3, e_value: 0.05, e_name: Attrs.AS, e_type: BType.RATIO, e_scaling: 1.2, e_count: 1, stackable: true, maxStack: 15},
|
|
||||||
|
|
||||||
// 运筹帷幄 - 张良专属 | 每4级 | 魔法攻击力+8%
|
|
||||||
7004: {uuid: 7004, name: "运筹帷幄", desc: "每升4级,魔法攻击力增加8%", type: TalType.LEVEL_UP, triggerType: TalEType.ATTRS,
|
|
||||||
chance: 100, t_value: 4, e_value: 0.08, e_name: Attrs.MAP, e_type: BType.RATIO, e_scaling: 1.3, e_count: 1, stackable: true, maxStack: 12},
|
|
||||||
|
|
||||||
// 后勤保障 - 萧何专属 | 每6级 | 生命回复+3点
|
|
||||||
7006: {uuid: 7006, name: "后勤保障", desc: "每升6级,生命回复增加3点", type: TalType.LEVEL_UP, triggerType: TalEType.ATTRS,
|
|
||||||
chance: 100, t_value: 6, e_value: 3, e_name: Attrs.HP_REGEN, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: true, maxStack: 8},
|
|
||||||
|
|
||||||
// 离骚诗韵 - 屈原专属 | 每8次攻击 | 火焰伤害+2%
|
|
||||||
7101: {uuid: 7101, name: "离骚诗韵", desc: "每攻击8次,触发火焰buff,火焰山航海加成增加2%,持续10秒", type: TalType.ACTION_COUNT, triggerType: TalEType.SKILL,
|
|
||||||
chance: 100, t_value: 8, e_value: SkillSet[6005].uuid, e_name: 0, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: true, maxStack: 15},
|
|
||||||
|
|
||||||
// ========== 初始触发类天赋 ==========
|
|
||||||
// 霸王之威 - 项羽专属 | 初始 | 生命值+100
|
|
||||||
7201: {uuid: 7201, name: "霸王之威", desc: "初始获得额外100点生命值", type: TalType.INIT, triggerType: TalEType.ATTRS,
|
|
||||||
chance: 100, t_value: 1, e_value: 100, e_name: Attrs.HP_MAX, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: false},
|
|
||||||
// 兵圣之道 - 孙武专属 | 初始 | 额外技能
|
|
||||||
7202: {uuid: 7202, name: "兵圣之道", desc: "初始获得额外一个技能", type: TalType.INIT, triggerType: TalEType.SKILL_MORE,
|
|
||||||
chance: 100, t_value: 1, e_value: SkillSet[6005].uuid, e_name: 0, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: false},
|
|
||||||
|
|
||||||
// ========== 受伤触发类天赋 ==========
|
|
||||||
// 坚韧意志 - 通用 | 每3次受伤 | 防御力+2点
|
|
||||||
7301: {uuid: 7301, name: "坚韧意志", desc: "每受伤3次,50%纪律,触发[坚韧意志],防御力增加2点,持续10秒", type: TalType.DAMAGE_COUNT, triggerType: TalEType.SKILL,
|
|
||||||
chance: 50, t_value: 3, e_value: SkillSet[6005].uuid, e_name: 0, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: true, maxStack: 12},
|
|
||||||
// ========== 特定等级触发类天赋 ==========
|
|
||||||
// 坚韧意志 - 通用 | 每3次受伤 | 防御力+2点
|
|
||||||
7401: {uuid: 7401, name: "坚韧意志", desc: "20级是获得[坚韧意志]技能,防御力增加2点,持续10秒", type: TalType.LEVEL, triggerType: TalEType.SKILL_MORE,
|
|
||||||
chance: 100, t_value: 20, e_value: SkillSet[6005].uuid, e_name: 0, e_type: BType.VALUE, e_scaling: 1, e_count: 1, stackable: true, maxStack: 12},
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +1,13 @@
|
|||||||
import { _decorator } from "cc";
|
import { _decorator } from "cc";
|
||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
||||||
import { ItalConf, TalType, TalEType, talConf } from "../common/config/TalSet";
|
|
||||||
import { BuffConf, SkillSet } from "../common/config/SkillSet";
|
import { BuffConf, SkillSet } from "../common/config/SkillSet";
|
||||||
import { HeroInfo } from "../common/config/heroSet";
|
import { HeroInfo } from "../common/config/heroSet";
|
||||||
import { HeroViewComp } from "./HeroViewComp";
|
import { HeroViewComp } from "./HeroViewComp";
|
||||||
|
|
||||||
const { ccclass } = _decorator;
|
const { ccclass } = _decorator;
|
||||||
|
|
||||||
/**
|
|
||||||
* 天赋触发统计接口
|
|
||||||
* 记录各种触发条件的计数器,用于判断天赋是否满足触发条件
|
|
||||||
*/
|
|
||||||
interface FightStats {
|
|
||||||
aCount: number; // 普通攻击计数 - 用于 ACTION_COUNT 类型天赋
|
|
||||||
sCount: number; // 技能使用计数 - 用于 SKILL_COUNT 类型天赋
|
|
||||||
dCount: number; // 受伤次数计数 - 用于 DAMAGE_COUNT 类型天赋
|
|
||||||
level: number; // 当前等级 - 用于 LEVEL/LEVEL_UP 类型天赋
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 天赋效果实例接口
|
|
||||||
* 记录已激活天赋的当前状态,包括堆叠层数和最后触发时间
|
|
||||||
*/
|
|
||||||
interface TalEffect {
|
|
||||||
uuid: number; // 天赋uuid
|
|
||||||
stack: number; // 当前堆叠层数,用于可堆叠天赋
|
|
||||||
lTTime: number; // 上次触发时间戳,可用于时效判断
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 天赋系统组件类
|
* 天赋系统组件类
|
||||||
@@ -43,127 +23,16 @@ export class TalComp extends ecs.Comp {
|
|||||||
/** 英雄唯一标识符,用于从配置中获取英雄信息 */
|
/** 英雄唯一标识符,用于从配置中获取英雄信息 */
|
||||||
private heroUuid: number = 0;
|
private heroUuid: number = 0;
|
||||||
|
|
||||||
/** 天赋触发统计,记录各种触发条件的当前状态 */
|
|
||||||
private FStats: FightStats = { aCount: 0, sCount: 0, dCount: 0, level: 1 };
|
|
||||||
|
|
||||||
/** 活跃天赋效果映射,存储已激活的天赋实例 */
|
|
||||||
private activeTals: TalEffect[] = [];
|
|
||||||
private talEffects: ItalConf[] = [];
|
|
||||||
/** 初始化标志,防止重复初始化 */
|
|
||||||
private isInitialized: boolean = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 组件生命周期函数 - 启动时调用
|
|
||||||
* 获取英雄视图组件并初始化天赋系统
|
|
||||||
*/
|
|
||||||
start() {
|
start() {
|
||||||
// 运行时获取组件,避免编译时循环引用
|
|
||||||
this.heroView = this.ent.get(HeroViewComp);
|
|
||||||
if (this.heroView) {
|
|
||||||
this.heroUuid = this.heroView.hero_uuid;
|
|
||||||
this.initializeTalents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private initializeTalents(): void {
|
|
||||||
if (this.isInitialized || !this.heroView) return;
|
|
||||||
this.FStats.level = this.heroView.lv || 1;
|
|
||||||
this.getHeroTalents()
|
|
||||||
this.isInitialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private getHeroTalents(): ItalConf[] {
|
|
||||||
this.activeTals = [];
|
|
||||||
this.talEffects = [];
|
|
||||||
if (!this.heroView) return [];
|
|
||||||
const heroInfo = HeroInfo[this.heroUuid];
|
|
||||||
if (!heroInfo?.tal) return [];
|
|
||||||
for(let id of heroInfo.tal){
|
|
||||||
let conf = talConf[id];
|
|
||||||
if(conf){
|
|
||||||
this.talEffects.push(conf)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private doTalEffect(tal:ItalConf){
|
|
||||||
console.log("doTalEffect",tal)
|
|
||||||
if(tal.triggerType == TalEType.ATTRS){
|
|
||||||
console.log("doTalEffect ATTRS",tal)
|
|
||||||
let buff:BuffConf = {
|
|
||||||
buff:tal.e_name,
|
|
||||||
BType:tal.e_type,
|
|
||||||
value:tal.e_value,
|
|
||||||
time:0,
|
|
||||||
chance:tal.chance,
|
|
||||||
}
|
|
||||||
this.heroView.addBuff(buff)
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tal.triggerType == TalEType.SKILL){
|
|
||||||
console.log("doTalEffect SKILL",tal)
|
|
||||||
let skill = SkillSet[tal.e_value];
|
|
||||||
if(this.skillCon){
|
|
||||||
this.skillCon.doSkill(skill,false,0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tal.triggerType == TalEType.SKILL_MORE){
|
|
||||||
console.log("doTalEffect SKILL_MORE",tal)
|
|
||||||
this.heroView.skills.push(tal.e_value)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
private checkTrigger(tal:ItalConf) {
|
|
||||||
let stats = this.FStats;
|
|
||||||
switch (tal.type) {
|
|
||||||
case TalType.LEVEL: return stats.level >= tal.t_value;
|
|
||||||
case TalType.LEVEL_UP: return stats.level % tal.t_value === 0;
|
|
||||||
case TalType.ACTION_COUNT: return stats.aCount >= tal.t_value;
|
|
||||||
case TalType.SKILL_COUNT: return stats.sCount >= tal.t_value;
|
|
||||||
case TalType.DAMAGE_COUNT: return stats.dCount >= tal.t_value;
|
|
||||||
case TalType.INIT: return true;
|
|
||||||
case TalType.DEAD: return false; // 单独处理
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private checkHasTal(TalType:TalType) {
|
|
||||||
for(let tal of this.talEffects){
|
|
||||||
if(TalType == tal.type){
|
|
||||||
if (this.checkTrigger(tal)){
|
|
||||||
this.doTalEffect(tal)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public onAction(): void {
|
|
||||||
this.FStats.aCount++;
|
|
||||||
this.checkHasTal(TalType.ACTION_COUNT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public onSkillUse(): void {
|
|
||||||
this.FStats.sCount++;
|
|
||||||
this.checkHasTal(TalType.SKILL_COUNT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public onDamageTaken(): void {
|
|
||||||
this.FStats.dCount++;
|
|
||||||
this.checkHasTal(TalType.DAMAGE_COUNT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public onLevelUp(newLevel: number): void {
|
|
||||||
this.FStats.level = newLevel;
|
|
||||||
this.checkHasTal(TalType.LEVEL);
|
|
||||||
this.checkHasTal(TalType.LEVEL_UP);
|
|
||||||
}
|
|
||||||
|
|
||||||
public onDeath(): void {
|
|
||||||
this.checkHasTal(TalType.DEAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
reset() {
|
reset() {
|
||||||
this.isInitialized = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,9 +27,9 @@ export class HInfoComp extends CCComp {
|
|||||||
hero_pos:any={
|
hero_pos:any={
|
||||||
0:v3(420,-30,0), // 不在屏幕内
|
0:v3(420,-30,0), // 不在屏幕内
|
||||||
1:v3(280,-30,0),
|
1:v3(280,-30,0),
|
||||||
2:v3(160,-33,0),
|
2:v3(160,-30,0),
|
||||||
3:v3(0,-40,0),
|
3:v3(0,-40,0),
|
||||||
4:v3(-160,-33,0),
|
4:v3(-160,-30,0),
|
||||||
5:v3(-280,-30,0),
|
5:v3(-280,-30,0),
|
||||||
6:v3(-420,-30,0), // 不在屏幕内
|
6:v3(-420,-30,0), // 不在屏幕内
|
||||||
}
|
}
|
||||||
@@ -53,11 +53,11 @@ export class HInfoComp extends CCComp {
|
|||||||
switch(posIndex) {
|
switch(posIndex) {
|
||||||
case 2:
|
case 2:
|
||||||
case 4:
|
case 4:
|
||||||
return v3(-1.6, 1.6, 1); // 2、4位置:1.2倍缩放
|
return v3(-1.5, 1.5, 1); // 2、4位置:1.5倍缩放
|
||||||
case 3:
|
case 3:
|
||||||
return v3(-1.8, 1.8, 1); // 3位置(中心):1.5倍缩放
|
return v3(-1.8, 1.8, 1); // 3位置(中心):1.5倍缩放
|
||||||
default:
|
default:
|
||||||
return v3(-1.4, 1.4, 1); // 其他位置:1倍缩放
|
return v3(-1.5, 1.5, 1); // 其他位置:1.5倍缩放
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user