Changeset 1004


Ignore:
Timestamp:
03/01/2011 02:31:03 PM (9 years ago)
Author:
dave
Message:

lots of playablity stuff for pixelache workshop, FAtiMA actions nowdisplayed

Location:
scenarios/GerminationX
Files:
25 edited

Legend:

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

    r987 r1004  
    9393                      <bitmap id="WingTex" import="textures/wing.png"/>                      
    9494 
     95                      <bitmap id="ActionFlowerTex" import="textures/action-flower.png"/>                      
     96                      <bitmap id="ActionDropLeavesTex" import="textures/action-drop-leaves.png"/>                      
     97 
    9598                </library> 
    9699        </frame> 
  • scenarios/GerminationX/fungi/src/Critters.hx

    r988 r1004  
    4646        RightWing.Centre=new Vec2(11,9); 
    4747        LeftWing.AddChild(world,RightWing); 
     48        RightWing.Hide(true); 
     49        LeftWing.Hide(true); 
    4850    } 
    4951 
  • scenarios/GerminationX/fungi/src/Fungi.hx

    r999 r1004  
    6363class Plant extends SpriteEntity  
    6464{ 
     65    public var Id:Int; 
    6566        public var Owner:String; 
    6667        var PlantScale:Float; 
     
    7273    var Layer:String; 
    7374 
    74         public function new(world:World, owner:String, pos, type:String, state:String) 
     75        public function new(world:World, id:Int, owner:String, pos, type:String, state:String, fruit:Bool) 
    7576        { 
    7677                super(world,pos,Resources.Get(type+"-"+state),false); 
     78        Id=id; 
    7779        PlantType=type; 
    7880        State=state; 
     
    107109        Spr.parent.addChild(tf); 
    108110        tf.visible=false; 
    109         Spr.MouseOver(this,function(c) { tf.visible=true; }); 
    110         Spr.MouseOut(this,function(c) { tf.visible=false; }); 
    111         } 
    112  
    113     public function StateUpdate(state,world:World) 
     111        Spr.MouseDown(this,function(c) { tf.visible=!tf.visible; }); 
     112        //Spr.MouseOut(this,function(c) { tf.visible=false; }); 
     113 
     114        if (fruit) Fruit(world); 
     115        } 
     116 
     117    public function StateUpdate(state,fruit,world:World) 
    114118    { 
    115119        State=state; 
     
    118122            Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State)); 
    119123        } 
    120         if (State=="fruit-c" && Seeds.length==0) 
     124        if (fruit && Seeds.length==0) 
    121125        { 
    122126            Fruit(world); 
     127        } 
     128        if (!fruit && Seeds.length!=0) 
     129        { 
     130            // assume only one seed... 
     131            world.RemoveSprite(Seeds[0]); 
     132            Seeds=[];         
    123133        } 
    124134    } 
     
    153163                    p.Seeds.remove(f); 
    154164                    world.RemoveSprite(f); 
     165                    world.Server.Request("pick/"+ 
     166                                         Std.string(cast(world.WorldPos.x,Int))+"/"+ 
     167                                         Std.string(cast(world.WorldPos.y,Int))+"/"+ 
     168                                         Std.string(p.Id), 
     169                                         p, 
     170                                         function (c) {}); 
    155171                } 
    156172            } 
     
    171187    var DesiredPos:Vec2; 
    172188    public var LastData:Array<Dynamic>; 
     189    var Action:Sprite; 
    173190     
    174191        public function new(world:World, name:String, pos) 
     
    177194        Name = name; 
    178195        Speed=0.1; 
    179         UpdateFreq=5; 
     196        UpdateFreq=2; 
    180197        Hide(true); 
    181198        LastData=[]; 
     
    231248            figures.visible=!figures.visible; 
    232249        }); 
     250 
     251        Action = new Sprite(new Vec2(0,0),Resources.Get("")); 
     252        Action.Hide(true); 
     253        c.AddSprite(Action); 
     254 
    233255        } 
    234256 
     
    272294            text+=acs[i].msg+"\n"; 
    273295        } 
     296         
     297        Action.Hide(true); 
     298        if (acs.length>0 && !Hidden) 
     299        { 
     300            if (StringTools.startsWith(acs[0].msg,"flower")) 
     301            { 
     302                Action.ChangeBitmap(Resources.Get("action-flower")); 
     303                Action.Hide(false); 
     304            } 
     305             
     306            if (StringTools.startsWith(acs[0].msg,"drop-leaves")) 
     307            { 
     308                Action.ChangeBitmap(Resources.Get("action-drop-leaves")); 
     309                Action.Hide(false); 
     310            } 
     311        } 
    274312 
    275313        Debug.text=text; 
     
    301339        } 
    302340 
     341        Action.Pos.x=Root.Pos.x-50; 
     342        Action.Pos.y=Root.Pos.y-50; 
     343        Action.Update(0,null); 
     344 
    303345        //Draw(cast(world,truffle.World)); 
    304346        var c=this; 
     347 
     348        var excitement = c.Emotions.Love+c.Emotions.Admiration; 
     349        if (excitement>10) excitement=10; 
     350        var irritation = c.Emotions.Hate+c.Emotions.Distress; 
     351        if (irritation>5) irritation=5; 
     352        var bouncyness = c.Emotions.Gratitude; 
     353        var bounce=new Vec2(0,0); 
     354 
    305355        Root.Recurse(function(b:Bone,depth:Int)  
    306         { 
    307             var excitement = c.Emotions.Love+c.Emotions.Admiration; 
    308             if (excitement>10) excitement=10; 
    309              
    310             b.SetRotate(excitement*5*Math.sin( 
     356        {     
     357            b.SetRotate((excitement*5+1)*Math.sin( 
    311358                             (((10-depth)+frame*0.04+c.Emotions.Gratitude*0.01)+ 
    312359                             c.Emotions.Joy*0.1)) + 
    313             ((world.MyRndGen.RndFlt()-0.5)*10*(c.Emotions.Hate+ 
    314                     c.Emotions.Distress))); 
     360            ((world.MyRndGen.RndFlt()-0.5)*10*irritation)); 
     361            bounce.y=bouncyness*5*Math.abs(Math.sin(frame*0.25)); 
     362            b.SetPos(b.BindPos.Add(bounce)); 
    315363            
    316364        }); 
     
    393441    public var Seeds:SeedStore; 
    394442    var Server : ServerConnection; 
    395  
     443    var TileInfo: flash.text.TextField; 
     444  
    396445        public function new(w:Int, h:Int)  
    397446        { 
     
    411460        MyName = ""; 
    412461 
    413  
    414462        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3")); 
    415463        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); }); 
     
    431479        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); }); 
    432480        arrow4.Spr.MouseOut(this,function(c) { arrow4.Spr.SetScale(new Vec2(1,1)); arrow4.Spr.Update(0,null); }); 
     481 
     482        // move this crap out you stupid copy/paste programmer... 
     483 
     484        // tile info 
     485        TileInfo = new flash.text.TextField(); 
     486        TileInfo.text = "Loading..."; 
     487        TileInfo.x=100; 
     488        TileInfo.y=20; 
     489        TileInfo.height=10; 
     490        TileInfo.width=100; 
     491        TileInfo.background = false; 
     492        TileInfo.autoSize = flash.text.TextFieldAutoSize.LEFT; 
     493        TileInfo.border = true; 
     494        TileInfo.wordWrap = true; 
     495        var t = new flash.text.TextFormat(); 
     496        t.font = "Verdana";  
     497        t.size = 8;                 
     498        t.color= 0x000000;            
     499        TileInfo.setTextFormat(t); 
     500        addChild(TileInfo); 
     501 
     502        // hiscores table 
     503        var tf = new flash.text.TextField(); 
     504        tf.text = "Loading..."; 
     505        tf.x=100; 
     506        tf.y=100; 
     507        tf.height=500; 
     508        tf.width=500; 
     509        tf.background = false; 
     510        tf.autoSize = flash.text.TextFieldAutoSize.LEFT; 
     511        tf.border = true; 
     512        tf.wordWrap = true; 
     513        var t = new flash.text.TextFormat(); 
     514        t.font = "Verdana";  
     515        t.size = 8;                 
     516        t.color= 0x000000;            
     517        tf.setTextFormat(t); 
     518 
     519        var figures:Shape = new Shape(); 
     520        var BG = figures.graphics; 
     521        BG.beginFill(0xffffff,0.5); 
     522        BG.drawRect(tf.x,tf.y,tf.width,tf.height); 
     523        BG.endFill(); 
     524        figures.visible=false; 
     525        cast(this,truffle.flash.FlashWorld).addChild(figures); 
     526 
     527        addChild(tf); 
     528        tf.visible=false; 
     529 
     530        var hiscores = new Sprite(new Vec2(50,50), Resources.Get("")); 
     531        AddSprite(hiscores); 
     532        hiscores.MouseDown(this,function(c) 
     533        { 
     534            tf.visible=!tf.visible; 
     535            figures.visible=!figures.visible; 
     536            if (tf.visible) 
     537            { 
     538                cast(c,FungiWorld).Server.Request("hiscores", 
     539                                 c, 
     540                                 function(c,data:Array<Dynamic>) 
     541                                 { 
     542                                     var text="Hi Scores Table\n Number of plants currently alive, by player.\n\n"; 
     543                                     for (i in data) 
     544                                     { 
     545                                         text+=i[0]+": "+i[1]+"\n"; 
     546                                     } 
     547                                     tf.text=text; 
     548 
     549                                     BG.clear(); 
     550                                     BG.beginFill(0xffffff,0.5); 
     551                                     BG.drawRect(tf.x,tf.y,tf.width,tf.height); 
     552                                     BG.endFill(); 
     553                                 }); 
     554                            
     555            } 
     556        }); 
    433557 
    434558                for (y in 0...h) 
     
    630754            function (c:truffle.World,d) 
    631755            { 
     756                c.TileInfo.text="Season: "+d.season; 
     757 
    632758                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>); 
    633759                for (p in data) 
     
    642768                        { 
    643769                            var pos = new Vec3(p.pos.x,p.pos.y,cube.LogicalPos.z+1);    
    644                             var plant = new Plant(c,p.owner,pos,p.type,p.state); 
     770                            var plant = new Plant(c,Std.parseInt(p.id),p.owner,pos,p.type,p.state,p.fruit); 
    645771                            c.Plants.push(plant); 
    646772                        } 
     
    651777                        //trace(e); 
    652778                        //trace(p.state); 
    653                         cast(e,Plant).StateUpdate(p.state,c); 
     779                        cast(e,Plant).StateUpdate(p.state,p.fruit,c); 
    654780                    } 
    655781                } 
  • scenarios/GerminationX/fungi/src/Resources.hx

    r987 r1004  
    122122 
    123123class WingTex extends BitmapData { public function new() { super(0,0); } } 
     124class ActionDropLeavesTex extends BitmapData { public function new() { super(0,0); } } 
     125class ActionFlowerTex extends BitmapData { public function new() { super(0,0); } } 
    124126 
    125127 
     
    163165        case "rock-cube-06": tex.data = new RockCube06Tex(); 
    164166 
    165         case "plant-001-grow-a": tex.data = new Plant001GrowATex(); 
    166         case "plant-001-grow-b": tex.data = new Plant001GrowBTex(); 
    167         case "plant-001-grow-c": tex.data = new Plant001GrowCTex(); 
    168         case "plant-001-grown": tex.data = new Plant001GrownTex(); 
    169         case "plant-001-ill-a": tex.data = new Plant001IllATex(); 
    170         case "plant-001-ill-b": tex.data = new Plant001IllBTex(); 
    171         case "plant-001-ill-c": tex.data = new Plant001IllCTex(); 
    172         case "plant-001-decay-a": tex.data = new Plant001DecayATex(); 
    173         case "plant-001-decay-b": tex.data = new Plant001DecayBTex(); 
    174         case "plant-001-decay-c": tex.data = new Plant001DecayCTex(); 
    175         case "plant-001-fruit-a": tex.data = new Plant001FruitATex(); 
    176         case "plant-001-fruit-b": tex.data = new Plant001FruitBTex(); 
    177         case "plant-001-fruit-c": tex.data = new Plant001FruitCTex(); 
    178  
    179         case "plant-002-grow-a": tex.data = new Plant002GrowATex(); 
    180         case "plant-002-grow-b": tex.data = new Plant002GrowBTex(); 
    181         case "plant-002-grow-c": tex.data = new Plant002GrowCTex(); 
    182         case "plant-002-grown": tex.data = new Plant002GrownTex(); 
    183         case "plant-002-ill-a": tex.data = new Plant002IllATex(); 
    184         case "plant-002-ill-b": tex.data = new Plant002IllBTex(); 
    185         case "plant-002-ill-c": tex.data = new Plant002IllCTex(); 
    186         case "plant-002-decay-a": tex.data = new Plant002DecayATex(); 
    187         case "plant-002-decay-b": tex.data = new Plant002DecayBTex(); 
    188         case "plant-002-decay-c": tex.data = new Plant002DecayCTex(); 
    189         case "plant-002-fruit-a": tex.data = new Plant002FruitATex(); 
    190         case "plant-002-fruit-b": tex.data = new Plant002FruitBTex(); 
    191         case "plant-002-fruit-c": tex.data = new Plant002FruitCTex(); 
    192  
    193         case "plant-003-grow-a": tex.data = new Plant003GrowATex(); 
    194         case "plant-003-grow-b": tex.data = new Plant003GrowBTex(); 
    195         case "plant-003-grow-c": tex.data = new Plant003GrowCTex(); 
    196         case "plant-003-grown": tex.data = new Plant003GrownTex(); 
    197         case "plant-003-ill-a": tex.data = new Plant003IllATex(); 
    198         case "plant-003-ill-b": tex.data = new Plant003IllBTex(); 
    199         case "plant-003-ill-c": tex.data = new Plant003IllCTex(); 
    200         case "plant-003-decay-a": tex.data = new Plant003DecayATex(); 
    201         case "plant-003-decay-b": tex.data = new Plant003DecayBTex(); 
    202         case "plant-003-decay-c": tex.data = new Plant003DecayCTex(); 
    203         case "plant-003-fruit-a": tex.data = new Plant003FruitATex(); 
    204         case "plant-003-fruit-b": tex.data = new Plant003FruitBTex(); 
    205         case "plant-003-fruit-c": tex.data = new Plant003FruitCTex(); 
     167        case "dandelion-grow-a": tex.data = new Plant001GrowATex(); 
     168        case "dandelion-grow-b": tex.data = new Plant001GrowBTex(); 
     169        case "dandelion-grow-c": tex.data = new Plant001GrowCTex(); 
     170        case "dandelion-grown": tex.data = new Plant001GrownTex(); 
     171        case "dandelion-ill-a": tex.data = new Plant001IllATex(); 
     172        case "dandelion-ill-b": tex.data = new Plant001IllBTex(); 
     173        case "dandelion-ill-c": tex.data = new Plant001IllCTex(); 
     174        case "dandelion-decay-a": tex.data = new Plant001DecayATex(); 
     175        case "dandelion-decay-b": tex.data = new Plant001DecayBTex(); 
     176        case "dandelion-decay-c": tex.data = new Plant001DecayCTex(); 
     177        case "dandelion-fruit-a": tex.data = new Plant001FruitATex(); 
     178        case "dandelion-fruit-b": tex.data = new Plant001FruitBTex(); 
     179        case "dandelion-fruit-c": tex.data = new Plant001FruitCTex(); 
     180 
     181        case "aronia-grow-a": tex.data = new Plant003GrowATex(); 
     182        case "aronia-grow-b": tex.data = new Plant003GrowBTex(); 
     183        case "aronia-grow-c": tex.data = new Plant003GrowCTex(); 
     184        case "aronia-grown": tex.data = new Plant003GrownTex(); 
     185        case "aronia-ill-a": tex.data = new Plant003IllATex(); 
     186        case "aronia-ill-b": tex.data = new Plant003IllBTex(); 
     187        case "aronia-ill-c": tex.data = new Plant003IllCTex(); 
     188        case "aronia-decay-a": tex.data = new Plant003DecayATex(); 
     189        case "aronia-decay-b": tex.data = new Plant003DecayBTex(); 
     190        case "aronia-decay-c": tex.data = new Plant003DecayCTex(); 
     191        case "aronia-fruit-a": tex.data = new Plant003FruitATex(); 
     192        case "aronia-fruit-b": tex.data = new Plant003FruitBTex(); 
     193        case "aronia-fruit-c": tex.data = new Plant003FruitCTex(); 
    206194 
    207195        case "cherry-grow-a": tex.data = new CherryGrowATex(); 
     
    234222 
    235223        case "wing": tex.data = new WingTex(); 
     224        case "action-flower": tex.data = new ActionFlowerTex(); 
     225        case "action-drop-leaves": tex.data = new ActionDropLeavesTex(); 
    236226        } 
    237227 
  • scenarios/GerminationX/fungi/src/truffle/Bone.hx

    r924 r1004  
    2121    public var Parent:Bone; 
    2222    public var Children:List<Bone>; 
     23    public var BindPos:Vec2; 
    2324 
    2425        public function new(pos:Vec2, t:TextureDesc)  
     
    2627        Children = new List<Bone>(); 
    2728        super(pos,t); 
     29        BindPos=pos; 
    2830    } 
    2931 
     
    3335        c.Parent=this; 
    3436        world.AddSprite(c); 
    35     } 
     37     } 
    3638 
    3739    public function GetGlobalPos() : Vec2 
  • scenarios/GerminationX/fungi/src/truffle/SkeletonEntity.hx

    r999 r1004  
    124124        { 
    125125            bones[b].Pos=relative[b].Mul(0.5); 
     126            bones[b].BindPos=bones[b].Pos; 
    126127        } 
    127128    } 
  • scenarios/GerminationX/oak/src/oak/core.clj

    r999 r1004  
    1212   oak.vec2 
    1313   oak.plant 
    14    oak.tile) 
     14   oak.tile 
     15   oak.forms) 
    1516  (:import 
    1617   java.util.concurrent.Executors 
     
    8586                  (make-vec2 (parse-number tilex) (parse-number tiley)) 
    8687                  (make-plant (make-vec2 (parse-number posx) (parse-number posy)) type owner size)))) 
    87        ;(game-world-save (deref my-game-world) state-filename) 
     88       (game-world-save (deref my-game-world) state-filename) 
    8889       ;(println (deref my-game-world)) 
    8990       (json/encode-to-str '("ok"))) 
     91 
     92  (GET "/pick/:tilex/:tiley/:plant-id" [tilex tiley plant-id] 
     93       (dosync 
     94        (ref-set my-game-world 
     95                 (game-world-modify-tile 
     96                  (deref my-game-world) 
     97                  (make-vec2 (parse-number tilex) 
     98                             (parse-number tiley)) 
     99                  (fn [tile] 
     100                    (tile-modify-entity 
     101                     tile 
     102                     (parse-number plant-id) 
     103                     (fn [plant] 
     104                       (modify :fruit (fn [f] false) plant))))))) 
     105       (json/encode-to-str '("ok"))) 
     106 
     107  (GET "/hiscores" [] 
     108       (json/encode-to-str 
     109        (map 
     110         (fn [s] 
     111           (list (first s) (second s))) 
     112         (game-world-hiscores (deref my-game-world))))) 
    90113   
    91114  (GET "/spirit-sprites/:name" [name] 
  • scenarios/GerminationX/oak/src/oak/game_world.clj

    r995 r1004  
    6464   false 
    6565   (:spirits world))) 
    66  
    67 (defn layer->spirit-name [layer] 
    68   (cond 
    69    (= layer "canopy") "CanopySpirit" 
    70    (= layer "vertical") "VerticalSpirit" 
    71    (= layer "cover") "CoverSpirit" 
    72    :else "UnknownSpirit")) 
    7366 
    7467(defn game-world-summon-spirit [world tile-pos entity] 
     
    121114                       (:state plant) (:health plant)))))) 
    122115 
     116; returns the frequency of plants to owners in the world 
     117(defn game-world-hiscores [game-world] 
     118  (let [freq (reduce 
     119              (fn [r tile] 
     120                (reduce 
     121                 (fn [r plant] 
     122                   (let [count (get r (:owner plant))]  
     123                     (if count 
     124                       (merge r {(:owner plant) (+ 1 count)}) 
     125                       (merge r {(:owner plant) 1})))) 
     126                 r 
     127                 (tile-entities tile))) 
     128              '{} 
     129              (game-world-tiles game-world))] 
     130    ; sort by values so highest is first 
     131    (into (sorted-map-by 
     132           (fn [key1 key2] 
     133             (compare (get freq key2) (get freq key1)))) 
     134          freq))) 
     135     
    123136(defn game-world-update [game-world time delta] 
    124137  (let [rules (load-companion-rules "rules.txt")] 
  • scenarios/GerminationX/oak/src/oak/plant.clj

    r1002 r1004  
    2020   clojure.contrib.math)) 
    2121 
    22 (def season-length (* 60 10)) 
     22(def season-length (* 60 5)) 
    2323(def min-health 10) 
    2424(def max-health 90) 
     
    3838   timer 
    3939   tick 
    40    health]) 
     40   health 
     41   fruit]) 
    4142   
    4243(defn plant-pos [plant] (:pos plant)) 
     
    5051(defn plant-type->layer [type] 
    5152  (cond 
    52    (= type "plant-001") "cover" 
    53    (= type "plant-002") "canopy" 
    54    (= type "plant-003") "vertical" 
     53   (= type "dandelion") "cover" 
     54   (= type "aronia") "vertical" 
    5555   (= type "apple") "canopy" 
    5656   (= type "cherry") "canopy")) 
     
    6666   (= type "plant-001") 3 ; temp dandelion 
    6767   (= type "clover") 4)) 
    68    
     68 
     69(defn layer->spirit-name [layer] 
     70  (cond 
     71   (= layer "canopy") "CanopySpirit" 
     72   (= layer "vertical") "VerticalSpirit" 
     73   (= layer "cover") "CoverSpirit" 
     74   :else "UnknownSpirit")) 
     75 
    6976(defn make-plant [pos type owner size] 
    7077  (plant. (generate-id) pos type (plant-type->layer type) 
    71           'grow-a '() owner size 0 (+ (/ season-length 10) (Math/floor (rand 10))) start-health)) 
     78          'grow-a '() owner size 0 (+ (/ season-length 50) (Math/floor (rand 10))) start-health false)) 
    7279 
    7380(defn make-random-plant [] 
    74   (make-plant 
    75    (make-vec2 (Math/floor (rand 15)) (Math/floor (rand 15))) 
    76    (rand-nth (list "plant-001" "plant-002" "plant-003" "apple" "cherry")) 
    77    "the garden" 
    78    (Math/round (+ 1 (rand 10))))) 
     81  (let [type (rand-nth (list "aronia" "dandelion" "apple" "cherry"))] 
     82    (make-plant 
     83     (make-vec2 (Math/floor (rand 15)) (Math/floor (rand 15))) 
     84     type 
     85     (layer->spirit-name (plant-type->layer type)) 
     86     (Math/round (+ 1 (rand 10)))))) 
    7987 
    8088; the plant state machine, advance state, based on health 
     
    126134                            neighbours))))) 
    127135   (modify 
    128     :timer 
    129     (fn [timer] 
    130       (+ timer delta)) 
    131     (if (> (:timer plant) (:tick plant)) 
    132       (modify 
    133        :state 
    134        (fn [state] (adv-state state 
    135                               (:health plant) 
    136                               season)) 
     136    :fruit 
     137    (fn [f] 
     138      (if (and (not f) (= (:state plant) 'fruit-c)) 
     139        true f)) 
     140    (modify 
     141     :timer 
     142     (fn [timer] 
     143       (+ timer delta)) 
     144     (if (> (:timer plant) (:tick plant)) 
    137145       (modify 
    138         :timer (fn [t] 0) plant)) 
    139       plant)))) 
     146        :state 
     147        (fn [state] (adv-state state 
     148                               (:health plant) 
     149                               season)) 
     150        (modify 
     151         :timer (fn [t] 0) plant)) 
     152       plant))))) 
    140153 
  • scenarios/GerminationX/oak/src/oak/tile.clj

    r999 r1004  
    5252   (:entities tile))) 
    5353 
     54(defn tile-modify-entity [tile id f] 
     55  (modify 
     56   :entities 
     57   (fn [entities] 
     58     (map 
     59      (fn [e] 
     60        (if (= id (:id e)) 
     61          (f e) e)) 
     62      entities)) 
     63   tile)) 
     64 
    5465(defn tile-get-neighbours [tile pos] 
    5566  (reduce 
Note: See TracChangeset for help on using the changeset viewer.