All Mortal Rifle state code done. Actual firing later.
This commit is contained in:
parent
2d4c2b4632
commit
9dd3e27bbd
21 changed files with 489 additions and 68 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue