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

Revision 4646, 3.8 KB checked in by dezhidki, 6 years ago (diff)

Muokattu sotilaita viimeiseen muotoon.

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        protected float x, z;
14        protected int ppi = 0;
15        protected bool excludeEndSolidness;
16        protected float stopDistance;
17        protected int moveFails = 0;
18        protected float lastDist = 0.0F;
19        protected bool shouldFindPath = false;
20        protected bool createNewPathFinder;
21        protected float turnDistance;
22        protected bool stopOnMoveFail;
23
24        public OrderMove(float x, float z, float stopDistance = 2.0F, float turnDistance = 8.0F, bool excludeEndSolidness = false, bool createNewPathFinder = true, bool stopOnMoveFail = false)
25        {
26            this.stopDistance = stopDistance;
27            this.excludeEndSolidness = excludeEndSolidness;
28            this.createNewPathFinder = createNewPathFinder;
29            this.x = x;
30            this.z = z;
31            this.turnDistance = turnDistance;
32            this.stopOnMoveFail = stopOnMoveFail;
33        }
34
35        public override Order Initialize(Mob mob)
36        {
37            base.Initialize(mob);
38
39            if (createNewPathFinder)
40            {
41                if (mob.DistanceTo(x, z) > 64.0F)
42                {
43                    mob.PathFinder.InitializePathFinder((int)(mob.X / Viewport.TILESIZE), (int)(mob.Z / Viewport.TILESIZE), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), excludeEndSolidness);
44                    shouldFindPath = true;
45                }
46                else
47                {
48                    shouldFindPath = false;
49                    mob.PathFinder.Reset();
50                }
51            }
52            return this;
53        }
54
55        public override void Update()
56        {
57            if (shouldFindPath)
58            {
59                if (!mob.PathFinder.CanFindPath)
60                    return;
61                if (mob.PathFinder.IsPathFinding)
62                    mob.PathFinder.FindPath(125);
63            }
64
65            if (mob.PathFinder.Path.Count > 0 && ppi < mob.PathFinder.Path.Count)
66            {
67                Node currentTarget = mob.PathFinder.Path[ppi];
68                float xtPoint = currentTarget.X * Viewport.TILESIZE + 8.0F;
69                float ztPoint = currentTarget.Z * Viewport.TILESIZE + 8.0F;
70
71                float dist = mob.DistanceTo(xtPoint, ztPoint);
72                if (dist > turnDistance)
73                {
74                    if (mob.TurnTowards(xtPoint, ztPoint))
75                    {
76                        mob.MoveForward();
77
78                        if (dist == lastDist)
79                            moveFails++;
80                        else
81                            moveFails = 0;
82                        lastDist = dist;
83                    }
84                }
85                else
86                    ppi++;
87            }
88            else
89            {
90                float dist = mob.DistanceTo(x, z);
91                if (dist > 1.0F)
92                {
93                    if (mob.TurnTowards(x, z))
94                    {
95                        mob.MoveForward();
96
97                        if (dist == lastDist)
98                            moveFails++;
99                        else
100                            moveFails = 0;
101                        lastDist = dist;
102                    }
103                }
104            }
105        }
106
107        public bool FailingToMove { get { return moveFails > 20; } }
108
109        public override bool Finished
110        {
111            get
112            {
113                return (mob.DistanceTo(x, z) < stopDistance) || !mob.PathFinder.CanFindPath || (stopOnMoveFail && moveFails > 20);
114            }
115        }
116    }
117}
Note: See TracBrowser for help on using the repository browser.