;;;; 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))))