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

Revision 907, 14.3 KB checked in by dave, 10 years ago (diff)

test

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;
28 
29//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30
31class Cube extends SpriteEntity
32{       
33        public function new(world:World, pos:Vec3)
34        {
35                super(world, pos, Resources.Get("blue-cube"));
36        }
37       
38        public function UpdateTex(rnd:RndGen)
39        {
40                if (LogicalPos.z%2==0)
41        {
42            Spr.ChangeBitmap(Resources.Get(
43                rnd.Choose(["rock-cube-01","rock-cube-02","rock-cube-03"])));
44                }
45                else
46                {
47            Spr.ChangeBitmap(Resources.Get(
48                rnd.Choose(["rock-cube-04","rock-cube-05","rock-cube-06"])));
49        }
50        }
51}
52
53//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54
55class Plant extends SpriteEntity
56{
57        public var Owner:String;
58        var PlantScale:Float;
59        public var Age:Int;
60    var Scale:Float;
61    var PlantType:String;
62    var State:String;
63    var Seeds:Array<Sprite>;
64
65        public function new(world:World, owner:String, pos, type:String, state:String)
66        {
67                super(world,pos,Resources.Get(type+"-"+state),false);
68        PlantType=type;
69        State=state;
70                Owner=owner;
71        PlantScale=0;
72        //NeedsUpdate=true;
73        Seeds=[];
74
75        Spr.Hide(false);
76       
77        var tf = new flash.text.TextField();
78        tf.text = Owner + " planted this.";
79        tf.x=Spr.Pos.x-50;
80        tf.y=Spr.Pos.y-30-Spr.Height*Spr.MyScale.y;
81        tf.height=40;
82        tf.background = true;
83        //tf.autoSize = true;
84        //tf.backgroundColor = 0x8dd788;
85        tf.border = true;
86        tf.wordWrap = true;
87        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
88        var t = new flash.text.TextFormat();
89        t.font = "Verdana";
90        t.size = 8;               
91        t.color= 0x000000;           
92        tf.setTextFormat(t);
93        Spr.parent.addChild(tf);
94        tf.visible=false;
95        Spr.MouseOver(this,function(c) { tf.visible=true; });
96        Spr.MouseOut(this,function(c) { tf.visible=false; });
97        }
98
99    public function StateUpdate(state,world:World)
100    {
101        State=state;
102        if (State!="decayed")
103        {
104            Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State));
105        }
106        if (State=="fruit-c" && Seeds.length==0)
107        {
108            Fruit(world);
109        }
110    }
111
112    override function Destroy(world:World)
113    {
114        super.Destroy(world);
115        for (seed in Seeds)
116        {
117            world.RemoveSprite(seed);
118        }
119    }
120       
121        public override function Update(frame:Int, world:World)
122        {
123                super.Update(frame,world);
124        }
125
126    public function Fruit(world:World)
127    {
128        var f=new Sprite(Spr.Pos.Add(new Vec2(0,-Spr.Height/2)),
129                         Resources.Get("seed"));
130        world.AddSprite(f);
131        Seeds.push(f);
132        f.MouseDown(this,function(p)
133        {           
134            if (world.MyName!="")
135            {
136                var s=new Seed(p.PlantType);
137                if (world.Seeds.Add(world,s))
138                {
139                    p.Seeds.remove(f);
140                    world.RemoveSprite(f);
141                }
142            }
143        });
144    }
145}
146
147//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
148
149class Spirit extends SkeletonEntity
150{
151    public var Name:String;
152    var Debug:flash.text.TextField;
153       
154        public function new(world:World, name:String, pos)
155        {
156                super(world,pos);
157        Name = name;
158    }
159
160        public function BuildDebug(c)
161    {
162        var tf = new flash.text.TextField();
163        tf.text = "nowt yet.";
164        tf.x=Pos.x-50;
165        tf.y=Pos.y-25;
166        tf.height=150;
167        tf.width=100;
168        tf.background = true;
169        tf.autoSize = flash.text.TextFieldAutoSize.LEFT;
170        //tf.backgroundColor = 0x8dd788;
171        tf.border = true;
172        tf.wordWrap = true;
173        var t = new flash.text.TextFormat();
174        t.font = "Verdana";
175        t.size = 8;               
176        t.color= 0x000000;           
177        tf.setTextFormat(t);
178        c.addChild(tf);
179        Debug=tf;
180        /*tf.visible=false;
181        Root.MouseOver(this,function(c) { tf.visible=true; });
182        Root.MouseOut(this,function(c) { tf.visible=false; });*/
183
184        Root.MouseDown(c,function(c)
185        {
186            trace("perc...");
187            c.Server.Request("perceive",1,function(c,d){});
188        });
189        }
190
191    public function UpdateEmotions(e:Dynamic)
192    {
193        var ee = e.emotions.content;
194        var mood=Std.parseFloat(ee[0].content[0]);
195
196        var text=Name+"\nMood:"+ee[0].content[0]+"\n";
197
198        for (i in 1...ee.length)
199        {
200            text+=ee[i].attrs.type+" "+ee[i].attrs.direction+"\n";
201            text+=ee[i].attrs.cause+"\n";
202        }
203
204        Debug.text=text;
205
206        var t = new flash.text.TextFormat();
207        t.font = "Verdana";
208        t.size = 8;               
209        t.color= 0x000000;           
210        Debug.setTextFormat(t);
211
212
213        //trace(text);
214    }
215}
216
217//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
218
219class Seed
220{
221    public var Type:String;
222    public var Spr:Sprite;
223
224    public function new(t:String)
225    {
226        Type=t;
227        Spr=new Sprite(new Vec2(0,0),Resources.Get("seed"));
228    }
229}
230
231class SeedStore
232{
233    var Seeds:Array<Seed>;
234    var Size:Int;
235
236    public function new(size:Int)
237    {
238        Seeds = [];
239        Size = size;
240    }
241
242    public function Add(world:World,s:Seed) : Bool
243    {
244        if (Seeds.length<Size)
245        {
246            Seeds.push(s);
247            s.Spr.SetPos(new Vec2(20+Seeds.length*10,30));
248            //cast(world,truffle.flash.FlashWorld).addSprite(s.Spr);
249            //trace("did it...");
250            s.Spr.Update(0,null);
251            return true;
252        }
253        return false;
254    }
255
256    public function Remove(world:World) : String
257    {
258        if (Seeds.length>0)
259        {
260            var s = Seeds.pop();
261//            world.RemoveSprite(s.Spr);
262            return s.Type;
263        }
264        else
265        {
266            return "";
267        }
268    }
269}
270
271//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
272
273class FungiWorld extends World
274{
275        public var Width:Int;
276        public var Height:Int;
277        var Objs:Array<Cube>;
278        public var WorldPos:Vec3;
279        var MyRndGen:RndGen;
280        public var MyTextEntry:TextEntry;
281        public var Plants:Array<Plant>;
282        var MyName:String;
283    var Frame:Int;
284    var TickTime:Int;
285    var PerceiveTime:Int;
286    var Spirits:Array<Spirit>;
287    public var Seeds:SeedStore;
288    var Server : ServerConnection;
289
290        public function new(w:Int, h:Int)
291        {
292                super();
293                Frame=0;
294        TickTime=0;
295        PerceiveTime=0;
296                Width=w;
297                Height=h;
298                Plants = [];
299        Objs = [];
300        Spirits = [];
301        Seeds = new SeedStore(1);
302                WorldPos = new Vec3(0,0,0);
303                MyRndGen = new RndGen();
304        Server = new ServerConnection();
305        MyName = "";
306
307        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3"));
308        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); });
309        arrow1.Spr.MouseOver(this,function(c) { arrow1.Spr.SetScale(new Vec2(1.1,1.1)); arrow1.Spr.Update(0,null); });
310        arrow1.Spr.MouseOut(this,function(c) { arrow1.Spr.SetScale(new Vec2(1,1)); arrow1.Spr.Update(0,null); });
311 
312        var arrow2=new SpriteEntity(this,new Vec3(10,21,1), Resources.Get("arr4"));
313        arrow2.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,1,0))); });
314        arrow2.Spr.MouseOver(this,function(c) { arrow2.Spr.SetScale(new Vec2(1.1,1.1)); arrow2.Spr.Update(0,null); });
315        arrow2.Spr.MouseOut(this,function(c) { arrow2.Spr.SetScale(new Vec2(1,1)); arrow2.Spr.Update(0,null); });
316 
317        var arrow3=new SpriteEntity(this,new Vec3(-2,7,1), Resources.Get("arr2"));
318        arrow3.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(-1,0,0))); });
319        arrow3.Spr.MouseOver(this,function(c) { arrow3.Spr.SetScale(new Vec2(1.1,1.1)); arrow3.Spr.Update(0,null); });
320        arrow3.Spr.MouseOut(this,function(c) { arrow3.Spr.SetScale(new Vec2(1,1)); arrow3.Spr.Update(0,null); });
321
322        var arrow4=new SpriteEntity(this,new Vec3(20,10,1), Resources.Get("arr1"));
323        arrow4.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(1,0,0))); });
324        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); });
325        arrow4.Spr.MouseOut(this,function(c) { arrow4.Spr.SetScale(new Vec2(1,1)); arrow4.Spr.Update(0,null); });
326
327                for (y in 0...h)
328                {
329                        for (x in 0...w)
330                        {
331                                var ob:Cube = new Cube(this,new Vec3(0,0,0));
332             
333                ob.Spr.MouseDown(this,function(c)
334                {
335                    var type=c.Seeds.Remove(cast(c,truffle.World));
336                    if (type!="")
337                    {
338                        c.AddServerPlant(ob.LogicalPos.Add(new Vec3(0,0,1)),type);
339                    }
340                });
341                                Objs.push(ob);
342                        }
343                }
344
345                UpdateWorld(new Vec3(0,0,0));
346               
347                MyTextEntry=new TextEntry(300,10,310,30,NameCallback);
348                addChild(MyTextEntry); 
349
350        Update(0);
351        SortScene();
352        var names = ["CanopySpirit","CoverSpirit"];
353        var positions = [new Vec3(0,5,4), new Vec3(7,0,4), new Vec3(2,10,4)];
354
355        for (i in 0...2)
356        {
357            Server.Request("spirit-sprites/"+names[i],
358            this,
359            function (c,data:Array<Dynamic>)
360            {
361                var sp:Spirit = new Spirit(c,names[i],positions[i]);
362                sp.NeedsUpdate=true;
363                sp.Build(c,data);
364                sp.BuildDebug(c);
365                c.SortScene();
366                c.Spirits.push(sp);
367            });
368        }
369        }
370       
371        public function NameCallback(name)
372        {
373                removeChild(MyTextEntry);
374                MyName=name;
375                //WorldClient.GetPlants(cast(WorldPos.x,Int),cast(WorldPos.y,Int));
376        }
377       
378        public function UpdateWorld(pos:Vec3)
379        {
380                WorldPos=pos;
381               
382                var circles = [];
383        for (x in -1...2)
384                {
385                        for (y in -1...2)
386                        {
387                                MyRndGen.Seed(cast((WorldPos.x+x)+(WorldPos.y+y)*139,Int));
388                                for (i in 0...5)
389                                {
390                                        var pos = new Vec3(MyRndGen.RndFlt()*15+x*15,
391                                       MyRndGen.RndFlt()*15+y*15,
392                                                                           0);           
393                                        circles.push(new Circle(pos, MyRndGen.RndFlt()*4));
394                                }
395                        }
396                }
397               
398               
399                for (i in 0...Objs.length)
400                {
401                        var pos=new Vec3(i%Width,Math.floor(i/Width),-1);
402                        MyRndGen.Seed(cast(WorldPos.x+pos.x+WorldPos.y+pos.y*139,Int));
403                        var inside:Bool=false;
404                        for (c in circles)
405                        {
406                                if (c.Inside(pos)) pos.z=0;
407                        }
408
409                        Objs[i].LogicalPos=pos;
410                        Objs[i].UpdateTex(MyRndGen);
411            Objs[i].Update(0,this);
412                }
413
414        ClearPlants();         
415        }
416
417        public function AddServerPlant(pos:Vec3,type)
418        {       
419        if (MyName!=null && SpaceClear(pos))
420        {
421            var size=MyRndGen.RndFlt()+0.5;
422            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+
423                                         Std.string(cast(WorldPos.y,Int))+"/"+
424                                         Std.string(cast(pos.x,Int))+"/"+
425                                         Std.string(cast(pos.y,Int))+"/"+
426                                         type+"/"+
427                                         MyName+"/"+
428                                         Math.round(size*100),
429            this, function (c,data) {});       
430        }
431        }
432
433    public function ClearPlants() : Void
434    {
435        for (plant in Plants)
436        {
437            Remove(plant);
438        }
439        Plants = [];
440        }
441       
442        public function GetCube(pos:Vec3) : Cube
443        {
444                return Objs[cast(pos.x+pos.y*Width,Int)];
445        }
446               
447    public function SpaceClear(pos:Vec3)
448    {
449        for (plant in Plants)
450        {
451            if (plant.LogicalPos.Eq(pos)) return false;
452        }
453        return true;
454    }
455       
456        override public function Handle(e:Int)
457        {
458        super.Handle(e);
459        Update(0);
460        }
461
462    public function UpdateGhosts(c,t:Dynamic)
463    {
464        for(i in 0...t.length)
465        {
466            for (g in Spirits)
467            {
468                if (g.Name==t[i].name)
469                {
470                    g.UpdateEmotions(t[i]);
471                }
472            }
473        }
474    }
475
476    override function Update(time:Int)
477    {
478        super.Update(time);
479
480        Server.Update();
481
482        if (time>TickTime)
483        {
484            Server.Request("spirit-info",this,UpdateGhosts);
485
486            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/"
487            +Std.string(cast(WorldPos.y,Int)),
488            this,
489            function (c:truffle.World,d)
490            {
491                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>);
492                for (p in data)
493                {
494                    var e = c.Get(new Vec2(p.pos.x,p.pos.y));
495                    if (!Std.is(e,Plant))
496                    {
497                        var pos = new Vec3(p.pos.x,p.pos.y,e.LogicalPos.z+1);   
498                        var plant = new Plant(c,p.owner,pos,p.type,p.state);
499                        c.Plants.push(plant);                       
500                    }
501                    else
502                    {
503                        //trace("updating plant");
504                        cast(e,Plant).StateUpdate(p.state,c);
505                    }
506                }
507                c.SortScene();
508            });           
509           
510            TickTime=time+100;
511        }
512    }
513
514}
515
516//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
517
518class Fungi extends App
519{
520    public function new()
521        {
522//        Log.setColor(0xFFFFFF);
523        super(new FungiWorld(15,15));
524    }
525       
526    static function main()
527        {
528        var m:Fungi = new Fungi();
529    }
530}
Note: See TracBrowser for help on using the repository browser.