aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2025-02-15 15:37:16 +0000
committerAryadev Chavali <aryadev@aryadevchavali.com>2025-02-15 15:37:16 +0000
commit4ded442dd47babd9f3c0163ffe274f92d0e153a7 (patch)
treefda96e74fe286dc895a32549917005b939fd213a /src
parent2323b5e0ed564c215741c869da4b487d56b76502 (diff)
downloadcantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.tar.gz
cantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.tar.bz2
cantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.zip
Player handler package
This package defines a player data structure, collections of players, and different interactions you can have with them: - Extracting attributes (destructors) - Checking if they're bankrupt or can bet - Modifying a collection to adjust the balance of any one player (including errors in case that isn't possible)
Diffstat (limited to 'src')
-rw-r--r--src/player.lisp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/player.lisp b/src/player.lisp
new file mode 100644
index 0000000..7979b25
--- /dev/null
+++ b/src/player.lisp
@@ -0,0 +1,72 @@
+;;; player.lisp - 2025-02-15
+
+;; Copyright (C) 2025 Aryadev Chavali
+
+;; This program is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+;; FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for
+;; details.
+
+;; You may distribute and modify this code under the terms of the GNU General
+;; Public License Version 2, which you should have received a copy of along with
+;; this program. If not, please go to <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Player management - in particular, financing and hand management.
+
+;;; Code:
+
+(in-package :cantedraw.player)
+
+(defun playerp (x)
+ (and (typep (car x) 'fixnum)
+ (typep (cadr x) 'fixnum)
+ (typep (caddr x) 'cardset)))
+
+(deftype player () `(and cons (satisfies playerp)))
+
+(deftype players () 'list)
+
+(fn player-id (player) (-> (player) fixnum)
+ (car player))
+
+(fn player-balance (player) (-> (player) fixnum)
+ (cadr player))
+
+(fn player-hand (player) (-> (player) cardset)
+ (caddr player))
+
+(fn player-exists? (id players) (-> (fixnum players) boolean)
+ (assoc id players))
+
+(fn player-bankrupt? (player) (-> (player) boolean)
+ (<= (cadr player) 0))
+
+(fn player-can-bet? (min-bet player) (-> (fixnum player) boolean)
+ (>= (cadr player) min-bet))
+
+(fn player-pay (id amount players) (-> (fixnum fixnum players) players)
+ (let ((p (assoc id players)))
+ (cond
+ ((not (typep p 'player))
+ (error "Player [~a] does not exist."))
+ ((not (player-can-bet? amount p))
+ (error "Player [~a] has $~a but needs to pay ~a."
+ id (player-balance p) amount))
+ (t
+ (destructuring-bind (id balance cards) p
+ (setf (cdr (assoc id players))
+ (list (- balance amount) cards)))))
+ players))
+
+(fn player-receive (id amount players)
+ (-> (fixnum fixnum players) players)
+ (let ((p (assoc id players)))
+ (if (not (typep p 'player))
+ (error 'error-player-nonexistent
+ :id id))
+ (destructuring-bind (id balance cards) p
+ (setf (cdr (assoc id players))
+ (list (+ balance amount) cards)))
+ players))