https://git.spwbk.site/swatson/clwars/raw/master/game.lisp
___________________________________
(load "~/Repos/clwars/structs.lisp")
(load "~/Repos/clwars/economy.lisp")
(load "~/Repos/clwars/plumbing.lisp")
(load "~/Repos/clwars/sector.lisp")
(load "~/Repos/clwars/ship.lisp")
(load "~/Repos/clwars/ascii-assets.lisp")


(defvar *sector* NIL)

(defun init-game-state ()
 (setq *sector* (make-instance 'sector :market (make-instance 'market)
                                       :player-ship-obj
                                       (make-instance 'player-ship
                                                      :weapons (list (make-instance 'weapon
                                                                                    :name "Plamsa"
                                                                                    :shield-dmg 3
                                                                                    :hull-dmg 3
                                                                                    :ammo-cost 5)
                                                                     (make-instance 'weapon
                                                                                    :name "Mega Bolter"
                                                                                    :shield-dmg 1
                                                                                    :hull-dmg 2
                                                                                    :ammo-cost 1)
                                                                     (make-instance 'weapon
                                                                                    :name "Beam"
                                                                                    :shield-dmg 1
                                                                                    :hull-dmg 3
                                                                                    :ammo-cost 3))
                                                      :crew (make-instance 'crew
                                                                           :sanity-val 100
                                                                           :moral-val 100
                                                                           :crew-members (loop for x in '(1 2 3 4)
                                                                                               collect (make-instance 'uniq-crew-mem :name (make-crew-mem-name *name-prefixes* *name-values*))))
                                                      :inventory (make-instance 'player-inventory
                                                                                :petrofuel 20
                                                                                :gruel 20
                                                                                :spice 0
                                                                                :ammo 20
                                                                                :archeotech 0)))))


(defun new-game ()
 (init-game-state)
 (game-intro)
 (top-level-game-menu))

(defun game-intro ()
 (cls)
 (format t "In the grim darkness of the far future, there is only COMMERCE...~%")
 (sleep 2)
 (format t "You embark across a bleak galaxy to ply your wares and discover untold riches!~%")
 (sleep 2)
 (format t *intro-ship*)
 (prompt-read ""))

;; Options for top level menu
;; This is the main "gameplay" interface
(defvar *top-level-options-display* "
Actions:
1 | Sector info | sei
2 | Ship info | si
3 | Trade | t
4 | Scout | s
5 | Leave sector | l
")

;; Use lookup table to handle top level loop arguments
;; See: https://dnaeon.github.io/common-lisp-lookup-tables-alists-and-plists/
(defparameter *top-level-opt-lookup* (list (cons 'sector-info 'sector-info)
                                (cons '1 'sector-info)
                                (cons '2 (lambda ()
                                                   (ship-info (player-ship-obj *sector*))))
                                (cons '3 (lambda ()
                                           (trade-menu *sector*)))
                                (cons '4 'scout)
                                (cons '5 'leave)))


(defun top-level-game-menu ()
 (format t *top-level-options-display*)
 (let ((option (prompt-read "Enter an option: ")))
   (format t "~%")
   (handle-opt (read-from-string option) *top-level-opt-lookup*))
 (top-level-game-menu))