Browse Source

Merge branch 'features' of swatson/clwars into master

Simon Watson 10 tháng trước cách đây
mục cha
commit
99bc2b4bf1
10 tập tin đã thay đổi với 463 bổ sung128 xóa
  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)