#lang racket/gui (require "structs.rkt") (provide interpret) ;temporary hard-coded player and room with items for testing, before implementing procgen (define room1 (room (pos 0 0) (dim 10 10) (list (weapon "BIG SWORD" (pos 5 5) 4 'sword 5) (armor "LEATHER CAP" (pos 5 9) 1 'helmet 2)))) (define plyr (player "YOU" room1 '() 'human 20 '() 50)) (set-room-contents! room1 (append (room-contents room1) (list plyr))) (define (interpret in) (let ([command (string-upcase in)]) (if (or (string=? command "TYPE HERE...") (string=? command "")) "You need to type something in the box." (let* ([tokens (string-split command)] [verb (first tokens)] [args (rest tokens)]) (case verb [("LOOK") (look args)] [else (~a "I don't understand the verb " verb ".")]))))) (define (look what) (let ([room (obj-pos plyr)]) (if (empty? what) (string-join (obj-names (room-contents room)) ", " #:before-first "In this area, there is: " #:before-last ", and " #:after-last ".") (let* ([what-str (string-join what)] [obj (find-obj what-str room)]) (if (find-obj what-str room) (~a "There is a " what-str " in the area." (describe-obj obj)) (~a "The \"" what-str "\" you're looking for isn't in this area.")))))) (define (find-obj obj room) (findf (λ (arg) (string=? obj (obj-name arg))) (room-contents room))) (define (obj-names list) (map obj-name list)) (define (describe-obj obj) (let ([output ""]) (when (player? obj) (append-str! output "\nIt's you.")) (when (item? obj) (append-str! output (~a "\nIt has a size of: " (item-size obj) ".")) (when (equipment? obj) (append-str! output (~a "\nIt is a piece of equipment of type: " (equipment-type obj) ".")) (when (weapon? obj) (append-str! output (~a "\nIt deals " (weapon-damage obj) " damage."))) (when (armor? obj) (append-str! output (~a "\nIt has a damage resistance of: " (armor-resistance obj) "."))))) (when (creature? obj) (append-str! output (~a "\nIts species is: " (creature-species obj) ".")) (append-str! output (~a "\nIt's at " (creature-health obj) "HP.")) (if (empty? (creature-equipment obj)) (append-str! output (~a "\nIt doesn't look like it's carrying anything.")) (append-str! output (~a "\nIt looks like it's carrying something.")))) output)) (define-syntax-rule (append-str! str1 str2) (set! str1 (~a str1 str2)))