Changeset 871


Ignore:
Timestamp:
01/24/2011 11:29:24 AM (8 years ago)
Author:
dave
Message:

basic alife in

Location:
scenarios/GerminationX
Files:
19 added
9 edited

Legend:

Unmodified
Added
Removed
  • scenarios/GerminationX/fungi/resources.xml

    r864 r871  
    5353                      <bitmap id="Arr4Tex" import="textures/arr4.png"/>                      
    5454 
     55                      <bitmap id="Plant000GrowATex" import="textures/grow-a.png"/>                      
     56                      <bitmap id="Plant000GrowBTex" import="textures/grow-b.png"/>                      
     57                      <bitmap id="Plant000GrowCTex" import="textures/grow-c.png"/>                      
     58                      <bitmap id="Plant000GrownTex" import="textures/grown.png"/>                      
     59                      <bitmap id="Plant000DecayATex" import="textures/decay-a.png"/>                      
     60                      <bitmap id="Plant000DecayBTex" import="textures/decay-b.png"/>                      
     61                      <bitmap id="Plant000DecayCTex" import="textures/decay-c.png"/>                      
     62                      <bitmap id="Plant000IllATex" import="textures/ill-a.png"/>                      
     63                      <bitmap id="Plant000IllBTex" import="textures/ill-b.png"/>                      
     64                      <bitmap id="Plant000IllCTex" import="textures/ill-c.png"/>                      
     65                      <bitmap id="Plant000FruitATex" import="textures/fruit-a.png"/>                      
     66                      <bitmap id="Plant000FruitBTex" import="textures/fruit-b.png"/>                      
     67                      <bitmap id="Plant000FruitCTex" import="textures/fruit-c.png"/>                      
     68 
     69 
    5570                </library> 
    5671        </frame> 
  • scenarios/GerminationX/fungi/src/Fungi.hx

    r864 r871  
    6060    var Scale:Float; 
    6161    var PlantType:String; 
     62    var State:String; 
    6263    var Seeds:Array<Sprite>; 
    6364 
    64         public function new(world:World, owner:String, pos, type, maxsize, scale) 
    65         { 
    66                 super(world,pos,Resources.Get(type),false); 
     65        public function new(world:World, owner:String, pos, type:String, state:String) 
     66        { 
     67                super(world,pos,Resources.Get(type+"-"+state),false); 
    6768        PlantType=type; 
     69        State=state; 
    6870                Owner=owner; 
    6971        PlantScale=0; 
    70         Scale=maxsize; 
    7172        NeedsUpdate=true; 
    7273        Seeds=[]; 
    7374 
    74         if (scale) 
    75         { 
    76                     PlantScale=0; 
    77             Spr.SetScale(new Vec2(0,0)); 
    78         } 
    79         else 
    80         { 
    81             Spr.SetScale(new Vec2(Scale,Scale)); 
    82             Age=100; 
    83         } 
    84          
    8575        Spr.Hide(false); 
    8676         
     
    10191        } 
    10292 
     93    function StateUpdate(state) 
     94    { 
     95        State=state; 
     96        Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State)); 
     97    } 
     98 
    10399    override function Destroy(world:World) 
    104100    { 
     
    113109        { 
    114110                super.Update(frame,world); 
    115         Age++; 
    116                 if (Age<100) 
    117                 { 
    118                         Spr.SetScale(new Vec2((Age/100)*Scale,(Age/100)*Scale)); 
    119                 } 
    120         else 
    121         { 
    122             Fruit(world); 
    123             NeedsUpdate=false; 
    124         } 
    125111        } 
    126112 
     
    475461                    c.SpaceClear(pos) && c.GetCube(pos).LogicalPos.z>-1) 
    476462                { 
    477                     var plant = new Plant(c,p.owner,pos,p.type,p.size/100,false); 
     463                    var plant = new Plant(c,p.owner,pos,p.type,p.state); 
    478464                    c.Plants.push(plant); 
    479465                } 
     
    488474        { 
    489475            var size=MyRndGen.RndFlt()+0.5; 
    490                     var plant = new Plant(this,MyName,pos,type,size,true); 
     476                    var plant = new Plant(this,MyName,pos,"plant-000","grow-a"); 
    491477                    Plants.push(plant); 
    492478            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+ 
     
    559545        Server.Update(); 
    560546 
    561         /*if (time>TickTime) 
    562         { 
    563             WorldClient.Call("agent-info",UpdateGhosts); 
     547        if (time>TickTime) 
     548        { 
     549            //WorldClient.Call("agent-info",UpdateGhosts); 
     550 
     551            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/" 
     552            +Std.string(cast(WorldPos.y,Int)), 
     553            this, 
     554            function (c:truffle.World,d) 
     555            { 
     556                c.ClearPlants(); 
     557                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>); 
     558                for (p in data) 
     559                    { 
     560                        var pos = new Vec3(p.pos.x,p.pos.y,1); 
     561                         
     562                        if (pos.x<10 && pos.y<10 && pos.x>0 && pos.y>0 && 
     563                        c.SpaceClear(pos) && c.GetCube(pos).LogicalPos.z>-1) 
     564                            { 
     565                                var plant = new Plant(c,p.owner,pos,p.type,p.state); 
     566                                c.Plants.push(plant); 
     567                            } 
     568                    } 
     569                c.SortScene(); 
     570            }); 
     571 
     572             
     573             
    564574            TickTime=time+100; 
    565575        } 
    566          
     576        /* 
    567577        for (plant in Plants) 
    568578        { 
  • scenarios/GerminationX/fungi/src/Resources.hx

    r864 r871  
    7070class Arr4Tex extends BitmapData { public function new() { super(0,0); } } 
    7171 
     72class Plant000GrowATex extends BitmapData { public function new() { super(0,0); } } 
     73class Plant000GrowBTex extends BitmapData { public function new() { super(0,0); } } 
     74class Plant000GrowCTex extends BitmapData { public function new() { super(0,0); } } 
     75class Plant000GrownTex extends BitmapData { public function new() { super(0,0); } } 
     76class Plant000DecayATex extends BitmapData { public function new() { super(0,0); } } 
     77class Plant000DecayBTex extends BitmapData { public function new() { super(0,0); } } 
     78class Plant000DecayCTex extends BitmapData { public function new() { super(0,0); } } 
     79class Plant000IllATex extends BitmapData { public function new() { super(0,0); } } 
     80class Plant000IllBTex extends BitmapData { public function new() { super(0,0); } } 
     81class Plant000IllCTex extends BitmapData { public function new() { super(0,0); } } 
     82class Plant000FruitATex extends BitmapData { public function new() { super(0,0); } } 
     83class Plant000FruitBTex extends BitmapData { public function new() { super(0,0); } } 
     84class Plant000FruitCTex extends BitmapData { public function new() { super(0,0); } } 
     85 
    7286class Resources 
    7387{ 
     
    125139        case "arr4": tex.data = new Arr4Tex(); 
    126140 
     141        case "plant-000-grow-a": tex.data = new Plant000GrowATex(); 
     142        case "plant-000-grow-b": tex.data = new Plant000GrowBTex(); 
     143        case "plant-000-grow-c": tex.data = new Plant000GrowCTex(); 
     144        case "plant-000-grown": tex.data = new Plant000GrownTex(); 
     145        case "plant-000-ill-a": tex.data = new Plant000IllATex(); 
     146        case "plant-000-ill-b": tex.data = new Plant000IllBTex(); 
     147        case "plant-000-ill-c": tex.data = new Plant000IllCTex(); 
     148        case "plant-000-decay-a": tex.data = new Plant000DecayATex(); 
     149        case "plant-000-decay-b": tex.data = new Plant000DecayBTex(); 
     150        case "plant-000-decay-c": tex.data = new Plant000DecayCTex(); 
     151        case "plant-000-fruit-a": tex.data = new Plant000FruitATex(); 
     152        case "plant-000-fruit-b": tex.data = new Plant000FruitBTex(); 
     153        case "plant-000-fruit-c": tex.data = new Plant000FruitCTex(); 
     154 
    127155        } 
    128156 
  • scenarios/GerminationX/oak/src/oak/core.clj

    r865 r871  
    2727(def state-filename "state.txt") 
    2828(def log-filename "public/log.txt") 
     29(def game-world-tick 1) 
    2930 
    30 (def myworld 
     31(comment (def myworld 
    3132     (ref 
    3233      (make-world 
     
    3637       (list "WiltedVine" 
    3738             "AppleTree")))) 
     39         ) 
    3840 
    3941;(def my-game-world (ref (game-world-load state-filename))) 
    4042(def my-game-world (ref (make-game-world 1000 4))) 
    41 (game-world-print (deref my-game-world)) 
    42 ;(world-crank (deref myworld)) 
    4343 
    4444(append-spit log-filename (str (str (Date.)) " server started\n")) 
     
    7474  (GET "/spirit-sprites" [] 
    7575       (println (read-islands "./public/islands")) 
    76        (read-islands "./public/islands"))      
     76       (read-islands "./public/islands")) 
     77 
     78  (comment 
    7779  (GET "/agent-info" [] 
    7880       (json/encode-to-str (map 
     
    8890       (println (str "adding " obj)) 
    8991       (dosync (ref-set myworld (world-add-object (deref myworld) 
    90                                                   (load-object obj))))) 
     92                                                  (load-object obj)))))) 
    9193   
    9294  (route/not-found "<h1>Page not found</h1>")) 
     
    9496(defn tick [] 
    9597  (Thread/sleep 1000) 
    96   (dosync 
    97    (ref-set myworld 
    98             (world-run (deref myworld)))) 
     98  ;(game-world-print (deref my-game-world)) 
     99  (let [time (.getTime (java.util.Date.))] 
     100    ;(dosync 
     101     ;(ref-set myworld 
     102     ;         (world-run (deref myworld)))) 
     103     (dosync (ref-set my-game-world 
     104              (game-world-update (deref my-game-world) 
     105                                 time 1)))) 
    99106  (recur)) 
    100107   
  • scenarios/GerminationX/oak/src/oak/game_world.clj

    r846 r871  
    1515(ns oak.game-world 
    1616  (:use 
     17   oak.forms 
    1718   oak.vec2 
    1819   oak.plant 
     
    4445 
    4546(defn game-world-modify-tile [game-world pos f] 
    46   (merge 
    47    game-world 
    48    {:tiles 
    49     (map 
    50      (fn [t] 
    51        (if (vec2-eq? (:pos t) pos) (f t) t)) 
    52      (game-world-tiles game-world))})) 
     47  (modify :tiles 
     48          (fn [tiles] 
     49            (map 
     50             (fn [t] 
     51               (if (vec2-eq? (:pos t) pos) (f t) t)) 
     52             tiles)) 
     53          game-world)) 
    5354 
    5455(defn game-world-add-entity [game-world tile-pos entity] 
     
    7879    (println (format "tile %d %d" (:x (tile-pos tile)) (:y (tile-pos tile)))) 
    7980    (doseq [plant (tile-entities tile)] 
    80       (println (format "plant %d %d" (:x (plant-pos plant)) (:y (plant-pos plant))))))) 
    81                                        
     81      (println (format "plant %d %d state: %s health: %d" 
     82                       (:x (:pos plant)) (:y (:pos plant)) 
     83                       (:state plant) (:health plant)))))) 
     84 
     85(defn game-world-update [game-world time delta] 
     86  (modify :tiles 
     87          (fn [tiles] 
     88            (map 
     89             (fn [tile] 
     90               (tile-update tile time delta)) 
     91             tiles)) 
     92          game-world)) 
  • scenarios/GerminationX/oak/src/oak/plant.clj

    r846 r871  
    1515(ns oak.plant 
    1616  (:use 
    17    oak.vec2) 
     17   oak.vec2 
     18   oak.forms) 
    1819  (:require 
    1920   clojure.contrib.math)) 
     21 
     22(def min-health 10) 
     23(def max-health 90) 
     24(def start-health 20) 
     25(def min-neighbours 2) 
     26(def max-neighbours 5) 
    2027 
    2128(defrecord plant 
     
    2633   picked-by 
    2734   owner 
    28    size]) 
    29  
     35   size 
     36   timer 
     37   tick 
     38   health]) 
     39   
    3040(defn plant-pos [plant] (:pos plant)) 
    3141(defn plant-type [plant] (:type plant)) 
     
    3747 
    3848(defn make-plant [pos type owner size] 
    39   (plant. pos type "" "" '() owner size)) 
     49  (plant. pos type "" 'grow-a '() owner size 0 5 start-health)) 
    4050 
    4151(defn make-random-plant [] 
    4252  (make-plant 
    4353   (make-vec2 (Math/round (rand 10)) (Math/round (rand 10))) 
    44    (rand-nth '("plant-001" 
    45                "plant-002" 
    46                "plant-003" 
    47                "plant-004" 
    48                "plant-005" 
    49                "plant-006" 
    50                "plant-007" 
    51                "plant-008")) 
    52    "germination x" 
     54   "plant-000" 
     55   "the garden" 
    5356   (Math/round (+ 50 (rand 100))))) 
     57 
     58; the plant state machine, advance state, based on health 
     59(defn adv-state [state health] 
     60  (cond 
     61   (= state 'grow-a) (cond (> health min-health) 'grow-b :else (rand-nth (list 'grow-a 'grow-b))) 
     62   (= state 'grow-b) (cond (> health min-health) 'grow-c :else (rand-nth (list 'grow-b 'grow-c))) 
     63   (= state 'grow-c) (cond (> health min-health) 'grown :else (rand-nth (list 'grow-c 'grown))) 
     64   (= state 'grown) (cond 
     65           (> health max-health) 'fruit-a 
     66           (< health min-health) 'ill-a 
     67           :else 'grown) 
     68   (= state 'decay-a) (cond (> health max-health) 'decay-a :else 'decay-b) 
     69   (= state 'decay-b) (cond (> health max-health) 'decay-b :else 'decay-c) 
     70   (= state 'decay-c) (cond (> health max-health) 'decay-c :else 'decayed) 
     71   (= state 'fruit-a) 'fruit-b 
     72   (= state 'fruit-b) 'fruit-c 
     73   (= state 'fruit-c) 'grown 
     74   (= state 'ill-a) (cond (< health min-health) 'ill-b 
     75                (> health max-health) 'grown 
     76                :else 'ill-a) 
     77   (= state 'ill-b) (cond (< health min-health) 'ill-c 
     78                (> health max-health) 'ill-a 
     79                :else 'ill-b) 
     80   (= state 'ill-c) (cond (< health min-health) 'decayed 
     81                (> health max-health) 'ill-b 
     82                :else 'ill-c) 
     83   (= state 'decayed) 'decayed)) 
     84 
     85(defn plant-update [plant time delta neighbours] 
     86  (modify 
     87   :health 
     88   (fn [health] 
     89     (cond 
     90      (< (count neighbours) min-neighbours) (max 0 (- health 1)) 
     91      (> (count neighbours) max-neighbours) (max 0 (- health 1)) 
     92      :else (min 100 (+ health 1)))) 
     93   (modify 
     94    :timer 
     95    (fn [timer] 
     96      (+ timer delta)) 
     97    (if (> (:timer plant) (:tick plant)) 
     98      (modify 
     99       :state 
     100       (fn [state] (adv-state state (:health plant))) 
     101       (modify 
     102        :timer (fn [t] 0) plant)) 
     103      plant)))) 
     104 
  • scenarios/GerminationX/oak/src/oak/tile.clj

    r844 r871  
    1616  (:use 
    1717   oak.vec2 
    18    oak.plant)) 
     18   oak.plant 
     19   oak.forms)) 
    1920 
    2021(defrecord tile 
     
    4142    (merge tile {:entities (cons entity (tile-entities tile))}) 
    4243    tile)) 
     44 
     45(defn tile-get-neighbours [tile pos] 
     46  (reduce 
     47   (fn [l e] 
     48     (if (< (vec2-dist (:pos e) pos) 2) 
     49       (cons e l) l)) 
     50   '() 
     51   (:entities tile))) 
     52 
     53(defn tile-update [tile time delta] 
     54  (modify :entities 
     55          (fn [entities] 
     56            (map 
     57             (fn [e] 
     58               ;; todo dispatch on entity type 
     59               (plant-update e time delta (tile-get-neighbours tile (:pos e)))) 
     60             (filter 
     61              (fn [e] 
     62                (not (= (:state e) 'decayed))) 
     63              entities))) 
     64          tile)) 
  • scenarios/GerminationX/oak/src/oak/vec2.clj

    r846 r871  
    1313;; along with this program.  If not, see <http://www.gnu.org/licenses/>. 
    1414 
    15 (ns oak.vec2) 
     15(ns oak.vec2 
     16  (:require clojure.contrib.math)) 
    1617 
    1718(defrecord vec2 [x y]) 
    18  
    19 (defn vec2-x [vec2] (:x vec2)) 
    20 (defn vec2-y [vec2] (:y vec2)) 
    2119 
    2220(defn make-vec2 [x y] 
    2321  (vec2. x y)) 
    2422 
    25 (defn vec2-eq? [vec2 other] 
    26   (and (= (:x vec2) (:x other)) 
    27        (= (:y vec2) (:y other)))) 
     23(defn vec2-add [a b] 
     24  (vec2. (+ (:x a) (:x b)) 
     25         (+ (:y a) (:y b)))) 
     26 
     27(defn vec2-sub [a b] 
     28  (vec2. (- (:x a) (:x b)) 
     29         (- (:y a) (:y b)))) 
     30 
     31(defn vec2-mul [a b] 
     32  (vec2. (* (:x a) b) 
     33         (* (:y a) b))) 
     34 
     35(defn vec2-div [a b] 
     36  (vec2. (/ (:x a) b) 
     37         (/ (:y a) b))) 
     38 
     39(defn vec2-mag [v] 
     40  (Math/sqrt (+ (* (:x v) (:x v)) 
     41                (* (:y v) (:y v))))) 
     42 
     43(defn vec2-dist [a b] 
     44  (vec2-mag (vec2-sub a b))) 
     45 
     46(defn vec2-eq? [a b] 
     47  (and (= (:x a) (:x b)) 
     48       (= (:y a) (:y b)))) 
Note: See TracChangeset for help on using the changeset viewer.