clone

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

feat/elo-difficulty
puzzletea / games / sudokurgb / print_adapter.go
print_adapter.go 2.8K
1package sudokurgb23import (4 "strconv"56 "codeberg.org/go-pdf/fpdf"7 "github.com/FelineStateMachine/puzzletea/export/pdf"8)910type printAdapter struct{}1112var PDFPrintAdapter = printAdapter{}1314func (printAdapter) CanonicalGameType() string { return "Sudoku RGB" }15func (printAdapter) Aliases() []string {16 return []string{"sudoku rgb", "rgb sudoku", "ripeto", "sudoku ripeto"}17}1819func (printAdapter) BuildPDFPayload(save []byte) (any, error) {20 return pdfexport.ParseSudokuRGBPrintData(save)21}2223func (printAdapter) RenderPDFBody(pdf *fpdf.Fpdf, payload any) error {24 switch data := payload.(type) {25 case *pdfexport.SudokuData:26 renderSudokuRGBPage(pdf, data)27 }28 return nil29}3031func renderSudokuRGBPage(pdf *fpdf.Fpdf, data *pdfexport.SudokuData) {32 if data == nil {33 return34 }3536 pageW, pageH := pdf.GetPageSize()37 pageNo := pdf.PageNo()38 body := pdfexport.PuzzleBodyRect(pageW, pageH, pageNo)39 rules := []string{"Fill rows, columns, and 3x3 boxes with three 1s, three 2s, and three 3s"}40 ruleLines := pdfexport.InstructionLineCount(pdf, body.W, rules)41 area := pdfexport.PuzzleBoardRect(pageW, pageH, pageNo, ruleLines)42 cellSize := pdfexport.FitSudokuCellSize(9, 9, area)43 if cellSize <= 0 {44 return45 }4647 boardH := 9.0 * cellSize48 startX, startY := pdfexport.CenteredOrigin(area, 9, 9, cellSize)4950 drawSudokuGridLines(pdf, startX, startY, cellSize)51 drawSudokuRGBGivens(pdf, startX, startY, cellSize, data.Givens)5253 ruleY := pdfexport.InstructionY(startY+boardH, pageH, ruleLines)54 pdfexport.RenderInstructions(pdf, body.X, ruleY, body.W, rules)55}5657func drawSudokuGridLines(pdf *fpdf.Fpdf, startX, startY, cellSize float64) {58 pdf.SetDrawColor(25, 25, 25)5960 for i := range 10 {61 x := startX + float64(i)*cellSize62 pdf.SetLineWidth(sudokuLineWidthFor(i))63 pdf.Line(x, startY, x, startY+9.0*cellSize)64 }6566 for i := range 10 {67 y := startY + float64(i)*cellSize68 pdf.SetLineWidth(sudokuLineWidthFor(i))69 pdf.Line(startX, y, startX+9.0*cellSize, y)70 }71}7273func sudokuLineWidthFor(index int) float64 {74 switch {75 case index == 0 || index == 9:76 return 0.7277 case index%3 == 0:78 return 0.5679 default:80 return pdfexport.ThinGridLineMM81 }82}8384func drawSudokuRGBGivens(pdf *fpdf.Fpdf, startX, startY, cellSize float64, givens [9][9]int) {85 fontSize := pdfexport.StandardCellFontSize(cellSize, 0.62)86 lineH := fontSize * 0.8587 pdf.SetFont(pdfexport.SansFontFamily, "B", fontSize)88 pdf.SetTextColor(pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray)8990 for y := range 9 {91 for x := range 9 {92 value := givens[y][x]93 if value < 1 || value > valueCount {94 continue95 }96 cellX := startX + float64(x)*cellSize97 cellY := startY + float64(y)*cellSize98 pdf.SetXY(cellX, cellY+(cellSize-lineH)/2)99 pdf.CellFormat(cellSize, lineH, strconv.Itoa(value), "", 0, "C", false, 0, "")100 }101 }102}