diff --git a/cvarinfo.base b/cvarinfo.base index 6edda4f3d..53c608f17 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -84,7 +84,6 @@ server bool swwm_shadows = true; // enables blob shadows under mod entities, li nosave bool swwm_precisecrosshair = true; // use mod's own, more precise crosshair nosave bool swwm_ldspoil = false; // [LD] always shows "Legendary" prefix on Legendary monsters, otherwise only when they've transformed nosave bool swwm_camhud = false; // keep full hud visible when operating cameras, otherwise only shows messages -nosave bool swwm_rageshader = false; // alternate ragekit shader for people with photosensitivity server bool swwm_uncapalert = false; // all noise alerts have infinite range nosave int swwm_damagetarget = 1; // conditional healthbar hiding (1 - hide until damage is first taken, 2 - hide if at full health) server int swwm_strictuntouchable = 0; // untouchable bonus ends... (1 - even if your armor absorbed all the damage, 2 - if you get hit by anything PERIOD) diff --git a/gldefs.pp b/gldefs.pp index e2bbaa15c..36567932b 100644 --- a/gldefs.pp +++ b/gldefs.pp @@ -69,11 +69,14 @@ HardwareShader PostProcess scene Uniform float timer Uniform float xtrastr } + HardwareShader PostProcess scene { - Name "RagekitAltShader" - Shader "shaders/pp/RagescreenAlt.fp" 330 - Texture WarpTex "textures/ragewarp.png" + Name "DevastationShader" + Shader "shaders/pp/Devascreen.fp" 330 + Texture BumpTex "textures/heattex.png" + Texture WarpTex1 "textures/devawarp1.png" + Texture WarpTex2 "textures/devawarp2.png" Texture NoiseTex "textures/graynoise.png" Uniform float timer Uniform float xtrastr diff --git a/language.def_menu b/language.def_menu index c0eeb1f6a..fc6228c63 100644 --- a/language.def_menu +++ b/language.def_menu @@ -125,7 +125,6 @@ SWWM_PRECISECROSSHAIR = "Precise Crosshair"; SWWM_MCTITLE = "Mod Compatibility Options"; SWWM_LDSPOIL = "Always Show Legendaries"; SWWM_ETITLE = "Effect Options"; -SWWM_RAGESHADER = "Alternate Ragekit Shader"; SWWM_CAMHUD = "Full HUD In Cameras"; SWWM_UNCAPALERT = "Uncap Alert Range"; SWWM_COLLECTANIMKEY = "Key Animations"; @@ -310,7 +309,6 @@ TOOLTIP_SWWM_COLLECTANIM = "Play special first person animations when picking up TOOLTIP_SWWM_SHADOWS = "Enables round shadows for various entities, combine with sprite shadows for best effect. Requires a map restart."; TOOLTIP_SWWM_PRECISECROSSHAIR = "Projects crosshair onto the spot the weapon will actually hit, rather than staying in the center of the screen."; TOOLTIP_SWWM_LDSPOIL = "[LegenDoom] Always show the \"Legendary\" prefix on healthbar tags, rather than after the monster has transformed. Disable if you'd rather not spoil the surprise."; -TOOLTIP_SWWM_RAGESHADER = "The normal Ragekit shader may be harmful for people with photosensitivity. Enabling this switches to a fainter alternative."; TOOLTIP_SWWM_CAMHUD = "By default, when the player is looking through a camera, most HUD elements excluding messages will be hidden. Set this to keep the full HUD."; TOOLTIP_SWWM_UNCAPALERT = "If enabled, all weapons and projectiles will have infinite noise radius. May fix maps that employ vanilla-style teleport traps."; TOOLTIP_SWWM_COLLECTANIMKEY = "Play special first person animations when picking up keys."; diff --git a/language.es_base b/language.es_base index 331caf053..e788ea4a5 100644 --- a/language.es_base +++ b/language.es_base @@ -778,7 +778,7 @@ SWWM_INTERTIP128 = "El método general de Saya para entablar amistad con aliens SWWM_INTERTIP129 = "El bunnyhopping te permite alcanzar velocidades ridículas (aunque no lo suficiente para ir a cuadros, desafortunadamente)."; SWWM_INTERTIP130 = "El potenciado de velocidad del Ragekit puede hacerte rebotar violentamente contra todo mientras corres. Esto puede ser problemático en espacios cerrados."; SWWM_INTERTIP131 = "En Heretic y Hexen, un ítem conocido como el Enlace de Seguridad puede aparecer. Si por cualquier razón te has atascado en algún tipo de trampa de la que no parece que haya salida, este será tu as en la manga."; -SWWM_INTERTIP132 = "LA Marca de Devastación es bastante inestable, pero provee de un mayor potenciado de daño que el Ragekit, para TODO el daño que puedas causar, incluso a ti. Sí, un juguetito bastante peligroso, desde luego."; +SWWM_INTERTIP132 = "La Marca de Devastación es bastante inestable, pero provee de un mayor potenciado de daño que el Ragekit, para TODO el daño que puedas causar, incluso a ti. Sí, un juguetito bastante peligroso, desde luego."; SWWM_INTERTIP133 = "El Sprite Divino puede potenciar tu salud hasta niveles absurdos, pero sus efectos se desvanecen rápidamente después de un rato. Es el ítem de salud más potente que tienes al alcance, pero ten en cuenta que debe ser activado manualmente. A diferencia de muchos otros, no te va a salvar el trasero por su cuenta."; SWWM_INTERTIP134 = "La Mano Divina es otra arma que se puede beneficiar de los efectos del Ragekit, convirtiendo lo que ya es un puñetazo letal en algo realmente divino."; SWWM_INTERTIP135 = "Mantener los gatillos del Rifle Sparkster pulsados incrementará gradualmente la potencia de disparo al soltarlos. Afortunadamente, no existe la posibilidad de que el arma explote si los mantienes demasiado tiempo, solo un arma mal diseñada por humanos podría ser tan disfuncional."; diff --git a/language.es_menu b/language.es_menu index b4ddbc6b2..b8e10cb89 100644 --- a/language.es_menu +++ b/language.es_menu @@ -125,7 +125,6 @@ SWWM_PRECISECROSSHAIR = "Mira Precisa"; SWWM_MCTITLE = "Opciones de Compatibilidad con Mods"; SWWM_LDSPOIL = "Mostrar Siempre Legendarios"; SWWM_ETITLE = "Opciones de Efectos"; -SWWM_RAGESHADER = "Shader Alternativo de Ragekit"; SWWM_CAMHUD = "HUD Completo en Cámaras"; SWWM_UNCAPALERT = "Rango de Alerta Ilimitado"; SWWM_COLLECTANIMKEY = "Animaciones de Llaves"; @@ -309,7 +308,6 @@ TOOLTIP_SWWM_COLLECTANIM = "Muestra animaciones especiales en primera persona al TOOLTIP_SWWM_SHADOWS = "Activa sombras redondas para varias entidades, combina con sombras de sprites para un mejor efecto. Requiere un reinicio de mapa."; TOOLTIP_SWWM_PRECISECROSSHAIR = "Proyecta la mira en el punto que el arma alcanzará, en vez de quedarse en el centro de la pantalla."; TOOLTIP_SWWM_LDSPOIL = "[LegenDoom] Muestra siempre el sufijo de \"Legendario\" en las etiquetas de barra de vida, en lugar de despues de que el enemigo se haya transformado. Desactiva si prefieres no estropear la sorpresa."; -TOOLTIP_SWWM_RAGESHADER = "El shader normal del Ragekit puede ser dañino para personas con fotosensibilidad. Activando esto se cambia a una alternativa más suave."; TOOLTIP_SWWM_CAMHUD = "Por defecto, cuando el jugador está mirando por una cámara, la mayor parte de elementos del HUD excluyendo mensajes son ocultados. Activa esto para mantener el HUD completo."; TOOLTIP_SWWM_UNCAPALERT = "Si se activa, todas las armas y proyectiles tendrán un rango de ruido ilimitado. Puede arreglar mapas que usan trampas de teletransporte estilo vanilla."; TOOLTIP_SWWM_COLLECTANIMKEY = "Muestra animaciones especiales en primera persona al recoger llaves."; diff --git a/language.version b/language.version index 46b7fc3a7..44874fdfc 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre \cu(Wed 1 Sep 09:56:20 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.1pre \cu(2021-09-01 09:56:20)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r1 \cu(Wed 1 Sep 18:53:53 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.1pre r1 \cu(2021-09-01 18:53:53)\c-"; diff --git a/menudef.txt b/menudef.txt index 335e3b0f6..13dfa3a15 100644 --- a/menudef.txt +++ b/menudef.txt @@ -94,7 +94,6 @@ OptionMenu "SWWMOptionMenu" StaticText " " StaticText "$SWWM_OTITLE", "Blue" Option "$SWWM_SHADERS", "swwm_shaders", "YesNo" - Option "$SWWM_RAGESHADER", "swwm_rageshader", "YesNo" Slider "$SWWM_FLASH", "swwm_flashstrength", 0.0, 1.0, 0.1, 1 Slider "$SWWM_BUMP", "swwm_bumpstrength", 0.0, 1.0, 0.1, 1 Option "$SWWM_CAMHUD", "swwm_camhud", "YesNo" diff --git a/models/modelnotes.txt b/models/modelnotes.txt index 70c98ce3f..3180a2758 100644 --- a/models/modelnotes.txt +++ b/models/modelnotes.txt @@ -37,7 +37,7 @@ Key gestures: Extra items: - Safety Tether x Devastation Sigil - - Divine Sprite + x Divine Sprite Character models: - White Lady diff --git a/shaders/pp/Devascreen.fp b/shaders/pp/Devascreen.fp new file mode 100644 index 000000000..ec078f3e6 --- /dev/null +++ b/shaders/pp/Devascreen.fp @@ -0,0 +1,35 @@ +// hateful pulses + +vec2 heatdist( in vec2 uv ) +{ + vec2 ofs = texture(BumpTex,uv*8.-vec2(0.,.5)*timer).xy; + ofs = (ofs-.5)*2.; + ofs *= pow(length(ofs),.5); + ofs *= .025; + return ofs; +} + +void main() +{ + vec2 uv = TexCoord; + vec2 bresl = textureSize(InputTexture,0); + vec2 sr = vec2(1.,bresl.y/bresl.x); + // vignette fade, will be needed later + vec2 vuv = uv.xy*(1.-uv.yx)*4.; + float fade = 1.-(vuv.x*vuv.y); + fade = pow(clamp(fade-(.6-.3*pow(xtrastr,.5)),0.,1.),3.); + fade = pow(fade,.9+.2*texture(NoiseTex,vec2(timer*.05)).x-.1*xtrastr); + vec3 col = texture(InputTexture,uv+fade*heatdist(uv*sr)).rgb; + col += texture(InputTexture,uv+.001*xtrastr*texture(NoiseTex,vec2(timer*.4536,timer*.7835)).xy+fade*heatdist(uv*sr)).rgb; + col += texture(InputTexture,uv-.001*xtrastr*texture(NoiseTex,vec2(timer*.6735,timer*.4335)).xy+fade*heatdist(uv*sr)).rgb; + col *= .4*vec3(.97,.75,1.12); + col = pow(col,vec3(1.1,1.2,1.)); + fade = pow(fade,.75); + col = mix(col,col-vec3(.4,.8,.3),fade*1.2); + // overlay first pulse + vec3 ovr = texture(WarpTex1,uv*2.+heatdist(uv*sr*.25)-vec2(0.,.15)*timer).rgb; + col += ovr*fade; + ovr = texture(WarpTex2,uv*2.+heatdist(uv*sr*.25)+vec2(0.,.15)*timer).rgb; + col -= ovr*fade; + FragColor = vec4(clamp(col,0.,1.),1.); +} diff --git a/shaders/pp/Ragescreen.fp b/shaders/pp/Ragescreen.fp index dee9650f4..929231c75 100644 --- a/shaders/pp/Ragescreen.fp +++ b/shaders/pp/Ragescreen.fp @@ -1,4 +1,4 @@ -// RAGE +// less eye-searing rage #define TWOPI 6.28318530718 @@ -6,17 +6,17 @@ void main() { vec2 uv = TexCoord; vec3 col = texture(InputTexture,uv).rgb; - col *= vec3(.5)+texture(WarpTex,vec2(fract(uv.x+.1*sin(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr; - col *= vec3(.5)+texture(WarpTex,2.*vec2(fract(uv.x+.1*cos(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr; - for ( float i=0.; i<4.; i+=1. ) + col *= vec3(.8)+texture(WarpTex,vec2(fract(uv.x+.1*sin(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr*.4; + col *= vec3(.8)+texture(WarpTex,2.*vec2(fract(uv.x+.1*cos(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr*.4; + for ( float i=0.; i<3.; i+=1. ) { - float str = texture(NoiseTex,vec2(fract(timer*.2),fract(timer*.02))).x*.07; - str *= pow(xtrastr,1.5); + float str = texture(NoiseTex,vec2(fract(timer*.2),fract(timer*.02))).x*.007; + str *= pow(xtrastr,2.); float p = distance(uv,vec2(.5)); vec2 suv = (uv-.5)*(1.-(str*i*p))+.5; - col += texture(InputTexture,suv).rgb+pow(p,2.)*vec3(1.8,.2,0.)*xtrastr; + col += texture(InputTexture,suv).rgb+pow(p,5.)*vec3(.45,.05,0.)*xtrastr; } - col /= 5.; - col *= vec3(1.2,.9,.7); + col /= 4.; + col *= vec3(1.1,.95,.85); FragColor = vec4(col,1.0); } diff --git a/shaders/pp/RagescreenAlt.fp b/shaders/pp/RagescreenAlt.fp deleted file mode 100644 index 929231c75..000000000 --- a/shaders/pp/RagescreenAlt.fp +++ /dev/null @@ -1,22 +0,0 @@ -// less eye-searing rage - -#define TWOPI 6.28318530718 - -void main() -{ - vec2 uv = TexCoord; - vec3 col = texture(InputTexture,uv).rgb; - col *= vec3(.8)+texture(WarpTex,vec2(fract(uv.x+.1*sin(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr*.4; - col *= vec3(.8)+texture(WarpTex,2.*vec2(fract(uv.x+.1*cos(uv.y*TWOPI)),fract(uv.y-timer*.1))).rgb*xtrastr*.4; - for ( float i=0.; i<3.; i+=1. ) - { - float str = texture(NoiseTex,vec2(fract(timer*.2),fract(timer*.02))).x*.007; - str *= pow(xtrastr,2.); - float p = distance(uv,vec2(.5)); - vec2 suv = (uv-.5)*(1.-(str*i*p))+.5; - col += texture(InputTexture,suv).rgb+pow(p,5.)*vec3(.45,.05,0.)*xtrastr; - } - col /= 4.; - col *= vec3(1.1,.95,.85); - FragColor = vec4(col,1.0); -} diff --git a/sndinfo.txt b/sndinfo.txt index 13790322c..1b5390660 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -1027,6 +1027,15 @@ powerup/barrierend sounds/items/barrieroff.ogg powerup/mykradvo sounds/items/AnomExplode.ogg $limit powerup/mykradvo 16 powerup/mykradvoamb sounds/items/AnomHeartBeat.ogg +powerup/devastation sounds/items/devaon.ogg +powerup/devastationamb sounds/items/devaamb.ogg +powerup/devastationact sounds/items/devaact.ogg +powerup/devastationhit sounds/items/devahit.ogg +powerup/devastationend sounds/items/devaoff.ogg +powerup/divineuse sounds/items/divion.ogg +powerup/divineamb sounds/items/diviamb.ogg +powerup/divineact sounds/items/diviact.ogg +powerup/divineend sounds/items/diviend.ogg mykradvo/arc1 sounds/items/mykrarc1.ogg mykradvo/arc2 sounds/items/mykrarc2.ogg diff --git a/sounds/items/devaact.ogg b/sounds/items/devaact.ogg new file mode 100644 index 000000000..b0f0bc852 Binary files /dev/null and b/sounds/items/devaact.ogg differ diff --git a/sounds/items/devaamb.ogg b/sounds/items/devaamb.ogg new file mode 100644 index 000000000..b78e696dd Binary files /dev/null and b/sounds/items/devaamb.ogg differ diff --git a/sounds/items/devahit.ogg b/sounds/items/devahit.ogg new file mode 100644 index 000000000..6128a4f81 Binary files /dev/null and b/sounds/items/devahit.ogg differ diff --git a/sounds/items/devaoff.ogg b/sounds/items/devaoff.ogg new file mode 100644 index 000000000..56f43357a Binary files /dev/null and b/sounds/items/devaoff.ogg differ diff --git a/sounds/items/devaon.ogg b/sounds/items/devaon.ogg new file mode 100644 index 000000000..75d59028a Binary files /dev/null and b/sounds/items/devaon.ogg differ diff --git a/sounds/items/diviamb.ogg b/sounds/items/diviamb.ogg new file mode 100644 index 000000000..6a4986f9b Binary files /dev/null and b/sounds/items/diviamb.ogg differ diff --git a/textures/devawarp1.png b/textures/devawarp1.png new file mode 100644 index 000000000..eb28461b6 Binary files /dev/null and b/textures/devawarp1.png differ diff --git a/textures/devawarp2.png b/textures/devawarp2.png new file mode 100644 index 000000000..7060f1de9 Binary files /dev/null and b/textures/devawarp2.png differ diff --git a/textures/frosttex.png b/textures/frosttex.png new file mode 100644 index 000000000..3a6e8d26a Binary files /dev/null and b/textures/frosttex.png differ diff --git a/textures/roughwarp.png b/textures/roughwarp.png new file mode 100644 index 000000000..10944d1e4 Binary files /dev/null and b/textures/roughwarp.png differ diff --git a/textures/smoketex.png b/textures/smoketex.png new file mode 100644 index 000000000..d1bf3e116 Binary files /dev/null and b/textures/smoketex.png differ diff --git a/zscript/handler/swwm_handler_replacements.zsc b/zscript/handler/swwm_handler_replacements.zsc index 3bbfc31b6..185af326c 100644 --- a/zscript/handler/swwm_handler_replacements.zsc +++ b/zscript/handler/swwm_handler_replacements.zsc @@ -700,16 +700,15 @@ extend Class SWWMHandler else if ( e.Replacee is 'ArmorBonus' ) e.Replacement = 'ArmorNuggetItem'; else if ( e.Replacee is 'HealthBonus' ) e.Replacement = 'HealthNuggetItem'; else if ( (e.Replacee is 'ArtiTimeBomb') || (e.Replacee is 'ArtiBlastRadius') || (e.Replacee is 'ArtiPoisonBag') || (e.Replacee is 'ArtiHealingRadius') ) e.Replacement = (nugflip=!nugflip)?'HealthNuggetBundleSpawn':'ArmorNuggetBundleSpawn'; - else if ( (e.Replacee is 'HealthBonus') ) e.Replacement = 'HealthNuggetItem'; else if ( (e.Replacee is 'Stimpack') || (e.Replacee is 'CrystalVial') ) e.Replacement = 'TetraHealthItem'; else if ( (e.Replacee is 'Medikit') || (e.Replacee is 'ArtiHealth') ) e.Replacement = 'CubeHealthItem'; else if ( (e.Replacee is 'Soulsphere') || (e.Replacee is 'ArtiSuperHealth') ) e.Replacement = 'RefresherItem'; - else if ( (e.Replacee is 'Megasphere') || (e.Replacee is 'ArtiEgg') || (e.Replacee is 'ArtiBoostArmor') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('DivineSprite',worldonly:true))?'GrilledCheeseSandwich':'DivineSprite'; - else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'GhostArtifact':'Mykradvo'; + else if ( (e.Replacee is 'Megasphere') || (e.Replacee is 'ArtiEgg') || (e.Replacee is 'ArtiBoostArmor') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('DivineSprite',worldonly:true)||!SWWMUtility.CheckNeedsItem('DivineSprite',true))?'GrilledCheeseSandwich':'DivineSprite'; + else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true)||!SWWMUtility.CheckNeedsItem('Mykradvo',true))?'GhostArtifact':'Mykradvo'; else if ( e.Replacee is 'Radsuit' ) e.Replacement = 'EBarrier'; else if ( (e.Replacee is 'ArtiFly') ) e.Replacement = 'GravitySuppressor'; - else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'FuckingInvinciball':'Mykradvo'; - else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('AngerySigil',worldonly:true))?'Ragekit':'AngerySigil'; + else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('Mykradvo',worldonly:true)||!SWWMUtility.CheckNeedsItem('Mykradvo',true))?'FuckingInvinciball':'Mykradvo'; + else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('AngerySigil',worldonly:true)||!SWWMUtility.CheckNeedsItem('AngerySigil',true))?'Ragekit':'AngerySigil'; else if ( (e.Replacee is 'AllMap') || (e.Replacee is 'SuperMap') ) e.Replacement = 'Omnisight'; else if ( (e.Replacee is 'Infrared') || (e.Replacee is 'ArtiTorch') ) e.Replacement = 'SWWMLamp'; else if ( (e.Replacee is 'GreenArmor') || (e.Replacee is 'SilverShield') || (e.Replacee is 'PlatinumHelm') || (e.Replacee is 'AmuletOfWarding') ) e.Replacement = 'BlastSuitItem'; diff --git a/zscript/handler/swwm_handler_shaders.zsc b/zscript/handler/swwm_handler_shaders.zsc index c226d7159..cc6802593 100644 --- a/zscript/handler/swwm_handler_shaders.zsc +++ b/zscript/handler/swwm_handler_shaders.zsc @@ -13,7 +13,6 @@ extend Class SWWMHandler Shader.SetEnabled(p,"GhostShader",false); Shader.SetEnabled(p,"InvinciShader",false); Shader.SetEnabled(p,"RagekitShader",false); - Shader.SetEnabled(p,"RagekitAltShader",false); Shader.SetEnabled(p,"Glitch",false); Shader.SetEnabled(p,"Grain",false); } @@ -24,31 +23,24 @@ extend Class SWWMHandler let mo = p.mo; if ( !mo ) return; bool pc = (p.camera == mo); + let deva = AngeryPower(mo.FindInventory("AngeryPower")); + if ( pc && deva && swwm_shaders ) + { + Shader.SetEnabled(p,"DevastationShader",true); + Shader.SetUniform1f(p,"DevastationShader","timer",(gametic+e.FracTic)/GameTicRate); + double xstrastr = 1.+max(0,deva.lastpulse-(gametic+e.Fractic))/35.; + Shader.SetUniform1f(p,"DevastationShader","xtrastr",xstrastr**2.); + } + else Shader.SetEnabled(p,"DevastationShader",false); let rage = RagekitPower(mo.FindInventory("RagekitPower")); if ( pc && rage && swwm_shaders ) { - if ( swwm_rageshader ) - { - Shader.SetEnabled(p,"RagekitShader",false); - Shader.SetEnabled(p,"RagekitAltShader",true); - Shader.SetUniform1f(p,"RagekitAltShader","timer",(gametic+e.FracTic)/GameTicRate); - double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.; - Shader.SetUniform1f(p,"RagekitAltShader","xtrastr",xstrastr**2.); - } - else - { - Shader.SetEnabled(p,"RagekitAltShader",false); - Shader.SetEnabled(p,"RagekitShader",true); - Shader.SetUniform1f(p,"RagekitShader","timer",(gametic+e.FracTic)/GameTicRate); - double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.; - Shader.SetUniform1f(p,"RagekitShader","xtrastr",xstrastr**2.); - } - } - else - { - Shader.SetEnabled(p,"RagekitShader",false); - Shader.SetEnabled(p,"RagekitAltShader",false); + Shader.SetEnabled(p,"RagekitShader",true); + Shader.SetUniform1f(p,"RagekitShader","timer",(gametic+e.FracTic)/GameTicRate); + double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.; + Shader.SetUniform1f(p,"RagekitShader","xtrastr",xstrastr**2.); } + else Shader.SetEnabled(p,"RagekitShader",false); let ghost = GhostPower(mo.FindInventory("GhostPower")); if ( pc && ghost && swwm_shaders ) Shader.SetEnabled(p,"GhostShader",true); else Shader.SetEnabled(p,"GhostShader",false); diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc index 122cdc348..db1543ed4 100644 --- a/zscript/items/swwm_powerups.zsc +++ b/zscript/items/swwm_powerups.zsc @@ -2807,7 +2807,7 @@ Class Mykradvo : Inventory s.pitch = pt; s.ReactionTime += Random[ExploS](-2,2); } - A_StartSound("mykradvo/smallarc",CHAN_WEAPON); + A_StartSound("mykradvo/smallarc",CHAN_WEAPON,attenuation:3.); A_SetTics(Random[Mykradvo](10,50)); } @@ -2877,8 +2877,8 @@ Class Mykradvo : Inventory Inventory.PickupSound "misc/p_pkup"; Inventory.UseSound "mykradvo/arc"; Inventory.PickupMessage "$T_MYKRADVO"; - Inventory.MaxAmount 5; - Inventory.InterHubAmount 5; + Inventory.MaxAmount 3; + Inventory.InterHubAmount 3; Inventory.PickupFlash "SWWMPurplePickupFlash"; +INVENTORY.ALWAYSPICKUP; +INVENTORY.AUTOACTIVATE; @@ -2908,7 +2908,7 @@ Class MykradvoX : GhostArtifactX override void PostBeginPlay() { Super.PostBeginPlay(); - A_StartSound("powerup/mykradvoamb",CHAN_VOICE,CHANF_LOOP); + A_StartSound("powerup/mykradvoamb",CHAN_VOICE,CHANF_LOOP,attenuation:2.); } override void Tick() { @@ -3077,6 +3077,7 @@ Class AngeryPower : Powerup { Actor l, snd; int lasteffect; + transient int lastpulse; Default { @@ -3094,6 +3095,7 @@ Class AngeryPower : Powerup SWWMHandler.DoFlash(Owner,Color(64,224,0,255),30); Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.); lasteffect = int.min; + lastpulse = max(lastpulse,gametic+35); if ( Owner is 'Demolitionist' ) Demolitionist(Owner).lastbump *= .95; l = Spawn("AngeryLight",Owner.pos); @@ -3130,6 +3132,7 @@ Class AngeryPower : Powerup Owner.A_QuakeEx(8,8,8,Random[Rage](3,8),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.); Owner.A_StartSound("powerup/devastationhit",CHAN_POWERUP); lasteffect = level.maptime; + lastpulse = max(lastpulse,gametic+35); if ( Owner is 'Demolitionist' ) Demolitionist(Owner).lastbump *= .9; } @@ -3199,8 +3202,8 @@ Class AngerySigil : Inventory Inventory.PickupSound "misc/p_pkup"; Inventory.UseSound "powerup/devastation"; Inventory.PickupMessage "$T_DEVASTATION"; - Inventory.MaxAmount 5; - Inventory.InterHubAmount 5; + Inventory.MaxAmount 3; + Inventory.InterHubAmount 3; Inventory.PickupFlash "SWWMPurplePickupFlash"; +INVENTORY.ALWAYSPICKUP; +INVENTORY.AUTOACTIVATE; @@ -3231,7 +3234,7 @@ Class AngerySigilX : GhostArtifactX override void PostBeginPlay() { Super.PostBeginPlay(); - A_StartSound("powerup/devastationamb",CHAN_VOICE,CHANF_LOOP); + A_StartSound("powerup/devastationamb",CHAN_VOICE,CHANF_LOOP,attenuation:2.); } override void Tick() { @@ -3375,14 +3378,14 @@ Class DivineSpriteEffect : Inventory Vector3 ppos = Owner.Vec3offset(0,0,Owner.height/2)+dir*dst; A_SpawnParticle("White",SPF_FULLBRIGHT,30,scl,0,ppos.x,ppos.y,ppos.z,dir.x*.2,dir.y*.2,dir.z*.2,0,0,.05,alph,-1,-scl/30.); } - if ( bHealDone ) + if ( bHealDone || (Owner.Health <= 0) ) { if ( Owner.Health <= 1000 ) DepleteOrDestroy(); return; } healcnt++; healtim--; - if ( healtim <= 0 ) + if ( (healtim <= 0) || (Owner.Health <= 0) ) { Owner.A_StartSound("powerup/divineend",CHAN_ITEMEXTRA); SWWMHandler.DoFlash(Owner,Color(80,255,255,255),40); @@ -3398,12 +3401,14 @@ Class DivineSpriteEffect : Inventory SWWMHandler.DoFlash(Owner,Color(40,255,255,255),20); if ( Owner is 'Demolitionist' ) Demolitionist(Owner).lastbump *= 0.97; + Owner.A_StartSound("powerup/divinehit",CHAN_ITEMEXTRA); } - else if ( !(healcnt%3) ) + else if ( !(healcnt%5) ) { - Owner.GiveBody(100,10000); + Owner.GiveBody(500,10000); SWWMScoreObj.Spawn(100,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health); - SWWMHandler.DoFlash(Owner,Color(10,255,255,255),5); + SWWMHandler.DoFlash(Owner,Color(10,255,255,255),10); + Owner.A_StartSound("powerup/divinehit",CHAN_ITEMEXTRA); } } } @@ -3458,8 +3463,8 @@ Class DivineSprite : Inventory Inventory.PickupSound "misc/p_pkup"; Inventory.UseSound "powerup/divineuse"; Inventory.PickupMessage "$T_DIVINE"; - Inventory.MaxAmount 5; - Inventory.InterHubAmount 5; + Inventory.MaxAmount 3; + Inventory.InterHubAmount 3; Inventory.PickupFlash "SWWMPurplePickupFlash"; +INVENTORY.ALWAYSPICKUP; +INVENTORY.AUTOACTIVATE; @@ -3488,7 +3493,7 @@ Class DivineSpriteX : GhostArtifactX override void PostBeginPlay() { Super.PostBeginPlay(); - A_StartSound("powerup/divineamb",CHAN_VOICE,CHANF_LOOP); + A_StartSound("powerup/divineamb",CHAN_VOICE,CHANF_LOOP,attenuation:2.); } override void Tick() { diff --git a/zscript/menu/swwm_inter.zsc b/zscript/menu/swwm_inter.zsc index 406b1c936..4ebee2322 100644 --- a/zscript/menu/swwm_inter.zsc +++ b/zscript/menu/swwm_inter.zsc @@ -121,11 +121,11 @@ Class SWWMStatScreen : StatusScreen abstract { // skip DLC tips for now if ( (i >= 59) && (i <= 68) ) continue; - if ( (i >= 130) && (i <= 139) ) continue; + if ( (i >= 133) && (i <= 139) ) continue; ents.Push(i); } // account for skipped dlc tips (important, will crash otherwise) - maxtip -= 20; + maxtip -= 17; if ( pdata.lasttip.Size() >= maxtip ) { // exclude last one, start over diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 34e0a1d54..eaaeebb54 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -351,7 +351,7 @@ Class Demolitionist : PlayerPawn let owned = FindInventory(type); if ( owned && (owned.Amount >= owned.MaxAmount) ) continue; let def = GetDefaultByType (type); - if ( def.Icon.isValid() && !(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "MagAmmo") && !(type is "Armor") && !(type is "Key") ) + if ( def.Icon.isValid() && !(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "MagAmmo") && !(type is "Armor") && !(type is "Key") && !(type is "DivineSpriteEffect") ) GiveInventory(type,(amount<=0)?def.MaxAmount:amount,true); } if ( !giveall ) return;