use "lib/board" use "lib/palette" use "lib/rules" use "lib/tui" def init [] -> Dict call rules.initial def cell-size [model] -> Int / 160 model.size def board-left [model] -> Int let pixels * (cell-size model) model.size / (- 256 pixels) 2 def board-top [model] -> Int let pixels * (cell-size model) model.size + 31 (/ (- 164 pixels) 2) def inside-board? [model event: Dict] -> Bool let left board-left model let top board-top model let pixels * (cell-size model) model.size and (and (>= event.x left) (< event.x (+ left pixels))) (and (>= event.y top) (< event.y (+ top pixels))) def cell-index [model event: Dict] -> Int let left board-left model let top board-top model let size cell-size model + (/ (- event.x left) size) (* (/ (- event.y top) size) model.size) def again-button? [event: Dict] -> Bool and (>= event.x 65) and (< event.x 101) and (>= event.y 203) (< event.y 219) def pointer [model event: Dict] -> Dict if (and model.game-over (again-button? event)) rules.restart model if (inside-board? model event) rules.place model (cell-index model event) model def legal-cell? [model index: Int] -> Bool board.contains-index? model.legal index def cell-tile [model index: Int] -> View let size cell-size model let x + (board-left model) (* (% index model.size) size) let y + (board-top model) (* (/ index model.size) size) let value get model.cells index let legal legal-cell? model index tui.tile x y size (palette.fill value legal) if legal "#d4b75a" "#30362e" if legal 2 1 def cell-symbol [model index: Int] -> View let size cell-size model let scale if (>= size 28) 2 1 let x + (+ (board-left model) (/ size 2)) (* (% index model.size) size) let y + (+ (board-top model) (/ (- size (* 7 scale)) 2)) (* (/ index model.size) size) let value get model.cells index let legal legal-cell? model index let symbol if legal "+" "" tui.centered-text x y symbol (palette.ink value) scale def view [model] -> View let left board-left model let size cell-size model let board-pixels * model.size size let top board-top model canvas :width 256 :height 224 :label "GridMaster 5000 sixteen by sixteen tile game" :on-pointer pointer rect :x 0 :y 0 :width 256 :height 224 :fill "#11140f" rect :x 0 :y 0 :width 256 :height 3 :fill "#d4b75a" rect :x 8 :y 15 :width 24 :height 1 :fill "#806c35" rect :x 224 :y 15 :width 24 :height 1 :fill "#806c35" tui.centered-text 129 8 "GRIDMASTER 5000" "#654b18" 2 tui.centered-text 128 7 "GRIDMASTER 5000" "#f0d36a" 2 rect :x 8 :y 27 :width 240 :height 1 :fill "#465044" tui.panel (- left 2) (- top 2) (+ board-pixels 4) (+ board-pixels 4) "#0b0d0a" "#596456" for index in (range 0 (* model.size model.size)) :key index cell-tile model index for index in (range 0 (* model.size model.size)) :key index cell-symbol model index rect :x 8 :y 198 :width 240 :height 1 :fill "#465044" tui.text 8 207 "SCORE {model.score}" "#e3e3d8" 1 tui.text 104 207 "CURRENT" "#aeb8a9" 1 tui.tile 160 203 16 (palette.fill model.color false) "#e3e3d8" 2 tui.text 194 207 "NEXT" "#aeb8a9" 1 tui.tile 232 203 16 (palette.fill model.next-color false) "#e3e3d8" 2 when model.game-over rect :x 65 :y 203 :width 36 :height 16 :fill "#d4b75a" tui.centered-text 83 207 "AGAIN" "#11140f" 1 app GridMaster5000 gui init init view view