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

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