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

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