技能继续调整

This commit is contained in:
2025-11-01 11:15:11 +08:00
parent 47509af7a1
commit 2b8ba46759
19 changed files with 999 additions and 150 deletions

View File

@@ -160,7 +160,7 @@ export const SkillSet: Record<number, SkillConfig> = {
buffs:[],neAttrs:[],info:"向最前方敌人扔出石斧,造成100%攻击的伤害",
},
6005: {
uuid:6005,name:"火球术",sp_name:"atk_fire1",AtkedName:AtkedName.atked,path:"3039",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.MAGE,
uuid:6005,name:"水球",sp_name:"m_water_ball_1",AtkedName:AtkedName.atked,path:"3039",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.MAGE,
ap:100,cd:5,t_num:1,hit_num:1,hit:2,hitcd:0.3,speed:720,cost:20,with:90,ready:8001,endAnm:9001,RType:RType.linear,
buffs:[],neAttrs:[],info:"召唤大火球攻击前方所有敌人,造成300%攻击的伤害,有一定几率施加灼烧",
},

View File

@@ -99,7 +99,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 刘邦 - 领导型战士(善于用人,知人善任)
5001:{uuid:5001,name:"刘邦",path:"hk1", fac:FacSet.HERO, kind:1,
type:HType.warrior,lv:1,hp:125,mp:85,map:10,def:9,mdef:0,ap:15,dis:100,speed:120,skills:[6001],
type:HType.warrior,lv:1,hp:1000,mp:85,map:10,def:9,mdef:0,ap:15,dis:100,speed:120,skills:[6001],
buff:[],tal:[7101,7201,7301],info:"楚汉争霸领袖,领导统御型战士"},
// 荆轲 - 刺客(敏捷型,高速度和暴击率)
@@ -178,11 +178,11 @@ export const HeroInfo: Record<number, heroInfo> = {
// 4. 远程骚扰型
5210:{uuid:5210,name:"骷髅弓手",path:"mo1", fac:FacSet.MON, kind:1,
type:HType.remote,lv:1,hp:60,mp:100,map:8,def:4,mdef:0,ap:12,dis:450,speed:110,skills:[6002],
type:HType.remote,lv:1,hp:60,mp:100,map:8,def:4,mdef:0,ap:12,dis:450,speed:110,skills:[6005],
buff:[],tal:[],info:"远程骚扰型:保持距离发射箭矢,逼迫玩家走位"},
5211:{uuid:5211,name:"法师骷髅",path:"mo1", fac:FacSet.MON, kind:1,
type:HType.mage,lv:1,hp:55,mp:100,map:25,def:4,mdef:5,ap:10,dis:400,speed:105,skills:[6002],
type:HType.mage,lv:1,hp:55,mp:100,map:25,def:4,mdef:5,ap:10,dis:400,speed:105,skills:[6005],
buff:[],tal:[],info:"远程骚扰型:保持距离释放法术弹幕,逼迫玩家走位"},
// 5. 特殊机制型
@@ -198,19 +198,19 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5. 特殊机制扩展
// 召唤师:持续召唤小怪(后续可在技能系统中实现 SType.zhaohuan
5214:{uuid:5214,name:"死灵法师(召唤师)",path:"mo1", fac:FacSet.MON, kind:1,
type:HType.mage,lv:1,hp:90,mp:160,map:22,def:4,mdef:6,ap:8,dis:380,speed:100,skills:[6002],
type:HType.mage,lv:1,hp:90,mp:160,map:22,def:4,mdef:6,ap:8,dis:380,speed:100,skills:[6005],
buff:[],tal:[],info:"特殊机制:持续召唤小怪,需优先击杀"},
// 治疗者:为周围怪物回血(此处以提升治疗效果和生命回复为基础被动)
// Attrs.HEAL_EFFECT=5 (RATIO=1)Attrs.HP_REGEN=3 (VALUE=0)
5215:{uuid:5215,name:"祭司(治疗者)",path:"mo1", fac:FacSet.MON, kind:1,
type:HType.support,lv:1,hp:100,mp:160,map:18,def:5,mdef:8,ap:6,dis:350,speed:105,skills:[6002],
type:HType.support,lv:1,hp:100,mp:160,map:18,def:5,mdef:8,ap:6,dis:350,speed:105,skills:[6005],
buff:[],tal:[],info:"特殊机制:为周围怪物提供治疗增益与持续回复"},
// 光环怪为周围怪物提供增益此处以Buff效果提升与移动速度提升为基础被动
// Attrs.BUFF_UP=60 (RATIO=1)Attrs.SPEED=63 (RATIO=1)
5216:{uuid:5216,name:"光环幽灵(光环怪)",path:"mo1", fac:FacSet.MON, kind:1,
type:HType.support,lv:1,hp:85,mp:140,map:15,def:4,mdef:7,ap:7,dis:350,speed:110,skills:[6002],
type:HType.support,lv:1,hp:85,mp:140,map:15,def:4,mdef:7,ap:7,dis:350,speed:110,skills:[6005],
buff:[],tal:[],info:"特殊机制:为周围怪物提供增益光环,加速与增益效果强化"},
};

