e3998c357100

Add fruit to trees
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Fri, 05 Aug 2016 11:48:42 +0000
parents a62254c88969
children c5bf423d48dc
branches/tags (none)
files package.lisp src/main.lisp src/utils.lisp

Changes

--- a/package.lisp	Fri Aug 05 01:29:07 2016 +0000
+++ b/package.lisp	Fri Aug 05 11:48:42 2016 +0000
@@ -14,6 +14,8 @@
     #:d
     #:clamp
     #:symbolize
+    #:random-range
+    #:random-around
 
     #:dlambda
 
--- a/src/main.lisp	Fri Aug 05 01:29:07 2016 +0000
+++ b/src/main.lisp	Fri Aug 05 11:48:42 2016 +0000
@@ -29,6 +29,7 @@
 (define-constant +color-cyan+ 3)
 (define-constant +color-snow+ 4)
 (define-constant +color-green+ 5)
+(define-constant +color-pink+ 6)
 
 (defun init-colors ()
   (charms/ll:init-pair +color-white+ charms/ll:COLOR_WHITE charms/ll:COLOR_BLACK)
@@ -36,7 +37,8 @@
   (charms/ll:init-pair +color-yellow+ charms/ll:COLOR_YELLOW charms/ll:COLOR_BLACK)
   (charms/ll:init-pair +color-cyan+ charms/ll:COLOR_CYAN charms/ll:COLOR_BLACK)
   (charms/ll:init-pair +color-snow+ charms/ll:COLOR_BLACK charms/ll:COLOR_WHITE)
-  (charms/ll:init-pair +color-green+ charms/ll:COLOR_GREEN charms/ll:COLOR_BLACK))
+  (charms/ll:init-pair +color-green+ charms/ll:COLOR_GREEN charms/ll:COLOR_BLACK)
+  (charms/ll:init-pair +color-pink+ charms/ll:COLOR_MAGENTA charms/ll:COLOR_BLACK))
 
 (defmacro with-color (color &body body)
   (once-only (color)
@@ -254,8 +256,8 @@
 
 (defun world-to-screen (wx wy)
   "Convert world-space coordinates to screen-space."
-  (values (- wx *view-x*)
-          (- wy *view-y*)))
+  (values (wrap (- wx *view-x*))
+          (wrap (- wy *view-y*))))
 
 (defun onscreenp (sx sy)
   "Return whether the given screen-space coords are visible in the viewport."
@@ -273,6 +275,9 @@
 ;;; Systems are stored as:
 ;;;
 ;;;     {system-symbol -> (cons system-function type-specifier-list)}
+;;;
+;;; TODO: Figure out the distinct problem.
+
 (defvar *entity-id-counter* 0)
 (defvar *entity-index* (make-hash-table))
 (defvar *component-index* (make-hash-table))
@@ -284,7 +289,7 @@
   (mapc #'clrhash (hash-table-values *component-index*)))
 
 (defun get-entity (id)
-  (gethash *entity-index* id))
+  (gethash id *entity-index*))
 
 
 (defclass entity ()
@@ -360,24 +365,40 @@
 
 ;;;; ECS
 ;;; Components
-(define-component coords x y)
+(define-component coords
+  x y)
 
 (define-component visible
   (glyph :type char)
   color)
 
+(define-component edible
+  energy)
+
+(define-component fruiting
+  chance)
+
 
 ;;; Entities
-(define-entity tree (coords visible))
-(define-entity algae (coords visible))
-
+(define-entity fruit (coords visible edible))
+(define-entity tree (coords visible fruiting))
+(define-entity algae (coords visible edible))
 
 (defun make-tree (x y)
   (make-instance 'tree
                  :coords/x x
                  :coords/y y
                  :visible/glyph #\T
-                 :visible/color +color-green+))
+                 :visible/color +color-green+
+                 :fruiting/chance 0.001))
+
+(defun make-fruit (x y)
+  (make-instance 'fruit
+                 :coords/x x
+                 :coords/y y
+                 :visible/glyph #\o
+                 :visible/color +color-pink+
+                 :edible/energy (random-around 10 3)))
 
 (defun make-algae (x y)
   (make-instance 'algae
@@ -398,6 +419,11 @@
           (visible/glyph entity)
           sx sy)))))
 
+(define-system grow-fruit ((entity fruiting coords))
+  (when (< (random 1.0) (fruiting/chance entity))
+    (make-fruit (random-around (coords/x entity) 2)
+                (random-around (coords/y entity) 2))))
+
 
 ;;;; Flora
 (defun tree-probability (x y)
@@ -501,7 +527,9 @@
           sx sy)))))
 
 (defun draw-ui ()
-  (write-right (format nil "[~D, ~D]" *view-x* *view-y*)
+  (write-right (list
+                 (format nil "[~D, ~D]" *view-x* *view-y*)
+                 (format nil "~D entities" (hash-table-count *entity-index*)))
                (1- *screen-width*) 0))
 
 
@@ -556,6 +584,10 @@
       (t (push key *debug*) t))))
 
 
+(defun tick-world ()
+  (run-system 'grow-fruit))
+
+
 (defun state-title ()
   (render-title)
   (press-any-key)
@@ -585,6 +617,7 @@
     ((:regen) (state-generate))
     ((:help) (state-help))
     (t
+     (tick-world)
      (render-map)
      (sleep 0.1)
      (state-map))))
--- a/src/utils.lisp	Fri Aug 05 01:29:07 2016 +0000
+++ b/src/utils.lisp	Fri Aug 05 11:48:42 2016 +0000
@@ -94,6 +94,13 @@
       ((< n min) min)
       (t n))))
 
+(defun random-range (min max)
+  (+ min (random (- max min))))
+
+(defun random-around (val range)
+  (random-range (- val range)
+                (+ val range)))
+
 
 ;;;; dlambda
 (defmacro dlambda (&rest clauses)