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

@ -419,7 +419,7 @@ Don't rely too much on this thing, the ammo tends to be scarce, and it might pot
### Mortal Bullets ~ Replaces Cells, Runes
![](docimg/mrbullet.png)
These 4.44x44.4mm, square-shaped telescoped rounds have a lot of *"fours"* in them for sure. You can find 'em as-is in bundless or rarely in full 20-round mags.
These 4.44x44.4mm, square-shaped telescoped rounds have a lot of *"fours"* in them for sure. You can find 'em as-is in bundless or rarely in full 12-round mags.
### Mortal Grenades ~ Replaces Cells, Runes
![](docimg/mrgrenade.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

After

Width:  |  Height:  |  Size: 238 B

Before After
Before After

View file

@ -2468,10 +2468,10 @@ SWWM_LORETXT_MILKBREADS =
"\cfYou know, learning that the milk comes from THOSE THINGS has absolutely not changed at all my opinion. This stuff is heavenly, it's the most delicious thing ever created, it's so sweet I'd just die for them. I mean, it kinda happened once when I overdosed on them (good god that was embarrassing). Yeah, no wonder I fucking died when I had more sugar than blood in my body. I remember Kirin-kun said he actually heard my heart explode, but I bet he was just being dramatic. There's no way that's what happened.\c-\n"
"\n"
"\cfOh yeah, and there's a myth going around that if you eat enough of these your boobs will get huge. I totally don't believe that's possible, of course not. What kind of fool would purposefully overdose on them to grow a pair of real big honkers?\c-";
SWWM_LORETAG_MISTERGUN = "Mortal Rifle";
SWWM_LORETAB_MISTERGUN = "Item";
SWWM_LOREREL_MISTERGUN = "NosKora;Saya";
SWWM_LORETXT_MISTERGUN =
SWWM_LORETAG_MISTERRIFLE = "Mortal Rifle";
SWWM_LORETAB_MISTERRIFLE = "Item";
SWWM_LOREREL_MISTERRIFLE = "NosKora;Saya";
SWWM_LORETXT_MISTERRIFLE =
"\cxDesignation:\c-\n"
"\cf Mortal Rifle\c-\n"
"\cf \"Mister\" (common nickname)\c-\n"

View file

@ -2302,8 +2302,8 @@ SWWM_LORETXT_MILKBREADS =
"\cfSabes, enterarme de que la leche viene de ESAS COSAS no ha cambiado en absoluto mi opinión. Esta cosa es celestial, es lo más delicioso jamás creado, es tan dulce que me moriría por ellos. A ver, casi que pasó eso justo cuando tuve una sobredosis de ellos (madre de dios que vergüenza). Sí, no me extraña que la palmase mucho cuando tenía más azúcar que sangre en el cuerpo. Kirin-kun dijo que incluso oyó explotar mi corazón, pero apuesto a que solo estaba siendo dramático, eso no puede haber pasado.\c-\n"
"\n"
"\cfOh ya, y resulta que hay un mito por ahí de que si comes suficientes de estos tus tetas se ponen enormes. Pues mira que en serio no creo que sea eso posible, por supuesto que no. ¿Que clase de idiota se metería una sobredosis de estas cosas a propósito para que le crezcan unas domingas gigantes?\c-";
SWWM_LORETAG_MISTERGUN = "Rifle Mortal";
SWWM_LORETXT_MISTERGUN =
SWWM_LORETAG_MISTERRIFLE = "Rifle Mortal";
SWWM_LORETXT_MISTERRIFLE =
"\cxDesignación:\c-\n"
"\cf Rifle Mortal\c-\n"
"\cf \"Míster\" (apodo común)\c-\n"

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r439 \cu(Sun 11 Sep 23:30:00 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r439 \cu(2022-09-11 23:30:00)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r440 \cu(Mon 12 Sep 22:10:53 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r440 \cu(2022-09-12 22:10:53)\c-";

View file

@ -348,18 +348,6 @@ Model "MisterRound5"
FrameIndex XZW1 A 0 0
}
Model "MisterRound10"
{
Path "models"
Model 0 "MortalRound10_d.3d"
Skin 0 "MortalRound.png"
Scale 0.03 0.03 0.03
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}
Model "MisterAmmo"
{
Path "models"

View file

@ -28,7 +28,6 @@ Model "MisterRifle"
SurfaceSkin 1 4 "MortalLED.png"
SurfaceSkin 1 5 "MortalLED2.png"
SurfaceSkin 1 6 "MortalSight.png"
SurfaceSkin 1 7 "MortalMag.png"
Scale -0.01 0.005 0.01
@ -125,8 +124,8 @@ Model "MisterRifle"
FrameIndex XZW5 D 1 87
FrameIndex XZW5 E 1 88
FrameIndex XZW5 F 1 89
FrameIndex XZW5 G 1 90
FrameIndex XZW5 H 1 91 // DropGrenadeCasing
FrameIndex XZW5 G 1 90 // DropGrenadeCasing
FrameIndex XZW5 H 1 91
FrameIndex XZW5 I 1 92 // StartReload
FrameIndex XZW5 J 1 93
FrameIndex XZW5 K 1 94
@ -257,8 +256,8 @@ Model "MisterRifle"
FrameIndex XZWA A 1 219
FrameIndex XZWA B 1 220
FrameIndex XZWA C 1 221
FrameIndex XZWA D 1 222
FrameIndex XZWA E 1 223 // MagDrop
FrameIndex XZWA D 1 222 // MagDrop
FrameIndex XZWA E 1 223
FrameIndex XZWA F 1 224 // MagGrab
FrameIndex XZWA G 1 225
FrameIndex XZWA H 1 226
@ -337,8 +336,8 @@ Model "MisterRifle"
FrameIndex XZWC X 1 297
FrameIndex XZWC Y 1 298
FrameIndex XZWC Z 1 299
FrameIndex XZWD A 1 300
FrameIndex XZWD B 1 301 // DropGrenadeCasing
FrameIndex XZWD A 1 300 // DropGrenadeCasing
FrameIndex XZWD B 1 301
FrameIndex XZWD C 1 302 // StartReload
FrameIndex XZWD D 1 303
FrameIndex XZWD E 1 304
@ -460,8 +459,8 @@ Model "MisterRifle"
FrameIndex XZWH M 1 420
FrameIndex XZWH N 1 421
FrameIndex XZWH O 1 422
FrameIndex XZWH P 1 423
FrameIndex XZWH Q 1 424 // MagDrop
FrameIndex XZWH P 1 423 // MagDrop
FrameIndex XZWH Q 1 424
FrameIndex XZWH R 1 425 // MagGet
FrameIndex XZWH S 1 426
FrameIndex XZWH T 1 427

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -132,6 +132,7 @@ mister/magin sounds/dlc1/mister/mr_magin.ogg
mister/grenade sounds/dlc1/mister/mr_grenade.ogg
mister/grenadeopen sounds/dlc1/mister/mr_grenadeopen.ogg
mister/grenadeget sounds/dlc1/mister/mr_grenadeget.ogg
$alias mister/magget mister/grenadeget
mister/grenadein sounds/dlc1/mister/mr_grenadein.ogg
mister/grenadeclose sounds/dlc1/mister/mr_grenadeclose.ogg
mister/hitsemi1 sounds/dlc1/mister/mr_hit11.ogg

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),