View File

@@ -1,90 +0,0 @@
import { _decorator, EventTarget } from 'cc';
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
const { ccclass } = _decorator;
/** 事件总线组件 - 简化版,仅提供基本的发布订阅功能 */
@ecs.register('EBusComp', false)
export class EBusComp extends CCComp {
/** 内部事件目标 */
private _eventTarget: EventTarget;
/** 获取事件目标 */
private get eventTarget(): EventTarget {
if (!this._eventTarget) {
this._eventTarget = new EventTarget();
}
return this._eventTarget;
}
start() {
// 组件启动时的初始化逻辑
}
/**
* 发布事件
* @param event 事件名称
* @param data 事件数据
*/
public emit(event: string, data?: any): void {
this.eventTarget.emit(event, data);
}
/**
* 订阅事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public on(event: string, listener: (...args: any[]) => void, object?: any): void {
this.eventTarget.on(event, listener, object);
}
/**
* 取消订阅事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public off(event?: string, callback?: (data?: any) => void, target?: any): void {
if (arguments.length === 0) {
// 无参调用:清理本节点所有监听
this.eventTarget.targetOff(this);
} else if (arguments.length === 1) {
// 仅提供 event清理该事件名下所有回调
this.eventTarget.targetOff(event);
} else {
// 完整参数:精确移除指定回调
this.eventTarget.off(event!, callback!, target);
}
}
/**
* 订阅一次性事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public once(event: string, callback: (data?: any) => void, target?: any): void {
this.eventTarget.once(event, callback, target);
}
/**
* 取消所有事件监听
*/
public targetOff(target: any): void {
this.eventTarget.targetOff(target);
}
reset() {
// 清理所有事件监听
if (this._eventTarget) {
this._eventTarget.targetOff(this);
}
// 组件删除时触发自定义释放逻辑
this.node.destroy();
}
}

View File

@@ -1,9 +0,0 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "b44b7a75-de7d-4aa1-ad20-78e6690926c0",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -47,4 +47,8 @@ export default class HeroAnmComp extends Component{
if(this.anmcon.getState("buff").isPlaying) return
this.anmcon.play("buff")
}
dead(){
if(this.anmcon.getState("dead").isPlaying) return
this.anmcon.play("dead")
}
}

View File

@@ -454,8 +454,8 @@ export class HeroAttrSystem extends ecs.ComblockSystem
model.updateTemporaryBuffsDebuffs(this.dt);
// 2. HP/MP 自然回复(业务规则)
model.mp += HeroUpSet.MP * this.dt;
model.hp += HeroUpSet.HP * this.dt;
model.mp += HeroUpSet.MP * this.dt/60;
model.hp += HeroUpSet.HP * this.dt/60;
// 3. 限制属性值在合理范围内
if (model.mp > model.Attrs[Attrs.MP_MAX]) {

View File

@@ -66,6 +66,10 @@ export class HeroSpine extends Component {
break
}
}
dead(){
// console.log("do dead");
this.anm.dead()
}
do_buff(){
this.anm.buff()
}

View File

