blob: 6bcf173be055bdec6bb5be5fc786d48c9eb916ae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
(defpackage player
(:use :cl)
(:export :init-player
:name))
(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
:reader name)
(cash :initarg :cash
:accessor cash)
(debt :initarg :debt
:accessor debt)
(hp :initform 100
:accessor hp)
(clout :initform 0
:accessor clout)
(stash :initform 0
:accessor stash)
(stock :initform (make-instance 'inventory :size 100)
:accessor stock)))
(defun init-player (name &optional (cash 2000) (debt 5000))
(make-instance 'player
:name name
:cash cash
:debt debt))
|