释放技能动画 设定在技能参数中+伤害系统建立

This commit is contained in:
2025-02-03 10:45:06 +08:00
parent 89978ddbe8
commit cdb8261be9
17 changed files with 960 additions and 462 deletions

View File

@@ -0,0 +1,70 @@
import { oops } from "db://oops-framework/core/Oops";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { HeroViewComp } from "../hero/HeroViewComp";
import { DamageRequest, DamageResult } from "./DamageComp";
@ecs.register('DamageSystem')
export class DamageSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
filter(): ecs.IMatcher {
return ecs.allOf(DamageRequest);
}
update(entity: ecs.Entity) {
const req = entity.get(DamageRequest);
const result = this.calculateDamage(req);
this.applyDamage(req.target, result);
entity.remove(DamageRequest);
}
private calculateDamage(req: DamageRequest): DamageResult {
const targetView = req.target.get(HeroViewComp);
const sourceView = req.source.get(HeroViewComp);
let final = req.baseValue;
// 闪避判定
if (Math.random() < targetView.dodge) {
const result = new DamageResult();
result.finalDamage = 0;
result.isDodged = true;
return result;
}
// 护甲减伤
if (!req.ignoreDefense) {
final -= targetView.def * 0.5;
}
// 暴击判定
let isCrit = false;
if (req.canCrit) {
const critRate = sourceView.crit;
if (Math.random() < critRate) {
final *= 1.5;
isCrit = true;
}
}
const result = new DamageResult();
result.finalDamage = Math.max(0, final);
result.isCrit = isCrit;
return result;
}
private applyDamage(target: ecs.Entity, result: DamageResult) {
const view = target.get(HeroViewComp);
view.hp -= result.finalDamage;
// 添加伤害结果组件
const comp = target.add(DamageResult);
comp.finalDamage = result.finalDamage;
comp.isCrit = result.isCrit;
comp.isDodged = result.isDodged;
// 触发伤害事件
oops.message.dispatchEvent("OnDamage", {
target,
damage: result.finalDamage,
isCrit: result.isCrit
});
}
}