From 72c4a81ff00eac7cd278ae45f9fdad49133e2fe6 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 30 Jan 2020 22:58:10 +0100 Subject: [PATCH] A whole lot of stuff, whew: - All ammo pickups done. - All weapons basic properties and spawn state set. - Implement Hammerspace Embiggener. - Corrections to lore stuff and other info. - Separated Hellblazer ammo between mags and single units. - Fix fourth healthbar being the same color as third. - Added "abstract" to some classes, just for safety. - Dashing and ramming tweaks. - Dashing no longer cancels when getting hurt. - Tiny menu fixes. --- README.md | 4 +- gldefs.ammo | 104 +++ gldefs.demolitionist | 28 +- gldefs.shinemaps | 40 ++ language.txt | 31 +- modeldef.ammo | 609 ++++++++++++++++ modeldef.candygun | 16 +- modeldef.deepimpact | 13 + modeldef.eviscerator | 13 + modeldef.explodiumgun | 2 +- modeldef.hellblazer | 13 + modeldef.pickups | 1 + modeldef.pusher | 13 + modeldef.silverbullet | 14 + modeldef.sparkster | 14 + modeldef.spreadgun | 13 + modeldef.wallbuster | 13 + modeldef.ynykron | 14 + .../DemoFace_bright.png | Bin .../DemoTags_bright.png | Bin models/HellblazerPickup_a.3d | Bin 3344 -> 2560 bytes models/HellblazerPickup_d.3d | Bin 20944 -> 16848 bytes models/ModelNotes.txt | 27 +- models/Shell_Gold_Used_mask.png | Bin 1032 -> 1127 bytes models/Shell_Gold_mask.png | Bin 1067 -> 1151 bytes shaders/glsl/Shinemap.fp | 5 - shaders/glsl/Shinemask.fp | 7 - shaders/glsl/Shinemask_bright.fp | 13 + textcolo.txt | 31 + zmapinfo.txt | 1 + zscript/swwm_ammo.zsc | 666 ++++++++++++++++-- zscript/swwm_blazeit.zsc | 26 + zscript/swwm_cbt.zsc | 22 + zscript/swwm_common.zsc | 224 +++++- zscript/swwm_danmaku.zsc | 13 + zscript/swwm_deathlydeathcannon.zsc | 19 + zscript/swwm_deepdarkimpact.zsc | 33 + zscript/swwm_hud.zsc | 9 +- zscript/swwm_inventory.zsc | 38 +- zscript/swwm_jackhammer.zsc | 30 + zscript/swwm_menu.zsc | 16 +- zscript/swwm_player.zsc | 51 +- zscript/swwm_shot.zsc | 56 +- zscript/swwm_sparkyboi.zsc | 19 + zscript/swwm_splode.zsc | 10 +- zscript/swwm_tastytreat.zsc | 84 +-- zscript/swwm_thiccboolet.zsc | 20 + 47 files changed, 2158 insertions(+), 217 deletions(-) create mode 100644 gldefs.ammo create mode 100644 gldefs.shinemaps create mode 100644 modeldef.ammo create mode 100644 modeldef.deepimpact create mode 100644 modeldef.eviscerator create mode 100644 modeldef.hellblazer create mode 100644 modeldef.pickups create mode 100644 modeldef.pusher create mode 100644 modeldef.silverbullet create mode 100644 modeldef.sparkster create mode 100644 modeldef.spreadgun create mode 100644 modeldef.wallbuster create mode 100644 modeldef.ynykron rename brightmaps/DemoFace.png => models/DemoFace_bright.png (100%) rename brightmaps/DemoTags.png => models/DemoTags_bright.png (100%) create mode 100644 shaders/glsl/Shinemask_bright.fp create mode 100644 textcolo.txt diff --git a/README.md b/README.md index 76d415033..1fe507d2b 100644 --- a/README.md +++ b/README.md @@ -433,7 +433,7 @@ You're fucking invincible for a total of 90 seconds, cannot be toggled. ### Hammerspace Embiggener, replaces Backpack, Bag of Holding, Porkalator Each of these you pick up increase ammo capacity by half of its base value, up -to 10x, and also give you some extra ammo like a normal backpack. +to 5x, and also give you some extra ammo like a normal backpack. ### Universal Ammo Fabricator, replaces Mana / Krater of Might in Hexen @@ -441,7 +441,7 @@ Separated into four tiers, they work pretty much like the ammo cubes in Doom Tournament, except they try to "balance" the total ammo given. The max tier fabricator is the only one capable of producing ammo for superweapons. -### Lamp, replaces Lite-Amp, Torch +### Lamp, replaces Lite-Amp, Torch, Mystic Ambit Incant A floating lamp companion, may attract moths. The moths will disperse and attack nearby enemies when toggling it off. diff --git a/gldefs.ammo b/gldefs.ammo new file mode 100644 index 000000000..675dfc213 --- /dev/null +++ b/gldefs.ammo @@ -0,0 +1,104 @@ +HardwareShader Texture "models/Shell_Gold.png" +{ + Shader "shaders/glsl/Shinemask.fp" + Texture "masktex" "models/Shell_Gold_mask.png" + Texture "envtex" "models/goldmap.png" +} +HardwareShader Texture "models/Shell_Gold_Used.png" +{ + Shader "shaders/glsl/Shinemask.fp" + Texture "masktex" "models/Shell_Gold_Used_mask.png" + Texture "envtex" "models/goldmap.png" +} +HardwareShader Texture "models/Fabricator.png" +{ + Shader "shaders/glsl/Shinemask_bright.fp" + Texture "masktex" "models/Fabricator_mask.png" + Texture "envtex" "models/silvermap.png" + Texture "brighttex" "models/Fabricator_bright.png" +} +HardwareShader Texture "models/Fabricator_Tier2.png" +{ + Shader "shaders/glsl/Shinemask_bright.fp" + Texture "masktex" "models/Fabricator_mask.png" + Texture "envtex" "models/silvermap.png" + Texture "brighttex" "models/Fabricator_bright.png" +} +HardwareShader Texture "models/Fabricator_Tier3.png" +{ + Shader "shaders/glsl/Shinemask_bright.fp" + Texture "masktex" "models/Fabricator_mask.png" + Texture "envtex" "models/silvermap.png" + Texture "brighttex" "models/Fabricator_bright.png" +} +HardwareShader Texture "models/Fabricator_Tier4.png" +{ + Shader "shaders/glsl/Shinemask_bright.fp" + Texture "masktex" "models/Fabricator_mask.png" + Texture "envtex" "models/goldmap.png" + Texture "brighttex" "models/Fabricator_bright.png" +} +HardwareShader Texture "models/Embiggener.png" +{ + Shader "shaders/glsl/Shinemask_bright.fp" + Texture "masktex" "models/Embiggener_mask.png" + Texture "envtex" "models/redmap.png" + Texture "brighttex" "models/Embiggener_bright.png" +} + +PointLight GOLDSHELLLIGHT +{ + Color 0.7 0.6 0.2 + Size 12 + Offset 0 16 0 + Attenuate 1 +} +Object GoldShell +{ + Frame "XZW1" { light "GOLDSHELLLIGHT" } +} + +PointLight FABTIER1LIGHT +{ + Color 0.0 0.3 1.0 + Size 30 + Offset 0 16 0 + Attenuate 1 +} +PointLight FABTIER2LIGHT +{ + Color 0.0 1.0 0.3 + Size 30 + Offset 0 16 0 + Attenuate 1 +} +PointLight FABTIER3LIGHT +{ + Color 1.0 0.3 0.0 + Size 30 + Offset 0 16 0 + Attenuate 1 +} +PointLight FABTIER4LIGHT +{ + Color 1.0 0.9 0.3 + Size 30 + Offset 0 16 0 + Attenuate 1 +} +Object FabricatorTier1 +{ + Frame "XZW1" { light "FABTIER1LIGHT" } +} +Object FabricatorTier2 +{ + Frame "XZW1" { light "FABTIER2LIGHT" } +} +Object FabricatorTier3 +{ + Frame "XZW1" { light "FABTIER3LIGHT" } +} +Object FabricatorTier4 +{ + Frame "XZW1" { light "FABTIER4LIGHT" } +} diff --git a/gldefs.demolitionist b/gldefs.demolitionist index 0b0091061..eab29af77 100644 --- a/gldefs.demolitionist +++ b/gldefs.demolitionist @@ -1,56 +1,56 @@ Brightmap Texture "models/DemoFace_Blank.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Blink.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Booty.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Dead.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Default.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Dizzy.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Evil.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Grin.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Hurt.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_HurtLeft.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_HurtRight.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Ouch.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoFace_Wink.png" { - Map "brightmaps/DemoFace.png" + Map "models/DemoFace_bright.png" } Brightmap Texture "models/DemoTags.png" { - Map "brightmaps/DemoTags.png" + Map "models/DemoTags_bright.png" } diff --git a/gldefs.shinemaps b/gldefs.shinemaps new file mode 100644 index 000000000..b915f179a --- /dev/null +++ b/gldefs.shinemaps @@ -0,0 +1,40 @@ +HardwareShader Texture "models/blumap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/darkmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/goldmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/greenmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/invincimap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/pinkmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/purpmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/ragemap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/redmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/silvermap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} diff --git a/language.txt b/language.txt index d4a504c03..5cde04457 100644 --- a/language.txt +++ b/language.txt @@ -342,7 +342,7 @@ SWWM_LORETXT_HAMMERSPACEEMBIGGENER = "Designation: Hammerspace Embiggener\n" "Manufacturer: Cyrus Enterprises\n" "\n" -"Summary: These unique keys allow you to increase the maximum storage space allocated on your Hammerspace Container. Multiple keys can be used but there's a maximum limit of ten expansions per customer.\n" +"Summary: These unique keys allow you to increase the maximum storage space allocated on your Hammerspace Container. Multiple keys can be used but there's a maximum limit of eight expansions per customer.\n" "\n" "Addendum: You may find these tucked away in certain spots throughout your mission.\n" "\n" @@ -718,7 +718,7 @@ T_EVISCERATOR = "Eviscerator"; I_EVISCERATOR = "\"Eviscerator\" High Load Flechette Cannon"; T_HELLBLAZER = "Hellblazer"; I_HELLBLAZER = "\"Hellblazer\" Rocket Launcher"; -T_SPARKSTER = "Sparkster"; +T_SPARKSTER = "Biospark Carbine"; I_SPARKSTER = "Model S-5 Biospark Carbine"; T_SILVERBULLET = "Silver Bullet JET"; T_CANDYGUN = "Candy Gun"; @@ -740,23 +740,34 @@ T_GOLDSHELL = "Golden Shell"; T_GOLDSHELLS = "Golden Shells"; T_EVISHELL = "Eviscerator Shell"; T_EVISHELLS = "Eviscerator Shells"; +I_EVISHELLPAK = "Eviscerator 6-Pack"; T_HELLMISSILES = "Hellblazer Missiles"; T_HELLCLUSTERS = "Hellblazer Crackshots"; T_HELLBURNINATORS = "Hellblazer Ravagers"; T_HELLNUKES = "Hellblazer Warheads"; -T_SPARKUNIT = "Sparkster Charge"; +T_HELLMISSILE = "Hellblazer Missile"; +T_HELLCLUSTER = "Hellblazer Crackshot"; +T_HELLBURNINATOR = "Hellblazer Ravager"; +T_HELLNUKE = "Hellblazer Warhead"; +T_HELLMISSILEMAG = "Hellblazer Missile Mag"; +T_HELLCLUSTERMAG = "Hellblazer Crackshot Mag"; +T_HELLBURNINATORMAG = "Hellblazer Ravager Mag"; +T_HELLNUKEMAG = "Hellblazer Warhead Mag"; +T_SPARKUNIT = "Biospark Unit"; T_XSBMAG = "1.150 XSB Magazine"; T_CANDYMAG = "Candy Gun Magazine"; T_CANDYSPARE = "Candy Gun Spare"; -T_YNYKRONAMMO = "Exotic Crystal"; +T_YNYKRONAMMO = "Crystal Box"; T_BLASTSUIT = "Blast Suit"; T_EMBIGGENER = "Hammerspace Embiggener"; -T_FABRICATOR = "Ammo Fabricator"; -T_LOOTBOX = "Chancebox"; -T_TIER1 = "(Common)"; -T_TIER2 = "(Rare)"; -T_TIER3 = "(Very Rare)"; -T_TIER4 = "(Super Rare)"; +T_FABRICATOR1 = "Ammo Fabricator (Common)"; +T_FABRICATOR2 = "Ammo Fabricator (Rare)"; +T_FABRICATOR3 = "Ammo Fabricator (Very Rare)"; +T_FABRICATOR4 = "Ammo Fabricator (Super Rare)"; +T_LOOTBOX1 = "Chancebox (Common)"; +T_LOOTBOX2 = "Chancebox (Rare)"; +T_LOOTBOX3 = "Chancebox (Very Rare)"; +T_LOOTBOX4 = "Chancebox (Super Rare)"; T_GHOSTARTI = "Ghost Artifact"; T_GRAVITYS = "Gravity Suppressor"; T_TETRAHEALTH = "Health Tetrahedron"; diff --git a/modeldef.ammo b/modeldef.ammo new file mode 100644 index 000000000..951adc482 --- /dev/null +++ b/modeldef.ammo @@ -0,0 +1,609 @@ +Model "RedShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RedShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RedShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RedShell8" +{ + Path "models" + + Model 0 "ShellAmmo_Eight_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RedShell12" +{ + Path "models" + + Model 0 "ShellAmmo_Twelve_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RedShell16" +{ + Path "models" + + Model 0 "ShellAmmo_Sixteen_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "GreenShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Slug.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "GreenShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Slug.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "GreenShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Slug.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "GreenShell8" +{ + Path "models" + + Model 0 "ShellAmmo_Eight_d.3d" + SurfaceSkin 0 0 "Shell_Slug.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "GreenShell12" +{ + Path "models" + + Model 0 "ShellAmmo_Twelve_d.3d" + SurfaceSkin 0 0 "Shell_Slug.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "WhiteShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Dragon.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "WhiteShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Dragon.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "WhiteShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Dragon.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "WhiteShell8" +{ + Path "models" + + Model 0 "ShellAmmo_Eight_d.3d" + SurfaceSkin 0 0 "Shell_Dragon.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "BlueShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Kinylum.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "BlueShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Kinylum.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "BlueShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Kinylum.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "BlueShell8" +{ + Path "models" + + Model 0 "ShellAmmo_Eight_d.3d" + SurfaceSkin 0 0 "Shell_Kinylum.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "BlackShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Fuck.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "BlackShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Fuck.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "BlackShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Fuck.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "PurpleShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Ball.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "PurpleShell2" +{ + Path "models" + + Model 0 "ShellAmmo_Two_d.3d" + SurfaceSkin 0 0 "Shell_Ball.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "PurpleShell4" +{ + Path "models" + + Model 0 "ShellAmmo_Four_d.3d" + SurfaceSkin 0 0 "Shell_Ball.png" + SurfaceSkin 0 1 "silvermap.png" + Scale 0.024 0.024 0.024 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "GoldShell" +{ + Path "models" + + Model 0 "ShellAmmo_One_d.3d" + SurfaceSkin 0 0 "Shell_Gold.png" + SurfaceSkin 0 1 "goldmap.png" + Scale 0.024 0.024 0.024 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "EvisceratorShell" +{ + Path "models" + + Model 0 "EvisceratorProj_d.3d" + Skin 0 "EvisceratorShell.png" + Scale 0.18 0.18 0.18 + PitchOffset 45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "EvisceratorSixPack" +{ + Path "models" + + Model 0 "EvisceratorAmmo_d.3d" + SurfaceSkin 0 0 "EvisceratorAmmo.png" + SurfaceSkin 0 1 "EvisceratorShell.png" + Scale 0.08 0.08 0.08 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "HellblazerMissiles" +{ + Path "models" + + Model 0 "HellblazerProj_d.3d" + Skin 0 "HellblazerMissile.png" + Scale 0.16 0.16 0.16 + PitchOffset 45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "HellblazerMissileMag" +{ + Path "models" + + Model 0 "HellblazerAmmo_d.3d" + SurfaceSkin 0 0 "HellblazerAmmo.png" + SurfaceSkin 0 1 "HellblazerMissile.png" + Scale 0.16 0.16 0.16 + PitchOffset -45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "HellblazerCrackshots" +{ + Path "models" + + Model 0 "HellblazerProj_d.3d" + Skin 0 "HellblazerMissile_Cluster.png" + Scale 0.16 0.16 0.16 + PitchOffset 45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "HellblazerCrackshotMag" +{ + Path "models" + + Model 0 "HellblazerAmmo_Three_d.3d" + SurfaceSkin 0 0 "HellblazerAmmo_Cluster.png" + SurfaceSkin 0 1 "HellblazerMissile_Cluster.png" + Scale 0.16 0.16 0.16 + PitchOffset -45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "HellblazerRavagers" +{ + Path "models" + + Model 0 "HellblazerProj_d.3d" + Skin 0 "HellblazerMissile_Fire.png" + Scale 0.16 0.16 0.16 + PitchOffset 45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "HellblazerRavagerMag" +{ + Path "models" + + Model 0 "HellblazerAmmo_Three_d.3d" + SurfaceSkin 0 0 "HellblazerAmmo_Fire.png" + SurfaceSkin 0 1 "HellblazerMissile_Fire.png" + Scale 0.16 0.16 0.16 + PitchOffset -45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "HellblazerWarheads" +{ + Path "models" + + Model 0 "HellblazerProj_d.3d" + Skin 0 "HellblazerMissile_Nuke.png" + Scale 0.16 0.16 0.16 + PitchOffset 45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "HellblazerWarheadMag" +{ + Path "models" + + Model 0 "HellblazerAmmo_Two_d.3d" + SurfaceSkin 0 0 "HellblazerAmmo_Nuke.png" + SurfaceSkin 0 1 "HellblazerMissile_Nuke.png" + Scale 0.16 0.16 0.16 + PitchOffset -45 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "SparkUnit" +{ + Path "models" + + Model 0 "SparksterAmmo_d.3d" + Skin 0 "SparksterAmmo.png" + Scale 0.16 0.16 0.16 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "SilverBulletAmmo" +{ + Path "models" + + Model 0 "SilverbulletMag_d.3d" + Skin 0 "SilverbulletAmmo.png" + Scale 0.24 0.24 0.24 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "CandyGunAmmo" +{ + Path "models" + + Model 0 "ExplodiumMag_d.3d" + Skin 0 "CandyGun.png" + Scale 0.06 0.06 0.06 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "YnykronAmmo" +{ + Path "models" + + Model 0 "YnykronAmmo_d.3d" + Skin 0 "YnykronAmmo.png" + Scale 0.24 0.24 0.24 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "FabricatorTier1" +{ + Path "models" + + Model 0 "AmmoFabricator_d.3d" + Skin 0 "Fabricator.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "FabricatorTier2" +{ + Path "models" + + Model 0 "AmmoFabricator_d.3d" + Skin 0 "Fabricator_Tier2.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "FabricatorTier3" +{ + Path "models" + + Model 0 "AmmoFabricator_d.3d" + Skin 0 "Fabricator_Tier3.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "FabricatorTier4" +{ + Path "models" + + Model 0 "AmmoFabricator_d.3d" + Skin 0 "Fabricator_Tier4.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} + +Model "HammerspaceEmbiggener" +{ + Path "models" + + Model 0 "Embiggener_d.3d" + Skin 0 "Embiggener.png" + Scale 0.03 0.03 0.03 + PitchOffset 20 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.candygun b/modeldef.candygun index 084a5c3eb..375b94421 100644 --- a/modeldef.candygun +++ b/modeldef.candygun @@ -94,27 +94,13 @@ Model "TinyCandyBeam" FrameIndex XZW1 A 0 0 } -Model "CandyGunAmmo" -{ - Path "models" - - Model 0 "ExplodiumMag_d.3d" - Skin 0 "CandyGun.png" - Scale 0.03 0.03 0.03 - PitchOffset 30 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} - Model "CandyGun" { Path "models" Model 0 "ExplodiumGunPickup_d.3d" Skin 0 "CandyGun.png" - Scale 0.03 0.03 0.03 + Scale 0.06 0.06 0.06 ZOffset 16 ROTATING diff --git a/modeldef.deepimpact b/modeldef.deepimpact new file mode 100644 index 000000000..3715f85c8 --- /dev/null +++ b/modeldef.deepimpact @@ -0,0 +1,13 @@ +Model "DeepImpact" +{ + Path "models" + + Model 0 "DeepImpactPickup_d.3d" + Skin 0 "DeepImpact.png" + Scale 0.1 0.1 0.1 + AngleOffset 180 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.eviscerator b/modeldef.eviscerator new file mode 100644 index 000000000..08da00797 --- /dev/null +++ b/modeldef.eviscerator @@ -0,0 +1,13 @@ +Model "Eviscerator" +{ + Path "models" + + Model 0 "EvisceratorPickup_d.3d" + Skin 0 "Eviscerator.png" + Scale 0.09 0.09 0.09 + AngleOffset 180 + ZOffset 20 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.explodiumgun b/modeldef.explodiumgun index 984b754fb..d928217d2 100644 --- a/modeldef.explodiumgun +++ b/modeldef.explodiumgun @@ -57,7 +57,7 @@ Model "ExplodiumGun" Model 0 "ExplodiumGunPickup_d.3d" Skin 0 "ExplodiumGun.png" - Scale 0.03 0.03 0.03 + Scale 0.04 0.04 0.04 ZOffset 16 ROTATING diff --git a/modeldef.hellblazer b/modeldef.hellblazer new file mode 100644 index 000000000..7bed3793f --- /dev/null +++ b/modeldef.hellblazer @@ -0,0 +1,13 @@ +Model "Hellblazer" +{ + Path "models" + + Model 0 "HellblazerPickup_d.3d" + Skin 0 "Hellblazer.png" + Scale 0.11 0.11 0.11 + AngleOffset 180 + ZOffset 20 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.pickups b/modeldef.pickups new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/modeldef.pickups @@ -0,0 +1 @@ + diff --git a/modeldef.pusher b/modeldef.pusher new file mode 100644 index 000000000..32adae185 --- /dev/null +++ b/modeldef.pusher @@ -0,0 +1,13 @@ +Model "PusherWeapon" +{ + Path "models" + + Model 0 "PusherPickup_d.3d" + Skin 0 "Pusher.png" + Scale 0.15 0.15 0.15 + AngleOffset 180 + ZOffset 20 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.silverbullet b/modeldef.silverbullet new file mode 100644 index 000000000..f67e0a8db --- /dev/null +++ b/modeldef.silverbullet @@ -0,0 +1,14 @@ +Model "SilverBullet" +{ + Path "models" + + Model 0 "SilverbulletPickup_d.3d" + SurfaceSkin 0 0 "Silverbullet.png" + SurfaceSkin 0 1 "SilverbulletAmmo.png" + Scale 0.24 0.24 0.24 + AngleOffset 180 + ZOffset 20 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.sparkster b/modeldef.sparkster new file mode 100644 index 000000000..b93186da1 --- /dev/null +++ b/modeldef.sparkster @@ -0,0 +1,14 @@ +Model "Sparkster" +{ + Path "models" + + Model 0 "SparksterPickup_d.3d" + SurfaceSkin 0 0 "Sparkster.png" + SurfaceSkin 0 1 "SparksterAmmo.png" + Scale 0.12 0.12 0.12 + AngleOffset 180 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.spreadgun b/modeldef.spreadgun new file mode 100644 index 000000000..607b6bf3c --- /dev/null +++ b/modeldef.spreadgun @@ -0,0 +1,13 @@ +Model "Spreadgun" +{ + Path "models" + + Model 0 "SpreadgunPickup_d.3d" + Skin 0 "Spreadgun.png" + Scale 0.035 0.035 0.035 + AngleOffset 180 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.wallbuster b/modeldef.wallbuster new file mode 100644 index 000000000..a72cc111c --- /dev/null +++ b/modeldef.wallbuster @@ -0,0 +1,13 @@ +Model "Wallbuster" +{ + Path "models" + + Model 0 "WallbusterPickup_d.3d" + Skin 0 "Wallbuster.png" + Scale 0.2 0.2 0.2 + AngleOffset 180 + ZOffset 28 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/modeldef.ynykron b/modeldef.ynykron new file mode 100644 index 000000000..6d0a802df --- /dev/null +++ b/modeldef.ynykron @@ -0,0 +1,14 @@ +Model "Ynykron" +{ + Path "models" + + Model 0 "YnykronPickup_d.3d" + SurfaceSkin 0 0 "Ynykron.png" + SurfaceSkin 0 1 "YnykronAmmo.png" + Scale 0.24 0.24 0.24 + AngleOffset 180 + ZOffset 24 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/brightmaps/DemoFace.png b/models/DemoFace_bright.png similarity index 100% rename from brightmaps/DemoFace.png rename to models/DemoFace_bright.png diff --git a/brightmaps/DemoTags.png b/models/DemoTags_bright.png similarity index 100% rename from brightmaps/DemoTags.png rename to models/DemoTags_bright.png diff --git a/models/HellblazerPickup_a.3d b/models/HellblazerPickup_a.3d index f1eadf08aab4b2e343f6404a1dcf8ca26338b816..80e327b5cd96362c46a4940fffaded8ac8a7b0e6 100644 GIT binary patch delta 22 dcmbOr)gZ#c$nb}ABZ~+7<^T>2rpYZlJpe?r1~C8t delta 814 zcmZn=nIOf&$iTz9k;Q|(p55=~e|EPDes;f~a_nj~U)b3kKCnM?{=&ZR*njq8?)>a( zHd^d#4tng*n6=pV9g{Qj{rTU_wSwQw_otkhYRwljR)-H}Po2M*?LGG2?5I1xnW~MJ z8LNYy*;8gMv%SaU*xL>%u;)4Iu+OX00khlwDzxM|>a@(O(`jitRIkv|_E*8@-$8{_ z{|+knq&cdcN^?~6VQbJh#nzzVv#d_-)UrA?AHIJIr}+LU_$;%NKDEqF+K26c#3{A| z5 zaerSYbBfJD%AMUo>XaOtql~+}qs(R>b`7TbmVZ_JAm^~R{Z(Mk+oiU`|}%AK$7%$8zS)YL`erNQqh=>{O3hA+z3uN`_J39U?0h>}+4HRau>Y&7=LZS4@a<%6 z$+P+cvZST$?_VFcYTi?B)x17&yEsn8?c(t1+r@OMZx@r#KI{Ld_F4b;vHSb~l-=L| zK5F||PO0r<@%grw>(sZsTt3Ha_)Zf1FBl{NeNO;NMgK4*vB? zb7Vf1=E&^Bc7XL1+W}UeWp&J_menzX3}NSUz|f?ZLA>q z7Cu*gpL2))pE`HwzmFfw|5JV}|9$FOnNHQUGWpc6Yvnk#u9d^*m<#WzV=lZtZp?hA z+?e@%#G1HHi8XQgJZoe*^{kPlrR|Uc$RPHAY?AErT9rVSfRa|rKQ_shd96wyIglEk zV=jWHj=2c>tYZ~BwT@NHr|ziqsk)=mK7K9or~F#vea;<{J9X}moX;~xsZ-Awr38G$ Xm_$yAF^TxNISZU}a~7Cf!r21=Bvn+% diff --git a/models/HellblazerPickup_d.3d b/models/HellblazerPickup_d.3d index 1dd23b9e5046dd3bfc88b723db89b00268f3cce6..393cda765a3f074d33bea33fe94072149c3424c2 100644 GIT binary patch delta 4608 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 delta 8737 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 delta 1022 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 Jmvv4FO#mjg5oG`X delta 1058 zcmey*v6^FoL_G^L0|P^Zd(K-11_pxwpAc6D1_ntxO^EOWx#}JR>cdt5j%Y+IX`1t>I zZ<0dVsr&2NT&AT-dCg*IDPTG^&KX6wF`zoj_ zzREjiXuY|c-S&;&cNW&bn{`)rdN?e%`H~}4wXgB+_4xg(zOULP_eXvngTqP&wPzca ztvz+#hUGWIjXCD#OIXf7Pq5i~=;CFGj>c~V^0L+28O5{$I2}t_HEmvgl~SA+&o)_N z^5uvVxBAs1o0G+x8DP*U*q0!!$%!p{R+KpiEG+3rO-!kD_upIW{-^$09`C+A8F@yPw#UvMRh)HqE|D7Lpx{kN+n;0)+$1<)d(^G1` ze%@ODy@CCT))9_*>W=~!|2V0-yZnZl@9J}hRZ6$Z-2MLW*v@zJ)?hSCnn z70X0#eXp-}cWXbF^J~fCfGt~8J~K#Ndh_YF`n-(LmwWyOHXm%wyO(GEjG?dh_V>Qx z-+NRi3$&NFDL=Uw_%WgK!l$j3{_C$i*!6sNspb)uHD|NmKlkU)-}6D&Gj@JRe@De? z(>`6V%X0PSHP_zQXQ^3kbemHxpl`*J#aw&JAME;9SC)ThPyHX)KCQ$#;w@#Tcb(-d zUU|D$V%`}Y*7j97+x|Yd`tiUb9wmHEEOZMG-HOZsh z8FIdhGRyUDWhJ*Z%kAf{&+{@hKT*1Fu9@?lUt9m=adXV<_!>HWR>JEwF@~okPAeU% zur_Oa@=DXdIsdnT=y_WTys#QtGsu;bA=8?Nk`B&KbsIb}!00|V18{dH0v3o~@M z7hJY!|5|zA!0AIa0%EgyiJ c@CW~q;}@rd3ABD?U|?YIboFyt=akR{0N6eMaR2}S diff --git a/shaders/glsl/Shinemap.fp b/shaders/glsl/Shinemap.fp index 8428d8528..d9e906159 100644 --- a/shaders/glsl/Shinemap.fp +++ b/shaders/glsl/Shinemap.fp @@ -1,8 +1,3 @@ -vec4 ProcessTexel( vec4 color ) -{ - return vec4(1.); -} - vec4 ProcessTexel() { vec3 rnorm = normalize(vEyeNormal.xyz)*(1,-1,1); diff --git a/shaders/glsl/Shinemask.fp b/shaders/glsl/Shinemask.fp index c05262443..a997e877f 100644 --- a/shaders/glsl/Shinemask.fp +++ b/shaders/glsl/Shinemask.fp @@ -1,10 +1,3 @@ -vec4 ProcessLight( vec4 color ) -{ - float mask = texture(masktex,vTexCoord.st).x; - vec3 rnorm = normalize(vEyeNormal.xyz)*(1,-1,1); - return vec4(color.rgb*(1.+mask.x),color.a); -} - vec4 ProcessTexel() { vec4 base = getTexel(vTexCoord.st); diff --git a/shaders/glsl/Shinemask_bright.fp b/shaders/glsl/Shinemask_bright.fp new file mode 100644 index 000000000..46785c872 --- /dev/null +++ b/shaders/glsl/Shinemask_bright.fp @@ -0,0 +1,13 @@ +vec4 ProcessLight( vec4 color ) +{ + vec3 bright = texture(brighttex,vTexCoord.st).rgb; + return vec4(min(color.rgb+bright,1.),color.a); +} + +vec4 ProcessTexel() +{ + vec4 base = getTexel(vTexCoord.st); + float mask = texture(masktex,vTexCoord.st).x; + vec3 rnorm = normalize(vEyeNormal.xyz)*(1,-1,1); + return vec4(base.rgb+texture(envtex,rnorm.xy*.49+.5).rgb*mask,base.a); +} diff --git a/textcolo.txt b/textcolo.txt new file mode 100644 index 000000000..3c37470f0 --- /dev/null +++ b/textcolo.txt @@ -0,0 +1,31 @@ +DarkYellow "Dark Yellow" +{ + #272727 #515151 0 64 + #3C240C #79530C 65 207 + #795415 #7E6821 208 256 +Console: + #000000 #3F3F00 0 127 + #7F7F00 #7F7F7F 128 256 +Flat: + #777719 +} + +DarkOrange "Dark Orange" +{ + #100000 #804000 +Console: + #100000 #482000 0 127 + #804000 #807F7F 128 256 +Flat: + #805500 +} + +DarkPurple "Dark Purple" +{ + #110011 #670067 +Console: + #000000 #4F004D 0 127 + #800080 #808080 128 256 +Flat: + #4C3366 +} diff --git a/zmapinfo.txt b/zmapinfo.txt index 7869823d9..7351f0d39 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -5,6 +5,7 @@ GameInfo PlayerClasses = "Demolitionist" PrecacheClasses = "Demolitionist","ExplodiumGun" StatusBarClass = "SWWMStatusBar" + BackpackType = "HammerspaceEmbiggener" } Map TITLEMAP "SWWM GZ - Title Map" diff --git a/zscript/swwm_ammo.zsc b/zscript/swwm_ammo.zsc index 8207772c9..153168b5d 100644 --- a/zscript/swwm_ammo.zsc +++ b/zscript/swwm_ammo.zsc @@ -1,5 +1,142 @@ // All the ammo items go here +// Common code for ammo division +Mixin Class SWWMAmmo +{ + private Inventory DoDrop( Class type ) + { + let copy = Inventory(Spawn(type,Owner.Pos,NO_REPLACE)); + if ( !copy ) return null; + copy.MaxAmount = MaxAmount; + copy.DropTime = 30; + copy.bSpecial = copy.bSolid = false; + copy.SetOrigin(Owner.Vec3Offset(0,0,10.),false); + copy.Angle = Owner.Angle; + copy.VelFromAngle(5.); + copy.Vel.Z = 1.; + copy.Vel += Owner.Vel; + copy.bNoGravity = false; + copy.ClearCounters(); + copy.OnDrop(Owner); + copy.vel += (RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-2.5,2.5)),Owner.angle),FRandom[Junk](2.,5.)); + return copy; + } + + private bool CmpAmmo( Class a, Class b ) + { + let amta = GetDefaultByType(a).Amount; + let amtb = GetDefaultByType(b).Amount; + return (amta < amtb); + } + + override inventory CreateTossable( int amt ) + { + if ( bUndroppable || bUntossable || !Owner || (Amount <= 0) || (amt == 0) ) + return null; + // cap + amt = min(amount,amt); + // enumerate all subclasses + Array > ammotypes; + ammotypes.Clear(); + for ( int i=0; i)(AllActorClasses[i])); + } + // sort from largest to smallest + for ( int i=0; i 0) && CmpAmmo(ammotypes[k-1],ammotypes[k]) ) + { + Class tmp = ammotypes[k]; + ammotypes[k] = ammotypes[k-1]; + ammotypes[k-1] = tmp; + k--; + } + j++; + } + } + // perform subdivision + Inventory last = null; + while ( amt > 0 ) + { + for ( int i=0; i= def.Amount ) + { + last = DoDrop(ammotypes[i]); + amt -= def.Amount; + Amount -= def.Amount; + break; + } + } + } + return last; + } + + override bool HandlePickup( Inventory item ) + { + // drop excess ammo + if ( (item is 'Ammo') && (Ammo(item).GetParentAmmo() == GetParentAmmo()) ) + { + int excess = Amount+item.Amount; + if ( excess > MaxAmount ) excess -= MaxAmount; + if ( excess < item.Amount ) + { + // enumerate all subclasses + Array > ammotypes; + ammotypes.Clear(); + for ( int i=0; i)(AllActorClasses[i])); + } + // sort from largest to smallest + for ( int i=0; i 0) && CmpAmmo(ammotypes[k-1],ammotypes[k]) ) + { + Class tmp = ammotypes[k]; + ammotypes[k] = ammotypes[k-1]; + ammotypes[k-1] = tmp; + k--; + } + j++; + } + } + // drop spares + Inventory last; + while ( excess > 0 ) + { + for ( int i=0; i= def.Amount ) + { + double ang = FRandom[Junk](0,360); + last = DoDrop(ammotypes[i]); + last.SetOrigin(item.pos,false); + last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](.2,.5); + excess -= 16; + break; + } + } + } + } + } + return Super.HandlePickup(item); + } +} + // ============================================================================ // Spreadgun / Wallbuster ammo // ============================================================================ @@ -9,7 +146,7 @@ Mixin Class SWWMShellAmmo { override string PickupMessage() { - String tagstr = "$"..GetParentAmmo().GetClassName(); + String tagstr = "$T_"..GetParentAmmo().GetClassName(); tagstr.MakeUpper(); if ( Amount > 1 ) { @@ -18,40 +155,29 @@ Mixin Class SWWMShellAmmo } return StringTable.Localize(tagstr); } - - override bool HandlePickup( Inventory item ) - { - // drop unwanted shells - if ( (item is 'Ammo') && (Ammo(item).GetParentAmmo() == GetParentAmmo()) ) - { - int excess = Amount+item.Amount; - if ( excess > MaxAmount ) excess -= MaxAmount; - if ( excess < item.Amount ) - { - // drop spares - for ( int i=0; i)(AllActorClasses[i]); + if ( !type || (type.GetParentClass() != 'Ammo') ) continue; + // check that it's for a valid weapon + bool isvalid = false; + for ( int j=0; j)(AllActorClasses[j]); + if ( !type2 ) continue; + let rep = GetReplacement(type2); + if ( (rep != type2) && !(rep is "DehackedPickup") ) continue; + readonly weap = GetDefaultByType(type2); + if ( !other.player || !other.player.weapons.LocateWeapon(type2) || weap.bCheatNotWeapon ) continue; + if ( (type2 is 'SWWMWeapon') && SWWMWeapon(weap).UsesAmmo(type) ) + { + isvalid = true; + break; + } + if ( (weap.AmmoType1 == type) || (weap.AmmoType2 == type) ) + { + isvalid = true; + break; + } + } + if ( !isvalid ) continue; + let ammoitem = Ammo(other.FindInventory(type)); + int amount = GetDefaultByType(type).BackpackAmount; + // extra ammo in baby mode and nightmare mode + if ( !bIgnoreSkill ) amount = int(amount*G_SkillPropertyFloat(SKILLP_AmmoFactor)); + if ( amount < 0 ) amount = 0; + if ( !ammoitem ) + { + // The player did not have the ammoitem. Add it. + ammoitem = Ammo(Spawn(type)); + ammoitem.Amount = amount; + if ( ammoitem.BackpackMaxAmount != ammoitem.default.MaxAmount ) + ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + if ( (ammoitem.Amount > ammoitem.MaxAmount) && !sv_unlimited_pickup ) + ammoitem.Amount = ammoitem.MaxAmount; + ammoitem.AttachToOwner(other); + } + else + { + // The player had the ammoitem. Give some more. + if ( ammoitem.BackpackMaxAmount != ammoitem.default.MaxAmount ) + ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + if ( ammoitem.Amount < ammoitem.MaxAmount ) + { + ammoitem.Amount += amount; + if ( (ammoitem.Amount > ammoitem.MaxAmount) && !sv_unlimited_pickup ) + ammoitem.Amount = ammoitem.MaxAmount; + } + } + } + return Inventory.CreateCopy(other); + } + + override bool HandlePickup( Inventory item ) + { + bool res = Super.HandlePickup(item); + if ( item.GetClass() == GetClass() ) + { + // readjust ammo values to new capacity + for ( Inventory i=Owner.Inv; i; i=i.Inv ) + { + if ( !(i is 'Ammo') ) continue; + if ( Ammo(i).BackpackMaxAmount != i.default.MaxAmount ) + i.MaxAmount = int(i.Default.MaxAmount*(1+self.Amount/2.)); + int amount = Ammo(i).BackpackAmount; + if ( !bIgnoreSkill ) amount = int(amount*G_SkillPropertyFloat(SKILLP_AmmoFactor)); + i.Amount += amount; + if ( (i.Amount > i.MaxAmount) && !sv_unlimited_pickup ) + i.Amount = i.MaxAmount; + } + } + return res; + } + + override void DetachFromOwner() + { + // reset upgrade + for ( Inventory i=Owner.Inv; i; i=i.Inv ) + { + if ( !(i is 'Ammo') ) continue; + i.MaxAmount = i.Default.MaxAmount; + if ( i.Amount > i.MaxAmount ) + i.Amount = i.MaxAmount; + } + } + + Default + { + Tag "$T_EMBIGGENER"; + Inventory.PickupMessage "$T_EMBIGGENER"; + Inventory.MaxAmount 8; + Inventory.InterHubAmount 8; + +INVENTORY.UNDROPPABLE; + +INVENTORY.UNTOSSABLE; + +INVENTORY.UNCLEARABLE; + +FLOATBOB; + FloatBobStrength 0.25; + } + States + { + Spawn: + XZW1 A -1; + Stop; + } +} diff --git a/zscript/swwm_blazeit.zsc b/zscript/swwm_blazeit.zsc index c14270da3..0fe4030a6 100644 --- a/zscript/swwm_blazeit.zsc +++ b/zscript/swwm_blazeit.zsc @@ -3,8 +3,34 @@ Class Hellblazer : SWWMWeapon { + int clipcount; + + Property ClipCount : clipcount; + + override bool UsesAmmo( Class kind ) + { + static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; + for ( int i=0; i<4; i++ ) if ( kind is types[i] ) return true; + return false; + } + Default { + Tag "$T_HELLBLAZER"; + Inventory.PickupMessage "$I_HELLBLAZER"; + Obituary "$O_HELLBLAZER"; + Weapon.SlotNumber 6; + Weapon.SelectionOrder 1800; Stamina 40000; + Weapon.AmmoType1 "HellblazerMissiles"; + Weapon.AmmoGive1 6; + Hellblazer.ClipCount 6; + +SWWMWEAPON.NOFIRSTGIVE; + } + States + { + Spawn: + XZW1 A -1; + Stop; } } diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index 0744bbfb1..2f3140bdd 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -7,8 +7,30 @@ Class WallbusterReloadMenu : GenericMenu Class Wallbuster : SWWMWeapon { + Class loaded[25]; + bool fired[25]; + int rotation[6]; + + override bool UsesAmmo( Class kind ) + { + static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; + for ( int i=0; i<4; i++ ) if ( kind is types[i] ) return true; + return false; + } + Default { + Tag "$T_WALLBUSTER"; + Inventory.PickupMessage "$I_WALLBUSTER"; + Obituary "$O_WALLBUSTER"; + Weapon.SlotNumber 4; + Weapon.SelectionOrder 2200; Stamina 15000; } + States + { + Spawn: + XZW1 A -1; + Stop; + } } diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 790f80c90..6c6c911ba 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -625,6 +625,16 @@ Class SWWMNothing : Actor } } +Class SWWMItemFog : Actor +{ + States + { + Spawn: + TNT1 A 1; + Stop; + } +} + // Bullet trails from DT Class WaterHit { @@ -1041,6 +1051,17 @@ Class SWWMHandler : EventHandler lastcombat = AddOneliner("fightstart",10); } + override void WorldThingDied( WorldEvent e ) + { + if ( (e.Thing.default.bBOSS && !Random[GoldDrop](0,2)) || (e.Thing.default.bBOSSDEATH && !Random[GoldDrop](0,6)) ) + { + let g = Actor.Spawn("GoldShell",e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); + double ang = FRandom[SpareShells](0,360); + g.vel.xy = (cos(ang),sin(ang))*FRandom[SpareShells](.4,.8); + g.vel.z = FRandom[SpareShells](2.,4.); + } + } + override void WorldThingDamaged( WorldEvent e ) { if ( !mutevoice ) mutevoice = CVar.GetCVar('swwm_mutevoice',players[consoleplayer]); @@ -1169,18 +1190,201 @@ Class SWWMHandler : EventHandler override void CheckReplacement( ReplaceEvent e ) { - if ( (e.Replacee is 'Pistol') || (e.Replacee is 'GoldWand') || (e.Replacee is 'FWeapFist') || (e.Replacee is 'CWeapMace') || (e.Replacee is 'MWeapWand') ) e.Replacement = 'ExplodiumGun'; + // shell types (sorted by rarity + static const Class redpool[] = {"RedShell","RedShell2","RedShell4","RedShell8","RedShell12","RedShell16"}; + static const Class greenpool[] = {"GreenShell","GreenShell2","GreenShell4","GreenShell8","GreenShell12"}; + static const Class whitepool[] = {"WhiteShell","WhiteShell2","WhiteShell4","WhiteShell8"}; + static const Class purplepool[] = {"PurpleShell","PurpleShell2","PurpleShell4"}; + static const Class bluepool[] = {"BlueShell","BlueShell2","BlueShell4","BlueShell8"}; + static const Class blackpool[] = {"BlackShell","BlackShell2","BlackShell4"}; + if ( (e.Replacee is 'ItemFog') ) e.Replacement = 'SWWMItemFog'; + else if ( (e.Replacee is 'Chainsaw') || (e.Replacee is 'Gauntlets') || (e.Replacee is 'FWeapAxe') ) e.Replacement = 'PusherWeapon'; + else if ( (e.Replacee is 'Fist') || (e.Replacee is 'Staff') ) e.Replacement = 'DeepImpact'; + else if ( (e.Replacee is 'Pistol') || (e.Replacee is 'GoldWand') || (e.Replacee is 'FWeapFist') || (e.Replacee is 'CWeapMace') || (e.Replacee is 'MWeapWand') ) e.Replacement = 'ExplodiumGun'; + else if ( (e.Replacee is 'Shotgun') || (e.Replacee is 'CWeapStaff') ) e.Replacement = 'Spreadgun'; + else if ( (e.Replacee is 'SuperShotgun') || (e.Replacee is 'MWeapFrost') ) e.Replacement = 'Wallbuster'; + else if ( e.Replacee is 'Crossbow' ) + { + if ( Random[Replacements](0,2) ) e.Replacement = 'Spreadgun'; + else e.Replacement = 'Wallbuster'; + } + else if ( (e.Replacee is 'Chaingun') || (e.Replacee is 'Blaster') || (e.Replacee is 'FWeapHammer') ) e.Replacement = 'Eviscerator'; + else if ( (e.Replacee is 'RocketLauncher') || (e.Replacee is 'PhoenixRod') || (e.Replacee is 'CWeapFlame') ) e.Replacement = 'Hellblazer'; + else if ( (e.Replacee is 'PlasmaRifle') || (e.Replacee is 'SkullRod') ) + { + if ( Random[Replacements](0,2) ) e.Replacement = 'Sparkster'; + else e.Replacement = 'SilverBullet'; + } + else if ( e.Replacee is 'MWeapLightning' ) e.Replacement = 'Sparkster'; + else if ( e.Replacee is 'FWeaponPiece3' ) e.Replacement = 'SilverBullet'; else if ( (e.Replacee is 'BFG9000') || (e.Replacee is 'Mace') ) { - /*if ( !Random[Replacements](0,2) ) e.Replacement = 'Ynykron'; - else */e.Replacement = 'CandyGun'; + if ( !Random[Replacements](0,2) ) e.Replacement = 'Ynykron'; + else e.Replacement = 'CandyGun'; + } + else if ( e.Replacee is 'CWeaponPiece2' ) e.Replacement = 'CandyGun'; + else if ( e.Replacee is 'MWeaponPiece1' ) e.Replacement = 'Ynykron'; + else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') || (e.Replacee is 'ArtiPoisonBag') ) + { + switch( Random[Replacement](0,6) ) + { + case 0: + case 1: + case 2: + e.Replacement = redpool[Random[Replacement](0,2)]; + break; + case 3: + case 4: + e.Replacement = greenpool[Random[Replacement](0,2)]; + break; + case 5: + e.Replacement = whitepool[Random[Replacement](0,1)]; + break; + case 6: + e.Replacement = purplepool[0]; + break; + } + } + else if ( (e.Replacee == 'Shell') || (e.Replacee is 'CrossbowAmmo') ) + { + switch( Random[Replacement](0,10) ) + { + case 0: + case 1: + case 2: + e.Replacement = redpool[Random[Replacement](2,3)]; + break; + case 3: + case 4: + e.Replacement = greenpool[Random[Replacement](2,3)]; + break; + case 5: + case 6: + e.Replacement = whitepool[Random[Replacement](1,2)]; + break; + case 7: + case 8: + e.Replacement = purplepool[Random[Replacement](0,2)]; + break; + case 9: + e.Replacement = bluepool[Random[Replacement](0,2)]; + break; + case 10: + e.Replacement = blackpool[0]; + break; + } + } + else if ( (e.Replacee == 'ShellBox') || (e.Replacee is 'CrossbowHefty') ) + { + switch( Random[Replacement](0,14) ) + { + case 0: + case 1: + case 2: + case 3: + e.Replacement = redpool[Random[Replacement](3,5)]; + break; + case 4: + case 5: + case 6: + e.Replacement = greenpool[Random[Replacement](3,4)]; + break; + case 7: + case 8: + case 9: + e.Replacement = whitepool[Random[Replacement](2,3)]; + break; + case 10: + case 11: + e.Replacement = purplepool[Random[Replacement](1,2)]; + break; + case 12: + case 13: + e.Replacement = bluepool[Random[Replacement](2,3)]; + break; + case 14: + e.Replacement = blackpool[Random[Replacement](0,2)]; + break; + } + } + else if ( e.Replacee == 'ClipBox' ) + { + if ( Random[Replacements](0,2) ) e.Replacement = 'EvisceratorShell'; + else e.Replacement = 'EvisceratorSixPack'; + } + else if ( e.Replacee == 'BlasterAmmo' ) e.Replacement = 'EvisceratorShell'; + else if ( e.Replacee == 'BlasterHefty' ) e.Replacement = 'EvisceratorSixPack'; + else if ( (e.Replacee == 'RocketAmmo') || (e.Replacee == 'PhoenixRodAmmo') || (e.Replacee == 'MaceAmmo') ) + { + switch ( Random[Replacements](0,9) ) + { + case 0: + case 1: + case 2: + case 3: + e.Replacement = 'HellblazerMissiles'; + break; + case 4: + case 5: + case 6: + e.Replacement = 'HellblazerCrackshots'; + break; + case 7: + case 8: + e.Replacement = 'HellblazerRavagers'; + break; + case 9: + e.Replacement = 'HellblazerWarheads'; + break; + } + } + else if ( (e.Replacee == 'RocketBox') || (e.Replacee == 'PhoenixRodHefty') || (e.Replacee == 'MaceHefty') ) + { + switch ( Random[Replacements](0,9) ) + { + case 0: + case 1: + case 2: + case 3: + e.Replacement = 'HellblazerMissileMag'; + break; + case 4: + case 5: + case 6: + e.Replacement = 'HellblazerCrackshotMag'; + break; + case 7: + case 8: + e.Replacement = 'HellblazerRavagerMag'; + break; + case 9: + e.Replacement = 'HellblazerWarheadMag'; + break; + } + } + else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') ) + { + if ( Random[Replacements](0,3) ) e.Replacement = 'SparkUnit'; + else e.Replacement = 'SilverBulletAmmo'; + } + else if ( e.Replacee == 'ArtiTeleport' ) + { + if ( Random[Replacements](0,2) ) e.Replacement = 'SWWMNothing'; + else e.Replacement = 'GoldShell'; } - else if ( e.Replacee is 'MWeaponPiece1' ) e.Replacement = 'CandyGun'; else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') ) { - /*if ( Random[Replacements](0,2) ) e.Replacement = 'SilverBulletAmmo'; - else */e.Replacement = 'CandyGunAmmo'; + if ( Random[Replacements](0,2) ) e.Replacement = 'SilverBulletAmmo'; + else e.Replacement = 'CandyGunAmmo'; } + else if ( e.Replacee == 'Mana1' ) e.Replacement = 'FabricatorTier1'; + else if ( e.Replacee == 'Mana2' ) e.Replacement = 'FabricatorTier2'; + else if ( e.Replacee == 'Mana3' ) e.Replacement = 'FabricatorTier3'; + else if ( e.Replacee == 'ArtiBoostMana' ) e.Replacement = 'FabricatorTier4'; + else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') || (e.Replacee == 'ArtiPork') ) e.Replacement = 'HammerspaceEmbiggener'; + else if ( (e.Replacee == 'FWeaponPiece1') || (e.Replacee == 'FWeaponPiece2') + || (e.Replacee == 'CWeaponPiece1') || (e.Replacee == 'CWeaponPiece3') + || (e.Replacee == 'MWeaponPiece2') || (e.Replacee == 'MWeaponPiece3') ) e.Replacement = 'SWWMNothing'; } override void NetworkProcess( ConsoleEvent e ) @@ -1219,9 +1423,11 @@ Class SWWMHandler : EventHandler Class item = e.Name.Mid(10); if ( !item ) return; let def = GetDefaultByType(item); - if ( players[e.Args[1]].mo.GiveInventory(item,1) ) + int amt = ((item is 'Ammo')&&Ammo(def).default.DropAmount)?Ammo(def).DropAmount:def.Amount; + int cap = min(amt,players[e.Args[1]].mo.CountInv(item)); + if ( players[e.Args[1]].mo.GiveInventory(item,amt) ) { - players[e.Args[0]].mo.TakeInventory(item,1); + players[e.Args[0]].mo.TakeInventory(item,amt); // add to history SWWMTradeHistory.RegisterSend(players[e.Args[0]],players[e.Args[1]],def.GetTag()); SWWMTradeHistory.RegisterReceive(players[e.Args[1]],players[e.Args[0]],def.GetTag()); @@ -1249,7 +1455,7 @@ Class SWWMHandler : EventHandler if ( !item ) return; let i = players[e.Args[0]].mo.FindInventory(item); if ( !i ) return; - let drop = players[e.Args[0]].mo.DropInventory(i,i.default.Amount); + let drop = players[e.Args[0]].mo.DropInventory(i,((i is 'Ammo')&&Ammo(i).default.DropAmount)?Ammo(i).default.DropAmount:i.default.Amount); // add some random velocity so multiple drops don't get bunched together if ( drop ) drop.vel += (Actor.RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-2.5,2.5)),players[e.Args[0]].mo.angle),FRandom[Junk](2.,5.)); } diff --git a/zscript/swwm_danmaku.zsc b/zscript/swwm_danmaku.zsc index ce3db75ec..7fa9a7dea 100644 --- a/zscript/swwm_danmaku.zsc +++ b/zscript/swwm_danmaku.zsc @@ -5,6 +5,19 @@ Class Eviscerator : SWWMWeapon { Default { + Tag "$T_EVISCERATOR"; + Inventory.PickupMessage "$I_EVISCERATOR"; + Obituary "$O_EVISCERATOR"; + Weapon.SlotNumber 5; + Weapon.SelectionOrder 2000; Stamina 25000; + Weapon.AmmoType1 "EvisceratorShell"; + Weapon.AmmoGive1 10; + } + States + { + Spawn: + XZW1 A -1; + Stop; } } diff --git a/zscript/swwm_deathlydeathcannon.zsc b/zscript/swwm_deathlydeathcannon.zsc index 00df49b1f..937094f58 100644 --- a/zscript/swwm_deathlydeathcannon.zsc +++ b/zscript/swwm_deathlydeathcannon.zsc @@ -3,8 +3,27 @@ Class Ynykron : SWWMWeapon { + int clipcount; + + Property ClipCount : clipcount; + Default { + Tag "$T_YNYKRON"; + Inventory.PickupMessage "$T_YNYKRON"; + Obituary "$O_YNYKRON"; + Weapon.SlotNumber 0; + Weapon.SelectionOrder 1000; Stamina 600000; + Weapon.AmmoType1 "YnykronAmmo"; + Weapon.AmmoGive1 1; + +SWWMWEAPON.NOFIRSTGIVE; + Ynykron.ClipCount 1; + } + States + { + Spawn: + XZW1 A -1; + Stop; } } diff --git a/zscript/swwm_deepdarkimpact.zsc b/zscript/swwm_deepdarkimpact.zsc index 7cf344b5d..87fcb0a24 100644 --- a/zscript/swwm_deepdarkimpact.zsc +++ b/zscript/swwm_deepdarkimpact.zsc @@ -3,8 +3,41 @@ Class DeepImpact : SWWMWeapon { + int clipcount; + + transient ui TextureID WeaponBox; + transient ui HUDFont mTewiFont; + + Property ClipCount : clipcount; + + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + // additional lore + SWWMLoreLibrary.Add(other.player,"Locke"); + } + + override bool ReportHUDAmmo() + { + return true; + } + Default { + Tag "$T_DEEPIMPACT"; + Inventory.PickupMessage "$I_DEEPIMPACT"; + Obituary "$O_DEEPIMPACT"; + Weapon.UpSound "impact/select"; + Weapon.SlotNumber 1; + Weapon.SelectionOrder 3000; Stamina 2000; + DeepImpact.ClipCount 100; + } + + States + { + Spawn: + XZW1 A -1; + Stop; } } diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index c414d5d3d..6e23dbfbc 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -190,7 +190,12 @@ Class SWWMStatusBar : BaseStatusBar bool dummy; int slot; if ( inv is 'Weapon' ) [dummy, slot] = CPlayer.weapons.LocateWeapon(Weapon(inv).GetClass()); - if ( (slot == (i%10)) && (!Weapon(inv).Ammo1 || (Weapon(inv).Ammo1.Amount > 0)) ) + if ( slot != (i%10) ) continue; + // CheckAmmo can't be called from ui, so we have to improvise + // for SWWM weapons I made a function for this at least + if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).ReportHUDAmmo() ) + hasammo = true; + else if ( !(inv is 'SWWMWeapon') && ((!Weapon(inv).Ammo1 || (Weapon(inv).Ammo1.Amount > 0)) || (Weapon(inv).Ammo2 && (Weapon(inv).Ammo2.Amount > 0))) ) hasammo = true; } if ( !hasammo ) ncolor = Font.CR_RED; @@ -231,7 +236,7 @@ Class SWWMStatusBar : BaseStatusBar if ( ht > 500 ) { hw = int(min(ht-500,500)*0.2); - Screen.DrawTexture(HealthTex[2],false,margin+2,ss.y-(margin+15),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRight,hw); + Screen.DrawTexture(HealthTex[3],false,margin+2,ss.y-(margin+15),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRight,hw); } int hcolor = Font.CR_RED; if ( ht > 500 ) hcolor = Font.CR_GOLD; diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index 3481d2cd3..21035a595 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -1,5 +1,5 @@ // Base class for all SWWM Armors -Class SWWMArmor : Armor +Class SWWMArmor : Armor abstract { int priority; @@ -57,12 +57,12 @@ Class SWWMArmor : Armor } // gives armor when used -Class SWWMSpareArmor : Inventory +Class SWWMSpareArmor : Inventory abstract { } // Base casing classes -Class SWWMCasing : Actor +Class SWWMCasing : Actor abstract { int deadtimer, numbounces; double pitchvel, anglevel; @@ -226,8 +226,27 @@ Class SWWMWeaponLight : DynamicLight } // Base class for all SWWM Weapons -Class SWWMWeapon : Weapon +Class SWWMWeapon : Weapon abstract { + private int SWeaponFlags; + + FlagDef NoFirstGive : SWeaponFlags, 0; // don't give ammo on first pickup (for weapons with a clip count) + + override void AttachToOwner (Actor other) + { + Inventory.AttachToOwner(other); + Ammo1 = AddAmmo(Owner,AmmoType1,bNoFirstGive?0:AmmoGive1); + Ammo2 = AddAmmo(Owner,AmmoType2,bNoFirstGive?0:AmmoGive2); + SisterWeapon = AddWeapon(SisterWeaponType); + if ( Owner.player ) + { + if ( !Owner.player.GetNeverSwitch() && !bNo_Auto_Switch ) + Owner.player.PendingWeapon = self; + if ( Owner.player.mo == players[consoleplayer].camera ) + StatusBar.ReceivedWeapon(self); + } + GivenAsMorphWeapon = false; + } override void DetachFromOwner() { Owner.A_StopSound(CHAN_WEAPON); @@ -346,6 +365,17 @@ Class SWWMWeapon : Weapon A_OverlayFlags(PSP_FLASH,PSPF_RENDERSTYLE,true); A_OverlayRenderStyle(PSP_FLASH,STYLE_Add); } + // tells the SWWM HUD that this weapon has ammo available + virtual clearscope bool ReportHUDAmmo() + { + return (!Ammo1||(Ammo1.Amount>0)||(Ammo2&&(Ammo2.Amount>0))); + } + // tells the Embiggener that this weapon uses the specified ammo type + // even if it is not its primary one + virtual clearscope bool UsesAmmo( Class kind ) + { + return (AmmoType1&&(kind is AmmoType1))||(AmmoType2&&(kind is AmmoType2)); + } Default { Weapon.BobStyle "Alpha"; diff --git a/zscript/swwm_jackhammer.zsc b/zscript/swwm_jackhammer.zsc index 783330a91..aaa4e7ff8 100644 --- a/zscript/swwm_jackhammer.zsc +++ b/zscript/swwm_jackhammer.zsc @@ -3,8 +3,38 @@ Class PusherWeapon : SWWMWeapon { + int chargelevel; + + transient ui TextureID WeaponBox; + transient ui HUDFont mTewiFont; + + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + // additional lore + SWWMLoreLibrary.Add(other.player,"Locke"); + } + + override bool ReportHUDAmmo() + { + return true; + } + Default { + Tag "$T_PUSHER"; + Inventory.PickupMessage "$I_PUSHER"; + Obituary "$O_PUSHER"; + Weapon.UpSound "pusher/select"; + Weapon.SlotNumber 1; + Weapon.SelectionOrder 2800; Stamina 5000; } + + States + { + Spawn: + XZW1 A -1; + Stop; + } } diff --git a/zscript/swwm_menu.zsc b/zscript/swwm_menu.zsc index 2ba915ff8..c11c42d40 100644 --- a/zscript/swwm_menu.zsc +++ b/zscript/swwm_menu.zsc @@ -163,7 +163,9 @@ Class SWWMKnowledgeBaseMenu : GenericMenu if ( invlist[sel0] is 'Ammo' ) return true; lastuse = invlist[sel0].GetClass(); lastuseamt = invlist[sel0].Amount; - checkuse = gametic+1; + // don't check weapons + if ( !(invlist[sel0] is 'Weapon') ) + checkuse = gametic+1; EventHandler.SendNetworkEvent(String.Format("swwmuseitem.%s",invlist[sel0].GetClassName()),consoleplayer); } return true; @@ -192,7 +194,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu invlist.Clear(); for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv ) { - if ( (inv.Amount <= 0) || !inv.bINVBAR && !(inv is 'Weapon') && !(inv is 'Ammo') ) continue; + if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') ) continue; String tag = inv.GetTag(); bool greater = false; for ( int i=0; i 1 ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i].MaxAmount > 1) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = TewiFont.StringWidth(str); if ( len > longest ) longest = len; int clscol = (i==sel0)?Font.CR_WHITE:Font.CR_DARKGRAY; - if ( invlist[i] is 'Weapon' ) clscol = (i==sel0)?Font.CR_YELLOW:Font.CR_ORANGE; - else if ( invlist[i] is 'Ammo' ) clscol = (i==sel0)?Font.CR_BROWN:Font.CR_DARKBROWN; + if ( invlist[i] is 'Weapon' ) clscol = (i==sel0)?Font.CR_YELLOW:Font.FindFontColor('DarkYellow'); + else if ( invlist[i] is 'Ammo' ) clscol = (i==sel0)?Font.CR_ORANGE:Font.FindFontColor('DarkOrange'); else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') ) clscol = (i==sel0)?Font.CR_RED:Font.CR_DARKRED; - else if ( invlist[i] is 'Armor' ) clscol = (i==sel0)?Font.CR_GREEN:Font.CR_DARKGREEN; + else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = (i==sel0)?Font.CR_GREEN:Font.CR_DARKGREEN; + else if ( invlist[i] is 'PuzzleItem' ) clscol = (i==sel0)?Font.CR_LIGHTBLUE:Font.CR_BLUE; + else if ( invlist[i] is 'PowerupGiver' ) clscol = (i==sel0)?Font.CR_PURPLE:Font.FindFontColor('DarkPurple'); Screen.DrawText(TewiFont,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); yy += 16; if ( yy >= 369 ) diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 1d15c8cae..bcfd2bd53 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -20,6 +20,8 @@ Class Demolitionist : PlayerPawn int cairtime; Vector3 oldpos; + int lastmpain; + Default { Speed 1; @@ -82,6 +84,11 @@ Class Demolitionist : PlayerPawn if ( (rep != type2) && !(rep is "DehackedPickup") ) continue; readonly weap = GetDefaultByType(type2); if ( !player.weapons.LocateWeapon(type2) || (weap.bCheatNotWeapon && (giveall != ALL_YESYES)) ) continue; + if ( (type2 is 'SWWMWeapon') && SWWMWeapon(weap).UsesAmmo(type) ) + { + isvalid = true; + break; + } if ( (weap.AmmoType1 == type) || (weap.AmmoType2 == type) ) { isvalid = true; @@ -311,10 +318,12 @@ Class Demolitionist : PlayerPawn dashsnd = true; else { - if ( dashsnd ) A_StartSound("demolitionist/jetstop",CHAN_JETPACK); + if ( dashsnd ) + A_StartSound("demolitionist/jetstop",CHAN_JETPACK); dashsnd = false; } if ( dashboost <= 0. ) return; + PainChance = InStateSequence(CurState,FindState("Dash"))?0:255; if ( InStateSequence(CurState,FindState("Dash")) ) { Actor a; @@ -325,22 +334,24 @@ Class Demolitionist : PlayerPawn a.vel = (RotateVector((j,0),angle+i*160),0)-(0,0,1)*j; a.vel -= vel*.5; } - Vector3 dir = vel.unit(); - double spd = vel.length(); + Vector3 dir = vel+dashdir*dashboost; + double spd = dir.length(); + dir = dir.unit(); // look for things we could potentially bump into let bi = BlockThingsIterator.Create(self,200); bool bumped = false; - while ( bi.Next() ) + while ( (spd > 0) && bi.Next() ) { a = bi.Thing; if ( !a || (a == self) || !a.bSHOOTABLE || a.bTHRUACTORS ) continue; Vector3 diff = level.Vec3Diff(level.Vec3Offset(pos,vel),level.Vec3Offset(a.pos,a.vel)); - if ( (abs(diff.x) > radius+a.radius) || (abs(diff.y) > radius+a.radius) ) continue; - if ( (diff.z > height) || (diff.z < -a.height) ) continue; + if ( (abs(diff.x) > (radius+a.radius+8)) || (abs(diff.y) > (radius+a.radius+8)) ) continue; + if ( (diff.z > (height+8)) || (diff.z < (8-a.height)) ) continue; double moveang = atan2(dir.y,dir.x); Vector3 sc = level.SphericalCoords(pos,a.pos,(moveang,0)); - if ( abs(sc.x) > 45 ) continue; + if ( abs(sc.x) > 60 ) continue; // bosses and large monsters will stop the player + A_QuakeEx(1,1,1,3,0,128,"",QF_RELATIVE|QF_SCALEDOWN); a.A_StartSound("demolitionist/bump",CHAN_FOOTSTEP,CHANF_OVERLAP); if ( a.bDONTTHRUST || (a.Mass >= Mass*5) ) { @@ -348,16 +359,16 @@ Class Demolitionist : PlayerPawn bumped = true; A_QuakeEx(3,3,3,8,0,128,"",QF_RELATIVE|QF_SCALEDOWN); A_StartSound("demolitionist/bump",CHAN_FOOTSTEP,CHANF_OVERLAP); - vel -= dir*(5+(spd*30/mass)); + vel -= dir*(9+(spd*30/mass)); vel.z += 3+(spd*(20/mass)); } - Vector3 pushdir = Vec3To(a).unit()*0.2+dir*0.8; + Vector3 pushdir = Vec3To(a).unit()*.1+dir*.9; if ( !a.bDONTTHRUST && (a.Mass < Mass*5) ) { - a.vel += pushdir*(12+(spd*80/max(50,a.mass))); + a.vel += pushdir*(15+(spd*150/max(50,a.mass))); a.vel.z += 5+(spd*(50/max(50,a.mass))); } - a.DamageMobj(self,self,int(15+spd*1.5),'Dash',DMG_THRUSTLESS); + a.DamageMobj(self,self,int(15+spd*2.5),'Dash',DMG_THRUSTLESS); } } else if ( InStateSequence(CurState,FindState("Jump")) ) @@ -377,7 +388,13 @@ Class Demolitionist : PlayerPawn // lucky collar if ( Health < 25 ) damage /= 4; if ( source == self ) damage /= 2; - return lastdamage = Super.DamageMobj(inflictor,source,damage,mod,flags,angle); + int lastdamage = Super.DamageMobj(inflictor,source,damage,mod,flags,angle); + if ( (lastdamage > 0) && (PainChance == 0) && (level.maptime>lastmpain) ) + { + lastmpain = level.maptime; + A_DemoPain(); + } + return lastdamage; } override void CalcHeight() { @@ -946,6 +963,7 @@ Class DashTrail : Actor +NOGRAVITY; +NOBLOCKMAP; +DONTSPLASH; + +NOTELEPORT; } override void PostBeginPlay() { @@ -991,6 +1009,7 @@ Class DashTrail2 : Actor +NOGRAVITY; +NOBLOCKMAP; +DONTSPLASH; + +NOTELEPORT; } override void PostBeginPlay() { @@ -1031,6 +1050,7 @@ Class DemolitionistRadiusShockwaveTail : Actor +NOGRAVITY; +DONTSPLASH; +WALLSPRITE; + +NOTELEPORT; } States { @@ -1062,6 +1082,7 @@ Class DemolitionistRadiusShockwave : Actor +STEPMISSILE; +NOEXPLODEFLOOR; +WALLSPRITE; + +NOTELEPORT; +RIPPER; } override int DoSpecialDamage( Actor target, int damage, Name damagetype ) @@ -1069,8 +1090,8 @@ Class DemolitionistRadiusShockwave : Actor if ( damage <= 0 ) return damage; if ( (target.mass < LARGE_MASS) && !target.bDONTTHRUST ) { - target.vel.xy += vel.xy.unit()*(5000./target.mass)*alpha; - target.vel.z += (800./target.mass)*alpha; + target.vel.xy += vel.xy.unit()*(5000./max(50,target.mass))*alpha; + target.vel.z += (800./max(50,target.mass))*alpha; } return damage; } @@ -1080,6 +1101,7 @@ Class DemolitionistRadiusShockwave : Actor SDST A 1 { SetZ(floorz); + Spawn("InvisibleSplasher",Vec3Offset(0,0,2)); let s = Spawn("DemolitionistRadiusShockwaveTail",pos); s.vel = vel*.8; s.scale = scale; @@ -1106,6 +1128,7 @@ Class DemolitionistShockwave : Actor { +NOGRAVITY; +NOBLOCKMAP; + +NOTELEPORT; +NODAMAGETHRUST; +FORCERADIUSDMG; } diff --git a/zscript/swwm_shot.zsc b/zscript/swwm_shot.zsc index 0cbc853c6..00730dd01 100644 --- a/zscript/swwm_shot.zsc +++ b/zscript/swwm_shot.zsc @@ -3,8 +3,62 @@ Class Spreadgun : SWWMWeapon { + bool loaded; + Class loadammo, nextammo; + + transient ui TextureID WeaponBox; + transient ui HUDFont mTewiFont; + + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + // additional lore + SWWMLoreLibrary.Add(other.player,"Blackmann"); + } + + override bool ReportHUDAmmo() + { + static const Class types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"}; + for ( int i=0; i<7; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; + return loaded; + } + + override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) + { + static const Class types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"}; + if ( (firemode == PrimaryFire) || (firemode == AltFire) ) + { + if ( loaded ) return true; + for ( int i=0; i<7; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; + return false; + } + return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); + } + + override bool UsesAmmo( Class kind ) + { + static const Class types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"}; + for ( int i=0; i<7; i++ ) if ( kind is types[i] ) return true; + return false; + } + Default { + Tag "$T_SPREADGUN"; + Inventory.PickupMessage "$I_SPREADGUN"; + Obituary "$O_SPREADGUN"; + Weapon.UpSound "spreadgun/select"; + Weapon.SlotNumber 3; + Weapon.SelectionOrder 2400; + Weapon.AmmoType1 "RedShell"; + Weapon.AmmoGive1 1; Stamina 10000; } -} + + States + { + Spawn: + XZW1 A -1; + Stop; + } +} \ No newline at end of file diff --git a/zscript/swwm_sparkyboi.zsc b/zscript/swwm_sparkyboi.zsc index 7b151c425..339804658 100644 --- a/zscript/swwm_sparkyboi.zsc +++ b/zscript/swwm_sparkyboi.zsc @@ -3,8 +3,27 @@ Class Sparkster : SWWMWeapon { + int clipcount; + + Property ClipCount : clipcount; + Default { + Tag "$T_SPARKSTER"; + Inventory.PickupMessage "$I_SPARKSTER"; + Obituary "$O_SPARKSTER"; + Weapon.SlotNumber 7; + Weapon.SelectionOrder 1600; Stamina 80000; + Weapon.AmmoType1 "SparkUnit"; + Weapon.AmmoGive1 1; + Sparkster.ClipCount 8; + +SWWMWEAPON.NOFIRSTGIVE; + } + States + { + Spawn: + XZW1 A -1; + Stop; } } diff --git a/zscript/swwm_splode.zsc b/zscript/swwm_splode.zsc index 98581336d..68c66f531 100644 --- a/zscript/swwm_splode.zsc +++ b/zscript/swwm_splode.zsc @@ -281,11 +281,11 @@ Class ExplodiumGun : SWWMWeapon Property ClipCount : ClipCount; - override void AttachToOwner( Actor other ) + override Inventory CreateCopy( Actor other ) { - Super.AttachToOwner(other); // additional lore SWWMLoreLibrary.Add(other.player,"Munch"); + return Super.CreateCopy(other); } override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) @@ -421,6 +421,11 @@ Class ExplodiumGun : SWWMWeapon c.vel += vel*.5; } + override bool ReportHUDAmmo() + { + return true; + } + Default { Tag "$T_EXPLODIUM"; @@ -428,6 +433,7 @@ Class ExplodiumGun : SWWMWeapon Obituary "$O_EXPLODIUM"; Weapon.UpSound "explodium/select"; Weapon.SlotNumber 2; + Weapon.SelectionOrder 2600; Stamina 600; ExplodiumGun.ClipCount 7; } diff --git a/zscript/swwm_tastytreat.zsc b/zscript/swwm_tastytreat.zsc index 3eb48d8c8..940e6f85d 100644 --- a/zscript/swwm_tastytreat.zsc +++ b/zscript/swwm_tastytreat.zsc @@ -145,12 +145,15 @@ Class CandyBeam : Actor { Vector3 tdir = level.Vec3Diff(pos,invoker.nextpos); Vector3 pvel = .1*tdir+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](.1,.3); - let m = Spawn(smk,level.Vec3Offset(pos,tdir*.5)); - m.vel = pvel; - m.SetShade(Color(1,1,1)*Random[ExploS](64,224)); - m.special1 = Random[ExploS](1,3); - m.scale *= 1.5; - m.alpha *= .4; + if ( special2 && !Random[ExploS](0,special2) ) + { + let m = Spawn(smk,level.Vec3Offset(pos,tdir*.5)); + m.vel = pvel; + m.SetShade(Color(1,1,1)*Random[ExploS](64,224)); + m.special1 = Random[ExploS](1,3); + m.scale *= 1.5; + m.alpha *= .4; + } if ( special1 > ReactionTime ) { let s = Spawn(pop,invoker.nextpos); @@ -162,6 +165,7 @@ Class CandyBeam : Actor b.pitch = asin(-invoker.nextdir.z); b.target = target; b.special1 = special1+1; + b.special2 = special2; b.frame = frame; } Default @@ -245,6 +249,7 @@ Class CandyPop : Actor s.target = target; s.angle = ang; s.pitch = pt; + s.special2 = 3; s.ReactionTime += Random[ExploS](-4,12); } numpt = Random[ExploS](1,3); @@ -338,7 +343,7 @@ Class CandyMagArm : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - reactiontime = Random[ExploS](6,12); + reactiontime = Random[ExploS](4,7); double ang, pt; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,90); @@ -351,17 +356,17 @@ Class CandyMagArm : Actor { A_CountDown(); Spawn("CandyMagTrail",pos); - SWWMHandler.DoBlast(self,50+3*reactiontime,3000+500*reactiontime); + SWWMHandler.DoBlast(self,50+6*reactiontime,3000+800*reactiontime); double spd = vel.length(); - vel = (vel*.1+(FRandom[ExploS](-.1,.1),FRandom[ExploS](-.1,.1),FRandom[ExploS](-.1,.1))).unit()*spd; - A_Explode(20+reactiontime/2,50+3*reactiontime); + vel = (vel*.1+(FRandom[ExploS](-.7,.7),FRandom[ExploS](-.7,.7),FRandom[ExploS](-.7,.7))).unit()*spd; + A_Explode(20+reactiontime*3,50+6*reactiontime); Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); let s = Spawn("SWWMSmoke",pos); s.vel = pvel+vel*.2; s.SetShade(Color(1,1,1)*Random[ExploS](64,224)); s.special1 = Random[ExploS](2,7); s.scale *= 2.4; - s.alpha *= 0.1+.4*(ReactionTime/12.); + s.alpha *= 0.1+.4*(ReactionTime/8.); int numpt = Random[ExploS](ReactionTime-12,3); for ( int i=0; i10)?"CandyBeam":"TinyCandyBeam",pos); s.target = target; s.angle = ang; s.pitch = pt; + s.special2 = 1; s.ReactionTime += Random[ExploS](-12,32)+(25-frame)/2; } } @@ -611,8 +619,8 @@ Class CandyMagProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 3.+.2*special1; A_AlertMonsters(); - SWWMHandler.DoBlast(self,200+20*special1,80000+8000*special1); - A_Explode(300+200*special1,200+20*special1); + SWWMHandler.DoBlast(self,250+25*special1,80000+8000*special1); + A_Explode(300+200*special1,250+25*special1); A_QuakeEx(9,9,9,30,0,500+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollintensity:2.); A_StartSound("candygun/maghit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/maghit",CHAN_WEAPON,attenuation:.12); @@ -645,7 +653,7 @@ Class CandyMagProj : Actor let s = Spawn("SWWMChip",pos); s.vel = pvel; } - numpt = int(Random[ExploS](2,4)*(1.+.4*special1)); + numpt = int(Random[ExploS](3,6)*(1.+.4*special1)); for ( int i=0; i15)?"CandyBeam":"TinyCandyBeam",pos); s.target = target; s.angle = ang; s.pitch = pt; - s.ReactionTime += Random[ExploS](-12,12)+(25-frame)/2; + s.special2 = 2; + s.ReactionTime += Random[ExploS](-12,4)+(25-frame)/3; } } Stop; @@ -776,11 +785,11 @@ Class CandyGun : SWWMWeapon Property ClipCount : ClipCount; - override void AttachToOwner( Actor other ) + override Inventory CreateCopy( Actor other ) { - Super.AttachToOwner(other); // additional lore SWWMLoreLibrary.Add(other.player,"Munch"); + return Super.CreateCopy(other); } override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) @@ -946,22 +955,15 @@ Class CandyGun : SWWMWeapon override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) { if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true; - if ( fireMode == PrimaryFire ) return (chambered || (Ammo1.Amount > 0)); + if ( fireMode == PrimaryFire ) return (chambered || (clipcount > 0) || (Ammo1.Amount > 0)); if ( fireMode == AltFire ) return (Ammo1.Amount > 0); return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } - override bool HandlePickup( Inventory item ) + override bool ReportHUDAmmo() { - if ( item.GetClass() == GetClass()) - { - if ( Ammo2.Amount < Ammo2.MaxAmount ) - Weapon(item).AmmoGive2 = 1; - if ( Weapon(item).PickupForAmmo(self) ) - item.bPickupGood = true; - return true; - } - return false; + if ( chambered || (clipcount > 0) ) return true; + return Super.ReportHUDAmmo(); } Default @@ -971,12 +973,14 @@ Class CandyGun : SWWMWeapon Obituary "$O_CANDYGUN"; Weapon.UpSound "explodium/select"; Weapon.SlotNumber 9; + Weapon.SelectionOrder 1200; Stamina 70000; Weapon.AmmoType1 "CandyGunAmmo"; Weapon.AmmoType2 "CandyGunSpares"; Weapon.AmmoGive1 1; - Weapon.AmmoGive2 0; + Weapon.AmmoGive2 1; CandyGun.ClipCount 7; + +SWWMWEAPON.NOFIRSTGIVE; } States { @@ -1053,8 +1057,8 @@ Class CandyGun : SWWMWeapon Reload: XZW2 A 1 { - if ( invoker.clipcount <= 0 ) return ResolveState("ReloadEmpty"); - else if ( (invoker.Ammo1.Amount <= 0) || invoker.clipcount >= invoker.default.clipcount ) return ResolveState("CheckBullet"); + if ( (invoker.Ammo1.Amount <= 0) || (invoker.clipcount >= invoker.default.clipcount) ) return ResolveState("CheckBullet"); + else if ( invoker.clipcount <= 0 ) return ResolveState("ReloadEmpty"); return ResolveState(null); } XZW2 TUVWXYZ 1; diff --git a/zscript/swwm_thiccboolet.zsc b/zscript/swwm_thiccboolet.zsc index 3ca5e6e6e..fa5c1c86a 100644 --- a/zscript/swwm_thiccboolet.zsc +++ b/zscript/swwm_thiccboolet.zsc @@ -3,8 +3,28 @@ Class SilverBullet : SWWMWeapon { + bool chambered; + int clipcount; + + Property ClipCount : clipcount; + Default { + Tag "$T_SILVERBULLET"; + Inventory.PickupMessage "$T_SILVERBULLET"; + Obituary "$O_SILVERBULLET"; + Weapon.SlotNumber 8; + Weapon.SelectionOrder 1400; Stamina 120000; + Weapon.AmmoType1 "SilverBulletAmmo"; + Weapon.AmmoGive1 1; + SilverBullet.ClipCount 5; + +SWWMWEAPON.NOFIRSTGIVE; + } + States + { + Spawn: + XZW1 A -1; + Stop; } }