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

Revision 873, 13.3 KB checked in by dave, 10 years ago (diff)

larger visible world, hacked plant types, lazy stack problem possibly fixed

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        Spr.parent.addChild(tf);
88        tf.visible=false;
89        Spr.MouseOver(this,function(c) { tf.visible=true; });
90        Spr.MouseOut(this,function(c) { tf.visible=false; });
91        }
92
93    public function StateUpdate(state,world:World)
94    {
95        State=state;
96        if (State!="decayed")
97        {
98            Spr.ChangeBitmap(Resources.Get(PlantType+"-"+State));
99        }
100        if (State=="fruit-c" && Seeds.length==0)
101        {
102            Fruit(world);
103        }
104    }
105
106    override function Destroy(world:World)
107    {
108        super.Destroy(world);
109        for (seed in Seeds)
110        {
111            world.RemoveSprite(seed);
112        }
113    }
114       
115        public override function Update(frame:Int, world:World)
116        {
117                super.Update(frame,world);
118        }
119
120    public function Fruit(world:World)
121    {
122        var f=new Sprite(Spr.Pos.Add(new Vec2(0,-Spr.Height/2)),
123                         Resources.Get("seed"));
124        world.AddSprite(f);
125        Seeds.push(f);
126        f.MouseDown(this,function(p)
127        {           
128            if (world.MyName!="")
129            {
130                var s=new Seed(p.PlantType);
131                if (world.Seeds.Add(world,s))
132                {
133                    p.Seeds.remove(f);
134                    world.RemoveSprite(f);
135                }
136            }
137        });
138    }
139}
140
141//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142
143class Ghost extends SpriteEntity
144{
145    public var Name:String;
146    var Debug:flash.text.TextField;
147    public var TexBase:String;
148       
149        public function new(world:World, name:String,pos)
150        {
151        TexBase="ghost-"+name.toLowerCase();
152                super(world,pos,Resources.Get(TexBase));
153        Name = name;
154
155        Debug = new flash.text.TextField();
156        Debug.wordWrap=true;
157        Debug.y=-50;
158        Debug.width=300;
159        Debug.text = "nothing yet";
160        Spr.addChild(Debug);
161        }
162
163    public function UpdateEmotions(e:Dynamic)
164    {
165        var ee = e.emotions.content;
166        var mood=Std.parseFloat(ee[0].content[0]);
167        if (mood>1) Spr.ChangeBitmap(Resources.Get(TexBase+"-happy"));
168        else if (mood<-1) Spr.ChangeBitmap(Resources.Get(TexBase+"-sad"));
169        else Spr.ChangeBitmap(Resources.Get(TexBase));
170
171        Debug.text=Name+"\nMood:"+ee[0].content[0]+"\n";
172
173        for (i in 1...ee.length)
174        {
175            Debug.text+=ee[i].attrs.type+" "+ee[i].attrs.direction+"\n";
176            Debug.text+=ee[i].attrs.cause+"\n";
177        }
178    }
179}
180
181//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
182
183class Seed
184{
185    public var Type:String;
186    public var Spr:Sprite;
187
188    public function new(t:String)
189    {
190        Type=t;
191        Spr=new Sprite(new Vec2(0,0),Resources.Get("seed"));
192    }
193}
194
195class SeedStore
196{
197    var Seeds:Array<Seed>;
198    var Size:Int;
199
200    public function new(size:Int)
201    {
202        Seeds = [];
203        Size = size;
204    }
205
206    public function Add(world:World,s:Seed) : Bool
207    {
208        if (Seeds.length<Size)
209        {
210            Seeds.push(s);
211            s.Spr.SetPos(new Vec2(20+Seeds.length*10,30));
212            //cast(world,truffle.flash.FlashWorld).addSprite(s.Spr);
213            //trace("did it...");
214            s.Spr.Update(0,null);
215            return true;
216        }
217        return false;
218    }
219
220    public function Remove(world:World) : String
221    {
222        if (Seeds.length>0)
223        {
224            var s = Seeds.pop();
225//            world.RemoveSprite(s.Spr);
226            return s.Type;
227        }
228        else
229        {
230            return "";
231        }
232    }
233}
234
235//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
236
237class FungiWorld extends World
238{
239        public var Width:Int;
240        public var Height:Int;
241        var Objs:Array<Cube>;
242        public var WorldPos:Vec3;
243        var MyRndGen:RndGen;
244        public var MyTextEntry:TextEntry;
245        public var Plants:Array<Plant>;
246        var MyName:String;
247    var Frame:Int;
248    var TickTime:Int;
249    var Ghosts:Array<Ghost>;
250    public var Seeds:SeedStore;
251    var Server : ServerConnection;
252
253        public function new(w:Int, h:Int)
254        {
255                super();
256                Frame=0;
257        TickTime=0;
258                Width=w;
259                Height=h;
260                Plants = [];
261        Objs = [];
262        Ghosts = [];
263        Seeds = new SeedStore(1);
264                WorldPos = new Vec3(0,0,0);
265                MyRndGen = new RndGen();
266        Server = new ServerConnection();
267        MyName = "";
268
269        var arrow1 = new SpriteEntity(this,new Vec3(7,-2,1), Resources.Get("arr3"));
270        arrow1.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,-1,0))); });
271        arrow1.Spr.MouseOver(this,function(c) { arrow1.Spr.SetScale(new Vec2(1.1,1.1)); arrow1.Spr.Update(0,null); });
272        arrow1.Spr.MouseOut(this,function(c) { arrow1.Spr.SetScale(new Vec2(1,1)); arrow1.Spr.Update(0,null); });
273 
274        var arrow2=new SpriteEntity(this,new Vec3(10,21,1), Resources.Get("arr4"));
275        arrow2.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(0,1,0))); });
276        arrow2.Spr.MouseOver(this,function(c) { arrow2.Spr.SetScale(new Vec2(1.1,1.1)); arrow2.Spr.Update(0,null); });
277        arrow2.Spr.MouseOut(this,function(c) { arrow2.Spr.SetScale(new Vec2(1,1)); arrow2.Spr.Update(0,null); });
278 
279        var arrow3=new SpriteEntity(this,new Vec3(-2,7,1), Resources.Get("arr2"));
280        arrow3.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(-1,0,0))); });
281        arrow3.Spr.MouseOver(this,function(c) { arrow3.Spr.SetScale(new Vec2(1.1,1.1)); arrow3.Spr.Update(0,null); });
282        arrow3.Spr.MouseOut(this,function(c) { arrow3.Spr.SetScale(new Vec2(1,1)); arrow3.Spr.Update(0,null); });
283
284        var arrow4=new SpriteEntity(this,new Vec3(20,10,1), Resources.Get("arr1"));
285        arrow4.Spr.MouseUp(this,function(c) { c.UpdateWorld(c.WorldPos.Add(new Vec3(1,0,0))); });
286        arrow4.Spr.MouseOver(this,function(c) { arrow4.Spr.SetScale(new Vec2(1.1,1.1)); arrow4.Spr.Update(0,null); });
287        arrow4.Spr.MouseOut(this,function(c) { arrow4.Spr.SetScale(new Vec2(1,1)); arrow4.Spr.Update(0,null); });
288
289                for (y in 0...h)
290                {
291                        for (x in 0...w)
292                        {
293                                var ob:Cube = new Cube(this,new Vec3(0,0,0));
294             
295                ob.Spr.MouseDown(this,function(c)
296                {
297                    var type=c.Seeds.Remove(cast(c,truffle.World));
298                    if (type!="")
299                    {
300                        c.AddServerPlant(ob.LogicalPos.Add(new Vec3(0,0,1)),type);
301                    }
302                });
303                                Objs.push(ob);
304                        }
305                }
306
307                UpdateWorld(new Vec3(0,0,0));
308               
309        var Names = ["Vertical","Canopy","Cover"];
310/*       
311        for (i in 0...3)
312        {
313            var g = new Ghost(this,Names[i],new Vec3(2,(i*3)+2,1));
314            Ghosts.push(g);
315        }
316*/
317                MyTextEntry=new TextEntry(300,10,310,30,NameCallback);
318                addChild(MyTextEntry); 
319
320        Update(0);
321        SortScene();
322        Server.Request("spirit-sprites",this,UpdateSpiritSprites);
323        }
324       
325        public function NameCallback(name)
326        {
327                removeChild(MyTextEntry);
328                MyName=name;
329                //WorldClient.GetPlants(cast(WorldPos.x,Int),cast(WorldPos.y,Int));
330        }
331       
332        public function UpdateWorld(pos:Vec3)
333        {
334                WorldPos=pos;
335               
336                var circles = [];
337        for (x in -1...2)
338                {
339                        for (y in -1...2)
340                        {
341                                MyRndGen.Seed(cast((WorldPos.x+x)+(WorldPos.y+y)*139,Int));
342                                for (i in 0...5)
343                                {
344                                        var pos = new Vec3(MyRndGen.RndFlt()*15+x*15,
345                                       MyRndGen.RndFlt()*15+y*15,
346                                                                           0);           
347                                        circles.push(new Circle(pos, MyRndGen.RndFlt()*4));
348                                }
349                        }
350                }
351               
352               
353                for (i in 0...Objs.length)
354                {
355                        var pos=new Vec3(i%Width,Math.floor(i/Width),-1);
356                        MyRndGen.Seed(cast(WorldPos.x+pos.x+WorldPos.y+pos.y*139,Int));
357                        var inside:Bool=false;
358                        for (c in circles)
359                        {
360                                if (c.Inside(pos)) pos.z=0;
361                        }
362
363                        Objs[i].LogicalPos=pos;
364                        Objs[i].UpdateTex(MyRndGen);
365            Objs[i].Update(0,this);
366                }
367
368        ClearPlants();         
369        }
370
371        public function AddServerPlant(pos:Vec3,type)
372        {       
373        if (MyName!=null && SpaceClear(pos))
374        {
375            var size=MyRndGen.RndFlt()+0.5;
376            Server.Request("make-plant/"+Std.string(cast(WorldPos.x,Int))+"/"+
377                                         Std.string(cast(WorldPos.y,Int))+"/"+
378                                         Std.string(cast(pos.x,Int))+"/"+
379                                         Std.string(cast(pos.y,Int))+"/"+
380                                         type+"/"+
381                                         MyName+"/"+
382                                         Math.round(size*100),
383            this, function (c,data) {});       
384        }
385        }
386
387    public function ClearPlants() : Void
388    {
389        for (plant in Plants)
390        {
391            Remove(plant);
392        }
393        Plants = [];
394        }
395       
396        public function GetCube(pos:Vec3) : Cube
397        {
398                return Objs[cast(pos.x+pos.y*Width,Int)];
399        }
400       
401    public function UpdateSpiritSprites(c,data:Array<Dynamic>)
402    {
403        var sk:SkeletonEntity = new SkeletonEntity(this,new Vec3(0,5,4));
404        sk.NeedsUpdate=true;
405        sk.Build(this,data);
406        SortScene();
407     }
408       
409    public function SpaceClear(pos:Vec3)
410    {
411        for (plant in Plants)
412        {
413            if (plant.LogicalPos.Eq(pos)) return false;
414        }
415        return true;
416    }
417       
418        override public function Handle(e:Int)
419        {
420        super.Handle(e);
421        Update(0);
422        }
423
424    public function UpdateGhosts(t:Dynamic)
425    {
426        for(i in 0...t.length)
427        {
428            for (g in Ghosts)
429            {
430                if (g.Name==t[i].name)
431                {
432                    g.UpdateEmotions(t[i]);
433                }
434            }
435        }
436    }
437
438    override function Update(time:Int)
439    {
440        super.Update(time);
441
442        Server.Update();
443
444        if (time>TickTime)
445        {
446            //WorldClient.Call("agent-info",UpdateGhosts);
447
448            Server.Request("get-tile/"+Std.string(cast(WorldPos.x,Int))+"/"
449            +Std.string(cast(WorldPos.y,Int)),
450            this,
451            function (c:truffle.World,d)
452            {
453                var data:Array<Dynamic>=cast(d.entities,Array<Dynamic>);
454                for (p in data)
455                {
456                    var e = c.Get(new Vec2(p.pos.x,p.pos.y));
457                    if (!Std.is(e,Plant))
458                    {
459                        var pos = new Vec3(p.pos.x,p.pos.y,e.LogicalPos.z+1);   
460                        var plant = new Plant(c,p.owner,pos,p.type,p.state);
461                        c.Plants.push(plant);                       
462                    }
463                    else
464                    {
465                        //trace("updating plant");
466                        cast(e,Plant).StateUpdate(p.state,c);
467                    }
468                }
469                c.SortScene();
470            });           
471           
472            TickTime=time+100;
473        }
474    }
475
476}
477
478//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
479
480class Fungi extends App
481{
482    public function new()
483        {
484//        Log.setColor(0xFFFFFF);
485        super(new FungiWorld(15,15));
486    }
487       
488    static function main()
489        {
490        var m:Fungi = new Fungi();
491    }
492}
Note: See TracBrowser for help on using the repository browser.