;;;; ;;;; Terra Nostra is a Minecraft-like survival game for the commandline. ;;;; ;;;; This file defines animal and species structs and the various species ;;;; found in-game. ;;;; ;;;; (c) 2018 Daniel Vedder, MIT license ;;;; ;;; ANIMAL & SPECIES STRUCTS & FUNCTIONS (defvar *animals* NIL) (defstruct animal (id 0) (pos '(0 0)) (health 0) (species NIL)) ;;TODO predatory species (defstruct species (name "") (strength 0) (max-health 0) (aggression 0) ;attack probability % (group-size 1) ;maximum group size (habitat '()) ;preferred biomes (corpse-items '()) ;items dropped on death (update-fn #'(lambda (id) NIL))) ; takes animal ID as argument (let ((species-list NIL)) (defun register-species (symbol-name species-object) (setf species-list (cons (list symbol-name species-object) species-list))) (defun get-species (symbol-name) (cassoc symbol-name species-list))) (defmacro new-species (name &body body) `(register-species name (make-species ,@body))) (let ((max-id 0)) (defun add-animal (species position) "Create a new animal of the given species" (let ((a (make-animal :id max-id :pos position :species species :health (species-max-health species)))) (incf max-id) (setf *animals* (append *animals* a))))) ;;; SPECIES DEFINITIONS ;;XXX Change to African species? ;;TODO bird species (new-species 'deer :name "deer" :strength 3 :max-health 10 :aggression 0 :group-size 10 :habitat '(forest grassland) :corpse-items NIL) ;TODO (new-species 'boar :name "boar" :strength 7 :max-health 15 :aggression 5 :group-size 5 :habitat '(forest) :corpse-items NIL) ;TODO (new-species 'wolf :name "wolf" :strength 10 :max-health 20 :aggression 20 :group-size 6 :habitat '(grassland) :corpse-items NIL) ;TODO (new-species 'bear :name "bear" :strength 20 :max-health 30 :aggression 20 :group-size 1 :habitat '(forest) :corpse-items NIL) ;TODO