clone

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

bug/architecture-test-trim-path
puzzletea / games / shikaku / gamemode.go
gamemode.go 2.4K
1package shikaku23import (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 ShikakuMode struct {17 game.BaseMode18 Width int19 Height int20 MaxRectSize int21}2223var (24 _ game.Mode = ShikakuMode{}25 _ game.Spawner = ShikakuMode{}26 _ game.SeededSpawner = ShikakuMode{}27 _ game.EloSpawner = ShikakuMode{}28)2930func NewMode(title, description string, width, height, maxRectSize int) ShikakuMode {31 return ShikakuMode{32 BaseMode: game.NewBaseMode(title, description),33 Width: width,34 Height: height,35 MaxRectSize: maxRectSize,36 }37}3839func (s ShikakuMode) Spawn() (game.Gamer, error) {40 puzzle, err := GeneratePuzzle(s.Width, s.Height, s.MaxRectSize)41 if err != nil {42 return nil, err43 }44 return New(s, puzzle), nil45}4647func (s ShikakuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {48 puzzle, err := GeneratePuzzleSeeded(s.Width, s.Height, s.MaxRectSize, rng)49 if err != nil {50 return nil, err51 }52 return New(s, puzzle), nil53}5455var Modes = []game.Mode{56 NewMode("Mini 5x5", "5x5 grid, gentle introduction.", 5, 5, 5),57 NewMode("Easy 7x7", "7x7 grid, straightforward puzzles.", 7, 7, 8),58 NewMode("Medium 8x8", "8x8 grid, moderate challenge.", 8, 8, 12),59 NewMode("Hard 10x10", "10x10 grid, requires careful planning.", 10, 10, 15),60 NewMode("Expert 12x12", "12x12 grid, maximum challenge.", 12, 12, 20),61}6263var ModeDefinitions = shikakuModeDefinitions(Modes)6465func shikakuModeDefinitions(modes []game.Mode) []puzzle.ModeDef {66 defs := gameentry.BuildModeDefs(modes)67 presets := []difficulty.Elo{300, 800, 1400, 2100, 2700}68 for i, mode := range modes {69 if i >= len(defs) || i >= len(presets) {70 break71 }72 if _, ok := mode.(game.EloSpawner); !ok {73 continue74 }75 elo := presets[i]76 defs[i].PresetElo = &elo77 }78 return defs79}8081var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{82 Name: "Shikaku",83 Description: "Divide the grid into rectangles with set sizes.",84 Aliases: []string{"rectangles"},85 Modes: ModeDefinitions,86 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2),87})8889var Entry = gameentry.NewEntry(gameentry.EntrySpec{90 Definition: Definition,91 Help: HelpContent,92 Import: game.AdaptImport(ImportModel),93 Modes: Modes,94 Print: PDFPrintAdapter,95})