diff --git a/inventory.lisp b/inventory.lisp index a636db9..e93d204 100644 --- a/inventory.lisp +++ b/inventory.lisp @@ -18,18 +18,50 @@ (in-package :flora-search-aurora.inventory) + +;;; ——————————————————————————————————— +;;; Menu-creation! How fun! +;;; ——————————————————————————————————— +(defun subseq-head (length sequence) + "Get a subsequence of SEQUENCE containing its first LENGTH elements. If LENGTH +exceeds the size of SEQUENCE, the returned subsequence is equivalent to SEQUENCE." + (subseq sequence 0 (…:at-most (length sequence) length))) + + +(defun items->menu-plist (item-plists &key (row-width 72)) + "Convert a list of items’ plists (that one might get from OVERWORLD’s map +:ITEMS) into a pretty and presentable menu-grid of items, for use with +📋:MENU-STATE(-*)." + (format *error-output* "ITEMS ~A~%" item-plists) + (let* ((label-width 7) + (border-width 2) + ;; Weird bounding, whoops! I’m so clumsy, it’s endearing instead of just annoying! … Right? =w=” + (column (- 0 label-width border-width)) + (row 0)) + (mapcar (lambda (item) + (incf column (+ label-width border-width)) + (when (>= column row-width) + (incf row) + (setf column 0)) + (list :en (subseq-head label-width (or (getf (cdr item) :name-en) (getf (cdr item) :id))) + :eo (subseq-head label-width (getf (cdr item) :name-eo)) + :selected (and (eq row 0) (eq column 0)) + :selection (if (and (eq row 0) (eq column 0)) 100 0) + :return nil + :row row)) + item-plists))) + + + ;;; ——————————————————————————————————— ;;; Inventory loop logic ;;; ——————————————————————————————————— -(defun inventory-state-update (map) - (if (and (listen) - (let ((input (getf (⌨:read-gamefied-char-plist) :semantic))) - (or (eq input '⌨:🆗) - (eq input '⌨:❎)))) - (values nil - (list :map map)) - 't)) +(defun inventory-state-update (map inventory-menu) + (if (📋:menu-state-update inventory-menu) + (list :map map :inventory inventory-menu) + (values nil + (list :map map)))) @@ -37,23 +69,23 @@ ;;; Inventory loop drawing ;;; ——————————————————————————————————— (defun inventory-state-draw (matrix items) - (✎:render-string matrix (format nil "~A" items) '(:x 0 :y 0))) + (📋:menu-state-draw matrix items)) ;;; ——————————————————————————————————— ;;; Inventory loop ;;; ——————————————————————————————————— -(defun inventory-state (matrix &key map) +(defun inventory-state (matrix &key map inventory) "A state-function for use with STATE-LOOP." (sleep .02) - (inventory-state-draw matrix (gethash :items map)) - (inventory-state-update map)) + (inventory-state-draw matrix inventory) + (inventory-state-update map inventory)) (defun make-inventory-state (map) "Return a state-function for inventory-listing, for use with STATE-LOOP." - (lambda (matrix &key (map map)) + (lambda (matrix &key (map map) (inventory (items->menu-plist (gethash :items map)))) (apply #'🎒:inventory-state - (list matrix :map map)))) + (list matrix :map map :inventory inventory)))) diff --git a/menu.lisp b/menu.lisp index 37fb776..ec7f93e 100644 --- a/menu.lisp +++ b/menu.lisp @@ -203,7 +203,7 @@ That is, 0 for non-selected items and 100 for selected items." "Given a specific ROW, select the next item following the currently-selected on that same ROW." (let* ((selected-n (selected-menu-item-position menu-plist))) - (loop for i from (1+ selected-n) upto (length menu-plist) + (loop for i from (1+ selected-n) upto (1- (length menu-plist)) do (when (eq (or (getf (nth i menu-plist) :row) 0) row) (return (select-menu-item menu-plist i)))))) @@ -241,6 +241,7 @@ on that same ROW." (1- (or (getf (nth (selected-menu-item-position menu-plist) menu-plist) :row) 1)))) + (defun select-down-menu-item (menu-plist) "Select the next item to below the currently-selected item." (select-next-item-of-row diff --git a/packages.lisp b/packages.lisp index b63bf3d..0cae529 100644 --- a/packages.lisp +++ b/packages.lisp @@ -46,7 +46,7 @@ (defpackage :flora-search-aurora.menu (:nicknames :fsa.men :menu :📋) (:use :cl) - (:export #:menu-state #:make-menu-state + (:export #:menu-state #:menu-state-update #:menu-state-draw #:make-menu-state :label :selection :selected)) (defpackage :flora-search-aurora.dialogue @@ -80,7 +80,7 @@ (:nicknames :fsa.o :overworld :🌍) (:use :cl :flora-search-aurora.overworld.util) - (:export #:overworld-state #:make-overworld-state #:overworld-state-draw + (:export #:overworld-state #:overworld-state-draw #:make-overworld-state #:merge-maps #:world-coords->screen-coords #:getf-entity #:getf-entity-data #:removef-entity