clone

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

chore/app-model-decomp
puzzletea / games / lightsout / gamemode.go
gamemode.go 1.7K
1package lightsout23import (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 Mode struct {17 game.BaseMode18 Width, Height int19}2021var (22 _ game.Mode = Mode{}23 _ game.Spawner = Mode{}24 _ game.SeededSpawner = Mode{}25 _ game.EloSpawner = Mode{}26)2728func NewMode(title, desc string, w, h int) Mode {29 return Mode{30 BaseMode: game.NewBaseMode(title, desc),31 Width: w,32 Height: h,33 }34}3536func (m Mode) Spawn() (game.Gamer, error) {37 return New(m.Width, m.Height)38}3940func (m Mode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {41 return NewSeeded(m.Width, m.Height, rng)42}4344var Modes = []game.Mode{45 NewMode("Easy", "3x3 grid", 3, 3),46 NewMode("Medium", "5x5 grid", 5, 5),47 NewMode("Hard", "7x7 grid", 7, 7),48 NewMode("Extreme", "9x9 grid", 9, 9),49}5051var ModeDefinitions = lightsOutModeDefinitions(Modes)5253func lightsOutModeDefinitions(modes []game.Mode) []puzzle.ModeDef {54 defs := gameentry.BuildModeDefs(modes)55 presets := []difficulty.Elo{0, 1000, 2000, 3000}56 for i := range defs {57 if i >= len(presets) {58 break59 }60 elo := presets[i]61 defs[i].PresetElo = &elo62 }63 return defs64}6566var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{67 Name: "Lights Out",68 Description: "Turn the lights off.",69 Aliases: []string{"lights"},70 Modes: ModeDefinitions,71 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2),72})7374var Entry = gameentry.NewEntry(gameentry.EntrySpec{75 Definition: Definition,76 Help: HelpContent,77 Import: game.AdaptImport(ImportModel),78 Modes: Modes,79})