1package fillomino23import (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 Size int19 MaxRegion int20 GivenRatio float6421}2223var (24 _ game.Mode = Mode{}25 _ game.Spawner = Mode{}26 _ game.SeededSpawner = Mode{}27 _ game.EloSpawner = Mode{}28)2930func NewMode(title, description string, size, maxRegion int, givenRatio float64) Mode {31 return Mode{32 BaseMode: game.NewBaseMode(title, description),33 Size: size,34 MaxRegion: maxRegion,35 GivenRatio: givenRatio,36 }37}3839func (m Mode) Spawn() (game.Gamer, error) {40 puzzle, err := GeneratePuzzle(m.Size, m.Size, m.MaxRegion, m.GivenRatio)41 if err != nil {42 return nil, err43 }44 return New(m, puzzle)45}4647func (m Mode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {48 puzzle, err := GeneratePuzzleSeeded(m.Size, m.Size, m.MaxRegion, m.GivenRatio, rng)49 if err != nil {50 return nil, err51 }52 return New(m, puzzle)53}5455var Modes = []game.Mode{56 NewMode("Mini 5x5", "Small board with generous clues.", 5, 5, 0.70),57 NewMode("Easy 6x6", "Compact board with simple regions.", 6, 6, 0.66),58 NewMode("Medium 8x8", "Balanced deduction and region growth.", 8, 7, 0.60),59 NewMode("Hard 10x10", "Larger board with denser interactions.", 10, 8, 0.56),60 NewMode("Expert 12x12", "Wide board with long deduction chains.", 12, 9, 0.52),61}6263var ModeDefinitions = fillominoModeDefinitions(Modes)6465func fillominoModeDefinitions(modes []game.Mode) []puzzle.ModeDef {66 defs := gameentry.BuildModeDefs(modes)67 presets := []difficulty.Elo{300, 700, 1300, 2000, 2600}68 for i := range defs {69 if i >= len(presets) {70 break71 }72 elo := presets[i]73 defs[i].PresetElo = &elo74 }75 return defs76}7778var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{79 Name: "Fillomino",80 Description: "Grow the numbered regions to their exact sizes.",81 Aliases: []string{"polyomino", "regions"},82 Modes: ModeDefinitions,83 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2, 3),84})8586var Entry = gameentry.NewEntry(gameentry.EntrySpec{87 Definition: Definition,88 Help: HelpContent,89 Import: game.AdaptImport(ImportModel),90 Modes: Modes,91 Print: PDFPrintAdapter,92})