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

Revision 1006, 24.4 KB checked in by dave, 10 years ago (diff)

new graphics, stuff for TV video

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=true; });
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    var Spiral:Sprite;
445    var SpiralScale:Float;
446 
447        public function new(w:Int, h:Int)
448        {
449                super();
450                Frame=0;
451        TickTime=0;
452        PerceiveTime=0;
453                Width=w;
454                Height=h;
455                Plants = [];
456        Objs = [];
457        Spirits = [];
458        SpiralScale=0;
459        Seeds = new SeedStore(1);
460                WorldPos = new Vec3(0,0,0);
461                MyRndGen = new RndGen();
462        Server = new ServerConnection();
463        MyName = "";
464
465        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3"));
466        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); });
467        arrow1.Spr.MouseOver(this,function(c) { arrow1.Spr.SetScale(new Vec2(1.1,1.1)); arrow1.Spr.Update(0,null); });
468        arrow1.Spr.MouseOut(this,function(c) { arrow1.Spr.SetScale(new Vec2(1,1)); arrow1.Spr.Update(0,null); });
469 
470        var arrow2=new SpriteEntity(this,new Vec3(10,21,1), Resources.Get("arr4"));
471        arrow2.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,1,0))); });
472        arrow2.Spr.MouseOver(this,function(c) { arrow2.Spr.SetScale(new Vec2(1.1,1.1)); arrow2.Spr.Update(0,null); });
473        arrow2.Spr.MouseOut(this,function(c) { arrow2.Spr.SetScale(new Vec2(1,1)); arrow2.Spr.Update(0,null); });
474 
475        var arrow3=new SpriteEntity(this,new Vec3(-2,7,1), Resources.Get("arr2"));
476        arrow3.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(-1,0,0))); });
477        arrow3.Spr.MouseOver(this,function(c) { arrow3.Spr.SetScale(new Vec2(1.1,1.1)); arrow3.Spr.Update(0,null); });
478        arrow3.Spr.MouseOut(this,function(c) { arrow3.Spr.SetScale(new Vec2(1,1)); arrow3.Spr.Update(0,null); });
479
480        var arrow4=new SpriteEntity(this,new Vec3(20,10,1), Resources.Get("arr1"));
481        arrow4.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(1,0,0))); });
482        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); });
483        arrow4.Spr.MouseOut(this,function(c) { arrow4.Spr.SetScale(new Vec2(1,1)); arrow4.Spr.Update(0,null); });
484
485        // move this crap out you stupid copy/paste programmer...
486
487        // tile info
488        TileInfo = new flash.text.TextField();
489        TileInfo.text = "Loading...";
490        TileInfo.x=100;
491        TileInfo.y=20;
492        TileInfo.height=10;
493        TileInfo.width=120;
494        TileInfo.background = false;
495        TileInfo.autoSize = flash.text.TextFieldAutoSize.LEFT;
496        TileInfo.border = true;
497        TileInfo.wordWrap = true;
498        var t = new flash.text.TextFormat();
499        t.font = "Verdana";
500        t.size = 8;               
501        t.color= 0x000000;           
502        TileInfo.setTextFormat(t);
503        addChild(TileInfo);
504
505        // hiscores table
506        var tf = new flash.text.TextField();
507        tf.text = "Loading...";
508        tf.x=100;
509        tf.y=100;
510        tf.height=500;
511        tf.width=250;
512        tf.background = false;
513        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
514        tf.border = true;
515        tf.wordWrap = true;
516        var t = new flash.text.TextFormat();
517        t.font = "Verdana";
518        t.size = 8;               
519        t.color= 0x000000;           
520        tf.setTextFormat(t);
521
522        var figures:Shape = new Shape();
523        var BG = figures.graphics;
524        BG.beginFill(0xffffff,0.5);
525        BG.drawRect(tf.x,tf.y,tf.width,tf.height);
526        BG.endFill();
527        figures.visible=false;
528        cast(this,truffle.flash.FlashWorld).addChild(figures);
529
530        addChild(tf);
531        tf.visible=false;
532
533        var hiscores = new Sprite(new Vec2(50,50), Resources.Get(""));
534        AddSprite(hiscores);
535        hiscores.MouseDown(this,function(c)
536        {
537            tf.visible=!tf.visible;
538            figures.visible=!figures.visible;
539            if (tf.visible)
540            {
541                cast(c,FungiWorld).Server.Request("hiscores",
542                                 c,
543                                 function(c,data:Array<Dynamic>)
544                                 {
545                                     var text="Hi Scores Table\n Number of plants currently alive, by player.\n\n";
546                                     for (i in data)
547                                     {
548                                         text+=i[0]+": "+i[1]+"\n";
549                                     }
550                                     tf.text=text;
551
552                                     var t = new flash.text.TextFormat();
553                                     t.font = "Verdana";
554                                     t.size = 12;               
555                                     t.color= 0x000000;           
556                                     tf.setTextFormat(t);
557
558                                     BG.clear();
559                                     BG.beginFill(0xffffff,0.5);
560                                     BG.drawRect(tf.x,tf.y,tf.width,tf.height);
561                                     BG.endFill();
562                                 });
563                           
564            }
565        });
566
567                for (y in 0...h)
568                {
569                        for (x in 0...w)
570                        {
571                                var ob:Cube = new Cube(this,new Vec3(0,0,0));
572             
573                ob.Spr.MouseDown(this,function(c)
574                {
575                    var type=c.Seeds.Remove(cast(c,truffle.World));
576                    if (type!="")
577                    {
578                        c.SpiralScale=1;
579                        c.Spiral.SetPos(new Vec2(ob.mouseX,ob.mouseY));
580                        c.AddServerPlant(ob.LogicalPos.Add(new Vec3(0,0,1)),type);
581                    }
582                });
583                                Objs.push(ob);
584                        }
585                }
586
587                UpdateWorld(new Vec3(0,0,0));
588               
589                MyTextEntry=new TextEntry(300,10,310,30,NameCallback);
590                addChild(MyTextEntry); 
591
592        TheCritters = new Critters(this,3);
593
594        Spiral = new Sprite(new Vec2(0,0), Resources.Get("spiral"));
595        AddSprite(Spiral);
596
597        Update(0);
598        SortScene();
599        var names = ["CanopySpirit","VerticalSpirit","CoverSpirit"];
600        var positions = [new Vec3(0,5,4), new Vec3(7,0,4), new Vec3(2,10,4)];
601 
602        for (i in 0...3)
603        {
604            Server.Request("spirit-sprites/"+names[i],
605            this,
606            function (c,data:Array<Dynamic>)
607            {
608                var sp:Spirit = new Spirit(c,names[i],positions[i]);
609                sp.NeedsUpdate=true;
610                sp.LastData=data;
611                sp.Build(c,data);
612                sp.BuildDebug(c);
613                c.SortScene();
614                c.Spirits.push(sp);
615            });
616        }
617        }
618
619    function CompareLists(a:Array<Dynamic>,b:Array<Dynamic>): Bool
620    {
621        if (a.length!=b.length) return false;
622        for (i in 0...a.length)
623        {
624            if (a[i].name!=b[i].name) return false;
625        }
626        return true;
627    }
628
629    public function UpdateSpiritSprites()
630    {
631        for (s in Spirits)
632        {
633            Server.Request("spirit-sprites/"+s.Name,
634            this,
635            function (c,data:Array<Dynamic>)
636            {
637                if (!c.CompareLists(data,s.LastData))
638                {
639                    s.Build(cast(c,World),data);
640                    s.LastData=data;
641                }
642            });
643        }       
644    }
645       
646        public function NameCallback(name)
647        {
648                removeChild(MyTextEntry);
649                MyName=name;
650                //WorldClient.GetPlants(cast(WorldPos.x,Int),cast(WorldPos.y,Int));
651        }
652       
653        public function UpdateWorld(pos:Vec3)
654        {
655                WorldPos=pos;
656        SetCurrentTilePos(new Vec2(pos.x,pos.y));
657               
658                var circles = [];
659        for (x in -1...2)
660                {
661                        for (y in -1...2)
662                        {
663                                MyRndGen.Seed(cast((WorldPos.x+x)+(WorldPos.y+y)*139,Int));
664                                for (i in 0...5)
665                                {
666                                        var pos = new Vec3(MyRndGen.RndFlt()*15+x*15,
667                                       MyRndGen.RndFlt()*15+y*15,
668                                                                           0);           
669                                        circles.push(new Circle(pos, MyRndGen.RndFlt()*4));
670                                }
671                        }
672                }
673               
674               
675                for (i in 0...Objs.length)
676                {
677                        var pos=new Vec3(i%Width,Math.floor(i/Width),-1);
678                        MyRndGen.Seed(cast(WorldPos.x+pos.x+WorldPos.y+pos.y*139,Int));
679                        var inside:Bool=false;
680                        for (c in circles)
681                        {
682                                if (c.Inside(pos)) pos.z=0;
683                        }
684
685                        Objs[i].LogicalPos=pos;
686                        Objs[i].UpdateTex(MyRndGen);
687            Objs[i].Update(0,this);
688                }
689
690        ClearPlants();         
691        }
692
693        public function AddServerPlant(pos:Vec3,type)
694        {       
695        if (MyName!=null && SpaceClear(pos))
696        {
697            var size=MyRndGen.RndFlt()+0.5;
698            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+
699                                         Std.string(cast(WorldPos.y,Int))+"/"+
700                                         Std.string(cast(pos.x,Int))+"/"+
701                                         Std.string(cast(pos.y,Int))+"/"+
702                                         type+"/"+
703                                         MyName+"/"+
704                                         Math.round(size*100),
705            this, function (c,data) {});       
706        }
707        }
708
709    public function ClearPlants() : Void
710    {
711        for (plant in Plants)
712        {
713            Remove(plant);
714        }
715        Plants = [];
716        }
717       
718        public function GetCube(pos:Vec3) : Cube
719        {
720                return Objs[cast(pos.x+pos.y*Width,Int)];
721        }
722               
723    public function SpaceClear(pos:Vec3)
724    {
725        for (plant in Plants)
726        {
727            if (plant.LogicalPos.Eq(pos)) return false;
728        }
729        return true;
730    }
731       
732        override public function Handle(e:Int)
733        {
734        super.Handle(e);
735        Update(0);
736        }
737
738    public function UpdateGhosts(c,t:Dynamic)
739    {
740        for(i in 0...t.length)
741        {
742            for (g in Spirits)
743            {
744                if (g.Name==t[i].name)
745                {
746                    g.UpdateEmotions(t[i],this);
747                }
748            }
749        }
750    }
751
752    override function Update(time:Int)
753    {
754        super.Update(time);
755
756        Server.Update();
757        TheCritters.Update();
758
759        if (SpiralScale>0.1)
760        {
761            Spiral.Hide(false);
762            SpiralScale-=0.05;
763            Spiral.SetRotate(time*12);
764            Spiral.SetScale(new Vec2(SpiralScale,SpiralScale));
765            Spiral.Update(time,null);
766        }
767       
768        if (time>TickTime)
769        {
770            UpdateSpiritSprites();
771           
772            Server.Request("spirit-info",this,UpdateGhosts);
773
774            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/"
775            +Std.string(cast(WorldPos.y,Int)),
776            this,
777            function (c:truffle.World,d)
778            {
779                c.TileInfo.text="Season: "+d.season;
780                var t = new flash.text.TextFormat();
781                t.font = "Verdana";
782                t.size = 12;               
783                t.color= 0x000000;           
784                c.TileInfo.setTextFormat(t);
785
786                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>);
787                for (p in data)
788                {
789                    var worldpos = new Vec2(p.pos.x,p.pos.y);
790                    var e = c.Get("Plant",worldpos);
791                    if (e==null)
792                    {
793                        //trace("making new plant");
794                        var cube = c.Get("Cube",worldpos);
795                        if (cube!=null)
796                        {
797                            var pos = new Vec3(p.pos.x,p.pos.y,cube.LogicalPos.z+1);   
798                            var plant = new Plant(c,Std.parseInt(p.id),p.owner,pos,p.type,p.state,p.fruit);
799                            c.Plants.push(plant);
800                        }
801                    }
802                    else
803                    {
804                        //trace("updating plant");
805                        //trace(e);
806                        //trace(p.state);
807                        cast(e,Plant).StateUpdate(p.state,p.fruit,c);
808                    }
809                }
810                c.SortScene();
811            });           
812           
813            TickTime=time+100;
814        }
815    }
816
817}
818
819//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
820
821class Fungi extends App
822{
823    public function new()
824        {
825//        Log.setColor(0xFFFFFF);
826        super(new FungiWorld(15,15));
827    }
828       
829    static function main()
830        {
831        var m:Fungi = new Fungi();
832    }
833}
Note: See TracBrowser for help on using the repository browser.