(defpackage player (:use :cl) (:export :init-player :name :get-cash :get-debt :repay-debt :buy-item :sell-item :find-item)) (in-package :player) (defclass player () ((name :initarg :name :reader name) (cash :initarg :cash :accessor cash :reader get-cash) (debt :initarg :debt :accessor debt :reader get-debt) (hp :initform 100 :accessor hp) (clout :initform 0 :accessor clout) (stash :initform 0 :accessor stash) (stock :initform (inventory:new-inventory 100) :accessor stock))) (defun init-player (name &optional (cash 2000) (debt 5000)) (make-instance 'player :name name :cash cash :debt debt)) (defmethod buy-item ((p player) item quantity) (with-slots (stock cash) p (let ((cost (* quantity (commodities:price item)))) (when (>= cash cost) (progn (inventory:add-item stock item quantity) (setq cash (- cash cost)) t))))) (defmethod sell-item ((p player) item amount) (with-slots (stock cash) p (let ((stocked-item (inventory:remove-item stock (commodities:name item) amount))) (when stocked-item (setq cash (+ cash (* (cdr stocked-item) (commodities:price item)))))))) (defmethod find-item ((p player) name) (with-slots (stock) p (inventory:find-item stock name))) (defmethod repay-debt ((p player) amount) (with-slots (debt cash) p (when (and (<= amount debt) (<= amount cash)) (setq cash (- cash amount) debt (- debt amount)) t)))