diff --git a/FuturePlans.md b/FuturePlans.md index 28029c790..807186b14 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -43,7 +43,7 @@ A couple extra weapons, not enough for a full batch, but still worthy additions. * **DLC Weaponset 2:** - [1] Hand of Divine *(Total Madness)* - Facepunching Extraordinaire *(Kill 300 enemies with the Hand of Divine)* - - [6] Sparkster x3 *(UnSX 2)* + - [7] Sparkster x3 *(UnSX 2)* - A Fine Sparking *(Kill 30 enemies at once with a Sparkster Rifle combo shot)* - [9] Mortal Rifle *(UnSX 2)* - Railed Hard *(Shoot through 16 enemies with a single Mortal Rifle overpressure shot)* diff --git a/gldefs.misc b/gldefs.misc index aaa8fad1b..9960d0c44 100644 --- a/gldefs.misc +++ b/gldefs.misc @@ -40,14 +40,25 @@ HardwareShader Texture "graphics/tempbg.png" HardwareShader Texture "graphics/SWWMGZLogo.png" { Shader "shaders/glsl/LogoAnimated.fp" - Define "TEX_SZ" = "vec2(2048.,1024.)" - Texture "LogoTex" "graphics/SWWMGZLogo_Layers.png" + // what no 2d arrays does to a mf + Texture "Layer1" "graphics/SWWMGZLogo_Layer1.png" + Texture "Layer2" "graphics/SWWMGZLogo_Layer2.png" + Texture "Layer3" "graphics/SWWMGZLogo_Layer3.png" + Texture "Layer4" "graphics/SWWMGZLogo_Layer4.png" + Texture "Layer5" "graphics/SWWMGZLogo_Layer5.png" + Texture "Layer6" "graphics/SWWMGZLogo_Layer6.png" } HardwareShader Texture "graphics/M_SWWM.png" { Shader "shaders/glsl/LogoAnimated.fp" - Define "TEX_SZ" = "vec2(256.,128.)" - Texture "LogoTex" "graphics/M_SWWM_Layers.png" + // what no 2d arrays does to a mf + Texture "Layer1" "graphics/M_SWWM_Layer1.png" + Texture "Layer2" "graphics/M_SWWM_Layer2.png" + Texture "Layer3" "graphics/M_SWWM_Layer3.png" + Texture "Layer4" "graphics/M_SWWM_Layer4.png" + Texture "Layer5" "graphics/M_SWWM_Layer5.png" + Texture "Layer6" "graphics/M_SWWM_Layer6.png" + Define "NO_BILINEAR" } HardwareShader Sprite "MBRNB0" { diff --git a/graphics/M_SWWM_Layer1.png b/graphics/M_SWWM_Layer1.png new file mode 100644 index 000000000..301d6b6e2 Binary files /dev/null and b/graphics/M_SWWM_Layer1.png differ diff --git a/graphics/M_SWWM_Layer2.png b/graphics/M_SWWM_Layer2.png new file mode 100644 index 000000000..6d61a520f Binary files /dev/null and b/graphics/M_SWWM_Layer2.png differ diff --git a/graphics/M_SWWM_Layer3.png b/graphics/M_SWWM_Layer3.png new file mode 100644 index 000000000..0f6cb7036 Binary files /dev/null and b/graphics/M_SWWM_Layer3.png differ diff --git a/graphics/M_SWWM_Layer4.png b/graphics/M_SWWM_Layer4.png new file mode 100644 index 000000000..4b423de2a Binary files /dev/null and b/graphics/M_SWWM_Layer4.png differ diff --git a/graphics/M_SWWM_Layer5.png b/graphics/M_SWWM_Layer5.png new file mode 100644 index 000000000..e3a1c1698 Binary files /dev/null and b/graphics/M_SWWM_Layer5.png differ diff --git a/graphics/M_SWWM_Layer6.png b/graphics/M_SWWM_Layer6.png new file mode 100644 index 000000000..a43598d03 Binary files /dev/null and b/graphics/M_SWWM_Layer6.png differ diff --git a/graphics/M_SWWM_Layers.png b/graphics/M_SWWM_Layers.png deleted file mode 100644 index 75773e5d2..000000000 Binary files a/graphics/M_SWWM_Layers.png and /dev/null differ diff --git a/graphics/SWWMGZLogo_Layer1.png b/graphics/SWWMGZLogo_Layer1.png new file mode 100644 index 000000000..17a8a6224 Binary files /dev/null and b/graphics/SWWMGZLogo_Layer1.png differ diff --git a/graphics/SWWMGZLogo_Layer2.png b/graphics/SWWMGZLogo_Layer2.png new file mode 100644 index 000000000..9aa13d25b Binary files /dev/null and b/graphics/SWWMGZLogo_Layer2.png differ diff --git a/graphics/SWWMGZLogo_Layer3.png b/graphics/SWWMGZLogo_Layer3.png new file mode 100644 index 000000000..88e434b15 Binary files /dev/null and b/graphics/SWWMGZLogo_Layer3.png differ diff --git a/graphics/SWWMGZLogo_Layer4.png b/graphics/SWWMGZLogo_Layer4.png new file mode 100644 index 000000000..d640a566e Binary files /dev/null and b/graphics/SWWMGZLogo_Layer4.png differ diff --git a/graphics/SWWMGZLogo_Layer5.png b/graphics/SWWMGZLogo_Layer5.png new file mode 100644 index 000000000..6e131dcbc Binary files /dev/null and b/graphics/SWWMGZLogo_Layer5.png differ diff --git a/graphics/SWWMGZLogo_Layer6.png b/graphics/SWWMGZLogo_Layer6.png new file mode 100644 index 000000000..94113170f Binary files /dev/null and b/graphics/SWWMGZLogo_Layer6.png differ diff --git a/graphics/SWWMGZLogo_Layers.png b/graphics/SWWMGZLogo_Layers.png deleted file mode 100644 index 27a98c955..000000000 Binary files a/graphics/SWWMGZLogo_Layers.png and /dev/null differ diff --git a/language.def_base b/language.def_base index ef7b1a5e9..254518ac6 100644 --- a/language.def_base +++ b/language.def_base @@ -809,9 +809,9 @@ TT_SHEENHMG = TT_QUADRAVOL = "\cfFire:\c- Shoot weapon.\n" "\cfAltfire:\c- Pump weapon.\n" -"\cfZoom:\c- Toggle spread mode.\n" "\cfReload:\c- Load cells.\n" -"\cfFire+Altfire:\c- Hold to slamfire."; +"\cfZoom+Fire:\c- Toggle spread mode.\n" +"\cfZoom+Altfire:\c- Switch firing stance."; TT_BLACKFIRE = "\cfFire:\c- Freeze thrower.\n" "\cfAltfire:\c- Icicle shot.\n" diff --git a/language.def_lore b/language.def_lore index c80ea4f28..7dbd26f19 100644 --- a/language.def_lore +++ b/language.def_lore @@ -1541,7 +1541,7 @@ SWWM_LORETXT_HEAVYMAHSHEENGUN = "\n" "How much bullet is too much bullet? The answer, according to \cfCyrus Enterprises\c-, is \"never enough\". The \cfSheen Heavy Machinegun\c- is a monstrosity in all aspects when it comes to delivering lead. Steadily feeding directly off \cfHammerspace™\c-, this puppy can be carried anywhere without the need to bring along hefty ammo boxes, ready to rain death upon anything on demand. Additionally, powered by \cfTach-Engine\c-'s \"Magdalene\" Microfusion battery, the weapon can stay in operation for several days without needing to recharge.\n" "\n" -"The ammunition employed by this weapon are AP rounds of 14.5x114mm caliber. Unlike the standard heavy ordnance rounds used within the Soviet Union, these are far more potent, employing an alloy of both mundane and exotic elements known as Meta-Tellubrium, generally used for fusion reactor parts due to its outstanding resilience to both extreme pressure and heat. As reported following the \cfGhoul Hunt\c- of 2007, this ammunition is quite effective in tearing through demon flesh as if it were jelly.\n" +"The ammunition employed by this weapon are AP rounds of 14.5x114mm caliber. Unlike the standard heavy ordnance rounds used within the Soviet Union, these are far more potent, employing an alloy of both mundane and exotic elements known as Meta-Telebrium, generally used for fusion reactor parts due to its outstanding resilience to both extreme pressure and heat. As reported following the \cfGhoul Hunt\c- of 2007, this ammunition is quite effective in tearing through demon flesh as if it were jelly.\n" "\n" "While generally meant for mounted use, on-the-go operation is possible, provided the user is equipped with silver-rated power armor at minimum in order to handle its heavy recoil.\n" "\n" @@ -2896,11 +2896,11 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfPrimary Fire:\c- Single, large fireball shot. Very minor drift, so its effective range is quite long. Ignites nearby targets on impact.\n" "\n" -"\cfSecondary Fire:\c- Pumps additional fuel, increasing the strength of your shots, but also their drift, making them less accurate. Excess overcharge will result in a wildly inaccurate misfire, but even this has its uses. Forcibly pumping in the middle of primary fire engages slamfire, allowing you to shoot rapid low-charge bursts.\n" +"\cfSecondary Fire:\c- Pumps additional fuel, increasing the strength of your shots, but also their drift, making them less accurate. Excess overcharge will result in a wildly inaccurate misfire, but even this has its uses.\n" "\n" -"\cfTertiary Fire:\c- Toggles a scatter shot mode for primary. Several smaller fireballs (number relative to charge), with increased drift and lower effective range, but very useful against multiple targets.\n" +"\cfTertiary Fire:\c- Hold and tap primary fire to toggle scatter shot mode for primary. Several smaller fireballs (number relative to charge), with increased drift and lower effective range, but very useful against multiple targets. Hold and tap secondary fire to switch weapon stances between two-handed and one-handed. This serves no real purpose other than looking cooler when pumping, your accuracy with the weapon is unaffected but you won't shoot it as quickly.\n" "\n" -"\cfReloading:\c- Insert up to five fuel cells into the weapon's tube magazine. Each cell is immediately ejected once it's been emptied into the weapon's internal \"crucible\", so you can hold additional ammo while keeping your charge.\n" +"\cfReloading:\c- Insert up to five fuel cells into the weapon's tube magazine. Each cell is immediately emptied into the weapon's internal \"crucible\", so you can keep loading additional ammo while boosting your charge.\n" "\n" "\cfTechniques:\c- The weapon has a certain \"extra effective\" special move should you be close enough to your target. Plunging the four bayonets into an enemy and immediately pulling the trigger afterwards will result in a potent point blank explosion that will send them flying, covered in flames.\n" "\n" @@ -2909,7 +2909,9 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfAnd of course it's huge af too, even if the grip is supposedly adapted. It honestly weirds me out how you can do that thing of... making your hands bigger, but at least it lets you use stuff like that easily.\c-\n" "\n" -"\cfAnyway, motherfucking fireballs, that work underwater??? Gonna need to see the science behind this because that makes no fucking sense and yet... it's there.\c-"; +"\cfAnyway, motherfucking fireballs, that work underwater??? Gonna need to see the science behind this because that makes no fucking sense and yet... it's there.\c-\n" +"\n" +"\cfBy the way, leverguns make me wild out. You know it, we all know it, they're just SO GOOD.\c-"; SWWM_LORETAG_RAFANKOS = "Rafan-Kos"; SWWM_LORETAB_RAFANKOS = "Item"; SWWM_LOREREL_RAFANKOS = "Nekuratek;Saya"; @@ -2927,11 +2929,11 @@ SWWM_LORETXT_RAFANKOS = "\n" "The weapon employs \cfKabbadon\c- as fuel, a common byproduct of \cfNokorokinylum\c- fusion, thus making it fairly easy to produce. However, the density and degree of purity required in the creation of a single fuel pod make its price escalate dramatically.\n" "\n" -"\cfPrimary Fire:\c- Release a radiant blast of energy that punches its way through anything, sending sparks flying in all directions along its path and burning other nearby targets. The blast burns for a total of five seconds before rapidly dissipating.\n" +"\cfPrimary Fire:\c- Release a radiant blast of energy that punches its way through anything, sending sparks flying in all directions along its path and burning other nearby targets. The blast burns for up to five seconds before rapidly dissipating.\n" "\n" -"\cfSecondary Fire:\c- Releases several scattered blasts in a wide cone, with similar destructive potential, but burning quicker, stronger, and dissipating much rapidly.\n" +"\cfSecondary Fire:\c- Releases several scattered blasts in a wide cone, with similar destructive potential, but burning quicker, stronger, and dissipating more rapidly.\n" "\n" -"\cfReload:\c- Loads in a new magazine, each holding four pods.\n" +"\cfReload:\c- Loads in a new magazine, each holding four pods. The currently loaded pod must be fully discharged before a new one can be chambered in.\n" "\n" "\cxSaya's Notes:\c-\n" "\cf\"Ultimate Weapon\"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c-\n" diff --git a/language.def_menu b/language.def_menu index 0db7664fc..2805964ba 100644 --- a/language.def_menu +++ b/language.def_menu @@ -371,7 +371,7 @@ TOOLTIP_EVENT_SWWMRESETCVARS = "Resets all the mod's settings to their original TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Erases all your archievement progress."; TOOLTIP_SWWM_NOINTERTIPS = "Hides intermission tips, in case you don't want to see them."; TOOLTIP_SWWM_DEMOSLAYER = "Killed enemies may drop health and armor orbs."; -TOOLTIP_SWWM_NETEVENT_SWWMCLEAREFFECTS = "Fades out any active blood, gore, debris and casings."; +TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Fades out any active blood, gore, debris and casings."; TOOLTIP_SWWMMINIMAPMENU = "Configure the minimap."; TOOLTIP_SWWMACHIEVEMENTMENU = "View your achievements."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap under the score counter."; diff --git a/language.es_base b/language.es_base index d9d9ec9ce..f6e16cf6a 100644 --- a/language.es_base +++ b/language.es_base @@ -699,9 +699,9 @@ TT_SHEENHMG = TT_QUADRAVOL = "\cfPrimario:\c- Disparar arma.\n" "\cfSecundario:\c- Bombear arma.\n" -"\cfZoom:\c- Alternar modo disperso.\n" "\cfRecarga:\c- Cargar células.\n" -"\cfPrimario+Secundario:\c- Mantener para disparo rápido."; +"\cfZoom+Primario:\c- Alternar modo disperso.\n" +"\cfZoom+Secundario:\c- Cambiar postura de arma."; TT_BLACKFIRE = "\cfPrimario:\c- Lanzafrío.\n" "\cfSecundario:\c- Disparo de carámbano.\n" diff --git a/language.es_lore b/language.es_lore index 36b08c891..34e3cf66b 100644 --- a/language.es_lore +++ b/language.es_lore @@ -1426,7 +1426,7 @@ SWWM_LORETXT_HEAVYMAHSHEENGUN = "\n" "¿Cuanta bala es demasiada bala? La respuesta, según \cfCyrus Enterprises\c-, es \"nunca suficiente\". La \cfAmetralladora Pesada Sheen\c- es una monstruosidad en todos los aspectos en lo referente a repartir plomo. Alimentada directamente desde \cfHammerspace™\c-, esta preciosidad se puede llevar a cualquier lado sin la necesidad de llevar encima pesadas cajas de munición, lista para diluviar muerte sobre cualquier cosa cuando se desee. Adicionalmente, teniendo la batería de Microfusión \"Magdalene\" de \cfTach-Engine\c-, el arma puede permanecer operativa durante días sin necesidad de recargarla.\n" "\n" -"La munición empleada por este arma son balas anti-armadura del calibre 14.5x114mm. A diferencia de la munición estándar para armería pesada empleada en la Unión Soviética, esta es mucho más potente, empleando una aleación de elementos tanto mundanos como exóticos conocida como Meta-Tellubrium, generalmente usada para piezas de reactores de fusión dada su excepcional resistencia tanto a presión como calor extremos. Tal y como fue reportado tras la \cfCaza de Ghouls\c- de 2007, esta munición es bastante efectiva atravesando carne demoníaca como si fuese gelatina.\n" +"La munición empleada por este arma son balas anti-armadura del calibre 14.5x114mm. A diferencia de la munición estándar para armería pesada empleada en la Unión Soviética, esta es mucho más potente, empleando una aleación de elementos tanto mundanos como exóticos conocida como Meta-Telebrium, generalmente usada para piezas de reactores de fusión dada su excepcional resistencia tanto a presión como calor extremos. Tal y como fue reportado tras la \cfCaza de Ghouls\c- de 2007, esta munición es bastante efectiva atravesando carne demoníaca como si fuese gelatina.\n" "\n" "Aunque generalmente ideada para el uso montado, la operación al paso es posible, siempre y cuando el usuario tenga una servoarmadura de grado plata como mínimo para manejar el potente retroceso.\n" "\n" @@ -2668,11 +2668,11 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfFuego Primario:\c- Disparo de gran bola de fuego. Desvío mucho menor, por lo que su rango efectivo es muy largo. Incendia objetivos cercanos al impactar.\n" "\n" -"\cfFuego Secundario:\c- Bombea combustible adicional, incrementando la potencia de tus disparos, pero también su desvío, haciéndolos menos precisos. La sobrecarga excesiva puede resultar en una imprecisa descarga accidental, pero incluso esto tiene sus usos. Forzar el bombeo mientras se usa el fuego primario realizará disparos en cadena rápidos de baja potencia.\n" +"\cfFuego Secundario:\c- Bombea combustible adicional, incrementando la potencia de tus disparos, pero también su desvío, haciéndolos menos precisos. La sobrecarga excesiva puede resultar en una imprecisa descarga accidental, pero incluso esto tiene sus usos.\n" "\n" -"\cfFuego Terciario:\c- Alterna el fuego primario a un modo de dispersión. Varias bolas de fuego menores (número relativo a la carga), con un desvío incrementado y rango efectivo menor, pero muy útil contra múltiples objetivos.\n" +"\cfFuego Terciario:\c- Mantén y pulsa fuego primario para alternar el modo de dispersión. Varias bolas de fuego menores (número relativo a la carga), con un desvío incrementado y rango efectivo menor, pero muy útil contra múltiples objetivos. Mantén y pulsa fuego secundario para alternar la postura de arma entre dos manos y una mano. Esto solo sirve para ser más vistoso al bombear, y no altera tu puntería pero si hace los disparos más lentos.\n" "\n" -"\cfRecarga:\c- Inserta hasta cinco células de combustible en el tubo del arma. Cada célula es expulsada inmediatamente tras ser vaciada en el \"crisol\" interno del arma, así que puedes almacenar munición adicional mientras mantienes la carga.\n" +"\cfRecarga:\c- Inserta hasta cinco células de combustible en el tubo del arma. Cada célula es vaciada immediatemente en el \"crisol\" interno del arma, así que puedes cargar munición adicional mientras incrementas la carga.\n" "\n" "\cfTécnicas:\c- El arma tiene un cierto movimiento especial \"extra efectivo\" si te encuentras a poca distancia de tu objetivo. Hundiendo las cuatro bayonetas en el enemigo e inmediatamente después apretando el gatillo resultará en una potente explosión a bocajarro que lo enviará volando, cubierto en llamas.\n" "\n" @@ -2681,7 +2681,9 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfY por supuesto es jodidamente enorme, también, aunque la empuñadura está supuestamente adaptada. En serio que se me hace rarísimo como puedes hacer eso de... agrandar las manos, pero al menos te permite usar cosas así fácilmente.\c-\n" "\n" -"\cfEn fin, putas bolas de fuego, ¿¿¿que funcionan bajo el agua??? Voy a tener que echarle un ojo a la ciencia detrás de esto porque eso no tiene puto sentido y aun así... está ahí.\c-"; +"\cfEn fin, putas bolas de fuego, ¿¿¿que funcionan bajo el agua??? Voy a tener que echarle un ojo a la ciencia detrás de esto porque eso no tiene puto sentido y aun así... está ahí.\c-\n" +"\n" +"\cfPor cierto, las armas de palanca me ponen a tope. Tú lo sabes, todos lo sabemos, es que son BUENÍSIMAS.\c-"; SWWM_LORETXT_RAFANKOS = "\cxDesignación:\c-\n" "\cf Rafan-Kos (\"Arma Definitiva\")\c-\n" @@ -2696,11 +2698,11 @@ SWWM_LORETXT_RAFANKOS = "\n" "El arma emplea \cfKabbadon\c- como combustible, un subproducto común de la fusión de \cfNokorokinylum\c-, haciéndolo así fácil de fabricar. Sin embargo, dada la densidad y pureza requeridas en la creación de una sola cápsula de combustible hacen que su precio escale dramáticamente.\n" "\n" -"\cfFuego Primario:\c- Libera un radiante estallido de energía que se abre paso a través de todo, soltando chispas en todas direcciones a su paso y quemando objetivos cercanos. El estallido arde durante un total de cinco segundos antes de disiparse rápidamente.\n" +"\cfFuego Primario:\c- Libera un radiante estallido de energía que se abre paso a través de todo, soltando chispas en todas direcciones a su paso y quemando objetivos cercanos. El estallido arde durante un máximo de cinco segundos antes de disiparse rápidamente.\n" "\n" "\cfFuego Secundario:\c- Libera varios estallidos dispersos en un cono amplio, con un potencial destructivo similar, pero ardiendo más rápido, con mayor intensidad, y disipándose mucho antes.\n" "\n" -"\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas.\n" +"\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas. La cápsula cargada debe gastarse completamente antes de poder insertar una nueva en la recámara.\n" "\n" "\cxNotas de Saya:\c-\n" "\cf¿\"Arma Definitiva\"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c-\n" diff --git a/language.es_menu b/language.es_menu index af620de30..be8deaa38 100644 --- a/language.es_menu +++ b/language.es_menu @@ -370,7 +370,7 @@ TOOLTIP_EVENT_SWWMRESETCVARS = "Resetea todas las opciones del mod a sus valores TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Borra todo tu progreso de logros."; TOOLTIP_SWWM_NOINTERTIPS = "Oculta los consejos de intermisión, por si no quieres verlos."; TOOLTIP_SWWM_DEMOSLAYER = "Los enemigos que mates soltarán orbes de salud y armadura."; -TOOLTIP_SWWM_NETEVENT_SWWMCLEAREFFECTS = "Desvanece cualquier sangre, vísceras, escombros y casquillos activos."; +TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Desvanece cualquier sangre, vísceras, escombros y casquillos activos."; TOOLTIP_SWWMMINIMAPMENU = "Configura el minimapa."; TOOLTIP_SWWMACHIEVEMENTMENU = "Revisa tus logros."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa bajo el contador de puntuación."; diff --git a/language.version b/language.version index 6165850b2..432652d57 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1.43 r1 \cu(Tue 30 Nov 19:05:06 CET 2021)\c-"; -SWWM_SHORTVER="\cw1.1.43 r1 \cu(2021-11-30 19:05:06)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1.44 \cu(Wed 8 Dec 18:17:41 CET 2021)\c-"; +SWWM_SHORTVER="\cw1.1.44 \cu(2021-12-08 18:17:41)\c-"; diff --git a/lore/default/heavymahsheengun.txt b/lore/default/heavymahsheengun.txt index 6cee88ee8..8067790c5 100644 --- a/lore/default/heavymahsheengun.txt +++ b/lore/default/heavymahsheengun.txt @@ -14,7 +14,7 @@ TXT How much bullet is too much bullet? The answer, according to **Cyrus Enterprises**, is "never enough". The **Sheen Heavy Machinegun** is a monstrosity in all aspects when it comes to delivering lead. Steadily feeding directly off **Hammerspace™**, this puppy can be carried anywhere without the need to bring along hefty ammo boxes, ready to rain death upon anything on demand. Additionally, powered by **Tach-Engine**'s "Magdalene" Microfusion battery, the weapon can stay in operation for several days without needing to recharge. -The ammunition employed by this weapon are AP rounds of 14.5x114mm caliber. Unlike the standard heavy ordnance rounds used within the Soviet Union, these are far more potent, employing an alloy of both mundane and exotic elements known as Meta-Tellubrium, generally used for fusion reactor parts due to its outstanding resilience to both extreme pressure and heat. As reported following the **Ghoul Hunt** of 2007, this ammunition is quite effective in tearing through demon flesh as if it were jelly. +The ammunition employed by this weapon are AP rounds of 14.5x114mm caliber. Unlike the standard heavy ordnance rounds used within the Soviet Union, these are far more potent, employing an alloy of both mundane and exotic elements known as Meta-Telebrium, generally used for fusion reactor parts due to its outstanding resilience to both extreme pressure and heat. As reported following the **Ghoul Hunt** of 2007, this ammunition is quite effective in tearing through demon flesh as if it were jelly. While generally meant for mounted use, on-the-go operation is possible, provided the user is equipped with silver-rated power armor at minimum in order to handle its heavy recoil. diff --git a/lore/default/quadravol.txt b/lore/default/quadravol.txt index 93d8e1343..b7d03f1ea 100644 --- a/lore/default/quadravol.txt +++ b/lore/default/quadravol.txt @@ -24,11 +24,11 @@ The Ardent Cross was the name of the general's sword which, when imbued with mag \cfPrimary Fire:\c- Single, large fireball shot. Very minor drift, so its effective range is quite long. Ignites nearby targets on impact. -\cfSecondary Fire:\c- Pumps additional fuel, increasing the strength of your shots, but also their drift, making them less accurate. Excess overcharge will result in a wildly inaccurate misfire, but even this has its uses. Forcibly pumping in the middle of primary fire engages slamfire, allowing you to shoot rapid low-charge bursts. +\cfSecondary Fire:\c- Pumps additional fuel, increasing the strength of your shots, but also their drift, making them less accurate. Excess overcharge will result in a wildly inaccurate misfire, but even this has its uses. -\cfTertiary Fire:\c- Toggles a scatter shot mode for primary. Several smaller fireballs (number relative to charge), with increased drift and lower effective range, but very useful against multiple targets. +\cfTertiary Fire:\c- Hold and tap primary fire to toggle scatter shot mode for primary. Several smaller fireballs (number relative to charge), with increased drift and lower effective range, but very useful against multiple targets. Hold and tap secondary fire to switch weapon stances between two-handed and one-handed. This serves no real purpose other than looking cooler when pumping, your accuracy with the weapon is unaffected but you won't shoot it as quickly. -\cfReloading:\c- Insert up to five fuel cells into the weapon's tube magazine. Each cell is immediately ejected once it's been emptied into the weapon's internal "crucible", so you can hold additional ammo while keeping your charge. +\cfReloading:\c- Insert up to five fuel cells into the weapon's tube magazine. Each cell is immediately emptied into the weapon's internal "crucible", so you can keep loading additional ammo while boosting your charge. \cfTechniques:\c- The weapon has a certain "extra effective" special move should you be close enough to your target. Plunging the four bayonets into an enemy and immediately pulling the trigger afterwards will result in a potent point blank explosion that will send them flying, covered in flames. @@ -38,3 +38,5 @@ The Ardent Cross was the name of the general's sword which, when imbued with mag \cfAnd of course it's huge af too, even if the grip is supposedly adapted. It honestly weirds me out how you can do that thing of... making your hands bigger, but at least it lets you use stuff like that easily.\c- \cfAnyway, motherfucking fireballs, that work underwater??? Gonna need to see the science behind this because that makes no fucking sense and yet... it's there.\c- + +\cfBy the way, leverguns make me wild out. You know it, we all know it, they're just SO GOOD.\c- diff --git a/lore/default/rafankos.txt b/lore/default/rafankos.txt index 87a0b3b02..402ab066e 100644 --- a/lore/default/rafankos.txt +++ b/lore/default/rafankos.txt @@ -18,11 +18,11 @@ The **Rafan-Kos** project ("Ultimate Weapon" in Nukuribaku) would only be partia The weapon employs **Kabbadon** as fuel, a common byproduct of **Nokorokinylum** fusion, thus making it fairly easy to produce. However, the density and degree of purity required in the creation of a single fuel pod make its price escalate dramatically. -\cfPrimary Fire:\c- Release a radiant blast of energy that punches its way through anything, sending sparks flying in all directions along its path and burning other nearby targets. The blast burns for a total of five seconds before rapidly dissipating. +\cfPrimary Fire:\c- Release a radiant blast of energy that punches its way through anything, sending sparks flying in all directions along its path and burning other nearby targets. The blast burns for up to five seconds before rapidly dissipating. -\cfSecondary Fire:\c- Releases several scattered blasts in a wide cone, with similar destructive potential, but burning quicker, stronger, and dissipating much rapidly. +\cfSecondary Fire:\c- Releases several scattered blasts in a wide cone, with similar destructive potential, but burning quicker, stronger, and dissipating more rapidly. -\cfReload:\c- Loads in a new magazine, each holding four pods. +\cfReload:\c- Loads in a new magazine, each holding four pods. The currently loaded pod must be fully discharged before a new one can be chambered in. \cxSaya's Notes:\c- \cf"Ultimate Weapon"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c- diff --git a/lore/es/heavymahsheengun.txt b/lore/es/heavymahsheengun.txt index bbf193574..afce84901 100644 --- a/lore/es/heavymahsheengun.txt +++ b/lore/es/heavymahsheengun.txt @@ -10,7 +10,7 @@ TXT ¿Cuanta bala es demasiada bala? La respuesta, según **Cyrus Enterprises**, es "nunca suficiente". La **Ametralladora Pesada Sheen** es una monstruosidad en todos los aspectos en lo referente a repartir plomo. Alimentada directamente desde **Hammerspace™**, esta preciosidad se puede llevar a cualquier lado sin la necesidad de llevar encima pesadas cajas de munición, lista para diluviar muerte sobre cualquier cosa cuando se desee. Adicionalmente, teniendo la batería de Microfusión "Magdalene" de **Tach-Engine**, el arma puede permanecer operativa durante días sin necesidad de recargarla. -La munición empleada por este arma son balas anti-armadura del calibre 14.5x114mm. A diferencia de la munición estándar para armería pesada empleada en la Unión Soviética, esta es mucho más potente, empleando una aleación de elementos tanto mundanos como exóticos conocida como Meta-Tellubrium, generalmente usada para piezas de reactores de fusión dada su excepcional resistencia tanto a presión como calor extremos. Tal y como fue reportado tras la **Caza de Ghouls** de 2007, esta munición es bastante efectiva atravesando carne demoníaca como si fuese gelatina. +La munición empleada por este arma son balas anti-armadura del calibre 14.5x114mm. A diferencia de la munición estándar para armería pesada empleada en la Unión Soviética, esta es mucho más potente, empleando una aleación de elementos tanto mundanos como exóticos conocida como Meta-Telebrium, generalmente usada para piezas de reactores de fusión dada su excepcional resistencia tanto a presión como calor extremos. Tal y como fue reportado tras la **Caza de Ghouls** de 2007, esta munición es bastante efectiva atravesando carne demoníaca como si fuese gelatina. Aunque generalmente ideada para el uso montado, la operación al paso es posible, siempre y cuando el usuario tenga una servoarmadura de grado plata como mínimo para manejar el potente retroceso. diff --git a/lore/es/quadravol.txt b/lore/es/quadravol.txt index 930b87f12..4ca4dc451 100644 --- a/lore/es/quadravol.txt +++ b/lore/es/quadravol.txt @@ -18,11 +18,11 @@ La Cruz Ardiente era el nombre de la espada del general la cual, al ser imbuida \cfFuego Primario:\c- Disparo de gran bola de fuego. Desvío mucho menor, por lo que su rango efectivo es muy largo. Incendia objetivos cercanos al impactar. -\cfFuego Secundario:\c- Bombea combustible adicional, incrementando la potencia de tus disparos, pero también su desvío, haciéndolos menos precisos. La sobrecarga excesiva puede resultar en una imprecisa descarga accidental, pero incluso esto tiene sus usos. Forzar el bombeo mientras se usa el fuego primario realizará disparos en cadena rápidos de baja potencia. +\cfFuego Secundario:\c- Bombea combustible adicional, incrementando la potencia de tus disparos, pero también su desvío, haciéndolos menos precisos. La sobrecarga excesiva puede resultar en una imprecisa descarga accidental, pero incluso esto tiene sus usos. -\cfFuego Terciario:\c- Alterna el fuego primario a un modo de dispersión. Varias bolas de fuego menores (número relativo a la carga), con un desvío incrementado y rango efectivo menor, pero muy útil contra múltiples objetivos. +\cfFuego Terciario:\c- Mantén y pulsa fuego primario para alternar el modo de dispersión. Varias bolas de fuego menores (número relativo a la carga), con un desvío incrementado y rango efectivo menor, pero muy útil contra múltiples objetivos. Mantén y pulsa fuego secundario para alternar la postura de arma entre dos manos y una mano. Esto solo sirve para ser más vistoso al bombear, y no altera tu puntería pero si hace los disparos más lentos. -\cfRecarga:\c- Inserta hasta cinco células de combustible en el tubo del arma. Cada célula es expulsada inmediatamente tras ser vaciada en el "crisol" interno del arma, así que puedes almacenar munición adicional mientras mantienes la carga. +\cfRecarga:\c- Inserta hasta cinco células de combustible en el tubo del arma. Cada célula es vaciada immediatemente en el "crisol" interno del arma, así que puedes cargar munición adicional mientras incrementas la carga. \cfTécnicas:\c- El arma tiene un cierto movimiento especial "extra efectivo" si te encuentras a poca distancia de tu objetivo. Hundiendo las cuatro bayonetas en el enemigo e inmediatamente después apretando el gatillo resultará en una potente explosión a bocajarro que lo enviará volando, cubierto en llamas. @@ -32,3 +32,5 @@ La Cruz Ardiente era el nombre de la espada del general la cual, al ser imbuida \cfY por supuesto es jodidamente enorme, también, aunque la empuñadura está supuestamente adaptada. En serio que se me hace rarísimo como puedes hacer eso de... agrandar las manos, pero al menos te permite usar cosas así fácilmente.\c- \cfEn fin, putas bolas de fuego, ¿¿¿que funcionan bajo el agua??? Voy a tener que echarle un ojo a la ciencia detrás de esto porque eso no tiene puto sentido y aun así... está ahí.\c- + +\cfPor cierto, las armas de palanca me ponen a tope. Tú lo sabes, todos lo sabemos, es que son BUENÍSIMAS.\c- diff --git a/lore/es/rafankos.txt b/lore/es/rafankos.txt index b5b231aaa..78fdbc032 100644 --- a/lore/es/rafankos.txt +++ b/lore/es/rafankos.txt @@ -12,11 +12,11 @@ El proyecto **Rafan-Kos** ("Arma Definitiva" en Nukuribaku) solo sería completa El arma emplea **Kabbadon** como combustible, un subproducto común de la fusión de **Nokorokinylum**, haciéndolo así fácil de fabricar. Sin embargo, dada la densidad y pureza requeridas en la creación de una sola cápsula de combustible hacen que su precio escale dramáticamente. -\cfFuego Primario:\c- Libera un radiante estallido de energía que se abre paso a través de todo, soltando chispas en todas direcciones a su paso y quemando objetivos cercanos. El estallido arde durante un total de cinco segundos antes de disiparse rápidamente. +\cfFuego Primario:\c- Libera un radiante estallido de energía que se abre paso a través de todo, soltando chispas en todas direcciones a su paso y quemando objetivos cercanos. El estallido arde durante un máximo de cinco segundos antes de disiparse rápidamente. \cfFuego Secundario:\c- Libera varios estallidos dispersos en un cono amplio, con un potencial destructivo similar, pero ardiendo más rápido, con mayor intensidad, y disipándose mucho antes. -\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas. +\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas. La cápsula cargada debe gastarse completamente antes de poder insertar una nueva en la recámara. \cxNotas de Saya:\c- \cf¿"Arma Definitiva"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c- diff --git a/menudef.txt b/menudef.txt index 0121dfc5b..cd32773d5 100644 --- a/menudef.txt +++ b/menudef.txt @@ -210,7 +210,10 @@ OptionMenu "SWWMOptionMenu" StaticText " " StaticText "$SWWM_MCTITLE", "Blue" Option "$SWWM_LDSPOIL", "swwm_ldspoil", "YesNo" - Option "$SWWM_DRLASKILL", "swwm_drlaskill", "SWWMDRLASkill" + IfGame(Doom) + { + Option "$SWWM_DRLASKILL", "swwm_drlaskill", "SWWMDRLASkill" + } StaticText " " StaticText " " diff --git a/shaders/glsl/LogoAnimated.fp b/shaders/glsl/LogoAnimated.fp index ce8e2e900..afd150b92 100644 --- a/shaders/glsl/LogoAnimated.fp +++ b/shaders/glsl/LogoAnimated.fp @@ -5,36 +5,24 @@ const float pi = 3.14159265358979323846; vec2 warpcoord( in vec2 uv ) { - vec2 offset = vec2(0,0); + vec2 offset; offset.y = sin(pi*2.*(uv.x*8.+timer*.25))*.005; offset.x = cos(pi*2.*(uv.y*4.+timer*.25))*.005; - return fract(uv+offset); + return uv+offset; } // based on gimp color to alpha, but simplified vec4 blacktoalpha( in vec4 src ) { vec4 dst = src; - float dist = 0., alpha = 0.; - float d, a; + float alpha = 0.; + float a; a = clamp(dst.r,0.,1.); - if ( a > alpha ) - { - alpha = a; - dist = d; - } + if ( a > alpha ) alpha = a; a = clamp(dst.g,0.,1.); - if ( a > alpha ) - { - alpha = a; - dist = d; - } + if ( a > alpha ) alpha = a; a = clamp(dst.b,0.,1.); - if ( a > alpha ) - { - alpha = a; - dist = d; - } + if ( a > alpha ) alpha = a; if ( alpha > 0. ) { float ainv = 1./alpha; @@ -43,30 +31,49 @@ vec4 blacktoalpha( in vec4 src ) dst.a *= alpha; return dst; } +#ifdef NO_BILINEAR +#define BilinearSample(x,y,z,w) texture(x,y) +#else +vec4 BilinearSample( in sampler2D tex, in vec2 pos, in vec2 size, in vec2 pxsize ) +{ + vec2 f = fract(pos*size); + pos += (.5-f)*pxsize; + vec4 p0q0 = texture(tex,pos); + vec4 p1q0 = texture(tex,pos+vec2(pxsize.x,0)); + vec4 p0q1 = texture(tex,pos+vec2(0,pxsize.y)); + vec4 p1q1 = texture(tex,pos+vec2(pxsize.x,pxsize.y)); + vec4 pInterp_q0 = mix(p0q0,p1q0,f.x); + vec4 pInterp_q1 = mix(p0q1,p1q1,f.x); + return mix(pInterp_q0,pInterp_q1,f.y); +} +#endif void SetupMaterial( inout Material mat ) { + // store these to save some time + vec2 size = vec2(textureSize(Layer1,0)); + vec2 pxsize = 1./size; // y'all ready for this multilayered madness? vec2 uv = vTexCoord.st; - // base blank layer, copy - vec4 base = texture(LogoTex,uv*vec2(.5,.25)); + // base blank layer + vec4 base = vec4(0.,0.,0.,1.); // first layer, blend - vec4 tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(0.,.25)); + vec4 tmp = BilinearSample(Layer1,uv,size,pxsize); base.rgb = mix(base.rgb,tmp.rgb,tmp.a); // second layer, warp then add - tmp = texture(LogoTex,warpcoord(uv)*vec2(.5,.25)+vec2(0.,.5)); + tmp = BilinearSample(Layer2,warpcoord(uv),size,pxsize); base.rgb += tmp.rgb; // third layer, multiply - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(0.,.75)); + tmp = BilinearSample(Layer3,uv,size,pxsize); base.rgb *= tmp.rgb; // fourth layer, add - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(.5,0.)); + tmp = BilinearSample(Layer4,uv,size,pxsize); base.rgb += tmp.rgb; // fifth layer, add - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(.5,.25)); + tmp = BilinearSample(Layer5,uv,size,pxsize); base.rgb += tmp.rgb; - // sixth layer, overlay (w/ alpha blend) - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(.5,.5)); + // first layer again, overlay (w/ alpha blend) + tmp = BilinearSample(Layer1,uv,size,pxsize); vec4 tmp2; tmp2.r = overlay(base.r,tmp.r); tmp2.g = overlay(base.g,tmp.g); @@ -75,22 +82,13 @@ void SetupMaterial( inout Material mat ) // black to alpha base = blacktoalpha(base); // add alpha of first layer - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(0.,.25)); - base.a += tmp.a; + base.a += BilinearSample(Layer1,uv,size,pxsize).a; // clamp - base = clamp(base,0.,1.); - // seventh layer, alpha blend - tmp = texture(LogoTex,uv*vec2(.5,.25)+vec2(.5,.75)); + base = clamp(base,vec4(0.),vec4(1.)); + // sixth layer, alpha blend + tmp = BilinearSample(Layer6,uv,size,pxsize); tmp2.a = tmp.a+base.a*(1-tmp.a); tmp2.rgb = (tmp.rgb*tmp.a+base.rgb*base.a*(1-tmp.a))/tmp2.a; - if ( tmp2.a == 0. ) tmp2.rgb = vec3(0.); - // clamp borders - vec2 sz = TEX_SZ; - vec2 px = uv*sz; - if ( (px.x <= 1) || (px.x >= (sz.x-1)) || (px.y <= 1) || (px.y >= (sz.y-1)) ) - tmp2 = vec4(0.); // ding, logo's done mat.Base = tmp2; - mat.Normal = ApplyNormalMap(vTexCoord.st); } - diff --git a/sndinfo.txt b/sndinfo.txt index b28001fe2..61341e81f 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -1053,6 +1053,7 @@ $limit powerup/divinehit 16 powerup/divineend sounds/items/diviend.ogg powerup/tetheruse sounds/items/tetheruse.ogg powerup/tetherfail sounds/items/tetherfail.ogg +powerup/tethererror sounds/items/tethererror.ogg mykradvo/arc1 sounds/items/mykrarc1.ogg mykradvo/arc2 sounds/items/mykrarc2.ogg diff --git a/zmapinfo.txt b/zmapinfo.txt index 1039d2880..1443edbaa 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -103,7 +103,12 @@ GameInfo "PsykkonovexxGesture" // really damn big textures PrecacheTextures = "graphics/SWWMGZLogo.png", - "graphics/SWWMGZLogo_Layers.png" + "graphics/SWWMGZLogo_Layer1.png", + "graphics/SWWMGZLogo_Layer2.png", + "graphics/SWWMGZLogo_Layer3.png", + "graphics/SWWMGZLogo_Layer4.png", + "graphics/SWWMGZLogo_Layer5.png", + "graphics/SWWMGZLogo_Layer6.png" } ClearSkills diff --git a/zscript/dlc2/swwm_blueballs.zsc b/zscript/dlc2/swwm_blueballs.zsc index 0e5f379c2..6174dbada 100644 --- a/zscript/dlc2/swwm_blueballs.zsc +++ b/zscript/dlc2/swwm_blueballs.zsc @@ -1,5 +1,5 @@ // Tach-Engine & Nekuratek Sparkster x3 (from UnSX 2) -// Slot 6, spawns shared with Hellblazer +// Slot 7, spawns shared with Biospark Carbine Class ModernSparkster : SWWMWeapon { @@ -19,7 +19,7 @@ Class ModernSparkster : SWWMWeapon Obituary "$O_NEWSPARKSTER"; SWWMWeapon.Tooltip "$TT_NEWSPARKSTER"; Inventory.Icon "graphics/HUD/Icons/W_NewSparkster.png"; - Weapon.SlotNumber 6; + Weapon.SlotNumber 7; Weapon.SlotPriority 3.; Weapon.SelectionOrder 625; Weapon.AmmoType1 "SparksterBAmmo"; diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index 5c590c16d..d856fa84e 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -18,7 +18,9 @@ extend Class SWWMHandler { if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') ) return; - double val = max(.5,swwm_mm_zoom/2.); + double val = swwm_mm_zoom; + if ( val > 1. ) val = max(1.,val-.5); + else val = max(.5,val-.25); CVar.FindCVar('swwm_mm_zoom').SetFloat(val); } else if ( e.Name ~== "swwmzoomout" ) @@ -26,7 +28,9 @@ extend Class SWWMHandler if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') ) return; double maxval = players[consoleplayer].mo.FindInventory("Omnisight")?2.:1.; - double val = min(maxval,swwm_mm_zoom*2.); + double val = swwm_mm_zoom; + if ( val >= 1. ) val = min(maxval,val+.5); + else val = min(1.,val+.25); CVar.FindCVar('swwm_mm_zoom').SetFloat(val); } } diff --git a/zscript/handler/swwm_handler_replacements.zsc b/zscript/handler/swwm_handler_replacements.zsc index 2f2b69241..09ecb89db 100644 --- a/zscript/handler/swwm_handler_replacements.zsc +++ b/zscript/handler/swwm_handler_replacements.zsc @@ -616,9 +616,9 @@ extend Class SWWMHandler else if ( (e.Replacee is 'Chainsaw') || (e.Replacee is 'Gauntlets') || (e.Replacee is 'FWeapAxe') ) e.Replacement = SWWMUtility.PickSWWMSlot1(); 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 = SWWMUtility.PickSWWMSlot2(); - else if ( (e.Replacee is 'Shotgun') || (e.Replacee is 'CWeapStaff') ) e.Replacement = SWWMUtility.IsDoomOne()?SWWMUtility.PickHereticSlot3():SWWMUtility.PickSWWMSlot3(); + else if ( (e.Replacee is 'Shotgun') || (e.Replacee is 'CWeapStaff') ) e.Replacement = SWWMUtility.IsDoomOne()?SWWMUtility.PickDoomSlot3():SWWMUtility.PickSWWMSlot3(); else if ( (e.Replacee is 'SuperShotgun') || (e.Replacee is 'MWeapFrost') ) e.Replacement = SWWMUtility.PickSWWMSlot4(); - else if ( e.Replacee is 'Crossbow' ) e.Replacement = SWWMUtility.PickHereticSlot3(); + else if ( e.Replacee is 'Crossbow' ) e.Replacement = SWWMUtility.PickDoomSlot3(); else if ( (e.Replacee is 'Chaingun') || (e.Replacee is 'Blaster') || (e.Replacee is 'FWeaponPiece3') ) e.Replacement = SWWMUtility.PickSWWMSlot5(); else if ( (e.Replacee is 'RocketLauncher') || (e.Replacee is 'PhoenixRod') || (e.Replacee is 'FWeapHammer') ) e.Replacement = SWWMUtility.PickSWWMSlot6(); else if ( (e.Replacee is 'PlasmaRifle') || (e.Replacee is 'SkullRod') ) e.Replacement = SWWMUtility.PickDoomSlot6(); diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 35f953cb3..25ef5a965 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -207,17 +207,6 @@ Class SWWMAmmo : Ammo return Super.HandlePickup(item); } - override void DoEffect() - { - Super.DoEffect(); - // drop excess ammo - if ( !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo') ) - { - int excess = Amount-MaxAmount; - if ( excess > 0 ) CreateTossable(excess); - } - } - override bool CanPickup( Actor toucher ) { // don't allow picking up ammo for weapons we can't pick up @@ -486,12 +475,6 @@ Class MagAmmo : Inventory abstract override void DoEffect() { Super.DoEffect(); - // drop excess ammo - if ( !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo') ) - { - int excess = Amount-MaxAmount; - if ( excess > 0 ) CreateTossable(excess); - } if ( !pamo ) { pamo = Ammo(Owner.FindInventory(ParentAmmo)); diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc index f28d0d561..152ad99c4 100644 --- a/zscript/items/swwm_powerups.zsc +++ b/zscript/items/swwm_powerups.zsc @@ -2174,6 +2174,33 @@ Class BarrierPower : PowerIronFeet if ( !snd ) snd = Spawn("BarrierSnd",Owner.pos); snd.target = Owner; snd.master = self; + // break ourselves if we're in an endlevel sector + bool endlv = false; + for ( int i=0; i= (Owner.pos.z+Owner.Height) ) continue; + if ( !(ff.model.flags&Sector.SECF_ENDLEVEL) ) continue; + endlv = true; + break; + } + if ( !endlv && (Owner.pos.z <= Owner.floorz) ) + { + bool damageterrain = false; + if ( (Owner.floorsector.damageamount > 0) && (Owner.floorsector.damageinterval > 0) ) damageterrain = true; + else + { + let t = Owner.GetFloorTerrain(); + if ( t && (t.DamageAmount > 0) && (t.DamageTimeMask > 0) ) + damageterrain = true; + } + if ( damageterrain && (Owner.floorsector.flags&Sector.SECF_ENDLEVEL) ) endlv = true; + } + if ( !endlv ) return; + EffectTics = min(0,EffectTics); } } @@ -2226,6 +2253,7 @@ Class EBarrier : Inventory override void DoEffect() { Super.DoEffect(); + if ( !Owner || (Owner.Health <= 0) ) return; // check terrain for auto-use let b = Powerup(Owner.FindInventory("BarrierPower")); if ( b && (b.EffectTics > 5) ) @@ -2234,6 +2262,7 @@ Class EBarrier : Inventory return; } bool damageterrain = false; + bool endlevelterrain = false; // check any 3d floors first for ( int i=0; i= (Owner.pos.z+Owner.Height) ) continue; + if ( ff.model.flags&Sector.SECF_ENDLEVEL ) endlevelterrain = true; damageterrain = true; break; } @@ -2254,7 +2284,10 @@ Class EBarrier : Inventory if ( t && (t.DamageAmount > 0) && (t.DamageTimeMask > 0) ) damageterrain = true; } + if ( damageterrain && (Owner.floorsector.flags&Sector.SECF_ENDLEVEL) ) endlevelterrain = true; } + // do not auto-use for these + if ( endlevelterrain ) return; if ( !damageterrain ) { terrainwait = max(0,terrainwait-1); diff --git a/zscript/swwm_common_fx.zsc b/zscript/swwm_common_fx.zsc index 36623b146..81827b711 100644 --- a/zscript/swwm_common_fx.zsc +++ b/zscript/swwm_common_fx.zsc @@ -15,7 +15,7 @@ Class PaletteLight : PointLight } private void UpdateLight() { - int index = clamp(255-((255*ReactionTime)/abs(InitialReactionTime)),0,255); + int index = clamp(255-((255*ReactionTime)/InitialReactionTime),0,255); args[LIGHT_RED] = pal[index].r; args[LIGHT_GREEN] = pal[index].g; args[LIGHT_BLUE] = pal[index].b; @@ -23,7 +23,6 @@ Class PaletteLight : PointLight override void PostBeginPlay() { Super.PostBeginPlay(); - InitialReactionTime = ReactionTime; String palname = GetTag(); int sep = palname.IndexOf(","); int palnum = 0; @@ -43,9 +42,10 @@ Class PaletteLight : PointLight } if ( ReactionTime < 0 ) { - ReactionTime = -ReactionTime; + ReactionTime = abs(ReactionTime)-1; IsLooping = true; } + InitialReactionTime = ReactionTime; UpdateLight(); } override void Tick() diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index 610e193d6..470ee615f 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -2063,138 +2063,196 @@ Class SWWMUtility } // multi-weapon spawn stuff - static private Class PickPair( Class a, Class b, int weight = 1 ) + + static private Class PickPair( Class a, Class b ) { - if ( CheckNeedsItem(a) ) return a; - if ( CheckNeedsItem(b) ) return b; - return Random[Replacements](weight,0)?a:b; + if ( ItemExists(a,mapstart:true) ) return b; + return Random[Replacements](0,1)?a:b; } - static private Class PickTrio( Class a, Class b, Class c, int weight1 = 1, int weight2 = 1 ) + static private Class PickTrio( Class a, Class b, Class c ) { - if ( CheckNeedsItem(a) ) return a; - if ( CheckNeedsItem(b) ) return b; - if ( CheckNeedsItem(c) ) return c; - return Random[Replacements](weight1,0)?a:Random[Replacements](weight2,0)?b:c; + if ( ItemExists(a,mapstart:true) ) + { + if ( ItemExists(b,mapstart:true) ) + return c; + return Random[Replacements](0,1)?b:c; + } + if ( ItemExists(b,mapstart:true) ) + { + if ( ItemExists(c,mapstart:true) ) + return a; + return Random[Replacements](0,1)?a:c; + } + if ( ItemExists(c,mapstart:true) ) + Random[Replacements](0,1)?a:b; + switch ( Random[Replacements](0,2) ) + { + case 0: + return a; + case 1: + return b; + } + return c; } - // boy, this one got complicated fast - static Class PickSWWMSlot1() + // melee weapons + extra slot 2 guns (50% chance) + static Class PickSWWMSlot1() { // so the player can recover it if they decided to drop it in a previous map, or they didn't start with it if ( CheckNeedsItem('DeepImpact') ) return 'DeepImpact'; - bool needsmelee = CheckNeedsItem('PusherWeapon')/*|CheckNeedsItem('ItamexHammer')|CheckNeedsItem('FistGun')*/; - bool needsgun = CheckNeedsItem('ExplodiumGun',true)/*|CheckNeedsItem('PlasmaBlast',true)*/; - if ( !needsmelee && !needsgun ) - { - static const Class wpns[] = - { - 'ExplodiumGun', 'PusherWeapon', - 'PlasmaBlast', 'ItamexHammer', - 'FistGun' - }; - //return wpns[Random[Replacements](0,4)]; - //return wpns[Random[Replacements](0,3)]; - return wpns[Random[Replacements](0,1)]; - } - if ( !needsmelee && needsgun ) - { - //bool needsexplo = CheckNeedsItem('ExplodiumGun',true); - //bool needsblast = CheckNeedsItem('PlasmaBlast',true); - //if ( needsexplo && !needsblast ) return 'ExplodiumGun'; - //if ( !needsexplo && needsblast ) return 'PlasmaBlast'; - //return Random[Replacements](0,1)?'ExplodiumGun':'PlasmaBlast'; - return 'ExplodiumGun'; - } - if ( needsmelee && !needsgun ) - { - //return PickTrio('PusherWeapon','ItamexHammer','FistGun'); - //return PickPair('PusherWeapon','ItamexHammer'); - return 'PusherWeapon'; - } - if ( CheckNeedsItem('ExplodiumGun',true) && Random[Replacements](0,1) ) return 'ExplodiumGun'; - //if ( CheckNeedsItem('PlasmaBlast',true) && Random[Replacements](0,1) ) return 'PlasmaBlast'; + bool hasmelee = (!CheckNeedsItem('PusherWeapon')/*||!CheckNeedsItem('ItamexHammer')||!CheckNeedsItem('FistGun')*/); + bool gunexists = ItemExists('ExplodiumGun',worldonly:true)/*||ItemExists('PlasmaBlast',worldonly:true)*/; + // if the player already has a melee weapon, 50% chance to spawn either slot 2 weapon as long as one doesn't exist in the map already + if ( hasmelee && !gunexists && Random[Replacements](0,1) ) + return PickSWWMSlot2(); //return PickTrio('PusherWeapon','ItamexHammer','FistGun'); //return PickPair('PusherWeapon','ItamexHammer'); return 'PusherWeapon'; } - static Class PickSWWMSlot2() + // pistol spawn, pretty simple + static Class PickSWWMSlot2() { //return PickPair('ExplodiumGun','PlasmaBlast'); return 'ExplodiumGun'; } - static Class PickSWWMSlot3() + // shotgun spawn + static Class PickSWWMSlot3() { //return PickPair('Spreadgun','PuntzerBeta'); return 'Spreadgun'; } - static Class PickSWWMSlot4() + // super shotgun spawn + static Class PickSWWMSlot4() { //return PickPair('Wallbuster','PuntzerGamma'); return 'Wallbuster'; } - static Class PickSWWMSlot5() + // chaingun spawn + static Class PickSWWMSlot5() { //return PickPair('Eviscerator','HeavyMahSheenGun'); return 'Eviscerator'; } - static Class PickSWWMSlot6() + // rocket launcher spawn + static Class PickSWWMSlot6() { - //return PickTrip('Hellblazer','Quadravol','ModernSparkster'); + //return PickTrio('Hellblazer','Quadravol','ModernSparkster'); //return PickPair('Hellblazer','Quadravol'); return 'Hellblazer'; } - static Class PickSWWMSlot7() + // first plasma rifle spawn + static Class PickSWWMSlot7() { //return PickPair('Sparkster','BlackfireIgniter'); return 'Sparkster'; } - static Class PickSWWMSlot8() + // second plasma rifle spawn + static Class PickSWWMSlot8() { //return PickPair('SilverBullet','EMPCarbine'); return 'SilverBullet'; } - static Class PickSWWMSlot9() + // first bfg spawn + static Class PickSWWMSlot9() { //return PickTrio('CandyGun','RayKhom','MisterRifle'); //return PickPair('CandyGun','RayKhom'); return 'CandyGun'; } - static Class PickSWWMSlot0() + // second bfg spawn (each weapon can only exist once) + static Class PickSWWMSlot0( bool fallback = true ) { - /*if ( !CheckNeedsItem('Ynykron') ) + /*if ( ItemExists('Ynykron',mapstart:true) ) { - if ( !CheckNeedsItem('GrandLance') ) + if ( ItemExists('GrandLance',mapstart:true) ) { - if ( !CheckNeedsItem('RafanKos') ) - return PickSWWMSlot9(); + if ( ItemExists('RafanKos',null,true) ) + return fallback?PickSWWMSlot9():null; return 'RafanKos'; } - if ( !CheckNeedsItem('RafanKos') ) + if ( ItemExists('RafanKos',mapstart:true) ) return 'GrandLance'; - return PickPair('GrandLance','RafanKos'); + return Random[Replacements](0,1)?'GrandLance':'RafanKos'; } - return PickTrio('Ynykron','GrandLance','RafanKos');*/ - /*if ( !CheckNeedsItem('Ynykron') ) + if ( ItemExists('GrandLance',mapstart:true) ) { - if ( !CheckNeedsItem('GrandLance') ) - return PickSWWMSlot9(); + if ( ItemExists('RafanKos',mapstart:true) ) + return 'Ynykron'; + return Random[Replacements](0,1)?'Ynykron':'RafanKos'; + } + if ( ItemExists('RafanKos',mapstart:truee) ) + return Random[Replacements](0,1)?'Ynykron':'GrandLance'; + switch ( Random[Replacements](0,2) ) + { + case 0: + return 'Ynykron'; + case 1: return 'GrandLance'; } - return PickPair('Ynykron','GrandLance');*/ - return !CheckNeedsItem('Ynykron')?'CandyGun':'Ynykron'; + return 'RafanKos';*/ + /*if ( ItemExists('Ynykron',mapstart:true) ) + { + if ( ItemExists('GrandLance',mapstart:true) ) + return fallback?PickSWWMSlot9():null; + return 'GrandLance'; + } + if ( ItemExists('GrandLance',mapstart:true) ) + return 'Ynykron'; + return Random[Replacements](0,1)?'Ynykron':'GrandLance';*/ + if ( ItemExists('Ynykron',mapstart:true) ) return fallback?PickSWWMSlot9():null; + return 'Ynykron'; } - static Class PickDoomSlot6() + // either plasma rifle spawn + static Class PickDoomSlot6() { - return PickPair(PickSWWMSlot7(),PickSWWMSlot8(),2); + bool hasslot7 = (!CheckNeedsItem('Sparkster')/*||!CheckNeedsItem('BlackfireIgniter')*/); + bool hasslot8 = (!CheckNeedsItem('SilverBullet')/*||!CheckNeedsItem('EMPCarbine')*/); + // if the player already has a slot 7 weapon... + if ( hasslot7 ) + { + // ... and also has a slot 8 weapon, 33% chance of a slot 8 spawn + // otherwise, guaranteed slot 8 spawn + if ( hasslot8 && Random[Replacements](0,2) ) return PickSWWMSlot7(); + else return PickSWWMSlot8(); + } + // otherwise, always spawn a slot 7 weapon first + return PickSWWMSlot7(); + } - static Class PickDoomSlot7() + // either bfg spawn + static Class PickDoomSlot7() { - return PickPair(PickSWWMSlot9(),PickSWWMSlot0(),2); + bool hasslot9 = (!CheckNeedsItem('CandyGun')/*||!CheckNeedsItem('RayKhom')||!CheckNeedsItem('MortalRifle')*/); + bool hasslot0 = (!CheckNeedsItem('Ynykron')/*||!CheckNeedsItem('GrandLance')||!CheckNeedsItem('RafanKos')*/); + let rep = PickSWWMSlot0(false); + // if the player already has a slot 9 weapon (and a slot 0 weapon can still spawn)... + if ( hasslot9 && rep ) + { + // ... and also has a slot 0 weapon already, 33% chance of a slot 0 spawn + // otherwise, guaranteed slot 0 spawn + if ( hasslot0 && Random[Replacements](0,2) ) return PickSWWMSlot9(); + else return rep; + } + // otherwise, always spawn a slot 9 weapon first + return PickSWWMSlot9(); } - static Class PickHereticSlot3() // also used for Doom 1 + // either shotgun spawn (also used for Heretic) + static Class PickDoomSlot3() { - if ( level.maptime ) return PickSWWMSlot3(); // always slot 3 after map start, prevents shotgun guys from dropping wallbusters - return PickPair(PickSWWMSlot3(),PickSWWMSlot4(),2); + // always slot 3 after map start, prevents shotgun guys from dropping wallbusters, which is weird af + if ( level.maptime ) return PickSWWMSlot3(); + bool hasslot3 = (!CheckNeedsItem('Spreadgun')/*||!CheckNeedsItem('PuntzerBeta')*/); + bool hasslot4 = (!CheckNeedsItem('Wallbuster')/*||!CheckNeedsItem('PuntzerGamma')*/); + // if the player already has a slot 3 weapon... + if ( hasslot3 ) + { + // ... and also has a slot 4 weapon, 33% chance of a slot 4 spawn + // otherwise, guaranteed slot 4 spawn + if ( hasslot4 && Random[Replacements](0,2) ) return PickSWWMSlot3(); + return PickSWWMSlot4(); + } + // otherwise, always spawn a slot 3 weapon first + return PickSWWMSlot3(); } // what RandomSpawner does, basically (simplified for items) static play void TransferItemProp( Actor a, Actor b, bool bundlehack = false ) diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index a74d0e7ca..0e9816516 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -41,7 +41,7 @@ Class SWWMWeapon : Weapon abstract override void Touch( Actor toucher ) { - // cannot pick up swapweapon unless explicitly pressing use + // show prompt to swap weapon, and prevent normal pickup SWWMWeapon sw; if ( bSPECIAL && swwm_swapweapons && (sw = HasSwapWeapon(toucher)) ) { @@ -54,6 +54,7 @@ Class SWWMWeapon : Weapon abstract } return; } + // explicit use-to pickup, function must be called from Used() virtual if ( toucher.player && swwm_usetopickup && !bUsePickup ) return; Super.Touch(toucher); @@ -388,10 +389,6 @@ Class SWWMWeapon : Weapon abstract if ( swwm_enemydrops > 0 ) return false; else if ( swwm_enemydrops == 0 ) { - // first, check if no others exist in the map, just in - // case this weapon drop MAY be needed - if ( !SWWMUtility.ItemExists(GetClass(),self) ) - return false; // drop us // drop our corresponding ammo if ( !DropAmmoType ) return true; let a = Spawn(DropAmmoType,pos,ALLOW_REPLACE);