All Mortal Rifle state code done. Actual firing later.

This commit is contained in:
Mari the Deer 2022-09-12 22:10:53 +02:00
commit 9dd3e27bbd
21 changed files with 489 additions and 68 deletions

View file

@ -298,8 +298,8 @@ Class MisterRound : MagAmmo
MagAmmo.PickupTag "MRROUND";
Stamina -14000;
MagAmmo.ParentAmmo "MisterAmmo";
MagAmmo.ClipSize 20;
Inventory.MaxAmount 20;
MagAmmo.ClipSize 12;
Inventory.MaxAmount 12;
+FLOATBOB;
FloatBobStrength 0.25;
Radius .5;
@ -336,14 +336,6 @@ Class MisterRound5 : MisterRound
Radius 1.25;
}
}
Class MisterRound10 : MisterRound
{
Default
{
Inventory.Amount 10;
Radius 1.5;
}
}
Class MisterAmmo : SWWMAmmo
{
@ -353,9 +345,9 @@ Class MisterAmmo : SWWMAmmo
SWWMAmmo.PickupTag "MRAMMO";
Stamina 150000;
Inventory.Amount 1;
Inventory.MaxAmount 2;
Inventory.MaxAmount 1;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 5;
Ammo.BackpackMaxAmount 3;
Ammo.DropAmount 1;
SWWMAmmo.MagAmmoType "MisterRound";
+FLOATBOB;
@ -380,9 +372,9 @@ Class MisterGAmmo : SWWMAmmo
SWWMAmmo.PickupTag "MRGRENADE";
Stamina 120000;
Inventory.Amount 1;
Inventory.MaxAmount 4;
Inventory.MaxAmount 3;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 10;
Ammo.BackpackMaxAmount 6;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;

View file

@ -177,7 +177,7 @@ extend Class MisterRifle
str = String.Format("%2d",ingun);
int fw = MortalFontBig.StringWidth(str), fh = MortalFontBig.GetHeight();
DrawWindowFrame(80-fw/2,72-fh/2,fw,fh,32);
bool blink = (ingun<=5)&&(gametic%16<=8);
bool blink = (ingun<=4)&&(gametic%16<=8);
TouchScreen.DrawText(MortalFontBig,Font.FindFontColor("MiniBlurp"),80-fw/2,72-fh/2,str,DTA_ColorOverlay,blink?0x80000000:0x00000000);
if ( ingun < 10 )
{
@ -209,7 +209,7 @@ extend Class MisterRifle
TouchScreen.DrawTexture(MortalIcons[1],false,200-fw/2,72+8,DTA_SrcY,gfired*32,DTA_SrcHeight,32,DTA_DestHeight,32,DTA_Alpha,alph,DTA_LegacyRenderStyle,STYLE_Add);
}
}
if ( false ) // TODO
if ( lowammotic && (lowammotic > gametic) )
{
// low ammo alert
str = StringTable.Localize("$SWWM_MRLOW");
@ -218,7 +218,7 @@ extend Class MisterRifle
DrawWindowFrame(128-fw/2,72-fh/2,fw,fh,2,-2,true);
TouchScreen.DrawText(MortalFontMed,Font.FindFontColor("MiniBrass"),128-fw/2,72-fh/2,str,DTA_ColorOverlay,(gametic%8>=4)?0x80000000:0x000000);
}
if ( false ) // TODO
if ( noammotic && (noammotic > gametic) )
{
// empty alert
str = StringTable.Localize("$SWWM_MRNONE");

View file

@ -156,13 +156,13 @@ extend Class MisterRifle
if ( !BulletTex[1] ) BulletTex[1] = TexMan.CheckForTexture("graphics/HUD/MisterGrenade.png",TexMan.Type_Any);
if ( !BulletTex[2] ) BulletTex[2] = TexMan.CheckForTexture("graphics/HUD/MisterGrenadeCasing.png",TexMan.Type_Any);
if ( !ModeFont ) ModeFont = Font.GetFont('MiniHUDShadow');
Screen.DrawTexture(WeaponBox,false,bx-24,by-29,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
Screen.DrawTexture(WeaponBox,false,bx-23,by-32,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
static const int fmod[] = {0x0050,0x0043,0x0053,0x004F};
Screen.DrawChar(ModeFont,Font.FindFontColor("MiniBrass"),bx-21,by-20,fmod[firemode],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( chambered ) Screen.DrawTexture(BulletTex[0],false,bx-12,by-27,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,fired?0x80000000:0x00000000);
Screen.DrawChar(ModeFont,Font.FindFontColor("MiniBrass"),bx-20,by-20,fmod[firemode],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( chambered ) Screen.DrawTexture(BulletTex[0],false,bx-12,by-30,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,fired?0x80000000:0x00000000);
for ( int i=0; i<clipcount; i++ )
Screen.DrawTexture(BulletTex[0],false,bx-((i%2)?12:13),(by-24)+(2*(i/2))+(i%2),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( gchambered ) Screen.DrawTexture(BulletTex[1+gfired],false,bx-22,by-10,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,gfired?0x80000000:0x00000000);
Screen.DrawTexture(BulletTex[0],false,bx-12,(by-27)+2*i,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( gchambered ) Screen.DrawTexture(BulletTex[1+gfired],false,bx-21,by-10,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,gfired?0x80000000:0x00000000);
String str = "THIS WEAPON IS NOT YET FULLY IMPLEMENTED";
Screen.DrawText(NewSmallFont,Font.CR_RED,(Screen.GetWidth()-NewSmallFont.StringWidth(str)*CleanXFac_1)/2,Screen.GetHeight()-(NewSmallFont.GetHeight()*CleanYFac_1+clamp(swwm_hudmargin,0,20)*hs),str,DTA_CleanNoMove_1,true);
}

View file

@ -9,10 +9,14 @@ Class MisterRifle : SWWMWeapon
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 )
@ -20,10 +24,13 @@ Class MisterRifle : SWWMWeapon
if ( !initialized )
{
initialized = true;
// no round in the chamber
chambered = false;
fired = false;
gchambered = true; // stat with one grenade
// no grenade loaded
gchambered = false;
gfired = false;
// bolt isn't locked
boltlock = false;
// generate a serial number
serialnum = "00000";
@ -111,6 +118,23 @@ Class MisterRifle : SWWMWeapon
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);
@ -118,32 +142,213 @@ Class MisterRifle : SWWMWeapon
{
invoker.waschambered = invoker.chambered;
invoker.wasfired = invoker.fired;
A_ChangeModel("",1,"","",8,"models",invoker.wasfired?"MortalRound_Used.png":"MortalRound.png",CMDL_USESURFACESKIN,-1);
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()
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,"","",8,"models","",CMDL_USESURFACESKIN,-1);
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
@ -160,9 +365,9 @@ Class MisterRifle : SWWMWeapon
Weapon.AmmoType1 "MisterAmmo";
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "MisterGAmmo";
Weapon.AmmoGive2 1;
Weapon.AmmoGive2 0;
SWWMWeapon.DropAmmoType "SWWMCellAmmoBig";
MisterRifle.ClipCount 20;
MisterRifle.ClipCount 12;
Stamina 1600000;
+SWWMWEAPON.NOFIRSTGIVE;
+SWWMWEAPON.HASSCRTEX;
@ -175,7 +380,9 @@ Class MisterRifle : SWWMWeapon
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);
@ -184,6 +391,11 @@ Class MisterRifle : SWWMWeapon
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();
@ -199,16 +411,180 @@ Class MisterRifle : SWWMWeapon
XZWJ LMNO 2;
Goto Ready;
Ready:
XZW2 A 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1);
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 2;
Goto Ready;
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 2;
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 A_Jump(256,"Idle"); // for now, directly jump to idle until reloading is implemented
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
@ -228,8 +604,30 @@ Class MisterRifle : SWWMWeapon
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);
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;
@ -242,8 +640,25 @@ Class MisterRifle : SWWMWeapon
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);
XZW2 A 2
{
A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.boltlock,"User1Lock");
}
XZW8 MN 2;
XZW8 O 2
{
@ -259,12 +674,38 @@ Class MisterRifle : SWWMWeapon
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);
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;

View file

@ -233,7 +233,7 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner
{
bool aex = SWWMUtility.ItemExists('CandyGun',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('MisterRifle',ownedonly:enemydrop);
if ( (!aex && bex) || (!Random[Replacements](0,2) && bex) ) return 'MisterGAmmo';
if ( (!aex && bex) || (!Random[Replacements](0,2) && bex) ) return !Random[Replacements](0,2)?'MisterGAmmo':Random[Replacements](0,2)?'MisterRound':'MisterRound2';
if ( aex ) return 'CandyGunBullets';
}
bool aex = SWWMUtility.ItemExists('SilverBullet',ownedonly:enemydrop),
@ -273,7 +273,7 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
{
bool aex = SWWMUtility.ItemExists('CandyGun',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('MisterRifle',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return !Random[Replacements](0,2)?'MisterGAmmo2':Random[Replacements](0,2)?'MisterRound10':'MisterAmmo';
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return !Random[Replacements](0,2)?'MisterGAmmo2':Random[Replacements](0,2)?'MisterRound5':'MisterAmmo';
if ( aex ) return Random[Replacements](0,3)?'CandyGunBullets3':'CandyGunAmmo';
}
bool aex = SWWMUtility.ItemExists('Sparkster',ownedonly:enemydrop),