diff --git a/FuturePlans.md b/FuturePlans.md index 6e2b32a67..8d46be0bc 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -74,6 +74,8 @@ All the hard stuff *(some of these aren't guaranteed)*. * **Photo Mode** - Dedicated poses - Stickers +* **Virtual Training Map** + - Featuring Maidbot as assistant ## Unspecified diff --git a/gldefs.shinemaps b/gldefs.shinemaps index 7e6c3fbab..e483cde52 100644 --- a/gldefs.shinemaps +++ b/gldefs.shinemaps @@ -63,3 +63,19 @@ HardwareShader Texture "models/matcap/glassmap.png" { Shader "shaders/glsl/Shinemap.fp" } +HardwareShader Texture "models/matcap/kinymap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/matcap/nkrknmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/matcap/nokromap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} +HardwareShader Texture "models/matcap/pearlmap.png" +{ + Shader "shaders/glsl/Shinemap.fp" +} diff --git a/language.def_base b/language.def_base index 9ae599a1e..f9fefd2b9 100644 --- a/language.def_base +++ b/language.def_base @@ -59,47 +59,76 @@ T_GOLDSHELL = "Golden Shell"; T_GOLDSHELLS = "Golden Shells"; T_EVISHELL = "Eviscerator Shell"; T_EVISHELLS = "Eviscerator Shells"; +I_EVISHELLCLIP2 = "Eviscerator Duo Clip"; +I_EVISHELLCLIP3 = "Eviscerator Trio Clip"; I_EVISHELLPAK = "Eviscerator 6-Pack"; -T_HELLMISSILES = "Hellblazer Missiles"; -T_HELLCLUSTERS = "Hellblazer Crackshots"; -T_HELLBURNINATORS = "Hellblazer Ravagers"; -T_HELLNUKES = "Hellblazer Warheads"; T_HELLMISSILE = "Hellblazer Missile"; -T_HELLCLUSTER = "Hellblazer Crackshot"; -T_HELLBURNINATOR = "Hellblazer Ravager"; -T_HELLNUKE = "Hellblazer Warhead"; +T_HELLMISSILES = "Hellblazer Missiles"; +T_HELLMISSILE2 = "2 Hellblazer Missiles"; +T_HELLMISSILE3 = "3 Hellblazer Missiles"; T_HELLMISSILEMAG = "Hellblazer Missile Mag"; +T_HELLCLUSTER = "Hellblazer Crackshot"; +T_HELLCLUSTERS = "Hellblazer Crackshots"; +T_HELLCLUSTER2 = "2 Hellblazer Crackshots"; T_HELLCLUSTERMAG = "Hellblazer Crackshot Mag"; +T_HELLBURNINATOR = "Hellblazer Ravager"; +T_HELLBURNINATORS = "Hellblazer Ravagers"; T_HELLBURNINATORMAG = "Hellblazer Ravager Mag"; +T_HELLNUKE = "Hellblazer Warhead"; +T_HELLNUKES = "Hellblazer Warheads"; T_HELLNUKEMAG = "Hellblazer Warhead Mag"; T_SPARKUNIT = "Biospark Unit"; +T_SPARKUNITS = "Biospark Units"; T_XSBMAG = "1.150 XSB Magazine"; +T_XSBMAGS = "1.150 XSB Magazines"; T_FCBMAG = "1.150 FCB Magazine"; +T_FCBMAGS = "1.150 FCB Magazines"; T_XSBBULLET = "1.150 XSB Bullet"; +T_XSBBULLETS = "1.150 XSB Bullets"; T_FCBBULLET = "1.150 FCB Bullet"; +T_FCBBULLETS = "1.150 FCB Bullets"; T_CANDYMAG = "Candy Gun Magazine"; +T_CANDYMAGS = "Candy Gun Magazines"; T_CANDYBULLET = "Candy Gun Bullet"; +T_CANDYBULLETS = "Candy Gun Bullet"; T_CANDYSPARE = "Candy Gun Spare"; +T_CANDYSPARES = "Candy Gun Spares"; T_YNYKRONAMMO = "Crystal Box"; +T_YNYKRONAMMOS = "Crystal Boxes"; T_SMW05BULLET = "SMW.05 Bullet"; T_SMW05BULLETS = "SMW.05 Bullets"; T_SHEENBULLET = "14.5x114mm MT Bullet"; T_SHEENBULLETS = "14.5x114mm MT Bullets"; T_QUADAMMO = "Quadravol Cell"; +T_QUADAMMOS = "Quadravol Cells"; T_DARKAMMO = "Blackfire Canister"; +T_DARKAMMOS = "Blackfire Canisters"; T_EMPCORE = "Dysedum Rod"; +T_EMPCORES = "Dysedum Rods"; T_RAYBOLT = "Ray-Khom Bolt"; +T_RAYBOLTS = "Ray-Khom Bolts"; T_RAYAMMO = "Ray-Khom Magazine"; +T_RAYAMMOS = "Ray-Khom Magazines"; T_RAYBATTERY = "Ray-Khom Battery"; +T_RAYBATTERYS = "Ray-Khom Batteries"; T_GRANDSPEAR = "Grand Lance Spear"; +T_GRANDSPEARS = "Grand Lance Spears"; T_GRANDAMMO = "Grand Lance Magazine"; -T_SPARKBAMMO = "Kinylum Cell"; -T_SPARKRAMMO = "Nokron Cell"; +T_GRANDAMMOS = "Grand Lance Magazines"; +T_SPARKBCELL = "Kinylum Cell"; +T_SPARKBCELLS = "Kinylum Cells"; +T_SPARKRCELL = "Nokron Cell"; +T_SPARKRCELLS = "Nokron Cells"; T_MRROUND = "Mortal Round"; +T_MRROUNDS = "Mortal Rounds"; T_MRAMMO = "Mortal Magazine"; +T_MRAMMOS = "Mortal Magazines"; T_MRGRENADE = "Mortal Grenade"; +T_MRGRENADES = "Mortal Grenades"; T_ULTIMATEPOD = "Rafan-Kos Pod"; +T_ULTIMATEPODS = "Rafan-Kos Pods"; T_ULTIMATEAMMO = "Rafan-Kos Magazine"; +T_ULTIMATEAMMOS = "Rafan-Kos Magazines"; T_BLASTSUIT = "Blast Suit"; T_EMBIGGENER = "Hammerspace Embiggener"; T_BULKEMBIGGENER = "Bulk Hammerspace Embiggener"; diff --git a/language.es_base b/language.es_base index e32fa1ad6..6159df08f 100644 --- a/language.es_base +++ b/language.es_base @@ -49,47 +49,73 @@ T_GOLDSHELL = "Cartucho Dorado"; T_GOLDSHELLS = "Cartuchos Dorados"; T_EVISHELL = "Proyectil de Eviscerator"; T_EVISHELLS = "Proyectiles de Eviscerator"; +I_EVISHELLCLIP2 = "Clip en Duo para Eviscerator"; +I_EVISHELLCLIP3 = "Clip en Trio para Eviscerator"; I_EVISHELLPAK = "Pack de Seis para Eviscerator"; -T_HELLMISSILES = "Misiles Hellblazer"; -T_HELLCLUSTERS = "Estalladores Hellblazer"; -T_HELLBURNINATORS = "Ruinadores Hellblazer"; -T_HELLNUKES = "Cabezas Nucleares Hellblazer"; T_HELLMISSILE = "Misil Hellblazer"; -T_HELLCLUSTER = "Estallador Hellblazer"; -T_HELLBURNINATOR = "Ruinador Hellblazer"; -T_HELLNUKE = "Cabeza Nuclear Hellblazer"; +T_HELLMISSILES = "Misiles Hellblazer"; T_HELLMISSILEMAG = "Cargador de Misiles Hellblazer"; +T_HELLCLUSTER = "Estallador Hellblazer"; +T_HELLCLUSTERS = "Estalladores Hellblazer"; T_HELLCLUSTERMAG = "Cargador de Estalladores Hellblazer"; +T_HELLBURNINATOR = "Ruinador Hellblazer"; +T_HELLBURNINATORS = "Ruinadores Hellblazer"; T_HELLBURNINATORMAG = "Cargador de Ruinadores Hellblazer"; +T_HELLNUKE = "Cabeza Nuclear Hellblazer"; +T_HELLNUKES = "Cabezas Nucleares Hellblazer"; T_HELLNUKEMAG = "Cargador de Cabezas Nucleares Hellblazer"; T_SPARKUNIT = "Unidad Biospark"; +T_SPARKUNITS = "Unidades Biospark"; T_XSBMAG = "Cargador 1.150 XSB"; +T_XSBMAGS = "Cargadores 1.150 XSB"; T_FCBMAG = "Cargador 1.150 FCB"; +T_FCBMAGS = "Cargadores 1.150 FCB"; T_XSBBULLET = "Bala 1.150 XSB"; +T_XSBBULLETS = "Balas 1.150 XSB"; T_FCBBULLET = "Bala 1.150 FCB"; +T_FCBBULLETS = "Balas 1.150 FCB"; T_CANDYMAG = "Cargador de Pistola Caramelo"; +T_CANDYMAGS = "Cargadores de Pistola Caramelo"; T_CANDYBULLET = "Bala de Pistola Caramelo"; +T_CANDYBULLETS = "Balas de Pistola Caramelo"; T_CANDYSPARE = "Repuesto de Pistola Caramelo"; +T_CANDYSPARES = "Repuestos de Pistola Caramelo"; T_YNYKRONAMMO = "Contenedor de Cristal"; +T_YNYKRONAMMOS = "Contenedores de Cristal"; T_SMW05BULLET = "Bala SMW.05"; T_SMW05BULLETS = "Balas SMW.05"; T_SHEENBULLET = "Bala 14.5x114mm MT"; T_SHEENBULLETS = "Balas 14.5x114mm MT"; T_QUADAMMO = "Célula de Quadravol"; +T_QUADAMMOS = "Células de Quadravol"; T_DARKAMMO = "Frasco de Fuego Negro"; +T_DARKAMMOS = "Frascos de Fuego Negro"; T_EMPCORE = "Barra de Dysedum"; +T_EMPCORES = "Barras de Dysedum"; T_RAYBOLT = "Proyectil de Ray-Khom"; +T_RAYBOLTS = "Proyectiles de Ray-Khom"; T_RAYAMMO = "Cargador de Ray-Khom"; +T_RAYAMMOS = "Cargadores de Ray-Khom"; T_RAYBATTERY = "Batería de Ray-Khom"; +T_RAYBATTERYS = "Baterías de Ray-Khom"; T_GRANDSPEAR = "Arpón de Gran Lanza"; +T_GRANDSPEARS = "Arpones de Gran Lanza"; T_GRANDAMMO = "Cargador de Gran Lanza"; +T_GRANDAMMOS = "Cargadores de Gran Lanza"; T_SPARKBAMMO = "Célula de Kinylum"; +T_SPARKBAMMOS = "Células de Kinylum"; T_SPARKRAMMO = "Célula de Nokron"; +T_SPARKRAMMOS = "Células de Nokron"; T_MRROUND = "Bala Mortal"; +T_MRROUNDS = "Balas Mortales"; T_MRAMMO = "Cargador Mortal"; +T_MRAMMOS = "Cargadores Mortales"; T_MRGRENADE = "Granada Mortal"; +T_MRGRENADES = "Granadas Mortales"; T_ULTIMATEPOD = "Cápsula de Rafan-Kos"; +T_ULTIMATEPODS = "Cápsulas de Rafan-Kos"; T_ULTIMATEAMMO = "Cargador de Rafan-Kos"; +T_ULTIMATEAMMOS = "Cargadores de Rafan-Kos"; T_BLASTSUIT = "Chaleco Antiexplosivos"; T_EMBIGGENER = "Ensanchecedor de Hammerspace"; T_BULKEMBIGGENER = "Ensanchecedor de Hammerspace a Granel"; diff --git a/language.version b/language.version index 085466359..b663cbbea 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r15 \cu(Sat 11 Sep 21:15:52 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.1pre r15 \cu(2021-09-11 21:15:52)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r16 \cu(Sun 12 Sep 19:09:00 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.1pre r16 \cu(2021-09-12 19:09:00)\c-"; diff --git a/modeldef.ammo b/modeldef.ammo index 81fea655e..c02f73d18 100644 --- a/modeldef.ammo +++ b/modeldef.ammo @@ -275,6 +275,32 @@ Model "EvisceratorShell" FrameIndex XZW1 A 0 0 } +Model "EvisceratorShell2" +{ + Path "models" + + Model 0 "EvisceratorClip_Two_d.3d" + SurfaceSkin 0 0 "EvisceratorShell.png" + SurfaceSkin 0 1 "EvisceratorClip.png" + Scale 0.18 0.18 0.18 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "EvisceratorShell3" +{ + Path "models" + + Model 0 "EvisceratorClip_Three_d.3d" + SurfaceSkin 0 0 "EvisceratorShell.png" + SurfaceSkin 0 1 "EvisceratorClip.png" + Scale 0.18 0.18 0.18 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "EvisceratorSixPack" { Path "models" @@ -302,6 +328,30 @@ Model "HellblazerMissiles" FrameIndex XZW1 A 0 0 } +Model "HellblazerMissiles2" +{ + Path "models" + + Model 0 "HellblazerDuo_d.3d" + Skin 0 "HellblazerMissile.png" + Scale 0.16 0.16 0.16 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "HellblazerMissiles3" +{ + Path "models" + + Model 0 "HellblazerTrio_d.3d" + Skin 0 "HellblazerMissile.png" + Scale 0.16 0.16 0.16 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "HellblazerMissileMag" { Path "models" @@ -330,6 +380,18 @@ Model "HellblazerCrackshots" FrameIndex XZW1 A 0 0 } +Model "HellblazerCrackshots2" +{ + Path "models" + + Model 0 "HellblazerDuo_d.3d" + Skin 0 "HellblazerMissile_Cluster.png" + Scale 0.16 0.16 0.16 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "HellblazerCrackshotMag" { Path "models" @@ -414,6 +476,18 @@ Model "SparkUnit" FrameIndex XZW1 A 0 0 } +Model "SparkUnit2" +{ + Path "models" + + Model 0 "SparksterAmmo2_d.3d" + Skin 0 "SparksterAmmo.png" + Scale 0.16 0.16 0.16 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "SilverBulletAmmo" { @@ -454,6 +528,30 @@ Model "SilverBullets" FrameIndex XZW1 A 0 0 } +Model "SilverBullets_2" +{ + Path "models" + + Model 0 "SilverbulletBullet2_d.3d" + Skin 0 "SilverbulletBullet.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SilverBullets_3" +{ + Path "models" + + Model 0 "SilverbulletBullet3_d.3d" + Skin 0 "SilverbulletBullet.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "SilverBullets2" { Path "models" @@ -467,6 +565,30 @@ Model "SilverBullets2" FrameIndex XZW1 A 0 0 } +Model "SilverBullets2_2" +{ + Path "models" + + Model 0 "SilverbulletBullet2_FCB_d.3d" + Skin 0 "SilverbulletBullet_FCB.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SilverBullets2_3" +{ + Path "models" + + Model 0 "SilverbulletBullet3_FCB_d.3d" + Skin 0 "SilverbulletBullet_FCB.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "CandyGunAmmo" { @@ -495,6 +617,32 @@ Model "CandyGunBullets" FrameIndex XZW1 A 0 0 } +Model "CandyGunBullets2" +{ + Path "models" + + Model 0 "ExplodiumBullet2_d.3d" + SurfaceSkin 0 0 "CandyBullet.png" + SurfaceSkin 0 1 "CandyCasing.png" + Scale 0.02 0.02 0.02 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "CandyGunBullets3" +{ + Path "models" + + Model 0 "ExplodiumBullet3_d.3d" + SurfaceSkin 0 0 "CandyBullet.png" + SurfaceSkin 0 1 "CandyCasing.png" + Scale 0.02 0.02 0.02 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "YnykronAmmo" { diff --git a/modeldef.dlcammo b/modeldef.dlcammo index 6b49bb050..9d7c82637 100644 --- a/modeldef.dlcammo +++ b/modeldef.dlcammo @@ -11,6 +11,32 @@ Model "SMW05Ammo" FrameIndex XZW1 A 0 0 } +Model "SMW05Ammo2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SMW05Ammo3" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "SMW05SmallAmmo" { Path "models/extra" @@ -51,6 +77,32 @@ Model "SheenAmmo" FrameIndex XZW1 A 0 0 } +Model "SheenAmmo2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.015 0.015 0.015 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SheenAmmo3" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.015 0.015 0.015 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "SheenTinyAmmo" { Path "models/extra" @@ -104,6 +156,19 @@ Model "QuadravolAmmo" FrameIndex XZW1 A 0 0 } +Model "QuadravolAmmo2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "DarkCanister" { @@ -132,6 +197,19 @@ Model "EMPCore" FrameIndex XZW1 A 0 0 } +Model "EMPCore2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "RayBolt" { @@ -146,6 +224,32 @@ Model "RayBolt" FrameIndex XZW1 A 0 0 } +Model "RayBolt2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "RayBolt5" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "RayAmmo" { Path "models/extra" diff --git a/modeldef.dlcammo2 b/modeldef.dlcammo2 index 70047162e..ba7193c0b 100644 --- a/modeldef.dlcammo2 +++ b/modeldef.dlcammo2 @@ -11,6 +11,32 @@ Model "SparksterBAmmo" FrameIndex XZW1 A 0 0 } +Model "SparksterBAmmo2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SparksterBAmmo3" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "SparksterRAmmo" { Path "models/extra" @@ -24,6 +50,32 @@ Model "SparksterRAmmo" FrameIndex XZW1 A 0 0 } +Model "SparksterRAmmo2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SparksterRAmmo3" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.025 0.025 0.025 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "MisterRound" { @@ -38,6 +90,58 @@ Model "MisterRound" FrameIndex XZW1 A 0 0 } +Model "MisterRound2" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "MisterRound3" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "MisterRound5" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "MisterRound10" +{ + Path "models/extra" + + Model 0 "BaseCube_d.3d" + Skin 0 "CHIPTILE" + Scale 0.02 0.02 0.02 + ZOffset 16 + PitchOffset 30 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "MisterAmmo" { Path "models/extra" diff --git a/modeldef.misc b/modeldef.misc index f3a14d217..264d9fe1f 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -281,18 +281,26 @@ Model "ShinemapDebugSphere" FrameIndex XZW1 H 0 0 Skin 0 "matcap/invincimap.png" FrameIndex XZW1 I 0 0 - Skin 0 "matcap/leadmap.png" + Skin 0 "matcap/kinymap.png" FrameIndex XZW1 J 0 0 - Skin 0 "matcap/pinkmap.png" + Skin 0 "matcap/leadmap.png" FrameIndex XZW1 K 0 0 - Skin 0 "matcap/puromap.png" + Skin 0 "matcap/nkrknmap.png" FrameIndex XZW1 L 0 0 - Skin 0 "matcap/purpmap.png" + Skin 0 "matcap/nokromap.png" FrameIndex XZW1 M 0 0 - Skin 0 "matcap/ragemap.png" + Skin 0 "matcap/pearlmap.png" FrameIndex XZW1 N 0 0 - Skin 0 "matcap/redmap.png" + Skin 0 "matcap/pinkmap.png" FrameIndex XZW1 O 0 0 - Skin 0 "matcap/silvermap.png" + Skin 0 "matcap/puromap.png" FrameIndex XZW1 P 0 0 + Skin 0 "matcap/purpmap.png" + FrameIndex XZW1 Q 0 0 + Skin 0 "matcap/ragemap.png" + FrameIndex XZW1 R 0 0 + Skin 0 "matcap/redmap.png" + FrameIndex XZW1 S 0 0 + Skin 0 "matcap/silvermap.png" + FrameIndex XZW1 T 0 0 } diff --git a/models/EvisceratorClip.png b/models/EvisceratorClip.png new file mode 100644 index 000000000..f2f644573 Binary files /dev/null and b/models/EvisceratorClip.png differ diff --git a/models/EvisceratorClip_Three_a.3d b/models/EvisceratorClip_Three_a.3d new file mode 100644 index 000000000..f15c5bae5 Binary files /dev/null and b/models/EvisceratorClip_Three_a.3d differ diff --git a/models/EvisceratorClip_Three_d.3d b/models/EvisceratorClip_Three_d.3d new file mode 100644 index 000000000..d48269ff2 Binary files /dev/null and b/models/EvisceratorClip_Three_d.3d differ diff --git a/models/EvisceratorClip_Two_a.3d b/models/EvisceratorClip_Two_a.3d new file mode 100644 index 000000000..65bb10335 Binary files /dev/null and b/models/EvisceratorClip_Two_a.3d differ diff --git a/models/EvisceratorClip_Two_d.3d b/models/EvisceratorClip_Two_d.3d new file mode 100644 index 000000000..0e7954d2a Binary files /dev/null and b/models/EvisceratorClip_Two_d.3d differ diff --git a/models/ExplodiumBullet2_a.3d b/models/ExplodiumBullet2_a.3d new file mode 100644 index 000000000..d8fdfe291 Binary files /dev/null and b/models/ExplodiumBullet2_a.3d differ diff --git a/models/ExplodiumBullet2_d.3d b/models/ExplodiumBullet2_d.3d new file mode 100644 index 000000000..58f017256 Binary files /dev/null and b/models/ExplodiumBullet2_d.3d differ diff --git a/models/ExplodiumBullet3_a.3d b/models/ExplodiumBullet3_a.3d new file mode 100644 index 000000000..cb4b7611d Binary files /dev/null and b/models/ExplodiumBullet3_a.3d differ diff --git a/models/ExplodiumBullet3_d.3d b/models/ExplodiumBullet3_d.3d new file mode 100644 index 000000000..b77c57757 Binary files /dev/null and b/models/ExplodiumBullet3_d.3d differ diff --git a/models/HellblazerDuo_a.3d b/models/HellblazerDuo_a.3d new file mode 100644 index 000000000..8c256c83a Binary files /dev/null and b/models/HellblazerDuo_a.3d differ diff --git a/models/HellblazerDuo_d.3d b/models/HellblazerDuo_d.3d new file mode 100644 index 000000000..9c99d3d18 Binary files /dev/null and b/models/HellblazerDuo_d.3d differ diff --git a/models/HellblazerTrio_a.3d b/models/HellblazerTrio_a.3d new file mode 100644 index 000000000..1b69d81c3 Binary files /dev/null and b/models/HellblazerTrio_a.3d differ diff --git a/models/HellblazerTrio_d.3d b/models/HellblazerTrio_d.3d new file mode 100644 index 000000000..aee734a3f Binary files /dev/null and b/models/HellblazerTrio_d.3d differ diff --git a/models/SilverbulletBullet2_FCB_a.3d b/models/SilverbulletBullet2_FCB_a.3d new file mode 100644 index 000000000..90e3e3c40 Binary files /dev/null and b/models/SilverbulletBullet2_FCB_a.3d differ diff --git a/models/SilverbulletBullet2_FCB_d.3d b/models/SilverbulletBullet2_FCB_d.3d new file mode 100644 index 000000000..55e2b762b Binary files /dev/null and b/models/SilverbulletBullet2_FCB_d.3d differ diff --git a/models/SilverbulletBullet2_a.3d b/models/SilverbulletBullet2_a.3d new file mode 100644 index 000000000..43f264e99 Binary files /dev/null and b/models/SilverbulletBullet2_a.3d differ diff --git a/models/SilverbulletBullet2_d.3d b/models/SilverbulletBullet2_d.3d new file mode 100644 index 000000000..55e2b762b Binary files /dev/null and b/models/SilverbulletBullet2_d.3d differ diff --git a/models/SilverbulletBullet3_FCB_a.3d b/models/SilverbulletBullet3_FCB_a.3d new file mode 100644 index 000000000..00a0d2943 Binary files /dev/null and b/models/SilverbulletBullet3_FCB_a.3d differ diff --git a/models/SilverbulletBullet3_FCB_d.3d b/models/SilverbulletBullet3_FCB_d.3d new file mode 100644 index 000000000..b238a06ae Binary files /dev/null and b/models/SilverbulletBullet3_FCB_d.3d differ diff --git a/models/SilverbulletBullet3_a.3d b/models/SilverbulletBullet3_a.3d new file mode 100644 index 000000000..dd4665ba3 Binary files /dev/null and b/models/SilverbulletBullet3_a.3d differ diff --git a/models/SilverbulletBullet3_d.3d b/models/SilverbulletBullet3_d.3d new file mode 100644 index 000000000..b238a06ae Binary files /dev/null and b/models/SilverbulletBullet3_d.3d differ diff --git a/models/SparksterAmmo2_a.3d b/models/SparksterAmmo2_a.3d new file mode 100644 index 000000000..a44789032 Binary files /dev/null and b/models/SparksterAmmo2_a.3d differ diff --git a/models/SparksterAmmo2_d.3d b/models/SparksterAmmo2_d.3d new file mode 100644 index 000000000..d1d50093e Binary files /dev/null and b/models/SparksterAmmo2_d.3d differ diff --git a/models/modelnotes.txt b/models/modelnotes.txt index 06299a855..a0a4abd2a 100644 --- a/models/modelnotes.txt +++ b/models/modelnotes.txt @@ -1,37 +1,3 @@ -Collectible models: - x Cube - x Akari Project - x Love Signals CD - x Nutatco Bar - x Frispy Corn - x Demo Plush - x Saya Bean - x Peach Juice - x Milk Breads - x Kirin Manga - x Kirin Plush - -Collectible gestures: - x Cube - x Akari Project - x Love Signals CD - x Nutatco Bar - x Frispy Corn - x Saya Bean - x Demo Plush - x Peach Juice - x Milk Breads - x Kirin Manga - x Kirin Plush - -Key gestures: - x Keycard - x Skull key - x Heretic Yellow Key - x Heretic Green Key - x Heretic Blue Key - x Heretic Red Key - # Post-release stuff Extra items: @@ -39,9 +5,6 @@ Extra items: x Devastation Sigil x Divine Sprite -Character models: - - White Lady - Extra collectibles: - Moth Plushy - AA-12 @@ -74,6 +37,7 @@ Ammo models: - Gamma mag - Sheen Ammo - Single + - 10 Belt - 50 Box - 100 Box - Quadravol Ammo @@ -100,9 +64,13 @@ Ammo models: - Mortal Rifle Ammo - Round - Mag - - 1 Grenade - - 2 Grenades - - 3 Grenades + - Grenade - Rafan-Kos Ammo - Pod - Mag + +# Final Update + +Character models: + - Maidbot + - White Lady diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 78003ab84..31dc9fc32 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -1,13 +1,7 @@ // All DLC weapon ammo pickups -Class SMW05Ammo : Ammo +Class SMW05Ammo : SWWMAmmo { - Mixin SWWMShellAmmo; - Mixin SWWMAmmo; - Mixin SWWMOverlapPickupSound; - Mixin SWWMUseToPickup; - Mixin SWWMRespawn; - Default { //$Title 1x SMW.05 Bullets @@ -15,6 +9,7 @@ Class SMW05Ammo : Ammo //$Sprite graphics/HUD/Icons/A_SMW05Ammo.png //$Icon ammo Tag "$T_SMW05BULLET"; + SWWMAmmo.PickupTag "SMW05BULLET"; Stamina 300; Inventory.Icon "graphics/HUD/Icons/A_SMW05Ammo.png"; Inventory.Amount 1; @@ -26,6 +21,11 @@ Class SMW05Ammo : Ammo FloatBobStrength 0.25; Accuracy 20; } + override void ModifyDropAmount( int dropamount ) + { + Super.ModifyDropAmount(dropamount); + Amount = Random[ShellDrop](1,clamp(dropamount,1,3)); + } States { Spawn: @@ -33,21 +33,28 @@ Class SMW05Ammo : Ammo Stop; } } - -Class SMW05BundleSpawn : SWWMAmmoSpawner +Class SMW05Ammo2 : SMW05Ammo { - override void SpawnAmmo() + Default { - int bnd = Random[Bundle](2,3); - for ( int i=0; i 1 ) - { - tagstr = tagstr.."S"; - return String.Format("%d %s",Amount,StringTable.Localize(tagstr)); - } - return StringTable.Localize(tagstr); - } - Default { //$Title 1x Sheen Bullets //$Group Ammo //$Sprite graphics/HUD/Icons/A_SheenAmmo.png //$Icon ammo - Tag "$T_SHEENBULLETS"; + Tag "$T_SHEENBULLET"; + SWWMAmmo.PickupTag "SHEENBULLET"; Stamina 400; Inventory.Icon "graphics/HUD/Icons/A_SheenAmmo.png"; Inventory.Amount 1; @@ -109,6 +99,11 @@ Class SheenAmmo : Ammo FloatBobStrength 0.25; Accuracy 35; } + override void ModifyDropAmount( int dropamount ) + { + Super.ModifyDropAmount(dropamount); + Amount = Random[ShellDrop](1,clamp(dropamount,1,3)); + } States { Spawn: @@ -116,7 +111,28 @@ Class SheenAmmo : Ammo Stop; } } - +Class SheenAmmo2 : SheenAmmo +{ + Default + { + //$Title 2x Sheen Bullets + //$Group Ammo + //$Sprite graphics/HUD/Icons/A_SheenAmmo.png + //$Icon ammo + Inventory.Amount 2; + } +} +Class SheenAmmo3 : SheenAmmo +{ + Default + { + //$Title 3x Sheen Bullets + //$Group Ammo + //$Sprite graphics/HUD/Icons/A_SheenAmmo.png + //$Icon ammo + Inventory.Amount 3; + } +} Class SheenTinyAmmo : SheenAmmo { Default @@ -128,7 +144,6 @@ Class SheenTinyAmmo : SheenAmmo Inventory.Amount 10; } } - Class SheenSmallAmmo : SheenAmmo { Default @@ -140,7 +155,6 @@ Class SheenSmallAmmo : SheenAmmo Inventory.Amount 50; } } - Class SheenBigAmmo : SheenAmmo { Default @@ -153,13 +167,8 @@ Class SheenBigAmmo : SheenAmmo } } -Class QuadravolAmmo : Ammo +Class QuadravolAmmo : SWWMAmmo { - Mixin SWWMAmmo; - Mixin SWWMOverlapPickupSound; - Mixin SWWMUseToPickup; - Mixin SWWMRespawn; - Default { //$Title Quadravol Ammo @@ -167,7 +176,7 @@ Class QuadravolAmmo : Ammo //$Sprite graphics/HUD/Icons/A_QuadAmmo.png //$Icon ammo Tag "$T_QUADAMMO"; - Inventory.PickupMessage "$T_QUADAMMO"; + SWWMAmmo.PickupTag "QUADAMMO"; Stamina 10000; Inventory.Icon "graphics/HUD/Icons/A_QuadAmmo.png"; Inventory.Amount 1; @@ -179,11 +188,6 @@ Class QuadravolAmmo : Ammo FloatBobStrength 0.25; Accuracy 45; } - override void ModifyDropAmount( int dropamount ) - { - Super.ModifyDropAmount(dropamount); - Amount = min(Amount,1); - } States { Spawn: @@ -191,28 +195,20 @@ Class QuadravolAmmo : Ammo Stop; } } - -Class QuadravolAmmoBundleSpawn : SWWMAmmoSpawner +Class QuadravolAmmo2 : QuadravolAmmo { - override void SpawnAmmo() + Default { - int bnd = Random[Bundle](2,3); - for ( int i=0; i)(AllActorClasses[i]); // skip over candy gun spares, they're "special ammo" if ( a == 'CandyGunSpares' ) continue; - // only direct descendants of ammo with a set price below our max unit price - if ( !a || (a.GetParentClass() != 'Ammo') ) continue; + // only direct descendants of swwmammo with a set price below our max unit price + if ( !a || (a.GetParentClass() != 'SWWMAmmo') ) continue; let def = GetDefaultByType(a); if ( (def.Stamina <= 0) || (def.Stamina > maxunitprice) ) continue; // only ammo for weapons that are valid (can be used) @@ -350,7 +350,7 @@ Class HammerspaceEmbiggener : Inventory for ( int i=0; i)(AllActorClasses[i]); - if ( !type || (type.GetParentClass() != 'Ammo') ) continue; + if ( !type || (type.GetParentClass() != 'SWWMAmmo') ) continue; // check that it's for a valid weapon bool isvalid = false; for ( int j=0; j PickAmmo( bool notondemand = false ) { /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) ) - return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BundleSpawn';*/ + return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05Ammo3';*/ switch( Random[Replacements](0,8) ) { case 0: @@ -88,7 +88,7 @@ Class SWWMClipAmmoBig : SWWMAmmoSpawner { /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) ) return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo';*/ - return Random[Replacements](0,5)?'EvisceratorShell':'EvisceratorBundleSpawn'; + return Random[Replacements](0,5)?'EvisceratorShell':Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3'; } } Class SWWMBlastAmmoSmall : SWWMAmmoSpawner @@ -110,7 +110,7 @@ Class SWWMBlastAmmoBig : SWWMAmmoSpawner { /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) ) return Random[Replacements](0,2)?'SheenBigAmmo':'SheenSmallAmmo';*/ - return Random[Replacements](0,2)?'EvisceratorShell':'EvisceratorBundleSpawn'; + return Random[Replacements](0,2)?'EvisceratorShell':Random[Replacements](0,1)?'EvisceratorShell2':'EvisceratorShell3'; } } Class SWWMRocketAmmoSmall : SWWMAmmoSpawner @@ -131,9 +131,12 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner static Class PickAmmo( bool notondemand = false ) { /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) ) - return Random[Replacements](0,2)?'SparksterAmmoBundleSpawn':'SparksterBigAmmoBundleSpawn';*/ + { + if ( Random[Replacements](0,1) ) return Random[Replacements](0,2)?'SparksterBAmmo2':'SparksterBAmmo3'; + return Random[Replacements](0,2)?'SparksterRAmmo2':'SparksterRAmmo3'; + }*/ /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) - return Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmoBundleSpawn';*/ + return Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmo2';*/ switch ( Random[Replacements](0,11) ) { case 0: @@ -141,12 +144,12 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner case 2: case 3: case 4: - return Random[Replacements](0,4)?'HellblazerMissiles':'HellblazerMissileBundleSpawn'; + return Random[Replacements](0,4)?'HellblazerMissiles':Random[Replacements](0,2)?'HellblazerMissiles2':'HellblazerMissiles3'; case 5: case 6: case 7: case 8: - return Random[Replacements](0,7)?'HellblazerCrackshots':'HellblazerCrackshotBundleSpawn'; + return Random[Replacements](0,7)?'HellblazerCrackshots':'HellblazerCrackshots2'; case 9: case 10: return 'HellblazerRavagers'; @@ -167,7 +170,7 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner if ( !Random[Replacements](0,3) ) { /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return 'MisterGAmmo';*/ - /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt';*/ + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt2';*/ if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return 'CandyGunBullets'; } /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return 'EMPCore';*/ @@ -194,17 +197,17 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner } /*if ( Random[Replacements](0,1) ) { - if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCoreBundleSpawn':'EMPCore'; - if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return Random[Replacements](0,2)?'MisterRoundBundleSpawn':'MisterAmmo'; - if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBoltBundleSpawn':'RayAmmo'; + if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCore2':'EMPCore'; + if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return Random[Replacements](0,2)?'MisterRound5':'MisterAmmo'; + if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBolt5':'RayAmmo'; }*/ if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('SilverBullet')) ) { - if ( Random[Replacements](0,3) ) return Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn'; + if ( Random[Replacements](0,3) ) return Random[Replacements](0,2)?'SilverBullets_2':'SilverBullets2_2'; return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; } - if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,3)?'CandyGunBulletsBundleSpawn':'CandyGunAmmo'; + if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,3)?'CandyGunBullets3':'CandyGunAmmo'; /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/ - return Random[Replacements](0,3)?'SparkUnit':'SparkUnitBundleSpawn'; + return Random[Replacements](0,3)?'SparkUnit':'SparkUnit2'; } } diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 37efc8925..7109c8a8e 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -1,6 +1,39 @@ // Common code for ammo division -Mixin Class SWWMAmmo +Class SWWMAmmo : Ammo { + Mixin SWWMOverlapPickupSound; + Mixin SWWMUseToPickup; + Mixin SWWMRespawn; + + String PickupTag; + Class MagAmmoType; + private int SAmmoFlags; + + Property PickupTag : PickupTag; + Property MagAmmoType : MagAmmoType; + + FlagDef UsePickupMsg : SAmmoFlags, 0; // use the set pickup message rather than generating from pickup tag + + override Class GetParentAmmo() + { + Class type = GetClass(); + while ( (type.GetParentClass() != "SWWMAmmo") && type.GetParentClass() ) + type = type.GetParentClass(); + return (Class)(type); + } + + override string PickupMessage() + { + if ( bUsePickupMsg ) return Super.PickupMessage(); + String tagstr = "$T_"..PickupTag; + if ( Amount > 1 ) + { + tagstr = tagstr.."S"; + return String.Format("%d %s",Amount,StringTable.Localize(tagstr)); + } + return StringTable.Localize(tagstr); + } + private Inventory DoDrop( Class type ) { let copy = Inventory(Spawn(type,Owner.Pos,NO_REPLACE)); @@ -122,22 +155,7 @@ Mixin Class SWWMAmmo ammotypes.Push((Class)(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++; - } - } + qsort_ammotypes(ammotypes,0,ammotypes.Size()-1); // drop spares Inventory last; while ( excess > 0 ) @@ -196,6 +214,31 @@ Mixin Class SWWMAmmo return true; } + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + // attach our mag ammo if we have none + if ( MagAmmoType && !Owner.FindInventory(MagAmmoType) ) + { + let ma = Inventory(Spawn(MagAmmoType)); + ma.Amount = 0; + ma.AttachToOwner(Owner); + } + } + + override void ModifyDropAmount( int dropamount ) + { + Super.ModifyDropAmount(dropamount); + int maxdrop = 1; + for ( int i=0; i)(AllActorClasses[i])); + maxdrop = max(maxdrop,def.amount); + } + Amount = Random[ShellDrop](1,clamp(dropamount,1,maxdrop)); + } + default { +INVENTORY.IGNORESKILL; @@ -214,9 +257,11 @@ Class MagAmmo : Inventory abstract Ammo pamo; int ClipSize; int countdown; + String PickupTag; Property ParentAmmo : ParentAmmo; Property ClipSize : ClipSize; + Property PickupTag : PickupTag; default { @@ -226,6 +271,59 @@ Class MagAmmo : Inventory abstract Inventory.PickupFlash "SWWMPickupFlash"; } + virtual Class GetParentMagAmmo() + { + Class type = GetClass(); + while ( (type.GetParentClass() != "MagAmmo") && type.GetParentClass() ) + type = type.GetParentClass(); + return (Class)(type); + } + + private bool CmpAmmo( Class a, Class b ) + { + let amta = GetDefaultByType(a).Amount; + let amtb = GetDefaultByType(b).Amount; + return (amta < amtb); + } + + private int partition_ammotypes( Array > a, int l, int h ) + { + Class pv = a[h]; + int i = (l-1); + for ( int j=l; j<=(h-1); j++ ) + { + if ( CmpAmmo(pv,a[j]) ) + { + i++; + Class tmp = a[j]; + a[j] = a[i]; + a[i] = tmp; + } + } + Class tmp = a[h]; + a[h] = a[i+1]; + a[i+1] = tmp; + return i+1; + } + private void qsort_ammotypes( Array > a, int l, int h ) + { + if ( l >= h ) return; + int p = partition_ammotypes(a,l,h); + qsort_ammotypes(a,l,p-1); + qsort_ammotypes(a,p+1,h); + } + + override string PickupMessage() + { + String tagstr = "$T_"..PickupTag; + if ( Amount > 1 ) + { + tagstr = tagstr.."S"; + return String.Format("%d %s",Amount,StringTable.Localize(tagstr)); + } + return StringTable.Localize(tagstr); + } + override bool HandlePickup( Inventory item ) { // see if the mag can be split apart @@ -257,7 +355,78 @@ Class MagAmmo : Inventory abstract return true; } } - return Super.HandlePickup(item); + // drop excess mag ammo + if ( (item is 'MagAmmo') && (MagAmmo(item).GetParentMagAmmo() == GetClass()) ) + { + 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 + qsort_ammotypes(ammotypes,0,ammotypes.Size()-1); + // 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 -= def.Amount; + break; + } + } + } + } + if ( Amount < MaxAmount ) + { + int receiving = item.Amount; + int oldamt = Amount; + if ( (Amount > 0) && ((Amount+item.Amount) < 0) ) Amount = int.max; + else Amount += item.Amount; + if ( Amount > MaxAmount && !sv_unlimited_pickup ) Amount = MaxAmount; + item.bPickupGood = true; + // autoswitch if needed (checks parent ammo type) + if ( (oldamt == 0) && Owner && Owner.player ) + PlayerPawn(Owner).CheckWeaponSwitch(ParentAmmo); + } + return true; + } + return false; + } + + override Inventory CreateCopy( Actor other ) + { + Inventory copy; + int amount = Amount; + let type = GetParentMagAmmo(); + if ( (GetClass() != type) && type ) + { + if ( !GoAway() ) Destroy(); + copy = Inventory(Spawn(type)); + copy.Amount = amount; + copy.BecomeItem(); + } + else + { + copy = Super.CreateCopy(other); + copy.Amount = amount; + } + if ( copy.Amount > copy.MaxAmount ) copy.Amount = copy.MaxAmount; + return copy; } override bool CanPickup( Actor toucher ) @@ -363,6 +532,16 @@ Class MagAmmo : Inventory abstract 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 + qsort_ammotypes(ammotypes,0,ammotypes.Size()-1); // perform subdivision Inventory last = null; let pammo = GetDefaultByType(ParentAmmo); @@ -376,10 +555,18 @@ Class MagAmmo : Inventory abstract Amount -= ClipSize; continue; } - // drop individual bullets - last = DoDrop(GetClass()); - amt--; - Amount--; + // drop bullets otherwise + for ( int i=0; i= def.Amount ) + { + last = DoDrop(ammotypes[i]); + amt -= def.Amount; + Amount -= def.Amount; + break; + } + } } return last; } @@ -391,29 +578,7 @@ Class MagAmmo : Inventory abstract } } -// Common code for grouped shell handling and per-amount pickup messages -Mixin Class SWWMShellAmmo -{ - override string PickupMessage() - { - String tagstr = "$T_"..GetParentAmmo().GetClassName(); - tagstr.MakeUpper(); - if ( Amount > 1 ) - { - tagstr = tagstr.."S"; - return String.Format("%d %s",Amount,StringTable.Localize(tagstr)); - } - return StringTable.Localize(tagstr); - } - - override void ModifyDropAmount( int dropamount ) - { - Super.ModifyDropAmount(dropamount); - Amount = Random[ShellDrop](1,clamp(dropamount,1,4)); - } -} - -// Ref class for ammo spawners, used by both on-demand replacers and bundles +// Ref class for ammo spawners, used by on-demand replacers Class SWWMAmmoSpawner : Actor abstract { virtual void SpawnAmmo() {} diff --git a/zscript/kbase/swwm_kbase.zsc b/zscript/kbase/swwm_kbase.zsc index 221db3534..375d4d789 100644 --- a/zscript/kbase/swwm_kbase.zsc +++ b/zscript/kbase/swwm_kbase.zsc @@ -1090,8 +1090,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1136,8 +1138,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1165,8 +1169,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1211,8 +1217,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1320,10 +1328,10 @@ Class DemolitionistMenu : GenericMenu if ( sub ) { int amt = (storelist[i] is 'CandyGun')?(players[consoleplayer].mo.CountInv("CandyGunSpares")+1):players[consoleplayer].mo.CountInv(storelist[i]); - if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,def.GetTag()); + if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); } - else if ( storeunits[i] > 1 ) str = String.Format("%dx %s",storeunits[i],def.GetTag()); + else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1366,7 +1374,13 @@ Class DemolitionistMenu : GenericMenu { if ( !storelist[i] ) continue; let def = GetDefaultByType(storelist[i]); - if ( storeunits[i] > 1 ) str = String.Format("%dx %s",storeunits[i],def.GetTag()); + if ( sub ) + { + int amt = (storelist[i] is 'CandyGun')?(players[consoleplayer].mo.CountInv("CandyGunSpares")+1):players[consoleplayer].mo.CountInv(storelist[i]); + if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i])); + else str = def.GetTag(); + } + else if ( storeunits[i] > 1 ) str = String.Format("%dx %s",storeunits[i],def.GetTag()); else str = def.GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -1632,7 +1646,7 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); @@ -1688,10 +1702,10 @@ Class DemolitionistMenu : GenericMenu if ( sub ) { int amt = (storelist[i] is 'CandyGun')?(players[consoleplayer].mo.CountInv("CandyGunSpares")+1):players[consoleplayer].mo.CountInv(storelist[i]); - if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,def.GetTag()); + if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); } - else if ( storeunits[i] > 1 ) str = String.Format("%dx %s",storeunits[i],def.GetTag()); + else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -2374,7 +2388,7 @@ Class DemolitionistMenu : GenericMenu if ( !ready || !ready.ValidateSpriteFrame() ) continue; } // ignore child ammos - if ( (type is 'Ammo') && (type.GetParentClass() != 'Ammo') ) continue; + if ( (type is 'Ammo') && (type.GetParentClass() != 'SWWMAmmo') ) continue; if ( inv.Stamina == 0 ) continue; // items with negative stamina can only be sold if ( (inv.Stamina < 0) && !sub ) continue; @@ -3187,8 +3201,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -3199,8 +3215,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=ofs; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); int clscol = Font.CR_WHITE; if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD; @@ -3246,8 +3264,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); len = fnt.StringWidth(str); if ( len > longest ) longest = len; @@ -3258,8 +3278,10 @@ Class DemolitionistMenu : GenericMenu for ( int i=ofs; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); + if ( (invlist[i] is 'Ammo') || (invlist[i] is 'MagAmmo') ) + str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,SWWMUtility.GetAmmoTag(invlist[i])); + else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) + str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag()); else str = invlist[i].GetTag(); int clscol = Font.CR_WHITE; if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD; @@ -3456,10 +3478,10 @@ Class DemolitionistMenu : GenericMenu if ( sub ) { int amt = (storelist[i] is 'CandyGun')?(players[consoleplayer].mo.CountInv("CandyGunSpares")+1):players[consoleplayer].mo.CountInv(storelist[i]); - if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,def.GetTag()); + if ( (amt > 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); } - else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],def.GetTag()); + else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i])); else str = def.GetTag(); int clscol = Font.CR_WHITE; if ( storelist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD; diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 226196f62..0fbfeaf61 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -171,7 +171,7 @@ Class Demolitionist : PlayerPawn for ( int i=0; i)(AllActorClasses[i]); - if ( !type || (type.GetParentClass() != "Ammo") ) + if ( !type || (type == "Ammo") || (type == "SWWMAmmo") || ((type.GetParentClass() != "Ammo") && (type.GetParentClass() != "SWWMAmmo")) ) continue; // Only give if it's for a valid weapon bool isvalid = false; diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/swwm_thinkers_hud.zsc index e7acfa94f..cb11aac64 100644 --- a/zscript/swwm_thinkers_hud.zsc +++ b/zscript/swwm_thinkers_hud.zsc @@ -232,17 +232,8 @@ Class SWWMItemSense : Thinker let i = item; if ( i is 'SWWMRespawnTimer' ) i = i.tracer; if ( !i ) return; - // certain ammo types use the pickup message as it's amount-aware - if ( (i is 'RedShell') || (i is 'GreenShell') - || (i is 'WhiteShell') || (i is 'BlueShell') - || (i is 'BlackShell') || (i is 'PurpleShell') - || (i is 'GoldShell') || (i is 'EvisceratorShell') - || (i is 'HellblazerMissiles') - || (i is 'HellblazerCrackshots') - || (i is 'HellblazerRavagers') - || (i is 'HellblazerWarheads') - || (i is 'SMW05Ammo') - || (i is 'SheenAmmo') ) + // our ammo types use the pickup message, as it's amount-aware + if ( (i is 'SWWMAmmo') || (i is 'MagAmmo') ) tag = Inventory(i).PickupMessage(); else tag = i.GetTag(); } diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index e70333ca3..c6a25e1c4 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -888,6 +888,16 @@ Class SWWMUtility basetag = "BOSSBRAIN"; break; case 'WolfensteinSS': + // ensure it's not being replaced + let def = GetDefaultByType('WolfensteinSS'); + bool dehackery = false; + for ( State s=def.SpawnState; s; s=s.NextState ) + { + if ( s.bDEHACKED ) dehackery = true; + // keep checking until we hit a loop, just in case + if ( s.NextState && (s.DistanceTo(s.NextState) <= 0) ) break; + } + if ( dehackery ) break; case 'SWWMSS': basetag = "WOLFSS"; break; @@ -1073,9 +1083,12 @@ Class SWWMUtility Actor Instigator = (flags&DE_NOTMISSILE)?Source:Source.target; BlockThingsIterator bi = BlockThingsIterator.Create(Source,ExplosionRadius); int nhit = 0, nkill = 0; + Array washit; + washit.Clear(); while ( bi.Next() ) { Actor a = bi.Thing; + washit.Push(a); // early checks for self and ignored actor (usually the instigator) if ( !a || (a == ignoreme) || (a == Source) ) continue; @@ -1129,6 +1142,76 @@ Class SWWMUtility if ( (flags&DE_HOWL) && a && (a.Health > 0) && a.bISMONSTER && !Random[DoBlast](0,3) ) a.Howl(); if ( (!a || (a.Health <= 0)) && (!(flags&DE_COUNTENEMIES) || hostile) && (!(flags&DE_COUNTSTEALTH) || inactive) ) nkill++; } + // traverse portals (needed since BlockThingsIterator can't properly cross sector portals in both vertical directions) + let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); + if ( !hnd || (hnd.psectors.Size() <= 1) ) return nhit, nkill; + int thisgroup = Source.CurSector.portalgroup; + for ( int i=0; i 0.) && !a.bDORMANT && !a.bDONTTHRUST && (a.Mass < Actor.LARGE_MASS) ) + { + Vector3 Momentum = dir*mm; + if ( (a.pos.z <= a.floorz) || !a.TestMobjZ() ) + Momentum.z = max(Momentum.z,(flags&DE_EXTRAZTHRUST?.4:.1)*Momentum.length()); + Momentum /= GameTicRate*max(50,a.Mass); // prevent tiny things from getting yeeted at warp speed + a.vel += Momentum; + if ( (flags&DE_BLAST) && a.bCANBLAST && !a.bDONTBLAST ) a.bBLASTED = true; + } + // hit it + bool inactive = (!a.player&&!a.target); + bool hostile = (Instigator&&a.IsHostile(Instigator)&&(a.bISMONSTER||a.player)); + if ( (!(flags&DE_COUNTENEMIES) || hostile) && (!(flags&DE_COUNTSTEALTH) || inactive) ) nhit++; + int dmg = int(Damage*damagescale); + if ( dmg <= 0 ) continue; // no harm + int ndmg = a.DamageMobj(Source,Instigator,dmg,(DamageType=='')?Source.DamageType:DamageType,DMG_EXPLOSION,atan2(-dir.y,-dir.x)); + if ( a && !(flags&DE_NOBLEED) ) a.TraceBleed((ndmg>0)?ndmg:dmg,Source); + if ( (flags&DE_HOWL) && a && (a.Health > 0) && a.bISMONSTER && !Random[DoBlast](0,3) ) a.Howl(); + if ( (!a || (a.Health <= 0)) && (!(flags&DE_COUNTENEMIES) || hostile) && (!(flags&DE_COUNTSTEALTH) || inactive) ) nkill++; + } + } return nhit, nkill; } @@ -1467,7 +1550,7 @@ Class SWWMUtility // to be filled static bool IsKnownCustomWAD() { - if ( (gameinfo.gametype&GAME_DOOM) ) + if ( gameinfo.gametype&GAME_DOOM ) { if ( IsEviternity() ) return true; } @@ -1558,9 +1641,25 @@ Class SWWMUtility if ( i is 'WarArmor' ) return true; if ( i is 'FuckingInvinciball' ) return true; if ( i is 'SWWMLamp' ) return true; + if ( i is 'AngerySigil' ) return true; return false; } + // returns the plural tag (if available) + static clearscope string GetAmmoTag( Inventory i ) + { + if ( i is 'MagAmmo' ) return StringTable.Localize("$T_"..MagAmmo(i).PickupTag.."S"); + if ( i is 'SWWMAmmo' ) return StringTable.Localize("$T_"..SWWMAmmo(i).PickupTag.."S"); + return i.GetTag(); + } + // because of zscript fuckery with GetDefaultByType + static clearscope string GetAmmoTagClass( Class i ) + { + if ( i is 'MagAmmo' ) return StringTable.Localize("$T_"..GetDefaultByType((Class)(i)).PickupTag.."S"); + if ( i is 'SWWMAmmo' ) return StringTable.Localize("$T_"..GetDefaultByType((Class)(i)).PickupTag.."S"); + return GetDefaultByType(i).GetTag(); + } + static bool, TextureID DefaceTexture( TextureID checkme ) { String tn = TexMan.GetName(checkme); @@ -1929,13 +2028,17 @@ Class ShinemapDebugSphere : Actor XZW1 G -1 A_SetRenderStyle(1.,STYLE_Normal); XZW1 H -1 A_SetRenderStyle(1.,STYLE_Normal); XZW1 I -1 A_SetRenderStyle(1.,STYLE_Normal); - XZW1 J -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 J -1 Bright A_SetRenderStyle(1.,STYLE_Add); XZW1 K -1 A_SetRenderStyle(1.,STYLE_Normal); - XZW1 L -1 A_SetRenderStyle(1.,STYLE_Normal); - XZW1 M -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 L -1 Bright A_SetRenderStyle(1.,STYLE_Add); + XZW1 M -1 Bright A_SetRenderStyle(1.,STYLE_Add); XZW1 N -1 A_SetRenderStyle(1.,STYLE_Normal); XZW1 O -1 A_SetRenderStyle(1.,STYLE_Normal); XZW1 P -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 Q -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 R -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 S -1 A_SetRenderStyle(1.,STYLE_Normal); + XZW1 T -1 A_SetRenderStyle(1.,STYLE_Normal); Loop; } }