From 2e4e40a7615eee69cb325a00791970a87f8cd4b9 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Fri, 12 Jun 2009 09:44:06 +0100 Subject: [PATCH] 2 player working, sorted out plant types --- hex-ornament/hex-ornament.scm | 364 ++++++++++-------- .../knobbly/branches/comp-1-0.png} | Bin .../knobbly/branches/comp-2-0.png} | Bin .../knobbly/branches/comp-3-0.png} | Bin .../knobbly/branches/comp-3-1.png} | Bin .../knobbly/branches/comp-cp-1-0.png} | Bin .../knobbly/branches/comp-cp-2-0.png} | Bin .../knobbly/branches/comp-cp-3-0.png} | Bin .../knobbly/branches/comp-cp-3-1.png} | Bin .../knobbly/leaves/comp-0.png} | Bin .../knobbly/leaves/comp-1.png} | Bin .../knobbly/leaves}/comp-11.png | Bin .../knobbly/leaves}/comp-4.png | Bin .../knobbly/leaves}/comp-5.png | Bin .../knobbly/leaves}/comp-6.png | Bin .../knobbly/leaves}/comp-7.png | Bin .../knobbly/leaves}/comp-8.png | Bin .../knobbly/leaves}/comp-9.png | Bin .../knobbly/roots/roots.png} | Bin .../lollypop/branches}/comp-1-0.png | Bin .../lollypop/branches}/comp-2-0.png | Bin .../lollypop/branches}/comp-3-0.png | Bin .../lollypop/branches}/comp-4-0.png | Bin .../lollypop/branches}/comp-5-0.png | Bin .../lollypop/branches}/comp-cp-1-0.png | Bin .../lollypop/branches}/comp-cp-2-0.png | Bin .../lollypop/branches}/comp-cp-3-0.png | Bin .../lollypop/branches}/comp-cp-4-0.png | Bin .../lollypop/branches}/comp-cp-5-0.png | Bin .../lollypop/leaves}/comp-0.png | Bin .../lollypop/leaves}/comp-1.png | Bin .../lollypop/roots}/roots.png | Bin hex-ornament/textures/comp-10.png | Bin 35045 -> 0 bytes 33 files changed, 198 insertions(+), 166 deletions(-) rename hex-ornament/{textures/comp-1-1.png => plants/knobbly/branches/comp-1-0.png} (100%) rename hex-ornament/{textures/comp-2-1.png => plants/knobbly/branches/comp-2-0.png} (100%) rename hex-ornament/{textures/comp-3-1.png => plants/knobbly/branches/comp-3-0.png} (100%) rename hex-ornament/{textures/comp-3-2.png => plants/knobbly/branches/comp-3-1.png} (100%) rename hex-ornament/{textures/comp-cp-1-1.png => plants/knobbly/branches/comp-cp-1-0.png} (100%) rename hex-ornament/{textures/comp-cp-2-1.png => plants/knobbly/branches/comp-cp-2-0.png} (100%) rename hex-ornament/{textures/comp-cp-3-1.png => plants/knobbly/branches/comp-cp-3-0.png} (100%) rename hex-ornament/{textures/comp-cp-3-2.png => plants/knobbly/branches/comp-cp-3-1.png} (100%) rename hex-ornament/{textures/comp-2.png => plants/knobbly/leaves/comp-0.png} (100%) rename hex-ornament/{textures/comp-3.png => plants/knobbly/leaves/comp-1.png} (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-11.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-4.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-5.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-6.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-7.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-8.png (100%) rename hex-ornament/{textures => plants/knobbly/leaves}/comp-9.png (100%) rename hex-ornament/{textures/roots-ornate.png => plants/knobbly/roots/roots.png} (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-1-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-2-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-3-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-4-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-5-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-cp-1-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-cp-2-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-cp-3-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-cp-4-0.png (100%) rename hex-ornament/{textures => plants/lollypop/branches}/comp-cp-5-0.png (100%) rename hex-ornament/{textures => plants/lollypop/leaves}/comp-0.png (100%) rename hex-ornament/{textures => plants/lollypop/leaves}/comp-1.png (100%) rename hex-ornament/{textures => plants/lollypop/roots}/roots.png (100%) delete mode 100644 hex-ornament/textures/comp-10.png diff --git a/hex-ornament/hex-ornament.scm b/hex-ornament/hex-ornament.scm index 06af8b8..37f22b2 100644 --- a/hex-ornament/hex-ornament.scm +++ b/hex-ornament/hex-ornament.scm @@ -1,18 +1,18 @@ -;#lang scheme +;#lang scheme/base ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; hex ornament/groworld game : fluxus version -;(require fluxus-016/drflux.ss) +;(require fluxus-016/drflux) (require scheme/class) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; tweakables -(define num-insects 50) +(define num-insects 20) (define pickup-drop-probability 10) (define (vec3->vec4 v a) - (vector (vx v) (vy v) (vz v) a)) + (vector (vx v) (vy v) (vz v) a)) (define (bg-colour) (vector 0.9 0.8 0.7)) (define (worm-colour) (hsv->rgb (vector 0.1 (rndf) 0.5))) @@ -20,6 +20,11 @@ (define (pickup-colour) (hsv->rgb (vector 0.1 (rndf) 1))) (define (absorb-colour) (vec3->vec4 (hsv->rgb (vector (rndf) 0.2 (+ 0.6 (rndf)))) 0.2)) +(define (type->colour type) + (cond + ((string=? type "knobbly") (vector 1 0.6 0.6)) + ((string=? type "lollypop") (vector 0.6 0.6 1)))) + ;(define texpath "") (define texpath "textures/") @@ -29,34 +34,34 @@ ; return a version of list l with v inserted at the nth ; position and with c as a counter (define (insert l n v c) - (cond - ((null? l) l) - ((eq? c n) (cons v (insert (cdr l) n v (+ c 1)))) - (else (cons (car l) (insert (cdr l) n v (+ c 1)))))) + (cond + ((null? l) l) + ((eq? c n) (cons v (insert (cdr l) n v (+ c 1)))) + (else (cons (car l) (insert (cdr l) n v (+ c 1)))))) (define (list-remove l i) - (if (zero? i) - (cdr l) - (cons (car l) (list-remove (cdr l) (- i 1))))) + (if (zero? i) + (cdr l) + (cons (car l) (list-remove (cdr l) (- i 1))))) (define (shuffle l) - (if (null? l) - '() - (let ((i (random (length l)))) - (cons (list-ref l i) - (shuffle (list-remove l i)))))) + (if (null? l) + '() + (let ((i (random (length l)))) + (cons (list-ref l i) + (shuffle (list-remove l i)))))) (define (choose l) - (list-ref l (random (length l)))) + (list-ref l (random (length l)))) ; convert a list of bools into a number, treating the ; list as a binary sequence (define (bool-list->num l n c) - (cond - ((null? l) n) - ((car l) (bitwise-ior (arithmetic-shift 1 c) - (bool-list->num (cdr l) n (+ c 1)))) - (else (bool-list->num (cdr l) n (+ c 1))))) + (cond + ((null? l) n) + ((car l) (bitwise-ior (arithmetic-shift 1 c) + (bool-list->num (cdr l) n (+ c 1)))) + (else (bool-list->num (cdr l) n (+ c 1))))) ; how to find your way around a hexagon ; . @@ -78,34 +83,34 @@ (define directions (list NE E SE SW W NW)) (define (rdirection d) - (cond - ((eq? d NE) SW) - ((eq? d E) W) - ((eq? d SE) NW) - ((eq? d SW) NE) - ((eq? d W) E) - ((eq? d NW) SE))) + (cond + ((eq? d NE) SW) + ((eq? d E) W) + ((eq? d SE) NW) + ((eq? d SW) NE) + ((eq? d W) E) + ((eq? d NW) SE))) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; util for building random plants (define (make-random-plant depth) - (let ((num-children (cond ((> depth 2) 0) - ((< depth 1) (choose (list 2 3))) - (else (choose (list 0 1 2 3)))))) - (cond - ((eq? num-children 0) (list (choose (list "11")) (list))) - ((eq? num-children 1) (list "1-1" (list (make-random-plant (+ depth 1))))) - ((eq? num-children 2) (list "2-1" (list (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1))))) - ((eq? num-children 3) (list "3-1" (list (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1))))) - ((eq? num-children 4) (list "4-1" (list (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1))))) - ((eq? num-children 5) (list "5-1" (list (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)) - (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)))))))) + (let ((num-children (cond ((> depth 2) 0) + ((< depth 1) (choose (list 2 3))) + (else (choose (list 0 1 2 3)))))) + (cond + ((eq? num-children 0) (list (choose (list "0" "1")) (list))) + ((eq? num-children 1) (list "1-0" (list (make-random-plant (+ depth 1))))) + ((eq? num-children 2) (list "2-0" (list (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1))))) + ((eq? num-children 3) (list "3-0" (list (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1))))) + ((eq? num-children 4) (list "4-0" (list (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1))))) + ((eq? num-children 5) (list "5-0" (list (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)) + (make-random-plant (+ depth 1)) (make-random-plant (+ depth 1)))))))) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; how this works @@ -130,95 +135,97 @@ ; logic ; messages passed between the honey-comb logic and the view -(define-struct cell-update (pos code pickup upstream)) +(define-struct cell-update (pos code pickup upstream type)) (define-struct insect-update (id pos dir t)) (define-struct absorb-event (cell-pos type)) -(define-struct plant-update (id desc pos)) +(define-struct plant-update (id desc pos type)) (define comb-cell% - (class object% - (field - (id #f) ; id of the owner plant - (pos '()) - (neighbours '(#f #f #f #f #f #f)) - (pickup #f) - (connections '(#f #f #f #f #f #f)) - (visible #f) - (update-me #f) - (upstream #f)) ; the cell we are connected to (if we are) - - (define/public (get-id) - id) - - (define/public (set-id! s) - (set! id s)) - - (define/public (update-me?) - (let ((r update-me)) - (set! update-me #f) - r)) - - (define/public (get-upstream) - upstream) - - (define/public (set-visible! s) - (set! update-me #t) - (set! visible s)) - - (define/public (visible?) - visible) - - (define/public (get-pos) - pos) - - (define/public (set-pos! s) - (set! pos s)) - - (define/public (get-neighbours) - neighbours) - - (define/public (get-neighbour d) - (list-ref neighbours d)) - - (define/public (set-neighbour! d n) - (set! neighbours (insert neighbours d n 0))) - - (define/public (get-pickup) - pickup) - - (define/public (set-pickup! s) - (when visible (set! update-me #t)) - (set! pickup s)) - - (define/public (get-connections) - connections) - - (define/public (no-connections?) - (equal? connections (list #f #f #f #f #f #f))) - - (define/public (set-connection! d n) - (set! update-me #t) - (set! visible #t) - (set! connections (insert connections d n 0)) - ; tell all our neighbours to become visible - (for-each - (lambda (n) - (when n (send n set-visible! #t))) - neighbours)) - - (define/public (get-connection d) - (list-ref connections d)) - - (define/public (get-connection-num) - (bool-list->num connections 0 0)) - - ; returns the first attachable neighbour found, and sets it's connection - (define (search/attach-to-neighbour l dirs) - (cond + (class object% + (field + (plant #f) ; the owner plant + (pos '()) + (neighbours '(#f #f #f #f #f #f)) + (pickup #f) + (connections '(#f #f #f #f #f #f)) + (visible #f) + (update-me #f) + (upstream #f)) ; the cell we are connected to (if we are) + + (define/public (get-plant) + plant) + + (define/public (set-plant! s) + (set! plant s)) + + (define/public (update-me?) + (let ((r update-me)) + (set! update-me #f) + r)) + + (define/public (get-upstream) + upstream) + + (define/public (set-visible! s) + (set! update-me #t) + (set! visible s)) + + (define/public (visible?) + visible) + + (define/public (get-pos) + pos) + + (define/public (set-pos! s) + (set! pos s)) + + (define/public (get-neighbours) + neighbours) + + (define/public (get-neighbour d) + (list-ref neighbours d)) + + (define/public (set-neighbour! d n) + (set! neighbours (insert neighbours d n 0))) + + (define/public (get-pickup) + pickup) + + (define/public (set-pickup! s) + (when visible (set! update-me #t)) + (set! pickup s)) + + (define/public (get-connections) + connections) + + (define/public (no-connections?) + (equal? connections (list #f #f #f #f #f #f))) + + (define/public (set-connection! d n) + (set! update-me #t) + (set! visible #t) + (set! connections (insert connections d n 0)) + ; tell all our neighbours to become visible + (for-each + (lambda (n) + (when n + (send n set-visible! #t) + (send n set-plant! plant))) + neighbours)) + + (define/public (get-connection d) + (list-ref connections d)) + + (define/public (get-connection-num) + (bool-list->num connections 0 0)) + + ; returns the first attachable neighbour found, and sets it's connection + (define (search/attach-to-neighbour l dirs) + (cond ((null? l) dirs) ((not (send (get-neighbour (car l)) no-connections?)) (send (get-neighbour (car l)) set-connection! (rdirection (car l)) #t) - (send (get-neighbour (car l)) set-id! id) + (set! plant (send (get-neighbour (car l)) get-plant)) (set! upstream (get-neighbour (car l))) #;(search/attach-to-neighbour (cdr l) (cons (car l) dirs)) (car l)) @@ -277,7 +284,8 @@ (define plant% (class object% (init-field - (id "default") + (id "none") + (type "none") (pos '())) ; the seed position (field @@ -287,6 +295,9 @@ (define/public (get-id) id) + (define/public (get-type) + type) + (define/public (update-me?) (let ((r update-me)) (set! update-me #f) @@ -320,7 +331,8 @@ (if (send (cadr plant) update-me?) (cons (make-plant-update (car plant) (send (cadr plant) get-desc) - (send (cadr plant) get-pos)) r) + (send (cadr plant) get-pos) + (send (cadr plant) get-type)) r) r)) '() plants)) @@ -377,12 +389,13 @@ (send cell set-neighbour! SW (get-cell (if (odd? y) x (- x 1)) (+ y 1)))))))) - (define/public (seed id x y) - (send garden add-plant (make-object plant% id (list x y))) - (send (get-cell x y) set-connection! SE #t) - (send (get-cell x y) set-id! id) - (send (get-cell x (+ y 1)) set-connection! NW #t) - (send (get-cell x (+ y 1)) set-id! id)) + (define/public (seed id type x y) + (let ((plant (make-object plant% id type (list x y)))) + (send garden add-plant plant) + (send (get-cell x y) set-plant! plant) + (send (get-cell x y) set-connection! SE #t) + (send (get-cell x (+ y 1)) set-plant! plant) + (send (get-cell x (+ y 1)) set-connection! NW #t))) (define/public (update time delta) @@ -405,14 +418,17 @@ (if l (cons l r) r))) '() insects) + (foldl - (lambda (cell r) - (if (send cell update-me?) - (let ((upstream (send cell get-upstream))) - (cons (make-cell-update (send cell get-pos) - (send cell get-connection-num) + (lambda (cell r) + (if (send cell update-me?) + (let ((upstream (send cell get-upstream)) + (plant (send cell get-plant))) + (cons (make-cell-update (send cell get-pos) + (send cell get-connection-num) (send cell get-pickup) - (if upstream (send upstream get-pos) #f)) r)) + (if upstream (send upstream get-pos) #f) + (if plant (send plant get-type) #f)) r)) r)) '() cells) @@ -432,7 +448,7 @@ (vmul (vector (sin (* a d)) (cos (* a d)) 0) -1))) -(define (build-ngon n) +#;(define (build-ngon n) (let ((p (build-polygons n 'polygon))) (with-primitive p (pdata-index-map! @@ -577,14 +593,14 @@ (define connection-cache '()) -(define (get-connection-list id) - (let ((ret (assoc id connection-cache))) +(define (get-connection-list id type) + (let ((ret (assoc (list id type) connection-cache))) (cond (ret (cdr ret)) (else - (let* ((tex (load-primitive (string-append "textures/comp-cp-" id ".png"))) + (let* ((tex (load-primitive (string-append "plants/" type "/branches/comp-cp-" id ".png"))) (connections (with-primitive tex (convert-to-pos (find-centroids 0 '()))))) - (set! connection-cache (cons (cons id connections) connection-cache)) + (set! connection-cache (cons (cons (list id type) connections) connection-cache)) ;(printf "~a:~a~n" id (length connections)) (destroy tex) connections))))) @@ -595,25 +611,27 @@ (define-struct component (root (col #:mutable) children)) -(define (build-component id col children) +(define (build-component id type col children) (cond ((null? children) (let ((root (with-state (translate (vector 0 0.5 (* 0.01 (rndf)))) + (colour col) (hint-none) (hint-solid) (hint-unlit) (hint-depth-sort) - (texture (load-texture (string-append "textures/comp-" id ".png"))) + (texture (load-texture (string-append "plants/" type "/leaves/comp-" id ".png"))) (build-plane)))) (make-component root col '()))) (else - (let ((connection-list (get-connection-list id)) + (let ((connection-list (get-connection-list id type)) (root (with-state + (colour col) (hint-depth-sort) (translate (vector 0 0.5 (* 0.01 (rndf)))) ; (rotate (vector 0 0 90)) - (texture (load-texture (string-append "textures/comp-" id ".png"))) + (texture (load-texture (string-append "plants/" type "/branches/comp-" id ".png"))) (build-plane)))) (when (not (eq? (length connection-list) (length children))) (printf "something wrong: ~a children:~a connections:~a~n" id (length children) (length connection-list) )) @@ -627,7 +645,7 @@ (rotate (vector 0 0 (2dvec->angle (vx connection) (- (vy connection) 0.5)))) (rotate (vector 0 0 0)) - (build-component (car child) col (cadr child)))) + (build-component (car child) type col (cadr child)))) children connection-list)))) (with-primitive root (apply-transform)) @@ -663,6 +681,7 @@ (t 0) (pos '(0 0)) (owner 0) + (type #f) ; the plant type of the owner of the roots, if any (upstream-pos '())) (define/public (get-upstream-pos) @@ -685,6 +704,9 @@ (define/public (set-pos! s) (set! pos s)) + + (define/public (set-type! s) + (set! type s)) (define (build-prim code) (let ((p (with-state @@ -714,13 +736,16 @@ (set! tile2 (build-prim code))) (define (update-texture code) - (texture (load-texture (string-append texpath "roots-ornate.png"))) - (pdata-map! - (lambda (t tref) - (let ((size (/ 1 8))) - (vadd (vmul tref size) (vector (* 1 size (+ 1 (modulo code 8))) - (* size 1 (+ 1 (quotient code 8))) 0)))) - "t" "tref")) + ; todo: variations + (when type + (texture (load-texture (string-append "plants/" type "/roots/roots.png"))) + (colour (type->colour type))) + (pdata-map! + (lambda (t tref) + (let ((size (/ 1 8))) + (vadd (vmul tref size) (vector (* 1 size (+ 1 (modulo code 8))) + (* size 1 (+ 1 (quotient code 8))) 0)))) + "t" "tref")) (define/public (new-code code) (when (not (zero? tile2)) @@ -956,7 +981,7 @@ (root 0) (desc '())) - (define/public (build s) + (define/public (build s type) (set! desc s) (when (not (zero? root)) @@ -969,7 +994,7 @@ (parent root) (hint-depth-sort) (translate (vector 0.2 0.3 0.3)) - (build-component "1-1" (vector 1 1 1) (list desc)))) + (build-component "1-0" type (type->colour type) (list desc)))) (super-new))) @@ -981,11 +1006,11 @@ (field (plants '())) - (define/public (add-plant! id desc hex) + (define/public (add-plant! id desc hex type) (let ((plant (make-object plant-view%))) (with-state (parent (send hex get-root)) - (send plant build desc) + (send plant build desc type) (set! plants (cons (list id plant) plants))))) (super-new))) @@ -1050,7 +1075,7 @@ top (- len 1) (cons lev l))))) (define/public (build-surface) - (let ((s (make-surface 12 13 20 '()))) + (let ((s (make-surface 10 11 20 '()))) (for ((i (in-range 1 (- (length s) 1)))) (let ((x i) (y (list-ref s i)) (yb (list-ref s (- i 1))) @@ -1110,11 +1135,13 @@ (s (send (cadr s) new-code code) (send (cadr s) set-pickup! (cell-update-pickup item)) - (send (cadr s) set-upstream-pos! (cell-update-upstream item))) + (send (cadr s) set-upstream-pos! (cell-update-upstream item)) + (send (cadr s) set-type! (cell-update-type item))) (else (let ((cell (make-object cell-view%))) (send cell set-pos! pos) (send cell set-owner! root) + (send cell set-type! (cell-update-type item)) (send cell build code) (set! cells (cons (list pos cell) cells))))))) ((insect-update? item) @@ -1135,7 +1162,8 @@ (send garden add-plant! (plant-update-id item) (plant-update-desc item) - (get-cell-from-pos (plant-update-pos item)))))) + (get-cell-from-pos (plant-update-pos item)) + (plant-update-type item))))) update-list)) (super-new))) @@ -1160,7 +1188,9 @@ ; (translate (vector -10 -8.5 0)) (send hcv init)) -(send hc seed "dave@fo.am" 10 10) +(send hc seed "dave@fo.am" "knobbly" 13 10) +(send hc seed "plant00002@fo.am" "lollypop" 6 10) + ;(send (send hc get-cell 50 52) grow) ;(send (send hc get-cell 49 53) grow) @@ -1175,4 +1205,6 @@ (send (send hc get-cell (car clicked) (cadr clicked)) grow))) (send hcv update (send hc update t d) t d)) + +;(for ((i (in-range 0 10))) (animate)) (every-frame (animate)) diff --git a/hex-ornament/textures/comp-1-1.png b/hex-ornament/plants/knobbly/branches/comp-1-0.png similarity index 100% rename from hex-ornament/textures/comp-1-1.png rename to hex-ornament/plants/knobbly/branches/comp-1-0.png diff --git a/hex-ornament/textures/comp-2-1.png b/hex-ornament/plants/knobbly/branches/comp-2-0.png similarity index 100% rename from hex-ornament/textures/comp-2-1.png rename to hex-ornament/plants/knobbly/branches/comp-2-0.png diff --git a/hex-ornament/textures/comp-3-1.png b/hex-ornament/plants/knobbly/branches/comp-3-0.png similarity index 100% rename from hex-ornament/textures/comp-3-1.png rename to hex-ornament/plants/knobbly/branches/comp-3-0.png diff --git a/hex-ornament/textures/comp-3-2.png b/hex-ornament/plants/knobbly/branches/comp-3-1.png similarity index 100% rename from hex-ornament/textures/comp-3-2.png rename to hex-ornament/plants/knobbly/branches/comp-3-1.png diff --git a/hex-ornament/textures/comp-cp-1-1.png b/hex-ornament/plants/knobbly/branches/comp-cp-1-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-1-1.png rename to hex-ornament/plants/knobbly/branches/comp-cp-1-0.png diff --git a/hex-ornament/textures/comp-cp-2-1.png b/hex-ornament/plants/knobbly/branches/comp-cp-2-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-2-1.png rename to hex-ornament/plants/knobbly/branches/comp-cp-2-0.png diff --git a/hex-ornament/textures/comp-cp-3-1.png b/hex-ornament/plants/knobbly/branches/comp-cp-3-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-3-1.png rename to hex-ornament/plants/knobbly/branches/comp-cp-3-0.png diff --git a/hex-ornament/textures/comp-cp-3-2.png b/hex-ornament/plants/knobbly/branches/comp-cp-3-1.png similarity index 100% rename from hex-ornament/textures/comp-cp-3-2.png rename to hex-ornament/plants/knobbly/branches/comp-cp-3-1.png diff --git a/hex-ornament/textures/comp-2.png b/hex-ornament/plants/knobbly/leaves/comp-0.png similarity index 100% rename from hex-ornament/textures/comp-2.png rename to hex-ornament/plants/knobbly/leaves/comp-0.png diff --git a/hex-ornament/textures/comp-3.png b/hex-ornament/plants/knobbly/leaves/comp-1.png similarity index 100% rename from hex-ornament/textures/comp-3.png rename to hex-ornament/plants/knobbly/leaves/comp-1.png diff --git a/hex-ornament/textures/comp-11.png b/hex-ornament/plants/knobbly/leaves/comp-11.png similarity index 100% rename from hex-ornament/textures/comp-11.png rename to hex-ornament/plants/knobbly/leaves/comp-11.png diff --git a/hex-ornament/textures/comp-4.png b/hex-ornament/plants/knobbly/leaves/comp-4.png similarity index 100% rename from hex-ornament/textures/comp-4.png rename to hex-ornament/plants/knobbly/leaves/comp-4.png diff --git a/hex-ornament/textures/comp-5.png b/hex-ornament/plants/knobbly/leaves/comp-5.png similarity index 100% rename from hex-ornament/textures/comp-5.png rename to hex-ornament/plants/knobbly/leaves/comp-5.png diff --git a/hex-ornament/textures/comp-6.png b/hex-ornament/plants/knobbly/leaves/comp-6.png similarity index 100% rename from hex-ornament/textures/comp-6.png rename to hex-ornament/plants/knobbly/leaves/comp-6.png diff --git a/hex-ornament/textures/comp-7.png b/hex-ornament/plants/knobbly/leaves/comp-7.png similarity index 100% rename from hex-ornament/textures/comp-7.png rename to hex-ornament/plants/knobbly/leaves/comp-7.png diff --git a/hex-ornament/textures/comp-8.png b/hex-ornament/plants/knobbly/leaves/comp-8.png similarity index 100% rename from hex-ornament/textures/comp-8.png rename to hex-ornament/plants/knobbly/leaves/comp-8.png diff --git a/hex-ornament/textures/comp-9.png b/hex-ornament/plants/knobbly/leaves/comp-9.png similarity index 100% rename from hex-ornament/textures/comp-9.png rename to hex-ornament/plants/knobbly/leaves/comp-9.png diff --git a/hex-ornament/textures/roots-ornate.png b/hex-ornament/plants/knobbly/roots/roots.png similarity index 100% rename from hex-ornament/textures/roots-ornate.png rename to hex-ornament/plants/knobbly/roots/roots.png diff --git a/hex-ornament/textures/comp-1-0.png b/hex-ornament/plants/lollypop/branches/comp-1-0.png similarity index 100% rename from hex-ornament/textures/comp-1-0.png rename to hex-ornament/plants/lollypop/branches/comp-1-0.png diff --git a/hex-ornament/textures/comp-2-0.png b/hex-ornament/plants/lollypop/branches/comp-2-0.png similarity index 100% rename from hex-ornament/textures/comp-2-0.png rename to hex-ornament/plants/lollypop/branches/comp-2-0.png diff --git a/hex-ornament/textures/comp-3-0.png b/hex-ornament/plants/lollypop/branches/comp-3-0.png similarity index 100% rename from hex-ornament/textures/comp-3-0.png rename to hex-ornament/plants/lollypop/branches/comp-3-0.png diff --git a/hex-ornament/textures/comp-4-0.png b/hex-ornament/plants/lollypop/branches/comp-4-0.png similarity index 100% rename from hex-ornament/textures/comp-4-0.png rename to hex-ornament/plants/lollypop/branches/comp-4-0.png diff --git a/hex-ornament/textures/comp-5-0.png b/hex-ornament/plants/lollypop/branches/comp-5-0.png similarity index 100% rename from hex-ornament/textures/comp-5-0.png rename to hex-ornament/plants/lollypop/branches/comp-5-0.png diff --git a/hex-ornament/textures/comp-cp-1-0.png b/hex-ornament/plants/lollypop/branches/comp-cp-1-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-1-0.png rename to hex-ornament/plants/lollypop/branches/comp-cp-1-0.png diff --git a/hex-ornament/textures/comp-cp-2-0.png b/hex-ornament/plants/lollypop/branches/comp-cp-2-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-2-0.png rename to hex-ornament/plants/lollypop/branches/comp-cp-2-0.png diff --git a/hex-ornament/textures/comp-cp-3-0.png b/hex-ornament/plants/lollypop/branches/comp-cp-3-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-3-0.png rename to hex-ornament/plants/lollypop/branches/comp-cp-3-0.png diff --git a/hex-ornament/textures/comp-cp-4-0.png b/hex-ornament/plants/lollypop/branches/comp-cp-4-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-4-0.png rename to hex-ornament/plants/lollypop/branches/comp-cp-4-0.png diff --git a/hex-ornament/textures/comp-cp-5-0.png b/hex-ornament/plants/lollypop/branches/comp-cp-5-0.png similarity index 100% rename from hex-ornament/textures/comp-cp-5-0.png rename to hex-ornament/plants/lollypop/branches/comp-cp-5-0.png diff --git a/hex-ornament/textures/comp-0.png b/hex-ornament/plants/lollypop/leaves/comp-0.png similarity index 100% rename from hex-ornament/textures/comp-0.png rename to hex-ornament/plants/lollypop/leaves/comp-0.png diff --git a/hex-ornament/textures/comp-1.png b/hex-ornament/plants/lollypop/leaves/comp-1.png similarity index 100% rename from hex-ornament/textures/comp-1.png rename to hex-ornament/plants/lollypop/leaves/comp-1.png diff --git a/hex-ornament/textures/roots.png b/hex-ornament/plants/lollypop/roots/roots.png similarity index 100% rename from hex-ornament/textures/roots.png rename to hex-ornament/plants/lollypop/roots/roots.png diff --git a/hex-ornament/textures/comp-10.png b/hex-ornament/textures/comp-10.png deleted file mode 100644 index e4c2be7e0903341eb5b87d3fcc6a39696e394252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35045 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
$6e+fSw93Tw$RBc%%b} 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