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.
 
 
temptress-bot/src/game/gameEvent.ts

181 lines
6.0 KiB

import { DiceCombo, DieResult } from './dieState'
export enum IncomingEventType {
// Chooses the action to be performed for this round but does not lock it in until the player rolls.
// Valid during GameState.ROUND_START
SelectAction = 'select_action',
// Dice buttons toggle the selection of that die
// Valid during GameState.TURN_ROLLED
ToggleSelectDie = 'toggle_select_die',
// Button 1 is Select All/Deselect All
// Select All appears if no dice are selected
// Deselect All displays if at least one die is selected
// Both valid during GameState.TURN_ROLLED
SelectAllDice = 'select_all_dice',
DeselectAllDice = 'deselect_all_dice',
// Button 2 is Hold/Release selected dice
// If only held dice are selected, Release appears
// For selections with at least one unheld die, Hold appears
// Both valid during GameState.TURN_ROLLED
HoldSelectedDice = 'hold_selected_dice',
ReleaseSelectedDice = 'release_selected_dice',
// Button 3 is End Turn/Score Selected Dice
// End Turn appears by default, but is only enabled if sufficient Stop dice are in the current roll or if the turn
// has been failed
// Score Selected Dice appears when any dice are selected, but is only enabled if at least one scoreable die is
// selected and no non-scoreable dice are selected
// Both appear during GameState.TURN_ROLLED
// End Turn also appears and must be pressed to move to the next round (or end the game) in GameState.TURN_FAILED
EndTurn = 'end_turn',
ScoreSelectedDice = 'score_selected_dice',
// Button 4 is Roll Dice
// It's always visible, but is disabled if there are no unheld dice or if the action has not been chosen
// Valid during GameState.ROUND_START, GameState.TURN_START, and GameState.TURN_ROLLED
RollDice = 'roll_dice',
// Abort ends the game without a victor
// Valid during any state except GameState.ABORTED or GameState.VICTORY
Abort = 'abort',
}
export interface IncomingBaseEvent {
// The type of event to execute.
readonly type: IncomingEventType
}
export interface IncomingIndexedEvent extends IncomingBaseEvent {
readonly type: IncomingEventType.SelectAction | IncomingEventType.ToggleSelectDie
readonly index: number
}
export interface IncomingSimpleEvent extends IncomingBaseEvent {
readonly type:
| IncomingEventType.SelectAllDice
| IncomingEventType.HoldSelectedDice
| IncomingEventType.ReleaseSelectedDice
| IncomingEventType.ScoreSelectedDice
| IncomingEventType.EndTurn
| IncomingEventType.DeselectAllDice
| IncomingEventType.RollDice
| IncomingEventType.Abort
}
export type IncomingEvent = IncomingIndexedEvent | IncomingSimpleEvent
export enum ErrorType {
NotValidRightNow = 'not_valid_right_now',
InvalidIndex = 'invalid_index',
InsufficientMatchingDice = 'insufficient_matching_dice',
DataLoadFailed = 'data_load_failed',
UnexpectedError = 'unexpected_error',
}
export interface GameError {
readonly type: ErrorType
readonly message: string
}
export enum OutgoingEventType {
Dialogue = 'dialogue',
Description = 'description',
DamageOrRecovery = 'damage',
ChangeStops = 'change_stops',
ChangeFails = 'change_fails',
ChangeDamageBonus = 'change_damage_bonus',
ScoreDice = 'score_dice',
GainFailures = 'gain_failures',
SafeEndTurn = 'safe_end_turn',
LoseRound = 'lose_round',
LoseGame = 'lose_game',
StartRoll = 'new_roll',
StartTurn = 'new_turn',
StartRound = 'new_round',
}
export enum TextSender {
Top = 'top',
Bottom = 'bottom',
Narrator = 'narrator',
}
export interface OutgoingBaseEvent {
readonly type: OutgoingEventType
}
export interface OutgoingTextEvent extends OutgoingBaseEvent {
readonly type: OutgoingEventType.Description | OutgoingEventType.Dialogue
readonly sender: TextSender
readonly text: string
}
export interface OutgoingBaseTargetedEvent extends OutgoingBaseEvent {
readonly type:
| OutgoingEventType.DamageOrRecovery
| OutgoingEventType.ChangeStops
| OutgoingEventType.ChangeFails
| OutgoingEventType.ChangeDamageBonus
| OutgoingEventType.LoseRound
| OutgoingEventType.LoseGame
| OutgoingEventType.ScoreDice
| OutgoingEventType.GainFailures
| OutgoingEventType.SafeEndTurn
| OutgoingEventType.StartRoll
| OutgoingEventType.StartTurn
| OutgoingEventType.StartRound
readonly target: EventTarget
}
export interface OutgoingSimpleTargetedEvent extends OutgoingBaseTargetedEvent {
readonly type:
| OutgoingEventType.LoseGame
| OutgoingEventType.StartTurn
| OutgoingEventType.StartRound
| OutgoingEventType.SafeEndTurn
}
export interface OutgoingDamageEvent extends OutgoingBaseTargetedEvent {
readonly type:
| OutgoingEventType.DamageOrRecovery
| OutgoingEventType.ChangeStops
| OutgoingEventType.ChangeFails
| OutgoingEventType.ChangeDamageBonus
| OutgoingEventType.LoseRound
| OutgoingEventType.GainFailures
readonly delta: number
}
export interface OutgoingStartRollEvent extends OutgoingBaseTargetedEvent {
readonly type: OutgoingEventType.StartRoll
readonly newDice: readonly DieResult[]
}
export interface OutgoingScoreDiceEvent extends OutgoingBaseTargetedEvent {
readonly type: OutgoingEventType.ScoreDice
readonly scoredCombo: DiceCombo
readonly scoredDice: readonly DieResult[]
readonly scoreDelta: number
}
export type OutgoingEvent =
| OutgoingTextEvent
| OutgoingSimpleTargetedEvent
| OutgoingDamageEvent
| OutgoingStartRollEvent
| OutgoingScoreDiceEvent
export interface BaseEventResult<T> {
readonly newState: T
}
export interface SuccessResult<T> extends BaseEventResult<T> {
readonly events: readonly OutgoingEvent[]
}
export interface FailedResult<T> extends BaseEventResult<T> {
readonly error: GameError
}
export type EventResult<T> = SuccessResult<T> | FailedResult<T>