gameModeDefaults.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { type GameMode } from './gameDefinition'
  2. export interface GameModeDefaults {
  3. sessionCloseAfterMs: number
  4. sessionCloseWarningMs: number
  5. minCompletedControlsBeforeFinish: number
  6. requiresFocusSelection: boolean
  7. skipEnabled: boolean
  8. skipRequiresConfirm: boolean
  9. autoFinishOnLastControl: boolean
  10. defaultControlScore: number
  11. }
  12. const GAME_MODE_DEFAULTS: Record<GameMode, GameModeDefaults> = {
  13. 'classic-sequential': {
  14. sessionCloseAfterMs: 2 * 60 * 60 * 1000,
  15. sessionCloseWarningMs: 10 * 60 * 1000,
  16. minCompletedControlsBeforeFinish: 0,
  17. requiresFocusSelection: false,
  18. skipEnabled: true,
  19. skipRequiresConfirm: true,
  20. autoFinishOnLastControl: false,
  21. defaultControlScore: 1,
  22. },
  23. 'score-o': {
  24. sessionCloseAfterMs: 2 * 60 * 60 * 1000,
  25. sessionCloseWarningMs: 10 * 60 * 1000,
  26. minCompletedControlsBeforeFinish: 1,
  27. requiresFocusSelection: false,
  28. skipEnabled: false,
  29. skipRequiresConfirm: true,
  30. autoFinishOnLastControl: false,
  31. defaultControlScore: 10,
  32. },
  33. }
  34. export function getGameModeDefaults(mode: GameMode): GameModeDefaults {
  35. return GAME_MODE_DEFAULTS[mode]
  36. }
  37. export function getDefaultSkipRadiusMeters(mode: GameMode, punchRadiusMeters: number): number {
  38. if (mode === 'classic-sequential') {
  39. return punchRadiusMeters * 2
  40. }
  41. return 30
  42. }
  43. export function resolveDefaultControlScore(mode: GameMode, configuredDefaultScore: number | null): number {
  44. if (typeof configuredDefaultScore === 'number') {
  45. return configuredDefaultScore
  46. }
  47. return getGameModeDefaults(mode).defaultControlScore
  48. }