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

Revision 4592, 4.3 KB checked in by dezhidki, 10 years ago (diff)

Lisätty toimiva sotilas. Korjattu OrderMove:n epätarkkuuksia. Lisätty AStariin muuttuja, jolla voi jättää loppupisteen läpipääsemättömyyden huomioimatta.

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