;;; Mudsync --- Live hackable MUD ;;; Copyright © 2016 Christopher Allan Webber ;;; ;;; This file is part of Mudsync. ;;; ;;; Mudsync is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; Mudsync 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 for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Mudsync. If not, see . ;;; Common "things" and stuff you can do with things. (define-module (mudsync thing) #:use-module (mudsync command) #:use-module (mudsync gameobj) #:use-module (8sync actors) #:use-module (8sync agenda) #:use-module (oop goops) #:use-module (ice-9 match) #:use-module (ice-9 format) #:export ( thing-commands thing-commands* thing-contained-commands thing-contained-commands*)) (define thing-commands (list (direct-command "take" 'cmd-take))) ;; Doesn't inherit anything (gameobj has no commands) ;; so it's an alias. (define thing-commands* thing-commands) (define thing-contained-commands (list (direct-command "drop" 'cmd-drop))) ;; Doesn't inherit anything (gameobj has no contained-commands) ;; so it's an alias. (define thing-contained-commands* thing-contained-commands) (define-class () ;; Can be a boolean or a procedure accepting two arguments ;; (thing-actor whos-acting) (takeable #:init-value #f #:init-keyword #:takeable) ;; Can be a boolean or a procedure accepting two arguments ;; (thing-actor whos-dropping) (dropable #:init-value #t #:init-keyword #:dropable) (commands #:init-value (wrap thing-commands)) (contained-commands #:init-value (wrap thing-contained-commands)) (actions #:allocation #:each-subclass #:init-thunk (build-actions (cmd-take thing-cmd-take) (cmd-drop thing-cmd-drop)))) (define* (thing-cmd-take thing message #:key direct-obj) (define player (message-from message)) (define player-name (mbody-val (<-wait player 'get-name))) (define player-loc (mbody-val (<-wait player 'get-loc))) (define thing-name (slot-ref thing 'name)) (define should-take (slot-ref-maybe-runcheck thing 'takeable player)) (if should-take ;; Set the location to whoever's picking us up (begin (gameobj-set-loc! thing player) (<- player 'tell #:text (format #f "You pick up ~a.\n" thing-name)) (<- player-loc 'tell-room #:text (format #f "~a picks up ~a.\n" player-name thing-name) #:exclude player)) (<- player 'tell #:text (format #f "It doesn't seem like you can pick up ~a.\n" thing-name)))) (define* (thing-cmd-drop thing message #:key direct-obj) (define player (message-from message)) (define player-name (mbody-val (<-wait player 'get-name))) (define player-loc (mbody-val (<-wait player 'get-loc))) (define thing-name (slot-ref thing 'name)) (define should-drop (slot-ref-maybe-runcheck thing 'dropable player)) (if player-loc ;; Set the location to whoever's picking us up's location (begin (gameobj-set-loc! thing player-loc) (<- player 'tell #:text (format #f "You drop ~a.\n" thing-name)) (<- player-loc 'tell-room #:text (format #f "~a drops ~a.\n" player-name thing-name) #:exclude player)) (<- player 'tell #:text (format #f "It doesn't seem like you can drop ~a.\n" thing-name))))