From 4af07111f153073f96deda6760e1f3b53a02b032 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Tue, 8 Sep 2020 22:47:29 +0200 Subject: [PATCH] Major rebalance and other changes: - Tweaked health item values. - Allow Sandwich to save you from the Ynykron (usually). - Tweaked ammo availability again. - Disable ammo and weapon drops from enemies (can be re-enabled). - Adjusted refire behaviour of Biospark Carbine. - Tweaked the sizes of some pickup models. - Wallbuster gives only 5 ammo on pickup. - Tweaked score values for more balanced progression. - Overkill bonus also includes enemies that take twice their base health in damage (as was intended) - Add a reminder for myself to add wall collision to dashing. --- PriceTable.md | 4 +- README.md | 43 ++++++++++---------- cvarinfo.txt | 1 + language.def_menu | 2 + language.es_menu | 2 + language.version | 2 +- menudef.txt | 1 + modeldef.pickups | 10 ++--- zscript/swwm_ammo.zsc | 44 +++++++++++---------- zscript/swwm_armor.zsc | 2 +- zscript/swwm_cbt.zsc | 6 +-- zscript/swwm_deathlydeathcannon.zsc | 29 +++++++++++++- zscript/swwm_handler.zsc | 61 ++++++++++------------------- zscript/swwm_health.zsc | 14 +++---- zscript/swwm_inventory.zsc | 6 +++ zscript/swwm_player.zsc | 9 +++-- zscript/swwm_powerup.zsc | 11 +++--- zscript/swwm_sparkyboi.zsc | 39 ++++++++++-------- 18 files changed, 155 insertions(+), 131 deletions(-) diff --git a/PriceTable.md b/PriceTable.md index 5fa773ed2..f881e5b54 100644 --- a/PriceTable.md +++ b/PriceTable.md @@ -82,11 +82,11 @@ Other items that can be bought at any moment. **Omnisights** and **Embiggeners** Item | Price ------------------ | ------- - Health Nugget | 1200 + Health Nugget | 200 Health Tetrahedron | 3000 Health Cube | 8000 Refresher | 160000 - Armor Nugget | 1000 + Armor Nugget | 300 Blast Suit | 40000 War Armor | 100000 Elemental Coating | 80000 diff --git a/README.md b/README.md index 89fb86861..f7270d3c6 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Additional features: - **Forx JetBurst™ Units:** Can be used for quick dashes in any direction, or even for short bursts of flight. - **Targetting Array:** Tracks nearby foes and provides basic information on their health. Compatible with **Omnisight™** mapping modules for tracking key items and nearby exits. Can also highlight nearby pickups by holding a dedicated button. - **Akari Labs CuteEmotion™ Display:** Equipped onto your visor to show a wide range of predefined facial expressions in order to convey simple emotions to others. - - **Akari Labs LoudBoi™ Voicebox:** Allows you to emit. Additional voice options will be available through add-ons. Note that the default voice is in Japanese, but subtitles will be provided when available. + - **Akari Labs LoudBoi™ Voicebox:** Allows you to 🇪 🇲 🇮 🇹. Additional voice options will be available through add-ons. Note that the default voice is in Japanese, but subtitles will be provided when available. **Note:** Since you're a robutt you pretty much can swim indefinitely and are also inmune to poison. @@ -94,7 +94,7 @@ Coming from the **Doom** modding side of things, this gun really packs a punch, The **Spreadgun** uses 10 gauge ammunition, apparently just for the sake of making it feel more powerful due to the increased recoil. -### 10Ga shells ~ Replaces Clip / Shells, Wand Crystal / Ethereal Arrows, Flechette, Chaos Device/Banishment Device +### 10Ga shells ~ Replaces Shells, Ethereal Arrows, Chaos Device/Banishment Device ![](docimg/shells.png) Available in the following types, with varying chances of appearing depending @@ -155,7 +155,7 @@ Another signature weapon of the **SWWM** series. This time in its third and far **Secondary fire:** Lob the rocket as a grenade that will bounce around. -**Tertiary fire:** Change the ammo type, there are four options (see ammo section below). +**Tertiary fire (Zoom):** Change the ammo type, there are four options (see ammo section below). This thing is more explosive than it looks, so if you're reading this, Icarus, ***DO NOT*** use it at close range. @@ -174,16 +174,13 @@ Ammo for the **Hellblazer**, found either as single units or packs. There are fo A relic from the olden days of **UnSX**. A potent energy weapon that uses what's best described as *"sentient lightning"*. -**Primary fire:** Small blobs of energy that explode violently on impact. +**Primary fire:** Small blobs of energy that explode violently on impact. Hold for rapid fire. -**Secondary fire:** Concentrated beam shot. A very old thing from the original **UnSX I** incarnation. Can penetrate multiple solid targets. +**Secondary fire:** Concentrated beam shot. A very old thing from the original **UnSX I** incarnation. Can penetrate multiple solid targets. Can also be held for rapid fire. -Zoom deploys a capsule that releases a massive sphere of pure energy that -tracks down any hostile targets. It will rip through everything and even bounce -off surfaces, but it has a rather limited lifespan. +**Tertiary fire (Zoom):** Deploy a capsule that releases a massive sphere of pure energy, which will track down any hostile targets. It will rip through everything and even bounce off surfaces, but it has a rather limited lifespan. -If the beam hits either of the other energy blobs, they will detonate with -highly amplified damage and range. +If the beam hits either of the other energy blobs, they will detonate with highly amplified damage and range. Note that it is possible to alternate between primary and secondary modes while rapid firing, making this combo just a matter of precise timing. ### Biospark Unit ~ Replaces Cells, Runes ![](docimg/biosparkammo.png) @@ -273,24 +270,24 @@ All of these can be carried in your inventory indefinitely before use, except in ### Health Nugget ~ Replaces Health Bonus, Crystal Vial ![](docimg/nuggethealth.png) -+5 health boost, up to a cap of 200 points. ++1 health boost, up to a cap of 200 points. ### Health Tetrahedron ~ Replaces Stimpak, Quartz Flask ![](docimg/tetrahealth.png) -+15 health boost, up to a cap of 100 points. ++10 health boost, up to a cap of 100 points. ### Health Cube ~ Replaces Medkit, Mystic Urn (Hexen), Quartz Flask (Heretic) ![](docimg/cubehealth.png) -+30 health boost, up to a cap of 100 points. ++20 health boost, up to a cap of 100 points. ### Refresher ~ Replaces Soulsphere, Mystic Urn (Heretic), Mystic Ambit Incant ![](docimg/refresher.png) -This artifact provides a massive boost of health to 500, plus a regeneration effect that heals 5% every 2 seconds, for up to 60 seconds, thus it doubles as a powerup. Like other health items, the **Refresher** is auto-activated if you're about to die, though it sometimes won't be enough to save you. +This artifact provides a massive +200 health boost plus a regeneration effect that heals 10% every 5 seconds, for up to 60 seconds, thus it doubles as a powerup. Its overhealing effects cap at 500 points (including the regen). Like other health items, the **Refresher** is auto-activated if you're about to die, though it sometimes won't be enough to save you. -### Armor Nugget ~ Replaces Armor Bonus, Timebomb of the Ancients, Disc of Repulsion +### Armor Nugget ~ Replaces Armor Bonus, Timebomb of the Ancients, Disc of Repulsion, Flechette ![](docimg/nuggetarmor.png) Cumulative armor items that can increase resistance to all damage by as much as you can find. Each nugget adds 5% to the total. Above 100%, damage gets turned into additional health (up to the standard 100% cap). The upper cap for these is 200%. @@ -316,7 +313,7 @@ Can eat up a total of 250 damage points before breaking. ### Grilled Cheese Sandwich ~ Replaces Megasphere, Morph Ovum, Platinum Helm ![](docimg/sandwich.png) -The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically (although not even this wondrous artifact can save you from the destruction of the **Ynykron Artifact**). +The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically (this wondrous artifact can even save you from the destruction of the **Ynykron Artifact**). ### Ghost Artifact ~ Replaces Blur Sphere, Shadowsphere, Amulet of Warding ![](docimg/ghost.png) @@ -355,7 +352,7 @@ For 60 seconds, you can fly around in the air at 2x your normal walking speed, b This thing makes you impervious to pretty much everything excluding the **Ynykron Artifact**. -You're fucking invincible for a total of 30 seconds. +You're fucking invincible for a total of 20 seconds. ### Hammerspace Embiggener ~ Replaces Backpack, Bag of Holding, Porkalator, Dragonskin Bracers ![](docimg/embiggener.png) @@ -389,16 +386,16 @@ Message display. Can be configured to show different numbers of messages dependi Current score. -The scoring system is pretty straightforward. Each enemy you kill will give you points according to a quarter of its base health, rounded up to the nearest multiple of 10 and capped to 1000, plus some bonuses (in order of application): +The scoring system is pretty straightforward. Each enemy you kill will give you points according to 5% of its base health, rounded up to the nearest multiple of 10 and capped to 1000, plus some bonuses (in order of application): - * x1.25 for an overkill (enemy received twice its base health in damage). + * +500 if the enemy was killed with the **Deep Impact** primary (humiliation). + * x2 for an overkill (enemy was gibbed or received twice its base health in damage). * x1.5 for each combo level, up to x8 in steps of x0.5. Kills are considered combos if multiple enemies are killed within 5 seconds of each other. * +100 for killing an enemy without having taken damage since last spawn, with extra +10 boosts for consecutive kills (extra boosts taper off after 10x). - * +5000 if the enemy killed is a boss. - * +2000 if you've killed the last enemy in the map. - * +1000 if the enemy was killed with the **Deep Impact** primary (humiliation). + * +2000 if the enemy killed is a boss. + * +1000 if you've killed the last enemy in the map. -You are also given +500 points for each secret found, +5000 if it's the final secret. Countable items give +25 points each or +2500 if it's the final item. +You are also given +100 points for each secret found, +1000 if it's the final secret. Countable items give +10 points each or +500 if it's the final item. Score can be used to buy items on the in-game store, and it is preserved between hubs. diff --git a/cvarinfo.txt b/cvarinfo.txt index 4be07c8eb..2aa51935f 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -80,3 +80,4 @@ user bool swwm_funtags = true; // replace vanilla monster names with silly one server bool swwm_simplefog = false; // simplified teleport fogs (useful to speed up slaughterwads) user bool swwm_bigtags = false; // use a bigger font for targeter tags user bool swwm_intermusic = false; // use original intermission music +server bool swwm_enemydrops = false; // allow enemies to drop ammo and weapons diff --git a/language.def_menu b/language.def_menu index ec9639244..be8eae10c 100644 --- a/language.def_menu +++ b/language.def_menu @@ -122,6 +122,7 @@ SWWM_MAXBLOOD = "Blood Limit"; SWWM_MAXGIBS = "Gib Limit"; SWWM_MAXCASINGS = "Casing Limit"; SWWM_MAXDEBRIS = "Debris Limit"; +SWWM_ENEMYDROPS = "Enemies Drop Weapons and Ammo"; TOOLTIP_SWWM_VOICETYPE = "Sets the voice pack for the player."; TOOLTIP_SWWM_MUTEVOICE = "Control what gets muted, if you'd rather have a more silent protagonist."; TOOLTIP_SWWM_FLASHSTRENGTH = "Screen flashes usually happen when firing some weapons, you can lower this if these effects are harmful for you."; @@ -185,6 +186,7 @@ TOOLTIP_SWWM_MAXBLOOD = "Caps the maximum amount of blood effects. Surpassing th TOOLTIP_SWWM_MAXGIBS = "Caps the maximum amount of gibs. Surpassing this limit will cause the excess to fade out."; TOOLTIP_SWWM_MAXCASINGS = "Caps the maximum amount of casings and spent magazines. Surpassing this limit will cause the excess to fade out."; TOOLTIP_SWWM_MAXDEBRIS = "Caps the maximum amount of rubble from explosions and others. Surpassing this limit will cause the excess to fade out."; +TOOLTIP_SWWM_ENEMYDROPS = "If enabled, enemies will drop weapons and ammo like they would in vanilla. This is not recommended as it easily breaks progression."; // knowledge base SWWM_COMINGSOON = "(coming soon)"; SWWM_MISSTAB = "Mission"; diff --git a/language.es_menu b/language.es_menu index e8c98577e..412ded4bc 100644 --- a/language.es_menu +++ b/language.es_menu @@ -119,6 +119,7 @@ SWWM_MAXBLOOD = "Límite de Sangre"; SWWM_MAXGIBS = "Límite de Vísceras"; SWWM_MAXCASINGS = "Límite de Casquillos"; SWWM_MAXDEBRIS = "Límite de Escombros"; +SWWM_ENEMYDROPS = "Enemigos Sueltan Armas y Munición"; TOOLTIP_SWWM_VOICETYPE = "Selecciona el pack de voz para el jugador."; TOOLTIP_SWWM_MUTEVOICE = "Controla lo que se mutea, si prefieres tener un protagonista más silencioso."; TOOLTIP_SWWM_FLASHSTRENGTH = "Los destellos en pantalla suelen ocurrir al disparar algunas armas, puedes reducirlo si este tipo de effectos te causan malestar."; @@ -182,6 +183,7 @@ TOOLTIP_SWWM_MAXBLOOD = "Limita la cantidad máxima de efectos de sangre. Sobrep TOOLTIP_SWWM_MAXGIBS = "Limita la cantidad máxima de vísceras. Sobrepasar este límite causará que el exceso se desvanezca."; TOOLTIP_SWWM_MAXCASINGS = "Limita la cantidad máxima de casquillos y cargadores usados. Sobrepasar este límite causará que el exceso se desvanezca."; TOOLTIP_SWWM_MAXDEBRIS = "Limita la cantidad máxima de escombros por explosiones y otros. Sobrepasar este límite causará que el exceso se desvanezca."; +TOOLTIP_SWWM_ENEMYDROPS = "Al activar, los enemigos soltarán armas y munición como harían en vanilla. Ésto no se recomienda ya que rompe fácilmente la progresión."; // knowledge base SWWM_COMINGSOON = "(próximamente)"; SWWM_MISSTAB = "Misión"; diff --git a/language.version b/language.version index 92acee915..b8fc41fa4 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \cwGZ\c- r532 (Mon 7 Sep 23:29:06 CEST 2020)"; +SWWM_MODVER="\chSWWM \cwGZ\c- r533 (Tue 8 Sep 22:47:29 CEST 2020)"; diff --git a/menudef.txt b/menudef.txt index 1635eeaf4..c8fea2ae7 100644 --- a/menudef.txt +++ b/menudef.txt @@ -73,6 +73,7 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_FUNTAGS", "swwm_funtags", "YesNo" StaticText " " StaticText "$SWWM_BTITLE", "Gold" + Option "$SWWM_ENEMYDROPS", "swwm_enemydrops", "YesNo" Option "$SWWM_RESETSCORE", "swwm_resetscore", "YesNo" Option "$SWWM_EXTRAALERT", "swwm_extraalert", "YesNo" Option "$SWWM_BOSSENHANCE", "swwm_upgradebosses", "YesNo" diff --git a/modeldef.pickups b/modeldef.pickups index a640d0951..b1ec60285 100644 --- a/modeldef.pickups +++ b/modeldef.pickups @@ -3,7 +3,7 @@ Model "ArmorNuggetItem" Path "models" Model 0 "Nugget_d.3d" Skin 0 "Nugget_Armor.png" - Scale 0.03 0.03 0.03 + Scale 0.02 0.02 0.02 ZOffset 16 ROTATING @@ -21,7 +21,7 @@ Model "HealthNuggetItem" Path "models" Model 0 "Nugget_d.3d" Skin 0 "Nugget.png" - Scale 0.03 0.03 0.03 + Scale 0.02 0.02 0.02 ZOffset 16 ROTATING @@ -52,7 +52,7 @@ Model "CubeHealthItem" Path "models" Model 0 "CubeHealth_d.3d" Skin 0 "CubeHealth.png" - Scale 0.03 0.03 0.03 + Scale 0.025 0.025 0.025 ZOffset 16 ROTATING @@ -64,7 +64,7 @@ Model "RefresherItem" Path "models" Model 0 "Refresher_d.3d" Skin 0 "Refresher.png" - Scale 0.05 0.05 0.05 + Scale 0.04 0.04 0.04 ZOffset 16 RollOffset 30 ROTATING @@ -102,7 +102,7 @@ Model "GrilledCheeseSandwich" Model 0 "Sandwich_d.3d" SurfaceSkin 0 0 "goldmap.png" SurfaceSkin 0 1 "Sandwich.png" - Scale 0.05 0.05 0.05 + Scale 0.04 0.04 0.04 PitchOffset -45 ZOffset 16 ROTATING diff --git a/zscript/swwm_ammo.zsc b/zscript/swwm_ammo.zsc index cc27dcdae..bfafc5f3c 100644 --- a/zscript/swwm_ammo.zsc +++ b/zscript/swwm_ammo.zsc @@ -23,14 +23,16 @@ Mixin Class SWWMAmmo override bool SpecialDropAction( Actor dropper ) { - if ( Amount != default.Amount ) + if ( swwm_enemydrops ) { - // needed for positioning to work - Owner = dropper; + if ( Amount == default.Amount ) return false; + // subdivide + Owner = dropper; // needed for positioning to work CreateTossable(Amount); return true; } - return false; + // no ammo drops from enemies + return true; } private bool CmpAmmo( Class a, Class b ) @@ -200,14 +202,16 @@ Class MagAmmo : Inventory abstract override bool SpecialDropAction( Actor dropper ) { - if ( Amount != default.Amount ) + if ( swwm_enemydrops ) { - // needed for positioning to work - Owner = dropper; + if ( Amount == default.Amount ) return false; + // subdivide + Owner = dropper; // needed for positioning to work CreateTossable(Amount); return true; } - return false; + // no ammo drops from enemies + return true; } override void DoEffect() @@ -332,7 +336,7 @@ Class RedShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsNormal.png"; Inventory.Amount 1; Inventory.MaxAmount 50; - Ammo.BackpackAmount 8; + Ammo.BackpackAmount 3; Ammo.DropAmount 3; +FLOATBOB; FloatBobStrength 0.25; @@ -393,7 +397,7 @@ Class GreenShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsSlug.png"; Inventory.Amount 1; Inventory.MaxAmount 48; - Ammo.BackpackAmount 4; + Ammo.BackpackAmount 2; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -447,7 +451,7 @@ Class WhiteShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsDragon.png"; Inventory.Amount 1; Inventory.MaxAmount 32; - Ammo.BackpackAmount 2; + Ammo.BackpackAmount 1; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -494,7 +498,7 @@ Class BlueShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsKinylum.png"; Inventory.Amount 1; Inventory.MaxAmount 40; - Ammo.BackpackAmount 4; + Ammo.BackpackAmount 2; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -541,7 +545,7 @@ Class BlackShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsFuck.png"; Inventory.Amount 1; Inventory.MaxAmount 20; - Ammo.BackpackAmount 2; + Ammo.BackpackAmount 0; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -581,7 +585,7 @@ Class PurpleShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_ShellsBall.png"; Inventory.Amount 1; Inventory.MaxAmount 32; - Ammo.BackpackAmount 4; + Ammo.BackpackAmount 2; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -691,7 +695,7 @@ Class EvisceratorShell : Ammo Inventory.Icon "graphics/HUD/Icons/A_Eviscerator.png"; Inventory.Amount 1; Inventory.MaxAmount 48; - Ammo.BackpackAmount 3; + Ammo.BackpackAmount 2; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -757,7 +761,7 @@ Class HellblazerMissiles : Ammo Inventory.Icon "graphics/HUD/Icons/A_HellblazerMissile.png"; Inventory.Amount 1; Inventory.MaxAmount 48; - Ammo.BackpackAmount 3; + Ammo.BackpackAmount 2; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -817,7 +821,7 @@ Class HellblazerCrackshots : Ammo Inventory.Icon "graphics/HUD/Icons/A_HellblazerCrackshot.png"; Inventory.Amount 1; Inventory.MaxAmount 30; - Ammo.BackpackAmount 2; + Ammo.BackpackAmount 1; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -856,7 +860,7 @@ Class HellblazerRavagers : Ammo Inventory.Icon "graphics/HUD/Icons/A_HellblazerRavager.png"; Inventory.Amount 1; Inventory.MaxAmount 18; - Ammo.BackpackAmount 1; + Ammo.BackpackAmount 0; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1373,7 +1377,7 @@ Class FabricatorTier1 : AmmoFabricator Tag "$T_FABRICATOR1"; Inventory.Icon "graphics/HUD/Icons/I_Fabricator1.png"; Inventory.PickupMessage "$T_FABRICATOR1"; - Inventory.MaxAmount 30; + Inventory.MaxAmount 20; AmmoFabricator.Budget 5000; AmmoFabricator.PerType 2; AmmoFabricator.MaxUnitPrice 2500; @@ -1389,7 +1393,7 @@ Class FabricatorTier2 : AmmoFabricator Tag "$T_FABRICATOR2"; Inventory.Icon "graphics/HUD/Icons/I_Fabricator2.png"; Inventory.PickupMessage "$T_FABRICATOR2"; - Inventory.MaxAmount 20; + Inventory.MaxAmount 15; AmmoFabricator.Budget 15000; AmmoFabricator.PerType 4; AmmoFabricator.MaxUnitPrice 10000; diff --git a/zscript/swwm_armor.zsc b/zscript/swwm_armor.zsc index b188dc065..fb684683a 100644 --- a/zscript/swwm_armor.zsc +++ b/zscript/swwm_armor.zsc @@ -28,7 +28,7 @@ Class ArmorNuggetItem : SWWMSpareArmor Default { Tag "$T_NUGGETA"; - Stamina 1000; + Stamina 300; Inventory.Icon "graphics/HUD/Icons/I_ArmorNugget.png"; Inventory.PickupMessage "$T_NUGGETA"; Inventory.MaxAmount 20; diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index 10aef8c5e..9ac015441 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -916,10 +916,10 @@ Class Wallbuster : SWWMWeapon Super.AttachToOwner(other); if ( !initialized ) { - // first wallbuster is fully loaded + // first wallbuster has five barrels loaded initialized = true; for ( int i=0; i<25; i++ ) - loaded[i] = "RedShell"; + loaded[i] = (i<5)?(Class)("RedShell"):null; for ( int i=0; i<25; i++ ) fired[i] = false; } @@ -1474,7 +1474,7 @@ Class Wallbuster : SWWMWeapon Weapon.SelectionOrder 400; Weapon.UpSound "wallbuster/select"; Weapon.AmmoType1 "RedShell"; - Weapon.AmmoGive1 25; + Weapon.AmmoGive1 5; Stamina 35000; +SWWMWEAPON.NOFIRSTGIVE; } diff --git a/zscript/swwm_deathlydeathcannon.zsc b/zscript/swwm_deathlydeathcannon.zsc index b1130c134..e61e13de0 100644 --- a/zscript/swwm_deathlydeathcannon.zsc +++ b/zscript/swwm_deathlydeathcannon.zsc @@ -328,7 +328,15 @@ Class YnykronImpact : Actor // voodoo dolls just get erased (how convenient) // otherwise instantly vaporize the fucker if ( tracer.player && (tracer.player.mo != tracer) ) tracer.Destroy(); - else tracer.DamageMobj(self,target,int.max,'Ynykron',DMG_FORCED|DMG_THRUSTLESS); + else if ( tracer.CountInv("GrilledCheeseSandwich") > 0 ) + { + // force use the sandwich + let gc = GrilledCheeseSandwich(tracer.FindInventory("GrilledCheeseSandwich")); + tracer.A_StartSound(gc.UseSound,CHAN_ITEMEXTRA); + gc.DoTheThing(true); + gc.Amount--; + } + else if ( !tracer.FindInventory("GrilledCheeseSafeguard") ) tracer.DamageMobj(self,target,int.max,'Ynykron',DMG_FORCED|DMG_THRUSTLESS); if ( tracer && (tracer.Health <= 0) ) { if ( tracer.player ) PlayerGone.FeckOff(tracer); @@ -1430,7 +1438,24 @@ Class YnykronSingularity : Actor // voodoo dolls just get erased (how convenient) // otherwise instantly vaporize the fucker if ( a.player && (a.player.mo != a) ) a.Destroy(); - else a.DamageMobj(self,a,int.max,'Ynykron',DMG_FORCED|DMG_THRUSTLESS); + else if ( a.CountInv("GrilledCheeseSandwich") > 0 ) + { + // force use the sandwich, warp to safe spot + let gc = GrilledCheeseSandwich(a.FindInventory("GrilledCheeseSandwich")); + Spawn("SWWMItemFog",a.Vec3Offset(0,0,a.Height/2)); + Vector3 safepos; + int safeangle; + if ( deathmatch ) [safepos, safeangle] = level.PickDeathmatchStart(); + else [safepos, safeangle] = level.PickPlayerStart(a.PlayerNumber()); + a.vel *= 0.; + a.SetOrigin(safepos,false); + a.angle = safeangle; + a.pitch = 0; + a.A_StartSound(gc.UseSound,CHAN_ITEMEXTRA); + gc.DoTheThing(true); + gc.Amount--; + } + else if ( !a.FindInventory("GrilledCheeseSafeguard") ) a.DamageMobj(self,a,int.max,'Ynykron',DMG_FORCED|DMG_THRUSTLESS); if ( a && (a.Health <= 0) ) { if ( a.player ) PlayerGone.FeckOff(a); diff --git a/zscript/swwm_handler.zsc b/zscript/swwm_handler.zsc index 99e07b906..ec82192dc 100644 --- a/zscript/swwm_handler.zsc +++ b/zscript/swwm_handler.zsc @@ -696,12 +696,12 @@ Class SWWMHandler : EventHandler if ( !playeringame[i] ) continue; if ( players[i].itemcount > lastitemcount[i] ) { - int score = 25*(players[i].itemcount-lastitemcount[i]); + int score = 10*(players[i].itemcount-lastitemcount[i]); if ( (level.total_items == level.found_items) && !allitems ) { allitems = true; - Console.Printf(StringTable.Localize("$SWWM_LASTITEM"),players[i].GetUserName(),2500); - score += 2475; + Console.Printf(StringTable.Localize("$SWWM_LASTITEM"),players[i].GetUserName(),500); + score += 490; } SWWMCredits.Give(players[i],score); SWWMScoreObj.Spawn(score,players[i].mo.Vec3Offset(0,0,players[i].mo.Height/2)); @@ -909,14 +909,14 @@ Class SWWMHandler : EventHandler s.mkill = multilevel[pnum]+1; lastkill[pnum] = level.maptime; // scoring - int score = min(1000,int(ceil(e.Thing.SpawnHealth()*.25)*10)); + int score = min(1000,int(ceil(e.Thing.SpawnHealth()*.05)*10)); SWWMScoreObj scr = null; if ( e.DamageSource.player == players[consoleplayer] ) scr = SWWMScoreObj.Spawn(score,e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); int ofs = 0; if ( e.DamageType == 'Push' ) { - score += 1000; + score += 500; if ( scr ) { scr.xscore[ofs] = 0; @@ -925,9 +925,9 @@ Class SWWMHandler : EventHandler scr.xcnt = ++ofs; } } - if ( ((e.Thing.Health <= e.Thing.GetGibHealth()) || (e.DamageSource.bEXTREMEDEATH) || (e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageType == 'Extreme')) && !e.DamageSource.bNOEXTREMEDEATH && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH) ) + if ( (e.Damage >= e.Thing.GetSpawnHealth()*2) || (((e.Thing.Health <= e.Thing.GetGibHealth()) || (e.DamageSource.bEXTREMEDEATH) || (e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageType == 'Extreme')) && !e.DamageSource.bNOEXTREMEDEATH && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH)) ) { - score = int(score*1.25); + score *= 2; if ( scr ) { scr.xscore[ofs] = 0; @@ -963,7 +963,7 @@ Class SWWMHandler : EventHandler } if ( e.Thing.bBOSS ) { - score += 5000; + score += 2000; if ( scr ) { scr.xscore[ofs] = 0; @@ -977,9 +977,9 @@ Class SWWMHandler : EventHandler if ( (level.killed_monsters+1 == level.total_monsters) && !allkills ) { allkills = true; - SWWMCredits.Give(e.DamageSource.player,2000); - Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),e.DamageSource.player.GetUserName(),2000); - SWWMScoreObj.Spawn(2000,e.DamageSource.Vec3Offset(0,0,e.DamageSource.Height/2)); + SWWMCredits.Give(e.DamageSource.player,1000); + Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),e.DamageSource.player.GetUserName(),1000); + SWWMScoreObj.Spawn(1000,e.DamageSource.Vec3Offset(0,0,e.DamageSource.Height/2)); } spreecount[pnum]++; if ( s && (spreecount[pnum] > s.skill) && !tookdamage[pnum] ) @@ -1195,29 +1195,8 @@ Class SWWMHandler : EventHandler } 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,14) ) - { - case 0: - case 1: - case 2: - e.Replacement = redpool[Random[Replacement](0,1)]; - break; - case 4: - case 5: - case 6: - e.Replacement = greenpool[Random[Replacement](0,1)]; - break; - case 7: - case 8: - e.Replacement = purplepool[0]; - break; - default: - e.Replacement = 'SWWMNothing'; - break; - } - } + else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) + e.Replacement = 'SWWMNothing'; else if ( (e.Replacee == 'Shell') || (e.Replacee is 'CrossbowAmmo') ) { switch( Random[Replacement](0,13) ) @@ -1285,14 +1264,14 @@ Class SWWMHandler : EventHandler } else if ( e.Replacee == 'ClipBox' ) { - if ( Random[Replacements](0,2) ) e.Replacement = 'EvisceratorShell'; + if ( Random[Replacements](0,3) ) e.Replacement = 'EvisceratorShell'; else if ( Random[Replacements](0,4) ) e.Replacement = 'EvisceratorTrioSpawn'; else e.Replacement = 'EvisceratorSixPack'; } else if ( e.Replacee == 'BlasterAmmo' ) e.Replacement = 'EvisceratorShell'; else if ( e.Replacee == 'BlasterHefty' ) { - if ( Random[Replacements](0,3) ) e.Replacement = 'EvisceratorTrioSpawn'; + if ( Random[Replacements](0,4) ) e.Replacement = 'EvisceratorTrioSpawn'; else e.Replacement = 'EvisceratorSixPack'; } else if ( (e.Replacee == 'RocketAmmo') || (e.Replacee == 'PhoenixRodAmmo') || (e.Replacee == 'MaceAmmo') ) @@ -1321,7 +1300,7 @@ Class SWWMHandler : EventHandler case 2: case 3: case 4: - if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerMissiles'; + if ( Random[Replacements](0,3) ) e.Replacement = 'HellblazerMissiles'; else if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerMissileTrioSpawn'; else e.Replacement = 'HellblazerMissileMag'; break; @@ -1329,7 +1308,7 @@ Class SWWMHandler : EventHandler case 6: case 7: case 8: - if ( Random[Replacements](0,3) ) e.Replacement = 'HellblazerCrackshots'; + if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerCrackshots'; else e.Replacement = 'HellblazerCrackshotMag'; break; case 9: @@ -1346,7 +1325,7 @@ Class SWWMHandler : EventHandler else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') ) { if ( Random[Replacements](0,3) ) e.Replacement = 'SparkUnit'; - else if ( !Random[Replacements](0,2) ) e.Replacement = 'CandyGunBullets'; + else if ( !Random[Replacements](0,3) ) e.Replacement = 'CandyGunBullets'; else e.Replacement = Random[Replacements](0,2)?'SilverBullets':'SilverBullets2'; } else if ( (e.Replacee == 'ArtiTeleport') || (e.Replacee == 'ArtiTeleportOther') ) @@ -1358,7 +1337,7 @@ Class SWWMHandler : EventHandler { if ( !Random[Replacements](0,2) ) { - if ( Random[Replacements](0,2) ) e.Replacement = Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn'; + if ( Random[Replacements](0,3) ) e.Replacement = Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn'; else e.Replacement = Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; } else if ( Random[Replacements](0,2) ) e.Replacement = 'CandyGunBulletsBundleSpawn'; @@ -1377,7 +1356,7 @@ Class SWWMHandler : EventHandler else if ( Random[Replacements](0,5) ) e.Replacement = 'HammerspaceEmbiggener'; else e.Replacement = 'GoldShell'; } - else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') || (e.Replacee == 'ArtiBlastRadius') ) e.Replacement = 'ArmorNuggetItem'; + else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') || (e.Replacee == 'ArtiBlastRadius') || (e.Replacee is 'ArtiPoisonBag') ) e.Replacement = 'ArmorNuggetItem'; else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'HealthNuggetItem'; else if ( e.Replacee == 'Stimpack' ) e.Replacement = 'TetraHealthItem'; else if ( e.Replacee == 'Medikit' ) e.Replacement = 'CubeHealthItem'; diff --git a/zscript/swwm_health.zsc b/zscript/swwm_health.zsc index 238022b46..039d75e03 100644 --- a/zscript/swwm_health.zsc +++ b/zscript/swwm_health.zsc @@ -3,7 +3,7 @@ Class HealthNugget : Health { Default { - Inventory.Amount 5; + Inventory.Amount 1; Inventory.MaxAmount 200; } } @@ -12,7 +12,7 @@ Class TetraHealth : Health { Default { - Inventory.Amount 15; + Inventory.Amount 10; Inventory.MaxAmount 100; } } @@ -21,7 +21,7 @@ Class CubeHealth : Health { Default { - Inventory.Amount 30; + Inventory.Amount 20; Inventory.MaxAmount 100; } } @@ -30,7 +30,7 @@ Class RefresherHealth : Health { Default { - Inventory.Amount 500; + Inventory.Amount 200; Inventory.MaxAmount 500; } override bool TryPickup( in out Actor other ) @@ -53,7 +53,7 @@ Class RefresherRegen : Powerup { Inventory.Icon "graphics/HUD/Icons/I_Refresher.png"; Powerup.Duration -60; - Powerup.Strength 5; + Powerup.Strength 10; } override void EndEffect() @@ -65,7 +65,7 @@ Class RefresherRegen : Powerup override void DoEffect() { Super.DoEffect(); - if ( Owner && (Owner.health > 0) && !(EffectTics%70) ) + if ( Owner && (Owner.health > 0) && !(EffectTics%175) ) { if ( Owner.GiveBody(int(Strength),500) ) { @@ -88,7 +88,7 @@ Class HealthNuggetItem : SWWMHealth Default { Tag "$T_NUGGETH"; - Stamina 1200; + Stamina 200; Inventory.Icon "graphics/HUD/Icons/I_HealthNugget.png"; Inventory.PickupMessage "$T_NUGGETH"; Inventory.MaxAmount 20; diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index 27df4ca8a..e17a789f4 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -1312,6 +1312,12 @@ Class SWWMWeapon : Weapon abstract if ( (AmmoGive2 <= 0) && (default.AmmoGive2 > 0) ) AmmoGive2 = 1; } + override bool SpecialDropAction( Actor dropper ) + { + if ( swwm_enemydrops ) return false; + // no weapon drops from enemies + return true; + } override Inventory CreateTossable( int amt ) { // disallow dropping if weapon isn't ready for switching diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index d78757df6..a9bcad95f 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -640,6 +640,7 @@ Class Demolitionist : PlayerPawn dir = dir/spd; Vector3 viewdir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); // look for things we could potentially bump into + // TODO check for wall/ceiling collision let bi = BlockThingsIterator.Create(self,500); bool bumped = false; bool raging = FindInventory("RagekitPower"); @@ -1385,13 +1386,13 @@ Class Demolitionist : PlayerPawn override bool OnGiveSecret( bool printmsg, bool playsound ) { if ( !player ) return false; - int score = 500; + int score = 100; // last secret (this is called before counting it up, so have to subtract) let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); if ( (level.found_secrets == level.total_secrets-1) && (!hnd || !hnd.allsecrets) ) { if ( hnd ) hnd.allsecrets = true; - score = 5000; + score = 1000; Console.Printf(StringTable.Localize("$SWWM_LASTSECRET"),player.GetUserName(),score); } else Console.Printf(StringTable.Localize("$SWWM_FINDSECRET"),player.GetUserName(),score); @@ -1411,10 +1412,10 @@ Class Demolitionist : PlayerPawn if ( (item is 'Key') && !key_reentrant && !deathmatch ) { // score - int score = 250; + int score = 100; Console.Printf(StringTable.Localize("$SWWM_FINDKEY"),player.GetUserName(),item.GetTag(),score); SWWMCredits.Give(player,score); - SWWMScoreObj.Spawn(250,Vec3Offset(0,0,Height/2)); + SWWMScoreObj.Spawn(100,Vec3Offset(0,0,Height/2)); if ( !swwm_sharekeys ) return; // share all keys in mp for ( int i=0; i 0 ) + { + if ( player.cmd.buttons&BT_ATTACK ) + return ResolveState("Refire"); + if ( player.cmd.buttons&BT_ALTATTACK ) + return ResolveState("AltRefire"); + } + return ResolveState(null); } - Goto Ready; + Goto Vent; + Refire: + XZW2 A 1; + XZW4 Y 3; + Goto Fire+3; + AltRefire: + XZW2 A 1; + XZW4 Y 3; + Goto AltFire+3; Vent: - XZW2 A 12 + XZW2 A 8 { A_Overlay(PSP_WEAPON+2,"VentFlash"); A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);