summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/inventory.lisp62
-rw-r--r--src/player.lisp53
-rw-r--r--transacc.asd3
3 files changed, 64 insertions, 54 deletions
diff --git a/src/inventory.lisp b/src/inventory.lisp
new file mode 100644
index 0000000..17c02e7
--- /dev/null
+++ b/src/inventory.lisp
@@ -0,0 +1,62 @@
+(defpackage inventory
+ (:use :cl)
+ (:export :inventory
+ :add-item
+ :remove-item))
+
+(in-package :inventory)
+
+
+(defclass inventory ()
+ ((size :initarg :size
+ :reader size)
+ (filled :initform 0
+ :accessor filled)
+ (items :initform '()
+ :accessor items)))
+
+(defmethod find-item ((inv inventory) name)
+ (with-slots (items) inv
+ (find-if
+ #'(lambda (i)
+ (equal (commodities:name (car i)) name))
+ items)))
+
+(defmethod delete-item ((inv inventory) item)
+ ;; removes <item> from inventory list and substracts
+ ;; its stored quantity from the filled attribute
+ (with-slots (filled items) inv
+ (setq items (remove item items))
+ (setq filled (- filled (cdr item)))))
+
+(defmethod add-item ((inv inventory) item quantity)
+ ;; add <quantity> of <item> to inventory
+ (with-slots (size filled items) inv
+ (when (> size (+ filled quantity))
+ (let* ((old-item
+ (find-item inv (commodities:name item)))
+ (qt (if old-item
+ (progn
+ (delete-item inv old-item)
+ (+ quantity (cdr old-item)))
+ quantity)))
+ (prog1
+ (setq filled (+ filled qt))
+ (push (cons item qt)
+ items))))))
+
+(defmethod remove-item ((inv inventory) name quantity)
+ ;; remove <quantity> of <item> from inventory
+ ;; quantity must be positive or zero
+ (assert (>= quantity 0))
+ (with-slots (filled items) inv
+ (let ((item (find-item inv name)))
+ (when item
+ (delete-item inv item)
+ (if (< quantity (cdr item))
+ (progn
+ (add-item inv
+ (car item)
+ (- (cdr item) quantity))
+ (cons (car item) quantity))
+ item)))))
diff --git a/src/player.lisp b/src/player.lisp
index 6bcf173..bff62aa 100644
--- a/src/player.lisp
+++ b/src/player.lisp
@@ -5,59 +5,6 @@
(in-package :player)
-(defclass inventory ()
- ((size :initarg :size
- :reader size)
- (filled :initform 0
- :accessor filled)
- (items :initform '()
- :accessor items)))
-
-(defmethod find-item ((inv inventory) name)
- (with-slots (items) inv
- (find-if
- #'(lambda (i)
- (equal (commodities:name (car i)) name))
- items)))
-
-(defmethod delete-item ((inv inventory) item)
- ;; removes <item> from inventory list and substracts
- ;; its stored quantity from the filled attribute
- (with-slots (filled items) inv
- (setq items (remove item items))
- (setq filled (- filled (cdr item)))))
-
-(defmethod add-item ((inv inventory) item quantity)
- ;; add <quantity> of <item> to inventory
- (with-slots (size filled items) inv
- (when (> size (+ filled quantity))
- (let* ((old-item
- (find-item inv (commodities:name item)))
- (qt (if old-item
- (progn
- (delete-item inv old-item)
- (+ quantity (cdr old-item)))
- quantity)))
- (prog1
- (setq filled (+ filled qt))
- (push (cons item qt)
- items))))))
-
-(defmethod remove-item ((inv inventory) name quantity)
- ;; remove <quantity> of <item> from inventory
- ;; quantity must be positive or zero
- (assert (>= quantity 0))
- (with-slots (filled items) inv
- (let ((item (find-item inv name)))
- (when item
- (delete-item inv item)
- (if (< quantity (cdr item))
- (progn
- (add-item inv
- (car item)
- (- (cdr item) quantity))
- (cons (car item) quantity))
- item)))))
(defclass player ()
((name :initarg :name
diff --git a/transacc.asd b/transacc.asd
index 6330a31..ad44aae 100644
--- a/transacc.asd
+++ b/transacc.asd
@@ -9,6 +9,7 @@
((:file "main" :depends-on ("game"))
(:file "game" :depends-on ("zone" "player"))
(:file "zone" :depends-on ("commodities"))
- (:file "player" :depends-on ("commodities"))
+ (:file "player" :depends-on ("commodities" "inventory"))
+ (:file "inventory" :depends-on ("commodities"))
(:file "commodities"))))
:description "Buy and sell to greatness")