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

Revision 6037, 24.7 KB checked in by empaheik, 5 years ago (diff)

Verta

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