source: 2013/27/ArttuY/trunk/RampageRebellion/RampageRebellion/RampageRebellion/RRWeaponArsenal.cs @ 4451

Revision 4451, 8.6 KB checked in by eearyla, 7 years ago (diff)

Backup

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Controls;
8using Jypeli.Effects;
9using Jypeli.Widgets;
10
11public class RRWeaponArsenal : GameObject
12{
13
14    private List<RRWeapon> weapons = new List<RRWeapon>();
15    private int _currentWeaponIndex;
16    private static Object lockObject = new Object();
17    private static Object collisionLockObject = new Object();
18
19    public readonly IntMeter currentWeaponIndexMeter = new IntMeter(0);
20    //private static PhysicsObject trueParentObj;
21
22
23    public override void Destroy()
24    {
25        lock (lockObject)
26        {
27
28            for (int i = 0; i < weapons.Count; i++)
29            {
30                this.Remove(weapons[i]);
31
32            }
33        }
34        //weapons = null;
35        base.Destroy();
36    }
37
38    //Overriden properties
39
40
41    public List<RRWeapon> Weapons
42    {
43        get { return weapons; }
44    }
45
46
47
48    public int currentWeaponIndex
49    {
50        get { return _currentWeaponIndex; }
51        set { lock (lockObject) { _currentWeaponIndex = value; } }
52    }
53
54    public bool IsReady
55    {
56        get { return weapons[_currentWeaponIndex].IsReady; }
57    }
58
59    public bool CanHitOwner
60    {
61        get { return weapons[_currentWeaponIndex].CanHitOwner; }
62        set { weapons[_currentWeaponIndex].CanHitOwner = value; }
63    }
64
65    public bool InfiniteAmmo
66    {
67        get { return weapons[_currentWeaponIndex].InfiniteAmmo; }
68        set { weapons[_currentWeaponIndex].InfiniteAmmo = value; }
69    }
70
71    public bool AmmoIgnoresGravity
72    {
73        get { return weapons[_currentWeaponIndex].AmmoIgnoresGravity; }
74        set { weapons[_currentWeaponIndex].AmmoIgnoresGravity = value; }
75    }
76
77    public bool AmmoIgnoresExplosions
78    {
79        get { return weapons[_currentWeaponIndex].AmmoIgnoresExplosions; }
80        set { weapons[_currentWeaponIndex].AmmoIgnoresExplosions = value; }
81    }
82
83    public TimeSpan MaxAmmoLifetime
84    {
85        get { return weapons[_currentWeaponIndex].MaxAmmoLifetime; }
86        set { weapons[_currentWeaponIndex].MaxAmmoLifetime = value; }
87    }
88
89    public TimeSpan TimeBetweenUse
90    {
91        get { return weapons[_currentWeaponIndex].TimeBetweenUse; }
92        set { weapons[_currentWeaponIndex].TimeBetweenUse = value; }
93    }
94
95    public SoundEffect AttackSound
96    {
97        get { return weapons[_currentWeaponIndex].AttackSound; }
98        set { weapons[_currentWeaponIndex].AttackSound = value; }
99    }
100
101    public DoubleMeter Power
102    {
103        get { return weapons[_currentWeaponIndex].Power; }
104        set { weapons[_currentWeaponIndex].setPower(value); }
105    }
106
107    protected IntMeter Ammo
108    {
109        get { return weapons[_currentWeaponIndex].Ammo; }
110        set { weapons[_currentWeaponIndex].setAmmo(value); }
111    }
112
113    public double FireRate
114    {
115        get { return weapons[_currentWeaponIndex].FireRate; }
116        set { weapons[_currentWeaponIndex].FireRate = value; }
117    }
118
119    public CollisionHandler<PhysicsObject, PhysicsObject> ProjectileCollision = null;
120
121
122    /// <summary>
123    /// A "bucket" of sorts for collision handling - it is automatically added to each weapon as its collision handler
124    /// </summary>
125    /// <param name="p"></param>
126    /// <param name="d"></param>
127
128    public void weaponCollisionBucket(PhysicsObject p, PhysicsObject d)
129    {
130        if (ProjectileCollision != null)
131        {
132            lock (collisionLockObject)
133            {
134                ProjectileCollision(p, d);
135            }
136        }
137    }
138
139    // Constructors, overriden methods
140    public RRWeaponArsenal()
141        : this(1, 1)
142    {
143        this.IsVisible = false; //Do not show ANYTHING!
144        //base.Ammo.Value = 0;
145        //base.InfiniteAmmo = false;
146        base.Color = Color.LimeGreen;
147        //setWeapon(0);
148    }
149
150    private RRWeaponArsenal(double width, double height)
151        : base(width, height)
152    {
153        addNewWeapon(new RRWeapon(width, height));
154        setWeapon(0);
155        //Power = new DoubleMeter(1);
156    }
157
158    public RRWeaponArsenal(RRWeapon bw)
159        : base(1, 1)
160    {
161        addNewWeapon(bw);
162        setWeapon(0);
163        //Power = new DoubleMeter(1);
164    }
165
166    public void addNewWeapon(RRWeapon r) {
167        lock (lockObject)
168        {
169            weapons.Add(r);
170            this.Add(r);
171            r.IsVisible = false;
172            r.ProjectileCollision = weaponCollisionBucket;
173        }
174    }
175
176    public void deleteWeapon(int i)
177    {
178        lock (lockObject)
179        {
180            RRWeapon wp = weapons[i];
181            weapons.Remove(wp);
182            wp.Destroy();
183        }
184    }
185
186
187
188    public void resetAndAddNew(RRWeapon rrw)
189    {
190        lock (lockObject)
191        {
192            for (int i = 0; i < weapons.Count; i++) deleteWeapon(i);
193       
194
195        weapons.Add(rrw);
196        this.Add(rrw);
197        rrw.IsVisible = false;
198        rrw.ProjectileCollision = weaponCollisionBucket;
199        _currentWeaponIndex = 0;
200        }
201    }
202
203    /// <summary>
204    /// Internal SetWeapon - does NOT mind thread lockings - PRIVATE for a reason!
205    /// </summary>
206    /// <param name="dI"></param>
207
208    private void _setWeapon(int dI)
209    {
210            _currentWeaponIndex = dI;
211
212            for (int i = 0; i < weapons.Count; i++)
213            {
214                weapons[i].IsVisible = (dI == i);
215
216            }
217    }
218
219    /// <summary>
220    /// Set a new weapon
221    /// </summary>
222    /// <param name="dI">Index for this specific weapon</param>
223
224    public void setWeapon(int dI)
225    {
226        lock (lockObject)
227        {
228            _currentWeaponIndex = dI;
229
230            for (int i = 0; i < weapons.Count; i++)
231            {
232                weapons[i].IsVisible = (dI == i);
233
234            }
235
236            //Count the meter display
237
238            int indExcluding = -1;
239
240            for (int i = 0; i < weapons.Count; i++)
241            {
242                if (i > dI) break;
243                if (weapons[i].countInWeaponArsenal) indExcluding++;
244               
245            }
246
247            currentWeaponIndexMeter.SetValue(Math.Max(0, indExcluding));
248        }
249    }
250
251    /// <summary>
252    /// Activates the next ready weapon in the arsenal - or remains in the current one
253    /// </summary>
254
255    public void setNextWeapon()
256    {
257        lock (lockObject)
258        {
259            if (weapons.Count <= 1) { setWeapon(0); return; }
260            int wTC = weapons.Count - 1; //How many weapons forward we need to look?
261            int wCounter = 1;
262
263            int setToThisWeapon = -1;
264
265            while (wCounter <= wTC)
266            {
267                int trueIndex = (_currentWeaponIndex + wCounter) % weapons.Count;
268
269                if (weapons[trueIndex].countInWeaponArsenal) { setToThisWeapon = trueIndex; break; }
270
271                wCounter++;
272            }
273
274            setWeapon((setToThisWeapon == -1) ? _currentWeaponIndex : setToThisWeapon);
275        }
276    }
277
278    /// <summary>
279    /// Sets the next weapon - WHENEVER it is ready or not!
280    /// </summary>
281
282    public void setNextReadyWeapon()
283    {
284        lock (lockObject)
285        {
286            if (weapons.Count <= 1) { setWeapon(0); return; }
287            int wTC = weapons.Count - 1; //How many weapons forward we need to look?
288            int wCounter = 1;
289
290            int setToThisWeapon = -1;
291
292            while (wCounter <= wTC)
293            {
294                int trueIndex = (_currentWeaponIndex + wCounter) % weapons.Count;
295
296                if ((weapons[trueIndex].IsReady) && weapons[trueIndex].countInWeaponArsenal) { setToThisWeapon = trueIndex; break; }
297
298                wCounter++;
299            }
300
301            setWeapon((setToThisWeapon == -1) ? _currentWeaponIndex : setToThisWeapon);
302        }
303    }
304
305    public PhysicsObject Shoot()
306    {
307        lock (lockObject)
308        {
309
310            if ((weapons[_currentWeaponIndex].Ammo.Value <= 0) && !weapons[_currentWeaponIndex].InfiniteAmmo) setNextReadyWeapon();
311            PhysicsObject pw = weapons[_currentWeaponIndex].Shoot();
312
313            return pw;
314
315        }
316    }
317
318    public PhysicsObject singleShoot(int index)
319    {
320
321        int oldIndex = _currentWeaponIndex;
322        PhysicsObject ss;
323
324        lock (lockObject)
325        {
326            lock (collisionLockObject)
327            {
328                _setWeapon(index);
329                ss = weapons[_currentWeaponIndex].Shoot();
330                _setWeapon(oldIndex);
331            }
332        }
333
334        return ss;
335    }
336
337}
Note: See TracBrowser for help on using the repository browser.