source: scenarios/GerminationX/fungi/src/Fungi.hx @ 1004

Revision 1004, 23.3 KB checked in by dave, 10 years ago (diff)

lots of playablity stuff for pixelache workshop, FAtiMA actions nowdisplayed

Line 
1// GerminationX Copyright (C) 2010 FoAM vzw    \_\ __     /\
2//                                          /\    /_/    / / 
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU Affero General Public License as
5// published by the Free Software Foundation, either version 3 of the
6// License, or (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11// GNU Affero General Public License for more details.
12//
13// You should have received a copy of the GNU Affero General Public License
14// along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16import haxe.Log;
17
18import truffle.Truffle;
19import truffle.interfaces.Key;
20
21import truffle.Vec3;
22import truffle.Vec2;
23import truffle.RndGen;
24import truffle.Circle;
25import truffle.Entity;
26import truffle.SpriteEntity;
27import truffle.SkeletonEntity;
28import truffle.Bone;
29
30import Critters;
31
32// todo: remove this
33import flash.display.Graphics;
34import flash.display.Shape;
35
36 
37//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
39class Cube extends SpriteEntity
40{       
41        public function new(world:World, pos:Vec3)
42        {
43                super(world, pos, Resources.Get("blue-cube"));
44        }
45       
46        public function UpdateTex(rnd:RndGen)
47        {
48                if (LogicalPos.z%2==0)
49        {
50            Spr.ChangeBitmap(Resources.Get(
51                rnd.Choose(["rock-cube-01","rock-cube-02","rock-cube-03"])));
52                }
53                else
54                {
55            Spr.ChangeBitmap(Resources.Get(
56                rnd.Choose(["rock-cube-04","rock-cube-05","rock-cube-06"])));
57        }
58        }
59}
60
61//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62
63class Plant extends SpriteEntity
64{
65    public var Id:Int;
66        public var Owner:String;
67        var PlantScale:Float;
68        public var Age:Int;
69    var Scale:Float;
70    var PlantType:String;
71    var State:String;
72    var Seeds:Array<Sprite>;
73    var Layer:String;
74
75        public function new(world:World, id:Int, owner:String, pos, type:String, state:String, fruit:Bool)
76        {
77                super(world,pos,Resources.Get(type+"-"+state),false);
78        Id=id;
79        PlantType=type;
80        State=state;
81                Owner=owner;
82        PlantScale=0;
83        //NeedsUpdate=true;
84        Seeds=[];
85
86        Layer="none";
87        if (type=="plant-001") Layer="cover";
88        if (type=="plant-002") Layer="canopy";
89        if (type=="plant-003") Layer="vertical";
90
91        Spr.Hide(false);
92       
93        var tf = new flash.text.TextField();
94        tf.text = "This plant belongs to the "+type+" species, part of the "+
95            Layer+" layer. "+Owner+" planted this.";
96        tf.x=Spr.Pos.x-50;
97        tf.y=Spr.Pos.y-30-Spr.Height*Spr.MyScale.y;
98        tf.height=40;
99        tf.background = true;
100        //tf.backgroundColor = 0x8dd788;
101        tf.border = true;
102        tf.wordWrap = true;
103        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
104        var t = new flash.text.TextFormat();
105        t.font = "Verdana";
106        t.size = 8;               
107        t.color= 0x000000;           
108        tf.setTextFormat(t);
109        Spr.parent.addChild(tf);
110        tf.visible=false;
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)
118    {
119        State=state;
120        if (State!="decayed")
121        {
122            Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State));
123        }
124        if (fruit && Seeds.length==0)
125        {
126            Fruit(world);
127        }
128        if (!fruit && Seeds.length!=0)
129        {
130            // assume only one seed...
131            world.RemoveSprite(Seeds[0]);
132            Seeds=[];       
133        }
134    }
135
136    override function Destroy(world:World)
137    {
138        super.Destroy(world);
139        for (seed in Seeds)
140        {
141            world.RemoveSprite(seed);
142        }
143    }
144       
145        public override function Update(frame:Int, world:World)
146        {
147                super.Update(frame,world);
148        }
149
150    public function Fruit(world:World)
151    {
152        var f=new Sprite(Spr.Pos.Add(new Vec2(0,-Spr.Height/2)),
153                         Resources.Get("seed"));
154        world.AddSprite(f);
155        Seeds.push(f);
156        f.MouseDown(this,function(p)
157        {           
158            if (world.MyName!="")
159            {
160                var s=new Seed(p.PlantType);
161                if (world.Seeds.Add(world,s))
162                {
163                    p.Seeds.remove(f);
164                    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) {});
171                }
172            }
173        });
174    }
175}
176
177//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
178
179class Spirit extends SkeletonEntity
180{
181    public var Name:String;
182
183    var Debug:flash.text.TextField;
184        var BG:Graphics;
185    var RawEmotions:Dynamic;
186    var Emotions:Dynamic;
187    var DesiredPos:Vec2;
188    public var LastData:Array<Dynamic>;
189    var Action:Sprite;
190   
191        public function new(world:World, name:String, pos)
192        {
193                super(world,pos);
194        Name = name;
195        Speed=0.1;
196        UpdateFreq=2;
197        Hide(true);
198        LastData=[];
199        DesiredPos=new Vec2(LogicalPos.x,LogicalPos.y);
200        RawEmotions={Love:0,Hate:0,Hope:0,Fear:0,Satisfaction:0,
201                     Relief:0,/*Fears_Confirmed:0,*/Disappointment:0,
202                     Joy:0,Distress:0,/*Happy_For:0,*/Pitty:0,
203                     Resentment:0,Gloating:0,Pride:0,Shame:0,
204                     Gratification:0,Remorse:0,Admiration:0,
205                     Reproach:0,Gratitude:0,Anger:0};
206        Emotions={Love:0,Hate:0,Hope:0,Fear:0,Satisfaction:0,
207                  Relief:0,/*Fears_Confirmed:0,*/Disappointment:0,
208                  Joy:0,Distress:0,/*Happy_For:0,*/Pitty:0,
209                  Resentment:0,Gloating:0,Pride:0,Shame:0,
210                  Gratification:0,Remorse:0,Admiration:0,
211                  Reproach:0,Gratitude:0,Anger:0};
212    }
213
214        public function BuildDebug(c)
215    {
216        var tf = new flash.text.TextField();
217        tf.text = "nowt yet.";
218        tf.x=Pos.x-150;
219        tf.y=Pos.y-25;
220        tf.height=150;
221        tf.width=140;
222        tf.background = false;
223        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
224        //tf.backgroundColor = 0x8dd788;
225        tf.border = true;
226        tf.wordWrap = true;
227        var t = new flash.text.TextFormat();
228        t.font = "Verdana";
229        t.size = 8;               
230        t.color= 0x000000;           
231        tf.setTextFormat(t);
232
233        var figures:Shape = new Shape();
234        BG = figures.graphics;
235        BG.beginFill(0xffffff,0.5);
236        BG.drawRect(tf.x,tf.y,tf.width,tf.height);
237        BG.endFill();
238        figures.visible=false;
239        cast(c,truffle.flash.FlashWorld).addChild(figures);
240
241        c.addChild(tf);
242        Debug=tf;
243        tf.visible=false;
244
245        Root.MouseDown(c,function(c)
246        {
247            tf.visible=!tf.visible;
248            figures.visible=!figures.visible;
249        });
250
251        Action = new Sprite(new Vec2(0,0),Resources.Get(""));
252        Action.Hide(true);
253        c.AddSprite(Action);
254
255        }
256
257    public function UpdateEmotions(e:Dynamic,world:World)
258    {
259        SetTilePos(new Vec2(Std.parseInt(e.tile.x),
260                            Std.parseInt(e.tile.y)));
261
262       
263        var dst = new Vec2(Std.parseInt(e.emotionalloc.x),
264                              Std.parseInt(e.emotionalloc.y));
265
266        if (dst.x!=DesiredPos.x || dst.y!=DesiredPos.y)
267        {
268            DesiredPos = dst;
269            while (world.Get("Spirit",dst)!=null)
270            {
271                dst = dst.Add(new Vec2(world.MyRndGen.Choose([-2,0,2]),
272                                       world.MyRndGen.Choose([-2,0,2])));
273            }
274            LogicalPos = new Vec3(dst.x,dst.y,4);
275        }
276
277        RawEmotions = e.emotions;
278
279        var ee = e.fatemotions.content;
280        var mood=Std.parseFloat(ee[0].content[0]);
281
282        var text=Name+"\nMood:"+ee[0].content[0]+"\n";
283        text+="Emotions:\n";
284        for (i in 1...ee.length)
285        {
286            text+=ee[i].attrs.type+" "+ee[i].attrs.direction+"\n";
287            //text+=ee[i].attrs.cause+"\n";
288        }
289
290        text+="Actions:\n";
291        var acs = cast(e.fatactions,Array<Dynamic>);
292        for (i in 0...acs.length)
293        {
294            text+=acs[i].msg+"\n";
295        }
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        }
312
313        Debug.text=text;
314
315        var t = new flash.text.TextFormat();
316        t.font = "Verdana";
317        t.size = 8;               
318        t.color= 0x000000;           
319        Debug.setTextFormat(t);
320        Debug.x=Pos.x-150;
321        Debug.y=Pos.y-25;
322
323        BG.clear();
324        BG.beginFill(0xffffff,0.5);
325        BG.drawRect(Debug.x,Debug.y,Debug.width,Debug.height);
326        BG.endFill();
327
328        //trace(text);
329    }
330
331    override function Update(frame:Int, world:World)
332    {
333        for (f in Reflect.fields(Emotions))
334        {
335            // do a linear blend to smooth out changes in emotions
336            Reflect.setField(Emotions,f,
337            Reflect.field(Emotions,f)*0.95+Reflect.field(RawEmotions,f)*0.05);
338            //trace(f);
339        }
340
341        Action.Pos.x=Root.Pos.x-50;
342        Action.Pos.y=Root.Pos.y-50;
343        Action.Update(0,null);
344
345        //Draw(cast(world,truffle.World));
346        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
355        Root.Recurse(function(b:Bone,depth:Int)
356        {   
357            b.SetRotate((excitement*5+1)*Math.sin(
358                             (((10-depth)+frame*0.04+c.Emotions.Gratitude*0.01)+
359                             c.Emotions.Joy*0.1)) +
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));
363           
364        });
365
366        super.Update(frame,world);
367    }
368}
369
370//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
371
372class Seed
373{
374    public var Type:String;
375    public var Spr:Sprite;
376
377    public function new(t:String)
378    {
379        Type=t;
380        Spr=new Sprite(new Vec2(0,0),Resources.Get("seed"));
381    }
382}
383
384class SeedStore
385{
386    var Seeds:Array<Seed>;
387    var Size:Int;
388
389    public function new(size:Int)
390    {
391        Seeds = [];
392        Size = size;
393    }
394
395    public function Add(world:World,s:Seed) : Bool
396    {
397        if (Seeds.length<Size)
398        {
399            Seeds.push(s);
400            s.Spr.SetPos(new Vec2(20+Seeds.length*10,30));
401            //cast(world,truffle.flash.FlashWorld).addSprite(s.Spr);
402            //trace("did it...");
403            s.Spr.Update(0,null);
404            return true;
405        }
406        return false;
407    }
408
409    public function Remove(world:World) : String
410    {
411        if (Seeds.length>0)
412        {
413            var s = Seeds.pop();
414//            world.RemoveSprite(s.Spr);
415            return s.Type;
416        }
417        else
418        {
419            return "";
420        }
421    }
422}
423
424//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
425
426class FungiWorld extends World
427{
428        public var Width:Int;
429        public var Height:Int;
430        var Objs:Array<Cube>;
431        public var WorldPos:Vec3;
432        var MyRndGen:RndGen;
433        public var MyTextEntry:TextEntry;
434        public var Plants:Array<Plant>;
435    public var TheCritters:Critters;
436        var MyName:String;
437    var Frame:Int;
438    var TickTime:Int;
439    var PerceiveTime:Int;
440    var Spirits:Array<Spirit>;
441    public var Seeds:SeedStore;
442    var Server : ServerConnection;
443    var TileInfo: flash.text.TextField;
444 
445        public function new(w:Int, h:Int)
446        {
447                super();
448                Frame=0;
449        TickTime=0;
450        PerceiveTime=0;
451                Width=w;
452                Height=h;
453                Plants = [];
454        Objs = [];
455        Spirits = [];
456        Seeds = new SeedStore(1);
457                WorldPos = new Vec3(0,0,0);
458                MyRndGen = new RndGen();
459        Server = new ServerConnection();
460        MyName = "";
461
462        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3"));
463        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); });
464        arrow1.Spr.MouseOver(this,function(c) { arrow1.Spr.SetScale(new Vec2(1.1,1.1)); arrow1.Spr.Update(0,null); });
465        arrow1.Spr.MouseOut(this,function(c) { arrow1.Spr.SetScale(new Vec2(1,1)); arrow1.Spr.Update(0,null); });
466 
467        var arrow2=new SpriteEntity(this,new Vec3(10,21,1), Resources.Get("arr4"));
468        arrow2.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,1,0))); });
469        arrow2.Spr.MouseOver(this,function(c) { arrow2.Spr.SetScale(new Vec2(1.1,1.1)); arrow2.Spr.Update(0,null); });
470        arrow2.Spr.MouseOut(this,function(c) { arrow2.Spr.SetScale(new Vec2(1,1)); arrow2.Spr.Update(0,null); });
471 
472        var arrow3=new SpriteEntity(this,new Vec3(-2,7,1), Resources.Get("arr2"));
473        arrow3.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(-1,0,0))); });
474        arrow3.Spr.MouseOver(this,function(c) { arrow3.Spr.SetScale(new Vec2(1.1,1.1)); arrow3.Spr.Update(0,null); });
475        arrow3.Spr.MouseOut(this,function(c) { arrow3.Spr.SetScale(new Vec2(1,1)); arrow3.Spr.Update(0,null); });
476
477        var arrow4=new SpriteEntity(this,new Vec3(20,10,1), Resources.Get("arr1"));
478        arrow4.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(1,0,0))); });
479        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); });
480        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        });
557
558                for (y in 0...h)
559                {
560                        for (x in 0...w)
561                        {
562                                var ob:Cube = new Cube(this,new Vec3(0,0,0));
563             
564                ob.Spr.MouseDown(this,function(c)
565                {
566                    var type=c.Seeds.Remove(cast(c,truffle.World));
567                    if (type!="")
568                    {
569                        c.AddServerPlant(ob.LogicalPos.Add(new Vec3(0,0,1)),type);
570                    }
571                });
572                                Objs.push(ob);
573                        }
574                }
575
576                UpdateWorld(new Vec3(0,0,0));
577               
578                MyTextEntry=new TextEntry(300,10,310,30,NameCallback);
579                addChild(MyTextEntry); 
580
581        TheCritters = new Critters(this,3);
582
583        Update(0);
584        SortScene();
585        var names = ["CanopySpirit","VerticalSpirit","CoverSpirit"];
586        var positions = [new Vec3(0,5,4), new Vec3(7,0,4), new Vec3(2,10,4)];
587
588        for (i in 0...3)
589        {
590            Server.Request("spirit-sprites/"+names[i],
591            this,
592            function (c,data:Array<Dynamic>)
593            {
594                var sp:Spirit = new Spirit(c,names[i],positions[i]);
595                sp.NeedsUpdate=true;
596                sp.LastData=data;
597                sp.Build(c,data);
598                sp.BuildDebug(c);
599                c.SortScene();
600                c.Spirits.push(sp);
601            });
602        }
603        }
604
605    function CompareLists(a:Array<Dynamic>,b:Array<Dynamic>): Bool
606    {
607        if (a.length!=b.length) return false;
608        for (i in 0...a.length)
609        {
610            if (a[i].name!=b[i].name) return false;
611        }
612        return true;
613    }
614
615    public function UpdateSpiritSprites()
616    {
617        for (s in Spirits)
618        {
619            Server.Request("spirit-sprites/"+s.Name,
620            this,
621            function (c,data:Array<Dynamic>)
622            {
623                if (!c.CompareLists(data,s.LastData))
624                {
625                    s.Build(cast(c,World),data);
626                    s.LastData=data;
627                }
628            });
629        }       
630    }
631       
632        public function NameCallback(name)
633        {
634                removeChild(MyTextEntry);
635                MyName=name;
636                //WorldClient.GetPlants(cast(WorldPos.x,Int),cast(WorldPos.y,Int));
637        }
638       
639        public function UpdateWorld(pos:Vec3)
640        {
641                WorldPos=pos;
642        SetCurrentTilePos(new Vec2(pos.x,pos.y));
643               
644                var circles = [];
645        for (x in -1...2)
646                {
647                        for (y in -1...2)
648                        {
649                                MyRndGen.Seed(cast((WorldPos.x+x)+(WorldPos.y+y)*139,Int));
650                                for (i in 0...5)
651                                {
652                                        var pos = new Vec3(MyRndGen.RndFlt()*15+x*15,
653                                       MyRndGen.RndFlt()*15+y*15,
654                                                                           0);           
655                                        circles.push(new Circle(pos, MyRndGen.RndFlt()*4));
656                                }
657                        }
658                }
659               
660               
661                for (i in 0...Objs.length)
662                {
663                        var pos=new Vec3(i%Width,Math.floor(i/Width),-1);
664                        MyRndGen.Seed(cast(WorldPos.x+pos.x+WorldPos.y+pos.y*139,Int));
665                        var inside:Bool=false;
666                        for (c in circles)
667                        {
668                                if (c.Inside(pos)) pos.z=0;
669                        }
670
671                        Objs[i].LogicalPos=pos;
672                        Objs[i].UpdateTex(MyRndGen);
673            Objs[i].Update(0,this);
674                }
675
676        ClearPlants();         
677        }
678
679        public function AddServerPlant(pos:Vec3,type)
680        {       
681        if (MyName!=null && SpaceClear(pos))
682        {
683            var size=MyRndGen.RndFlt()+0.5;
684            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+
685                                         Std.string(cast(WorldPos.y,Int))+"/"+
686                                         Std.string(cast(pos.x,Int))+"/"+
687                                         Std.string(cast(pos.y,Int))+"/"+
688                                         type+"/"+
689                                         MyName+"/"+
690                                         Math.round(size*100),
691            this, function (c,data) {});       
692        }
693        }
694
695    public function ClearPlants() : Void
696    {
697        for (plant in Plants)
698        {
699            Remove(plant);
700        }
701        Plants = [];
702        }
703       
704        public function GetCube(pos:Vec3) : Cube
705        {
706                return Objs[cast(pos.x+pos.y*Width,Int)];
707        }
708               
709    public function SpaceClear(pos:Vec3)
710    {
711        for (plant in Plants)
712        {
713            if (plant.LogicalPos.Eq(pos)) return false;
714        }
715        return true;
716    }
717       
718        override public function Handle(e:Int)
719        {
720        super.Handle(e);
721        Update(0);
722        }
723
724    public function UpdateGhosts(c,t:Dynamic)
725    {
726        for(i in 0...t.length)
727        {
728            for (g in Spirits)
729            {
730                if (g.Name==t[i].name)
731                {
732                    g.UpdateEmotions(t[i],this);
733                }
734            }
735        }
736    }
737
738    override function Update(time:Int)
739    {
740        super.Update(time);
741
742        Server.Update();
743        TheCritters.Update();
744       
745        if (time>TickTime)
746        {
747            UpdateSpiritSprites();
748           
749            Server.Request("spirit-info",this,UpdateGhosts);
750
751            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/"
752            +Std.string(cast(WorldPos.y,Int)),
753            this,
754            function (c:truffle.World,d)
755            {
756                c.TileInfo.text="Season: "+d.season;
757
758                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>);
759                for (p in data)
760                {
761                    var worldpos = new Vec2(p.pos.x,p.pos.y);
762                    var e = c.Get("Plant",worldpos);
763                    if (e==null)
764                    {
765                        //trace("making new plant");
766                        var cube = c.Get("Cube",worldpos);
767                        if (cube!=null)
768                        {
769                            var pos = new Vec3(p.pos.x,p.pos.y,cube.LogicalPos.z+1);   
770                            var plant = new Plant(c,Std.parseInt(p.id),p.owner,pos,p.type,p.state,p.fruit);
771                            c.Plants.push(plant);
772                        }
773                    }
774                    else
775                    {
776                        //trace("updating plant");
777                        //trace(e);
778                        //trace(p.state);
779                        cast(e,Plant).StateUpdate(p.state,p.fruit,c);
780                    }
781                }
782                c.SortScene();
783            });           
784           
785            TickTime=time+100;
786        }
787    }
788
789}
790
791//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
792
793class Fungi extends App
794{
795    public function new()
796        {
797//        Log.setColor(0xFFFFFF);
798        super(new FungiWorld(15,15));
799    }
800       
801    static function main()
802        {
803        var m:Fungi = new Fungi();
804    }
805}
Note: See TracBrowser for help on using the repository browser.