From cc3f850c514967ae2f9effef7e68e1d4965c6865 Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 1 Apr 2023 09:48:08 -0700 Subject: Refactor to make cooperative hacking nicer --- src/game/hero.lisp | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/game/hero.lisp (limited to 'src/game/hero.lisp') diff --git a/src/game/hero.lisp b/src/game/hero.lisp new file mode 100644 index 0000000..68606b2 --- /dev/null +++ b/src/game/hero.lisp @@ -0,0 +1,123 @@ +;;;; hero.lisp -- code related to heros + +(in-package :dnd) + +;;; MODEL CLASSES + +(deftype title () + `(member :noob)) + +(deftype character-class () + `(member :hero)) + +(deftype priority () + `(member :low :medium :high)) + +(defun hero-class (h) + "barGaryan") ; TODO: real implementation + +(defun hero-title (h) + "Scouse Chef") ; TODO: real implementation + +(defun renown (hero) + (experience hero)) ; TODO: real implementaiton + + +(defclass hero (game-object has-bag can-equip) + ((name + :accessor name + :initarg :name + :initform (error "Heroes must be named") + :type string + :index-type idx:string-unique-index + :index-reader hero-known-as) + (player + :reader player + :initarg :player + :type player + :index-type idx:hash-index + :index-reader player-heroes) + (quest + :accessor quest + :initarg :quest + :initform nil + :type (or nil quest) + :documentation "The quest that this hero is on. A hero may be on only one quest at a time.")) + (:metaclass db:persistent-class)) + +(defmethod adventure ((hero hero)) + (a:when-let (quest (quest hero)) + (adventure quest))) + +;;; HELPERS + +;;; QUERIES +(defun all-heroes () + (db:store-objects-with-class 'hero)) + +;;; TRANSACTIONS + +(defun birth-from-the-goddess-loins (player name) + (db:with-transaction () + (make-instance 'hero :name name :player player))) + +;;; MODEL VIEWS + +(defrender :list-item ((hero hero)) + (with-html + (:p + (render :link-to hero) + (a:when-let (quest (quest hero)) + (:span "who's quest is to") + (:span (render :link-to quest)))))) + + +(defrender :link-to ((hero hero)) + (with-html + (:a :href (urlpath hero) + (unique-name hero) "the" (hero-class hero) (hero-title hero)))) + +;;; PAGES & PAGE CLASSES + +(defclass hero-page () + ((hero :reader hero :initarg :hero) + (player :reader player :initarg :player))) + +(defrender t ((page hero-page)) + (with-page (:title (unique-name (hero page))) + (:h1 (unique-name (hero page))) + (:p "uhhh....."))) + +(defrender t ((page (eql :goddess-shrine))) + (with-page (:title "A Sacred Shrine") + (:header + (:h1 "Pray and become a hero...")) + (:form :method "POST" :action "/goddess-shrine" + (:label :for "NAME" "Enter the epithet by which the ages shall know thy hero:") + (:input :name "NAME") + (:button :type "submit" "Pray To The Goddess")))) + + +;;; ENDPOINT HELPERS + +(define-id-plucker hero) + +;;; ENDPOINT DEFINITIONS + +(defendpoint* :get "/goddess-shrine" () () + (with-session (player) + (render (page-render-mode) :goddess-shrine))) + +(defendpoint* :post "/goddess-shrine" () () + (with-session (player) + (with-checked-plist ((name :name 'a-short-string)) (lzb:request-body) + (birth-from-the-goddess-loins player name) + (redirect-to "/tavern")))) + + +(defendpoint* :get "/hero/:hero a-hero-with-id:/:name:" () () + (with-session (player) + (render (page-render-mode) + (make-instance 'hero-page + :player player + :hero hero)))) -- cgit v1.2.3