swwmgz_m/zscript/dlc1/swwm_mister.zsc

713 lines
19 KiB
Text

// Plutoni Inc. Mortal Rifle (from UnSX 2)
// Slot 9, spawns shared with Candygun
Class MisterRifle : SWWMWeapon
{
int clipcount;
bool chambered, fired;
bool gchambered, gfired;
bool boltlock, initialized;
bool waschambered, wasfired;
bool wasgchambered, wasgfired;
int prefirecnt;
int firemode;
ui int lastfiremode;
String serialnum;
// for alerts in the canvas
transient int lowammotic, noammotic;
Property ClipCount : clipcount;
override void AttachToOwner( Actor other )
{
if ( !initialized )
{
initialized = true;
// no round in the chamber
chambered = false;
fired = false;
// no grenade loaded
gchambered = false;
gfired = false;
// bolt isn't locked
boltlock = false;
// generate a serial number
serialnum = "00000";
SWWMUtility.ObscureText(serialnum,Random[MRifle](),true);
}
Super.AttachToOwner(other);
}
override void HudTick()
{
Super.HudTick();
if ( lastfiremode && (lastfiremode != firemode+1) && (Owner.player == players[consoleplayer]) )
{
let bar = SWWMStatusBar(statusbar);
if ( bar )
{
bar.ntagstr = StringTable.Localize("$SWWM_MRMODE"..(firemode+1));
bar.ntagtic = level.totaltime;
bar.ntagcol = nametagcolor;
}
}
lastfiremode = firemode+1;
}
override bool ReportHUDAmmo()
{
return (chambered&&!fired)||(clipcount>0)||(Ammo1.Amount>0)||(gchambered&&!gfired)||(Ammo2.Amount>0);
}
override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount )
{
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
if ( firemode == PrimaryFire ) return (chambered&&!fired)||(clipcount>0)||(Ammo1.Amount>0);
if ( firemode == AltFire ) return (gchambered&&!gfired)||(Ammo2.Amount>0);
return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount);
}
override bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon )
{
bool good = Super.PickupForAmmoSWWM(ownedWeapon);
let Owner = ownedWeapon.Owner;
if ( AmmoGive1 == 0 )
{
// give bullets?
if ( (clipcount > 0) || (chambered && !fired) )
{
Inventory cur = Owner.FindInventory("MisterRound");
if ( !cur )
{
cur = Inventory(Spawn("MisterRound"));
cur.Amount = 0;
cur.AttachToOwner(Owner);
}
int ingun = clipcount+(chambered&&!fired);
int maxgiveamt = min(cur.MaxAmount-cur.Amount,ingun);
int dropamt = ingun-maxgiveamt;
if ( dropamt > 0 ) cur.CreateTossable(dropamt);
cur.Amount = min(cur.MaxAmount,cur.Amount+ingun);
good = true;
}
// give grenade?
if ( gchambered && !gfired )
{
Inventory cur = Owner.FindInventory("MisterGAmmo");
if ( !cur )
{
cur = Inventory(Spawn("MisterGAmmo"));
cur.Amount = 0;
cur.AttachToOwner(Owner);
}
int ingun = (gchambered&&!gfired);
int maxgiveamt = min(cur.MaxAmount-cur.Amount,ingun);
int dropamt = ingun-maxgiveamt;
if ( dropamt > 0 ) cur.CreateTossable(dropamt);
cur.Amount = min(cur.MaxAmount,cur.Amount+ingun);
good = true;
}
}
return good;
}
override void PlayUpSound( Actor origin )
{
if ( (clipcount > 0) && (!chambered || fired) ) origin.A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
else origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP);
}
action void A_AmmoAlert( bool bOnReload = false )
{
int curammo = invoker.clipcount+(invoker.chambered&&!invoker.fired);
if ( curammo == 0 )
{
// no ammo alert
A_StartSound("mister/noammo",CHAN_WEAPON,CHANF_OVERLAP);
invoker.noammotic = gametic+50;
}
else if ( (curammo == 4) || (bOnReload && (curammo <= 4)) )
{
// low ammo alert
A_StartSound("mister/lowammo",CHAN_WEAPON,CHANF_OVERLAP);
invoker.lowammotic = gametic+40;
}
}
action void A_BoltBack( bool bCasing = false )
{
A_StartSound("mister/boltback",CHAN_WEAPON,CHANF_OVERLAP);
if ( bCasing )
{
invoker.waschambered = invoker.chambered;
invoker.wasfired = invoker.fired;
A_ChangeModel("",1,"","",10,"models",invoker.wasfired?"MortalRound_Used.png":"MortalRound.png",CMDL_USESURFACESKIN,-1);
}
invoker.chambered = invoker.fired = false;
A_AmmoAlert();
}
action void A_BoltForward( bool bFlick = false )
{
A_StartSound("mister/boltforward",CHAN_WEAPON,CHANF_OVERLAP);
invoker.boltlock = false;
if ( invoker.ClipCount > 0 )
{
invoker.clipcount--;
invoker.chambered = true;
invoker.fired = false;
}
if ( bFlick && (player == players[consoleplayer]) && swwm_beepboop )
SWWMHandler.AddOneliner("buttonpush",2,0);
}
action void A_DropCasing()
{
// TODO
A_ChangeModel("",1,"","",10,"models","",CMDL_USESURFACESKIN,-1);
}
action void A_FireSelect()
{
A_StartSound("mister/fireselect",CHAN_WEAPON,CHANF_OVERLAP);
invoker.firemode = (invoker.firemode+1)%4;
if ( (player == players[consoleplayer]) && swwm_beepboop )
SWWMHandler.AddOneliner("buttonpush",2,0);
}
action void A_MagOut()
{
A_PlayerReload();
A_StartSound("mister/magout",CHAN_WEAPON,CHANF_OVERLAP);
A_ChangeModel("",1,"","",7,"models",(invoker.clipcount>0)?"MortalMag.png":"MortalMag_Empty.png",CMDL_USESURFACESKIN,-1);
MagAmmo ma = MagAmmo(FindInventory("MisterRound"));
if ( !ma )
{
ma = MagAmmo(Spawn("MisterRound"));
ma.Amount = 0;
ma.AttachToOwner(self);
}
int maxgiveamt = min(ma.MaxAmount-ma.Amount,invoker.clipcount);
int dropamt = invoker.clipcount-maxgiveamt;
if ( dropamt > 0 ) invoker.BufferMagAmmo("MisterRound",dropamt);
ma.Amount = min(ma.MaxAmount,ma.Amount+invoker.clipcount);
ma.MagFill();
invoker.clipcount = 0;
}
action void A_MagDrop()
{
// ensure mag is invisible to avoid weird interpolation to hand
A_ChangeModel("",1,"","",7,"models","",CMDL_USESURFACESKIN,-1);
// TODO drop physical empty mag if enabled
}
action void A_MagGrab()
{
// ensure mag is full
A_ChangeModel("",1,"","",7,"models","MortalMag.png",CMDL_USESURFACESKIN,-1);
A_StartSound("mister/magget",CHAN_WEAPON,CHANF_OVERLAP);
}
action void A_MagIn()
{
MagAmmo sb = MagAmmo(FindInventory("MisterRound"));
if ( sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) )
invoker.clipcount = invoker.default.clipcount;
else if ( (invoker.Ammo1.Amount <= 0) || (sb.Amount >= sb.ClipSize) )
{
int takeamt = min(sb.Amount,sb.ClipSize);
invoker.clipcount = takeamt;
sb.Amount -= takeamt;
int req = invoker.default.ClipCount-invoker.clipcount;
if ( req > 0 ) invoker.clipcount += invoker.FetchBufferedMagAmmo("MisterRound",req);
}
else if ( invoker.FetchBufferedMagAmmo("MisterRound",sb.ClipSize,true) )
invoker.clipcount = invoker.default.clipcount;
else
{
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
invoker.clipcount = invoker.default.clipcount;
}
invoker.ClearBufferedAmmo();
A_AmmoAlert(true);
}
action State A_MisterFire()
{
if ( !invoker.chambered || invoker.fired )
{
// auto-chamber just in case (rarely ever happens)
if ( invoker.ClipCount > 0 )
return ResolveState("AutoCycle");
// auto-reload if we're out
if ( (invoker.clipcount <= 0) && ((invoker.Ammo1.Amount > 0) || (CountInv("MisterRound") > 0) || sv_infiniteammo || FindInventory("PowerInfiniteAmmo")) )
return ResolveState("Reload");
}
// this one is handled separately
if ( invoker.firemode >= 3 ) return ResolveState("FireOverpressure");
A_PlayerFire();
invoker.fired = true; // TODO, mark this round as fired (will do the rest later)
if ( invoker.firemode == 2 )
{
// stream shot
// individual sub-shots handled in the state sequence, not here
A_StartSound("mister/firestream",CHAN_WEAPON,CHANF_OVERLAP);
return ResolveState("FireStream");
}
if ( invoker.firemode == 1 )
{
// cluster shot
A_StartSound("mister/firescatter",CHAN_WEAPON,CHANF_OVERLAP);
return ResolveState("FireCluster");
}
// precision shot
A_StartSound("mister/firesemi",CHAN_WEAPON,CHANF_OVERLAP);
return ResolveState(null);
}
action void A_MisterFireStream()
{
// TODO
A_PlayerFire();
}
action void A_MisterStartRail()
{
A_StartSound("mister/chargeover",CHAN_WEAPON,CHANF_OVERLAP);
invoker.prefirecnt = 15; // pre-heat our ovens
}
action void A_MisterFireRail()
{
// TODO, just mark round as fired for now
A_PlayerFire();
invoker.fired = true;
A_StartSound("mister/fireover",CHAN_WEAPON,CHANF_OVERLAP);
}
action void A_MisterFireGrenade()
{
// TODO, just mark round as fired for now
A_PlayerFire();
invoker.gfired = true;
A_StartSound("mister/grenade",CHAN_WEAPON,CHANF_OVERLAP);
}
action void A_GrenadeOpen()
{
A_PlayerReload();
A_StartSound("mister/grenadeopen");
invoker.wasgchambered = invoker.gchambered;
invoker.wasgfired = invoker.gfired;
// theoretically, this is an either-or situation
// either there's no grenade in the chamber whatsoever
// or there's the casing of a fired grenade
if ( !invoker.wasgchambered )
{
// hide both surfaces
A_ChangeModel("",1,"","",8,"models","",CMDL_USESURFACESKIN,-1);
A_ChangeModel("",1,"","",9,"models","",CMDL_USESURFACESKIN,-1);
}
else // invoker.wasgfired
{
// show only a fired cartridge
A_ChangeModel("",1,"","",8,"models","MortalGrenade_Used.png",CMDL_USESURFACESKIN,-1);
A_ChangeModel("",1,"","",9,"models","",CMDL_USESURFACESKIN,-1);
}
invoker.gfired = invoker.gchambered = false;
}
action void A_GrenadeDrop()
{
// TODO
A_ChangeModel("",1,"","",8,"models","",CMDL_USESURFACESKIN,-1);
A_ChangeModel("",1,"","",9,"models","",CMDL_USESURFACESKIN,-1);
}
action void A_GrenadeGrab()
{
// the full thingy
A_ChangeModel("",1,"","",8,"models","MortalGrenade.png",CMDL_USESURFACESKIN,-1);
A_ChangeModel("",1,"","",9,"models","MortalGrenade.png",CMDL_USESURFACESKIN,-1);
A_StartSound("mister/grenadeget",CHAN_WEAPON,CHANF_OVERLAP);
}
action void A_GrenadeIn()
{
A_StartSound("mister/grenadein",CHAN_WEAPON,CHANF_OVERLAP);
if ( !sv_infiniteammo && !FindInventory("PowerInfiniteAmmo") )
invoker.Ammo2.Amount = max(0,invoker.Ammo2.Amount-1);
invoker.gchambered = true;
invoker.gfired = false;
}
action void A_GrenadeClose()
{
// we no longer need the model, hide it
A_ChangeModel("",1,"","",8,"models","",CMDL_USESURFACESKIN,-1);
A_ChangeModel("",1,"","",9,"models","",CMDL_USESURFACESKIN,-1);
A_StartSound("mister/grenadeclose",CHAN_WEAPON,CHANF_OVERLAP);
}
Default
{
Tag "$T_MORTALRIFLE";
Inventory.PickupMessage "$T_MORTALRIFLE";
Obituary "$O_MORTALRIFLE";
SWWMWeapon.Tooltip "$TT_MORTALRIFLE";
SWWMWeapon.GetLine "getmortalrifle";
Weapon.SlotNumber 9;
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 850;
Weapon.UpSound "mister/select";
Weapon.AmmoType1 "MisterAmmo";
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "MisterGAmmo";
Weapon.AmmoGive2 0;
SWWMWeapon.DropAmmoType "SWWMCellAmmoBig";
MisterRifle.ClipCount 12;
Stamina 1600000;
+SWWMWEAPON.NOFIRSTGIVE;
+SWWMWEAPON.HASSCRTEX;
+WEAPON.BFG;
Radius 30;
Height 28;
}
States
{
Select:
XZW2 P 2
{
A_ChangeModel("",1,"","",7,"models","MortalMag.png",CMDL_USESURFACESKIN,-1);
A_FullRaise();
if ( invoker.boltlock ) return ResolveState("SelectLock");
if ( (invoker.clipcount > 0) && (!invoker.chambered || invoker.fired) )
return ResolveState("SelectCycle");
return ResolveState(null);
}
XZW2 QRSTUV 2;
XZW2 WXYZ 1;
XZW3 ABCD 2;
Goto Ready;
SelectLock:
XZWB TUVWXYZ 2;
XZWC ABCD 1;
XZWC EFGH 2;
Goto ReadyLock;
SelectCycle:
XZWI RSTUVWXYZ 2;
XZWJ A 2 A_BoltBack();
XZWJ B 2;
XZWJ C 4;
XZWJ D 2
{
A_BoltForward();
A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
}
XZWJ EFG 2;
XZWJ HIJK 1;
XZWJ LMNO 2;
Goto Ready;
Ready:
XZW2 A 1
{
int flg = (WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1);
// can't alt-fire if we have no grenades left
if ( (!invoker.gchambered || invoker.gfired) && (invoker.Ammo2.Amount <= 0) && !sv_infiniteammo && !FindInventory("PowerInfiniteAmmo") )
flg |= WRF_NOSECONDARY;
A_WeaponReady(flg);
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
invoker.CheckAmmo(EitherFire,true);
}
Wait;
ReadyLock:
XZWB E 1
{
int flg = (WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1);
// can't alt-fire if we have no grenades left
if ( (!invoker.gchambered || invoker.gfired) && (invoker.Ammo2.Amount <= 0) && !sv_infiniteammo && !FindInventory("PowerInfiniteAmmo") )
flg |= WRF_NOSECONDARY;
// can't use primary fire if we have no ammo to reload from
if ( (invoker.Ammo1.Amount <= 0) && (CountInv("MisterRound") <= 0) && !sv_infiniteammo && !FindInventory("PowerInfiniteAmmo") )
flg |= WRF_NOPRIMARY;
A_WeaponReady(flg);
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
invoker.CheckAmmo(EitherFire,true);
}
Wait;
AutoCycle:
XZW2 A 2 A_JumpIf(invoker.clipcount<=0,"AutoCycleLock");
XZW6 H 2 A_BoltBack(true);
XZW6 IJ 2;
XZW6 K 2 A_BoltForward();
XZW6 LMN 2;
XZW6 O 2 A_DropCasing();
Goto Ready;
AutoCycleLock:
XZW2 A 2 { invoker.boltlock = true; }
XZWA W 2 A_BoltBack(true);
XZWA XYZ 2;
XZWB ABC 2;
XZWB D 2 A_DropCasing();
Goto ReadyLock;
Fire:
XZW2 A 1 A_MisterFire();
XZW3 EFGH 1;
XZW3 IJK 2;
Goto AutoCycle;
FireCluster:
XZW2 A 1;
XZW3 LMN 1;
XZW3 OPQRS 2;
Goto AutoCycle;
FireStream:
XZW2 A 1 A_MisterFireStream();
XZW3 TUV 1 A_MisterFireStream();
XZW3 WXY 1;
XZW3 Z 2;
XZW4 ABC 2;
Goto AutoCycle;
FireOverpressure:
XZW2 A 2 A_MisterStartRail();
XZW4 DEF 5;
XZW4 F 1
{
invoker.prefirecnt--;
return A_JumpIf((invoker.prefirecnt<=0)&&!(player.cmd.buttons&BT_ATTACK),"FireOverpressureRelease");
}
Wait;
FireOverpressureRelease:
XZW4 F 1 A_MisterFireRail();
XZW4 GH 1;
XZW4 IJ 2;
XZW4 KLMN 3;
Goto AutoCycle;
AltFire:
XZW2 A 1
{
if ( !invoker.gchambered || invoker.gfired )
return invoker.boltlock?ResolveState("AltReloadLock"):ResolveState("AltReload");
A_MisterFireGrenade();
return A_JumpIf(invoker.boltlock,"AltFireLock");
}
XZW4 OP 1;
XZW4 QR 2;
XZW4 ST 3;
XZW4 UVW 3;
Goto Ready;
AltFireLock:
XZWB E 1;
XZWC IJ 1;
XZWC KL 2;
XZWC MN 3;
XZWC OPQ 4;
Goto ReadyLock;
AltReload:
XZW2 A 3 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
XZW4 XYZ 3;
XZW5 A 3;
XZW5 B 2 A_GrenadeOpen();
XZW5 CD 2;
XZW5 EF 3;
XZW5 G 3 A_GrenadeDrop();
XZW5 H 3;
XZW5 I 3 A_GrenadeGrab();
XZW5 JKL 3;
XZW5 M 2 A_GrenadeIn();
XZW5 NOP 2;
XZW5 QRS 3;
XZW5 T 2 A_GrenadeClose();
XZW5 UVWXY 2;
XZW5 Z 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
XZW6 ABCDEFG 2;
Goto Ready;
AltReloadLock:
XZWB E 3 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
XZWC RSTU 3;
XZWC V 2 A_GrenadeOpen();
XZWC WX 2;
XZWC YZ 3;
XZWD A 3 A_GrenadeDrop();
XZWD B 3;
XZWD C 3 A_GrenadeGrab();
XZWD DEF 3;
XZWD G 2 A_GrenadeIn();
XZWD HIJ 2;
XZWD KLM 3;
XZWD N 2 A_GrenadeClose();
XZWD OPQRS 2;
XZWD T 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
XZWD UVWXYZ 2;
XZWE A 2;
Goto ReadyLock;
Reload:
XZW2 A 2
{
if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && (CountInv("MisterRound") <= 0) && !sv_infiniteammo && !FindInventory("PowerInfiniteAmmo")) )
return invoker.boltlock?ResolveState("IdleLock"):ResolveState("Idle");
A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.boltlock,"ReloadLock");
}
XZW9 KLMNOPQRST 2;
XZW9 U 2 A_MagOut();
XZW9 VWXYZ 2;
XZWA ABC 2;
XZWA D 2 A_MagDrop();
XZWA E 2;
XZWA F 2 A_MagGrab();
XZWA GHI 2;
XZWA J 2 A_StartSound("mister/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWA K 2;
XZWA L 2 A_MagIn();
XZWA MN 2;
XZWA O 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
XZWA PQRSTUV 2;
Goto Ready;
ReloadLock:
XZWB E 2;
XZWG WXYZ 2;
XZWH ABCDEF 2;
XZWH G 2 A_MagOut();
XZWH HIJKLMNO 2;
XZWH P 2 A_MagDrop();
XZWH Q 2;
XZWH R 2 A_MagGrab();
XZWH STU 2;
XZWH V 2 A_StartSound("mister/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWH W 2;
XZWH X 2 A_MagIn();
XZWH YZ 2;
XZWI ABCDEFG 2;
XZWI H 2 A_BoltForward(true);
XZWI I 2;
XZWI J 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
XZWI KLMN 2;
XZWI OPQ 3;
Goto Ready;
Idle:
XZW2 A 2
{
A_StartSound("mister/deselect",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerCheckGun();
}
XZW7 JKLMNO 2;
XZW7 PQR 3;
XZW7 STU 4;
XZW7 V 2 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
XZW7 WXY 2;
XZW7 Z 3;
XZW8 AB 3;
XZW8 CDEF 4;
XZW8 G 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.2);
XZW8 HIJK 2;
XZW8 L 3;
Goto Ready;
IdleLock:
XZWB E 2
{
A_StartSound("mister/deselect",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerCheckGun();
}
XZWE VWXYZ 2;
XZWF A 2;
XZWF BCD 3;
XZWF EFG 4;
XZWF H 2 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
XZWF IJK 2;
XZWF LMN 3;
XZWF OPQR 4;
XZWF S 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.2);
XZWF TUVW 2;
XZWF X 3;
Goto ReadyLock;
Zoom:
XZW2 A 2
{
A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.boltlock,"ZoomLock");
}
XZW6 PQRSTUVW 2;
XZW6 X 2 A_FireSelect();
XZW6 YZ 2;
XZW7 A 2;
XZW7 B 2 A_JumpIf(player.cmd.buttons&BT_ZOOM,"ReZoom");
XZW7 CD 2;
XZW7 E 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.35);
XZW7 FGHI 2;
Goto Ready;
ReZoom:
XZW7 B 4; // smoother tween
Goto Zoom+6;
ZoomLock:
XZWB E 2;
XZWE BCDEFGHI 2;
XZWE J 2 A_FireSelect();
XZWE KLM 2;
XZWE N 2 A_JumpIf(player.cmd.buttons&BT_ZOOM,"ReZoomLock");
XZWE OP 2;
XZWE Q 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.35);
XZWE RSTU 2;
Goto ReadyLock;
ReZoomLock:
XZWE N 4; // smoother tween
Goto ZoomLock+6;
User1:
XZW2 A 2
{
A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.boltlock,"User1Lock");
}
XZW8 MN 2;
XZW8 O 2
{
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerMelee();
}
XZW8 PQ 2;
XZW8 R 1;
XZW8 S 1 A_Parry(8);
XZW8 T 1;
XZW8 U 1 A_Melee(50,"demolitionist/whitm",1.25,1.2,1.2);
XZW8 VWXYZ 2;
XZW9 A 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
XZW9 BCDEFGHIJ 2;
Goto Ready;
User1Lock:
XZWB E 2;
XZWF YZ 2;
XZWG A 2
{
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerMelee();
}
XZWG BC 2;
XZWG D 1;
XZWG E 1 A_Parry(8);
XZWG F 1;
XZWG G 1 A_Melee(50,"demolitionist/whitm",1.25,1.2,1.2);
XZWG HIJKL 2;
XZWG M 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
XZWG NOPQRSTUV 2;
Goto ReadyLock;
Deselect:
XZW2 A 2
{
A_StartSound("mister/deselect",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.boltlock,"DeselectLock");
}
XZW2 BCDE 2;
XZW2 FGHIJKLMNOP 1;
XZW2 P -1 A_FullLower();
Stop;
DeselectLock:
XZWB EFGHI 2;
XZWB JKLMNOPQRST 1;
XZWB T -1 A_FullLower();
Stop;
Spawn:
XZW1 A -1;
Stop;
}
}