/** * 阵营 ID 约定 * - 玩家塔:team = ownerId(0, 1, …) * - 敌人:team = ENEMY_BASE + ownerId;ownerId = 该怪进攻的玩家 * - 兼容历史 UnitFactory:team = 100 + ownerId(仍按敌方处理) */ export const BattleTeamId = { /** 敌人阵营 ID 基值(WaveSpawner / 机制覆盖后) */ ENEMY_BASE: 1000, /** 旧版 UnitFactory 敌方基值 */ LEGACY_ENEMY_BASE: 100, /** * @param playerId 目标玩家 ID * @returns 该玩家对应的敌人阵营 ID */ enemyForPlayer(playerId: number): number { return BattleTeamId.ENEMY_BASE + playerId; }, /** * @param team 阵营 ID * @returns 是否为敌人阵营(含 100+ 旧值与 1000+ 新值) */ isEnemyTeam(team: number): boolean { return team >= BattleTeamId.LEGACY_ENEMY_BASE; }, /** * 施法者是否视目标为敌对。 * 玩家塔只打「进攻自己」的车道怪(ownerId 相同),不打己方口召唤。 * @param casterTeam 施法者 TeamComp * @param targetTeam 目标 TeamComp */ isHostile( casterTeam: { team: number; ownerId: number } | null | undefined, targetTeam: { team: number; ownerId: number } | null | undefined, ): boolean { if (!casterTeam || !targetTeam) return false; if (BattleTeamId.isEnemyTeam(casterTeam.team)) { return !BattleTeamId.isEnemyTeam(targetTeam.team) && targetTeam.ownerId === casterTeam.ownerId; } return BattleTeamId.isEnemyTeam(targetTeam.team) && targetTeam.ownerId === casterTeam.ownerId; }, /** * 施法者是否视目标为友方(同属玩家侧,且非敌人阵营)。 * @param casterTeam 施法者 TeamComp * @param targetTeam 目标 TeamComp */ isFriendly( casterTeam: { team: number; ownerId: number } | null | undefined, targetTeam: { team: number; ownerId: number } | null | undefined, ): boolean { if (!casterTeam || !targetTeam) return false; if (BattleTeamId.isEnemyTeam(casterTeam.team) || BattleTeamId.isEnemyTeam(targetTeam.team)) { return false; } return targetTeam.ownerId === casterTeam.ownerId; }, /** * 同侧:同一 owner,且同为敌或同为己。 * 怪物吞本方小兵用这个;isFriendly 只表示玩家侧友军。 * @param a 施法者阵营 * @param b 目标阵营 */ isSameSide( a: { team: number; ownerId: number } | null | undefined, b: { team: number; ownerId: number } | null | undefined, ): boolean { if (!a || !b) return false; if (a.ownerId !== b.ownerId) return false; return BattleTeamId.isEnemyTeam(a.team) === BattleTeamId.isEnemyTeam(b.team); }, } as const;