Newer
Older
naledi / biomes.lisp
;;;;
;;;; Naledi ya Africa ("Star of Africa") is a rogue-like survival game
;;;; set in Africa.
;;;;
;;;; Biomes are habitat types, that provide default functions for patches.
;;;; This file defines the biome struct and the inbuilt biomes.
;;;; 
;;;; (c) 2018 Daniel Vedder, MIT license
;;;;

;; Biome struct and register

(defstruct biome
	(name "")
	(ground "")
	(features '()) ;an alist of possible features and their 1/p probabilities
	(char #\.) ;default map display character
	(col ':white)) ;default map display colour

(let ((biome-list NIL))
	(defun register-biome (symbol-name biome-object)
		(setf biome-list (cons (list symbol-name biome-object) biome-list)))

	(defun available-biomes ()
		(keys biome-list))

	(defun get-biome (symbol-name)
		(cassoc symbol-name biome-list)))

(defmacro new-biome (name &body body)
	`(register-biome ',name
		 (make-biome
			 :name ,(symbol-to-string name)
			 ,@body)))


;; Biome definitions

(new-biome grassland
	:ground "tall elephant grass"
	:char #\; :col ':yellow
	:features '((acacia 40) (boulder 150))) ;TODO

(new-biome forest
	:ground "leaf litter and small shrubs"
	:char #\. :col ':green
	:features '((miombo 10) (acacia 15))) ;TODO

(new-biome stream
	:ground "shallow flowing water"
	:char #\~ :col ':blue
	:features '()) ;TODO

(new-biome swamp
	:ground "short sedge grass growing on boggy black soil"
	:char #\w :col ':green
	:features '()) ;TODO

(new-biome hill
	:ground "hard, stony soil"
	:char #\m :col ':cyan ;XXX white might be better
	:features '((boulder 10) (miombo 80))) ;TODO

(new-biome desert
	:ground "deep, drifting sand"
	:char #\^ :col ':white ;XXX yellow would be better, but shows up brown
	:features '((cactus 100) (boulder 200)))

;;TODO desert