game.lisp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. (load "~/Repos/clwars/economy.lisp")
  2. (load "~/Repos/clwars/plumbing.lisp")
  3. (defvar *player-ship*)
  4. (defvar *sector*)
  5. (defun init-game-state ()
  6. (setq *sector* (make-sector :market (make-market :price-of-petrofuel 20
  7. :price-of-ammo 10
  8. :price-of-archeotech 1000
  9. :price-of-spice 50
  10. :price-of-gruel 5)
  11. :hazards NIL
  12. :boons NIL))
  13. (setq *player-ship* (make-player-ship :armor-val 10
  14. :rep-shield-val 10
  15. :warp-drive (list 1 5)
  16. :reactor-str 1
  17. :warp-field 1
  18. :weapons (list (make-weapon :name "Plamsa"
  19. :shield-dmg 3
  20. :hull-dmg 3
  21. :ammo-cost 5)
  22. (make-weapon :name "Mega Bolter"
  23. :shield-dmg 1
  24. :hull-dmg 2
  25. :ammo-cost 1)
  26. (make-weapon :name "Beam"
  27. :shield-dmg 1
  28. :hull-dmg 3
  29. :ammo-cost 3))
  30. :credits 1000
  31. :crew (make-crew :sanity-val 100
  32. :crew-members (loop for x in '(1 2 3 4)
  33. collect (make-uniq-crew-mem :name (make-crew-mem-name))))
  34. :inventory (make-player-inventory :petrofuel 20
  35. :gruel 20
  36. :spice 0
  37. :ammo 20
  38. :archeotech 0))))
  39. (defun new-game ()
  40. (init-game-state)
  41. (game-intro)
  42. (top-level-game-menu))
  43. (defun game-intro ()
  44. (cls)
  45. (format t "In the grim darkness of the far future, there is only COMMERCE...~%")
  46. (sleep 2)
  47. (format t "You embark across a bleak galaxy to ply your wares and discover untold riches!~%")
  48. (sleep 2)
  49. (format t *intro-ship*)
  50. (prompt-read ""))
  51. ;; Options for top level menu
  52. ;; This is the main "gameplay" interface
  53. (defvar *top-level-options-display* "
  54. Actions:
  55. 1 | Sector info | sei
  56. 2 | Ship info | si
  57. 3 | Trade | t
  58. 4 | Scout | s
  59. 5 | Leave | l
  60. ")
  61. (defun sector-info ()
  62. (format t "Called sector-info"))
  63. ;;; SHIP INFO ;;;
  64. (defun display-crew ()
  65. (let* ((crew-struct (crew-crew-members (player-ship-crew *player-ship*)))
  66. (crew-names
  67. (loop for member in crew-struct
  68. collect (list (uniq-crew-mem-name member) NIL NIL))))
  69. (format T "~%CREW DETAILS~%~%")
  70. (format-table T (list (list (crew-sanity-val (player-ship-crew *player-ship*)))) :column-label '("Sanity"))
  71. (format T "~%")
  72. (format-table T crew-names :column-label '("Name" "Buff" "Buff Amount"))))
  73. (defun display-inventory ()
  74. (let ((inventory-list (list
  75. (list "Credits" (player-ship-credits *player-ship*))
  76. (list "Petrofuel" (player-inventory-petrofuel (player-ship-inventory *player-ship*)))
  77. (list "Gruel" (player-inventory-gruel (player-ship-inventory *player-ship*)))
  78. (list "Spice" (player-inventory-spice (player-ship-inventory *player-ship*)))
  79. (list "Ammo" (player-inventory-ammo (player-ship-inventory *player-ship*)))
  80. (list "Archeotech" (player-inventory-archeotech (player-ship-inventory *player-ship*))))))
  81. (format T "~%INVENTORY~%")
  82. (format-table T inventory-list :column-label '("Resource" "Amount"))))
  83. (defun ship-info ()
  84. (display-crew)
  85. (display-inventory))
  86. ;;; SHIP INFO END ;;;
  87. (defun scout ()
  88. (format t "Called scout"))
  89. (defun leave ()
  90. (format t "Called leave"))
  91. ;; Use lookup table to handle top level loop arguments
  92. ;; See: https://dnaeon.github.io/common-lisp-lookup-tables-alists-and-plists/
  93. (defparameter *opt-lookup* (list (cons 'sector-info 'sector-info)
  94. (cons '1 'sector-info)
  95. (cons 'sei 'sector-info)
  96. (cons 'ship-info 'ship-info)
  97. (cons 'si 'ship-info)
  98. (cons '2 'ship-info)
  99. (cons 'trade 'trade-menu)
  100. (cons 't 'trade-menu)
  101. (cons '3 'trade-menu)
  102. (cons 'scout 'scout)
  103. (cons 's 'scout)
  104. (cons '4 'scout)
  105. (cons 'leave 'leave)
  106. (cons 'l 'leave)
  107. (cons '5 'leave)))
  108. (defun top-level-game-menu ()
  109. (format t *top-level-options-display*)
  110. (let ((option (prompt-read "Enter an option: ")))
  111. (format t "~%")
  112. (handle-opt (read-from-string option) *opt-lookup*))
  113. (top-level-game-menu))