small cleanups: use new k8vavoom decorate actions
[k8zan.git] / decorate / Weapons / Crushbow.txt
blobe1e45c1d1fe186854f90da25db6d6acd10a0510f
1 ACTOR BoltMag : Ammo replaces RocketBox {
2   Radius 25
3   Height 16
4   Scale 0.5
5   Inventory.Amount 6
6   Inventory.MaxAmount 42
7   Ammo.BackpackAmount 12
8   Ammo.BackpackMaxAmount 54
9   Inventory.Icon "ABOLA0"
10   Inventory.PickupMessage "Picked up a Boltmag."
11   Inventory.PickupSound "Ammo/BoltMagPick"
13   States {
14   Spawn:
15     ABOL A -1
16     Stop
17   }
21 ACTOR BoltMagOne : BoltMag replaces RocketAmmo {
22   Radius 25
23   Height 16
24   Scale 0.3
25   Inventory.Amount 2
26   Inventory.PickupMessage "Picked up one Bolt."
28   States {
29   Spawn:
30     ABOL A -1
31     Stop
32   }
36 ACTOR BoltMagDropped {
37   Radius 1
38   Height 1
39   XScale 0.40
40   YScale 0.45
41   Gravity 0.85
42   +MOVEWITHSECTOR
43   +MISSILE
44   +NOBLOCKMAP
45   +BOUNCEONFLOORS
46   +BOUNCEONWALLS
47   +BOUNCEONCEILINGS
48   +ALLOWBOUNCEONACTORS
49   +BOUNCEONACTORS
50   +NoTeleport
51   +k8AllowSimpleTick
52   BounceType Doom
53   BounceFactor 0.7
54   BounceCount 2
55   BounceSound "Ammo/BoltmagBounce"
57   States {
58   Spawn:
59     ABOL B 1000
60     Stop
62   Death:
63     ABOL C -1
64     Stop
65   }
69 ACTOR CrushbowLoaded : Ammo {
70   Inventory.Amount 0
71   Inventory.MaxAmount 6
72   Ammo.BackpackAmount 0
73   Ammo.BackpackMaxAmount 6
74   +INVENTORY.IGNORESKILL
78 ACTOR Crushbow : Weapon replaces RocketLauncher {
79   Xscale 0.35
80   Yscale 0.28
81   Radius 32
82   Height 18
83   +WEAPON.NOAUTOFIRE
84   +INVENTORY.UNDROPPABLE
85   +WEAPON.NOALERT
86   //+WEAPON.NO_AUTO_SWITCH
87   +WEAPON.AMMO_OPTIONAL
88   //+WEAPON.ALT_USES_BOTH
89   Inventory.PickupMessage "Got a Crushbow."
90   Inventory.PickupSound "Weapons/CrushbowPump"
91   //Inventory.Icon "WCRUA0"
92   Tag "Crushbow"
93   Weapon.SelectionOrder 5
94   //Weapon.MinSelectionAmmo1 0
95   //Weapon.MinSelectionAmmo2 1
96   Weapon.AmmoType1 "CrushbowLoaded"
97   Weapon.AmmoGive1 0
98   Weapon.AmmoUse1 1
99   Weapon.AmmoType2 "BoltMag"
100   Weapon.AmmoGive2 3
101   Weapon.AmmoUse2 0
102   Weapon.SlotNumber 5
104   var int user_lowPauseCount;
106   States {
107   Spawn:
108     WCRU B -1
109     Stop
111   /*
112   TryPickupWeapon:
113     TNT1 A 0 A_k8ConLog(va("trying to pickup weapon, self=%C", GetSelf))
114     Fail
115   */
117   PickupWeapon:
118     // always has some loaded ammo on first pickup
119     TNT1 A 0 A_GiveInventory("CrushbowLoaded", random(1, 4))
120     Stop
122   Select:
123     stateinclude "QuickKick/QuickKickOnSelectDeselect.txt"
124     TNT1 A 0 A_GiveInventory("HoldingCrushbow", 1)
125     TNT1 A 0 { if (GetCVarB('k8ZanMod_CustomCrosshairs')) A_SetCrosshair(5); }
126     TNT1 A 0 A_Raise(666)
127     Goto Ready
129   Deselect:
130     stateinclude "QuickKick/QuickKickOnSelectDeselect.txt"
131     WCRR A 1 Offset(-15, 40)
132     WCRR A 1 Offset(-30, 50)
133     WCRR A 1 Offset(-50, 65)
134     WCRR A 1 Offset(-70, 80)
135     Goto DeselectLoop
137   DeselectLoop:
138     TNT1 A 0 A_TakeInventory("HoldingCrushbow", 1)
139     TNT1 A 1 A_Lower(666)  // was zero duration
140     Loop
142   Ready:
143     TNT1 A 8
144     TNT1 A 0 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON, 0.6)
145     WCRR A 1 Offset(-70, 80)
146     WCRR A 1 Offset(-50, 65)
147     WCRR A 1 Offset(-30, 50)
148     WCRR A 1 Offset(-15, 40)
149     TNT1 A 0 A_TakeInventory("QuickKickDisabled")
150     Goto ReadyIdle
152   ReadyIdle:
153     WSPI A 0
154       {
155         // low ammo sound
156         if (CountInv("CrushbowLoaded") < 3) {
157           user_lowPauseCount -= 1;
158           if (user_lowPauseCount < 1) {
159             if (user_lowPauseCount > -666 && GetCVarB("k8ZanMod_WarnLowAmmo")) {
160               A_PlaySound("weapons/zanweapon/lowammo", CHAN_VOICE, 1.0);
161             }
162             local ammoCount = CountInv("CrushbowLoaded");
163                  if (ammoCount > 1) user_lowPauseCount = 30/8;
164             else if (ammoCount > 0) user_lowPauseCount = 20/8;
165             else user_lowPauseCount = 10; // no need to divide here
166           }
167         }
168       }
169     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "ReadyEmptyGun")
170     WCRR A 8 A_WeaponReady(WRF_ALLOWRELOAD)
171     Loop
173   ReadyEmptyGun:
174     WCRF E 1 A_WeaponReady(WRF_ALLOWRELOAD)
175     //Loop
176     Goto ReadyIdle  // for sound
178   Fire:
179     TNT1 A 0 A_JumpIfNoAmmo("Reload")
180     TNT1 A 0 A_JumpIf(waterlevel==3, "WaterFire")
181     WSPI A 0 A_FireProjectile("FireBolt", 0, 1, /*2*/0, 1, FPF_NOAUTOAIM, 0)
182     WCRR A 1
183     WCRF A 1 A_SetPitch(0.50+pitch)
184     WCRF B 1 A_SetPitch(0.50+pitch)
185     WCRF C 1 A_SetPitch(0.50+pitch)
186     TNT1 A 0 A_PlaySound("Weapons/CrushbowFire", CHAN_WEAPON)
187     WCRF D 1 A_SetPitch(1.00+pitch)
188     WCRF D 1 A_SetPitch(-1.00+pitch)
189     WCRF D 1 A_SetPitch(1.00+pitch)
190     WCRF D 1 A_SetPitch(-1.00+pitch)
191     WCRF D 4 A_AlertMonsters
192     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "ReadyEmptyGun")
193     WCRF D 8
194     WCRF E 3 A_SetPitch(-0.50+pitch)
195     TNT1 A 0 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON)
196     WCRF F 3 A_SetPitch(-0.50+pitch)
197     WCRR A 4 A_SetPitch(-0.50+pitch)
198     TNT1 A 0
199       {
200         A_AlertMonsters();
201         user_lowPauseCount = -666;
202       }
203     Goto ReadyIdle
205   WaterFire:
206     TNT1 A 0 A_JumpIfNoAmmo("Reload")
207     WSPI A 0 A_FireProjectile("FireBoltUnderwater", 0, 1, /*2*/0, 1, FPF_NOAUTOAIM, 0)
208     WCRR A 1
209     WCRF A 1 A_SetPitch(0.25+pitch)
210     WCRF B 1 A_SetPitch(0.25+pitch)
211     WCRF C 1 A_SetPitch(0.25+pitch)
212     TNT1 A 0 A_PlaySound("Weapons/CrushbowFire", CHAN_WEAPON)
213     WCRF D 1 A_SetPitch(0.50+pitch)
214     WCRF D 1 A_SetPitch(-0.50+pitch)
215     WCRF D 1 A_SetPitch(0.50+pitch)
216     WCRF D 1 A_SetPitch(-0.50+pitch)
217     WCRF D 4 A_AlertMonsters
218     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "ReadyEmptyGun")
219     WCRF D 8 A_AlertMonsters
220     WCRF E 3 A_SetPitch(-0.25+pitch)
221     TNT1 A 0 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON, 0.5)
222     WCRF F 3 A_SetPitch(-0.25+pitch)
223     WCRR A 4
224       {
225         A_SetPitch(-0.25+pitch);
226         user_lowPauseCount = -666;
227       }
228     Goto ReadyIdle
230   AltFire:
231     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "Reload")
232     TNT1 A 0 A_TakeInventory("CrushbowLoaded", 1)
233     TNT1 A 0 A_JumpIf(waterlevel==3, "WaterAltFire")
234     WSPI A 0 A_FireProjectile("ImpactBolt", 0, 1, /*2*/0, 1, FPF_NOAUTOAIM, 0)
235     WCRR A 1
236     WCRF A 1 A_SetPitch(0.50+pitch)
237     WCRF B 1 A_SetPitch(0.50+pitch)
238     WCRF C 1 A_SetPitch(0.50+pitch)
239     TNT1 A 0 A_PlaySound("Weapons/CrushbowFire", CHAN_WEAPON)
240     WCRF D 1 A_SetPitch(1.00+pitch)
241     WCRF D 1 A_SetPitch(-1.00+pitch)
242     WCRF D 1 A_SetPitch(1.00+pitch)
243     WCRF D 1 A_SetPitch(-1.00+pitch)
244     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "ReadyEmptyGun")
245     WCRF D 8
246     WCRF E 3 A_SetPitch(-0.50+pitch)
247     TNT1 A 0 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON)
248     WCRF F 3 A_SetPitch(-0.50+pitch)
249     WCRR A 4 A_SetPitch(-0.50+pitch)
250     TNT1 A 0
251       {
252         A_AlertMonsters();
253         user_lowPauseCount = -666;
254       }
255     Goto ReadyIdle
257   WaterAltFire:
258     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "Reload")
259     TNT1 A 0 A_TakeInventory("CrushbowLoaded", 1)
260     WSPI A 0 A_FireProjectile("ImpactBoltUnderwater", 0, 1, /*2*/0, 1, FPF_NOAUTOAIM, 0)
261     WCRR A 1
262     WCRF A 1 A_SetPitch(0.25+pitch)
263     WCRF B 1 A_SetPitch(0.25+pitch)
264     WCRF C 1 A_SetPitch(0.25+pitch)
265     TNT1 A 0 A_PlaySound("Weapons/CrushbowFire", CHAN_WEAPON)
266     WCRF D 1 A_SetPitch(0.50+pitch)
267     WCRF D 1 A_SetPitch(-0.50+pitch)
268     WCRF D 1 A_SetPitch(0.50+pitch)
269     WCRF D 1 A_SetPitch(-0.50+pitch)
270     TNT1 A 0 A_JumpIfNotInventory("CrushbowLoaded", "ReadyEmptyGun")
271     WCRF D 8
272     WCRF E 3 A_SetPitch(-0.25+pitch)
273     TNT1 A 0 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON, 0.5)
274     WCRF F 3 A_SetPitch(-0.25+pitch)
275     WCRR A 4
276       {
277         A_SetPitch(-0.25+pitch);
278         user_lowPauseCount = -666;
279       }
280     Goto ReadyIdle
282   DryFire:
283     WCRF E 16 A_PlaySound("Ammo/SpikeGunPick", CHAN_WEAPON, 0.2)
284     Goto ReadyIdle
286   Reload:
287     WFRR A 0 A_JumpIfInventory("CrushbowLoaded", 6, "ReloadFinish")
288     WFRR A 0 A_JumpIfInventory("BoltMag", 1, "ReloadWork")
289     WFRR A 0 A_JumpIfNoAmmo("Dryfire")
290     WCRR A 1 A_JumpIfNotInventory("BoltMag", "ReadyIdle")
291     Goto ReadyIdle
293   ReloadWork:
294     WCRF E 3 A_PlaySound("Weapons/CrushbowReloadA", CHAN_WEAPON)
295     WCRL A 3
296     WCRL B 3
297     WCRL C 3
298     WCRL D 4 A_SpawnItem("BoltmagDropped", -1, 16, 0)
299     WCRL D 8 A_PlaySound("Weapons/CrushbowReloadB", CHAN_WEAPON)
300     WCRL E 3
301     WCRL F 6
302     WCRL G 3
303     WCRL H 3 A_PlaySound("Weapons/CrushbowPump", CHAN_WEAPON)
304     WCRF E 3
305     WCRF F 3
306     WCRR A 3
307     //Goto ReloadLoop
309   ReloadLoop:
310     TNT1 A 0
311       {
312         // if reload in not cheating, drop unused ammo
313         if (!GetCVar("k8ZanMod_CheatReload")) {
314           A_TakeInventory("CrushbowLoaded", 666);
315         }
316         local clipCount = CountInv("BoltMag");
317         local loadCount = 6-CountInv("CrushbowLoaded");
318         if (loadCount > 0) {
319           if (loadCount > clipCount) loadCount = clipCount;
320           A_TakeInventory("BoltMag", loadCount);
321           A_GiveInventory("CrushbowLoaded", loadCount);
322         }
323         user_lowPauseCount = 0;
324       }
326   ReloadFinish:
327     TNT1 A 0
328     Goto ReadyIdle
330     stateinclude "QuickKick/QuickKickInclude.txt"
331   }
335 ACTOR FireBolt {
336   Scale 0.7
337   Radius 7
338   Height 3
339   Mass 25
340   Speed 48
341   Gravity 0.06
342   Projectile
343   ProjectileKickBack 250
344   Damage(80*random(1, 1))
345   DamageType "Crushbow"
346   //+DONTREFLECT
347   -NOGRAVITY
348   +NOBLOCKMAP
349   +BLOODSPLATTER
350   //+EXTREMEDEATH
351   SeeSound "Weapons/BoltSee"
352   Obituary "%o was turned into meatballs by %k's Fire Bolt."
353   Decal "FireBoltDecalHot"
355   States {
356   Spawn:
357     PBOL Y 1 Bright
358     TNT1 A 0 A_SpawnItemEx("FireBoltTrail", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 0)
359     TNT1 A 0 A_SpawnItemEx("FireBoltTrail", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 0)
360     TNT1 A 0 A_SpawnItemEx("FireBoltTrail", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 0)
361     Loop
363   Death:
364     TNT1 A 0 A_Explode(random(20, 30), 176, (GetCVarB('k8ZanMod_DamageSelfCrushbow') ? XF_HURTSOURCE : 0), True, 64, 0, 0, " ", "Fire")
365     TNT1 A 1 A_Explode(100, 176, (GetCVarB('k8ZanMod_DamageSelfCrushbow') ? XF_HURTSOURCE : 0), True, 64, 0, 0, " ", "Crushbow")
366     TNT1 A 0 A_JumpIf(WaterLevel>0, "WaterDeath")
367     TNT1 A 0 A_SpawnItemEx("ExplosionLarge", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION, 0)
368     TNT1 A 0 A_SpawnItemEx("FireTinyDie1", random(-40, 40), random(-40, 40), 1, 0, 0, 0, 0, 0, 0)
369     TNT1 A 0 A_SpawnItemEx("FireTinyDie2", random(-50, 50), random(-50, 50), 1, 0, 0, 0, 0, 0, 50)
370     TNT1 A 0 A_SpawnItemEx("FireTinyDie3", random(-60, 60), random(-60, 60), 1, 0, 0, 0, 0, 0, 100)
371     TNT1 A 0 A_SpawnItemEx("FireTinyDie1", random(-70, 70), random(-70, 70), 1, 0, 0, 0, 0, 0, 50)
372     TNT1 A 0 A_SpawnItemEx("FireTinyDie2", random(-80, 80), random(-80, 80), 1, 0, 0, 0, 0, 0, 0)
373     TNT1 A 0 A_SpawnItemEx("FireTinyDie3", random(-90, 90), random(-90, 90), 1, 0, 0, 0, 0, 0, 100)
374     TNT1 A 30 A_Quake(3, 30, 0, 1200)
375     TNT1 A 0 A_AlertMonsters(1200)
376     Stop
378   WaterDeath:
379     TNT1 AAAAAAAAAAAAAAA 0 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-5, 5), random(-5, 5), random(1, 4), 0, SXF_NOCHECKPOSITION, 0)
380     Stop
381   }
385 ACTOR ImpactBolt : FastProjectile {
386   Scale 0.7
387   Radius 7
388   Height 3
389   Speed 100
390   Mass 25
391   Gravity 0.02
392   Damage (200*random(1, 1))
393   DamageType "Crushbow"
394   Projectile
395   ProjectileKickBack 400
396   //Ripperlevel 3
397   +DONTREFLECT
398   +FOILINVUL
399   +THRUGHOST
400   //+RIPPER
401   -NOGRAVITY
402   +NOBLOCKMAP
403   +BLOODSPLATTER
404   SeeSound "Weapons/BoltSee"
405   Obituary "%o was shattered to bits by %k's Impact Bolt."
406   Decal "ImpactBoltDecalHot"
408   States {
409   Spawn:
410     PBOL Z 1 Bright
411     TNT1 AAA 0 A_SpawnItemEx("MagicSparkCyanSmall", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 50)
412     TNT1 A 0 A_SpawnItemEx("FireBoltTrail", 0, 0, 0, random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 100)
413     Loop
415   Death:
416     TNT1 A 0 A_Explode(random(5, 15), 80, (GetCVarB('k8ZanMod_DamageSelfCrushbow') ? XF_HURTSOURCE : 0), True, 5, 0, 0, " ", "Fire")
417     TNT1 A 1 A_Explode(random(15, 25), 80, (GetCVarB('k8ZanMod_DamageSelfCrushbow') ? XF_HURTSOURCE : 0), True, 5, 0, 0, " ", "Crushbow")
418     TNT1 A 0 A_JumpIf(WaterLevel>0, "WaterDeath")
419     TNT1 A 0 A_SpawnItemEx("ExplosionSmall", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION, 0)
420     TNT1 A 16 A_Quake(2, 16, 0, 900)
421     TNT1 A 0 A_AlertMonsters(900)
422     Stop
424   WaterDeath:
425     TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-5, 5), random(-5, 5), random(1, 4), 0, SXF_NOCHECKPOSITION, 0)
426     Stop
427   }
431 ACTOR FireBoltUnderwater {
432   Scale 0.7
433   Radius 7
434   Height 3
435   Mass 25
436   Speed 5
437   Gravity 0.3
438   Projectile
439   ProjectileKickBack 50
440   Damage(30*random(1, 1))
441   DamageType "Crushbow"
442   //+DONTREFLECT
443   +THRUGHOST
444   -NOGRAVITY
445   +NOBLOCKMAP
446   +BLOODSPLATTER
447   //+EXTREMEDEATH
448   SeeSound "Weapons/BoltSee"
449   Obituary "%o was turned into meatballs by %k's Fire Bolt."
450   //Decal "FireBoltDecalHot"
452   States {
453   Spawn:
454     PBOL Y 1 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-1, 1), random(-1, 1), random(1, 2), 0, SXF_NOCHECKPOSITION, 80)
455     TNT1 AAA 0 A_SpawnItemEx("FireBoltTrail", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 0)
456     Loop
458   Death:
459     TNT1 A 0 A_JumpIf(WaterLevel>=1, "WaterDeath")
460     TNT1 A 0 A_Explode(random(100, 120), 200, 0, True, 0, 0, 0, " ", "Crushbow")
461     TNT1 A 0 A_SpawnItemEx("ExplosionLarge", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION, 0)
462     TNT1 A 30 A_Quake(2, 30, 0, 1000)
463     Stop
465   WaterDeath:
466     TNT1 A 0 A_Explode(random(10, 20), 64, 0, True, 0, 0, 0, " ", "Crushbow")
467     TNT1 AAAAAAAAAAAAAAA 0 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-5, 5), random(-5, 5), random(1, 4), 0, SXF_NOCHECKPOSITION, 0)
468     Stop
469   }
473 ACTOR ImpactBoltUnderwater {
474   Scale 0.7
475   Radius 7
476   Height 3
477   Speed 75
478   Mass 25
479   Gravity 0.04
480   Damage (200*random(1, 1))
481   DamageType "Crushbow"
482   Projectile
483   ProjectileKickBack 200
484   +DONTREFLECT
485   +THRUGHOST
486   -NOGRAVITY
487   +NOBLOCKMAP
488   +BLOODSPLATTER
489   SeeSound "Weapons/BoltSee"
490   Obituary "%o was shattered by %k's Impact Bolt."
491   Decal "ImpactBoltDecalHot"
493   States {
494   Spawn:
495     PBOL Z 1 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-1, 1), random(-1, 1), random(1, 2), 0, SXF_NOCHECKPOSITION, 80)
496     TNT1 AAA 0 A_SpawnItemEx("MagicSparkCyanSmall", random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 50)
497     TNT1 A 0 A_SpawnItemEx("FireBoltTrail", 0, 0, 0, random(-1, 1), random(-1, 1), random(-1, 1), 0, SXF_NOCHECKPOSITION, 100)
498     Loop
500   Death:
501     TNT1 A 0 A_Explode(random(15, 25), 80, 0, False, 0, 0, 0, " ", "Crushbow")
502     TNT1 A 0 A_JumpIf(WaterLevel>0, "WaterDeath")
503     TNT1 A 0 A_SpawnItemEx("ExplosionSmall", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION, 0)
504     TNT1 A 16 A_Quake(2, 16, 0, 900)
505     Stop
507   WaterDeath:
508     TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UnderwaterBubble", 0, 0, 0, random(-5, 5), random(-5, 5), random(1, 4), 0, SXF_NOCHECKPOSITION, 0)
509     Stop
510   }
514 // heretic
515 Actor (optional) Zan_BlasterBoltMagOne : BoltMagOne Replaces BlasterAmmo {}
516 Actor (optional) Zan_BlasterBoltMag : BoltMag Replaces BlasterHefty {}
518 Actor (optional) Zan_BlasterCrushbow : Crushbow Replaces Blaster {}
519 Actor (optional) Zan_BlasterPoweredCrushbow : Crushbow Replaces BlasterPowered {}
521 Actor (optional) Zan_TPH_TPHRocketLauncher : Crushbow Replaces TPHRocketLauncher {}