Browse Source

Merge branch 'features' of swatson/clwars into master

Simon Watson 5 months ago
parent
commit
99bc2b4bf1
10 changed files with 463 additions and 128 deletions
  1. 36 16
      README.md
  2. 13 0
      clwars.asd
  3. 1 4
      clwars.lisp
  4. 153 0
      combat.lisp
  5. 110 0
      crew.lisp
  6. 1 0
      economy.lisp
  7. 38 37
      game.lisp
  8. 18 0
      plumbing.lisp
  9. 65 11
      ship.lisp
  10. 28 60
      structs.lisp

+ 36 - 16
README.md

@@ -18,21 +18,27 @@ NOTE: This 'game' is just a playground for me to play with Lisp. It is not a ref
 
 ** Systems
 *** Systems
-- Ship Systems
-  - Hull Integrity
-    - When 0 game over
-  - Repulsor Shield
-    - Each % of shield integrity reduces damage by some %
-  - Warp Drive
-    - How far you can jump per 1 fuel
-  - Reactors
-    - Powers warp drive and warp field
-    - Will always have some power, but if power is too low
-      you with have to jump without a warp field
-  - Munitions
-    - Ammo for weapons
-  - Warp Field
-    - Jumping without a warp field will have random effects
+- Ship Systems/Combat
+  - TODO:
+    - [ ] Basic combat system, perhaps like battleship
+    - [ ] Basic 'move to new sector' system
+    - [ ] Shields recharge after combat
+    - [ ] System for repairing hull
+  - Notes:
+    - Hull Integrity
+      - When 0 game over
+    - Repulsor Shield
+      - Each % of shield integrity reduces damage by some %
+    - Warp Drive
+      - How far you can jump per 1 fuel
+    - Reactors
+      - Powers warp drive and warp field
+      - Will always have some power, but if power is too low
+        you with have to jump without a warp field
+    - Munitions
+      - Ammo for weapons
+    - Warp Field
+      - Jumping without a warp field will have random effects
 - Weapons Systems
   - Weapons have attributes depending on type
   - Plasma Weapon
@@ -44,8 +50,9 @@ NOTE: This 'game' is just a playground for me to play with Lisp. It is not a ref
 - Money/Economy/Items
   - TODO
     - [X] Basic buy/sell mechanics
+    - [ ] Stretch - trade interface for 'friendly' ships
     - [ ] Overhaul buy/sell interface for archeotech specific information
-    - [ ] Random $x*$x ASCII image to represent archeotech
+    - [ ] Stretch - Random $x*$x ASCII image to represent archeotech
     - [X] Variable economy between sectors ('random' prices)
     - [ ] Define how archeotech works (random buffs/characteristics)
       - [ ] Archeotech display menu
@@ -55,16 +62,29 @@ NOTE: This 'game' is just a playground for me to play with Lisp. It is not a ref
     - Can trade archeotech (AT has characteristics that may be desireable to different planetary systems)
 - Crew Systems
   - TODO:
+    - [-] Implemention of crew buffs
+      - [X] Add buff objects
+      - [ ] Resolve buff integration into various systems
+	- [ ] Food
+	- [ ] Moral
+	- [ ] Weapons
+	  - [ ] These should be updated on insertion into crew?
+	- [ ] Shields
     - [ ] Crew consumes gruel on some regular cadence (per action/jump/etc)
     - [ ] Crew will consume spice (if available)
       - Spice increases moral but can be destabilizing to sanity
     - [ ] Implementation of crew member buff charateristics
     - [ ] Sanity/Moral (impacted by availability of spice and/or horrors of the warp)
+      - [ ] What happens when these get low?
+    - [ ] Crew members can die (you lose their buff, no other consequence)
+    - [ ] Recruit new crew members at trading stations (cost?)
 - Hazard/Boon/Sector System
   - TODO:
     - [ ] Encapsulate sector attrs
     - [ ] Encapsulate boon/hazard attrs
     - [ ] Interface for interacting with boons/hazards
+    - [ ] Basic system to jump to new sector
+    - [ ] What happens if you jump with a low power warp shield?
   - Notes:
     - Each sector contains a hazard and a boon
       - A hazard is a combat encounter or some kind of negative event

