source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWoodcutter.cs @ 4756

Revision 4756, 5.4 KB checked in by dezhidki, 8 years ago (diff)
  • Nimi muutettu (Sound2D -> Audio)
  • Lisätty perusäänet
  • Muokattu Ctrl + RMouse kombinaatiota
    • Nyt voi myös klikata sen sijaan että valitsee laatikolla
Line 
1using CastleMaster.Entities.TileEntities;
2using CastleMaster.Graphics;
3using CastleMaster.Players;
4using CastleMaster.Sound;
5using CastleMaster.World;
6using IsometricEngineTest.Ai.Orders;
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Audio;
9
10namespace CastleMaster.Units.Mobs
11{
12    public class MobWoodcutter : Mob
13    {
14        private enum OrderType { CHOP, MOVE, AVOID, NONE }
15
16        private TileEntityTree currentTarget;
17        private bool isChopping = false;
18        private TimerHelper choppingAnimation;
19        private int currentSpriteX;
20        private OrderType currentOrderType = OrderType.NONE;
21        private int lastSameOrderAmount = 0;
22
23        public MobWoodcutter(Level level, Player owner)
24            : base(level, owner)
25        {
26            HasHealth = true;
27            maxHealth = 20;
28
29            spriteSize.X = 17;
30            spriteSize.Y = 20;
31            screenRectOffset.Update(8, 12, 8 + spriteSize.X, 12 + spriteSize.Y);
32            renderOffset.Y = 20;
33
34            highlightOffset.X = 11;
35
36            rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F);
37            isSolid = true;
38
39            moveSpeed = 2.0F;
40            choppingAnimation = new TimerHelper(10, 5, false, 3);
41            choppingAnimation.RoundEnded += delegate()
42            {
43                Audio.PlaySound3D(emitter, screenPos, "wood");
44                owner.LumberAmount++;
45                currentTarget.AvaliableLogs--;
46                if (currentTarget.AvaliableLogs <= 0)
47                {
48                    currentTarget.Remove();
49                    currentTarget = null;
50                    OrderChop(level.GetNearestEntity<TileEntityTree>(this, 5), 1, false);
51                }
52            };
53        }
54
55        public override int TypeID
56        {
57            get { return 0; }
58        }
59
60        public override void OnRemoved()
61        {
62            base.OnRemoved();
63            Audio.PlaySound3D(emitter, screenPos, "death2");
64        }
65
66        public void OrderChop(TileEntityTree te, int sameAmount, bool wasCalledBefore)
67        {
68            if (te == null)
69                return;
70            currentOrderType = OrderType.CHOP;
71            currentTarget = te;
72            SetOrder(new OrderMove(currentTarget.X, currentTarget.Z, 20.0F, sameAmount * 4.0F, true, !wasCalledBefore));
73        }
74
75        private void StartChopping()
76        {
77            choppingAnimation.Start();
78            isChopping = true;
79        }
80
81        private void StopChopping()
82        {
83            isChopping = false;
84            currentOrderType = OrderType.NONE;
85            choppingAnimation.Stop();
86            choppingAnimation.Reset();
87        }
88
89        public override void OnFunctionClick(float x, float z, int sameOrderAmount, bool wasCalledBefore)
90        {
91            //emmitter.Position = new Vector3(ScreenPos.X, 0.0F, ScreenPos.Y);
92            //Sound2D.PlaySound3D(emmitter, "sword1");
93            TileEntity te = level.GetTileEntity(this, (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE));
94            if (te != null && typeof(TileEntityTree).IsAssignableFrom(te.GetType()))
95            {
96                if (currentTarget != null) StopChopping();
97                OrderChop((TileEntityTree)te, sameOrderAmount, wasCalledBefore);
98            }
99            else
100            {
101                if (isChopping)
102                {
103                    StopChopping();
104                    currentTarget = null;
105                }
106                SetOrder(new OrderMove(x, z, 2.0F, sameOrderAmount * 4.0F, createNewPathFinder: !wasCalledBefore, stopOnMoveFail: true));
107            }
108            lastSameOrderAmount = sameOrderAmount;
109        }
110
111        protected override void OnOrderFinished()
112        {
113            base.OnOrderFinished();
114
115            if (currentOrderType == OrderType.CHOP)
116                StartChopping();
117        }
118
119        private void TryChopNearestTree(int radius)
120        {
121            TileEntityTree nearestTree = level.GetNearestEntity<TileEntityTree>(this, radius);
122            if (nearestTree != null)
123                OrderChop(nearestTree, 1, false);
124            else return;
125        }
126
127        public override void Update()
128        {
129            base.Update();
130
131            if (isChopping)
132            {
133                if (currentTarget == null)
134                {
135                    StopChopping();
136                    TryChopNearestTree(5);
137                }
138                else
139                {
140                    TurnTowards(currentTarget.X, currentTarget.Z);
141                    choppingAnimation.UpdateStep();
142                }
143            }
144            else if (!isChopping && currentOrderType == OrderType.CHOP)
145            {
146                if (currentOrder != null && currentOrder is OrderMove && ((OrderMove)currentOrder).FailingToMove)
147                {
148                    StopChopping();
149                    TryChopNearestTree(5);
150                }
151            }
152
153
154            currentSpriteX = isChopping ? choppingAnimation.CurrentFrame : walkingAnimation.CurrentFrame;
155        }
156
157        public override void Render(RenderHelper renderer)
158        {
159            base.Render(renderer);
160            renderer.Render(ScreenPos, currentSpriteX, dirID, Owner.Team.SpriteSheetWoodcutter, colorizer, Viewport.ZOOM);
161        }
162    }
163}
Note: See TracBrowser for help on using the repository browser.