source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobRanger.cs @ 4616

Revision 4616, 4.6 KB checked in by dezhidki, 8 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.Graphics;
6using CastleMaster.World;
7using CastleMaster.Players;
8using IsometricEngineTest.Ai.Orders;
9using CastleMaster.Entities;
10
11namespace CastleMaster.Units.Mobs
12{
13    public class MobRanger : Mob
14    {
15        private enum OrderType { ATTACK, WALK, NONE }
16
17        private const float ATTACK_RANGE = 60.0F;
18        private const float ATTACK_RANGE_SQR = ATTACK_RANGE * ATTACK_RANGE;
19
20        private Unit target;
21        private OrderType currentOrderType = OrderType.NONE;
22        private bool isAttacking = false;
23        private int maxDamage = 5;
24        private AnimationHelper hitAnimation;
25        private int spriteX;
26        private float pushPower = 5.0F;
27
28        public MobRanger(Level level, Player owner)
29            : base(level, owner)
30        {
31            HasHealth = true;
32            maxHealth = 50;
33
34            spriteSize.X = 17;
35            spriteSize.Y = 20;
36            screenRectOffset.Update(8, 12, 8 + spriteSize.X, 12 + spriteSize.Y);
37            renderOffset.Y = 20;
38
39            highlightOffset.X = 11;
40
41            rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F);
42            isSolid = true;
43            moveSpeed = 1.0F;
44            hitAnimation = new AnimationHelper(10, 5, false, 3);
45            hitAnimation.RoundEnded += delegate()
46            {
47                if (target != null)
48                    level.AddEntity(new EntityArrow(level, 5, 2.0F, target, this, Owner.Team), X + (float)Math.Cos(Direction) * 2.0F, Z + (float)Math.Sin(Direction) * 2.0F);
49            };
50        }
51
52        private void StartAttack()
53        {
54            isAttacking = true;
55            hitAnimation.Start();
56        }
57
58        private void StopAttack()
59        {
60            isAttacking = false;
61            target = null;
62            currentOrderType = OrderType.NONE;
63        }
64
65        private void PauseAttack()
66        {
67            isAttacking = false;
68            hitAnimation.Stop();
69            hitAnimation.Reset();
70        }
71
72        private void CreateAttackOrder(Unit u)
73        {
74            currentOrderType = OrderType.ATTACK;
75            SetOrder(new OrderMove(u.X, u.Z, ATTACK_RANGE, true));
76            target = u;
77        }
78
79        public override void Damage(Unit attacker, int damage, float dir, float pushPower)
80        {
81            base.Damage(attacker, damage, dir, pushPower);
82            if (!isAttacking && currentOrderType == OrderType.NONE)
83                CreateAttackOrder(attacker);
84        }
85
86        protected override void OnOrderFinished()
87        {
88            base.OnOrderFinished();
89            if (currentOrderType == OrderType.ATTACK)
90                StartAttack();
91            else if (currentOrderType == OrderType.WALK)
92                currentOrderType = OrderType.NONE;
93        }
94
95        public override void OnFunctionClick(float x, float z)
96        {
97            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team));
98            if (u != null)
99                CreateAttackOrder(u);
100            else
101            {
102                if (target != null) StopAttack();
103                currentOrderType = OrderType.WALK;
104                SetOrder(new OrderMove(x, z));
105            }
106        }
107
108        public override void Update()
109        {
110            base.Update();
111
112            if (isAttacking)
113            {
114                if (DistanceToSqr(target.X, target.Z) > ATTACK_RANGE_SQR)
115                {
116                    isAttacking = false;
117                    CreateAttackOrder(target);
118                }
119                else
120                {
121                    UpdateDir(target.X, target.Z);
122                    hitAnimation.UpdateStep();
123                    if (target.Removed)
124                        StopAttack();
125                }
126            }
127            else if (!isAttacking && currentOrderType == OrderType.NONE)
128            {
129                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 4);
130                if (units.Count > 0)
131                    CreateAttackOrder(units[0]);
132            }
133
134            spriteX = isAttacking ? hitAnimation.CurrentFrame : walkingAnimation.CurrentFrame;
135        }
136
137        public override void Render(RenderHelper renderer)
138        {
139            base.Render(renderer);
140            renderer.Render(ScreenPos, spriteX, dirID, Resources.SPRITESHEET_RANGER, colorizer, Viewport.ZOOM);
141        }
142    }
143}
Note: See TracBrowser for help on using the repository browser.