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

Revision 4752, 4.8 KB checked in by dezhidki, 6 years ago (diff)
  • Muokattu AStarin debuggausta
  • Väritetty pelaajien pelinappuloita
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            currentOrderType = OrderType.CHOP;
68            currentTarget = te;
69            SetOrder(new OrderMove(currentTarget.X, currentTarget.Z, 20.0F, sameAmount * 4.0F, true, !wasCalledBefore));
70        }
71
72        private void StartChopping()
73        {
74            choppingAnimation.Start();
75            isChopping = true;
76        }
77
78        private void StopChopping()
79        {
80            isChopping = false;
81            currentOrderType = OrderType.NONE;
82            choppingAnimation.Stop();
83            choppingAnimation.Reset();
84        }
85
86        public override void OnFunctionClick(float x, float z, int sameOrderAmount, bool wasCalledBefore)
87        {
88            TileEntity te = level.GetTileEntity(this, (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE));
89            if (te != null && typeof(TileEntityTree).IsAssignableFrom(te.GetType()))
90            {
91                if (currentTarget != null) StopChopping();
92                OrderChop((TileEntityTree)te, sameOrderAmount, wasCalledBefore);
93            }
94            else
95            {
96                if (isChopping)
97                {
98                    StopChopping();
99                    currentTarget = null;
100                }
101                SetOrder(new OrderMove(x, z, 2.0F, sameOrderAmount * 4.0F, createNewPathFinder: !wasCalledBefore, stopOnMoveFail: true));
102            }
103            lastSameOrderAmount = sameOrderAmount;
104        }
105
106        protected override void OnOrderFinished()
107        {
108            base.OnOrderFinished();
109
110            if (currentOrderType == OrderType.CHOP)
111                StartChopping();
112        }
113
114        public override void Update()
115        {
116            base.Update();
117
118            if (isChopping)
119            {
120                if (currentTarget == null)
121                {
122                    StopChopping();
123                    OrderChop(level.GetNearestEntity<TileEntityTree>(this, 5), 1, false);
124                }
125                TurnTowards(currentTarget.X, currentTarget.Z);
126                choppingAnimation.UpdateStep();
127            }
128            else if (!isChopping && currentOrderType == OrderType.CHOP)
129            {
130                if (currentOrder != null && currentOrder is OrderMove && ((OrderMove)currentOrder).FailingToMove)
131                {
132                    StopChopping();
133                    OrderChop(level.GetNearestEntity<TileEntityTree>(this, 5), 1, false);
134                }
135            }
136
137
138            currentSpriteX = isChopping ? choppingAnimation.CurrentFrame : walkingAnimation.CurrentFrame;
139        }
140
141        public override void Render(RenderHelper renderer)
142        {
143            base.Render(renderer);
144            renderer.Render(ScreenPos, currentSpriteX, dirID, Owner.Team.SpriteSheetWoodcutter, colorizer, Viewport.ZOOM);
145        }
146    }
147}
Note: See TracBrowser for help on using the repository browser.