@@ -10,7 +10,6 @@ import { GameEvent } from "../common/config/GameEvent";
import { TooltipTypes } from "../common/config/Mission";
import { Attrs, } from "../common/config/HeroAttrs";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { EBusComp } from "./EBusComp";
import { Tooltip } from "../skill/Tooltip";
import { timedCom } from "../skill/timedCom";
@@ -93,7 +92,7 @@ export class HeroViewComp extends CCComp {
// 添加安全检查防止在实体销毁过程中访问null的model
if (!this.model) return;
if(this.model.is_dead) return;
// ✅ View 层职责:处理表现相关的逻辑
this.processDamageQueue(); // 伤害数字显示队列
@@ -158,17 +157,7 @@ export class HeroViewComp extends CCComp {
node.setPosition(pos);
}
/** 死亡特效 */
private dead() {
var path = "game/skill/buff/dead";
var prefab: Prefab = oops.res.get(path, Prefab)!;
var node = instantiate(prefab);
node.parent = this.node.parent;
node.setScale(node.scale.x * 0.5, node.scale.y * 0.5);
let pos = v3(this.node.position.x, this.node.position.y + 30, this.node.position.z);
node.setPosition(pos);
}
/** 受击特效 */
private in_atked(anm: string = "atked", scale: number = 1) {
var path = "game/skill/end/" + anm;
@@ -270,7 +259,7 @@ export class HeroViewComp extends CCComp {
this.model.is_count_dead = true; // 防止重复触发,必须存在防止重复调用
// 播放死亡特效
this.dead();
this.as.dead();
// 根据阵营触发不同事件
if(this.model.fac === FacSet.MON){
@@ -325,14 +314,7 @@ export class HeroViewComp extends CCComp {
// 预留:反击、护盾触发等
}
to_grave(){
tween(this.node).to(0.5, { position:v3(-900,this.node.position.y+300,0)},{
onComplete: (target?: object) => {
this.node.setPosition(-900,this.node.position.y-300,0)
}
}).start()
}
/** 调试日志(已禁用) */
to_console(value:any, value2:any=null, value3:any=null){

View File

@@ -60,11 +60,11 @@ export class MissionComp extends CCComp {
do_hero_dead(event:any,data:any){
// console.log("[MissionComp] do_hero_dead",event,data)
smc.vmdata.mission_data.hero_num--
if(smc.vmdata.mission_data.hero_num<=0) {
oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false})
oops.gui.open(UIID.Victory,{victory:false,rewards:this.rewards,game_data:this.game_data})
}
// smc.vmdata.mission_data.hero_num--
// if(smc.vmdata.mission_data.hero_num<=0) {
// oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false})
// oops.gui.open(UIID.Victory,{victory:false,rewards:this.rewards,game_data:this.game_data})
// }
}
do_ad(){
if(this.ad_back()){

View File

@@ -3,6 +3,8 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec
import { BezierMove } from "../BezierMove/BezierMove";
import { RType, SkillSet } from "../common/config/SkillSet";
import { BoxSet } from "../common/config/BoxSet";
import { ECSEntity } from "db://oops-framework/libs/ecs/ECSEntity";
import { SkillView } from "./SkillView";
/**
* 技能移动数据组件
* 存储技能实体的移动相关数据
@@ -48,17 +50,19 @@ export class SMoveDataComp extends ecs.Comp {
}
}
// /** 业务层业务逻辑处理对象 */
// export class SMoveSystem extends ecs.ComblockSystem implements ecs.IEntityEnterSystem {
// filter(): ecs.IMatcher {
// return ecs.allOf(SMoveDataComp);
// }
// entityEnter(e: ecs.Entity): void {
// // 注:自定义业务逻辑
// let s_uuid=e.get(SMoveDataComp).s_uuid
// let SConf=SkillSet[s_uuid]
/** 业务层业务逻辑处理对象 */
export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
filter(): ecs.IMatcher {
return ecs.allOf(SMoveDataComp,SkillView);
}
entityEnter(e: ecs.Entity): void {
// 注:自定义业务逻辑
let s_uuid=e.get(SMoveDataComp).s_uuid
let SConf=SkillSet[s_uuid]
// e.remove(SMoveDataComp);
// }
}
update(entity: ECSEntity): void {
}
// }
}

View File

@@ -56,6 +56,7 @@ export class Skill extends ecs.Entity {
// 初始视图
const SView = node.getComponent(SkillView);
console.log("load skill SView",SView)
// 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问
// 核心标识
SView.s_uuid= s_uuid

View File

@@ -66,8 +66,10 @@ export class SkillView extends CCComp {
}
onBeginContact (seCol: Collider2D, oCol: Collider2D) {
// console.log(this.scale+"碰撞开始 ",seCol,oCol);
if(seCol.node.position.x-oCol.node.position.x > 100 ) return
if(this.endType!=EType.collision) return
let target = oCol.getComponent(HeroViewComp)
let model=target.ent.get(HeroAttrsComp)
if(model.is_dead) return
if(oCol.group!=this.group){
if(target == null) return;
if (!this.SConf) return;
@@ -139,8 +141,9 @@ export class SkillView extends CCComp {
// 收集范围内所有敌方目标
enemys.some(e => {
const view = e.get(HeroViewComp);
const model=e.get(HeroAttrsComp)
const distance = Math.abs(this.node.position.x - view.node.position.x);
if(distance <= dis) {
if(distance <= dis&&!model.is_dead) {
IRTargets.push(view);
}