source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/Mob.cs @ 4646

Revision 4646, 5.2 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.World;
7using CastleMaster.Players;
8using Microsoft.Xna.Framework;
9using IsometricEngineTest.Ai;
10using IsometricEngineTest.Ai.Orders;
11using CastleMaster.Graphics;
12using CastleMaster.Entities;
13using System.Collections;
14
15namespace CastleMaster.Units.Mobs
16{
17    public abstract class Mob : Unit
18    {
19        protected Order currentOrder;
20        private float dir = 0.0F;
21        protected AStar pathFinder;
22        protected int dirID;
23        protected AnimationHelper walkingAnimation;
24        protected float pushResistance;
25        protected bool canBePushed;
26        private bool isPushed;
27        private float pushDir, pushPower;
28
29        public Mob(Level level, Player owner)
30            : base(level, owner)
31        {
32            currentOrder = new Order();
33            pathFinder = new AStar(level, this);
34            walkingAnimation = new AnimationHelper(10, 2).Start();
35            immunityTime = 20;
36            canBePushed = true;
37            pushResistance = 0.0F;
38        }
39
40        public Level Level { get { return level; } }
41
42        protected float Direction { get { return dir; } }
43
44        public AStar PathFinder { get { return pathFinder; } }
45
46        //public override bool IsSolidTo(Entity ent)
47        //{
48        //    Mob mob = ent as Mob;
49        //    if (mob != null)
50        //        return mob.Owner != Owner;
51        //    return base.IsSolidTo(ent);
52        //}
53
54        public override void Update()
55        {
56            base.Update();
57            if (!(currentOrder is OrderIdle))
58            {
59                currentOrder.Update();
60                if (currentOrder.Finished)
61                {
62                    StopCurrentOrder();
63                }
64            }
65
66            if (isPushed)
67            {
68                MoveTo(dir, pushPower);
69                isPushed = false;
70            }
71        }
72
73        public void OnGroupOrder(List<Mob> mobs, float x, float z)
74        {
75            foreach (var mobGroup in mobs.GroupBy(m => m.TypeID))
76            {
77                List<Mob> ms = mobGroup.ToList();
78                ms[0].OnSameTypeGroupOrder(ms, x, z);
79            }
80        }
81
82        protected virtual void OnSameTypeGroupOrder(List<Mob> mobs, float x, float z)
83        {
84            OnFunctionClick(x, z, mobs.Count, false);
85            foreach (Mob m in mobs)
86            {
87                if (m == this) continue;
88                m.OnFunctionClick(x, z, mobs.Count, true);
89                m.pathFinder = pathFinder;
90            }
91        }
92
93        protected void StopCurrentOrder()
94        {
95            OnOrderFinished();
96            SetOrder(GetNextOrder());
97        }
98
99        protected virtual void OnOrderFinished()
100        {
101            walkingAnimation.Reset();
102        }
103
104        public void SetOrder(Order order)
105        {
106            currentOrder = order;
107            order.Initialize(this);
108        }
109
110        public override void Damage(Unit attacker, int damage, float dir, float pushPower)
111        {
112            base.Damage(attacker, damage, dir, pushPower);
113            if (canBePushed)
114                Push(dir, pushPower);
115        }
116
117        private void Push(float dir, float pushPower)
118        {
119            isPushed = true;
120            pushDir = dir;
121            this.pushPower = pushPower - pushResistance;
122        }
123
124        private void MoveTo(float dir, float amount)
125        {
126            float moveX = (float)Math.Cos(dir) * amount;
127            float moveZ = (float)Math.Sin(dir) * amount;
128
129            Move(moveX, moveZ);
130        }
131
132        public bool MoveForward()
133        {
134            float moveX = (float)Math.Cos(dir) * moveSpeed;
135            float moveZ = (float)Math.Sin(dir) * moveSpeed;
136
137            if (Move(moveX, moveZ))
138            {
139                walkingAnimation.UpdateStep();
140                return true;
141            }
142
143            return false;
144        }
145
146        public virtual Order GetNextOrder()
147        {
148            return new Order();
149        }
150
151        public bool TurnTowards(float x, float z)
152        {
153            float angleTowards = (float)Math.Atan2(z - Z, x - X);
154
155            dir = MathHelper.WrapAngle(dir);
156
157            float angleDifferece = angleTowards - dir;
158            angleDifferece = MathHelper.WrapAngle(angleDifferece);
159
160            float maxTurn = 0.2F;
161            float near = 1.0F;
162            bool turnDone = angleDifferece * angleDifferece < near * near;
163            if (angleDifferece < -maxTurn) angleDifferece = -maxTurn;
164            if (angleDifferece > maxTurn) angleDifferece = maxTurn;
165            dir += angleDifferece;
166            dirID = GetDirectionID();
167
168            return turnDone;
169        }
170
171        protected void UpdateDir(float x, float z)
172        {
173            dir = (float)Math.Atan2(z - Z, x - X);
174            dirID = GetDirectionID();
175        }
176
177        public int GetDirectionID()
178        {
179            return (int)(Math.Floor(dir * 8 / MathHelper.TwoPi + 0.5F)) & 7;
180        }
181
182        public abstract int TypeID { get; }
183    }
184}
Note: See TracBrowser for help on using the repository browser.