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.
 
 
 
 
AdLike2048/assets/mx/module/battle/ecs/BattleTeamId.ts

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;