+ 13 - 0
clwars.asd

@@ -0,0 +1,13 @@
+(asdf:defsystem clwars
+  :version "0.0.1"
+  :depends-on (:closer-mop)
+  :components ((:file "plumbing")
+               (:file "structs")
+	       (:file "crew")
+	       (:file "economy")
+	       (:file "sector")
+	       (:file "ship")
+	       (:file "combat")
+	       (:file "ascii-assets")
+               (:file "clwars")
+	       (:file "game")))

+ 1 - 4
clwars.lisp

@@ -1,8 +1,5 @@
-(ql:quickload "closer-mop")
-(load "~/Repos/clwars/game.lisp")
-
 (defun reload()
-  (load "~/Repos/clwars/clwars.lisp"))
+  (asdf:load-system 'clwars))
 
 (defun main ()
   (format t *menu-splash*)

+ 153 - 0
combat.lisp

@@ -0,0 +1,153 @@
+;;; Combat systems implemented here
+
+(defvar *combat-menu-options-display* "
+Actions:
+1 | Attack | a
+2 | Regen. Shields | r
+3 | Overcharge Gun | o
+4 | Attempt to flee | f
+")
+
+;; Bizarre Core Assumptions TODO?
+;; * Whenever we think of engaging an enemy, the actual enemy object
+;;   is always whatever the first element of the (enemy-ships *sector*)
+;;   list. This is done because I'm lazy and it's fairly easy, will
+;;   figure out a different way if/when it's needed, but in essence,
+;;   the player typically does not make a choice about the characteristics
+;;   of the enemy they fight, the game chooses for you. If this is true,
+;;   this method is fine.
+
+;; Combat options:
+;; Attack (with specific weapon)
+;; Regen shields
+;; - (add value to rep-shield-val at cost of overcharing
+;; - (overcharing can cause warp field to go into low-power)
+;; - (overcharging can cause hull damage)
+;; Overcharge gun at cost of overcharing reactor
+;; Attempt to flee into the warp
+;; - (requires full power / overcharged reactor)
+;; - (can also cause reactor to go low power, which removes ability to regen/overcharge)
+
+;; TODO - Combat always pops off first enemy from the enemy-ships list
+(defun combat-loop (sector)
+  "The main loop responsbile for resolving combat situations"
+  (let ((combat-state T))
+    (loop
+      while combat-state
+      do (progn
+	   (format T *combat-menu-options-display*)
+	   (let ((top-level-selection (prompt-read "Enter a selection: ")))
+	     (case (read-from-string top-level-selection)
+	       (1 (progn ;; There is a way to collapse this progn into a single
+		         ;; function call, but it's arguably a lot less readable
+		    (let* ((weapon (weapon-select-menu (player-ship-obj sector)))
+			   (attack-result (player-ship-attack
+					   (player-ship-obj sector)
+					   (first (enemy-ships sector))
+					   weapon)))
+		      (if attack-result
+			  (progn
+			    (setf (enemy-ships sector) (delete attack-result (enemy-ships sector)))
+			    (format T "Your opponent has been vanquished!~%")
+			    (top-level-game-menu))))
+		    (enemy-turn sector)))))))))
+
+;; IN PROGRESS
+;; (defun enemy-turn (sector)
+;;   "Perform AI actions based on AI-type associated with enemy ship"
+;;   (flet ((enemy-attack (player-ship-obj enemy-obj)
+;; 	   ;; For now, just use the first weapon
+;; 	   (let ((weapon-obj ((first (weapons enemy-obj))))
+;; 		 (ammo
+	     
+	   
+;;   (case (ai-type (first (enemy-ships sector)))
+;;     (aggressive (progn
+;; 		  ;; This AI will just stupidly attack until it's out of ammo
+;; 		  ;; If it runs out of ammo, it will try and flee
+		  
+;; 		  ))
+;;     (fearful () ;; This AI will basically just try to escape, unless it fails
+;;                 ;; twice in a row, in which it will try to attack
+;;      )
+;;     (unpredicatable ())))
+		
+
+;; Select weapon
+;; Determine if hit (% chance?)
+;; If hit resolve shield
+;; -- IF Shields down (ie shield damage causes target shield value to be 0)
+;; -- Apply hull damage
+;; ELSE
+;; -- Decrement shield value per value of shield dmg
+
+(defun weapon-select-menu (player-ship-obj)
+  (let ((weapon-list (loop for weapon in (weapons player-ship-obj)
+			   for i from 0
+			   collect (list i
+					 (name weapon)
+					 (shield-dmg weapon)
+					 (hull-dmg weapon)
+					 (ammo-cost weapon)))))
+    (format T "~%Available Ammo: ~A~%~%" (ammo (inventory player-ship-obj)))
+    (format T "Available Weapons: ~%")
+    (format-table T weapon-list :column-label '("Number" "Name" "Shield Damage" "Hull Damage" "Ammo Cost"))
+    (let ((selection (prompt-read "Select a weapon to via the number column: ")))
+      (format t "Selection was number: ~A and weapon name: ~A~%~%"
+	      selection
+	      (second (nth (parse-integer selection) weapon-list)))
+      (return-from weapon-select-menu (nth (parse-integer selection) (weapons player-ship-obj))))))
+
+
+(defun calculate-shield-damage (attacker-obj target-obj attacker-weapon)
+  "Given a target and a weapon, return a value that the
+   targets shield value should now be set as"
+  (let ((new-shield-value (- (rep-shield-val target-obj) (shield-dmg attacker-weapon))))
+    (setf (ammo (inventory attacker-obj)) (- (ammo (inventory attacker-obj)) (ammo-cost attacker-weapon)))
+    (if (>= 0 new-shield-value)
+	(return-from calculate-shield-damage 0)
+	(return-from calculate-shield-damage new-shield-value))))
+
+(defun calculate-hull-damage (attacker-obj target-obj attacker-weapon)
+  "Given a target and a weapon, return a value that the
+   targets hull value should now be set as"
+  (let ((new-hull-value (- (armor-val target-obj) (hull-dmg attacker-weapon))))
+    (setf (ammo (inventory attacker-obj)) (- (ammo (inventory attacker-obj)) (ammo-cost attacker-weapon)))
+    (if (>= 0 new-hull-value)
+	(return-from calculate-hull-damage 0)
+	(return-from calculate-hull-damage new-hull-value))))
+
+(defun player-ship-attack (player-ship-obj target-obj attacker-weapon)
+  "Given a target and the attackers chosen weapon resolve the combat by
+   calculating shield/hull damage and resolving resources. If the target
+   is reduced to 0 hull points, return the target-obj and end combat"
+  (if (> (ammo-cost attacker-weapon) (ammo (inventory player-ship-obj)))
+      (progn
+	(format T "You don't have enough ammo to fire your ~A gun!~%" (name attacker-weapon))
+	(return-from player-ship-attack NIL)))
+  (let ((calculated-shield-damage (calculate-shield-damage player-ship-obj target-obj attacker-weapon))
+	(calculated-hull-damage (calculate-hull-damage player-ship-obj target-obj attacker-weapon)))
+    (setf (rep-shield-val target-obj) calculated-shield-damage) ;; Resolve shield hit
+    (if (> (rep-shield-val target-obj) 0)
+	(format T "You hit their repulsor shields for ~A !~%" (shield-dmg attacker-weapon)))
+    (if (= 0 calculated-shield-damage)
+	(progn
+	  (format T "Their shields are down!~%")
+	  (setf (armor-val target-obj) calculated-hull-damage)
+	  (format T "You hit their hull for ~A !~%" (hull-dmg attacker-weapon))))
+    (if (= 0 calculated-hull-damage)
+	(progn
+	  (format T "Their hulls been breached! You've won the exchange!~%")
+	  (return-from player-ship-attack target-obj))
+	NIL)))
+
+(defun display-weapons (player-ship-obj)
+  "Given player ship, display weapons and associated attributes"
+  (let* ((weapons (weapons player-ship-obj))
+	 (weapon-list (loop for weapon in weapons
+			    collect (list (name weapon)
+					  (shield-dmg weapon)
+					  (hull-dmg weapon)
+					  (ammo-cost weapon)))))
+    (format T "~%WEAPON DETAILS~%")
+    (format-table T weapon-list :column-label '("Name" "Shield Damage" "Hull Damage" "Ammo Cost"))))

+ 110 - 0
crew.lisp

@@ -0,0 +1,110 @@
+(defun display-crew (player-ship-obj)
+  (let ((crew-names 
+	   (loop for member in (crew-members (crew player-ship-obj))
+		 collect (progn
+			   (if (buff member)
+			       (list (name member) (slot-value (buff member) 'buff-type) (slot-value (buff member) 'buff-value))
+			       (list (name member) NIL NIL))))))
+				    
+    (format T "~%CREW DETAILS~%")
+    (format-table T
+		  (list
+		   (list
+		    (sanity-val (crew player-ship-obj))
+		    (moral-val (crew player-ship-obj)))) :column-label '("Sanity" "Moral"))
+    (format-table T crew-names :column-label '("Name" "Buff" "Buff Amount"))))
+
+(defparameter *buff-types*
+  (list 'weapons-expert
+	'shields-expert
+	'chef
+	'machine-enchanter
+	'warp-shaman
+	'holy-see))
+
+(defun make-buff (buff-type)
+  "Given a buff-type symbol, return an instance of 'crew-buff
+   that corresponds with the buff-type"
+  (case buff-type
+    (holy-see
+     (make-instance 'crew-buff
+		    :name "Holy See" ; Moral cannot go below val while the
+		                     ; Holy See lives
+		    :buff-type buff-type
+		    :buff-value (+ 1 (random 50))))
+    (warp-shaman
+     (make-instance 'crew-buff
+		    :name "Warp Shaman" ; % chance to ignore low power warp shield
+		    :buff-type buff-type
+		    :buff-value (+ 0.1 (random 0.6))))
+    (machine-enchanter
+     (make-instance 'crew-buff
+		    :name "Machine Enchanter" ; Val is % chance to not consume
+		                              ; ammo when firing weapon
+		    :buff-type buff-type
+		    :buff-value (+ 0.1 (random 0.6))))
+    (chef
+     (make-instance 'crew-buff
+		    :name "Chef" ; Reduce gruel consumption / action by val
+		    :buff-type buff-type
+		    :buff-value (+ 1 (random 20))))
+    (shields-expert
+     (make-instance 'crew-buff
+		    :name "Shields Expert" ; Increases shield str by val
+		    :buff-type buff-type
+		    :buff-value (+ 1 (random 3))))
+     (weapons-expert
+      (make-instance 'crew-buff
+		     :name "Weapons Expert" ; Increases all weapon damage by val
+		     :buff-type buff-type
+		     :buff-value (+ 1 (random 3))))))
+
+(defun get-random-buff (buff-types)
+  "Return a random 'crew-buff object"
+  (make-buff (nth (+ 1 (random (length buff-types))) buff-types)))
+
+;; Crew name generators
+(defvar *name-prefixes*
+  (list "Precepitor"
+	"Auriga"
+	"Basileus"
+	"Pontiff"
+	"Palatine"
+	"Centurion"
+	"Conjugator"
+	"Principus"
+	"Executor"
+	"Commonus"
+	"Gothicus"
+	"Augusta"
+	"Calligraphus"
+	"Imperator"
+	"Consul"
+	"Signifier"
+	"Tribune"
+	"Praetorian"
+	"Prefect"))
+
+(defvar *name-values*
+  (list "Atticus"
+	"Aurelia"
+	"Cassius"
+	"Maximus"
+	"Aurelius"
+	"Magnus"
+	"Lucius"
+	"Augustus"
+	"Caeser"
+	"Remus"
+	"Julius"
+	"Octavius"
+	"Cato"
+	"Tiberius"
+	"Nero"
+	"Romulus"
+	"Septimus"
+	"Cicero"
+	"Cyprian"
+	"Justus"
+	"Quintus"
+	"Decimus"))

+ 1 - 0
economy.lisp

@@ -101,6 +101,7 @@ Actions:
 	(cons 'price-of-spice '(5 101))
 	(cons 'price-of-gruel '(1 16))))
 
+;; This could be simplfied with (map #')
 (defun randomize-market-prices (market)
   (let ((get-random-val (lambda (resource-arg)
 			  (+ (cadr resource-arg)

+ 38 - 37
game.lisp

@@ -1,43 +1,44 @@
-(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)))))
+  (setq *sector*
+	(make-instance 'sector
+		       :market (make-instance 'market)
+		       :player-ship-obj
+		       (make-instance 'ship
+				      :weapons (list (make-instance 'weapon
+								    :name "Plamsa"
+								    :shield-dmg 1
+								    :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 3
+								    :hull-dmg 1
+								    :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-name *name-prefixes* *name-values*)
+												       :buff (funcall
+													      (lambda ()
+														(if (= 1 (+ 1(random 5)))
+														    (get-random-buff *buff-types*)
+														    NIL))))))
+															     
+							   :inventory (make-instance 'player-inventory
+										     :petrofuel 20
+										     :gruel 20
+										     :spice 0
+										     :ammo 20
+										     :archeotech 0)))))
 
 
 (defun new-game ()

+ 18 - 0
plumbing.lisp

@@ -63,3 +63,21 @@
    function associated with the opt used"
   (let ((handler (cdr (assoc opt lookup-table))))
     (if handler (funcall handler) (format t "Invalid opt~%~%"))))
+
+(defun return-slots (obj)
+  "Given an object, return the names of it's slots"
+  (map 'list #'closer-mop:slot-definition-name (closer-mop:class-slots (class-of obj))))
+
+(defun simple-print-object (obj)
+  "Given an object, print it's slots and slot values"
+  (loop for slot in (return-slots obj)
+	do (format T "Slot: ~A Value: ~A~%" 
+		   slot
+		   (slot-value obj slot))))
+
+(defun make-name (name-prefixes name-values)
+  "Expects a list of strings to use as prefixes for a name, and a list
+   of possible names"
+  (let ((name (nth (random (length name-values)) name-values))
+	(prefix (nth (random (length name-prefixes)) name-prefixes)))
+    (concatenate 'string prefix " " name)))

+ 65 - 11
ship.lisp

@@ -1,13 +1,67 @@
-;;; SHIP INFO ;;;
-(defun display-crew (player-ship-obj)
-  (let ((crew-names 
-	   (loop for member in (crew-members (crew player-ship-obj))
-		 collect (list (name member)))))
-    (format T "~%CREW DETAILS~%~%")
-    (format-table T (list (list (sanity-val (crew player-ship-obj)))) :column-label '("Sanity"))
-    (format T "~%")
-    (format-table T crew-names :column-label '("Name" "Buff" "Buff Amount"))))
+(defvar *ai-ship-name-prefixes*
+  (list
+    "The Eerie"
+    "The Sinister"
+    "The Macabre"
+    "The Gothic"
+    "The Morbid"
+    "The Haunting"
+    "The Foreboding"
+    "The Menacing"
+    "The Ominous"
+    "The Grim"
+    "The Mysterious"
+    "The Cryptic"
+    "The Unsettling"
+    "The Spooky"
+    "The Creepy"
+    "The Chilling"
+    "The Ghostly"
+    "The Shadowy"
+    "The Forensic"
+    "The Malevolent"))
+
+(defvar *ai-ship-name-suffixes*
+  (list
+    "Boat"
+    "Craft"
+    "Solarboat"
+    "Schooner"
+    "Clipper"
+    "Steamer"
+    "Freighter"
+    "Cargo ship"
+    "Liner"
+    "Cruiser"
+    "Ferry"
+    "Barge"
+    "Canoe"
+    "Kayak"
+    "Raft"
+    "Yacht"
+    "Catamaran"
+    "Submarine"
+    "Galleon"
+    "Spacecraft"
+    "Rocket"
+    "Starship"
+    "Interstellar"
+    "VTOL"
+    "Lunar Module"
+    "Shuttle"
+    "Cosmic Capsule"
+    "Orbital Craft"
+    "Extraterrestrial Transport"
+    "Astroplane"
+    "Celestial Cruiser"
+    "Galactic Explorer"
+    "Planetary Probe"
+    "Voyager"
+    "Astroship"
+    "Deep Space Explorer"
+    "Cosmonaut Craft"))
 
+;;; SHIP INFO ;;;
 (defun display-inventory (player-ship-obj)
   (let* ((inventory (inventory player-ship-obj))
 	(inventory-list (loop for slot in (return-slots inventory)
@@ -16,8 +70,8 @@
     (format T "~%INVENTORY~%")
     (format-table T inventory-list :column-label '("Resource" "Amount"))))
 
-
 (defun ship-info (player-ship-obj)
   (display-crew player-ship-obj)
-  (display-inventory player-ship-obj))
+  (display-inventory player-ship-obj)
+  (display-weapons player-ship-obj))
 ;;; SHIP INFO END ;;;

+ 28 - 60
structs.lisp

@@ -21,7 +21,7 @@
     :accessor enemy-ships
     :initform NIL)))
 
-(defclass player-ship ()
+(defclass ship ()
   ((armor-val
     :initarg :armor-val
     :accessor armor-val
@@ -51,10 +51,22 @@
     :initform 1000)
    (crew
     :initarg :crew
-    :accessor crew)
+    :accessor crew
+    :initform NIL)
    (inventory
     :initarg :inventory
-    :accessor inventory)))
+    :accessor inventory
+    :initform (make-instance 'player-inventory))))
+
+(defclass ai-ship (ship)
+  ((name
+    :initarg :name
+    :accessor name
+    :initform NIL)
+   (ai-type
+   :initarg :ai-type
+   :accessor ai-type
+   :initform NIL)))
 
 (defclass player-inventory ()
     ((petrofuel
@@ -91,10 +103,6 @@
     :initarg :crew-members  ; List of *uniq-crew-mem*
     :accessor crew-members)))
 
-;; "Given an object, return the names of it's slots"
-(defun return-slots (obj)
-  (map 'list #'closer-mop:slot-definition-name (closer-mop:class-slots (class-of obj))))
-
 ;;; Unique crew member that can provide an abstract buff
 ;;; or nerf to some internal game system
 (defclass uniq-crew-mem ()
@@ -106,58 +114,18 @@
     :accessor buff
     :initform NIL)))
 
-;; Crew name generators
-(defvar *name-prefixes*
-  (list "Precepitor"
-	"Auriga"
-	"Basileus"
-	"Pontiff"
-	"Palatine"
-	"Centurion"
-	"Conjugator"
-	"Principus"
-	"Executor"
-	"Commonus"
-	"Gothicus"
-	"Augusta"
-	"Calligraphus"
-	"Imperator"
-	"Consul"
-	"Signifier"
-	"Tribune"
-	"Praetorian"
-	"Prefect"))
-
-(defvar *name-values*
-  (list "Atticus"
-	"Aurelia"
-	"Cassius"
-	"Maximus"
-	"Aurelius"
-	"Magnus"
-	"Lucius"
-	"Augustus"
-	"Caeser"
-	"Remus"
-	"Julius"
-	"Octavius"
-	"Cato"
-	"Tiberius"
-	"Nero"
-	"Romulus"
-	"Septimus"
-	"Cicero"
-	"Cyprian"
-	"Justus"
-	"Quintus"
-	"Decimus"))
-  
-(defun make-crew-mem-name (name-prefixes name-values)
-  "Expects a list of strings to use as prefixes for a name, and a list
-   of possible names"
-  (let ((name (nth (random (length name-values)) name-values))
-	(prefix (nth (random (length name-prefixes)) name-prefixes)))
-    (concatenate 'string prefix " " name)))
+(defclass crew-buff ()
+  ((name
+    :initarg :name
+    :accessor name)
+   (buff-type
+    :initarg :buff-type
+    :accessor buff-type
+    :initform NIL)
+   (buff-value
+    :initarg :buff-value
+    :accessor buff-value
+    :initform NIL)))
 
 (defclass weapon ()
   ((name
@@ -165,7 +133,7 @@
     :accessor name)
    (shield-dmg
     :initarg :shield-dmg
-    :accessor sheild-dmg)
+    :accessor shield-dmg)
    (hull-dmg
     :initarg :hull-dmg
     :accessor hull-dmg)