source: 2012/30/JesseN/Oma peli/OmaPeli/OmaPeli/OmaPeli/OmaPeli.cs @ 3816

Revision 3816, 19.8 KB checked in by anlakane, 9 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class MetalFist : PhysicsGame
10{
11    PlatformCharacter hahmo;
12    Maavihu frog;
13    Image hahmostand = LoadImage("CharStand32");
14    Image[] hahmojuoksu = LoadImages("CharRun1", "CharRun2", "CharRun3");
15    Image hahmojump = LoadImage("CharJump");
16    Image hahmofall = LoadImage("CharJump");
17    Image panos = LoadImage("Bullet");
18    Image tahtaa = LoadImage("CharShoot32bit");
19    Image[] flyer = LoadImages("EnemyFlying1", "EnemyFlying2", "EnemyFlying3", "EnemyFlying4");
20    Image[] frogi = LoadImages("EnemyLand1", "EnemyLand2");
21    Image[] fullmetalli = LoadImages("FullMetal", "FullMetal", "FullMetal");
22
23    Image vesiblock = LoadImage("Water");
24    Image puublock = LoadImage("Wood");
25    Image ruohoblock = LoadImage("Grass");
26    Image multablock = LoadImage("Dirt");
27    Image lehdetblock = LoadImage("Leaves");
28    Image panos2 = LoadImage("Bullet2");
29    Image kiviblock = LoadImage("Stone");
30    Image kattokivi1block = LoadImage("StoneCeiling");
31    Image kattokivi2block = LoadImage("StoneCeiling2");
32    Image kattokivi3block = LoadImage("StoneCeiling3");
33    Image takakiviblock = LoadImage("StoneBackground");
34    Image luolakiviblock1 = LoadImage("StoneCeilingBack1");
35    Image luolakiviblock2 = LoadImage("StoneCeilingBack2");
36    Image luolakiviblock3 = LoadImage("StoneCeilingBack3");
37    Image borderblock = LoadImage("BorderWall");
38    Image ammolaatikko = LoadImage("AmmoBox");
39    Image taustakuva = LoadImage("CloudBackground");
40    Image hpsalkku = LoadImage("Briefcase");
41    Image enemygun = LoadImage("EnemyGun");
42    IntMeter pistelaskuri;
43    Animation hahmoosuma;
44    Animation fullimetalli;
45    ExplosionSystem rajahdys;
46
47    DoubleMeter elamaLaskuri;
48    IntMeter ammuslaskuri;
49    EasyHighScore topLista;
50
51
52    public override void Begin()
53    {
54        ClearAll();
55        topLista =  new EasyHighScore();
56        topLista.HighScoreWindow.Closed += delegate { Begin(); };
57
58        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
59"Aloita peli", "Parhaat pisteet", "Lopeta");
60        Add(alkuValikko);
61
62        alkuValikko.ItemSelected += PainettiinValikonNappia;
63
64        PhoneBackButton.Listen(ConfirmExit, "Lopeta Peli");
65        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
66    }
67
68    void PainettiinValikonNappia(int valinta)
69    {
70        switch (valinta)
71        {
72            case 0:
73                Luokentta();
74                break;
75            case 1:
76                topLista.Show();
77                break;
78            case 2:
79                Exit();
80                break;
81        }
82    }
83
84    void Alkuvalikkoon()
85    {
86        Camera.Zoom(1.0);
87        ClearAll();
88        Begin();
89        return;
90    }
91    void LuoTausta()
92    {
93        GameObject tausta = new GameObject(Level.Width, Level.Height);
94        tausta.Image = taustakuva;
95        Add(tausta, -3);
96        Layers[-3].RelativeTransition = new Vector(0.5, 0.5);
97    }
98
99    void Luokentta()
100    {
101
102        ammuslaskuri = new IntMeter(30);
103
104
105        LuoElamaLaskuri();
106        Luoammustenmaara();
107        LuoPisteLaskuri();
108
109        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("Level1");
110
111        ruudut.SetTileMethod(Color.BrightGreen, LuoRuoho);
112        ruudut.SetTileMethod(Color.Cyan, LuoVesi);
113        ruudut.SetTileMethod(Color.Red, LuoVihollinen);
114        ruudut.SetTileMethod(Color.DarkBlue, LuoLehdet);
115        ruudut.SetTileMethod(Color.HanPurple, LuoPuu);
116        ruudut.SetTileMethod(Color.Black, LuoMulta);
117        ruudut.SetTileMethod(Color.Orange, LuoPelaaja);
118        ruudut.SetTileMethod(Color.Rose, LuoKivi);
119
120        ruudut.SetTileMethod(Color.Gray, LuoKattoKivi1);
121        ruudut.SetTileMethod(Color.BrownGreen, LuoKattoKivi2);
122        ruudut.SetTileMethod(Color.Olive, LuoKattoKivi3);
123        ruudut.SetTileMethod(Color.DarkRed, LuoTakakivi);
124        ruudut.SetTileMethod(Color.ForestGreen, Luoluolakivi1);
125        ruudut.SetTileMethod(Color.DarkGray, Luoluolakivi2);
126        ruudut.SetTileMethod(Color.DarkJungleGreen, Luoluolakivi3);
127        ruudut.SetTileMethod(Color.YellowGreen, LuoBorderwall);
128        ruudut.SetTileMethod(Color.SpringGreen, LuoAmmuslaatikko);
129        ruudut.SetTileMethod(Color.Purple, LuoMaaVihu);
130        Camera.Reset();
131        Camera.Zoom(1.1);
132        Camera.StayInLevel = true;
133
134        ruudut.Execute(45, 45);
135        int pMaxMaara = 200;
136        rajahdys = new ExplosionSystem(LoadImage("Explosion"), pMaxMaara);
137        rajahdys.MaxVelocity = 1;
138        Add(rajahdys);
139        LuoTausta();
140    }
141
142    void LuoAmmuslaatikko(Vector paikka, double leveys, double korkeus)
143    {
144        PhysicsObject ammobox = new PhysicsObject(32, 32);
145        ammobox.Position = paikka;
146        ammobox.Image = ammolaatikko;
147        ammobox.CollisionIgnoreGroup = 0;
148        ammobox.Tag = "Ammo";
149        Add(ammobox);
150    }
151
152    void LuoHPsalkku(Vector paikka, double leveys, double korkeus)
153    {
154        PhysicsObject hpbox = new PhysicsObject(32, 32);
155        hpbox.Position = paikka;
156        hpbox.Image = hpsalkku;
157        hpbox.CollisionIgnoreGroup = 0;
158        hpbox.Tag = "HP";
159        Add(hpbox);
160    }
161
162
163    void Luoluolakivi1(Vector paikka, double leveys, double korkeus)
164    {
165        PhysicsObject luolakivi1 = PhysicsObject.CreateStaticObject(leveys, korkeus);
166        luolakivi1.Position = paikka;
167        luolakivi1.Image = luolakiviblock1;
168        luolakivi1.CollisionIgnoreGroup = 1;
169        luolakivi1.IgnoresCollisionResponse = true;
170        Add(luolakivi1, -1);
171    }
172
173    void LuoBorderwall(Vector paikka, double leveys, double korkeus)
174    {
175        PhysicsObject borderseina = PhysicsObject.CreateStaticObject(leveys, korkeus);
176        borderseina.Position = paikka;
177        borderseina.Image = borderblock;
178        borderseina.CollisionIgnoreGroup = 1;
179        Add(borderseina, -1);
180    }
181
182
183
184
185    void Luoluolakivi2(Vector paikka, double leveys, double korkeus)
186    {
187        PhysicsObject luolakivi2 = PhysicsObject.CreateStaticObject(leveys, korkeus);
188        luolakivi2.Position = paikka;
189        luolakivi2.Image = luolakiviblock2;
190        luolakivi2.CollisionIgnoreGroup = 1;
191        luolakivi2.IgnoresCollisionResponse = true;
192        Add(luolakivi2, -1);
193    }
194
195    void Luoluolakivi3(Vector paikka, double leveys, double korkeus)
196    {
197        PhysicsObject luolakivi3 = PhysicsObject.CreateStaticObject(leveys, korkeus);
198        luolakivi3.Position = paikka;
199        luolakivi3.Image = luolakiviblock3;
200        luolakivi3.CollisionIgnoreGroup = 1;
201        luolakivi3.IgnoresCollisionResponse = true;
202        Add(luolakivi3, -1);
203    }
204
205
206    void LuoKattoKivi1(Vector paikka, double leveys, double korkeus)
207    {
208        PhysicsObject kattokivi1 = PhysicsObject.CreateStaticObject(leveys, korkeus);
209        kattokivi1.Position = paikka;
210        kattokivi1.Image = kattokivi1block;
211        kattokivi1.CollisionIgnoreGroup = 1;
212        kattokivi1.IgnoresCollisionResponse = true;
213        Add(kattokivi1, -1);
214    }
215
216    void LuoKattoKivi2(Vector paikka, double leveys, double korkeus)
217    {
218        PhysicsObject kattokivi2 = PhysicsObject.CreateStaticObject(leveys, korkeus);
219        kattokivi2.Position = paikka;
220        kattokivi2.Image = kattokivi2block;
221        kattokivi2.CollisionIgnoreGroup = 1;
222        kattokivi2.IgnoresCollisionResponse = true;
223        Add(kattokivi2, -1);
224    }
225
226    void LuoKattoKivi3(Vector paikka, double leveys, double korkeus)
227    {
228        PhysicsObject kattokivi3 = PhysicsObject.CreateStaticObject(leveys, korkeus);
229        kattokivi3.Position = paikka;
230        kattokivi3.Image = kattokivi3block;
231        kattokivi3.CollisionIgnoreGroup = 1;
232        kattokivi3.IgnoresCollisionResponse = true;
233        Add(kattokivi3, -1);
234    }
235
236
237
238    void LuoKivi(Vector paikka, double leveys, double korkeus)
239    {
240
241        PhysicsObject kivi = PhysicsObject.CreateStaticObject(leveys, korkeus);
242        kivi.Position = paikka;
243        kivi.Image = kiviblock;
244        kivi.CollisionIgnoreGroup = 1;
245        Add(kivi);
246
247    }
248
249    void LuoPelaaja(Vector paikka, double leveys, double korkeus)
250    {
251        hahmo = new PlatformCharacter(48, 48);
252        hahmo.AnimWalk = new Animation(hahmojuoksu);
253        hahmo.AnimWalk.FPS = 10;
254        hahmo.AnimIdle = new Animation(hahmostand);
255        hahmo.AnimJump = new Animation(hahmojump);
256        hahmo.AnimFall = new Animation(hahmofall);
257        hahmo.Weapon = new LaserGun(30, 30);
258        hahmo.Weapon.Ammo.Value = 30;
259        hahmo.Weapon.Image = null;
260        hahmo.Weapon.Color = Color.Transparent;
261        hahmo.Weapon.Power.DefaultValue = 1000;
262        hahmo.Weapon.CanHitOwner = false;
263        AddCollisionHandler<PlatformCharacter, PhysicsObject>(hahmo, "Ammo", Ammuksia);
264        AddCollisionHandler<PlatformCharacter, PhysicsObject>(hahmo, "HP", Hpta); 
265        AddCollisionHandler<PlatformCharacter, PhysicsObject>(hahmo, "Vesi", Vesi2 );
266        AddCollisionHandler<PlatformCharacter, PhysicsObject>(hahmo, "vihollinen", OsumaPelaajaan);
267        fullimetalli = new Animation(fullmetalli);
268        fullimetalli.FPS = 9;
269
270        Image[] hahmodmg = LoadImages("CharHit", "CharHit2", "CharHit3");
271        hahmoosuma = new Animation(hahmodmg);
272        Add(hahmo);
273        hahmo.Position = paikka;
274        Gravity = new Vector(0.0, -1000.0);
275        Ohjaus();
276        Camera.Follow(hahmo);
277    }
278
279    void OsumaPelaajaan(PlatformCharacter hahmo, PhysicsObject lentava )
280    {
281        elamaLaskuri.Value -= 1;
282        hahmo.PlayAnimation(hahmoosuma);
283    }
284
285
286    void LuoPisteLaskuri()
287    {
288        pistelaskuri = new IntMeter(0);
289        Label pisteNaytto = new Label();
290        pisteNaytto.X = Screen.Left + 61;
291        pisteNaytto.Y = Screen.Top - 45;
292        pisteNaytto.TextColor = Color.White;
293        pisteNaytto.Color = Color.Black;
294        pisteNaytto.BindTo(pistelaskuri);
295        pisteNaytto.Size = new Vector(28, 40);
296        pisteNaytto.Title = "Points";
297        Add(pisteNaytto);
298    }
299
300
301    void Vesi2(PlatformCharacter hahmo, PhysicsObject vesi)
302    {
303        hahmo.Hit(new Vector(0, 120));
304    }
305
306    void Hpta(PlatformCharacter hahmo, PhysicsObject hpbox)
307    {
308        hpbox.Destroy();
309
310        elamaLaskuri.Value += 2;
311    }
312
313    void Ammuksia(PlatformCharacter hahmo, PhysicsObject ammobox)
314    {
315        ammobox.Destroy();
316        hahmo.Weapon.Ammo.Value += 20;
317        ammuslaskuri.Value += 20;
318    }
319
320    void LuoMulta(Vector paikka, double leveys, double korkeus)
321    {
322        PhysicsObject multa = PhysicsObject.CreateStaticObject(leveys, korkeus);
323        multa.Position = paikka;
324        multa.Image = multablock;
325        multa.CollisionIgnoreGroup = 1;
326        Add(multa);
327
328
329
330    }
331
332
333
334    void LuoRuoho(Vector paikka, double leveys, double korkeus)
335    {
336        PhysicsObject ruoho = PhysicsObject.CreateStaticObject(leveys, korkeus);
337        ruoho.Position = paikka;
338        ruoho.Image = ruohoblock;
339        ruoho.CollisionIgnoreGroup = 1;
340        Add(ruoho);
341    }
342
343    void LuoPuu(Vector paikka, double leveys, double korkeus)
344    {
345        GameObject puu = new GameObject(leveys, korkeus);
346        puu.Position = paikka;
347        puu.Image = puublock;
348        Add(puu, -1);
349    }
350
351    void LuoLehdet(Vector paikka, double leveys, double korkeus)
352    {
353        GameObject lehdet = new GameObject(leveys, korkeus);
354        lehdet.Position = paikka;
355        lehdet.Image = lehdetblock;
356        Add(lehdet, -1);
357    }
358
359    void LuoVesi(Vector paikka, double leveys, double korkeus)
360    {
361        PhysicsObject vesi = PhysicsObject.CreateStaticObject(leveys, korkeus);
362        vesi.Position = paikka;
363        vesi.Image = vesiblock;
364        vesi.IgnoresCollisionResponse = true;
365        vesi.Tag = "Vesi";
366        Add(vesi, -1);
367    }
368
369    void LuoTakakivi(Vector paikka, double leveys, double korkeus)
370    {
371        GameObject takakivi = new GameObject(leveys, korkeus);
372        takakivi.Position = paikka;
373        takakivi.Image = takakiviblock;
374        Add(takakivi, -1);
375    }
376
377        void LuoMaaVihu(Vector paikka, double leveys, double korkeus)
378    {
379        Maavihu frog = new Maavihu(50, 50);
380        frog.Position = paikka;
381        frog.Animation = new Animation(frogi);
382        frog.Shape = Shape.Circle;
383        frog.Animation.Start();
384        LaserGun frogun = new LaserGun(30, 20);
385        frog.CanRotate = false;
386        frogun.Ammo.Value = 10000;
387        frogun.Image = enemygun;
388        frogun.Color = Color.Transparent;
389        frogun.Y = -10;
390        frog.Add(frogun);
391        frog.Tag = "vihollinen";
392
393
394
395        frogun.Destroyed += delegate { vihollinen2tuhottu(frog); };
396        /*RandomMoverBrain satunnaisAivot = new RandomMoverBrain(200);
397        satunnaisAivot.ChangeMovementSeconds = 3;
398        frog.Brain = satunnaisAivot; */
399        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
400        tasoAivot.Speed = 100;
401        frog.Brain = tasoAivot;
402        Timer ajastin2 = new Timer();
403        ajastin2.Interval = 1.7;
404        ajastin2.Timeout += delegate { VihollinenAmpuu(frog, frogun, ajastin2); };
405        ajastin2.Start();
406        Add(frog);
407    }
408
409    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
410    {
411        Vihuclass lentava = new Vihuclass(50, 50);
412        lentava.Position = paikka;
413        lentava.Shape = Shape.Circle;
414        FollowerBrain seuraajanAivot1 = new FollowerBrain(hahmo);
415        seuraajanAivot1.Speed = 100;
416        lentava.IgnoresGravity = true;
417        seuraajanAivot1.DistanceFar = 500;
418        seuraajanAivot1.DistanceClose = 100;
419        seuraajanAivot1.StopWhenTargetClose = true;
420        //seuraajanAivot1.TargetClose += vihulahella;
421        lentava.Animation = new Animation(flyer);
422        lentava.Animation.Start();
423        lentava.Animation.FPS = 10;
424        lentava.CanRotate = false;
425        lentava.Brain = seuraajanAivot1;
426        LaserGun lentavagun = new LaserGun(10, 10);
427        lentavagun.Ammo.Value = 10000;
428        //lentavagun.ProjectileCollision = AmmusOsui;
429        lentavagun.Image = null;
430        lentavagun.Color = Color.Transparent;
431        lentava.Tag = "vihollinen";
432        lentava.Destroyed += delegate { vihollinen1tuhottu(lentava); };
433        lentava.Destroyed += delegate { if (RandomGen.NextBool()) LuoHPsalkku(lentava.Position, leveys, korkeus); };
434
435        lentava.Add(lentavagun);
436
437        Timer ajastin = new Timer();
438        ajastin.Interval = 2.0;
439        ajastin.Timeout += delegate { VihollinenAmpuu(lentava, lentavagun, ajastin); };
440        ajastin.Start();
441        Add(lentava);
442    }
443   
444    void vihollinen1tuhottu(Vihuclass paikka)
445    {
446        int pMaara = 50;
447        rajahdys.AddEffect(paikka.Position, pMaara);
448        pistelaskuri.Value += 10;
449    }
450
451    void vihollinen2tuhottu(Maavihu paikka)
452    {
453        int pMaara = 50;
454        rajahdys.AddEffect(paikka.Position, pMaara);
455        pistelaskuri.Value += 20;
456    }
457    void AmmusViholliseen(PhysicsObject ammus, Vihuclass lentava)
458    {
459        lentava.Hitpoints.Value -= 1;
460
461    }
462
463    void AmmusViholliseen2(PhysicsObject ammus, Maavihu frog)
464    {
465        frog.Hitpoints2.Value -= 1;
466
467    }
468
469    void AmmusPelaajaan(PhysicsObject ammus2, PlatformCharacter hahmo)
470    {
471        elamaLaskuri.Value -= 1;
472        hahmo.PlayAnimation(hahmoosuma);
473        //hahmo.PlayAnimation(...);
474    }
475
476
477
478    void VihollinenAmpuu(PhysicsObject lentava, LaserGun lentavagun, Timer ajastin)
479    {
480        if (lentava.IsDestroyed == true)
481        {
482            ajastin.Stop();
483            return;
484        }
485
486        Vector suunta = (hahmo.Position - lentava.Position);
487        if (suunta.Magnitude < 600)
488        {
489            lentavagun.Angle = suunta.Angle;
490            PhysicsObject ammus2 = lentavagun.Shoot();
491
492            if (ammus2 != null)
493            {
494                ammus2.Shape = Shape.Circle;
495                ammus2.Size = new Vector(10, 10);
496                ammus2.Image = panos2;
497                AddCollisionHandler(ammus2, CollisionHandler.DestroyObject);
498                AddCollisionHandler(ammus2, hahmo, AmmusPelaajaan);
499
500
501
502            }
503        }
504    }
505
506    void Vihollinen2Ampuu(PlatformCharacter frog, LaserGun frogun, Timer ajastin2)
507    {
508        if (frog.IsDestroyed == true)
509        {
510            ajastin2.Stop();
511            return;
512        }
513
514        Vector suunta = (hahmo.Position - frog.Position);
515        if (suunta.Magnitude < 600)
516        {
517            frogun.Angle = suunta.Angle;
518            PhysicsObject ammus2 = frogun.Shoot();
519
520            if (ammus2 != null)
521            {
522                ammus2.Shape = Shape.Circle;
523                ammus2.Size = new Vector(10, 10);
524                ammus2.Image = panos2;
525                AddCollisionHandler(ammus2, CollisionHandler.DestroyObject);
526                AddCollisionHandler(ammus2, hahmo, AmmusPelaajaan);
527
528
529
530            }
531        }
532    }
533
534
535
536
537
538    void Ohjaus()
539    {
540        Keyboard.Listen(Key.Left, ButtonState.Down, LiikutaHahmoa, "Pelaaja liiku vasemmalle", -400.0);
541        Keyboard.Listen(Key.Right, ButtonState.Down, LiikutaHahmoa, "Pelaaja liiku oikealle", 400.0);
542        Keyboard.Listen(Key.Space, ButtonState.Pressed, hyppy, "Pelaaja hyppää", 650.0);
543        Keyboard.Listen(Key.S, ButtonState.Pressed, AmmuAseella, "Ammu", hahmo);
544        Keyboard.Listen(Key.T, ButtonState.Pressed, Alkuvalikkoon, "Palaa valikkoon");
545        Keyboard.Listen(Key.Down, ButtonState.Pressed, fullmetal, "Full metal - muoto");
546    }
547
548    void fullmetal()
549    {
550        hahmo.PlayAnimation(fullimetalli);
551        hahmo.Hit(new Vector(0, -1000));
552
553    }
554
555    void LiikutaHahmoa(double vektori)
556    {
557        hahmo.Walk(vektori);
558    }
559
560    void hyppy(double hyppyvoima)
561    {
562        hahmo.Jump(hyppyvoima);
563    }
564
565    void AmmuAseella(PlatformCharacter hahmo)
566    {
567        PhysicsObject ammus = hahmo.Weapon.Shoot();
568        hahmo.PlayAnimation(tahtaa);
569        //hahmo.Animation = new Animation(tahtaa);
570        //hahmo.Animation.Start(1);
571        ammuslaskuri.Value -= 1;
572
573        if (ammus != null)
574        {
575            ammus.Shape = Shape.Circle;
576            ammus.Size = new Vector(10, 10);
577            ammus.Image = panos;
578            AddCollisionHandler(ammus, CollisionHandler.DestroyObject);
579            AddCollisionHandler<PhysicsObject, Vihuclass>(ammus, "vihollinen", AmmusViholliseen);
580            AddCollisionHandler<PhysicsObject, Maavihu>(ammus, "vihollinen2", AmmusViholliseen2);
581
582        }
583    }
584
585    void LuoElamaLaskuri()
586    {
587        elamaLaskuri = new DoubleMeter(6);
588        elamaLaskuri.MaxValue = 6;
589        elamaLaskuri.LowerLimit += ElamaLoppui;
590
591        ProgressBar elamaPalkki = new ProgressBar(140, 40);
592        elamaPalkki.X = Screen.Left + 88;
593        elamaPalkki.Y = Screen.Top - 100;
594        elamaPalkki.BindTo(elamaLaskuri);
595        elamaPalkki.Image = LoadImage("HPbarEmpty");
596        elamaPalkki.BarImage = LoadImage("HPbarFull");
597        Add(elamaPalkki);
598    }
599
600    void ElamaLoppui()
601    {
602        MessageDisplay.Add("You were destroyed. Game Over.");
603        int pMaara = 50;
604        rajahdys.AddEffect(hahmo.Position, pMaara);
605        hahmo.Destroy();
606        topLista.EnterAndShow(pistelaskuri.Value);
607    }
608
609
610    void Luoammustenmaara()
611    {
612
613        Label ammustenmaara = new Label();
614        ammustenmaara.X = Screen.Left + 100;
615        ammustenmaara.Y = Screen.Top - 70;
616        ammustenmaara.TextColor = Color.White;
617        ammustenmaara.Color = Color.Black;
618        ammustenmaara.BindTo(ammuslaskuri);
619        ammustenmaara.Title = "Ammunition";
620        Add(ammustenmaara);
621    }
622
623   
624}
Note: See TracBrowser for help on using the repository browser.