source: 2015/24/ohjaajat/Dungeon/Dungeon/Dungeon/Dungeon.cs @ 6039

Revision 6039, 25.2 KB checked in by empaheik, 4 years ago (diff)
Line 
1using System;
2using System.Linq;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9using Point = Microsoft.Xna.Framework.Point;
10
11/* Tässä on jotain dokumentaation tapaista:
12 *
13 * Layerit
14 *   3 - Kaivuunuoli ja partikkeliefektit
15 *   2 - Partikkelien varjot
16 *   1 - Huoneiden katto
17 *   0 - Huoneiden seinät ja barbaarit
18 *  -1 - Päivitykset
19 *  -2 - Huone (eli lattiat siis)
20*/
21
22/// <summary>
23/// Päivitys joka voi olla huoneessa.
24/// </summary>
25public abstract class Upgrade : GameObject
26{
27    public int Price { get; set; }
28
29    public Upgrade()
30        : base(Dungeon.RUUDUN_KOKO, Dungeon.RUUDUN_KOKO)
31    {
32    }
33
34    /// <summary>
35    /// Tätä kutsutaan kun päivitys on rakennettu huoneeseen.
36    /// </summary>
37    public virtual void Built(Dungeon peli) { }
38
39    /// <summary>
40    /// Tätä kutsutaan kun barbaari tulee kylään
41    /// </summary>
42    public virtual void Invasion(Dungeon peli, Barbaari barbaari, Room huone) { }
43}
44
45class TrapUpgrade : Upgrade
46{
47    public int Damage { get; set; }
48
49    public override void Invasion(Dungeon peli, Barbaari barbaari, Room huone)
50    {
51        peli.barbaarit.Remove(barbaari);
52        barbaari.Destroy(); //TODO: Mitä nyt oikeasti tapahtuu, kun barbaari astuu ansaan. Meidän tapauksessa kai tapetaan saman tien.
53        peli.Splatter(huone.Position);
54
55        this.Animation.Start(1);
56
57        if(peli.barbaarit.Count < 1)
58        {
59            peli.kierrosKaynnissa = false;
60            //peli.
61        }
62    }
63}
64
65class CultureUpgrade : Upgrade
66{
67    // Tämän päivityksen antama kultuurin määrä.
68    public IntMeter Culture { get; set; }
69
70    // Label joka näyttää päivityksen antaman kultuurin määrän.
71    public Label KultuuriNaytto { get; set; }
72
73    public override void Built(Dungeon peli)
74    {
75        base.Built(peli);
76
77        Culture = new IntMeter(0, 0, 1000);
78
79        // Luodaan kultuurin ilmaisin.
80        KultuuriNaytto = new Label("asd");
81        KultuuriNaytto.TextColor = Color.HotPink;
82        KultuuriNaytto.Color = Color.Black;
83        KultuuriNaytto.Position = this.Position + new Vector(0, Dungeon.RUUDUN_KOKO * 0.5);
84        KultuuriNaytto.BindTo(Culture);
85        peli.Add(KultuuriNaytto);
86
87        // Näytetään kultuurin määrä kun hiiri on päivityksen päällä.
88        var kuuntelija = peli.Mouse.ListenMovement(0.1, _ => KultuuriNaytto.IsVisible = peli.Mouse.IsCursorOn(this), null);
89
90        this.Destroyed += delegate
91        {
92            KultuuriNaytto.Destroy();
93            kuuntelija.Destroy();
94        };
95    }
96
97    public override void Invasion(Dungeon peli, Barbaari barbaari, Room huone)
98    {
99        this.Destroy();
100        peli.kohteet.Remove(huone);
101        if (peli.kohteet.Count < 1)
102        {
103            peli.LopetaPeli();
104        }
105    }
106}
107
108public class Room : GameObject
109{
110    // Sijainti pelin ruudukossa.
111    public Point Location { get; set; }
112
113    // Päällä näkyvä "katto" kun huone ei ole vielä kaivettu.
114    public GameObject Roof { get; set; }
115
116    // Neljä seinää, jotka on GameObjekteja.
117    public Dictionary<Direction, GameObject> Walls { get; set; }
118
119    // Huoneen sisältämä päivitys.
120    public Upgrade Upgrade { get; set; }
121
122    private bool dug; // Onko huone kaivettu?
123    public bool Dug
124    {
125        get { return dug; }
126        set
127        {
128            dug = value;
129            Roof.IsVisible = !Dug;
130        }
131    }
132
133    public Room(Point paikka)
134        : base(Dungeon.RUUDUN_KOKO, Dungeon.RUUDUN_KOKO)
135    {
136        Walls = new Dictionary<Direction, GameObject>();
137        Location = paikka;
138    }
139}
140
141public class Barbaari : GameObject
142{
143    public List<Point> Reitti { get; set; }
144
145    public Barbaari(double width, double height)
146        : base(width, height)
147    {
148        Reitti = new List<Point>();
149    }
150
151    public int Askel { get; set; }
152
153    private Room kohde;
154    public Room Kohde
155    {
156        get { return kohde; }
157        set { kohde = value; }
158    }
159    public Point Location
160    {
161        get;
162        set;
163    }
164
165}
166
167public class Dungeon : PhysicsGame
168{
169    public const int RUUDUN_KOKO = 64;
170
171    #region Kuvat
172    Image lattiaKuva = LoadImage("floor");
173    Image seinaKuva = LoadImage("wall");
174    Image reikaSeinaKuva = LoadImage("wallhole");
175    Image kiviKuva = LoadImage("rock");
176    //static Image kulttuuriKuva1 = LoadImage("es");
177    //static Image kulttuuriKuva2 = LoadImage("nyan");
178    //static Image kulttuuriKuva3 = LoadImage("spurdo");
179    Image[] kultuuriKuvat = LoadImages("nyan", "es", "spurdo");
180    Image[] ansaKuvat = LoadImages((from i in Enumerable.Range(1, 7) select String.Format("piikit{0:0000}", i)).ToArray());
181    Image[] vihuKuvat = LoadImages((from i in Enumerable.Range(1, 10) select String.Format("v{0:0000}", i)).ToArray());
182    Image partikkeli = LoadImage("partikkeli");
183    Image taideVeri = LoadImage("taideveri");
184    #endregion
185
186    int[] hinnat = new int[] { 100, 200, 300, 100};
187    private int barbaariMaara = 2;
188
189    public bool kierrosKaynnissa = false;
190
191    Room[,] huoneet;
192    public List<Room> kohteet = new List<Room>();
193    public List<Barbaari> barbaarit = new List<Barbaari>();
194    Room spawn;
195    Timer barbaariAjastin = new Timer();
196    Upgrade ostamassa;
197    Point digStart; // Huoneen sijainti, josta kaivuu aloitetaan.
198    bool digging = false;
199
200    GameObject digArrow;
201    GameObject digArrowHead;
202
203    IntMeter kultuuri = new IntMeter(1000, 0, 2000);
204
205    const int VAAKA_HUONEET = 12;
206    const int PYSTY_HUONEET = 8;
207
208    // Paljonko peliruudukko on siirtynyt origosta.
209    Vector huoneSiirtyma = new Vector(-300, 0);
210
211    public override void Begin()
212    {
213        ClearAll();
214        Kontrollit();
215        UlkoAsuRoskaa();
216        Kauppa();
217        Nuoli();
218
219        // Luodaan huoneet ruutuihin.
220        huoneet = new Room[VAAKA_HUONEET, PYSTY_HUONEET];
221        foreach (var paikka in RuutujenPaikat())
222        {
223            var huone = CreateRoom(paikka);
224            Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Pressed, () => RoomPressed(huone), null);
225            Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Released, () => RoomReleased(huone), null);
226            huoneet[paikka.X, paikka.Y] = huone;
227        }
228
229        LuoSpawn();
230
231        Timer sykliAjastin = new Timer();
232        sykliAjastin.Interval = 2.0;
233        sykliAjastin.Timeout += Sykli;
234        sykliAjastin.Start();
235
236        barbaariAjastin.Timeout += delegate { LuoBarbaareja(); };
237        barbaariAjastin.Interval = 3;
238    }
239
240    void Nuoli()
241    {
242        digArrow = new GameObject(5, 5);
243        digArrowHead = new GameObject(15, 15);
244        digArrowHead.Shape = Shape.Triangle;
245        digArrowHead.IsVisible = digArrow.IsVisible = false;
246        Add(digArrow, 3);
247        Add(digArrowHead, 3);
248    }
249
250    void UlkoAsuRoskaa()
251    {
252        Level.Background.Color = Color.Black;
253
254        Label rahat = new Label();
255        rahat.BindTo(kultuuri);
256        rahat.Position = new Vector(Level.Right + Level.Width * 0.2, Level.Bottom + Level.Height * 0.1);
257        rahat.TextColor = Color.White;
258        rahat.IntFormatString = "Käytettävää kulttuuria: {0:D3}";
259        Add(rahat);
260    }
261
262    public void LopetaPeli()
263    {
264        ClearAll();
265        GameObject spurdo = new GameObject(Screen.Width, Screen.Height);
266        spurdo.Image = kultuuriKuvat[2];
267        Add(spurdo);
268
269        Label havisit = new Label("Hävisit muuten belin");
270        havisit.Color = Color.HotPink;
271        havisit.Size = new Vector(300, 300);
272        havisit.Position = new Vector(Level.Right - havisit.Width * 0.5, Level.Top - havisit.Height * 0.5);
273        Add(havisit);
274    }
275
276    void Kauppa()
277    {
278        for (int i = 0; i < kultuuriKuvat.Length; i++)
279        {
280
281            // Ostettavat päivitykset on nyt PushButtoneita huoneiden sijaan.
282
283            PushButton kuva = new PushButton(kultuuriKuvat[i]);
284            kuva.Size = new Vector(1, 1) * RUUDUN_KOKO;
285            kuva.Position = new Vector((Level.Right + Level.Width * 0.05), (Level.Top - Level.Height * 0.25 - (i * RUUDUN_KOKO)));
286            Add(kuva);
287
288            int indeksi = i; // Alla oleva delegaatti vaatii uuden indeksi muuttujan toimiakseen.
289            kuva.Clicked += delegate
290            {
291                ostamassa = LuoKultuuriPaivitys(kultuuriKuvat[indeksi], hinnat[indeksi]);
292            };
293
294            Label teksti = new Label();
295            teksti.Position = kuva.Position + new Vector((RUUDUN_KOKO * 1.2), 0);
296            teksti.TextColor = Color.White;
297            teksti.Text = hinnat[i].ToString();
298            Add(teksti);
299 
300        }
301
302        for(int i = 0; i<1; i++)
303        {
304            PushButton kuva = new PushButton(ansaKuvat[i]);
305            kuva.Size = new Vector(1, 1) * RUUDUN_KOKO;
306            kuva.Color = Color.Gray;
307            kuva.Position = new Vector((Level.Right + Level.Width * 0.05), (Level.Top - Level.Height * 0.25 - ((kultuuriKuvat.Count() + i) * RUUDUN_KOKO)));
308            Add(kuva);
309
310            int indeksi = i;
311            kuva.Clicked += delegate
312            {
313               ostamassa = LuoAnsaPaivitys(ansaKuvat[ansaKuvat.Length-1], hinnat[indeksi]);
314            };
315
316            Label teksti = new Label();
317            teksti.Position = kuva.Position + new Vector((RUUDUN_KOKO * 1.2), 0);
318            teksti.TextColor = Color.White;
319            teksti.Text = hinnat[i].ToString();
320            Add(teksti);
321        }
322    }
323
324    Upgrade LuoAnsaPaivitys(Image kuva, int hinta)
325    {
326        TrapUpgrade upg = new TrapUpgrade();
327        upg.Image = kuva;
328        upg.Size = new Vector(0.5, 0.5) * RUUDUN_KOKO;
329        upg.Price = hinta;
330        upg.Animation = new Animation(ansaKuvat);
331        return upg;
332    }
333
334    Upgrade LuoKultuuriPaivitys(Image kuva, int hinta)
335    {
336        CultureUpgrade upg = new CultureUpgrade();
337        upg.Image = kuva;
338        upg.Size = new Vector(0.5, 0.5) * RUUDUN_KOKO;
339        upg.Price = hinta;
340        return upg;
341    }
342
343    void LuoBarbaareja()
344    {
345        Barbaari barbaari = new Barbaari(RUUDUN_KOKO * 0.4, RUUDUN_KOKO * 0.4);
346        barbaari.Color = Color.Red;
347        //barbaari.Position = RandomGen.NextVector(Level.Right, Level.Bottom, Level.Left, Level.Top);
348        barbaari.Position = spawn.Position;
349        barbaari.Animation = new Animation(vihuKuvat);
350        barbaari.Animation.FPS = 10;
351        barbaari.Animation.Start();
352        barbaari.Location = spawn.Location;
353        Add(barbaari);
354        barbaarit.Add(barbaari);
355
356        EtsiBarbaarinReitti(barbaari);
357    }
358
359    void EtsiBarbaarinReitti(Barbaari barbaari)
360    {
361        barbaari.Kohde = kohteet[RandomGen.NextInt(kohteet.Count)];
362        barbaari.Reitti = FindPath(barbaari.Kohde.Location, (barbaari.Location.Equals(spawn.Location)) ? spawn.Location : barbaari.Location);
363
364
365    }
366
367    void Sykli()
368    {
369        //List<Barbaari> poistettavat = new List<Barbaari>();   //TODO: Ansahuoneet poistamaan barbaareja, ei me.
370        foreach (var barbaari in barbaarit)
371        {
372            if (barbaari.Reitti.Count == 0)
373            {
374
375                EtsiBarbaarinReitti(barbaari);  //Etsitään uusi reitti poiston sijaan
376
377                /*poistettavat.Add(barbaari);
378                barbaari.Destroy();
379                continue;*/
380            }
381
382            Point seuraavaPaikka = barbaari.Reitti[0];
383            barbaari.Reitti.RemoveAt(0);
384            barbaari.MoveTo(huoneet[seuraavaPaikka.X, seuraavaPaikka.Y].Position, 100, () => SyklinPaatteeksi(barbaari, seuraavaPaikka));
385        }
386
387        /*foreach (var poista in poistettavat)
388            barbaarit.Remove(poista);*/
389    }
390
391    void SyklinPaatteeksi(Barbaari barbaari, Point uusiPaikka)
392    {
393        // Barbaari saapui juuri uusiPaikka kohdassa olevaan huoneeseen.
394        // Tässä pitäisi katsoa mitä huoneessa tapahtuu.
395        barbaari.Location = uusiPaikka;
396
397        Room huone = huoneet[uusiPaikka.X, uusiPaikka.Y];
398
399        if (huone.Upgrade != null)
400        {
401            huone.Upgrade.Invasion(this, barbaari, huone);
402        }
403    }
404
405    void Kontrollit()
406    {
407        IsMouseVisible = true;
408        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
409        Keyboard.Listen(Key.F1, ButtonState.Pressed, Begin, null);
410
411
412        Keyboard.Listen(Key.Space, ButtonState.Pressed, SeuraavaAalto, "Anna kivan barbaariaallon tulla");
413    }
414
415    void SeuraavaAalto()
416    {
417        if (!kierrosKaynnissa)
418        {
419            barbaariAjastin.Start(barbaariMaara);
420            barbaariMaara += 2;
421            kierrosKaynnissa = false;
422        }
423    }
424
425    void LuoSpawn()
426    {
427        spawn = huoneet[(int)(huoneet.GetLength(0) * 0.5), 0];
428        spawn.Dug = true;
429
430        Direction oviSuunta = Direction.Down;
431        spawn.Walls[oviSuunta].Image = reikaSeinaKuva;
432
433        Light valo = new Light();
434        valo.Position = spawn.Position;
435        valo.Intensity = 1;
436        valo.Distance = 40;
437        Add(valo);
438    }
439
440    void RoomPressed(Room huone)
441    {
442        digStart = huone.Location;
443        digging = true;
444        digArrowHead.IsVisible = digArrow.IsVisible = true;
445    }
446
447    void RoomReleased(Room kohdeHuone)
448    {
449        digging = false;
450        digArrowHead.IsVisible = digArrow.IsVisible = false;
451        if (CanDig())
452        {
453            int dx = kohdeHuone.Location.X - digStart.X;
454            int dy = kohdeHuone.Location.Y - digStart.Y;
455            Point[] kaivettavatPaikat = RuudutSuoralta(digStart, dx, dy).ToArray();
456            MessageDisplay.Add("" + kaivettavatPaikat.Length);
457            for (int i = 0; i < kaivettavatPaikat.Length - 1; i++)
458            {
459                Dig(GetRoom(kaivettavatPaikat[i]), GetRoom(kaivettavatPaikat[i + 1]));
460            }
461
462            //var alkuHuone = huoneet[digStart.X, digStart.Y];
463
464            // Päivitetään huoneiden kultuuri-infot.
465            PaivitaHuoneidenKultuurit();
466        }
467    }
468
469    void Dig(Room alku, Room kohde)
470    {
471        // Hienot partikkeliefektit.
472        if (!alku.Dug)
473            LuoKiviPartikkelit(alku.Position);
474        if (!kohde.Dug)
475            LuoKiviPartikkelit(kohde.Position);
476
477        // Merkataan huoneet kaivetuksi.
478        alku.Dug = kohde.Dug = true;
479
480        // Reiät seinään.
481        Direction oviSuunta = (kohde.Position - alku.Position).Angle.MainDirection;
482        Direction toinenOviSuunta = Direction.Inverse(oviSuunta);
483        alku.Walls[oviSuunta].Image = reikaSeinaKuva;
484        kohde.Walls[toinenOviSuunta].Image = reikaSeinaKuva;
485    }
486
487    Room CreateRoom(Point paikka)
488    {
489        Room huone = new Room(paikka);
490        huone.Image = lattiaKuva;
491        huone.Position = new Vector(paikka.X - huoneet.GetLength(0) / 2, paikka.Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
492        huone.Position += huoneSiirtyma;
493        foreach (var suunta in Suunnat())
494            huone.Walls[suunta] = CreateWall(huone.Position, suunta);
495        Add(huone, -2);
496        huone.Roof = new GameObject(RUUDUN_KOKO, RUUDUN_KOKO);
497        huone.Roof.Image = kiviKuva;
498        huone.Roof.Position = huone.Position;
499        Add(huone.Roof, 1);
500
501        Mouse.ListenOn(huone, MouseButton.Left, ButtonState.Pressed, AsetaPaivitys, "Asetetaan ostettu päivitys paikoilleen", huone);
502        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, delegate() { ostamassa = null; }, "Perutaan ostos");
503        Mouse.ListenOn(huone, MouseButton.Right, ButtonState.Pressed, PoistaPaivitys, "Poistetaan asetettu päivitys", huone);
504
505        return huone;
506    }
507
508    private void PoistaPaivitys(Room huone)
509    {
510        if (huone.Upgrade != null)
511        {
512            huone.Upgrade.Destroy();
513        }
514    }
515
516    void AsetaPaivitys(Room huone)
517    {
518        if (ostamassa != null && huone.Dug && kultuuri.Value >= ostamassa.Price)
519        {
520            kultuuri.Value -= ostamassa.Price;
521
522            // Lisätään päivitys huoneeseen.
523            huone.Upgrade = ostamassa;
524            Add(huone.Upgrade, -1);
525            huone.Upgrade.Position = huone.Position;
526            huone.Upgrade.Built(this);
527
528            ostamassa = null;
529            PaivitaHuoneenKultuuri(huone);
530        }
531    }
532
533    void PaivitaHuoneidenKultuurit()
534    {
535        RuutujenPaikat().Select(GetRoom).ToList().ForEach(PaivitaHuoneenKultuuri); // :D ;___;; MIKSI
536    }
537
538    void PaivitaHuoneenKultuuri(Room room)
539    {
540        if (room != null && room.Upgrade != null && room.Upgrade is CultureUpgrade)
541        {
542            var upg = room.Upgrade as CultureUpgrade;
543
544            List<Point> polku = FindPath(room.Location, spawn.Location);
545
546            // TODO: Tässä pitäisi laskea kunnolla polun pituuden perusteella kultuurin määrä, nyt
547            //       se on vain suoraan polun pituus.
548            upg.Culture.Value = polku.Count;
549
550            kohteet.Add(room);
551        }
552    }
553
554    GameObject CreateWall(Vector paikka, Direction suunta)
555    {
556        GameObject wall = new GameObject(RUUDUN_KOKO + 2, RUUDUN_KOKO + 2);
557        wall.Position = paikka;
558        wall.Image = seinaKuva;
559        wall.Angle = suunta.Angle;
560        Add(wall, 0);
561        return wall;
562    }
563
564    bool CanDig()
565    {
566        Room kohdeHuone = GetRoom(MuunnaJypelista(Mouse.PositionOnWorld));
567        if (kohdeHuone == null)
568        {
569            return false;
570        }
571
572        int dx = Math.Abs(kohdeHuone.Location.X - digStart.X);
573        int dy = Math.Abs(kohdeHuone.Location.Y - digStart.Y);
574        return (dx > 0 && dy == 0) || (dy > 0 && dx == 0);
575    }
576
577    #region Reitinlöytö
578
579    List<Point> FindPath(Point alku, Point loppu)
580    {
581        if (GetRoom(alku) == null || GetRoom(loppu) == null)
582            return new List<Point>();
583
584        bool[,] walkable = new bool[huoneet.GetLength(0), huoneet.GetLength(1)];
585        foreach (var paikka in RuutujenPaikat())
586        {
587            walkable[paikka.X, paikka.Y] = huoneet[paikka.X, paikka.Y].Dug;
588        }
589        var finder = new AStar.PathFinder(new AStar.SearchParameters(loppu, alku, walkable), OviTarkistus);
590        return finder.FindPath();
591    }
592
593    bool OviTarkistus(Point a, Point b)
594    {
595        Room ra = GetRoom(a);
596        Room rb = GetRoom(b);
597        Direction suunta = (new Vector(b.X, b.Y) - new Vector(a.X, a.Y)).Angle.MainDirection;
598        if (ra != null && rb != null)
599        {
600            return ra.Walls[suunta].Image == reikaSeinaKuva && rb.Walls[Direction.Inverse(suunta)].Image == reikaSeinaKuva;
601        }
602        return false;
603    }
604
605    #endregion
606
607    #region Extra Juttuja
608
609    IEnumerable<Direction> Suunnat()
610    {
611        yield return Direction.Left;
612        yield return Direction.Right;
613        yield return Direction.Up;
614        yield return Direction.Down;
615    }
616
617    IEnumerable<Point> RuutujenPaikat()
618    {
619        return from y in Enumerable.Range(0, huoneet.GetLength(1))
620               from x in Enumerable.Range(0, huoneet.GetLength(0))
621               select new Point(x, y);
622    }
623
624    /// <summary>
625    /// Palauttaa ruutuja suoralta pätkältä dx ja dy verran alkaen pisteestä "alku".
626    /// dx tai dy pitää olla nolla.
627    /// </summary>
628    IEnumerable<Point> RuudutSuoralta(Point alku, int dx, int dy)
629    {
630        if (dx != 0)
631        {
632            for (int i = 0; i < Math.Abs(dx) + 1; i++)
633            {
634                yield return new Point(alku.X + i * Math.Sign(dx), alku.Y);
635            }
636            yield break;
637        }
638        if (dy != 0)
639        {
640            for (int i = 0; i < Math.Abs(dy) + 1; i++)
641            {
642                yield return new Point(alku.X, alku.Y + i * Math.Sign(dy));
643            }
644        }
645    }
646
647    Room GetRoom(Point paikka)
648    {
649        if (paikka.X >= 0 && paikka.X < huoneet.GetLength(0) && paikka.Y >= 0 && paikka.Y < huoneet.GetLength(1))
650        {
651            return huoneet[paikka.X, paikka.Y];
652        }
653        return null;
654    }
655
656    /// <summary>
657    /// Muuntaa Jypeli-koordinaatin peliruudukon koordinaatiksi.
658    /// </summary>
659    Point MuunnaJypelista(Vector paikka)
660    {
661        Vector siirrettyOrigo = (paikka - huoneSiirtyma) + RUUDUN_KOKO * (0.5 * new Vector(huoneet.GetLength(0), huoneet.GetLength(1)) + new Vector(0.5, 0.5));
662        Vector wtf = new Vector(siirrettyOrigo.X < 0 ? -1 : 0, siirrettyOrigo.Y < 0 ? -1 : 0);
663        Vector valmis = wtf + siirrettyOrigo / RUUDUN_KOKO;
664        return new Point((int)valmis.X, (int)valmis.Y);
665    }
666
667    void LuoKiviPartikkelit(Vector alkupaikka)
668    {
669        // Feikki 3D partikkeli juttu.
670        // Heittää ilmaan GameObjekteja joiden alla on varjo.
671        for (int i = 0; i < 6; i++)
672        {
673            GameObject p = new GameObject(25, 25);
674            p.Image = partikkeli;
675            p.Position = alkupaikka + RandomGen.NextVector(0.0, RUUDUN_KOKO * 0.4);
676            Add(p, 3);
677
678            GameObject varjo = new GameObject(20, 10);
679            varjo.Position = p.Position;
680            varjo.Shape = Shape.Circle;
681            varjo.Color = Color.Lerp(Color.Black, Color.Transparent, 0.5);
682            Add(varjo, 2);
683
684            Vector paikka = p.Position;
685            Vector nopeus = RandomGen.NextVector(0.2, 3.0);
686            nopeus.Y *= 0.3;
687            double g = -0.2; // painovoima
688            double z = 0.0; // sijainti z-akselilla
689            double vz = RandomGen.NextDouble(3.5, 4.5); // nopeus z-akselilla
690            double angularVelocity = RandomGen.NextDouble(-1.0, 1.0) * 8;
691
692            Timer ajastin = new Timer();
693            ajastin.Interval = 0.02;
694            ajastin.Timeout += delegate
695            {
696                vz += g;
697                z += vz;
698                paikka += nopeus;
699                p.Position = paikka + new Vector(0.0, 1.0) * z;
700                p.Angle += Angle.FromDegrees(angularVelocity);
701                varjo.Position = paikka;
702
703                if (z < 0.0)
704                {
705                    ajastin.Stop();
706                    p.Destroy();
707                    varjo.Destroy();
708                }
709            };
710            ajastin.Start();
711        }
712    }
713
714    public void Splatter(Vector alkupaikka)
715    {
716        for (int i = 0; i < 6; i++)
717        {
718            GameObject p = new GameObject(8, 8);
719            //p.Color = Color.Red;
720            p.Image = taideVeri;
721            p.Position = alkupaikka + RandomGen.NextVector(0.0, RUUDUN_KOKO * 0.4);
722            Add(p, 3);
723
724            GameObject varjo = new GameObject(5, 5);
725            varjo.Position = p.Position;
726            varjo.Shape = Shape.Circle;
727            varjo.Color = Color.Lerp(Color.Black, Color.Transparent, 0.5);
728            Add(varjo, 2);
729
730            Vector paikka = p.Position;
731            Vector nopeus = RandomGen.NextVector(0.2, 3.0);
732            nopeus.Y *= 0.3;
733            double g = -0.2; // painovoima
734            double z = 0.0; // sijainti z-akselilla
735            double vz = RandomGen.NextDouble(3.5, 4.5); // nopeus z-akselilla
736            double angularVelocity = RandomGen.NextDouble(-1.0, 1.0) * 8;
737
738            Timer ajastin = new Timer();
739            ajastin.Interval = 0.02;
740            ajastin.Timeout += delegate
741            {
742                vz += g;
743                z += vz;
744                paikka += nopeus;
745                p.Position = paikka + new Vector(0.0, 1.0) * z;
746                p.Angle += Angle.FromDegrees(angularVelocity);
747                varjo.Position = paikka;
748
749                if (z < 0.0)
750                {
751                    ajastin.Stop();
752                    p.Destroy();
753                    varjo.Destroy();
754                }
755            };
756            ajastin.Start();
757        }
758    }
759
760    protected override void Update(Time time)
761    {
762        if (digging)
763        {
764            Color vari = CanDig() ? Color.White : Color.Red;
765            Vector alku = huoneet[digStart.X, digStart.Y].Position;
766            Vector loppu = Mouse.PositionOnWorld;
767            Vector suunta = loppu - alku;
768            double pituus = suunta.Magnitude;
769            if (pituus <= 2) pituus = 2;
770
771            digArrow.Color = vari;
772            digArrow.Position = alku + suunta * 0.5;
773            digArrow.Angle = suunta.Angle;
774            digArrow.Width = pituus;
775
776            digArrowHead.Color = vari;
777            digArrowHead.Position = alku + suunta;
778            digArrowHead.Angle = suunta.Angle - Angle.FromDegrees(90);
779        }
780
781        base.Update(time);
782    }
783
784    protected override void Paint(Canvas canvas)
785    {
786        canvas.BrushColor = Color.Purple;
787
788        var points = FindPath(new Point(6, 0), MuunnaJypelista(Mouse.PositionOnWorld));
789        for (int i = 0; i < points.Count - 1; i++)
790        {
791            Vector v = huoneSiirtyma + new Vector(points[i].X - huoneet.GetLength(0) / 2, points[i].Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
792            Vector v2 = huoneSiirtyma + new Vector(points[i + 1].X - huoneet.GetLength(0) / 2, points[i + 1].Y - huoneet.GetLength(1) / 2) * RUUDUN_KOKO;
793            canvas.DrawLine(v, v2);
794        }
795
796        base.Paint(canvas);
797    }
798
799    #endregion
800}
Note: See TracBrowser for help on using the repository browser.