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.
66 lines
2.2 KiB
66 lines
2.2 KiB
|
3 weeks ago
|
import type { BattleSession } from '../core/BattleSession';
|
||
|
|
import type { MapRegion } from '../battlefield/MapRegion';
|
||
|
|
import { createSoloRegion } from '../battlefield/MapRegion';
|
||
|
|
import { PlayerSlot } from './PlayerSlot';
|
||
|
|
|
||
|
|
/** 战斗模式策略:单人 / 双阵营(玩家 vs AI) */
|
||
|
|
export interface IBattleMode {
|
||
|
|
/** 模式标识 */
|
||
|
|
readonly id: 'solo' | 'pvp';
|
||
|
|
/**
|
||
|
|
* @param session 战斗会话
|
||
|
|
* @returns 初始玩家槽列表
|
||
|
|
*/
|
||
|
|
createPlayers(session: BattleSession): PlayerSlot[];
|
||
|
|
/**
|
||
|
|
* @param playerId 玩家 ID
|
||
|
|
* @param mapRows 地图行数
|
||
|
|
* @param mapCols 地图列数
|
||
|
|
* @returns 该玩家可部署区域(全图;落子隔离由 CampArea 负责)
|
||
|
|
*/
|
||
|
|
getDeployRegion(playerId: number, mapRows: number, mapCols: number): MapRegion;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 单人闯关模式 */
|
||
|
|
export class SoloBattleMode implements IBattleMode {
|
||
|
|
readonly id = 'solo' as const;
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
createPlayers(session: BattleSession): PlayerSlot[] {
|
||
|
|
const level = session.levelDef;
|
||
|
|
const region = createSoloRegion(level.mapRows, level.mapCols);
|
||
|
|
return [
|
||
|
|
new PlayerSlot(0, level.wallHp, level.startGold ?? 0, region),
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
getDeployRegion(_playerId: number, mapRows: number, mapCols: number): MapRegion {
|
||
|
|
return createSoloRegion(mapRows, mapCols);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 双玩家槽位(玩家 vs AI)。
|
||
|
|
* 双方部署区均为全图;阵营隔离由 CampAreaPolicy / MapPlaceValidator 负责。
|
||
|
|
*/
|
||
|
|
export class PvPBattleMode implements IBattleMode {
|
||
|
|
readonly id = 'pvp' as const;
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
createPlayers(session: BattleSession): PlayerSlot[] {
|
||
|
|
const level = session.levelDef;
|
||
|
|
const region = createSoloRegion(level.mapRows, level.mapCols);
|
||
|
|
const startGold = level.startGold ?? 0;
|
||
|
|
return [
|
||
|
|
new PlayerSlot(0, level.wallHp, startGold, region),
|
||
|
|
new PlayerSlot(1, level.wallHp, startGold, region),
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
getDeployRegion(_playerId: number, mapRows: number, mapCols: number): MapRegion {
|
||
|
|
return createSoloRegion(mapRows, mapCols);
|
||
|
|
}
|
||
|
|
}
|