You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
/**
|
|
* 阵营 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;
|
|
|