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

Revision 1009, 25.3 KB checked in by dave, 10 years ago (diff)

fixed character names, click-through plants working, misc fixes

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    public 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, layer:String)
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        Layer=layer;
86        Spr.Hide(false);
87       
88        var tf = new flash.text.TextField();
89        tf.text = "This plant belongs to the "+type+" species, part of the "+
90            Layer+" layer. "+Owner+" planted this.";
91        tf.x=Spr.Pos.x-50;
92        tf.y=Spr.Pos.y-30-Spr.Height*Spr.MyScale.y;
93        tf.height=40;
94        tf.background = true;
95        //tf.backgroundColor = 0x8dd788;
96        tf.border = true;
97        tf.wordWrap = true;
98        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
99        var t = new flash.text.TextFormat();
100        t.font = "Verdana";
101        t.size = 8;               
102        t.color= 0x000000;           
103        tf.setTextFormat(t);
104        Spr.parent.addChild(tf);
105        tf.visible=false;
106        Spr.MouseDown(this,function(c) { tf.visible=true; });
107        Spr.MouseOut(this,function(c) { tf.visible=false; });
108
109        if (fruit) Fruit(world);
110        }
111
112    public function StateUpdate(state,fruit,world:World)
113    {
114        State=state;
115        if (State!="decayed")
116        {
117            Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State));
118        }
119        if (fruit && Seeds.length==0)
120        {
121            Fruit(world);
122        }
123        if (!fruit && Seeds.length!=0)
124        {
125            // assume only one seed...
126            world.RemoveSprite(Seeds[0]);
127            Seeds=[];       
128        }
129    }
130
131    override function Destroy(world:World)
132    {
133        super.Destroy(world);
134        for (seed in Seeds)
135        {
136            world.RemoveSprite(seed);
137        }
138    }
139       
140        public override function Update(frame:Int, world:World)
141        {
142                super.Update(frame,world);
143        }
144
145    public function Fruit(world:World)
146    {
147        var f=new Sprite(Spr.Pos.Add(new Vec2(0,-Spr.Height/2)),
148                         Resources.Get("seed"));
149        world.AddSprite(f);
150        Seeds.push(f);
151        f.MouseDown(this,function(p)
152        {           
153            if (world.MyName!="")
154            {
155                var s=new Seed(p.PlantType);
156                if (world.Seeds.Add(world,s))
157                {
158                    p.Seeds.remove(f);
159                    world.ActivatePlants(false);
160                    world.RemoveSprite(f);
161                    world.Server.Request("pick/"+
162                                         Std.string(cast(world.WorldPos.x,Int))+"/"+
163                                         Std.string(cast(world.WorldPos.y,Int))+"/"+
164                                         Std.string(p.Id),
165                                         p,
166                                         function (c) {});
167                }
168            }
169        });
170    }
171}
172
173//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
174
175class Spirit extends SkeletonEntity
176{
177    public var Name:String;
178
179    var Debug:flash.text.TextField;
180        var BG:Graphics;
181    var RawEmotions:Dynamic;
182    var Emotions:Dynamic;
183    var DesiredPos:Vec2;
184    public var LastData:Array<Dynamic>;
185    var Action:Sprite;
186   
187        public function new(world:World, name:String, pos)
188        {
189                super(world,pos);
190        Name = name;
191        Speed=0.1;
192        UpdateFreq=2;
193        Hide(true);
194        LastData=[];
195        DesiredPos=new Vec2(LogicalPos.x,LogicalPos.y);
196        RawEmotions={Love:0,Hate:0,Hope:0,Fear:0,Satisfaction:0,
197                     Relief:0,/*Fears_Confirmed:0,*/Disappointment:0,
198                     Joy:0,Distress:0,/*Happy_For:0,*/Pitty:0,
199                     Resentment:0,Gloating:0,Pride:0,Shame:0,
200                     Gratification:0,Remorse:0,Admiration:0,
201                     Reproach:0,Gratitude:0,Anger:0};
202        Emotions={Love:0,Hate:0,Hope:0,Fear:0,Satisfaction:0,
203                  Relief:0,/*Fears_Confirmed:0,*/Disappointment:0,
204                  Joy:0,Distress:0,/*Happy_For:0,*/Pitty:0,
205                  Resentment:0,Gloating:0,Pride:0,Shame:0,
206                  Gratification:0,Remorse:0,Admiration:0,
207                  Reproach:0,Gratitude:0,Anger:0};
208    }
209
210        public function BuildDebug(c)
211    {
212        var tf = new flash.text.TextField();
213        tf.text = "nowt yet.";
214        tf.x=Pos.x-150;
215        tf.y=Pos.y-25;
216        tf.height=150;
217        tf.width=140;
218        tf.background = false;
219        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
220        //tf.backgroundColor = 0x8dd788;
221        tf.border = true;
222        tf.wordWrap = true;
223        var t = new flash.text.TextFormat();
224        t.font = "Verdana";
225        t.size = 8;               
226        t.color= 0x000000;           
227        tf.setTextFormat(t);
228
229        var figures:Shape = new Shape();
230        BG = figures.graphics;
231        BG.beginFill(0xffffff,0.5);
232        BG.drawRect(tf.x,tf.y,tf.width,tf.height);
233        BG.endFill();
234        figures.visible=false;
235        cast(c,truffle.flash.FlashWorld).addChild(figures);
236
237        c.addChild(tf);
238        Debug=tf;
239        tf.visible=false;
240
241        Root.MouseDown(c,function(c)
242        {
243            tf.visible=true;
244            figures.visible=true;
245        });
246
247        Root.MouseOut(c,function(c)
248        {
249            tf.visible=false;
250            figures.visible=false;
251        });
252
253        Action = new Sprite(new Vec2(0,0),Resources.Get(""));
254        Action.Hide(true);
255        c.AddSprite(Action);
256
257        }
258
259    public function UpdateEmotions(e:Dynamic,world:World)
260    {
261        SetTilePos(new Vec2(Std.parseInt(e.tile.x),
262                            Std.parseInt(e.tile.y)));
263
264       
265        var dst = new Vec2(Std.parseInt(e.emotionalloc.x),
266                              Std.parseInt(e.emotionalloc.y));
267
268        if (dst.x!=DesiredPos.x || dst.y!=DesiredPos.y)
269        {
270            DesiredPos = dst;
271            while (world.Get("Spirit",dst)!=null)
272            {
273                dst = dst.Add(new Vec2(world.MyRndGen.Choose([-2,0,2]),
274                                       world.MyRndGen.Choose([-2,0,2])));
275            }
276            LogicalPos = new Vec3(dst.x,dst.y,4);
277        }
278
279        RawEmotions = e.emotions;
280
281        var ee = e.fatemotions.content;
282        var mood=Std.parseFloat(ee[0].content[0]);
283
284        var text=Name+"\nMood:"+ee[0].content[0]+"\n";
285        text+="Emotions:\n";
286        for (i in 1...ee.length)
287        {
288            text+=ee[i].attrs.type+" "+ee[i].attrs.direction+"\n";
289            //text+=ee[i].attrs.cause+"\n";
290        }
291
292        text+="Actions:\n";
293        var acs = cast(e.fatactions,Array<Dynamic>);
294        for (i in 0...acs.length)
295        {
296            text+=acs[i].msg+"\n";
297        }
298       
299        Action.Hide(true);
300        if (acs.length>0 && !Hidden)
301        {
302            if (StringTools.startsWith(acs[0].msg,"flower"))
303            {
304                Action.ChangeBitmap(Resources.Get("action-flower"));
305                Action.Hide(false);
306            }
307           
308            if (StringTools.startsWith(acs[0].msg,"drop-leaves"))
309            {
310                Action.ChangeBitmap(Resources.Get("action-drop-leaves"));
311                Action.Hide(false);
312            }
313        }
314
315        Debug.text=text;
316
317        var t = new flash.text.TextFormat();
318        t.font = "Verdana";
319        t.size = 8;               
320        t.color= 0x000000;           
321        Debug.setTextFormat(t);
322        Debug.x=Pos.x-150;
323        Debug.y=Pos.y-25;
324
325        BG.clear();
326        BG.beginFill(0xffffff,0.5);
327        BG.drawRect(Debug.x,Debug.y,Debug.width,Debug.height);
328        BG.endFill();
329
330        //trace(text);
331    }
332
333    override function Update(frame:Int, world:World)
334    {
335        for (f in Reflect.fields(Emotions))
336        {
337            // do a linear blend to smooth out changes in emotions
338            Reflect.setField(Emotions,f,
339            Reflect.field(Emotions,f)*0.95+Reflect.field(RawEmotions,f)*0.05);
340            //trace(f);
341        }
342
343        Action.Pos.x=Root.Pos.x-50;
344        Action.Pos.y=Root.Pos.y-50;
345        Action.Update(0,null);
346
347        //Draw(cast(world,truffle.World));
348        var c=this;
349
350        var excitement = c.Emotions.Love+c.Emotions.Admiration;
351        if (excitement>10) excitement=10;
352        var irritation = c.Emotions.Hate+c.Emotions.Distress;
353        if (irritation>5) irritation=5;
354        var bouncyness = c.Emotions.Gratitude;
355        if (bouncyness>5) bouncyness=5;
356        var bounce=new Vec2(0,0);
357
358        Root.Recurse(function(b:Bone,depth:Int)
359        {   
360            b.SetRotate((excitement*5+1)*Math.sin(
361                             (((10-depth)+frame*0.04+c.Emotions.Gratitude*0.01)+
362                             c.Emotions.Joy*0.1)) +
363            ((world.MyRndGen.RndFlt()-0.5)*10*irritation));
364            bounce.y=bouncyness*5*Math.abs(Math.sin(frame*0.25));
365            b.SetPos(b.BindPos.Add(bounce));
366           
367        });
368
369        super.Update(frame,world);
370    }
371}
372
373//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
374
375class Seed
376{
377    public var Type:String;
378    public var Spr:Sprite;
379
380    public function new(t:String)
381    {
382        Type=t;
383        Spr=new Sprite(new Vec2(0,0),Resources.Get("seed"));
384    }
385}
386
387class SeedStore
388{
389    var Seeds:Array<Seed>;
390    var Size:Int;
391
392    public function new(size:Int)
393    {
394        Seeds = [];
395        Size = size;
396    }
397
398    public function Add(world:World,s:Seed) : Bool
399    {
400        if (Seeds.length<Size)
401        {
402            Seeds.push(s);
403            s.Spr.SetPos(new Vec2(20+Seeds.length*10,30));
404            //cast(world,truffle.flash.FlashWorld).addSprite(s.Spr);
405            //trace("did it...");
406            s.Spr.Update(0,null);
407            return true;
408        }
409        return false;
410    }
411
412    public function Remove(world:World) : String
413    {
414        if (Seeds.length>0)
415        {
416            var s = Seeds.pop();
417//            world.RemoveSprite(s.Spr);
418            return s.Type;
419        }
420        else
421        {
422            return "";
423        }
424    }
425}
426
427//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
428
429class FungiWorld extends World
430{
431        public var Width:Int;
432        public var Height:Int;
433        var Objs:Array<Cube>;
434        public var WorldPos:Vec3;
435        var MyRndGen:RndGen;
436        public var MyTextEntry:TextEntry;
437        public var Plants:Array<Plant>;
438    public var TheCritters:Critters;
439        var MyName:String;
440    var Frame:Int;
441    var TickTime:Int;
442    var PerceiveTime:Int;
443    var Spirits:Array<Spirit>;
444    public var Seeds:SeedStore;
445    var Server : ServerConnection;
446    var TileInfo: flash.text.TextField;
447    var Spiral:Sprite;
448    var SpiralScale:Float;
449 
450        public function new(w:Int, h:Int)
451        {
452                super();
453                Frame=0;
454        TickTime=0;
455        PerceiveTime=0;
456                Width=w;
457                Height=h;
458                Plants = [];
459        Objs = [];
460        Spirits = [];
461        SpiralScale=0;
462        Seeds = new SeedStore(1);
463                WorldPos = new Vec3(0,0,0);
464                MyRndGen = new RndGen();
465        Server = new ServerConnection();
466        MyName = "";
467
468        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3"));
469        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); });
470        arrow1.Spr.MouseOver(this,function(c) { arrow1.Spr.SetScale(new Vec2(1.1,1.1)); arrow1.Spr.Update(0,null); });
471        arrow1.Spr.MouseOut(this,function(c) { arrow1.Spr.SetScale(new Vec2(1,1)); arrow1.Spr.Update(0,null); });
472 
473        var arrow2=new SpriteEntity(this,new Vec3(10,21,1), Resources.Get("arr4"));
474        arrow2.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,1,0))); });
475        arrow2.Spr.MouseOver(this,function(c) { arrow2.Spr.SetScale(new Vec2(1.1,1.1)); arrow2.Spr.Update(0,null); });
476        arrow2.Spr.MouseOut(this,function(c) { arrow2.Spr.SetScale(new Vec2(1,1)); arrow2.Spr.Update(0,null); });
477 
478        var arrow3=new SpriteEntity(this,new Vec3(-2,7,1), Resources.Get("arr2"));
479        arrow3.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(-1,0,0))); });
480        arrow3.Spr.MouseOver(this,function(c) { arrow3.Spr.SetScale(new Vec2(1.1,1.1)); arrow3.Spr.Update(0,null); });
481        arrow3.Spr.MouseOut(this,function(c) { arrow3.Spr.SetScale(new Vec2(1,1)); arrow3.Spr.Update(0,null); });
482
483        var arrow4=new SpriteEntity(this,new Vec3(20,10,1), Resources.Get("arr1"));
484        arrow4.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(1,0,0))); });
485        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); });
486        arrow4.Spr.MouseOut(this,function(c) { arrow4.Spr.SetScale(new Vec2(1,1)); arrow4.Spr.Update(0,null); });
487
488        // move this crap out you stupid copy/paste programmer...
489
490        // tile info
491        TileInfo = new flash.text.TextField();
492        TileInfo.text = "Loading...";
493        TileInfo.x=100;
494        TileInfo.y=20;
495        TileInfo.height=10;
496        TileInfo.width=120;
497        TileInfo.background = true;
498        TileInfo.autoSize = flash.text.TextFieldAutoSize.LEFT;
499        TileInfo.border = true;
500        TileInfo.wordWrap = true;
501        var t = new flash.text.TextFormat();
502        t.font = "Verdana";
503        t.size = 8;               
504        t.color= 0x000000;           
505        TileInfo.setTextFormat(t);
506        addChild(TileInfo);
507
508        // hiscores table
509        var tf = new flash.text.TextField();
510        tf.text = "Loading...";
511        tf.x=100;
512        tf.y=100;
513        tf.height=500;
514        tf.width=250;
515        tf.background = false;
516        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
517        tf.border = true;
518        tf.wordWrap = true;
519        var t = new flash.text.TextFormat();
520        t.font = "Verdana";
521        t.size = 8;               
522        t.color= 0x000000;           
523        tf.setTextFormat(t);
524
525        var figures:Shape = new Shape();
526        var BG = figures.graphics;
527        BG.beginFill(0xffffff,0.5);
528        BG.drawRect(tf.x,tf.y,tf.width,tf.height);
529        BG.endFill();
530        figures.visible=false;
531        cast(this,truffle.flash.FlashWorld).addChild(figures);
532
533        addChild(tf);
534        tf.visible=false;
535
536        var hiscores = new Sprite(new Vec2(50,50), Resources.Get(""));
537        AddSprite(hiscores);
538        hiscores.MouseDown(this,function(c)
539        {
540            tf.visible=!tf.visible;
541            figures.visible=!figures.visible;
542            if (tf.visible)
543            {
544                cast(c,FungiWorld).Server.Request("hiscores",
545                                 c,
546                                 function(c,data:Array<Dynamic>)
547                                 {
548                                     var text="Hi Scores Table\n Number of plants currently alive, by player.\n\n";
549                                     for (i in data)
550                                     {
551                                         text+=i[0]+": "+i[1]+"\n";
552                                     }
553                                     tf.text=text;
554
555                                     var t = new flash.text.TextFormat();
556                                     t.font = "Verdana";
557                                     t.size = 12;               
558                                     t.color= 0x000000;           
559                                     tf.setTextFormat(t);
560
561                                     BG.clear();
562                                     BG.beginFill(0xffffff,0.5);
563                                     BG.drawRect(tf.x,tf.y,tf.width,tf.height);
564                                     BG.endFill();
565                                 });
566                           
567            }
568        });
569
570                for (y in 0...h)
571                {
572                        for (x in 0...w)
573                        {
574                                var ob:Cube = new Cube(this,new Vec3(0,0,0));
575             
576                ob.Spr.MouseDown(this,function(c)
577                {
578                    var type=c.Seeds.Remove(cast(c,truffle.World));
579                    if (type!="")
580                    {
581                        c.ActivatePlants(true);
582                        c.SpiralScale=1;
583                        c.Spiral.SetPos(new Vec2(ob.Pos.x,ob.Pos.y-32));
584                        c.AddServerPlant(ob.LogicalPos.Add(new Vec3(0,0,1)),type);
585                    }
586                });
587                                Objs.push(ob);
588                        }
589                }
590
591                UpdateWorld(new Vec3(0,0,0));
592               
593                MyTextEntry=new TextEntry(300,10,310,30,NameCallback);
594                addChild(MyTextEntry); 
595
596        TheCritters = new Critters(this,3);
597
598        Spiral = new Sprite(new Vec2(0,0), Resources.Get("spiral"), true);
599        AddSprite(Spiral);
600
601        Update(0);
602        SortScene();
603        var names = ["TreeSpirit","ShrubSpirit","CoverSpirit"];
604        var positions = [new Vec3(0,5,4), new Vec3(7,0,4), new Vec3(2,10,4)];
605 
606        for (i in 0...3)
607        {
608            Server.Request("spirit-sprites/"+names[i],
609            this,
610            function (c,data:Array<Dynamic>)
611            {
612                var sp:Spirit = new Spirit(c,names[i],positions[i]);
613                sp.NeedsUpdate=true;
614                sp.LastData=data;
615                sp.Build(c,data);
616                sp.BuildDebug(c);
617                c.SortScene();
618                c.Spirits.push(sp);
619            });
620        }
621        }
622
623    function CompareLists(a:Array<Dynamic>,b:Array<Dynamic>): Bool
624    {
625        if (a.length!=b.length) return false;
626        for (i in 0...a.length)
627        {
628            if (a[i].name!=b[i].name) return false;
629        }
630        return true;
631    }
632
633    public function UpdateSpiritSprites()
634    {
635        for (s in Spirits)
636        {
637            Server.Request("spirit-sprites/"+s.Name,
638            this,
639            function (c,data:Array<Dynamic>)
640            {
641                if (!c.CompareLists(data,s.LastData))
642                {
643                    s.Build(cast(c,World),data);
644                    s.LastData=data;
645                }
646            });
647        }       
648    }
649       
650        public function NameCallback(name)
651        {
652                removeChild(MyTextEntry);
653                MyName=name;
654                //WorldClient.GetPlants(cast(WorldPos.x,Int),cast(WorldPos.y,Int));
655        }
656       
657        public function UpdateWorld(pos:Vec3)
658        {
659                WorldPos=pos;
660        SetCurrentTilePos(new Vec2(pos.x,pos.y));
661               
662                var circles = [];
663        for (x in -1...2)
664                {
665                        for (y in -1...2)
666                        {
667                                MyRndGen.Seed(cast((WorldPos.x+x)+(WorldPos.y+y)*139,Int));
668                                for (i in 0...5)
669                                {
670                                        var pos = new Vec3(MyRndGen.RndFlt()*15+x*15,
671                                       MyRndGen.RndFlt()*15+y*15,
672                                                                           0);           
673                                        circles.push(new Circle(pos, MyRndGen.RndFlt()*4));
674                                }
675                        }
676                }
677               
678               
679                for (i in 0...Objs.length)
680                {
681                        var pos=new Vec3(i%Width,Math.floor(i/Width),-1);
682                        MyRndGen.Seed(cast(WorldPos.x+pos.x+WorldPos.y+pos.y*139,Int));
683                        var inside:Bool=false;
684                        for (c in circles)
685                        {
686                                if (c.Inside(pos)) pos.z=0;
687                        }
688
689                        Objs[i].LogicalPos=pos;
690                        Objs[i].UpdateTex(MyRndGen);
691            Objs[i].Update(0,this);
692                }
693
694        ClearPlants();         
695        }
696
697        public function AddServerPlant(pos:Vec3,type)
698        {       
699        if (MyName!=null && SpaceClear(pos))
700        {
701            var size=MyRndGen.RndFlt()+0.5;
702            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+
703                                         Std.string(cast(WorldPos.y,Int))+"/"+
704                                         Std.string(cast(pos.x,Int))+"/"+
705                                         Std.string(cast(pos.y,Int))+"/"+
706                                         type+"/"+
707                                         MyName+"/"+
708                                         Math.round(size*100),
709            this, function (c,data) {});       
710        }
711        }
712
713    public function ActivatePlants(s:Bool) : Void
714    {
715        for (plant in Plants)
716        {
717            plant.Spr.EnableMouse(s);
718        }
719        }
720
721    public function ClearPlants() : Void
722    {
723        for (plant in Plants)
724        {
725            Remove(plant);
726        }
727        Plants = [];
728        }
729       
730        public function GetCube(pos:Vec3) : Cube
731        {
732                return Objs[cast(pos.x+pos.y*Width,Int)];
733        }
734               
735    public function SpaceClear(pos:Vec3)
736    {
737        for (plant in Plants)
738        {
739            if (plant.LogicalPos.Eq(pos)) return false;
740        }
741        return true;
742    }
743       
744        override public function Handle(e:Int)
745        {
746        super.Handle(e);
747        Update(0);
748        }
749
750    public function UpdateGhosts(c,t:Dynamic)
751    {
752        for(i in 0...t.length)
753        {
754            for (g in Spirits)
755            {
756                if (g.Name==t[i].name)
757                {
758                    g.UpdateEmotions(t[i],this);
759                }
760            }
761        }
762    }
763
764    override function Update(time:Int)
765    {
766        super.Update(time);
767
768        Server.Update();
769        TheCritters.Update();
770
771        if (SpiralScale>0.1)
772        {
773            Spiral.Hide(false);
774            SpiralScale-=0.05;
775            Spiral.SetRotate(time*12);
776            Spiral.SetScale(new Vec2(SpiralScale,SpiralScale));
777            Spiral.Update(time,null);
778        }
779       
780        if (time>TickTime)
781        {
782            UpdateSpiritSprites();
783           
784            Server.Request("spirit-info",this,UpdateGhosts);
785
786            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/"
787            +Std.string(cast(WorldPos.y,Int)),
788            this,
789            function (c:truffle.World,d)
790            {
791                c.TileInfo.text="Season: "+d.season;
792                var t = new flash.text.TextFormat();
793                t.font = "Verdana";
794                t.size = 12;               
795                t.color= 0x000000;           
796                c.TileInfo.setTextFormat(t);
797
798                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>);
799                for (p in data)
800                {
801                    var worldpos = new Vec2(p.pos.x,p.pos.y);
802                    var e = c.Get("Plant",worldpos);
803                    if (e==null)
804                    {
805                        //trace("making new plant");
806                        var cube = c.Get("Cube",worldpos);
807                        if (cube!=null)
808                        {
809                            var pos = new Vec3(p.pos.x,p.pos.y,cube.LogicalPos.z+1);   
810                            var plant = new Plant(c,Std.parseInt(p.id),
811                                                  p.owner,
812                                                  pos,
813                                                  p.type,
814                                                  p.state,
815                                                  p.fruit,
816                                                  p.layer);
817                            c.Plants.push(plant);
818                        }
819                    }
820                    else
821                    {
822                        //trace("updating plant");
823                        //trace(e);
824                        //trace(p.state);
825                        cast(e,Plant).StateUpdate(p.state,p.fruit,c);
826                    }
827                }
828
829                var temp=c.Plants;
830                for (plant in cast(c,FungiWorld).Plants)
831                {
832                    if (plant.State=="decayed")
833                    {
834                        c.Remove(plant);
835                        temp.remove(plant);
836                    }
837                }
838                c.Plants=temp;
839
840                c.SortScene();
841            });           
842           
843            TickTime=time+100;
844        }
845    }
846
847}
848
849//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
850
851class Fungi extends App
852{
853    public function new()
854        {
855//        Log.setColor(0xFFFFFF);
856        super(new FungiWorld(15,15));
857    }
858       
859    static function main()
860        {
861        var m:Fungi = new Fungi();
862    }
863}
Note: See TracBrowser for help on using the repository browser.