From 3500f72db0f0b07996b9e0d46810fedc3aecddbf Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sat, 29 May 2021 23:26:12 +0200 Subject: [PATCH] Add "exclusive use to pickup" option. Make "pickup through melee" optional (disabled by default). Increased leniency of use to pickup (nice for items with small hitboxes). --- cvarinfo.txt | 2 ++ language.def_menu | 10 +++++++--- language.es_menu | 10 +++++++--- language.version | 4 ++-- menudef.txt | 2 ++ modeldef.collectibles | 1 - shaders/glsl/Bilinear.fp | 1 + shaders/glsl/Fuzz.fp | 4 ++++ shaders/glsl/Fuzz_Gray.fp | 4 ++++ shaders/glsl/Fuzz_GraySmall.fp | 4 ++++ shaders/glsl/Fuzz_GraySmall2.fp | 4 ++++ shaders/glsl/JetSmoke.fp | 2 ++ shaders/glsl/KeyBlink.fp | 2 ++ shaders/glsl/LogoAnimated.fp | 2 ++ shaders/glsl/Mykradvo.fp | 2 ++ shaders/glsl/Mykradvo2.fp | 2 ++ shaders/glsl/PerfectlyGeneric.fp | 17 ++++++++++++---- shaders/glsl/Shinemap.fp | 2 ++ shaders/glsl/Shinemap_barrier.fp | 2 ++ shaders/glsl/Shinemap_error.fp | 2 ++ shaders/glsl/Shinemask.fp | 2 ++ shaders/glsl/Whew.fp | 2 ++ shaders/glsl/YnykronSmoke.fp | 2 ++ shaders/pp/Barrier.fp | 2 ++ shaders/pp/Ghostscreen.fp | 2 ++ shaders/pp/Glitch.fp | 2 ++ shaders/pp/Invinciscreen.fp | 2 ++ shaders/pp/LavaWarp.fp | 3 +++ shaders/pp/Ragescreen.fp | 2 ++ shaders/pp/RagescreenAlt.fp | 2 ++ shaders/pp/SilverScope.fp | 2 ++ shaders/pp/SlimeWarp.fp | 3 +++ shaders/pp/WaterWarp.fp | 3 +++ shaders/pp/ZoomBlur.fp | 2 ++ zscript/items/swwm_baseitem.zsc | 14 +++++++++++++ zscript/swwm_common_fx.zsc | 20 +++++++++++++++++++ zscript/swwm_player.zsc | 31 +++++++++++++++++++++++++++++ zscript/weapons/swwm_baseweapon.zsc | 8 ++++++++ 38 files changed, 170 insertions(+), 13 deletions(-) diff --git a/cvarinfo.txt b/cvarinfo.txt index be4a7c63c..4b39bff03 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -107,6 +107,8 @@ nosave int swwm_filterachievements = 1; // filter for achievements at 0%: 0 - n nosave noarchive bool swwm_debugview = false; // debug visual aid for various things, such as actor collision, trajectories, relationships, etc. nosave noarchive bool swwm_oldcheat = false; // set to true if you used a SWWM Platinum cheat, so the easter egg only appears once per session server bool swwm_selflight = true; // player emits light +server bool swwm_usetopickup = false; // allow item pickup only by pressing use +server bool swwm_meleepickup = false; // allow picking up items through melee // minimap settings nosave bool swwm_mm_enable = true; // show a minimap below the score counter diff --git a/language.def_menu b/language.def_menu index 8767b61db..41b30c620 100644 --- a/language.def_menu +++ b/language.def_menu @@ -184,6 +184,8 @@ SWWM_TIME_MINUTES = "minutes"; SWWM_TIME_SECONDS = "seconds"; SWWM_ATITLE = "Achievements"; SWWM_SELFLIGHT = "Self-Lighting"; +SWWM_USETOPICKUP = "Exclusive Use To Pickup"; +SWWM_MELEEPICKUP = "Allow Item Pickup Through Melee"; SWWM_MMTITLE = "Minimap Settings"; SWWM_MM_ENABLE = "Show Minimap"; SWWM_MM_ROTATE = "Rotate Minimap"; @@ -320,6 +322,8 @@ TOOLTIP_SWWM_UNIQSTATS = "Clears duplicate map entries in the mission stats tab, TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filters out achievements at 0% in the Demolitionist Menu, if you'd rather avoid spoiling the fun. The 'Obfuscate' option is recommended, as it will at least leave a hint of things to be discovered."; TOOLTIP_SWWM_PLAYTIME = "Your total play time with this mod loaded."; TOOLTIP_SWWM_SELFLIGHT = "Emit blue light from the player's face. Disable if this causes performance issues."; +TOOLTIP_SWWM_USETOPICKUP = "Prevents picking up mod items through touch, exclusively requiring a use action instead."; +TOOLTIP_SWWM_MELEEPICKUP = "Allows picking up items though melee attacks. Do note that some weapons have an extended melee range, allowing you to grab things from farther away."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap under the score counter."; TOOLTIP_SWWM_MM_ROTATE = "Rotates the minimap view."; TOOLTIP_SWWM_MM_GRID = "Shows a 128x128 grid on the minimap."; @@ -375,9 +379,9 @@ SWWM_CGUTA2 = "For the Gutamatics library, and for helping me with learning ZScr SWWM_CKEKS2 = "For assistance with exception handling code, and also for being such a cool Touhou nerd."; SWWM_CZN2 = "For slope alignment code, and to Nash also for being a cool smart cactus dude."; SWWM_CVAL2 = "For the custom Nashgore footprints, and for being a good friend and cute bun."; -SWWM_CKATHY2 = "For being a great friend and for collaborating with me on lore and character development. May your world flourish too."; -SWWM_CBOUNCY2 = "For letting me rant about lore for hours, and being there to listen along. And for being cute and a friend."; -SWWM_CSLEDGE2 = "For being great buds, not just for me but for all of us, and also for encouraging me to take part in the Doom modiverse."; +SWWM_CKATHY2 = "For being one of my best friends ever and for collaborating with me on lore and character development. May your world flourish too."; +SWWM_CBOUNCY2 = "For lots of help with testing and for letting me rant about lore for hours and being there to listen along. You're a wonderful friend."; +SWWM_CSLEDGE2 = "For being great buds, not just for me but for all of us. Your support and encouragement are something I value a lot, and I can't thank you enough."; SWWM_CSPY2 = "For being so enthusiastic about everything in this mod, and for being the cute little brother I never had."; SWWM_CINSP1 = "Combine Kegan, HyperUltra64, TerminusEst13, Yholl and friends"; SWWM_CINSP2 = "For inspiration and also for being really cool people. Bless all of you, keep being amazing."; diff --git a/language.es_menu b/language.es_menu index 8464c933a..51700ac3c 100644 --- a/language.es_menu +++ b/language.es_menu @@ -183,6 +183,8 @@ SWWM_TIME_MINUTES = "minutos"; SWWM_TIME_SECONDS = "segundos"; SWWM_ATITLE = "Logros"; SWWM_SELFLIGHT = "Luz Propia"; +SWWM_USETOPICKUP = "Uso Exclusivo para Recoger"; +SWWM_MELEEPICKUP = "Permitir Recoger Ítems con Melé"; SWWM_MMTITLE = "Opciones de Minimapa"; SWWM_MM_ENABLE = "Mostrar Minimapa"; SWWM_MM_ROTATE = "Rotar Minimapa"; @@ -319,6 +321,8 @@ TOOLTIP_SWWM_UNIQSTATS = "Elimina entradas duplicadas de mapa en la pestaña de TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filtra logros al 0% en el Menú de Demolicionista, si prefieres no estropear la sorpresa. La opción de 'Ofuscar' es la recomendada, ya que al menos dejará pistas de cosas que quedan por descubrir."; TOOLTIP_SWWM_PLAYTIME = "Tu tiempo de juego total con este mod cargado."; TOOLTIP_SWWM_SELFLIGHT = "Emite luz azul desde la cara del jugador. Desactiva si causa problemas de rendimiento."; +TOOLTIP_SWWM_USETOPICKUP = "Evita recoger ítems del mod al tocarlos, en su lugar requiriendo exclusivamente una acción de uso."; +TOOLTIP_SWWM_MELEEPICKUP = "Permite recoger ítems por medio de ataques a melé. Ten en cuenta que algunas armas tienen un rango de melé extendido, permitiéndote alcanzar cosas desde una mayor distancia."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa bajo el contador de puntuación."; TOOLTIP_SWWM_MM_ROTATE = "Gira la vista del minimapa."; TOOLTIP_SWWM_MM_GRID = "Muestra una cuadrícula de 128x128 en el minimapa."; @@ -372,9 +376,9 @@ SWWM_CGUTA2 = "Por la librería de Gutamatics, y por ayudarme a aprender ZScript SWWM_CKEKS2 = "Por asistencia con el código de manejo de excepciones, y también por ser un friki tan guay de Touhou."; SWWM_CZN2 = "Por el código para alineación con superficies inclinadas, y a Nash además por ser un molón tío cactus listo."; SWWM_CVAL2 = "Por las huellas personalizadas para Nashgore, y por ser una buena amiga y conejita mona."; -SWWM_CKATHY2 = "Por ser una gran amiga y por colaborar conmigo en lore y desarrollo de personajes. Deseo que tu mundo también prospere."; -SWWM_CBOUNCY2 = "Por dejar que suelte lore durante horas, y estar ahí para escuchar. Y por ser adorable y un amigo."; -SWWM_CSLEDGE2 = "Por ser grandes colegas, no solo conmigo si no con todos nosotros, y también por animarme a tomar parte en el modiverso de Doom."; +SWWM_CKATHY2 = "Por ser una de mis mejores amigas y por colaborar conmigo en lore y desarrollo de personajes. Deseo que tu mundo también prospere."; +SWWM_CBOUNCY2 = "Por tu gran ayuda con el testeo y por dejar que suelte lore durante horas y estar ahí para escuchar. Eres un amigo maravilloso."; +SWWM_CSLEDGE2 = "Por ser grandes colegas, no solo conmigo si no con todos nosotros. Vuestro apoyo y ánimo es algo que valoro muchísimo, y no hay forma de agradecéroslo suficientemente."; SWWM_CSPY2 = "Por el nivel de entusiasmo mostrado por todo en este mod, y por ser el adorable hermano menor que nunca tuve."; SWWM_CINSP1 = "Combine Kegan, HyperUltra64, TerminusEst13, Yholl y amigos"; SWWM_CINSP2 = "Por servir de inspiración y por ser gente muy molona. Benditos seáis todos, seguid siendo fenomenales."; diff --git a/language.version b/language.version index 3c7ef8979..673825be3 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r512 \cu(Thu 27 May 10:55:44 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r512 \cu(2021-05-27 10:55:44)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r513 \cu(Sat 29 May 23:26:12 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r513 \cu(2021-05-29 23:26:12)\c-"; diff --git a/menudef.txt b/menudef.txt index 9723ca14c..0cabb2384 100644 --- a/menudef.txt +++ b/menudef.txt @@ -173,6 +173,8 @@ OptionMenu "SWWMOptionMenu" //Option "$SWWM_SWAPWEAPONS", "swwm_swapweapons", "YesNo" // comment out until DLC1 StaticText " " StaticText "$SWWM_ITITLE", "Blue" + Option "$SWWM_USETOPICKUP", "swwm_usetopickup", "YesNo" + Option "$SWWM_MELEEPICKUP", "swwm_meleepickup", "YesNo" Option "$SWWM_ARMORUSE", "swwm_autousearmor", "YesNo" Option "$SWWM_HEALTHUSE", "swwm_autousehealth", "YesNo" Option "$SWWM_AMMOUSE", "swwm_autouseammo", "YesNo" diff --git a/modeldef.collectibles b/modeldef.collectibles index b778cf26e..a39539ed4 100644 --- a/modeldef.collectibles +++ b/modeldef.collectibles @@ -6,7 +6,6 @@ Model "GenericCube" Skin 0 "PerfectlyGeneric.png" Scale 0.04 0.04 0.04 ZOffset 16 - PitchOffset 30 ROTATING FrameIndex XZW1 A 0 0 diff --git a/shaders/glsl/Bilinear.fp b/shaders/glsl/Bilinear.fp index 5e76e3e32..5b921f962 100644 --- a/shaders/glsl/Bilinear.fp +++ b/shaders/glsl/Bilinear.fp @@ -1,4 +1,5 @@ // This should act as Bilinear filtering when texture filtering is disabled +// the algo is pretty much public domain, so no credit given void SetupMaterial( inout Material mat ) { diff --git a/shaders/glsl/Fuzz.fp b/shaders/glsl/Fuzz.fp index 5feaa54db..4fb8cf7c8 100644 --- a/shaders/glsl/Fuzz.fp +++ b/shaders/glsl/Fuzz.fp @@ -1,3 +1,7 @@ +// adapted from original "fuzz" filter devised in 2016 +// PRNG replaced with noise texture sampling to compensate for odd patterning +// on intel hardware + float rnd( in vec2 sd ) { //return cos(sd.y*3874.8674+sd.x*6783.5325)*2737.8474; diff --git a/shaders/glsl/Fuzz_Gray.fp b/shaders/glsl/Fuzz_Gray.fp index 627a87fbb..74ec9698d 100644 --- a/shaders/glsl/Fuzz_Gray.fp +++ b/shaders/glsl/Fuzz_Gray.fp @@ -1,3 +1,7 @@ +// adapted from original "fuzz" filter devised in 2016 +// PRNG replaced with noise texture sampling to compensate for odd patterning +// on intel hardware + float rnd( in vec2 sd ) { //return cos(sd.y*3874.8674+sd.x*6783.5325)*2737.8474; diff --git a/shaders/glsl/Fuzz_GraySmall.fp b/shaders/glsl/Fuzz_GraySmall.fp index a638f10d6..871c7eb5c 100644 --- a/shaders/glsl/Fuzz_GraySmall.fp +++ b/shaders/glsl/Fuzz_GraySmall.fp @@ -1,3 +1,7 @@ +// adapted from original "fuzz" filter devised in 2016 +// PRNG replaced with noise texture sampling to compensate for odd patterning +// on intel hardware + float rnd( in vec2 sd ) { //return cos(sd.y*3874.8674+sd.x*6783.5325)*2737.8474; diff --git a/shaders/glsl/Fuzz_GraySmall2.fp b/shaders/glsl/Fuzz_GraySmall2.fp index 938fe9ce1..feb29ee3a 100644 --- a/shaders/glsl/Fuzz_GraySmall2.fp +++ b/shaders/glsl/Fuzz_GraySmall2.fp @@ -1,3 +1,7 @@ +// adapted from original "fuzz" filter devised in 2016 +// PRNG replaced with noise texture sampling to compensate for odd patterning +// on intel hardware + float rnd( in vec2 sd ) { //return cos(sd.y*3874.8674+sd.x*6783.5325)*2737.8474; diff --git a/shaders/glsl/JetSmoke.fp b/shaders/glsl/JetSmoke.fp index 162266e0f..91e5887b9 100644 --- a/shaders/glsl/JetSmoke.fp +++ b/shaders/glsl/JetSmoke.fp @@ -1,3 +1,5 @@ +// scrolling smoke with gradient fade + void SetupMaterial( inout Material mat ) { vec3 base = getTexel(vTexCoord.st).rgb; diff --git a/shaders/glsl/KeyBlink.fp b/shaders/glsl/KeyBlink.fp index db511c51a..9c27e5fbe 100644 --- a/shaders/glsl/KeyBlink.fp +++ b/shaders/glsl/KeyBlink.fp @@ -1,3 +1,5 @@ +// emulate keycard blink cycle on hud model + void SetupMaterial( inout Material mat ) { float mixfct = floor(mod(timer*35.,20.)/10.); diff --git a/shaders/glsl/LogoAnimated.fp b/shaders/glsl/LogoAnimated.fp index 92cefd80d..347b86fdc 100644 --- a/shaders/glsl/LogoAnimated.fp +++ b/shaders/glsl/LogoAnimated.fp @@ -1,3 +1,5 @@ +// animated SWWM GZ logo + #define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b))) const float pi = 3.14159265358979323846; diff --git a/shaders/glsl/Mykradvo.fp b/shaders/glsl/Mykradvo.fp index 5994b0d29..63fb4b032 100644 --- a/shaders/glsl/Mykradvo.fp +++ b/shaders/glsl/Mykradvo.fp @@ -1,3 +1,5 @@ +// mykradvo center sprite + const float pi = 3.14159265358979323846; void SetupMaterial( inout Material mat ) diff --git a/shaders/glsl/Mykradvo2.fp b/shaders/glsl/Mykradvo2.fp index 2ce5d11fb..40833d7cd 100644 --- a/shaders/glsl/Mykradvo2.fp +++ b/shaders/glsl/Mykradvo2.fp @@ -1,3 +1,5 @@ +// mykradvo rings + const float pi = 3.14159265358979323846; void SetupMaterial( inout Material mat ) diff --git a/shaders/glsl/PerfectlyGeneric.fp b/shaders/glsl/PerfectlyGeneric.fp index c80fea154..651a7cee5 100644 --- a/shaders/glsl/PerfectlyGeneric.fp +++ b/shaders/glsl/PerfectlyGeneric.fp @@ -1,8 +1,17 @@ +// perfectly generic cube fake shading + void SetupMaterial( inout Material mat ) { + mat.Base = getTexel(vTexCoord.st); +} + +vec4 ProcessLight( Material mat, vec4 color ) +{ vec3 light = vec3(-.6,.7,.8); - vec4 col = getTexel(vTexCoord.st); - col.rgb *= max(dot(normalize(vEyeNormal.xyz),light),.25); - col.rgb += vec3(.2)*pow(max(dot(normalize(vEyeNormal.xyz),light),0.),4.); - mat.Base = col; + float val = max(dot(normalize(vEyeNormal.xyz),light),.25); + val += .2*pow(max(dot(normalize(vEyeNormal.xyz),light),0.),4.); + float mixfct = mix(1.,.5,floor(abs(vTexCoord.s-.5)*2.133333)); + mixfct = mix(mixfct,.5,floor(abs(vTexCoord.t-.5)*2.13333)); + val *= mixfct; + return vec4(vec3(val),color.a); } diff --git a/shaders/glsl/Shinemap.fp b/shaders/glsl/Shinemap.fp index 23e83df6b..b03e9e6d0 100644 --- a/shaders/glsl/Shinemap.fp +++ b/shaders/glsl/Shinemap.fp @@ -1,3 +1,5 @@ +// pseudo-matcap + void SetupMaterial( inout Material mat ) { vec3 rnorm = normalize(vEyeNormal.xyz)*vec3(1,-1,1); diff --git a/shaders/glsl/Shinemap_barrier.fp b/shaders/glsl/Shinemap_barrier.fp index bf2cb3f4d..6145cc888 100644 --- a/shaders/glsl/Shinemap_barrier.fp +++ b/shaders/glsl/Shinemap_barrier.fp @@ -1,3 +1,5 @@ +// pseudo-matcap + scrolling overlay + void SetupMaterial( inout Material mat ) { vec3 rnorm = normalize(vEyeNormal.xyz)*vec3(1,-1,1); diff --git a/shaders/glsl/Shinemap_error.fp b/shaders/glsl/Shinemap_error.fp index 90d592e7a..2825afcc5 100644 --- a/shaders/glsl/Shinemap_error.fp +++ b/shaders/glsl/Shinemap_error.fp @@ -1,3 +1,5 @@ +// pseudo-matcap + ambient glow + void SetupMaterial( inout Material mat ) { vec3 rnorm = normalize(vEyeNormal.xyz)*vec3(1,-1,1); diff --git a/shaders/glsl/Shinemask.fp b/shaders/glsl/Shinemask.fp index c8627ec75..b6e2e8d29 100644 --- a/shaders/glsl/Shinemask.fp +++ b/shaders/glsl/Shinemask.fp @@ -1,3 +1,5 @@ +// basic texture + masked pseudo-matcap + void SetupMaterial( inout Material mat ) { vec4 base = getTexel(vTexCoord.st); diff --git a/shaders/glsl/Whew.fp b/shaders/glsl/Whew.fp index c5c941f23..a6ae5a8a4 100644 --- a/shaders/glsl/Whew.fp +++ b/shaders/glsl/Whew.fp @@ -1,3 +1,5 @@ +// RAINBOWS + void SetupMaterial( inout Material mat ) { vec4 base = getTexel(vTexCoord.st); diff --git a/shaders/glsl/YnykronSmoke.fp b/shaders/glsl/YnykronSmoke.fp index 6f593202d..a4b1083d5 100644 --- a/shaders/glsl/YnykronSmoke.fp +++ b/shaders/glsl/YnykronSmoke.fp @@ -1,3 +1,5 @@ +// scrolling smoke with gradient fade + void SetupMaterial( inout Material mat ) { vec3 base = getTexel(vTexCoord.st).rgb; diff --git a/shaders/pp/Barrier.fp b/shaders/pp/Barrier.fp index 20b48ac05..998e373c6 100644 --- a/shaders/pp/Barrier.fp +++ b/shaders/pp/Barrier.fp @@ -1,3 +1,5 @@ +// barrier shimmering warp overlay + void main() { vec2 uv = TexCoord; diff --git a/shaders/pp/Ghostscreen.fp b/shaders/pp/Ghostscreen.fp index f5c9bbf4c..3eb6d082e 100644 --- a/shaders/pp/Ghostscreen.fp +++ b/shaders/pp/Ghostscreen.fp @@ -1,3 +1,5 @@ +// ghost artifact refraction bubble + void main() { vec2 uv = TexCoord; diff --git a/shaders/pp/Glitch.fp b/shaders/pp/Glitch.fp index 3694e6568..4ca1bdcc0 100644 --- a/shaders/pp/Glitch.fp +++ b/shaders/pp/Glitch.fp @@ -1,3 +1,5 @@ +// glitched screen shader + const float thr1 = 6.4; const float thr2 = 8.6; const float thr3 = 19.3; diff --git a/shaders/pp/Invinciscreen.fp b/shaders/pp/Invinciscreen.fp index 586204d61..aefc5f068 100644 --- a/shaders/pp/Invinciscreen.fp +++ b/shaders/pp/Invinciscreen.fp @@ -1,3 +1,5 @@ +// invinciball radial sharpening + vec3 sharpened( vec2 uv ) { vec3 col = texture(InputTexture,uv).rgb*9.; diff --git a/shaders/pp/LavaWarp.fp b/shaders/pp/LavaWarp.fp index 6047b18cb..7482097e8 100644 --- a/shaders/pp/LavaWarp.fp +++ b/shaders/pp/LavaWarp.fp @@ -1,3 +1,6 @@ +// underwater overlay adapted from original Hexmas sanity effect shader +// lava version + vec2 calcdist( vec2 duv ) { vec2 uv = vec2(0.); diff --git a/shaders/pp/Ragescreen.fp b/shaders/pp/Ragescreen.fp index 1569c5ce1..dee9650f4 100644 --- a/shaders/pp/Ragescreen.fp +++ b/shaders/pp/Ragescreen.fp @@ -1,3 +1,5 @@ +// RAGE + #define TWOPI 6.28318530718 void main() diff --git a/shaders/pp/RagescreenAlt.fp b/shaders/pp/RagescreenAlt.fp index 1470035a5..929231c75 100644 --- a/shaders/pp/RagescreenAlt.fp +++ b/shaders/pp/RagescreenAlt.fp @@ -1,3 +1,5 @@ +// less eye-searing rage + #define TWOPI 6.28318530718 void main() diff --git a/shaders/pp/SilverScope.fp b/shaders/pp/SilverScope.fp index fb9e0f0b6..48c4915e5 100644 --- a/shaders/pp/SilverScope.fp +++ b/shaders/pp/SilverScope.fp @@ -1,3 +1,5 @@ +// simple scope overlay + bokeh blur + #define PI 3.14159265 void main() diff --git a/shaders/pp/SlimeWarp.fp b/shaders/pp/SlimeWarp.fp index da68dec6f..220b8fdcd 100644 --- a/shaders/pp/SlimeWarp.fp +++ b/shaders/pp/SlimeWarp.fp @@ -1,3 +1,6 @@ +// underwater overlay adapted from original Hexmas sanity effect shader +// slime version + vec2 calcdist( vec2 duv ) { vec2 uv = vec2(0.); diff --git a/shaders/pp/WaterWarp.fp b/shaders/pp/WaterWarp.fp index b9e809ba5..76deeee8c 100644 --- a/shaders/pp/WaterWarp.fp +++ b/shaders/pp/WaterWarp.fp @@ -1,3 +1,6 @@ +// underwater overlay adapted from original Hexmas sanity effect shader +// water version + vec2 calcdist( vec2 duv ) { vec2 uv = vec2(0.); diff --git a/shaders/pp/ZoomBlur.fp b/shaders/pp/ZoomBlur.fp index 5a85303f8..18427c035 100644 --- a/shaders/pp/ZoomBlur.fp +++ b/shaders/pp/ZoomBlur.fp @@ -1,3 +1,5 @@ +// zoom blur effect adapted from abort_m berserk pulse + void main() { vec2 p = CenterSpot-TexCoord; diff --git a/zscript/items/swwm_baseitem.zsc b/zscript/items/swwm_baseitem.zsc index 0b7fd9755..aae0ac7d7 100644 --- a/zscript/items/swwm_baseitem.zsc +++ b/zscript/items/swwm_baseitem.zsc @@ -38,16 +38,23 @@ Class CrossLineFinder : LineTracer Mixin Class SWWMUseToPickup { + bool bUsePickup; + // allow pickup by use override bool Used( Actor user ) { + // no use through melee + if ( (user.player.ReadyWeapon is 'SWWMWeapon') && SWWMWeapon(user.player.ReadyWeapon).wallponch && !swwm_meleepickup ) + return false; Vector3 itempos = Vec3Offset(0,0,Height/2), userpos = user.Vec2OffsetZ(0,0,user.player.viewz); // test vertical range Vector3 diff = level.Vec3Diff(user.Vec3Offset(0,0,user.Height/2),Vec3Offset(0,0,Height/2)); double rang = user.player?PlayerPawn(user.player.mo).UseRange:(user.Height/2); if ( abs(diff.z) > rang ) return false; + bUsePickup = true; Touch(user); + bUsePickup = false; // we got picked up if ( bDestroyed || Owner || !bSPECIAL ) { @@ -63,6 +70,13 @@ Mixin Class SWWMUseToPickup } return false; } + + override void Touch( Actor toucher ) + { + if ( toucher.player && swwm_usetopickup && !bUsePickup ) + return; + Super.Touch(toucher); + } } Mixin Class SWWMOverlapPickupSound diff --git a/zscript/swwm_common_fx.zsc b/zscript/swwm_common_fx.zsc index 4f6297970..00473a801 100644 --- a/zscript/swwm_common_fx.zsc +++ b/zscript/swwm_common_fx.zsc @@ -1206,6 +1206,26 @@ Class SWWMBulletTrail : LineTracer } } +// finds the first pickup-able item +Class SWWMItemTracer : LineTracer +{ + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( (Results.HitActor is 'Inventory') && Results.HitActor.bSPECIAL ) return TRACE_Stop; + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockUse|Line.ML_BlockEverything)) ) + return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Stop; + } +} + // Blob shadows Class SWWMShadow : Actor { diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index ccf9537f7..221f7da15 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -69,6 +69,8 @@ Class Demolitionist : PlayerPawn Actor froggy; transient int lastuse, failcounter, failcooldown; + transient SWWMItemTracer itrace; + bool meleeuse; Property DashFuel : dashfuel; @@ -559,6 +561,33 @@ Class Demolitionist : PlayerPawn else d.HitSector.SetTexture(0,replacewith); } } + void CheckItemUsePickup() + { + if ( player.usedown ) + return; + if ( !itrace ) itrace = new("SWWMItemTracer"); + Vector3 x, y, z, dir; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = Vec2OffsetZ(0,0,player.viewz); + Sector os = level.PointInSector(origin.xy); + int rings = 1; + Array ignoreme; + ignoreme.Clear(); + for ( double i=0; i<.2; i+=.02 ) + { + for ( int j=0; j<360; j+=(360/rings) ) + { + dir = (x+y*cos(j)*i+z*sin(j)*i).unit(); + itrace.Trace(origin,os,dir,UseRange,0); + if ( itrace.Results.HitType != TRACE_HitActor ) continue; + if ( ignoreme.Find(itrace.Results.HitActor) < ignoreme.Size() ) continue; + player.usedown = true; // we found an item, ignore further uses + if ( itrace.Results.HitActor.Used(self) ) return; + ignoreme.Push(itrace.Results.HitActor); + } + rings += 2; + } + } void CheckUnderwaterAmb( bool restore = false ) { Vector3 headpos = Vec3Offset(0,0,player.viewheight); @@ -729,6 +758,8 @@ Class Demolitionist : PlayerPawn CheckDefaceTexture(); if ( !player.usedown && froggy ) player.usedown = froggy.Used(self); + // try to "use" the item closest to the crosshair + CheckItemUsePickup(); } Super.PlayerThink(); if ( (gametic == lastuse) && IsActorPlayingSound(CHAN_VOICE,"*usefail") ) diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index 73a6f0edc..0fbcdef30 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -5,6 +5,7 @@ Class SWWMWeapon : Weapon abstract Mixin SWWMRespawn; bool wasused; + bool bUsePickup; private int SWeaponFlags; Class dropammotype; @@ -50,11 +51,16 @@ Class SWWMWeapon : Weapon abstract } return; } + if ( toucher.player && swwm_usetopickup && !bUsePickup ) + return; Super.Touch(toucher); } // allow pickup by use + swap weapon support override bool Used( Actor user ) { + // no use through melee + if ( (user.player.ReadyWeapon is 'SWWMWeapon') && SWWMWeapon(user.player.ReadyWeapon).wallponch && !swwm_meleepickup ) + return false; Vector3 itempos = Vec3Offset(0,0,Height/2), userpos = user.Vec2OffsetZ(0,0,user.player.viewz); // test vertical range @@ -88,7 +94,9 @@ Class SWWMWeapon : Weapon abstract user.player.PendingWeapon = WP_NOCHANGE; } } + bUsePickup = true; Touch(user); + bUsePickup = false; // we got picked up if ( bDestroyed || Owner || !bSPECIAL ) {