UNPKG

@gamepark/rules-api

Version:

API to implement the rules of a board game

47 lines (46 loc) 2.46 kB
import { PlayMoveContext } from '../../Rules'; import { EndPlayerTurn, MaterialMove } from '../moves'; import { MaterialRulesPart } from './MaterialRulesPart'; /** * Base class for any part of the rules where multiple players have to do something at the same time. */ export declare abstract class SimultaneousRule<Player extends number = number, MaterialType extends number = number, LocationType extends number = number, RuleId extends number = number> extends MaterialRulesPart<Player, MaterialType, LocationType, RuleId> { endPlayerTurn: <P extends number = number>(player: P) => EndPlayerTurn<P>; /** * See {@link Rules.isTurnToPlay} */ isTurnToPlay(player: Player): boolean; /** * @returns all the active players */ get activePlayers(): Player[]; /** * See {@link Rules.getLegalMoves} */ getLegalMoves(player: Player): MaterialMove<Player, MaterialType, LocationType, RuleId>[]; /** * This function is only called for players which are still active. It must return the legal move of given player. * @param player Player to consider * @return the legal moves of the player */ abstract getActivePlayerLegalMoves(player: Player): MaterialMove<Player, MaterialType, LocationType, RuleId>[]; /** * This function is called immediately after a {@link EndPlayerTurn} has been played. * @param _move The move which has just been played * @param _context Context of execution * @returns {MaterialMove[]} Any consequences that should automatically be played after the move */ onPlayerTurnEnd(_move: EndPlayerTurn<Player>, _context?: PlayMoveContext): MaterialMove<Player, MaterialType, LocationType, RuleId>[]; /** * Implement this to return the consequences when all the players have completed their task. * Usually, a new rule part should start. * @returns the consequences when the last awaited player have played */ abstract getMovesAfterPlayersDone(): MaterialMove<Player, MaterialType, LocationType, RuleId>[]; } /** * Type guard to know if a {@link MaterialRulesPart} is a {@link SimultaneousRule} * @param rule The rule * @returns true if the rule if a {@link SimultaneousRule} */ export declare function isSimultaneousRule<P extends number = number, M extends number = number, L extends number = number, R extends number = number>(rule?: MaterialRulesPart<P, M, L, R>): rule is SimultaneousRule<P, M, L, R>;