diff --git a/FuturePlans.md b/FuturePlans.md index 124322624..da97b5a50 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -60,10 +60,8 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - [Hexen] And Another One *(Defeat... yup, one more Heresiarch)* - [Hexen] The Last One *(Defeat the last Heresiarch)* - [Hexen] Didn't I Kick Your Ass Before? *(Defeat the Deathkings)* -* **Official Sunder support *(when the WAD is complete)*** -* ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff** +* **Mothgirl summon for Lämp easter egg** * **Replace all hitscan with *"light projectiles"*** -* **Customized cluster text stuff if that ever gets scriptified** * **Crouch sliding *(+ proper crouch dashing)*** * **Expand third person animations** - 4-directional movement variants @@ -75,33 +73,40 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - Giggle - Shrug - Beckon +* **Japanese localization???** +* ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff** +* **Customized cluster text stuff if that ever gets scriptified** +* **Official Sunder support *(when the WAD is complete)*** +* **Photo Mode** + - Dedicated poses + - Stickers +* **Monster/decoration replacements add-on:** + - Potentially standalone, usable with other mods + - Balanced for this mod + - Unique bosses + - Some extra enemy variants + - Coverage for all supported IWADs *(oof)* * **DLC Gameset:** - Tetris - Pong - Snake - - **[Doom]** Demo Land Adventure (platformer with shooty gameplay) - - **[Heretic]** Interstellar Demolitionist (a somewhat simple vertical SHMUP, kinda Touhou styled) - - **[Hexen]** Demolition Quest (a JRPG, kinda like early FF / BoF) -* **Mothgirl summon for Lämp easter egg** -* **Ibuki companion add-on** -* **Saya companion add-on** -* **Kirin companion add-on *(Hexen-exclusive)*** + - **[Doom]** Demo Land Adventure *(platformer with shooty gameplay)* + - **[Heretic]** Interstellar Demolitionist *(a somewhat simple vertical SHMUP, kinda Touhou styled)* + - **[Hexen]** Demolition Quest *(a JRPG, kinda like early FF / BoF)* * **Original English Voice Acting:** - Demolitionist - Ibuki - Saya - Kirin -* **Japanese localization???** -* **Monster/decoration replacements add-on** -* **Photo Mode** - - Dedicated poses - - Stickers -* **Hardcore Mode** +* **Ibuki sub-mod *(Red Oni)*** +* **Saya sub-mod *(Red-Eyed Rampage)*** +* **Kirin sub-mod *(Red Star of Innocence)*** +* **Hardcore Mode sub-mod:** - Featuring Demolitionist on Maidbot frame - More complex game mechanics - Manual Hammerspace management - Manual reloading and weapon maintenance - - Alternate mobility options (no jetpack) + - Alternate mobility options *(no jetpack)* - Non-instant item usage * **DLC Weaponset 2:** - [1] Hand of Divine *(Total Madness)* @@ -119,4 +124,7 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - [Heretic/Hexen] Safety Tether *(Original)* - Devastation Sigil *(SWWM)* - Divine Sprite *(SWWM Platinum)* - - Angel of Death *(Total Destruction, SWWM Platinum Ep2)* \ No newline at end of file + - Angel of Death *(Total Destruction, SWWM Platinum Ep2)* +* **Official Campaign:** + - Retell the events of UnSX 2 *(but with the Demolitionist's participation)* + - Basically give SWWM GZ its own IWAD as a standalone game \ No newline at end of file diff --git a/TODO.md b/TODO.md index 4a47f1cff..9e9c6242e 100644 --- a/TODO.md +++ b/TODO.md @@ -17,6 +17,7 @@ **Very extra things for the future:** - - Saya and Ibuki companion add-ons (potentially a Kirin companion too) - - Possibly also playable versions of them, for coop - Modeled Monster/Decoration replacers for all IWADs done in the style of the mod (will be very time consuming) + - Another DLC weaponset + - Official DM map pack + - Official IWAD diff --git a/language.version b/language.version index bb6e4cc3b..da6006876 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r586 \cu(Sat 7 Aug 23:17:38 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r586 \cu(2021-08-07 23:17:38)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r588 \cu(Sun 8 Aug 19:32:39 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r588 \cu(2021-08-08 19:32:39)\c-"; diff --git a/modeldef.candygun b/modeldef.candygun index 014475e55..431380274 100644 --- a/modeldef.candygun +++ b/modeldef.candygun @@ -430,4 +430,90 @@ Model "CandyGun" FrameIndex XZWC H 1 21 FrameIndex XZWC I 1 22 FrameIndex XZWC J 1 23 + /// LAST ROUND + SurfaceSkin 1 0 "DemoTags.png" + SurfaceSkin 1 1 "DemoArms.png" + SurfaceSkin 1 2 "DemoSoft.png" + SurfaceSkin 1 3 "CandyGun.png" + SurfaceSkin 1 4 "" + SurfaceSkin 1 5 "CandyGun.png" + // Fire + FrameIndex XZWC K 1 237 + FrameIndex XZWC L 1 238 + FrameIndex XZWC M 1 239 + FrameIndex XZWC N 1 240 + FrameIndex XZWC O 1 241 + FrameIndex XZWC P 1 242 + FrameIndex XZWC Q 1 243 + FrameIndex XZWC R 1 244 + FrameIndex XZWC S 1 245 + // Still + FrameIndex XZW9 X 1 248 + // Reload (Part 1) + SurfaceSkin 1 5 "CandyGun_EmptyMag.png" // empty mag + FrameIndex XZW9 Z 1 249 + FrameIndex XZWC X 1 250 + FrameIndex XZWC Y 1 251 + FrameIndex XZWC Z 1 252 + FrameIndex XZWD A 1 253 + FrameIndex XZWD B 1 254 + FrameIndex XZWD C 1 255 + FrameIndex XZWD D 1 256 + FrameIndex XZWD E 1 257 + FrameIndex XZWD F 1 258 + FrameIndex XZWD G 1 259 + FrameIndex XZWD H 1 260 + FrameIndex XZWD I 1 261 + FrameIndex XZWD J 1 262 + FrameIndex XZWD K 1 263 + FrameIndex XZWD L 1 264 + // Reload (Part 2) + SurfaceSkin 1 5 "" // hide mag + SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag + FrameIndex XZWD M 1 265 + FrameIndex XZWD N 1 266 + FrameIndex XZWD O 1 267 + FrameIndex XZWD P 1 268 + FrameIndex XZWD Q 1 269 + FrameIndex XZWD R 1 270 + FrameIndex XZWD S 1 271 + FrameIndex XZWD T 1 272 + SurfaceSkin 1 6 "" // hide new mag + FrameIndex XZWD U 1 273 + FrameIndex XZWD V 1 274 + FrameIndex XZWD W 1 275 + SurfaceSkin 1 5 "CandyGun.png" // show mag + FrameIndex XZWD X 1 276 + FrameIndex XZWD Y 1 277 + FrameIndex XZWD Z 1 278 + FrameIndex XZWE A 1 279 + FrameIndex XZWE B 1 280 + FrameIndex XZWE C 1 281 + FrameIndex XZWE D 1 282 + FrameIndex XZWE E 1 283 + FrameIndex XZWE F 1 284 + FrameIndex XZWE G 1 285 + FrameIndex XZWE H 1 286 + FrameIndex XZWE I 1 287 + FrameIndex XZWE J 1 288 + FrameIndex XZWE K 1 289 + FrameIndex XZWE L 1 290 + FrameIndex XZWE M 1 291 + FrameIndex XZWE N 1 292 + FrameIndex XZWE O 1 293 + FrameIndex XZWE P 1 294 + // Deselect + FrameIndex XZWE Q 1 297 + FrameIndex XZWE R 1 298 + FrameIndex XZWE S 1 299 + FrameIndex XZWE T 1 300 + // Select + FrameIndex XZWE U 1 301 + FrameIndex XZWE V 1 302 + FrameIndex XZWE W 1 303 + FrameIndex XZWE X 1 304 + FrameIndex XZWE Y 1 305 + FrameIndex XZWE Z 1 306 + FrameIndex XZWF A 1 307 + } diff --git a/modeldef.explodiumgun b/modeldef.explodiumgun index 6d99c0881..a3418ab3c 100644 --- a/modeldef.explodiumgun +++ b/modeldef.explodiumgun @@ -372,5 +372,77 @@ Model "ExplodiumGun" FrameIndex XZWA H 1 21 FrameIndex XZWA I 1 22 FrameIndex XZWA J 1 23 + /// LAST ROUND + SurfaceSkin 1 0 "DemoTags.png" + SurfaceSkin 1 1 "DemoArms.png" + SurfaceSkin 1 2 "DemoSoft.png" + SurfaceSkin 1 3 "ExplodiumGun.png" + SurfaceSkin 1 4 "" + SurfaceSkin 1 5 "ExplodiumGun.png" + // Fire + FrameIndex XZWA K 1 237 + FrameIndex XZWA L 1 238 + FrameIndex XZWA M 1 239 + FrameIndex XZWA N 1 240 + FrameIndex XZWA O 1 241 + FrameIndex XZWA P 1 242 + FrameIndex XZWA Q 1 243 + FrameIndex XZWA R 1 244 + FrameIndex XZWA S 1 245 + // Still + FrameIndex XZW9 X 1 248 + // Reload (Part 1) + SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag + FrameIndex XZW9 Z 1 249 + FrameIndex XZWA X 1 250 + FrameIndex XZWA Y 1 251 + FrameIndex XZWA Z 1 252 + FrameIndex XZWB A 1 253 + FrameIndex XZWB B 1 254 + FrameIndex XZWB C 1 255 + FrameIndex XZWB D 1 256 + FrameIndex XZWB E 1 257 + FrameIndex XZWB F 1 258 + FrameIndex XZWB G 1 259 + FrameIndex XZWB H 1 260 + FrameIndex XZWB I 1 261 + FrameIndex XZWB J 1 262 + FrameIndex XZWB K 1 263 + FrameIndex XZWB L 1 264 + // Reload (Part 2) + SurfaceSkin 1 5 "" // hide mag + SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag + FrameIndex XZWB M 1 265 + FrameIndex XZWB N 1 266 + FrameIndex XZWB O 1 267 + FrameIndex XZWB P 1 268 + FrameIndex XZWB Q 1 269 + FrameIndex XZWB R 1 270 + FrameIndex XZWB S 1 271 + FrameIndex XZWB T 1 272 + SurfaceSkin 1 6 "" // hide new mag + FrameIndex XZWB U 1 273 + FrameIndex XZWB V 1 274 + FrameIndex XZWB W 1 275 + SurfaceSkin 1 5 "ExplodiumGun.png" // show mag + FrameIndex XZWB X 1 276 + FrameIndex XZWB Y 1 277 + FrameIndex XZWB Z 1 278 + FrameIndex XZWC A 1 279 + FrameIndex XZWC B 1 280 + FrameIndex XZWC C 1 281 + FrameIndex XZWC D 1 282 + FrameIndex XZWC E 1 283 + FrameIndex XZWC F 1 284 + FrameIndex XZWC G 1 285 + FrameIndex XZWC H 1 286 + FrameIndex XZWC I 1 287 + FrameIndex XZWC J 1 288 + FrameIndex XZWC K 1 289 + FrameIndex XZWC L 1 290 + FrameIndex XZWC M 1 291 + FrameIndex XZWC N 1 292 + FrameIndex XZWC O 1 293 + FrameIndex XZWC P 1 294 } diff --git a/modeldef.explodiumgun2 b/modeldef.explodiumgun2 index 60fd5828a..91faa2578 100644 --- a/modeldef.explodiumgun2 +++ b/modeldef.explodiumgun2 @@ -402,4 +402,171 @@ Model "DualExplodiumGun" FrameIndex XZWI H 1 21 FrameIndex XZWI I 1 22 FrameIndex XZWI J 1 23 + /// LAST ROUND + SurfaceSkin 1 0 "DemoTags.png" + SurfaceSkin 1 1 "DemoArms.png" + SurfaceSkin 1 2 "DemoSoft.png" + SurfaceSkin 1 3 "ExplodiumGun.png" + SurfaceSkin 1 4 "" + SurfaceSkin 1 5 "ExplodiumGun.png" + // RIGHT + Model 1 "ExplodiumGun1st_d.3d" + Offset 3 0 -2 + // Fire + FrameIndex XZWI K 1 237 + FrameIndex XZWI L 1 238 + FrameIndex XZWI M 1 239 + FrameIndex XZWI N 1 240 + FrameIndex XZWI O 1 241 + FrameIndex XZWI P 1 242 + FrameIndex XZWI Q 1 243 + FrameIndex XZWI R 1 244 + FrameIndex XZWI S 1 245 + // Still + FrameIndex XZWI V 1 248 + // Reload (Part 1) + SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag + FrameIndex XZWI W 1 249 + FrameIndex XZWI X 1 250 + FrameIndex XZWI Y 1 251 + FrameIndex XZWI Z 1 252 + FrameIndex XZWJ A 1 253 + FrameIndex XZWJ B 1 254 + FrameIndex XZWJ C 1 255 + FrameIndex XZWJ D 1 256 + FrameIndex XZWJ E 1 257 + FrameIndex XZWJ F 1 258 + FrameIndex XZWJ G 1 259 + FrameIndex XZWJ H 1 260 + FrameIndex XZWJ I 1 261 + FrameIndex XZWJ J 1 262 + FrameIndex XZWJ K 1 263 + FrameIndex XZWJ L 1 264 + // Reload (Part 2) + SurfaceSkin 1 5 "" // hide mag + SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag + FrameIndex XZWJ M 1 265 + FrameIndex XZWJ N 1 266 + FrameIndex XZWJ O 1 267 + FrameIndex XZWJ P 1 268 + FrameIndex XZWJ Q 1 269 + FrameIndex XZWJ R 1 270 + FrameIndex XZWJ S 1 271 + FrameIndex XZWJ T 1 272 + SurfaceSkin 1 6 "" // hide new mag + FrameIndex XZWJ U 1 273 + FrameIndex XZWJ V 1 274 + FrameIndex XZWJ W 1 275 + SurfaceSkin 1 5 "ExplodiumGun.png" // show mag + FrameIndex XZWJ X 1 276 + FrameIndex XZWJ Y 1 277 + FrameIndex XZWJ Z 1 278 + FrameIndex XZWK A 1 279 + FrameIndex XZWK B 1 280 + FrameIndex XZWK C 1 281 + FrameIndex XZWK D 1 282 + FrameIndex XZWK E 1 283 + FrameIndex XZWK F 1 284 + FrameIndex XZWK G 1 285 + FrameIndex XZWK H 1 286 + FrameIndex XZWK I 1 287 + FrameIndex XZWK J 1 288 + FrameIndex XZWK K 1 289 + FrameIndex XZWK L 1 290 + FrameIndex XZWK M 1 291 + FrameIndex XZWK N 1 292 + FrameIndex XZWK O 1 293 + FrameIndex XZWK P 1 294 + // Lower + FrameIndex XZWM U 1 297 + FrameIndex XZWM V 1 298 + FrameIndex XZWM W 1 299 + FrameIndex XZWM X 1 300 + FrameIndex XZWM Y 1 301 // Raise + FrameIndex XZWM Z 1 302 + FrameIndex XZWN A 1 303 + FrameIndex XZWN B 1 304 + FrameIndex XZWN C 1 305 + FrameIndex XZWN D 1 306 + FrameIndex XZWN E 1 307 + // LEFT + Model 1 "ExplodiumGun1stL_d.3d" + Offset -3 0 -2 + // Fire + FrameIndex XZWK Q 1 237 + FrameIndex XZWK R 1 238 + FrameIndex XZWK S 1 239 + FrameIndex XZWK T 1 240 + FrameIndex XZWK U 1 241 + FrameIndex XZWK V 1 242 + FrameIndex XZWK W 1 243 + FrameIndex XZWK X 1 244 + FrameIndex XZWK Y 1 245 + // Still + FrameIndex XZWK Z 1 248 + // Reload (Part 1) + SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag + FrameIndex XZWL A 1 249 + FrameIndex XZWL B 1 250 + FrameIndex XZWL C 1 251 + FrameIndex XZWL D 1 252 + FrameIndex XZWL E 1 253 + FrameIndex XZWL F 1 254 + FrameIndex XZWL G 1 255 + FrameIndex XZWL H 1 256 + FrameIndex XZWL I 1 257 + FrameIndex XZWL J 1 258 + FrameIndex XZWL K 1 259 + FrameIndex XZWL L 1 260 + FrameIndex XZWL M 1 261 + FrameIndex XZWL N 1 262 + FrameIndex XZWL O 1 263 + FrameIndex XZWL P 1 264 + // Reload (Part 2) + SurfaceSkin 1 5 "" // hide mag + SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag + FrameIndex XZWL Q 1 265 + FrameIndex XZWL R 1 266 + FrameIndex XZWL S 1 267 + FrameIndex XZWL T 1 268 + FrameIndex XZWL U 1 269 + FrameIndex XZWL V 1 270 + FrameIndex XZWL W 1 271 + FrameIndex XZWL X 1 272 + SurfaceSkin 1 6 "" // hide new mag + FrameIndex XZWL Y 1 273 + FrameIndex XZWL Z 1 274 + FrameIndex XZWM A 1 275 + SurfaceSkin 1 5 "ExplodiumGun.png" // show mag + FrameIndex XZWM B 1 276 + FrameIndex XZWM C 1 277 + FrameIndex XZWM D 1 278 + FrameIndex XZWM E 1 279 + FrameIndex XZWM F 1 280 + FrameIndex XZWM G 1 281 + FrameIndex XZWM H 1 282 + FrameIndex XZWM I 1 283 + FrameIndex XZWM J 1 284 + FrameIndex XZWM K 1 285 + FrameIndex XZWM L 1 286 + FrameIndex XZWM M 1 287 + FrameIndex XZWM N 1 288 + FrameIndex XZWM O 1 289 + FrameIndex XZWM P 1 290 + FrameIndex XZWM Q 1 291 + FrameIndex XZWM R 1 292 + FrameIndex XZWM S 1 293 + FrameIndex XZWM T 1 294 + // Lower + FrameIndex XZWN F 1 297 + FrameIndex XZWN G 1 298 + FrameIndex XZWN H 1 299 + FrameIndex XZWN I 1 300 + FrameIndex XZWN J 1 301 // Raise + FrameIndex XZWN K 1 302 + FrameIndex XZWN L 1 303 + FrameIndex XZWN M 1 304 + FrameIndex XZWN N 1 305 + FrameIndex XZWN O 1 306 + FrameIndex XZWN P 1 307 } diff --git a/models/ExplodiumGun1st.blend b/models/ExplodiumGun1st.blend index 280023732..4264edf19 100644 Binary files a/models/ExplodiumGun1st.blend and b/models/ExplodiumGun1st.blend differ diff --git a/models/ExplodiumGun1stL_a.3d b/models/ExplodiumGun1stL_a.3d index 0136cd550..b20598c1e 100644 Binary files a/models/ExplodiumGun1stL_a.3d and b/models/ExplodiumGun1stL_a.3d differ diff --git a/models/ExplodiumGun1st_a.3d b/models/ExplodiumGun1st_a.3d index 72211de0b..2912fdfea 100644 Binary files a/models/ExplodiumGun1st_a.3d and b/models/ExplodiumGun1st_a.3d differ diff --git a/zscript/weapons/swwm_splode.zsc b/zscript/weapons/swwm_splode.zsc index 2d905a0fc..17abab12c 100644 --- a/zscript/weapons/swwm_splode.zsc +++ b/zscript/weapons/swwm_splode.zsc @@ -335,13 +335,16 @@ Class ExplodiumGun : SWWMWeapon Ready: XZW2 A 1 { - if ( (invoker.clipcount <= 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Reload")); - else if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); + if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); else A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1|WRF_ALLOWRELOAD); } Wait; Fire: - XZW2 A 1 A_Schutt(); + XZW2 A 1 + { + A_Schutt(); + return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"FireLast"); + } XZW2 I 1; XZW2 J 1 { @@ -352,6 +355,47 @@ Class ExplodiumGun : SWWMWeapon XZW2 KLMNOP 1; XZW2 Q 2; Goto Ready; + FireLast: + XZW2 A 1; + XZWA K 1; + XZWA L 1 + { + int layer = PSP_WEAPON+1; + while ( player.FindPSprite(layer) ) layer++; + A_Overlay(layer,"Casing"); + } + XZWA M 1; + XZWA N 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP,.6,pitch:1.5); + XZWA OPQR 1; + XZWA S 2; + Goto ReloadLast; + ReloadLast: + XZW9 X 1 A_PlayerReload(); + XZW9 Z 1; + XZWA XYZ 1; + XZWB ABC 1; + XZWB D 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP,.3); + XZWB E 1 { invoker.clipcount = 0; } + XZWB F 1; + XZWB G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWB HIJK 1; + XZWB L 1 A_DropMag(); + XZWB MNOPQR 1; + XZWB S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZWB TUVWXYZ 1; + XZWC ABCD 1; + XZWC E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZWC FGHI 1; + XZWC J 1 + { + A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount--; + invoker.chambered = true; + } + XZWC K 1; + XZWC L 3; + XZWC MNOP 1; + Goto Ready; Casing: XZWA A 1 { @@ -736,14 +780,12 @@ Class DualExplodiumGun : SWWMWeapon player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReady")); sis = player.FindPSprite(PSP_WEAPON+1); } - if ( sis.CurState.InStateSequence(ResolveState("LeftReady")) ) + if ( sis.CurState.InStateSequence(ResolveState("LeftReady")) || sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) { - if ( (ExplodiumGun(invoker.SisterWeapon).clipcount <= 0) && !ExplodiumGun(invoker.SisterWeapon).chambered ) - player.SetPSprite(PSP_WEAPON,ResolveState("Reload")); - else if ( (ExplodiumGun(invoker.SisterWeapon).clipcount > 0) && !ExplodiumGun(invoker.SisterWeapon).chambered ) + if ( (ExplodiumGun(invoker.SisterWeapon).clipcount > 0) && !ExplodiumGun(invoker.SisterWeapon).chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("PreSlide")); else if ( (invoker.clipcount <= 0) && !invoker.chambered ) - player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload")); + player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReloadLast")); else if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftPreSlide")); else if ( (player.cmd.buttons&BT_RELOAD) && (ExplodiumGun(invoker.SisterWeapon).clipcount < ExplodiumGun(invoker.SisterWeapon).default.clipcount) @@ -751,7 +793,8 @@ Class DualExplodiumGun : SWWMWeapon player.SetPSprite(PSP_WEAPON,ResolveState("Reload")); else if ( (player.cmd.buttons&BT_RELOAD) && (invoker.clipcount < invoker.default.clipcount) ) player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload")); - else A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1); + else if ( !sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1); + else A_WeaponReady(); } else { @@ -770,7 +813,11 @@ Class DualExplodiumGun : SWWMWeapon } Wait; Fire: - XZW2 A 1 A_Schutt(); + XZW2 A 1 + { + A_Schutt(); + return A_JumpIf((ExplodiumGun(invoker.SisterWeapon).clipcount<=0)&&!ExplodiumGun(invoker.SisterWeapon).chambered,"FireLast"); + } XZW2 I 1; XZW2 J 1 { @@ -781,8 +828,70 @@ Class DualExplodiumGun : SWWMWeapon XZW2 KLMNOP 1; XZW2 Q 2; Goto Ready; + FireLast: + XZW2 A 1; + XZWI K 1; + XZWI L 1 + { + int layer = PSP_WEAPON+1; + while ( player.FindPSprite(layer) ) layer++; + A_Overlay(layer,"Casing"); + } + XZWI M 1; + XZWI N 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP,.6,pitch:1.5); + XZWI OPQR 1; + XZWI S 2; + Goto WaitLast; + WaitLast: + XZWI V 1 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + return A_JumpIf(sis.CurState.InStateSequence(ResolveState("LeftReady"))||sis.CurState.InStateSequence(ResolveState("LeftWaitLast")),"ReloadLast"); + } + Wait; + ReloadLast: + XZWI V 9 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); + } + XZWI V 1 A_PlayerReload(); + XZWI WXYZ 1; + XZWJ ABC 1; + XZWJ D 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP,.3); + XZWJ E 1 { ExplodiumGun(invoker.SisterWeapon).clipcount = 0; } + XZWJ F 1; + XZWJ G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWJ HIJK 1; + XZWJ L 1 A_DropMag(); + XZWJ MNOPQR 1; + XZWJ S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZWJ TUVWXYZ 1; + XZWK ABCD 1; + XZWK E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; } + XZWK FGHI 1; + XZWK J 1 + { + A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + ExplodiumGun(invoker.SisterWeapon).clipcount--; + ExplodiumGun(invoker.SisterWeapon).chambered = true; + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); + } + XZWK K 1; + XZWK L 3; + XZWK MNOP 1; + Goto Ready; LeftFire: - XZWB A 1 A_Schutt(-1); + XZWB A 1 + { + A_Schutt(-1); + return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"LeftFireLast"); + } XZWB I 1; XZWB J 1 { @@ -793,6 +902,53 @@ Class DualExplodiumGun : SWWMWeapon XZWB KLMNOP 1; XZWB Q 2; Goto LeftReady; + LeftFireLast: + XZWB A 1; + XZWK Q 1; + XZWK R 1 + { + int layer = PSP_WEAPON+1; + while ( player.FindPSprite(layer) ) layer++; + A_Overlay(layer,"Casing"); + } + XZWK S 1; + XZWK T 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP,.6,pitch:1.5); + XZWK UVWX 1; + XZWK Y 2; + Goto LeftWaitLast; + LeftWaitLast: + XZWK Z 1; + Wait; + LeftReloadLast: + XZWK Z 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); } + XZWK Z 1 A_PlayerReload(); + XZWL ABCDEFG 1; + XZWL H 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP,.3); + XZWL I 1 { invoker.clipcount = 0; } + XZWL J 1; + XZWL K 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWL LMNO 1; + XZWL P 1 A_DropMag(); + XZWL QRSTUV 1; + XZWL W 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZWL XYZ 1; + XZWM ABCDEFGH 1; + XZWM I 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZWM JKLM 1; + XZWM N 1 + { + A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount--; + invoker.chambered = true; + let sis = player.FindPSprite(PSP_WEAPON); + if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) ) + player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast")); + else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); + } + XZWM O 1; + XZWM P 3; + XZWM QRST 1; + Goto LeftReady; Casing: XZWA A 1 { @@ -833,8 +989,33 @@ Class DualExplodiumGun : SWWMWeapon XZWG VUT 2; XZWB A 1; Goto LeftReady; + LowerLast: + XZWI V 2; + XZWM UVW 2; + XZWM Y -1; + Stop; + LeftLowerLast: + XZWK Z 2; + XZWN FGH 2; + XZWN J -1; + Stop; + RaiseLast: + XZWM Y 2; + XZWN WVU 2; + XZWI V 1; + Goto WaitLast; + LeftRaiseLast: + XZWN JHGF 2; + XZWK Z 1; + Goto LeftWaitLast; Reload: - XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); } + XZW2 A 9 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); + } XZW2 A 1 { A_PlayerReload(); @@ -870,10 +1051,22 @@ Class DualExplodiumGun : SWWMWeapon } XZW4 STUV 1; XZW2 A 0 A_JumpIf(!ExplodiumGun(invoker.SisterWeapon).chambered,"Slide"); - XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); } + XZW2 A 0 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); + } Goto Ready; PreSlide: - XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); } + XZW2 A 9 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); + } Slide: XZW2 A 1; XZW4 WXY 1; @@ -887,10 +1080,22 @@ Class DualExplodiumGun : SWWMWeapon XZW5 EFG 1; XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); XZW5 IJKLM 1; - XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); } + XZW2 A 0 + { + let sis = player.FindPSprite(PSP_WEAPON+1); + if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) ) + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast")); + else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); + } Goto Ready; LeftReload: - XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); } + XZWB A 9 + { + let sis = player.FindPSprite(PSP_WEAPON); + if ( sis.CurState.InStateSequence(ResolveState("WaitLast")) ) + player.SetPSPrite(PSP_WEAPON,ResolveState("LowerLast")); + else player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); + } XZWB A 1 { A_PlayerReload(); @@ -926,10 +1131,22 @@ Class DualExplodiumGun : SWWMWeapon } XZWD STUV 1; XZWB A 0 A_JumpIf(!invoker.chambered,"LeftSlide"); - XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); } + XZWB A 0 + { + let sis = player.FindPSprite(PSP_WEAPON); + if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) ) + player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast")); + else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); + } Goto LeftReady; LeftPreSlide: - XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); } + XZWB A 9 + { + let sis = player.FindPSprite(PSP_WEAPON); + if ( sis.CurState.InStateSequence(ResolveState("WaitLast")) ) + player.SetPSPrite(PSP_WEAPON,ResolveState("LowerLast")); + else player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); + } LeftSlide: XZWB A 1; XZWD WXY 1; @@ -943,7 +1160,13 @@ Class DualExplodiumGun : SWWMWeapon XZWE EFG 1; XZWE H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); XZWE IJKLM 1; - XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); } + XZWB A 0 + { + let sis = player.FindPSprite(PSP_WEAPON); + if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) ) + player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast")); + else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); + } Goto LeftReady; Zoom: XZW2 A 1 diff --git a/zscript/weapons/swwm_tastytreat.zsc b/zscript/weapons/swwm_tastytreat.zsc index 9cc7c415f..e3d44918a 100644 --- a/zscript/weapons/swwm_tastytreat.zsc +++ b/zscript/weapons/swwm_tastytreat.zsc @@ -363,14 +363,21 @@ Class CandyGun : SWWMWeapon XZW1 AB -1; Stop; Select: - XZW2 B 2 A_FullRaise(); + XZW2 B 2 + { + A_FullRaise(); + return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"SelectLast"); + } XZW2 CDEFGH 2; Goto Ready; + SelectLast: + XZWE UVWXYZ 2; + XZWF A 2; + Goto ReadyLast; Ready: XZW2 A 1 { - if ( (invoker.clipcount <= 0) && !invoker.chambered && ((invoker.Ammo1.Amount > 0) || (CountInv("CandyGunBullets") > 0)) ) player.SetPSprite(PSP_WEAPON,ResolveState("Reload")); - else if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); + if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); else { int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; @@ -382,8 +389,24 @@ Class CandyGun : SWWMWeapon } } Wait; + ReadyLast: + XZW9 X 1 + { + if ( (invoker.Ammo1.Amount > 0) || (CountInv("CandyGunBullets") > 0) || sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) ) player.SetPSprite(PSP_WEAPON,ResolveState("ReloadLast")); + else + { + A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY); + if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) ) + invoker.CheckAmmo(EitherFire,true); + } + } + Wait; Fire: - XZW2 A 1 A_Schutt(); + XZW2 A 1 + { + A_Schutt(); + return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"FireLast"); + } XZW2 I 1; XZW2 J 1 { @@ -394,6 +417,64 @@ Class CandyGun : SWWMWeapon XZW2 KLMNOP 1; XZW2 Q 2; Goto Ready; + FireLast: + XZW2 A 1; + XZWC K 1; + XZWC L 1 + { + int layer = PSP_WEAPON+1; + while ( player.FindPSprite(layer) ) layer++; + A_Overlay(layer,"Casing"); + } + XZWC M 1; + XZWC N 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP,.6,pitch:1.5); + XZWC OPQR 1; + XZWC S 2; + Goto ReadyLast; + ReloadLast: + XZW9 X 1 A_PlayerReload(); + XZW9 Z 1; + XZWC XYZ 1; + XZWD ABC 1; + XZWD D 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP,.3); + XZWD E 1 { invoker.clipcount = 0; } + XZWD F 1; + XZWD G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWD HIJK 1; + XZWD L 1 A_DropMag(); + XZWD MNOPQR 1; + XZWD S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZWD TUVWXYZ 1; + XZWE ABCD 1; + XZWE E 1 + { + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + if ( sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) ) + invoker.clipcount = invoker.default.clipcount; + else if ( invoker.Ammo1.Amount <= 0 ) + { + MagAmmo sb = MagAmmo(FindInventory("CandyGunBullets")); + int takeamt = min(sb.Amount,sb.ClipSize); + invoker.clipcount = takeamt; + sb.Amount -= takeamt; + } + else + { + invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); + invoker.clipcount = invoker.default.clipcount; + } + } + XZWE FGHI 1; + XZWE J 1 + { + A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount--; + invoker.chambered = true; + } + XZWE K 1; + XZWE L 3; + XZWE MNOP 1; + Goto Ready; Casing: XZWC A 1 { @@ -572,11 +653,21 @@ Class CandyGun : SWWMWeapon XZW9 ABCDEFGHIJKLMNOPQRSTUVW 1; Goto Ready; Deselect: - XZW2 A 2 A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 2 + { + A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); + return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"DeselectLast"); + } XZWA TUVW 2; XZW2 B 2; XZW2 B -1 A_FullLower(); Stop; + DeselectLast: + XZW9 X 2; + XZWE QRST 2; + XZWE U 2; + XZWE U -1 A_FullLower(); + Stop; Flash: XZWZ A 2 {