source: 2014/30/MiskaK/The Reclaim/The Reclaim/The Reclaim/The Reclaim/The_Reclaim.cs @ 5652

Revision 5652, 22.8 KB checked in by mikrkana, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class The_Reclaim : PhysicsGame
10{
11    #region attribuutit
12    public static The_Reclaim Peli;
13
14    /// <summary>
15    /// Verkko reitinhakua varten.
16    /// </summary>
17    public Map NavigationMesh { get; private set; }
18
19    public List<Soldier> HostileTroops = new List<Soldier>();
20    public List<Soldier> FriendlyTroops = new List<Soldier>();
21    public List<Soldier> SelectedTroops = new List<Soldier>();
22
23    public Timer AITick = new Timer();
24    private int CurrentTick = 1;
25
26    public List<LevelData> Levels = new List<LevelData>();
27    public LevelData CurrentLevel;
28
29    private Vector TroopSelectionCorner;
30    private bool SelectingTroops;
31    private ActionMenu actionMenu;
32    private Behaviour CurrentBehaviour = Behaviour.Idle;
33
34    private bool SelectingShootingTarget;
35    private Vector ShootingTargetCorner;
36
37#if !DEBUG
38    Label waterprint = new Label("The Reclaim (development version)\n by Miska Kananen");
39#endif
40    #endregion
41
42    #region yleiset toiminnot
43
44    public override void Begin()
45    {
46        Peli = this;
47#if !DEBUG
48        waterprint.Position = new Vector(Screen.Left + waterprint.Width / 2, Screen.Bottom + 30);
49        waterprint.TextScale = new Vector(0.8, 0.8);
50        waterprint.TextColor = Color.White;
51        Add(waterprint);
52#endif
53        MainMenu();
54    }
55
56    void MainMenu()
57    {
58        StartGame("ruinedcity", 1);
59    }
60
61    void StartGame(string world, int levelCount)
62    {
63        LoadLevels(world, levelCount);
64        LoadLevel(1);
65        SetControls();
66        InitializeAI();
67        Level.AmbientLight = 0.0;
68        KirkastaRuutua(0.03, 1.0);
69    }
70
71    void EndGame()
72    {
73
74        ClearAll();
75    }
76
77    public void CheckCurrentSituation()
78    {
79        int friendlyEntrances = CurrentLevel.Entrances.FindAll(x => x.CurrentOwner == Entrance.Owner.Friendly).Count;
80        int friendlyPlayers = FriendlyTroops.Count;
81
82        int hostileEntrances = CurrentLevel.Entrances.FindAll(x => x.CurrentOwner == Entrance.Owner.Enemy).Count;
83        int hostilePlayers = HostileTroops.Count;
84
85        if (friendlyEntrances == 0 && friendlyPlayers == 0)
86        {
87            PimennaRuutua(0.01, 0.0);
88            Timer.SingleShot(12.0, EndGame);
89        }
90
91        if (hostileEntrances == 0 && hostilePlayers == 0)
92        {
93            for (int i = 0; i < FriendlyTroops.Count; i++)
94            {
95                FriendlyTroops[i].TargetLocation = CurrentLevel.ExitPoint;
96                FriendlyTroops[i].CurrentBehaviour = Behaviour.Move;
97                Timer.SingleShot(20.0, delegate { PimennaRuutua(0.01, 0.0); });
98                Timer.SingleShot(28.0, EndGame);
99            }
100        }
101    }
102
103    #endregion
104
105    #region grafiikka
106
107    /// <summary>
108    /// Zoomataan kameraa hiiren rullan mukaan.
109    /// </summary>
110    void ZoomCamera()
111    {
112        double zoom = Camera.ZoomFactor + ((Mouse.WheelChange * 0.05) / Camera.ZoomFactor);
113        if (zoom > 0)
114            Camera.ZoomFactor += (Mouse.WheelChange * 0.05);
115        //if (Mouse.WheelChange > 0)
116        //Camera.Position = Mouse.PositionOnWorld;
117    }
118
119    protected override void Paint(Canvas canvas)
120    {
121        Vector mousePos = Mouse.PositionOnWorld;
122
123        if (SelectingTroops)
124        {
125            canvas.BrushColor = Color.Blue;
126            canvas.DrawLine(TroopSelectionCorner, new Vector(TroopSelectionCorner.X, mousePos.Y));
127            canvas.DrawLine(TroopSelectionCorner, new Vector(mousePos.X, TroopSelectionCorner.Y));
128            canvas.DrawLine(mousePos, new Vector(mousePos.X, TroopSelectionCorner.Y));
129            canvas.DrawLine(mousePos, new Vector(TroopSelectionCorner.X, mousePos.Y));
130        }
131
132        if (SelectingShootingTarget)
133        {
134            canvas.BrushColor = Color.Red;
135            canvas.DrawLine(ShootingTargetCorner, new Vector(ShootingTargetCorner.X, mousePos.Y));
136            canvas.DrawLine(ShootingTargetCorner, new Vector(mousePos.X, ShootingTargetCorner.Y));
137            canvas.DrawLine(mousePos, new Vector(mousePos.X, ShootingTargetCorner.Y));
138            canvas.DrawLine(mousePos, new Vector(ShootingTargetCorner.X, mousePos.Y));
139        }
140        base.Paint(canvas);
141    }
142
143    /// <summary>
144    /// Piirretään valojuovia.
145    /// </summary>
146    /// <param name="position">Valojuovan tämänhetkinen sijainti.</param>
147    /// <param name="color">Valojuovan väri.</param>
148    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
149    public void DrawTracers(Vector position, Color color, double lifetimeInSeconds, double brightnessFactor)
150    {
151        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
152        GameObject tracer = new GameObject(2, 2);
153        tracer.Shape = Shape.Circle;
154        tracer.Color = color;
155        tracer.Position = position;
156        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
157        Add(tracer, -2);
158    }
159
160    /// <summary>
161    /// Piirretään valojuovia.
162    /// </summary>
163    /// <param name="tracingObject">Olio, josta valojuovat tulevat.</param>
164    /// <param name="color">Valojuovan väri.</param>
165    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
166    /// <param name="brightnessFactor">Valojuovan kirkkaus.</param>
167    public void DrawTracers(GameObject tracingObject, Color color, double lifetimeInSeconds, double brightnessFactor)
168    {
169        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
170        GameObject tracer = new GameObject(60, 2);
171        tracer.Shape = Shape.Circle;
172        tracer.Color = color;
173        tracer.Position = tracingObject.Position;
174        tracer.Angle = tracingObject.Angle;
175        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
176        Add(tracer, -2);
177    }
178
179    /// <summary>
180    /// Pimennetään ruutua pikku hiljaa.
181    /// Oletusnopeus 0.01.
182    /// </summary>
183    public void PimennaRuutua(double nopeus, double tavoite)
184    {
185        Timer ajastin = new Timer();
186        ajastin.Interval = 0.1;
187        ajastin.Timeout += delegate
188        {
189            Level.AmbientLight -= nopeus;
190            if (Level.AmbientLight <= tavoite)
191            {
192                ajastin.Stop();
193                ajastin.Reset();
194            }
195        };
196        ajastin.Start();
197    }
198
199    /// <summary>
200    /// Kirkastetaan ruutua pikku hiljaa.
201    /// </summary>
202    public void KirkastaRuutua(double nopeus, double tavoite)
203    {
204        Timer ajastin = new Timer();
205        ajastin.Interval = 0.1;
206        ajastin.Timeout += delegate
207        {
208            //if (Level.AmbientLight > 0.1) return;
209            Level.AmbientLight += nopeus;
210            if (Level.AmbientLight > tavoite)
211            {
212                ajastin.Stop();
213                ajastin.Reset();
214            }
215        };
216        ajastin.Start();
217    }
218
219
220    /*void UpdateFoW(GameObject fow)
221    {
222        SetTransparent(fow.Image, Vector.Zero, 0);
223    }*/
224
225    /// <summary>
226    /// Asetetaan kuvan läpinäkyvyys.
227    /// </summary>
228    /// <param name="kuva">Kuva</param>
229    /// <param name="change">Läpinäkyvyyden (alphan) muutos. Positiivinen arvo muuttaa
230    /// läpinäkymättömämämmäksi, negatiivinen läpinäkyvämmäksi.</param>
231    void SetTransparency(Image kuva, double change)
232    {
233        uint[,] bmp = kuva.GetDataUInt();
234        int ny = kuva.Height;
235        int nx = kuva.Width;
236
237        //int minY = (int)(position.Y / 10 + ny / 2);
238        // ny / 2 olis y = o
239        // nx / 2 x = 0
240        // yks pikseli = 10 koordinaatistossa
241
242        for (int iy = 0; iy < ny; iy++)
243            for (int ix = 0; ix < nx; ix++)
244            {
245                uint c = bmp[iy, ix];
246                byte r = Color.GetRed(c);
247                byte g = Color.GetGreen(c);
248                byte b = Color.GetBlue(c);
249                byte a = Color.GetAlpha(c);
250
251                byte newAlpha = (byte)(a + change);
252
253                bmp[iy, ix] = Color.PackRGB(r, g, b, newAlpha);
254            }
255        kuva.SetData(bmp);
256    }
257
258    public void FadeToTransparent(Image kuva, double speed)
259    {
260        int i = 255;
261        Timer t = new Timer();
262        t.Interval = speed;
263        t.Timeout += delegate
264        {
265            if (i <= 0)
266                t.Stop();
267            else
268            {
269                i--;
270                SetTransparency(kuva, -1);
271            }
272        };
273        t.Start();
274    }
275
276    #endregion
277
278    #region kentta
279
280    /// <summary>
281    /// Luodaan maailma ruutukarttojen pohjalta.
282    /// </summary>
283    /// <param name="data">Luomiseen tarvittavat tiedot.</param>
284    void CreateWorld(LevelData data)
285    {
286        SmoothTextures = false;
287        Level.BackgroundColor = Color.Black;
288        Camera.ZoomToAllObjects();
289        Mouse.IsCursorVisible = true;
290        Efektit.InitializeParticles();
291
292        GameObject backgroundImage = new GameObject(data.GroundTexture.Width * 2, data.GroundTexture.Height * 2); // *64
293        backgroundImage.Image = data.GroundTexture;
294        backgroundImage.Tag = "background";
295        Add(backgroundImage, -3);
296
297        NavigationMesh = new Map(data.Walls.Width, data.Walls.Height);
298
299        ColorTileMap walls = new ColorTileMap(data.Walls);
300        walls.SetTileMethod(Color.Black, CreateWall, Color.Transparent);
301        walls.SetTileMethod(Color.Gold, CreateWall, Color.Transparent);
302        walls.SetTileMethod(Color.BrightGreen, CreateEntrance, Entrance.Owner.Friendly);
303        walls.SetTileMethod(Color.Red, CreateEntrance, Entrance.Owner.Enemy);
304        walls.SetTileMethod(Color.Cyan, delegate(Vector p, double w, double h, IntPoint posInLevel) {
305            CurrentLevel.ExitPoint = p; });
306        walls.Execute(GameConstants.TILE_WIDTH, GameConstants.TILE_HEIGHT);
307
308
309
310        /*ColorTileMap roofs = new ColorTileMap(data.Roofs);
311        roofs.SetTileMethod(Color.DarkGray, CreateRoof, Color.DarkGray);
312        roofs.Execute(GameConstants.TILE_WIDTH, GameConstants.TILE_HEIGHT);*/
313
314        //GameObject fogOfWar = new GameObject(backgroundImage.Width, backgroundImage.Height);
315        //fogOfWar.Image = new Image(data.GroundTexture.Width, data.GroundTexture.Height, Color.Black);
316        //Add(fogOfWar, 2);
317
318        //Timer fowTimer = new Timer();
319        //fowTimer.Interval = 0.1;
320        //fowTimer.Timeout += delegate { UpdateFoW(fogOfWar); };
321        //fowTimer.Start();     
322    }
323
324    void CreateWall(Vector paikka, double leveys, double korkeus, IntPoint positionInLevelArray, Color vari) // vari DEBUG
325    {
326        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
327        seina.Position = paikka;
328        seina.Color = vari;
329        seina.Tag = "seina";
330        Add(seina);
331
332        NavigationMesh.Nodes[positionInLevelArray.X, positionInLevelArray.Y].IsFull = true;
333    }
334
335    void CreateRoof(Vector paikka, double leveys, double korkeus, IntPoint positionInLevelArray, Color vari) // vari DEBUG
336    {
337        GameObject katto = new GameObject(leveys, korkeus);
338        katto.Position = paikka;
339        katto.Color = vari;
340        /*katto.NeedsUpdateCall = true;
341        katto.IsUpdated = true;
342        katto.NeedsUpdateCall = true;
343        katto.Updated += UpdateRoofTransparency;*/
344        Add(katto, 1);
345    }
346
347    void CreateEntrance(Vector paikka, double leveys, double korkeus, IntPoint posInLevel, Entrance.Owner owner)
348    {
349        Entrance e = new Entrance(paikka, GameConstants.ENTRANCE_RADIUS, owner, GameConstants.SECONDS_TO_CAPTURE);
350        if (owner == Entrance.Owner.Enemy)
351            e.Spawn(-1, 2);
352        if (owner == Entrance.Owner.Friendly)
353            e.Spawn(5, -1);
354        CurrentLevel.Entrances.Add(e);
355    }
356
357    /// <summary>
358    /// Ladataan kenttä ja luodaan se.
359    /// </summary>
360    /// <param name="level">Monesko kenttä.</param>
361    void LoadLevel(int level)
362    {
363        if (level < 0 || level > Levels.Count) return;
364        CurrentLevel = Levels[level - 1];
365        ClearGameObjects();
366        CreateWorld(CurrentLevel);
367    }
368
369    /// <summary>
370    /// Ladataan kaikki kentät.
371    /// </summary>
372    /// <param name="world">Maailmakansion nimi.</param>
373    /// <param name="levelCount">Ruutujen määrä maailmassa.</param>
374    void LoadLevels(String world, int levelCount)
375    {
376        Levels.Clear();
377        for (int i = 1; i < levelCount + 1; i++)
378        {
379            Image walls = LoadImage(world + "/" + "ruutu" + i.ToString() + "_seinat");
380            Image maatekstuuri = LoadImage(world + "/" + "ruutu" + i.ToString() + "_maatekstuuri");
381
382            LevelData data = new LevelData(maatekstuuri, walls, null);
383            Levels.Add(data);
384        }
385    }
386
387    /*void UpdateRoofTransparency(GameObject roof)
388    {
389        const double MIN_DISTANCE = 400.0;
390
391        if (Vector.Distance(roof.Position, Mouse.PositionOnWorld) < MIN_DISTANCE)
392        {
393
394        }
395        else roof.Color.AlphaComponent = 255;
396    }*/
397
398#endregion
399
400    #region hahmot
401
402    public Soldier CreateSoldier(Vector paikka, Image kuva, bool isPlayerControlled, double speed, Ase ase, Angle kulma)
403    {
404        Soldier s = new Soldier(kuva, 0.5, isPlayerControlled);
405        s.Position = paikka;
406        s.Shape = Shape.Circle;
407        s.Angle = kulma;
408        s.MovingSpeed = speed;
409        s.CollisionIgnoreGroup = 1;
410        s.SetWeapon(ase);
411        s.Weapon.UsesTracers = true;
412        s.LinearDamping = 0.95;
413        s.AngularDamping = 0.98;
414        s.Mass = 100;
415        EnemySpecialization[] specs = { EnemySpecialization.Attacker, EnemySpecialization.Defender, EnemySpecialization.Fighter };
416
417        if (isPlayerControlled)
418        {
419            FriendlyTroops.Add(s);
420        }
421        else
422        {
423            HostileTroops.Add(s);
424            s.Specialization = RandomGen.SelectOneWithProbabilities<EnemySpecialization>(specs, 0.3, 0.4, 0.3); // eniten defendereitä, toiseksi eniten attackereita ja vähiten killereitä
425            s.Name.Text += " (" + s.Specialization.ToString() + ")";
426        }
427        s.Destroyed += CheckCurrentSituation;
428        Add(s);
429        return s;
430    }
431
432    #endregion
433
434    #region ohjaimet
435
436    void SetControls()
437    {
438        Mouse.ListenWheel(ZoomCamera, null);
439        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, delegate {
440            TroopSelectionCorner = Mouse.PositionOnWorld;
441            SelectingTroops = true;
442        }, null);
443        Mouse.Listen(MouseButton.Left, ButtonState.Released, delegate {
444            SelectingTroops = false;
445            SelectTroops();
446        }, null);
447        Mouse.Listen(MouseButton.Middle, ButtonState.Pressed, delegate {
448            CreateActionMenu();
449        }, null);
450        Mouse.Listen(MouseButton.Middle, ButtonState.Released, delegate
451        {
452            actionMenu.ButtonClicked(actionMenu.GetButtonClosestToMouse());
453        }, null);
454        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, delegate {
455            if (SelectedTroops.Count != 0)  ApplyBehaviour();
456        }, null);
457
458
459        Keyboard.Listen(Key.Space, ButtonState.Pressed, delegate { CreateSoldier(Mouse.PositionOnWorld, Images.OmaSotilasAKS74u, true, RandomGen.NextDouble(GameConstants.SOLDIER_MIN_SPEED, GameConstants.SOLDIER_MAX_SPEED), Aseet.GetRandomWeapon(), Angle.Zero); }, null);
460        Keyboard.Listen(Key.RightControl, ButtonState.Pressed, delegate { CreateSoldier(Mouse.PositionOnWorld, Images.VihollinenVSSVintorez, false, RandomGen.NextDouble(GameConstants.SOLDIER_MIN_SPEED, GameConstants.SOLDIER_MAX_SPEED), Aseet.GetRandomWeapon(), Angle.Zero); }, null);
461        //Keyboard.Listen(Key.Space, ButtonState.Pressed, delegate { MessageDisplay.Add(Mouse.PositionOnWorld.ToString()); MessageDisplay.Add(NavigationMesh.GetCorrespondingNode(Mouse.PositionOnWorld).ToString()); }, null);
462        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaKameraa, null, new Vector(0.0, 1.0));
463        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaKameraa, null, new Vector(0.0, -1.0));
464        Keyboard.Listen(Key.A, ButtonState.Down, LiikutaKameraa, null, new Vector(-1.0, 0.0));
465        Keyboard.Listen(Key.D, ButtonState.Down, LiikutaKameraa, null, new Vector(1.0, 0.0));
466
467    }
468
469    void LiikutaKameraa(Vector suunta)
470    {
471        if (Camera.ZoomFactor > 1)
472            Camera.Position += (suunta * GameConstants.CAMERA_MOVEMENT_SPEED / Camera.ZoomFactor);
473        else
474            Camera.Position += (suunta * GameConstants.CAMERA_MOVEMENT_SPEED);
475
476    }
477
478    void SelectTroops()
479    {
480        Vector corner = Mouse.PositionOnWorld;
481
482        SelectedTroops.ForEach(x => x.SelectionMarker.IsVisible = false); 
483        SelectedTroops.Clear();
484
485        for (int i = 0; i < HostileTroops.Count; i++)
486        {
487            HostileTroops[i].SelectionMarker.IsVisible = false;
488        }
489
490        List<GameObject> selected = GetObjects(x => x is Soldier && IsInside(x.Position, TroopSelectionCorner, corner));
491
492        for (int i = 0; i < selected.Count; i++)
493        {
494            Soldier s = (Soldier)selected[i];
495            if (s.IsPlayerControlled)
496            {
497                SelectedTroops.Add(s);
498                s.SelectionMarker.IsVisible = true;
499
500                if (s.TargetSoldiers != null)
501                {
502                    for (int j = 0; j < s.TargetSoldiers.Count; j++)
503                    {
504                        s.TargetSoldiers[j].SelectionMarker.IsVisible = true;
505                    }
506                }
507            }
508        }
509    }
510
511    /// <summary>
512    /// Onko piste kahden pisteen muodostaman suorakulmion sisällä.
513    /// </summary>
514    /// <param name="pos">Piste.</param>
515    /// <param name="firstCorner">Ensimmäinen nurkka.</param>
516    /// <param name="secondCorner">Toinen nurkka.</param>
517    /// <returns>Onko piste suorakulmion sisällä.</returns>
518    public bool IsInside(Vector pos, Vector firstCorner, Vector secondCorner)
519    {
520        if (pos.X < Math.Min(firstCorner.X, secondCorner.X) || pos.X > Math.Max(firstCorner.X, secondCorner.X)) return false;
521        if (pos.Y < Math.Min(firstCorner.Y, secondCorner.Y) || pos.Y > Math.Max(firstCorner.Y, secondCorner.Y)) return false;
522        return true;
523    }
524
525    void CreateActionMenu()
526    {
527        Vector mousePos = Mouse.PositionOnWorld;
528
529        actionMenu = new ActionMenu(300, 60, Behaviour.Idle, Behaviour.Move, Behaviour.Shoot);
530        actionMenu.Position = new Vector(Mouse.PositionOnScreen.X, Mouse.PositionOnScreen.Y);
531        actionMenu.Clicked += delegate(Behaviour action) { ActionButtonClicked(action, mousePos); actionMenu.Destroy(); };
532        Add(actionMenu);
533    }
534
535    void ActionButtonClicked(Behaviour action, Vector targetPosition)
536    {
537        CurrentBehaviour = action;
538        MessageDisplay.Add("Current action: " + action.ToString());
539    }
540   
541    #endregion
542
543    #region tekoaly
544
545    void ApplyBehaviour()
546    {
547        switch (CurrentBehaviour)
548        {
549            case Behaviour.Idle:
550                for (int i = 0; i < SelectedTroops.Count; i++)
551                {
552                    SelectedTroops[i].CurrentBehaviour = CurrentBehaviour;
553                    //SelectedTroops[i].ShootingTargetArea = null;
554                }
555                break;
556            case Behaviour.Move:
557                for (int i = 0; i < SelectedTroops.Count; i++)
558                {
559                    SelectedTroops[i].CurrentBehaviour = CurrentBehaviour;
560                    SelectedTroops[i].TargetLocation = Mouse.PositionOnWorld;
561                }
562                break;
563            case Behaviour.Shoot:
564                for (int i = 0; i < SelectedTroops.Count; i++)
565                {
566                    SelectedTroops[i].CurrentBehaviour = CurrentBehaviour;
567                }
568                if (!SelectingShootingTarget)
569                {
570                    ShootingTargetCorner = Mouse.PositionOnWorld; // tallennetaan ensimmäinen nurkka
571                    SelectingShootingTarget = true;
572
573                    Mouse.Listen(MouseButton.Right, ButtonState.Released, delegate
574                    {
575                        if (!SelectingShootingTarget) return;
576                        for (int i = 0; i < SelectedTroops.Count; i++)
577                        {
578                            SelectedTroops[i].TargetSoldiers.Clear();
579                            Area a = new Area(ShootingTargetCorner, Mouse.PositionOnWorld);
580                            List<GameObject> soldiersInArea = GetObjects(x => x is Soldier && a.IsInside(x.Position));
581                            for (int j = 0; j < soldiersInArea.Count; j++)
582                            {
583                                Soldier s = (Soldier)soldiersInArea[j];
584                                if (!s.IsPlayerControlled)
585                                    SelectedTroops[i].AddTargetSoldier(s);
586                            }
587                            for (int j = 0; j < SelectedTroops[i].TargetSoldiers.Count; j++)
588                            {
589                                // käydään läpi kaikki viholliset alueella
590                                SelectedTroops[i].TargetSoldiers[j].SelectionMarker.IsVisible = true;
591                            }
592                        }
593                        SelectingShootingTarget = false;
594                    }, null);
595                }
596                break;
597            default:
598                break;
599        }
600    }
601
602    void InitializeAI()
603    {
604        AITick.Interval = GameConstants.AI_REFRESH_RATE;
605        AITick.Timeout += DoAITick;
606        AITick.Start();
607    }
608
609    void DoAITick()
610    {
611        for (int i = 0; i < FriendlyTroops.Count; i++)
612        {
613            FriendlyTroops[i].UpdateAI();
614            //if (FriendlyTroops[i].HasRoute)
615                //DrawRoute(FriendlyTroops[i].ReittiAivot.Path);
616        }
617
618        for (int i = 0; i < HostileTroops.Count; i++)
619        {
620            HostileTroops[i].UpdateAI();
621            if (CurrentTick == 1)
622                HostileTroops[i].UpdateEnemyObjectives();
623            CurrentTick++;
624            if (CurrentTick > GameConstants.ENEMY_AI_OBJECTIVE_REFRESH_TICKS)
625                CurrentTick = 1;
626        }
627    }
628
629    #endregion
630
631    #region testit
632
633    public void DrawRoute(IList<Vector> reitti)
634    {
635        for (int i = 0; i < reitti.Count; i++)
636        {
637            GameObject g = new GameObject(25, 25, Shape.Rectangle);
638            // g.Position = NavigationMesh.GetPositionOnWorld(reitti[i]);
639            g.Position = reitti[i];
640            g.Color = Color.Red;
641            Add(g, 3);
642            g.MaximumLifetime = TimeSpan.FromSeconds(5.0);
643        }
644    }
645
646    #endregion
647}
Note: See TracBrowser for help on using the repository browser.