source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWarrior.cs @ 4635

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

Talletus.

Line 
1using CastleMaster.World;
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using System.Text;
6using CastleMaster.Players;
7using CastleMaster.Graphics;
8using IsometricEngineTest.Ai.Orders;
9using System.Diagnostics;
10
11namespace CastleMaster.Units.Mobs
12{
13    public class MobWarrior : Mob
14    {
15        private enum OrderType { ATTACK, WALK, NONE }
16
17        private float ATTACK_RANGE_OFFSET = 20.0F;
18        private float attackRange, attackRangeSqr;
19
20        private Unit target;
21        private OrderType currentOrderType = OrderType.NONE;
22        private bool isAttacking = false;
23        private int maxDamage = 7;
24        private AnimationHelper hitAnimation;
25        private int spriteX;
26        private float pushPower = 5.0F;
27
28        public MobWarrior(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.25F;
44            hitAnimation = new AnimationHelper(8, 5, false, 3);
45            hitAnimation.RoundEnded += delegate
46            {
47                if (target != null)
48                    Hit(target, Game.Random.Next(1, maxDamage + 1), Direction, pushPower);
49            };
50        }
51
52        public override int TypeID
53        {
54            get { return 2; }
55        }
56
57        private void StartAttack()
58        {
59            isAttacking = true;
60            hitAnimation.Start();
61        }
62
63        private void StopAttack()
64        {
65            isAttacking = false;
66            target = null;
67            currentOrderType = OrderType.NONE;
68        }
69
70        private void PauseAttack()
71        {
72            isAttacking = false;
73            hitAnimation.Stop();
74            hitAnimation.Reset();
75        }
76
77        private void CreateAttackOrder(Unit u, bool wasCalledBefore)
78        {
79            currentOrderType = OrderType.ATTACK;
80            attackRange = u.Width / 2 + ATTACK_RANGE_OFFSET;
81            attackRangeSqr = attackRange * attackRange;
82            SetOrder(new OrderMove(u.X, u.Z, attackRange, true, !wasCalledBefore));
83            target = u;
84        }
85
86        public override void Damage(Unit attacker, int damage, float dir, float pushPower)
87        {
88            base.Damage(attacker, damage, dir, pushPower);
89            if (!isAttacking && currentOrderType == OrderType.NONE)
90                CreateAttackOrder(attacker, false);
91        }
92
93        protected override void OnOrderFinished()
94        {
95            base.OnOrderFinished();
96            if (currentOrderType == OrderType.ATTACK)
97                StartAttack();
98            else if (currentOrderType == OrderType.WALK)
99                currentOrderType = OrderType.NONE;
100        }
101
102        public override void OnFunctionClick(float x, float z, bool wasCalledBefore)
103        {
104            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team));
105            if (u != null)
106                CreateAttackOrder(u, wasCalledBefore);
107            else
108            {
109                if (target != null) StopAttack();
110                currentOrderType = OrderType.WALK;
111                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore));
112            }
113        }
114
115        public override void Update()
116        {
117            base.Update();
118
119            if (isAttacking)
120            {
121                if (DistanceToSqr(target.X, target.Z) > attackRangeSqr)
122                {
123                    isAttacking = false;
124                    CreateAttackOrder(target, false);
125                }
126                else
127                {
128                    UpdateDir(target.X, target.Z);
129                    hitAnimation.UpdateStep();
130                    if (target.Removed)
131                        StopAttack();
132                }
133                if (target == null || target.Removed)
134                    StopAttack();
135            }
136            else if (!isAttacking && currentOrderType == OrderType.NONE)
137            {
138                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 2);
139                if (units.Count > 0)
140                    CreateAttackOrder(units[0], false);
141            }
142
143            spriteX = isAttacking ? hitAnimation.CurrentFrame : walkingAnimation.CurrentFrame;
144        }
145
146        public override void Render(RenderHelper renderer)
147        {
148            base.Render(renderer);
149            renderer.Render(ScreenPos, spriteX, dirID, Resources.SPRITESHEET_WARRIOR, colorizer, Viewport.ZOOM);
150        }
151    }
152}
Note: See TracBrowser for help on using the repository browser.