source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Ai/Orders/OrderMove.cs @ 4635

Revision 4635, 3.3 KB checked in by dezhidki, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.Ai.Orders;
6using CastleMaster.Graphics;
7using CastleMaster.Units.Mobs;
8
9namespace IsometricEngineTest.Ai.Orders
10{
11    public class OrderMove : Order
12    {
13        private float x, z;
14        private int ppi = 0;
15        private bool excludeEndSolidness;
16        private float stopDistance;
17        private int moveFails = 0;
18        private float lastDist = 0.0F;
19        private bool shouldFindPath = false;
20        private bool createNewPathFinder;
21
22        public OrderMove(float x, float z, float stopDistance = 2.0F, bool excludeEndSolidness = false, bool createNewPathFinder = true)
23        {
24            this.stopDistance = stopDistance;
25            this.excludeEndSolidness = excludeEndSolidness;
26            this.createNewPathFinder = createNewPathFinder;
27            this.x = x;
28            this.z = z;
29        }
30
31        public override Order Initialize(Mob mob)
32        {
33            base.Initialize(mob);
34
35            if (createNewPathFinder && mob.DistanceTo(x, z) > 64.0F)
36            {
37                mob.PathFinder.InitializePathFinder((int)(mob.X / Viewport.TILESIZE), (int)(mob.Z / Viewport.TILESIZE), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), excludeEndSolidness);
38                shouldFindPath = true;
39            }
40            return this;
41        }
42
43        public override void Update()
44        {
45            if (shouldFindPath)
46            {
47                if (!mob.PathFinder.CanFindPath)
48                    return;
49                if (mob.PathFinder.IsPathFinding)
50                    mob.PathFinder.FindPath(50);
51            }
52
53            if (shouldFindPath && mob.PathFinder.Path.Count > 0 && ppi < mob.PathFinder.Path.Count)
54            {
55                Node currentTarget = mob.PathFinder.Path[ppi];
56                float xtPoint = currentTarget.X * Viewport.TILESIZE + 8.0F;
57                float ztPoint = currentTarget.Z * Viewport.TILESIZE + 8.0F;
58
59                float dist = mob.DistanceTo(xtPoint, ztPoint);
60                if (dist > 8.0F)
61                {
62                    if (mob.TurnTowards(xtPoint, ztPoint))
63                    {
64                        mob.MoveForward();
65
66                        if (dist == lastDist)
67                            moveFails++;
68                        else
69                            moveFails = 0;
70                        lastDist = dist;
71                    }
72                }
73                else
74                    ppi++;
75            }
76            else
77            {
78                float dist = mob.DistanceTo(x, z);
79                if (dist > 1.0F)
80                {
81                    if (mob.TurnTowards(x, z))
82                    {
83                        mob.MoveForward();
84
85                        if (dist == lastDist)
86                            moveFails++;
87                        else
88                            moveFails = 0;
89                        lastDist = dist;
90                    }
91                }
92            }
93        }
94
95        public override bool Finished
96        {
97            get
98            {
99                return (mob.DistanceTo(x, z) < stopDistance) || moveFails > 5 || !mob.PathFinder.CanFindPath;
100            }
101        }
102    }
103}
Note: See TracBrowser for help on using the repository browser.