去掉伤害系统

This commit is contained in:
2025-02-03 22:30:38 +08:00
parent 36a8aff783
commit 83c4b6ec3d
8 changed files with 111 additions and 205 deletions

View File

@@ -4,7 +4,7 @@ import { HeroViewComp } from "../hero/HeroViewComp";
import { HeroSkillsComp } from "./heroSkillsComp";
import { SkillSet, TargetGroup, TargetType } from "../common/config/SkillSet";
import { CdType } from "../common/config/SkillSet";
import { DamageRequest, DamageType } from "../../game/damage/DamageComp";
import { oops } from "db://oops-framework/core/Oops";
/** 技能系统 */
@@ -12,6 +12,7 @@ import { DamageRequest, DamageType } from "../../game/damage/DamageComp";
export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
private updateInterval: number = 0.1; // 每0.1秒更新一次
private accumulator: number = 0;
private _timers: { [key: string]: number } = {};
filter(): ecs.IMatcher {
return ecs.allOf(HeroSkillsComp, HeroViewComp);
@@ -32,7 +33,6 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
skills.skills.forEach(skillId => {
this.updateCooldown(skills, skillId);
});
}
/** 处理所有技能逻辑 */
@@ -197,17 +197,117 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
/** 应用技能效果 */
private applySkillEffect(caster: ecs.Entity, target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet]) {
// 创建伤害请求实体
const damageEntity = new ecs.Entity();
const req = damageEntity.add(DamageRequest);
req.source = caster;
req.target = target;
req.baseValue = caster.get(HeroViewComp).ap * (config.ap / 100);
req.delay = config.hited; // 添加命中延迟时间(秒)用于同步动画与伤害
const casterView = caster.get(HeroViewComp);
const targetView = target.get(HeroViewComp);
// 直接计算伤害(包含防御减免)
const damageResult = this.calculateDamage(caster, target, config);
this.applyDamage(target, damageResult);
// 播放技能特效
caster.get(HeroViewComp).playSkillEffect(config.uuid);
console.log(caster.get(HeroViewComp).hero_name+"技能反馈"+"=>"+req.target.get(HeroViewComp).hero_name+":"+req.baseValue)
casterView.playSkillEffect(config.uuid);
console.log(`${casterView.hero_name}${targetView.hero_name} 造成 ${damageResult.value}伤害`);
}
private calculateDamage(caster: ecs.Entity, target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet]) {
const result = {
value :0, // 确保最小伤害为1
isCrit : false,
isDodged : false,
delay : 0.3,
ignoreDefense : false,
canCrit : true,
}
const targetView =target.get(HeroViewComp);
const sourceView =caster.get(HeroViewComp);
let final = sourceView.ap*config.ap/100;
// 伤害浮动±10%
const damageFloat = 0.9 + Math.random() * 0.2; // 0.9~1.1
final *= damageFloat;
final = Math.round(final);
// 闪避判定
if (Math.random()*100 < targetView.dodge) {
result.isDodged = true
return result
}
// 护甲减伤
if (!result.ignoreDefense) {
const effectiveArmor = Math.min(targetView.def, 300); // 最大减伤75%
const damageReduction = effectiveArmor / (effectiveArmor + 100);
final *= (1 - damageReduction);
final = Math.round(final); // 四舍五入取整
}
// 暴击判定
let isCrit = false;
if (result.canCrit) {
const critRate = sourceView.crit;
if (Math.random() * 100 < critRate) {
final *= 1.5;
isCrit = true;
}
}
result.value = Math.max(1, final); // 确保最小伤害为1
result.isCrit = isCrit;
return result;
}
private applyDamage(target: ecs.Entity, result:any) {
const view = target.get(HeroViewComp);
if (!view.ent.has(HeroViewComp)) return;
this.scheduleOnce(()=>{
// 护盾优先吸收伤害
let remainingDamage = result.value;
if(result.isDodged){
view.BUFFCOMP.tooltip(5,"*闪避*");
return;
}
if (view.shield > 0) {
const shieldAbsorb = Math.min(view.shield, remainingDamage);
view.shield -= shieldAbsorb;
remainingDamage -= shieldAbsorb;
if (view.shield <= 0) {
view.BUFFCOMP.show_shield(false);
}
}
// 剩余伤害扣除血量
if (remainingDamage > 0) {
view.hp -= remainingDamage;
view.showDamage(result.value, result.isCrit);
}else{
view.BUFFCOMP.tooltip(5,"*吸收*");
}
}, result.delay)
// 直接触发事件
oops.message.dispatchEvent("OnDamage", {
target,
damage: result.value,
isCrit: result.isCrit
});
}
private scheduleOnce(callback: () => void, delay: number) {
const timer = setTimeout(() => {
callback();
delete this._timers[timer];
}, delay * 1000);
this._timers[timer] = timer;
}
onDestroy() {
Object.values(this._timers).forEach(clearTimeout);
}
/** 应用负面状态 */