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.
 
 
 
 

65 lines
2.2 KiB

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);
}
}