diff --git a/assets/script/game/hero/MoveComp.ts b/assets/script/game/hero/MoveComp.ts index 271d95ed..01fab085 100644 --- a/assets/script/game/hero/MoveComp.ts +++ b/assets/script/game/hero/MoveComp.ts @@ -267,6 +267,8 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate } private clampXByAllies(self: ecs.Entity, fac: number, baseY: number, currentX: number, proposedX: number, direction: number): number { + const selfAttrs = self.get(HeroAttrsComp); + const selfPriority = selfAttrs ? this.getCombatPriority(selfAttrs) : 0; let nearestAheadX = Infinity; let nearestBehindX = -Infinity; ecs.query(ecs.allOf(HeroAttrsComp, HeroViewComp, MoveComp)).forEach(e => { @@ -276,6 +278,8 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate if (!attrs || !view?.node || attrs.is_dead) return; if (attrs.fac !== fac) return; if (Math.abs(view.node.position.y - baseY) >= this.minSpacingY) return; + const allyPriority = this.getCombatPriority(attrs); + if (allyPriority < selfPriority) return; const x = view.node.position.x; if (x > currentX && x < nearestAheadX) nearestAheadX = x; if (x < currentX && x > nearestBehindX) nearestBehindX = x; @@ -290,6 +294,22 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate return proposedX; } + private getCombatPriority(model: HeroAttrsComp): number { + let rangeType = model.rangeType; + if (rangeType === undefined || rangeType === null) { + if (model.type === HType.warrior || model.type === HType.assassin) { + rangeType = SkillRange.Melee; + } else if (model.type === HType.remote) { + rangeType = SkillRange.Long; + } else { + rangeType = SkillRange.Mid; + } + } + if (rangeType === SkillRange.Melee) return 3; + if (rangeType === SkillRange.Mid) return 2; + return 1; + } + private hasAnyActorTooClose(self: ecs.Entity, x: number, y: number): boolean { const myAttrs = self.get(HeroAttrsComp); if (!myAttrs) return false;