clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

refactor/root-tui-model
puzzletea / games / spellpuzzle / gamemode.go
gamemode.go 2.3K
1package spellpuzzle23import (4 _ "embed"5 "math/rand/v2"67 "github.com/FelineStateMachine/puzzletea/difficulty"8 "github.com/FelineStateMachine/puzzletea/game"9 "github.com/FelineStateMachine/puzzletea/gameentry"10 "github.com/FelineStateMachine/puzzletea/puzzle"11)1213//go:embed help.md14var HelpContent string1516type SpellPuzzleMode struct {17 game.BaseMode18 BankSize int19 BoardWordCount int20 MinBonusWords int21}2223var (24 _ game.Mode = SpellPuzzleMode{}25 _ game.Spawner = SpellPuzzleMode{}26 _ game.SeededSpawner = SpellPuzzleMode{}27 _ game.EloSpawner = SpellPuzzleMode{}28)2930func NewMode(title, description string, bankSize, boardWords, minBonusWords int) SpellPuzzleMode {31 return SpellPuzzleMode{32 BaseMode: game.NewBaseMode(title, description),33 BankSize: bankSize,34 BoardWordCount: boardWords,35 MinBonusWords: minBonusWords,36 }37}3839func (m SpellPuzzleMode) Spawn() (game.Gamer, error) {40 puzzle, err := GeneratePuzzle(m)41 if err != nil {42 return nil, err43 }44 return New(m, puzzle)45}4647func (m SpellPuzzleMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {48 puzzle, err := GeneratePuzzleSeeded(m, rng)49 if err != nil {50 return nil, err51 }52 return New(m, puzzle)53}5455var Modes = []game.Mode{56 NewMode("Beginner", "6 letters, 4 board words, gentle intro.", 6, 4, 3),57 NewMode("Easy", "7 letters, 6 board words, balanced start.", 7, 6, 4),58 NewMode("Medium", "8 letters, 8 board words, denser layout.", 8, 8, 6),59 NewMode("Hard", "9 letters, 9 board words, largest launch board.", 9, 9, 8),60}6162var ModeDefinitions = spellPuzzleModeDefinitions(Modes)6364func spellPuzzleModeDefinitions(modes []game.Mode) []puzzle.ModeDef {65 defs := gameentry.BuildModeDefs(modes)66 presets := []difficulty.Elo{0, 600, 1500, 2400}67 for i := range defs {68 if i >= len(presets) {69 break70 }71 elo := presets[i]72 defs[i].PresetElo = &elo73 }74 return defs75}7677var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{78 Name: "Spell Puzzle",79 Description: "Connect letters to fill a crossword with bonus anagrams.",80 Aliases: []string{"spell", "spellpuzzle"},81 Modes: ModeDefinitions,82 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 0),83})8485var Entry = gameentry.NewEntry(gameentry.EntrySpec{86 Definition: Definition,87 Help: HelpContent,88 Import: game.AdaptImport(ImportModel),89 Modes: Modes,90 Print: PDFPrintAdapter,91})