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

Revision 4671, 4.6 KB checked in by dezhidki, 7 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.World;
6using CastleMaster.Players;
7using CastleMaster.Graphics;
8using IsometricEngineTest.Ai.Orders;
9using Microsoft.Xna.Framework;
10using CastleMaster.Entities.TileEntities;
11using CastleMaster.Ai.Orders;
12using System.Diagnostics;
13
14namespace CastleMaster.Units.Mobs
15{
16    public class MobWoodcutter : Mob
17    {
18        private enum OrderType { CHOP, MOVE, AVOID, NONE }
19
20        private TileEntityTree currentTarget;
21        private bool isChopping = false;
22        private TimerHelper choppingAnimation;
23        private int currentSpriteX;
24        private OrderType currentOrderType = OrderType.NONE;
25        private int lastSameOrderAmount = 0;
26
27        public MobWoodcutter(Level level, Player owner)
28            : base(level, owner)
29        {
30            HasHealth = true;
31            maxHealth = 20;
32
33            spriteSize.X = 17;
34            spriteSize.Y = 20;
35            screenRectOffset.Update(8, 12, 8 + spriteSize.X, 12 + spriteSize.Y);
36            renderOffset.Y = 20;
37
38            highlightOffset.X = 11;
39
40            rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F);
41            isSolid = true;
42
43            moveSpeed = 2.0F;
44            choppingAnimation = new TimerHelper(10, 5, false, 3);
45            choppingAnimation.RoundEnded += delegate()
46            {
47                owner.LumberAmount++;
48                currentTarget.AvaliableLogs--;
49                if (currentTarget.AvaliableLogs <= 0)
50                {
51                    currentTarget.Remove();
52                    currentTarget = null;
53                    OrderChop(level.GetNearestEntity<TileEntityTree>(this, 5), 1, false);
54                }
55            };
56        }
57
58        public override int TypeID
59        {
60            get { return 0; }
61        }
62
63        public void OrderChop(TileEntityTree te, int sameAmount, bool wasCalledBefore)
64        {
65            if (te == null)
66                return;
67            isChopping = true;
68            currentOrderType = OrderType.CHOP;
69            currentTarget = te;
70            SetOrder(new OrderMove(currentTarget.X, currentTarget.Z, 20.0F, sameAmount * 4.0F, true, !wasCalledBefore));
71        }
72
73        private void StartChopping()
74        {
75            choppingAnimation.Start();
76            isChopping = true;
77        }
78
79        private void StopChopping()
80        {
81            isChopping = false;
82            currentOrderType = OrderType.NONE;
83            choppingAnimation.Stop();
84            choppingAnimation.Reset();
85        }
86
87        public override void OnFunctionClick(float x, float z, int sameOrderAmount, bool wasCalledBefore)
88        {
89            TileEntity te = level.GetTileEntity(this, (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE));
90            if (te != null && typeof(TileEntityTree).IsAssignableFrom(te.GetType()))
91            {
92                if (currentTarget != null) StopChopping();
93                OrderChop((TileEntityTree)te, sameOrderAmount, wasCalledBefore);
94            }
95            else
96            {
97                if (isChopping)
98                {
99                    StopChopping();
100                    currentTarget = null;
101                }
102                SetOrder(new OrderMove(x, z, 2.0F, sameOrderAmount * 4.0F, createNewPathFinder: !wasCalledBefore, stopOnMoveFail: true));
103            }
104            lastSameOrderAmount = sameOrderAmount;
105        }
106
107        protected override void OnOrderFinished()
108        {
109            base.OnOrderFinished();
110
111            if (currentOrderType == OrderType.CHOP)
112                StartChopping();
113        }
114
115        public override void Update()
116        {
117            base.Update();
118
119            if (isChopping)
120            {
121                TurnTowards(currentTarget.X, currentTarget.Z);
122                choppingAnimation.UpdateStep();
123            }
124            else if (!isChopping && currentOrderType == OrderType.CHOP)
125            {
126                if (currentOrder != null && currentOrder is OrderMove && ((OrderMove)currentOrder).FailingToMove)
127                {
128                    StopChopping();
129                    StopCurrentOrder();
130                }
131            }
132
133
134            currentSpriteX = isChopping ? choppingAnimation.CurrentFrame : walkingAnimation.CurrentFrame;
135        }
136
137        public override void Render(RenderHelper renderer)
138        {
139            base.Render(renderer);
140            renderer.Render(ScreenPos, currentSpriteX, dirID, Resources.SPRITESHEET_WOODCUTTER, colorizer, Viewport.ZOOM);
141        }
142    }
143}
Note: See TracBrowser for help on using the repository browser.