|
|
@ -284,17 +284,21 @@ |
|
|
|
(printf "%s\n" fogleman-board-string) |
|
|
|
(return true)) |
|
|
|
|
|
|
|
(defun-local game-piece-position-to-screen-position (piece (* (const board-piece)) &return vec2) |
|
|
|
(defun-local game-piece-grid-position-to-screen-position (piece (* (const board-piece)) &return vec2) |
|
|
|
(var piece-position vec2 (array (type-cast (vec-x (path piece > grid-position)) float) |
|
|
|
(type-cast (vec-y (path piece > grid-position)) float))) |
|
|
|
;; Transfer to pixel space |
|
|
|
(set piece-position (vec2-multiply (array (repeat g-game-board-cell-size-px)) piece-position)) |
|
|
|
;; Add in moving position |
|
|
|
(set piece-position (vec2-add piece-position (path piece > moving-position))) |
|
|
|
;; Add board offset |
|
|
|
(set piece-position (vec2-add piece-position g-game-board-inner-top-left-px)) |
|
|
|
(return piece-position)) |
|
|
|
|
|
|
|
(defun-local game-piece-position-to-screen-position (piece (* (const board-piece)) &return vec2) |
|
|
|
(var piece-position vec2 (game-piece-grid-position-to-screen-position piece)) |
|
|
|
;; Add in moving position |
|
|
|
(set piece-position (vec2-add piece-position (path piece > moving-position))) |
|
|
|
(return piece-position)) |
|
|
|
|
|
|
|
(defun-local game-piece-get-screen-size (piece (* (const board-piece)) &return vec2) |
|
|
|
(var piece-grid-size vec2 |
|
|
|
(array |
|
|
@ -496,6 +500,7 @@ Rush Hour database from Michael Fogleman.\n\n") |
|
|
|
;; |
|
|
|
;; Game loop |
|
|
|
;; |
|
|
|
(var selected-piece (* board-piece) null) |
|
|
|
(var exit-reason (* (const char)) null) |
|
|
|
(while (not exit-reason) |
|
|
|
(var event SDL_Event) |
|
|
@ -508,9 +513,13 @@ Rush Hour database from Michael Fogleman.\n\n") |
|
|
|
|
|
|
|
(var mouse-x int 0) |
|
|
|
(var mouse-y int 0) |
|
|
|
(var mouse-buttons Uint32 (SDL_GetMouseState (addr mouse-x) (addr mouse-y))) |
|
|
|
(var mouse-button-state Uint32 (SDL_GetMouseState (addr mouse-x) (addr mouse-y))) |
|
|
|
|
|
|
|
(var hovered-piece (* board-piece) (pick-game-piece-from-screen-position mouse-x mouse-y)) |
|
|
|
(if (bit-and mouse-button-state SDL_BUTTON_LMASK) |
|
|
|
(block |
|
|
|
(unless selected-piece ;; If holding, allow dragging even when not exactly on piece |
|
|
|
(set selected-piece (pick-game-piece-from-screen-position mouse-x mouse-y)))) |
|
|
|
(set selected-piece nullptr)) |
|
|
|
|
|
|
|
(SDL_RenderClear renderer) |
|
|
|
(unless (= 0 (SDL_RenderCopy renderer background-texture null null)) |
|
|
@ -538,10 +547,17 @@ Rush Hour database from Michael Fogleman.\n\n") |
|
|
|
|
|
|
|
(on-each-existing-board-piece ;; Draw pieces |
|
|
|
piece piece-index |
|
|
|
(when (= hovered-piece piece) |
|
|
|
(continue)) |
|
|
|
(var piece-position vec2 (game-piece-position-to-screen-position piece)) |
|
|
|
(if (= selected-piece piece) |
|
|
|
(scope |
|
|
|
(var piece-position vec2 (game-piece-grid-position-to-screen-position piece)) |
|
|
|
(var mouse-board-pos vec2 (array (type-cast mouse-x float) (type-cast mouse-y float))) |
|
|
|
(set mouse-board-pos (vec2-subtract mouse-board-pos piece-position)) |
|
|
|
(set (path piece > moving-position) |
|
|
|
mouse-board-pos)) |
|
|
|
;; Reset positions on release |
|
|
|
(set (path piece > moving-position) (array 0))) |
|
|
|
|
|
|
|
(var piece-position vec2 (game-piece-position-to-screen-position piece)) |
|
|
|
(var piece-size vec2 (game-piece-get-screen-size piece)) |
|
|
|
|
|
|
|
(var selected-piece-origin vec2 piece-2-1-origin) |
|
|
|