diff --git a/README.md b/README.md index 89beb37f3..b34fd7084 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/graphics/HUD/MisterDisplay.png b/graphics/HUD/MisterDisplay.png index c7e19755d..3d43a61e5 100644 Binary files a/graphics/HUD/MisterDisplay.png and b/graphics/HUD/MisterDisplay.png differ diff --git a/language.def_lore b/language.def_lore index 9a1818972..a3fb768a3 100644 --- a/language.def_lore +++ b/language.def_lore @@ -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" diff --git a/language.es_lore b/language.es_lore index d093b9bf2..6e12c741e 100644 --- a/language.es_lore +++ b/language.es_lore @@ -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" diff --git a/language.version b/language.version index ef6a0e31c..81c0dd7fc 100644 --- a/language.version +++ b/language.version @@ -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-"; diff --git a/lore/default/mistergun.txt b/lore/default/misterrifle.txt similarity index 100% rename from lore/default/mistergun.txt rename to lore/default/misterrifle.txt diff --git a/lore/es/mistergun.txt b/lore/es/misterrifle.txt similarity index 100% rename from lore/es/mistergun.txt rename to lore/es/misterrifle.txt diff --git a/modeldef.dlcammo b/modeldef.dlcammo index f64c0d8f7..290c48c06 100644 --- a/modeldef.dlcammo +++ b/modeldef.dlcammo @@ -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" diff --git a/modeldef.mortalrifle b/modeldef.mortalrifle index a53de7309..8a75c242f 100644 --- a/modeldef.mortalrifle +++ b/modeldef.mortalrifle @@ -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 diff --git a/models/MortalRifle1st.blend b/models/MortalRifle1st.blend index 6466efb35..a04d89247 100644 Binary files a/models/MortalRifle1st.blend and b/models/MortalRifle1st.blend differ diff --git a/models/MortalRifle1st_a.3d b/models/MortalRifle1st_a.3d index db7969a47..79a684110 100644 Binary files a/models/MortalRifle1st_a.3d and b/models/MortalRifle1st_a.3d differ diff --git a/models/MortalRound10_a.3d b/models/MortalRound10_a.3d deleted file mode 100644 index 537436569..000000000 Binary files a/models/MortalRound10_a.3d and /dev/null differ diff --git a/models/MortalRound10_d.3d b/models/MortalRound10_d.3d deleted file mode 100644 index 0cc1bdb77..000000000 Binary files a/models/MortalRound10_d.3d and /dev/null differ diff --git a/sndinfo.dlcweapons b/sndinfo.dlcweapons index 408b1d4ce..359af1231 100644 --- a/sndinfo.dlcweapons +++ b/sndinfo.dlcweapons @@ -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 diff --git a/sounds/dlc1/mister/mr_charge_over.ogg b/sounds/dlc1/mister/mr_charge_over.ogg index 655e34f50..c88824d2c 100644 Binary files a/sounds/dlc1/mister/mr_charge_over.ogg and b/sounds/dlc1/mister/mr_charge_over.ogg differ diff --git a/sounds/dlc1/mister/mr_grenadeclose.ogg b/sounds/dlc1/mister/mr_grenadeclose.ogg index e42ce6f6d..69538704e 100644 Binary files a/sounds/dlc1/mister/mr_grenadeclose.ogg and b/sounds/dlc1/mister/mr_grenadeclose.ogg differ diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 8b6ce852e..2ef5bad4f 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -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; diff --git a/zscript/dlc1/swwm_dlcweapons_canvas.zsc b/zscript/dlc1/swwm_dlcweapons_canvas.zsc index f0bda7f6d..d68890ad9 100644 --- a/zscript/dlc1/swwm_dlcweapons_canvas.zsc +++ b/zscript/dlc1/swwm_dlcweapons_canvas.zsc @@ -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"); diff --git a/zscript/dlc1/swwm_dlcweapons_hud.zsc b/zscript/dlc1/swwm_dlcweapons_hud.zsc index b49451201..05e66c795 100644 --- a/zscript/dlc1/swwm_dlcweapons_hud.zsc +++ b/zscript/dlc1/swwm_dlcweapons_hud.zsc @@ -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 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; diff --git a/zscript/items/swwm_ammospawn.zsc b/zscript/items/swwm_ammospawn.zsc index 68f29950f..5ccf541b2 100644 --- a/zscript/items/swwm_ammospawn.zsc +++ b/zscript/items/swwm_ammospawn.zsc @@ -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),