(defpackage game (:use :cl) (:export :new-game :buy-item :sell-item :change-zone :get-profit :get-profit-in-zone)) (in-package :game) (defclass game () ((player :initarg :player :accessor player) (zones :initarg :zones :accessor zones) (cur-zone :initarg :start-zone :accessor cur-zone))) (defun new-game (player start-zone zones) (make-instance 'game :player player :zones zones :start-zone start-zone)) (defmethod buy-item ((g game) name amount) (with-slots (player cur-zone) g (let ((item (zone:get-commodity cur-zone name))) (when item (player:buy-item player item amount))))) (defmethod sell-item ((g game) name amount) (with-slots (player cur-zone) g (let ((item (zone:get-commodity cur-zone name))) (when item (player:sell-item player item amount))))) (defmethod change-zone ((g game) name) (with-slots (cur-zone zones) g (let ((z (find-if (lambda (z) (string= name (zone:name z))) zones))) (when z (setq cur-zone z))))) (defmethod get-profit-in-zone ((g game) name zone) (with-slots (player) g (let ((player-item (car (player:find-item player name))) (zone-item (zone:get-commodity zone name))) (if (and player-item zone-item) (- (commodities:price zone-item) (commodities:price player-item)) 0)))) (defmethod get-profit ((g game) name) (with-slots (cur-zone) g (get-profit-in-zone g name cur-zone)))