# HG changeset patch # User Steve Losh # Date 1483811288 0 # Node ID fa45164eab854974d6b9fb2df7f2cef8efe8b685 # Parent f17271ef79b7e14599b44b7323b513cf221aaec7 Add random food diff -r f17271ef79b7 -r fa45164eab85 .lispwords --- a/.lispwords Sat Jan 07 17:08:58 2017 +0000 +++ b/.lispwords Sat Jan 07 17:48:08 2017 +0000 @@ -1,1 +1,2 @@ (1 with-panel-and-window with-panels-and-windows) +(1 create-entity) diff -r f17271ef79b7 -r fa45164eab85 antipodes.asd --- a/antipodes.asd Sat Jan 07 17:08:58 2017 +0000 +++ b/antipodes.asd Sat Jan 07 17:48:08 2017 +0000 @@ -29,5 +29,6 @@ (:file "holdable") (:file "visible"))) (:module "entities" :serial t - :components ((:file "player"))) + :components ((:file "food") + (:file "player"))) (:file "main"))))) diff -r f17271ef79b7 -r fa45164eab85 data/vegetables.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/vegetables.lisp Sat Jan 07 17:48:08 2017 +0000 @@ -0,0 +1,86 @@ +#("acorn squash" + "alfalfa sprouts" + "artichokes" + "arugula" + "asparagus" + "aubergine" + "azuki beans" + "banana squash" + "basil" + "bean sprouts" + "beets" + "black beans" + "black-eyed peas" + "bok choy" + "borlotti beans" + "broad beans" + "broccoli" + "brussels sprouts" + "butternut squash" + "cabbage" + "carrots" + "cauliflower" + "celery" + "chard" + "chickpeas" + "chives" + "cilantro" + "collard greens" + "corn" + "cucumber" + "dill" + "eggplant" + "garlic" + "ginger" + "green beans" + "green peppers" + "horseradish" + "hubbard squash" + "pickled jalapenos" + "kale" + "kidney bean" + "kohlrabi" + "lavender" + "leeks" + "lemon grass" + "lentils" + "lettuce" + "lima bean" + "marjoram" + "mung beans" + "mushrooms" + "mustard greens" + "navy beans" + "nettles" + "okra" + "onion" + "oregano" + "parsley" + "parsnips" + "peas" + "pinto beans" + "potatos" + "pumpkin" + "radishes" + "rhubarb" + "rosemary" + "runner beans" + "rutabagas" + "sage" + "scallions" + "shallots" + "snap peas" + "soy beans" + "spaghetti squash" + "spinach" + "squash" + "sweet potatos" + "thyme" + "tomatos" + "tubers" + "turnips" + "wasabi" + "watercress" + "white radishes" + "yams" + "zucchini") diff -r f17271ef79b7 -r fa45164eab85 package.lisp --- a/package.lisp Sat Jan 07 17:08:58 2017 +0000 +++ b/package.lisp Sat Jan 07 17:48:08 2017 +0000 @@ -22,9 +22,11 @@ :write-lines-left :write-lines-centered :with-dims + :with-window-dims :defcolors :with-color :init-colors + :read-file-into-form )) (defpackage :ap.generation @@ -61,6 +63,10 @@ :player-get :player-drop + :food + :make-food + :food/energy + :coords :coords/x :coords/y diff -r f17271ef79b7 -r fa45164eab85 src/entities/food.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/entities/food.lisp Sat Jan 07 17:48:08 2017 +0000 @@ -0,0 +1,26 @@ +(in-package :ap.entities) + +(defparameter *vegetables* + (read-file-into-form "data/vegetables.lisp")) + + +(define-entity food (visible coords holdable) + (energy :accessor food/energy :initarg :food/energy)) + +(defun random-food-energy () + (random-range 30.0 80.0)) + +(defun random-food-description () + (format nil "a ~A of ~A" + (random-elt #("can" "tin" "package")) + (random-elt *vegetables*))) + +(defun make-food (x y) + (create-entity 'food + :coords/x x + :coords/y y + :visible/glyph "%" + :visible/color ap::+yellow-black+ + :holdable/description (random-food-description) + :food/energy (random-food-energy))) + diff -r f17271ef79b7 -r fa45164eab85 src/main.lisp --- a/src/main.lisp Sat Jan 07 17:08:58 2017 +0000 +++ b/src/main.lisp Sat Jan 07 17:48:08 2017 +0000 @@ -24,14 +24,7 @@ (defparameter *wat* nil) (defparameter *player* nil) (defparameter *sidebar-width* 30) - - -;;;; More Utils Lol -(defmacro with-window-dims (window &body body) - (with-gensyms (w h) - `(multiple-value-bind (,w ,h) (charms:window-dimensions ,window) - (with-dims (,w ,h) - ,@body)))) +(defparameter *food-density* 1/6000) ;;;; Colors ------------------------------------------------------------------- @@ -108,23 +101,45 @@ ;;;; World Generation --------------------------------------------------------- +(defun underwaterp (height) + (< height 0.05)) + +(defun generate-terrain () + (setf *terrain* (ap.generation::generate-heightmap) + *view-x* 0 *view-y* 0)) + +(defun spawn-player () + (setf *player* (make-player))) + +(defun place-food () + (iterate + (with remaining = (round (* *food-density* + ap.generation::*map-size* + ap.generation::*map-size*))) + (until (zerop remaining)) + (for x = (random ap.generation::*map-size*)) + (for y = (random ap.generation::*map-size*)) + (when (not (underwaterp (aref *terrain* x y))) + (make-food x y) + (decf remaining)))) + (defun generate-world () (clear-entities) - (with-dims (30 (+ 2 2)) + (with-dims (30 (+ 2 3)) (with-panel-and-window (pan win *width* *height* (center *width* *screen-width*) (center *height* *screen-height*)) (border win) - (progn - (write-string-left win "Generating terrain..." 1 1) - (redraw) - (setf *terrain* (ap.generation::generate-heightmap) - *view-x* 0 *view-y* 0)) - (progn - (write-string-left win "Spawning player..." 1 2) - (redraw) - (setf *player* (make-player))))) + (progn (write-string-left win "Generating terrain..." 1 1) + (redraw) + (generate-terrain)) + (progn (write-string-left win "Placing food..." 1 2) + (redraw) + (place-food)) + (progn (write-string-left win "Spawning player..." 1 3) + (redraw) + (spawn-player)))) (world-map)) @@ -149,6 +164,21 @@ (coords/x *player*) (coords/y *player*))) +(defun render-items (window) + (let ((items (-<> (coords-lookup (coords/x *player*) + (coords/y *player*)) + (remove-if-not #'holdable? <>)))) + (when items + (if (= (length items) 1) + (write-string-left window "The following thing is here:" 0 0) + (write-string-left window "The following things are here:" 0 0)) + (iterate + (for item :in items) + (for y :from 1) + (write-string-left window + (format nil " ~A" (holdable/description item)) + 0 1))))) + (defun render-map (window) (iterate (with terrain = *terrain*) @@ -161,7 +191,10 @@ (for (values glyph color) = (terrain-char (aref terrain x y))) (with-color (window color) (charms:write-char-at-point window glyph sx sy)) - (for entity = (find-if #'visible? (coords-lookup x y))) + (for entities = (coords-lookup x y)) + (for entity = (if (member *player* entities) + *player* + (find-if #'visible? entities))) (when entity (with-color (window (visible/color entity)) (charms:write-string-at-point window (visible/glyph entity) sx sy))))) @@ -214,7 +247,8 @@ (render-sidebar bar-win)) (with-window-dims map-win (center-view-on-player *width* *height*) - (render-map map-win)) + (render-map map-win) + (render-items map-win)) (redraw) (case (world-map-input bar-win) (:tick (tick-player *player*)) diff -r f17271ef79b7 -r fa45164eab85 src/utilities.lisp --- a/src/utilities.lisp Sat Jan 07 17:08:58 2017 +0000 +++ b/src/utilities.lisp Sat Jan 07 17:48:08 2017 +0000 @@ -72,11 +72,17 @@ (for y :from start-y) (write-string-centered window line y))) + (defmacro with-dims ((width height) &body body) `(let ((ap::*width* ,width) (ap::*height* ,height)) ,@body)) +(defmacro with-window-dims (window &body body) + (with-gensyms (w h) + `(multiple-value-bind (,w ,h) (charms:window-dimensions ,window) + (with-dims (,w ,h) + ,@body)))) (defmacro defcolors (&rest colors) `(progn @@ -102,3 +108,9 @@ ;;;; Maths -------------------------------------------------------------------- (defun center (size max) (truncate (- max size) 2)) + + +;;;; File I/O ----------------------------------------------------------------- +(defun read-file-into-form (filename) + (with-open-file (s filename) + (read s)))