diff --git a/animdefs.misc b/animdefs.misc index 7f369d516..5d1cbd7ac 100644 --- a/animdefs.misc +++ b/animdefs.misc @@ -1,7 +1,13 @@ +// title stuff canvastexture LOGOFADE 4 4 + +// ammo leds canvastexture PLASBLED 64 64 canvastexture PLASBFAD 4 4 canvastexture SHEENLED 128 128 canvastexture QUADRLED 64 64 canvastexture MORTLED1 256 128 canvastexture MORTLED2 64 16 + +// minimap +canvastexture MMCANVAS 80 80 diff --git a/cvarinfo.base b/cvarinfo.base index 2d23d4bc2..ff1822255 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -57,7 +57,7 @@ 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. server bool swwm_usetopickup = false; // allow item pickup only by pressing use nosave bool swwm_buttsfx = true; // buttslam homerun SFX -user float swwm_bumpstrength = 1.0; // intensity of fov bumping +user float swwm_bumpstrength = 1.0; // intensity of fov/viewangles bumping server bool swwm_nomagdrop = true; // does not drop spent magazines (the "environmentally conscious" option) nosave bool swwm_nomapmsg = false; // disables special map dialogue messages nosave bool swwm_weapontooltips = true; // shows a tooltip on weapon operation when first selected @@ -79,6 +79,7 @@ server bool swwm_lobdoubled = false; // [LOB] Enable Double Death monster spawn nosave int swwm_bardist = 2000; // distance at which healthbars will be visible (does not affect player bars) nosave bool swwm_oldcheats = false; // has received the "old cheats" dialogue from Zanaveth nosave bool swwm_ccmessage = false; // has received the "corruption cards" dialogue from Cytho +nosave bool swwm_useweaponbar = false; // scroll through weapons using a bar, like with inventory items nosave bool swwm_percentstats = false; // show level stats as percentages, like in intermissions // minimap settings @@ -86,6 +87,7 @@ nosave bool swwm_mm_enable = true; // show a minimap below the score counter nosave noarchive float swwm_mm_zoom = 1; // zoom level of minimap nosave bool swwm_mm_missiles = true; // show projectiles (how revolutionary) nosave int swwm_mm_colorset = 0; // 0: Demolitionist, 1: GZDoom, 2: Doom, 3: Strife, 4: Raven +nosave bool swwm_mm_usecanvas = false; // use a canvas to draw the minimap, so its pixel density is consistent with the rest of the HUD server noarchive bool swwm_iseriouslywanttoplaythiswithbd = false; // self-explanatory diff --git a/gldefs/misc.txt b/gldefs/misc.txt index 1e14fbd34..8b913f2dd 100644 --- a/gldefs/misc.txt +++ b/gldefs/misc.txt @@ -100,6 +100,66 @@ Material Texture "graphics/HUD/HealthBarD.png" Define "TEX_SIZE" = "vec2(120.,25.)" Texture "noisetex" "textures/graynoise.png" } +Material Texture "graphics/HUD/Icons/W_DeepImpact.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_ExplodiumGun.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Spreadgun.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Wallbuster.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Eviscerator.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Hellblazer.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Sparkster.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_SilverBullet.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_CandyGun.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Ynykron.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_ItamexHammer.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_PlasmaBlast.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_SheenHMG.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_Quadravol.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} +Material Texture "graphics/HUD/Icons/W_MortalRifle.png" +{ + Shader "shaders/glsl/Bilinear.fp" +} Material Texture "graphics/dsmapfont.png" { Shader "shaders/glsl/AreaName.fp" diff --git a/gldefs/pp.txt b/gldefs/pp.txt index 90a1e96d0..3c6f8678c 100644 --- a/gldefs/pp.txt +++ b/gldefs/pp.txt @@ -118,3 +118,9 @@ HardwareShader PostProcess scene Uniform float ni Texture NoiseTexture "textures/graynoise.png" } +HardwareShader PostProcess scene +{ + Name "BokehSel" + Shader "shaders/pp/BokehSel.fp" 330 + Uniform float strength +} diff --git a/graphics/HUD/Icons/W_CandyGun.png b/graphics/HUD/Icons/W_CandyGun.png new file mode 100644 index 000000000..d9005ccfb Binary files /dev/null and b/graphics/HUD/Icons/W_CandyGun.png differ diff --git a/graphics/HUD/Icons/W_DeepImpact.png b/graphics/HUD/Icons/W_DeepImpact.png new file mode 100644 index 000000000..bc24711fb Binary files /dev/null and b/graphics/HUD/Icons/W_DeepImpact.png differ diff --git a/graphics/HUD/Icons/W_Eviscerator.png b/graphics/HUD/Icons/W_Eviscerator.png new file mode 100644 index 000000000..37169486d Binary files /dev/null and b/graphics/HUD/Icons/W_Eviscerator.png differ diff --git a/graphics/HUD/Icons/W_ExplodiumGun.png b/graphics/HUD/Icons/W_ExplodiumGun.png new file mode 100644 index 000000000..23cac2357 Binary files /dev/null and b/graphics/HUD/Icons/W_ExplodiumGun.png differ diff --git a/graphics/HUD/Icons/W_Hellblazer.png b/graphics/HUD/Icons/W_Hellblazer.png new file mode 100644 index 000000000..f265f1a47 Binary files /dev/null and b/graphics/HUD/Icons/W_Hellblazer.png differ diff --git a/graphics/HUD/Icons/W_ItamexHammer.png b/graphics/HUD/Icons/W_ItamexHammer.png new file mode 100644 index 000000000..c702815fb Binary files /dev/null and b/graphics/HUD/Icons/W_ItamexHammer.png differ diff --git a/graphics/HUD/Icons/W_MortalRifle.png b/graphics/HUD/Icons/W_MortalRifle.png new file mode 100644 index 000000000..aefd1531d Binary files /dev/null and b/graphics/HUD/Icons/W_MortalRifle.png differ diff --git a/graphics/HUD/Icons/W_PlasmaBlast.png b/graphics/HUD/Icons/W_PlasmaBlast.png new file mode 100644 index 000000000..39ed28b28 Binary files /dev/null and b/graphics/HUD/Icons/W_PlasmaBlast.png differ diff --git a/graphics/HUD/Icons/W_Quadravol.png b/graphics/HUD/Icons/W_Quadravol.png new file mode 100644 index 000000000..dad9f70a7 Binary files /dev/null and b/graphics/HUD/Icons/W_Quadravol.png differ diff --git a/graphics/HUD/Icons/W_SheenHMG.png b/graphics/HUD/Icons/W_SheenHMG.png new file mode 100644 index 000000000..0cc239abb Binary files /dev/null and b/graphics/HUD/Icons/W_SheenHMG.png differ diff --git a/graphics/HUD/Icons/W_SilverBullet.png b/graphics/HUD/Icons/W_SilverBullet.png new file mode 100644 index 000000000..324848356 Binary files /dev/null and b/graphics/HUD/Icons/W_SilverBullet.png differ diff --git a/graphics/HUD/Icons/W_Sparkster.png b/graphics/HUD/Icons/W_Sparkster.png new file mode 100644 index 000000000..0b085b0d7 Binary files /dev/null and b/graphics/HUD/Icons/W_Sparkster.png differ diff --git a/graphics/HUD/Icons/W_Spreadgun.png b/graphics/HUD/Icons/W_Spreadgun.png new file mode 100644 index 000000000..127f8fc8c Binary files /dev/null and b/graphics/HUD/Icons/W_Spreadgun.png differ diff --git a/graphics/HUD/Icons/W_Wallbuster.png b/graphics/HUD/Icons/W_Wallbuster.png new file mode 100644 index 000000000..4a6e4f86b Binary files /dev/null and b/graphics/HUD/Icons/W_Wallbuster.png differ diff --git a/graphics/HUD/Icons/W_Ynykron.png b/graphics/HUD/Icons/W_Ynykron.png new file mode 100644 index 000000000..496721c6e Binary files /dev/null and b/graphics/HUD/Icons/W_Ynykron.png differ diff --git a/language.def_menu b/language.def_menu index eb875437c..16f5178ae 100644 --- a/language.def_menu +++ b/language.def_menu @@ -140,7 +140,7 @@ SWWM_TIME_SECONDS = "seconds"; SWWM_ATITLE = "Achievements"; SWWM_USETOPICKUP = "Exclusive Use To Pickup"; SWWM_BUTTSFX = "Clapping Buttcheeks"; -SWWM_BUMP = "FOV Bump Strength"; +SWWM_BUMP = "View Bump Strength"; SWWM_ENGINE = "Engine"; SWWM_NOMAGDROP = "Drop Spent Mags"; SWWM_NOMAPMSG = "Map Special Messages"; @@ -183,6 +183,7 @@ SWWM_DAMNUMS_COLOR = "Color Damage Numbers"; SWWM_SHOWMAPTITLE = "Animated Map Title"; SWWM_LOBDOUBLED = "LOB Double Death"; SWWM_BARDIST = "Healthbar Distance"; +SWWM_USEWEAPONBAR = "Alternate Weapon Selection"; SWWM_PERCENTSTATS = "Percentual Stats"; SWWM_MM_ENABLE = "Show Minimap"; SWWM_MM_MISSILES = "Projectiles In Minimap"; @@ -192,6 +193,7 @@ SWWM_GZDOOMCOLORS = "GZDoom Custom"; SWWM_DOOMCOLORS = "Vanilla Doom"; SWWM_STRIFECOLORS = "Vanilla Strife"; SWWM_RAVENCOLORS = "Vanilla Raven"; +SWWM_MM_USECANVAS = "Fixed Scale Minimap"; SWWM_AC_UNLOCKED = "Unlocked: "; SWWM_AC_INCOMPLETE = "Incomplete: "; SWWM_AC_UNDISCOVERED = "Undiscovered: "; @@ -251,7 +253,7 @@ TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filters out achievements at 0% in the Demolit TOOLTIP_SWWM_PLAYTIME = "Your total play time with this mod loaded."; TOOLTIP_SWWM_USETOPICKUP = "Prevents picking up mod items through touch, exclusively requiring a use action instead. Note that this disables the \"dropped item magnet\" feature when holding Use."; TOOLTIP_SWWM_BUTTSFX = "The Demolitionist's buttcheeks will VERY AUDIBLY clap upon executing a successful buttslam."; -TOOLTIP_SWWM_BUMPSTRENGTH = "Controls how strong the bumping of the FOV is from weapon recoil and other actions."; +TOOLTIP_SWWM_BUMPSTRENGTH = "Controls how strong the bumping of FOV and view angles is from weapon recoil and other actions."; TOOLTIP_SWWM_ENGINE = "Don't touch this."; TOOLTIP_SWWM_NOMAGDROP = "By default, the Demolitionist will be somewhat environmentally conscious and not leave spent magazines lying around. Enable if you prefer the added clutter."; TOOLTIP_SWWM_NOMAPMSG = "Toggles special animated character messages on certain maps (usually vanilla)."; @@ -274,11 +276,13 @@ TOOLTIP_SWWM_DAMNUMS_COLOR = "Damage numbers will change color based on the type TOOLTIP_SWWM_SHOWMAPTITLE = "Shows an animated title card when entering a map. It's just like Dark Souls!"; TOOLTIP_SWWM_LOBDOUBLED = "[Legion of Bones] Enables \"Double Death\", which makes enemies first spawn as their vanilla variants to then turn undead on defeat."; TOOLTIP_SWWM_BARDIST = "Distance in map units at which healthbar visibility will begin to fade. Does not affect the healthbars of other players."; +TOOLTIP_SWWM_USEWEAPONBAR = "Enables an alternate method for scrolling through weapons akin to the inventory bar. Use Primary Fire to accept, and Alternate Fire to cancel."; TOOLTIP_SWWM_PERCENTSTATS = "Shows kills/items/secrets in the HUD as percentages, rather than counters."; TOOLTIP_SWWMACHIEVEMENTMENU = "View your achievements."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap on the top right corner of the screen."; TOOLTIP_SWWM_MM_MISSILES = "Displays projectiles in the minimap. Can be toggled if this clutters too much."; TOOLTIP_SWWM_MM_COLORSET = "Choose what palette to use for the minimap."; +TOOLTIP_SWWM_MM_USECANVAS = "Rather than being drawn directly on-screen, the minimap will be drawn to a texture, maintaining the same pixel density as the rest of the HUD. Due to engine quirks, this causes the map to have a one-frame delay."; TOOLTIP_SWWMDEBUGMENU = "Don't touch this unless you know what you're doing."; TOOLTIP_SWWM_DEBUGBLAST = "Shows radii of DoExplosion calls. Damaging explosions are green, with yellow for the hotspot. Non-damaging explosions are blue, with magenta for the hotspot."; TOOLTIP_SWWM_DEBUGVIEW = "Shows collision, orientation and velocity of actors, as well as relationship lines to their target/tracer/master pointers (gold/orange/purple respectively)."; diff --git a/language.es_menu b/language.es_menu index 87ef287f9..f105f36a6 100644 --- a/language.es_menu +++ b/language.es_menu @@ -138,7 +138,7 @@ SWWM_TIME_SECONDS = "segundos"; SWWM_ATITLE = "Logros"; SWWM_USETOPICKUP = "Uso Exclusivo para Recoger"; SWWM_BUTTSFX = "Azote de Nalgas"; -SWWM_BUMP = "Intensidad de Sacudida de FOV"; +SWWM_BUMP = "Intensidad de Sacudida de Vista"; SWWM_ENGINE = "Motor"; SWWM_NOMAGDROP = "Tirar Cargadores Usados"; SWWM_NOMAPMSG = "Mensajes Especiales de Mapa"; @@ -180,6 +180,7 @@ SWWM_DAMNUMS_COLOR = "Colorear Números de Daño"; SWWM_SHOWMAPTITLE = "Título de Mapa Animado"; SWWM_LOBDOUBLED = "LOB Doble Muerte"; SWWM_BARDIST = "Distancia de Barras de Salud"; +SWWM_USEWEAPONBAR = "Selección Alternativa de Armas"; SWWM_PERCENTSTATS = "Estadísticas Percentuales"; SWWM_MM_ENABLE = "Mostrar Minimapa"; SWWM_MM_MISSILES = "Proyectiles en Minimapa"; @@ -189,6 +190,7 @@ SWWM_GZDOOMCOLORS = "Personalizado de GZDoom"; SWWM_DOOMCOLORS = "Doom Vanilla"; SWWM_STRIFECOLORS = "Strife Vanilla"; SWWM_RAVENCOLORS = "Raven Vanilla"; +SWWM_MM_USECANVAS = "Minimapa a Escala Fija"; SWWM_AC_UNLOCKED = "Desbloqueados: "; SWWM_AC_INCOMPLETE = "Incompletos: "; SWWM_AC_UNDISCOVERED = "Sin descubrir: "; @@ -249,7 +251,7 @@ TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filtra logros al 0% en el Menú de Demolicion TOOLTIP_SWWM_PLAYTIME = "Tu tiempo de juego total con este mod cargado."; TOOLTIP_SWWM_USETOPICKUP = "Evita recoger ítems del mod al tocarlos, en su lugar requiriendo exclusivamente una acción de uso. Ten en cuenta que esto deshabilita el \"imán de ítems dropeados\" al mantener la tecla de Usar."; TOOLTIP_SWWM_BUTTSFX = "Las nalgas de la Demolicionista emitiran un azote MUY SONORO al ejecutar exitosamente un golpe de culo."; -TOOLTIP_SWWM_BUMPSTRENGTH = "Controla lo intensa que es la sacudida del FOV por el retroceso de armas y otras acciones."; +TOOLTIP_SWWM_BUMPSTRENGTH = "Controla lo intensa que es la sacudida del FOV y la dirección visual por el retroceso de armas y otras acciones."; TOOLTIP_SWWM_ENGINE = "No toques esto."; TOOLTIP_SWWM_NOMAGDROP = "Por defecto, la Demolicionista será un poco consciente con el medio ambiente y no dejará cargadores usados por ahí. Activa si prefieres la basura adicional."; TOOLTIP_SWWM_NOMAPMSG = "Activa mensajes especiales animados de personajes en ciertos mapas (usualmente vanilla)."; @@ -272,11 +274,13 @@ TOOLTIP_SWWM_DAMNUMS_COLOR = "Los números de daño cambiarán color en base al TOOLTIP_SWWM_SHOWMAPTITLE = "Muestra una animación de título al entrar en un mapa. ¡Es igualito que Dark Souls!"; TOOLTIP_SWWM_LOBDOUBLED = "[Legion of Bones] Habilita \"Doble Muerte\", lo cual hace que los enemigos aparezcan primero como sus variantes vanilla para luego volverse no-muertos al derrotarlos."; TOOLTIP_SWWM_BARDIST = "Distancia en unidades de mapa a la cual la visibilidad de las barras de salud irá desvaneciendo. No afecta a las barras de salud de otros jugadores."; +TOOLTIP_SWWM_USEWEAPONBAR = "Habilita un método alternativo para hacer scroll por las armas similar a la barra de inventario. Usa el Fuego Primario para aceptar, y el Fuego Secundario para cancelar."; TOOLTIP_SWWM_PERCENTSTATS = "Muestra las estadísticas de bajas/ítems/secretos en el HUD como porcentajes, en lugar de contadores."; TOOLTIP_SWWMACHIEVEMENTMENU = "Revisa tus logros."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa en la esquina superior derecha de la pantalla."; TOOLTIP_SWWM_MM_MISSILES = "Muestra proyectiles en el minimapa. Puede ser desactivado si causa problemas de visibilidad."; TOOLTIP_SWWM_MM_COLORSET = "Selecciona que paleta usar para el minimapa."; +TOOLTIP_SWWM_MM_USECANVAS = "En vez de dibujarse directamente a la pantalla, el mapa se dibujará en una texture, mantentiendo la misma densidad de píxel que el resto del HUD. Debido a peculiaridades del motor, esto causa que el mapa tenga un frame de retardo."; TOOLTIP_SWWMDEBUGMENU = "No toques esto a menos que sepas lo que estás haciendo."; TOOLTIP_SWWM_DEBUGBLAST = "Muestra el radio de funciones DoExplosion. Las explosiones con daño son verdes, con amarillo para su punto caliente. Las explosiones sin daño son azules, con magenta para su punto caliente."; TOOLTIP_SWWM_DEBUGVIEW = "Muestra la colisión, orientación y velocidad de actores, junto con lineas de relación hacia sus punteros de objetivo/trazador/maestro (dorado/naranja/púrpura respectivamente)."; diff --git a/language.version b/language.version index e7ae00d29..13d291323 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r813 \cu(Sat 29 Jul 15:03:26 CEST 2023)\c-"; -SWWM_SHORTVER="\cw1.3pre r813 \cu(2023-07-29 15:03:26)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r838 \cu(Sat 29 Jul 14:44:34 CEST 2023)\c-"; +SWWM_SHORTVER="\cw1.3pre r838 \cu(2023-07-29 14:44:34)\c-"; diff --git a/menudef.txt b/menudef.txt index 73c0d75aa..3cb982e97 100644 --- a/menudef.txt +++ b/menudef.txt @@ -154,6 +154,7 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_MM_ENABLE", "swwm_mm_enable", "YesNo" Option "$SWWM_MM_MISSILES", "swwm_mm_missiles", "YesNo" Option "$SWWM_MM_COLORSET", "swwm_mm_colorset", "SWWMMinimapColorset" + Option "$SWWM_MM_USECANVAS", "swwm_mm_usecanvas", "YesNo" Option "$SWWM_TARGET", "swwm_targeter", "SWWMTarget" ScaleSliderFix "$SWWM_BARDIST", "swwm_bardist", 0, 4000, 100, "$SWWM_UNLIMITED" Option "$SWWM_TARGETTAG", "swwm_targettags", "YesNo" @@ -213,6 +214,7 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_SWAPWEAPONS", "swwm_swapweapons", "YesNo" StaticText " " StaticText "$SWWM_ITITLE", 1 + Option "$SWWM_USEWEAPONBAR", "swwm_useweaponbar", "YesNo" Option "$SWWM_USETOPICKUP", "swwm_usetopickup", "YesNo" Option "$SWWM_SINGLEFIRST", "swwm_singlefirst", "YesNo" Option "$SWWM_COLLECTANIM", "swwm_collectanim", "YesNo" diff --git a/shaders/pp/BokehSel.fp b/shaders/pp/BokehSel.fp new file mode 100644 index 000000000..7addd8b2e --- /dev/null +++ b/shaders/pp/BokehSel.fp @@ -0,0 +1,27 @@ +// blur fade from Spooktober + +#define PI 3.14159265 + +void main() +{ + vec2 coord = TexCoord; + vec2 tsiz = vec2(textureSize(InputTexture,0)); + vec2 bof = vec2((tsiz.y/tsiz.x),1.)/256.; + vec4 res = texture(InputTexture,coord); + int rsamples, tstep = 1; + float bstep; + vec2 rcoord; + for ( int i=1; i<=3; i++ ) + { + rsamples = i*3; + for ( int j=0; j 0 ) invoker.hitcnt--; else if ( A_Melee(int(100+invoker.charge*1.5),"itamex/hit",2.4,2.,1.1,MELEE_Rip|MELEE_FleshSound|MELEE_ExtraWide|MELEE_HammerHit) ) { A_BumpFOV(.9); - A_QuakeEx(5,5,5,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); + A_QuakeEx(5.,5.,5.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); A_AlertMonsters(swwm_uncapalert?0:800); A_WeaponOffset(32,0,WOF_ADD|WOF_INTERPOLATE); SWWMUtility.DoKnockback(self,-(x.x,x.y,x.z*.1),4500.*invoker.charge); @@ -162,7 +162,7 @@ Class ItamexHammer : SWWMWeapon A_StartSound("itamex/slam",CHAN_WEAPON,CHANF_OVERLAP); vel.z += invoker.charge*.03; A_BumpFOV(.85); - A_QuakeEx(8,8,8,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + A_QuakeEx(8.,8.,8.,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); A_AlertMonsters(swwm_uncapalert?0:2500); let s = Spawn("HammerShockwave",(pos.x,pos.y,floorz)); s.target = self; @@ -208,6 +208,7 @@ Class ItamexHammer : SWWMWeapon Default { Tag "$T_HAMMER"; + Inventory.Icon "graphics/HUD/Icons/W_ItamexHammer.png"; Inventory.PickupMessage "$I_HAMMER"; Obituary "$O_HAMMER"; SWWMWeapon.Tooltip "$TT_HAMMER"; @@ -226,8 +227,8 @@ Class ItamexHammer : SWWMWeapon Stop; Select: XZW2 I 3 A_FullRaise(); - XZW2 JK 3; - XZW2 LMNO 2; + XZW2 JK 3 A_BumpView(-.1,tics:3); + XZW2 LMNO 2 A_BumpView(.2,tics:2); XZW2 PQRST 3; Goto Ready; Ready: @@ -239,13 +240,13 @@ Class ItamexHammer : SWWMWeapon Wait; Fire: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); - XZW2 UVWXYZ 1; + XZW2 UVWXYZ 1 A_BumpAngle(-1); XZW3 A 1 { A_StartSound("itamex/swing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZW3 BCDE 1; + XZW3 BCDE 1 A_BumpAngle(4); XZW3 F 1 A_HammerHit(); XZW3 GHIJK 2; XZW3 L 2 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP); @@ -261,8 +262,17 @@ Class ItamexHammer : SWWMWeapon Goto Ready; AltFire: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); - XZW4 DEFG 2 A_AltCharge(); - XZW4 HIJKLMNOPQRSTU 1 A_AltCharge(); + XZW4 DEFG 2 + { + A_BumpView(.4,tics:2); + A_AltCharge(); + } + XZW4 HIJKLMN 1 + { + A_BumpView(-.2); + A_AltCharge(); + } + XZW4 OPQRSTU 1 A_AltCharge(); XZW4 V 1 A_AltHold(); Wait; AltRelease: @@ -283,7 +293,7 @@ Class ItamexHammer : SWWMWeapon Goto Ready; Zoom: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); - XZW5 XYZ 2 A_BumpAngle(-5); + XZW5 XYZ 2 A_BumpAngle(-2,tics:2); XZW6 ABCDEF 1 A_ChargeUp(); XZW6 G 0 A_SpinReact(); XZW6 G 1 A_SpinMove(); @@ -306,36 +316,47 @@ Class ItamexHammer : SWWMWeapon Goto Ready; Reload: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 XYZ 2; + XZW6 XYZ 2 A_BumpView(-.1,tics:2); XZW7 ABCDEF 2; XZW7 G 1 { A_PlayerCheckGun(); + A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.7,starttime:.2); } - XZW7 HIJ 1; - XZW7 K 1 A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.8,starttime:.2); - XZW7 LMNO 1; - XZW7 P 1 A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.9,starttime:.2); - XZW7 QRST 1; + XZW7 HIJ 1 A_BumpView(-.05); + XZW7 K 1 + { + A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.8,starttime:.2); + } + XZW7 LMNO 1 A_BumpView(-.05); + XZW7 P 1 + { + A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.9,starttime:.2); + } + XZW7 QRST 1 A_BumpView(-.05); XZW7 U 1 A_StopSound(CHAN_WEAPONEXTRA); - XZW7 VWXYZ 1; + XZW7 VWXYZ 1 A_BumpView(.05); XZW8 A 0 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.42); - XZW8 BCDE 3; - XZW8 FGHI 2; + XZW8 BCDE 3 A_BumpView(-.1,tics:3); + XZW8 FGHI 2 A_BumpView(.05,tics:2); Goto Ready; User1: XZW2 A 1; XZW8 J 1 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW8 KLM 1; XZW8 N 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); - XZW8 OPQ 2; + XZW8 OPQ 2 A_BumpView(.5,tics:2); XZW8 R 1 { + A_BumpFOV(.97); + A_QuakeEx(1.,1.,1.,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); A_Parry(9); A_PlayerMelee(true); } - XZW8 S 1; + XZW8 S 1 A_BumpView(-6); XZW8 T 3 A_Melee(50,"demolitionist/whitm",1.2,1.4); XZW8 UVWXYZ 2; XZW9 ABC 2; @@ -345,8 +366,8 @@ Class ItamexHammer : SWWMWeapon Goto Ready; Deselect: XZW2 A 3 A_StartSound("itamex/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZW2 BCD 3; - XZW2 EFGHI 2; + XZW2 BCD 3 A_BumpView(.1,tics:3); + XZW2 EFGHI 2 A_BumpView(.2,tics:2); XZW2 J -1 A_FullLower(); Stop; } diff --git a/zscript/dlc1/swwm_hammertime_fx.zsc b/zscript/dlc1/swwm_hammertime_fx.zsc index 354d12468..7ffd45db3 100644 --- a/zscript/dlc1/swwm_hammertime_fx.zsc +++ b/zscript/dlc1/swwm_hammertime_fx.zsc @@ -12,7 +12,7 @@ Class HammerShockwave : SWWMNonInteractiveActor override void PostBeginPlay() { Super.PostBeginPlay(); - A_QuakeEx(5,5,5,20,0,300+special1*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.8); + A_QuakeEx(5.,5.,5.,20,0,300+special1*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.8); SWWMUtility.DoExplosion(self,80+special1,100000+special1*2000,80+special1,40,DE_BLAST|DE_EXTRAZTHRUST|DE_NONEXPLOSIVE,'HammerShockwave',target); for ( int i=0; i<360; i+=5 ) { diff --git a/zscript/dlc1/swwm_heavymahsheengun.zsc b/zscript/dlc1/swwm_heavymahsheengun.zsc index c7a01e451..f5ee96aaf 100644 --- a/zscript/dlc1/swwm_heavymahsheengun.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun.zsc @@ -25,7 +25,6 @@ Class PiercingTracer : SpreadgunTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("HitListEntry"); @@ -81,8 +80,7 @@ Class HeavyMahSheenGun : SWWMWeapon action void A_DropCasing() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,4,8,-12); let c = Spawn("SheenCasing",origin); c.angle = angle; @@ -109,8 +107,10 @@ Class HeavyMahSheenGun : SWWMWeapon if ( invoker.firespeed == 1 ) { A_AlertMonsters(swwm_uncapalert?0:3000); - A_BumpFOV(.98); - A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + A_BumpFOV(.95); + A_BumpView(FRandom[Sheen](-.4,.4)); + A_BumpAngle(FRandom[Sheen](-.4,.4)); + A_QuakeEx(2.,2.,2.,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.25); A_StartSound("sheen/700rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.5); invoker.vibrate = .25; A_Overlay(-9999,"EjectRound3"); @@ -120,8 +120,10 @@ Class HeavyMahSheenGun : SWWMWeapon else if ( invoker.firespeed == 2 ) { A_AlertMonsters(swwm_uncapalert?0:5000); - A_BumpFOV(.99+FRandom[Sheen](-.005,.005)); - A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.15); + A_BumpFOV(.97+FRandom[Sheen](-.01,.01)); + A_BumpView(FRandom[Sheen](-.3,.3)); + A_BumpAngle(FRandom[Sheen](-.3,.3)); + A_QuakeEx(1.8,1.8,1.8,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.15); A_StartSound("sheen/2100rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.4); invoker.vibrate = min(1.,invoker.vibrate*1.05+.05); SWWMUtility.DoKnockback(self,-x,15000.); @@ -130,8 +132,10 @@ Class HeavyMahSheenGun : SWWMWeapon else if ( invoker.firespeed == 0 ) { A_AlertMonsters(swwm_uncapalert?0:2000); - A_BumpFOV(.97); - A_QuakeEx(2,2,2,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.25); + A_BumpFOV(.92); + A_BumpView(FRandom[Sheen](-.5,.5)); + A_BumpAngle(FRandom[Sheen](-.5,.5)); + A_QuakeEx(1.4,1.4,1.4,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.25); A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); SWWMUtility.DoKnockback(self,-x,6000.); A_Overlay(-9999,"EjectRound7"); @@ -145,19 +149,17 @@ Class HeavyMahSheenGun : SWWMWeapon invoker.Ammo1.Amount--; invoker.fired = gametic; // dakka dakka dakka - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); double a = FRandom[Sheen](0,360), s = FRandom[Sheen](.002,.02)*spreadfct; Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); if ( !invoker.st ) invoker.st = new("PiercingTracer"); let st = invoker.st; // thanks zscript - st.ignoreme = self; st.penetration = 60.+invoker.barrelheat/5.; st.resist = .6+invoker.barrelheat/500.; st.hitlist.Clear(); st.shootthroughlist.Clear(); st.waterhitlist.Clear(); - st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); + st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,0,ignore:self); if ( swwm_omnibust ) { // Wall busting @@ -200,7 +202,7 @@ Class HeavyMahSheenGun : SWWMWeapon hit.HitActor.A_StartSound("misc/slughitf",CHAN_DAMAGE,CHANF_OVERLAP,1.,2.); } } - if ( (st.Results.HitType != TRACE_HitNone) && (st.Results.HitType != TRACE_HasHitSky) && (st.Results.HitType != TRACE_HitActor) ) + if ( (st.Results.HitType != TRACE_HitNone) && (st.Results.HitType != TRACE_HitActor) ) { Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(st.Results); let p = Spawn("SWWMBulletImpact",st.Results.HitPos+hitnormal*4); @@ -339,6 +341,7 @@ Class HeavyMahSheenGun : SWWMWeapon Default { Tag "$T_SHEENHMG"; + Inventory.Icon "graphics/HUD/Icons/W_SheenHMG.png"; Inventory.PickupMessage "$I_SHEENHMG"; Obituary "$O_SHEENHMG"; SWWMWeapon.Tooltip "$TT_SHEENHMG"; @@ -364,8 +367,8 @@ Class HeavyMahSheenGun : SWWMWeapon A_FullRaise(); if ( invoker.incooldown ) A_StartSound("sheen/overheat",CHAN_WEAPONEXTRA2,CHANF_LOOPING,attenuation:3.); } - XZW2 LMNOP 3; - XZW2 QRSTUV 2; + XZW2 LMNOP 3 A_BumpView(-.05,tics:3); + XZW2 QRSTUV 2 A_BumpView(.2,tics:2); XZW2 WX 3; Goto Ready; Ready: @@ -594,9 +597,10 @@ Class HeavyMahSheenGun : SWWMWeapon Stop; AltFire: XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP); - XZW5 IJ 2; + XZW5 IJ 2 A_BumpView(.2,tics:2); XZW5 K 3 { + A_QuakeEx(.5,.5,.5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); invoker.firespeed = min(2,invoker.firespeed+1); EventHandler.SendInterfaceEvent(PlayerNumber(),"swwmnametag.$SWWM_SHEENSPEED"..(invoker.firespeed+1)); } @@ -605,9 +609,10 @@ Class HeavyMahSheenGun : SWWMWeapon Goto Ready; Zoom: XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP); - XZW5 NO 2; + XZW5 NO 2 A_BumpView(-.2,tics:2); XZW5 P 3 { + A_QuakeEx(.5,.5,.5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); invoker.firespeed = max(0,invoker.firespeed-1); EventHandler.SendInterfaceEvent(PlayerNumber(),"swwmnametag.$SWWM_SHEENSPEED"..(invoker.firespeed+1)); } @@ -620,25 +625,30 @@ Class HeavyMahSheenGun : SWWMWeapon A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerCheckGun(); } - XZW5 TUVW 3; - XZW5 XYZ 4; + XZW5 TUVW 3 A_BumpView(-.3,tics:3); + XZW5 XYZ 4 A_BumpView(-.1,tics:4); XZW6 A 4; XZW6 B 3 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW6 CDE 3; - XZW6 FGHIJKL 2; + XZW6 F 2; + XZW6 GH 2 A_BumpView(1.,tics:2); + XZW6 IJKL 2; Goto Ready; User1: XZW2 A 3 A_StartSound("sheen/meleestart",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 MNOPQR 3; + XZW6 MNO 3; + XZW6 PQR 3 A_BumpAngle(1,3); XZW6 S 3 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); XZW6 T 3; XZW6 U 2 { + A_BumpFOV(.94); + A_QuakeEx(1.6,1.6,1.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.65); A_Parry(9); A_PlayerMelee(); } - XZW6 V 2; - XZW6 W 2 A_Melee(80+int(invoker.barrelheat/4.),"demolitionist/whitl",1.25,1.3,1.4); + XZW6 V 2 A_BumpAngle(-15); + XZW6 W 2 A_Melee(80+int(invoker.barrelheat/4.),"demolitionist/whitl",1.35,1.3,1.4); XZW6 XYZ 3; XZW7 AB 4; XZW7 C 4 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP); @@ -646,7 +656,7 @@ Class HeavyMahSheenGun : SWWMWeapon Goto Ready; Deselect: XZW2 A 2 A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZW2 BCDEFGHIJK 2; + XZW2 BCDEFGHIJ 2 A_BumpView(.1,tics:2); XZW2 K -1 { A_StopSound(CHAN_WEAPONEXTRA2); diff --git a/zscript/dlc1/swwm_mister.zsc b/zscript/dlc1/swwm_mister.zsc index b3de170f9..64d7a49b9 100644 --- a/zscript/dlc1/swwm_mister.zsc +++ b/zscript/dlc1/swwm_mister.zsc @@ -17,7 +17,6 @@ Class MRRailSeg // just a maximum possible travel distance (which is mainly used for probing through walls) Class MisterRailTracer : LineTracer { - Actor ignoreme; Array hitlist; Array shootthroughlist; Array waterhitlist; @@ -55,7 +54,6 @@ Class MisterRailTracer : LineTracer } else if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("MRHitListEntry"); @@ -78,11 +76,6 @@ Class MisterRailTracer : LineTracer } return TRACE_Skip; } - else if ( Results.HitType == TRACE_HasHitSky ) - { - fullstop = true; - return TRACE_Stop; - } else if ( Results.HitType != TRACE_HitNone ) { if ( Results.HitType == TRACE_HitWall ) @@ -135,7 +128,7 @@ Class MisterRailTracer : LineTracer pastwall = true; // trace backwards to find exit surface let at = new("AuxiliarySilverBulletTracer"); - at.Trace(ofs,level.PointInSector(ofs.xy),-Results.HitVector,2.,0); + at.Trace(ofs,level.PointInSector(ofs.xy),-Results.HitVector,2.,0,ignoreallactors:true); let wp2 = new("WallPenetrate"); wp2.hittype = at.Results.HitType; wp2.hitline = at.Results.HitLine; @@ -351,8 +344,7 @@ Class MisterRifle : SWWMWeapon A_ChangeModel("",1,"","",10,"models","",CMDL_USESURFACESKIN,-1); if ( !invoker.waschambered ) return; // brass it up (though it's not made of brass) - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,2,3,-18); let c = Spawn("MisterCasing",origin); c.angle = angle; @@ -396,8 +388,7 @@ Class MisterRifle : SWWMWeapon A_ChangeModel("",1,"","",7,"models","",CMDL_USESURFACESKIN,-1); if ( swwm_nomagdrop ) return; // drop it - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,6,3,-18); let c = Spawn("MisterMag",origin); c.angle = angle; @@ -471,7 +462,7 @@ Class MisterRifle : SWWMWeapon // cluster shot A_StartSound("mister/firescatter",CHAN_WEAPON,CHANF_OVERLAP); SWWMUtility.DoKnockback(self,-x,15000.); - A_QuakeEx(6,6,6,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.3); + A_QuakeEx(6.,6.,6.,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.3); A_BumpFOV(.92); A_AlertMonsters(swwm_uncapalert?0:8000); for ( int i=0; i<10; i++ ) @@ -483,8 +474,7 @@ Class MisterRifle : SWWMWeapon s.vel += vel*.5+x*FRandom[Mister](1.,4.); s.SetShade(Color(0,3,4)*Random[ExploS](48,63)); } - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); double a, s; Vector3 dir; for ( int i=0; i<8; i++ ) @@ -504,7 +494,7 @@ Class MisterRifle : SWWMWeapon dir = SWWMUtility.ConeSpread(x2,y2*2.,z2,a,s); } FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,6); if ( d.HitType == TRACE_HitActor ) { @@ -542,7 +532,7 @@ Class MisterRifle : SWWMWeapon // precision shot A_StartSound("mister/firesemi",CHAN_WEAPON,CHANF_OVERLAP); SWWMUtility.DoKnockback(self,-x,9000.); - A_QuakeEx(5,5,5,6,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); + A_QuakeEx(5.,5.,5.,6,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); A_BumpFOV(.95); A_AlertMonsters(swwm_uncapalert?0:6000); for ( int i=0; i<6; i++ ) @@ -556,7 +546,7 @@ Class MisterRifle : SWWMWeapon } Vector3 dir = SWWMUtility.GetPlayerAimDir(self); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { @@ -602,7 +592,7 @@ Class MisterRifle : SWWMWeapon Vector3 x = SWWMUtility.GetPlayerViewDir(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,2.8,-2.4); SWWMUtility.DoKnockback(self,-x,5000.); - A_QuakeEx(3,3,3,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_QuakeEx(3.,3.,3.,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); A_BumpFOV(.97); if ( index == 0 ) A_AlertMonsters(swwm_uncapalert?0:5000); for ( int i=0; i<3; i++ ) @@ -614,13 +604,12 @@ Class MisterRifle : SWWMWeapon s.vel += vel*.5+x*FRandom[Mister](1.,2.); s.SetShade(Color(0,3,4)*Random[ExploS](48,63)); } - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); static const double spd[] = {.00,.01,.03,.06,.10}; double a = FRandom[Mister](0,360), s = FRandom[Mister](spd[index],spd[index+1]); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { @@ -710,7 +699,7 @@ Class MisterRifle : SWWMWeapon invoker.fired = true; A_StartSound("mister/fireover",CHAN_WEAPON,CHANF_OVERLAP); SWWMUtility.DoKnockback(self,-x,90000.); - A_QuakeEx(8,8,8,12,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.); + A_QuakeEx(8.,8.,8.,12,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.); A_BumpFOV(.85); A_AlertMonsters(swwm_uncapalert?0:12000); for ( int i=0; i<12; i++ ) @@ -724,7 +713,6 @@ Class MisterRifle : SWWMWeapon Vector3 dir, startdir; startdir = dir = SWWMUtility.GetPlayerAimDir(self); let mrt = new("MisterRailTracer"); // I pity the fool - mrt.ignoreme = self; mrt.hitlist.Clear(); mrt.shootthroughlist.Clear(); mrt.waterhitlist.Clear(); @@ -737,7 +725,7 @@ Class MisterRifle : SWWMWeapon do { mrt.fullstop = true; - mrt.Trace(norigin,level.PointInSector(norigin.xy),dir,maxdist,TRACE_HitSky|TRACE_ReportPortals); + mrt.Trace(norigin,level.PointInSector(norigin.xy),dir,maxdist,TRACE_ReportPortals,ignore:self); mrt.maxpen -= 100; maxdist -= (mrt.exitpoint-norigin).length(); norigin = mrt.exitpoint; @@ -916,7 +904,7 @@ Class MisterRifle : SWWMWeapon mrc.effectors.Push(b); bi.Push(b); } - if ( (mrt.Results.HitType != TRACE_HitNone) && (mrt.Results.HitType != TRACE_HasHitSky) && (mrt.Results.HitType != TRACE_HitActor) ) + if ( (mrt.Results.HitType != TRACE_HitNone) && (mrt.Results.HitType != TRACE_HitActor) ) { Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(mrt.Results); let b = MisterBulletImpact(Spawn("MisterRailEntryImpact",mrt.Results.HitPos+hitnormal*4.)); @@ -1052,7 +1040,7 @@ Class MisterRifle : SWWMWeapon invoker.gfired = true; A_StartSound("mister/grenade",CHAN_WEAPON,CHANF_OVERLAP); SWWMUtility.DoKnockback(self,-x,12000.); - A_QuakeEx(4,4,4,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); + A_QuakeEx(4.,4.,4.,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); A_BumpFOV(.96); A_AlertMonsters(swwm_uncapalert?0:5000); for ( int i=0; i<9; i++ ) @@ -1100,8 +1088,7 @@ Class MisterRifle : SWWMWeapon A_ChangeModel("",1,"","",9,"models","",CMDL_USESURFACESKIN,-1); if ( !invoker.wasgchambered ) return; // droppage - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,8,3,-18); let c = Spawn("MisterGCasing",origin); c.angle = angle; @@ -1201,6 +1188,7 @@ Class MisterRifle : SWWMWeapon Default { Tag "$T_MORTALRIFLE"; + Inventory.Icon "graphics/HUD/Icons/W_MortalRifle.png"; Inventory.PickupMessage "$T_MORTALRIFLE"; Obituary "$O_MORTALRIFLE"; SWWMWeapon.Tooltip "$TT_MORTALRIFLE"; @@ -1543,12 +1531,12 @@ Class MisterRifle : SWWMWeapon return A_JumpIf(invoker.boltlock,"DeselectLock"); } XZW2 BCDE 2; - XZW2 FGHIJKLMNOP 1; + XZW2 FGHIJKLMNO 1; XZW2 P -1 A_FullLower(); Stop; DeselectLock: XZWB EFGHI 2; - XZWB JKLMNOPQRST 1; + XZWB JKLMNOPQRS 1; XZWB T -1 A_FullLower(); Stop; Flash: diff --git a/zscript/dlc1/swwm_mister_fx.zsc b/zscript/dlc1/swwm_mister_fx.zsc index 87fe1a41f..aaa61cd81 100644 --- a/zscript/dlc1/swwm_mister_fx.zsc +++ b/zscript/dlc1/swwm_mister_fx.zsc @@ -197,8 +197,7 @@ Class MisterFuzzy : SWWMNonInteractiveActor return; } if ( isFrozen() ) return; - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,(special2<0)?4:44,3000,80,80,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,(special2<0)?4:44,3000,80,80,DE_EXTRAZTHRUST|DE_COUNTENEMIES); if ( mrc ) mrc.nkill += nkill; special1--; if ( special1 <= 0 ) @@ -326,8 +325,7 @@ Class MisterPop : SWWMNonInteractiveActor } BLPF C 2 Bright { - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,4,2000,50,50,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,4,2000,50,50,DE_EXTRAZTHRUST|DE_COUNTENEMIES); if ( mrc ) mrc.nkill += nkill; } TNT1 A 1 @@ -358,7 +356,7 @@ Class MisterBulletImpact : SWWMNonInteractiveActor { A_AlertMonsters(swwm_uncapalert?0:4000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,444,80000,150,150,DE_EXTRAZTHRUST); - A_QuakeEx(6,6,6,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.6); + A_QuakeEx(6.,6.,6.,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.6); A_StartSound("mister/hitsemi",CHAN_VOICE,attenuation:.3); A_StartSound("mister/hitsemi",CHAN_WEAPON,attenuation:.2); A_SprayDecal("RocketBlast",-172); @@ -440,7 +438,7 @@ Class MisterBuckshotImpact : MisterBulletImpact { A_AlertMonsters(swwm_uncapalert?0:1000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,444,8000,80,80,DE_EXTRAZTHRUST); - A_QuakeEx(2,2,2,5,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:60,rollintensity:.2); + A_QuakeEx(2.,2.,2.,5,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:60,rollintensity:.2); A_StartSound("mister/hitscatter",CHAN_VOICE,attenuation:.35); A_SprayDecal("ShockMark",-172); Scale *= FRandom[ExploS](0.8,1.1); @@ -524,7 +522,7 @@ Class MisterStreamImpact : MisterBulletImpact { A_AlertMonsters(swwm_uncapalert?0:4000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,444,150000,120,120,DE_EXTRAZTHRUST); - A_QuakeEx(5,5,5,5,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.5); + A_QuakeEx(5.,5.,5.,5,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.5); A_StartSound("mister/hitstream",CHAN_VOICE,attenuation:.35); A_StartSound("mister/hitstream",CHAN_WEAPON,attenuation:.25); A_SprayDecal("SmallRocketBlast",-172); @@ -607,10 +605,9 @@ Class MisterRailEntryImpact : MisterBulletImpact override void A_BulletExplode() { A_AlertMonsters(swwm_uncapalert?0:2000,AMF_EMITFROMTARGET); - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,444,200000,100,100,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,444,200000,100,100,DE_EXTRAZTHRUST|DE_COUNTENEMIES); if ( mrc ) mrc.nkill += nkill; - A_QuakeEx(6,6,6,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8); + A_QuakeEx(6.,6.,6.,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8); A_StartSound("mister/hitover",CHAN_VOICE,attenuation:.35); A_SprayDecal("SmallRocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); @@ -661,8 +658,7 @@ Class MisterRailEntryImpact : MisterBulletImpact { if ( special1 && (special1 <= 10) ) { - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,44,3000+special1*50,80+special1*4,80+special1*4,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,44,3000+special1*50,80+special1*4,80+special1*4,DE_EXTRAZTHRUST|DE_COUNTENEMIES); if ( mrc ) mrc.nkill += nkill; int numpt = Random[ExploS](0,special1/2); for ( int i=0; i=4) ) A_StartSound("quadshot/pointblank",CHAN_WEAPON,CHANF_OVERLAP,.6+idx*.1,.4-idx*.05,1.2-idx*.05); - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); double a, s; Actor p; bool bExtra = ((idx>=4)&&invoker.chambered&&!invoker.charged); @@ -91,7 +89,7 @@ Class Quadravol : SWWMWeapon switch ( idx ) { default: - A_QuakeEx(3,3,3,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_QuakeEx(3.,3.,3.,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); A_BumpFOV(.98); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,192,64),5); @@ -113,7 +111,7 @@ Class Quadravol : SWWMWeapon } break; case 1: - A_QuakeEx(4,4,4,18,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_QuakeEx(4.,4.,4.,18,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); A_BumpFOV(.97); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,192,64),7); @@ -135,7 +133,7 @@ Class Quadravol : SWWMWeapon } break; case 2: - A_QuakeEx(6,6,6,25,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); + A_QuakeEx(6.,6.,6.,25,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); A_BumpFOV(.96); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,192,64),8); @@ -157,7 +155,7 @@ Class Quadravol : SWWMWeapon } break; case 3: - A_QuakeEx(7,7,7,30,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); + A_QuakeEx(7.,7.,7.,30,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); A_BumpFOV(.95); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,192,64),12); @@ -190,7 +188,7 @@ Class Quadravol : SWWMWeapon } break; case 4: - A_QuakeEx(8+bExtra,8+bExtra,8+bExtra,40,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5+bExtra*0.25); + A_QuakeEx(8.+bExtra,8.+bExtra,8.+bExtra,40,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5+bExtra*.25); A_BumpFOV(.94-bExtra*.1); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,192,64),15+bExtra*3); @@ -300,8 +298,7 @@ Class Quadravol : SWWMWeapon action void A_DropCasing() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,-8,8,-16); if ( invoker.wascharged ) { @@ -337,10 +334,19 @@ Class Quadravol : SWWMWeapon A_Melee(60,"misc/slughit",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null); Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); vel += dir*4.; - A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75); + A_QuakeEx(4.,4.,4.,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75); A_BumpFOV(1.03); } + action void A_LeverForward() + { + A_StartSound("quadshot/leverforward",CHAN_WEAPON,CHANF_OVERLAP); + } + action void A_LeverBack() + { + A_StartSound("quadshot/leverback",CHAN_WEAPON,CHANF_OVERLAP); + } + override bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon ) { bool good = Super.PickupForAmmoSWWM(ownedWeapon); @@ -411,6 +417,7 @@ Class Quadravol : SWWMWeapon Default { Tag "$T_QUADRAVOL"; + Inventory.Icon "graphics/HUD/Icons/W_Quadravol.png"; Inventory.PickupMessage "$I_QUADRAVOL"; Obituary "$O_QUADRAVOL"; SWWMWeapon.Tooltip "$TT_QUADRAVOL"; @@ -502,10 +509,10 @@ Class Quadravol : SWWMWeapon return A_JumpIf(invoker.onehand,"AltFire1H"); } XZW5 C 2; - XZW5 D 2 A_StartSound("quadshot/leverforward",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 D 2 A_LeverForward(); XZW5 E 2 A_Eject(); XZW5 FG 3; - XZW5 H 2 A_StartSound("quadshot/leverback",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 H 2 A_LeverBack(); XZW5 I 2; XZW5 J 2 A_Fill(); XZW5 K 2; @@ -617,7 +624,7 @@ Class Quadravol : SWWMWeapon A_StartSound(invoker.onehand?"quadshot/deselectfast":"quadshot/deselect",CHAN_WEAPON,CHANF_OVERLAP); return A_JumpIf(invoker.onehand,"Deselect1H"); } - XZW2 BCDEFGHIJKLMNOPQR 1; + XZW2 BCDEFGHIJKLMNOPQ 1; XZW2 R -1 A_FullLower(); Stop; Flash: @@ -682,7 +689,7 @@ Class Quadravol : SWWMWeapon XZWB L 2; XZWB M 1 { - A_StartSound("quadshot/leverforward",CHAN_WEAPON,CHANF_OVERLAP); + A_LeverForward(); A_Eject(); } XZWB NO 1; @@ -692,7 +699,7 @@ Class Quadravol : SWWMWeapon XZWB TUV 2; XZWB W 2 A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP,pitch:.4); XZWB XY 1; - XZWB Z 0 A_StartSound("quadshot/leverback",CHAN_WEAPON,CHANF_OVERLAP); // skip frame to undo 360 degree rotation + XZWB Z 0 A_LeverBack(); // skip frame to undo 360 degree rotation XZWF M 1; XZWC A 2; XZWC B 2 A_Fill(); diff --git a/zscript/dlc1/swwm_notashotgun_fx.zsc b/zscript/dlc1/swwm_notashotgun_fx.zsc index 17ba845cc..aa447be69 100644 --- a/zscript/dlc1/swwm_notashotgun_fx.zsc +++ b/zscript/dlc1/swwm_notashotgun_fx.zsc @@ -227,8 +227,7 @@ Class QuadProj : Actor void A_QuadMove() { A_QuadTrail(); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); double a = FRandom[Quadravol](0.,360.), s = FRandom[Quadravol](0.,drift); vel += x*(accelrate/GameTicRate); vel += SWWMUtility.CircleOffset(y,z,a,s); @@ -269,7 +268,7 @@ Class QuadProj : Actor SWWMUtility.DoKnockback(master,x+(0,0,hdiff),200000+special2); } if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000); - A_QuakeEx(3,3,3,20,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.6); + A_QuakeEx(3.,3.,3.,20,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.6); SWWMUtility.DoExplosion(self,0,120000+special2,150,40,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,100+special1,0,150,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); SWWMUtility.DoExplosion(self,200+special1,0,120,40,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); @@ -331,6 +330,7 @@ Class QuadProj : Actor +NODAMAGETHRUST; +HITMASTER; +NOFRICTION; + +SKYEXPLODE; RenderStyle "Add"; } @@ -521,7 +521,7 @@ Class QuadProj2 : QuadProj SWWMUtility.DoKnockback(master,x+(0,0,hdiff),280000+special2); } if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?160000:600000); - A_QuakeEx(5,5,5,25,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:400,rollintensity:.8); + A_QuakeEx(5.,5.,5.,25,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:400,rollintensity:.8); SWWMUtility.DoExplosion(self,0,180000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,200+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); SWWMUtility.DoExplosion(self,400+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); @@ -614,7 +614,7 @@ Class QuadProjSub : QuadProj double hdiff = 1.-2.*clamp((rel.z-4.)/master.height,0.,.5); SWWMUtility.DoKnockback(master,x+(0,0,hdiff),100000); } - A_QuakeEx(2,2,2,10,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.3); + A_QuakeEx(2.5,2.5,2.5,10,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.3); SWWMUtility.DoExplosion(self,0,70000,120,40,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,50,0,120,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); SWWMUtility.DoExplosion(self,150,0,100,40,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); @@ -697,7 +697,7 @@ Class QuadProjSub2 : QuadProj double hdiff = 1.-2.*clamp((rel.z-4.)/master.height,0.,.5); SWWMUtility.DoKnockback(master,x+(0,0,hdiff),100000); } - A_QuakeEx(2,2,2,10,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:80,rollintensity:.2); + A_QuakeEx(2.,2.,2.,10,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:80,rollintensity:.2); SWWMUtility.DoExplosion(self,0,60000,120,40,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,80,0,120,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); SWWMUtility.DoExplosion(self,180,0,100,40,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); @@ -797,7 +797,7 @@ Class QuadProj3 : QuadProj SWWMUtility.DoKnockback(master,x+(0,0,hdiff),350000+special2); } if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?180000:800000); - A_QuakeEx(7,7,7,35,0,1200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:600,rollintensity:1.2); + A_QuakeEx(7.,7.,7.,35,0,1200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:600,rollintensity:1.2); SWWMUtility.DoExplosion(self,0,200000+special2,300,120,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,300+special1,0,300,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); SWWMUtility.DoExplosion(self,500+special1,0,240,120,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); diff --git a/zscript/handler/swwm_handler.zsc b/zscript/handler/swwm_handler.zsc index 8aec458fb..06e959e0a 100644 --- a/zscript/handler/swwm_handler.zsc +++ b/zscript/handler/swwm_handler.zsc @@ -285,7 +285,7 @@ Class SWWMHandler : EventHandler { if ( !lastlock || (gametic > lastlock+20) ) { - if ( SWWMUtility.IsValidLockNum(locknum) ) + if ( Key.IsLockDefined(locknum) ) lastlock = AddOneliner("locked",2); else lastlock = AddOneliner("jammed",2); } diff --git a/zscript/handler/swwm_handler_cheats.zsc b/zscript/handler/swwm_handler_cheats.zsc index 933638a61..705636b28 100644 --- a/zscript/handler/swwm_handler_cheats.zsc +++ b/zscript/handler/swwm_handler_cheats.zsc @@ -49,9 +49,7 @@ extend Class SWWMHandler Console.Printf("\cyStay out of trouble.\c-"); S_StartSound("menu/buyinv",CHAN_ITEM,CHANF_UI); } - Vector3 safepos; - double safeangle; - [safepos, safeangle] = level.PickPlayerStart(e.Args[0]); + let [safepos, safeangle] = level.PickPlayerStart(e.Args[0]); players[e.Args[0]].mo.Teleport(safepos,safeangle,0); } else if ( e.Name ~== "swwmweaponcheat" ) diff --git a/zscript/handler/swwm_handler_crosshair.zsc b/zscript/handler/swwm_handler_crosshair.zsc index 6a72dd04f..a7a799dd7 100644 --- a/zscript/handler/swwm_handler_crosshair.zsc +++ b/zscript/handler/swwm_handler_crosshair.zsc @@ -4,13 +4,10 @@ const MAX_CROSSHAIRS = 25; Class SWWMCrosshairTracer : LineTracer { - Actor ignoreme; - override ETraceStatus TraceCallback() { if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; return TRACE_Skip; } @@ -55,16 +52,15 @@ extend Class SWWMHandler } let mo = players[consoleplayer].mo; if ( !ctr ) ctr = new("SWWMCrosshairTracer"); - ctr.ignoreme = mo; - Vector3 x, y, z, ofs, origin; + Vector3 ofs, origin; Color col; - [x, y, z] = SWWMUtility.GetAxes(e.ViewAngle,e.ViewPitch,e.ViewRoll); + let [x, y, z] = SWWMUtility.GetAxes(e.ViewAngle,e.ViewPitch,e.ViewRoll); int chp = crosshairhealth; for ( int i=0; i= 2 ) { int hp = Clamp(mo.Health,0,200); diff --git a/zscript/handler/swwm_handler_damage.zsc b/zscript/handler/swwm_handler_damage.zsc index 606b5a10b..a0e853cef 100644 --- a/zscript/handler/swwm_handler_damage.zsc +++ b/zscript/handler/swwm_handler_damage.zsc @@ -19,22 +19,16 @@ extend Class SWWMHandler if ( (e.DamageType == 'Ynykron') || (e.DamageType == 'Massacre') ) return; int gibhealth = e.Thing.GetGibHealth(); bool gotgibbed = (!e.Thing.bDONTGIB && ((e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageSource && e.DamageSource.bEXTREMEDEATH) || (e.DamageType == 'Extreme') || (e.Thing.Health < gibhealth)) && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH) && (!e.DamageSource || !e.DamageSource.bNOEXTREMEDEATH)); - bool forcegibbed = false; - // force gib availability for some vanilla Doom monsters - if ( gotgibbed && ((e.Thing.GetClass() == "Demon") || (e.Thing.GetClass() == "Spectre") || (e.Thing.GetClass() == "HellKnight") || (e.Thing.GetClass() == "BaronOfHell") || (e.Thing.GetClass() == "Cacodemon") || (e.Thing.GetClass() == "Revenant") || (e.Thing.GetClass() == "Archvile") || (e.Thing.GetClass() == "Fatso") || (e.Thing.GetClass() == "Arachnotron")) ) - forcegibbed = true; - if ( !e.Thing.FindState("XDeath",true) && !e.Thing.FindState("Death.Extreme",true) && !forcegibbed ) + if ( !e.Thing.FindState("XDeath",true) && !e.Thing.FindState("Death.Extreme",true) ) gotgibbed = false; // only do special handling if they use our blood if ( (e.Thing.GetBloodType(0) != "mkBlood") || e.Thing.bNOBLOOD ) return; CorpseFallTracker.TrackBody(e.Thing); - bool b; - Actor a; // special handling of some monsters if ( e.Thing.GetClass() == "Cyberdemon" ) { - [b,a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); + let [b, a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); if ( !b ) return; mkGibber(a).gibbed = e.Thing; mkGibber(a).delay = 40; @@ -44,7 +38,7 @@ extend Class SWWMHandler } else if ( e.Thing.GetClass() == "SpiderMastermind" ) { - [b,a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); + let [b, a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); if ( !b ) return; mkGibber(a).gibbed = e.Thing; mkGibber(a).delay = 60; @@ -53,7 +47,7 @@ extend Class SWWMHandler } else if ( gotgibbed ) { - [b,a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); + let [b, a] = e.Thing.A_SpawnItemEx("mkGibber",flags:SXF_USEBLOODCOLOR); if ( !b ) return; mkGibber(a).gibbed = e.Thing; a.A_SetSize(e.Thing.default.radius,e.Thing.default.height); diff --git a/zscript/handler/swwm_handler_debugrender.zsc b/zscript/handler/swwm_handler_debugrender.zsc index a7705b019..e6f9de77b 100644 --- a/zscript/handler/swwm_handler_debugrender.zsc +++ b/zscript/handler/swwm_handler_debugrender.zsc @@ -28,8 +28,7 @@ extend Class SWWMHandler private ui void DrawWorldCircle( RenderEvent e, Vector3 pos, double radius, Color col ) { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(e.viewangle,e.viewpitch,e.viewroll); + let [x, y, z] = SWWMUtility.GetAxes(e.viewangle,e.viewpitch,e.viewroll); Vector3 ndc[64]; for ( int i=0; i<64; i++ ) { @@ -80,8 +79,7 @@ extend Class SWWMHandler DrawWorldLine(e,(b1.x,b2.y,b1.z),(b1.x,b2.y,b2.z),"White"); DrawWorldLine(e,(b2.x,b2.y,b1.z),(b2.x,b2.y,b2.z),"White"); } - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(a.angle,a.pitch,a.roll); + let [x, y, z] = SWWMUtility.GetAxes(a.angle,a.pitch,a.roll); DrawWorldLine(e,pos,pos+x*16,"Red"); DrawWorldLine(e,pos,pos+y*16,"Green"); DrawWorldLine(e,pos,pos+z*16,"Blue"); diff --git a/zscript/handler/swwm_handler_iwantdie.zsc b/zscript/handler/swwm_handler_iwantdie.zsc index bae915061..d603e69e2 100644 --- a/zscript/handler/swwm_handler_iwantdie.zsc +++ b/zscript/handler/swwm_handler_iwantdie.zsc @@ -25,10 +25,9 @@ extend Class SWWMHandler { e.Thing.speed *= 2; e.Thing.vel *= 2; - Vector3 x, y, z; double ang = e.Thing.target.target?e.Thing.AngleTo(e.Thing.target.target):e.Thing.angle; double pt = e.Thing.target.target?e.Thing.PitchTo(e.Thing.target.target,e.Thing.target.missileheight,e.Thing.target.target.Height/2.):e.Thing.pitch; - [x, y, z] = SWWMUtility.GetAxes(ang,pt,e.Thing.roll); + let [x, y, z] = SWWMUtility.GetAxes(ang,pt,e.Thing.roll); int numpt = Random[ExtraMissiles](1,2); for ( int i=0; i checklist; // for the compact hud transient int WeaponFlash[10]; + // weapon selector + transient ui SWWMWeaponSelect wsel; override void ConsoleProcess( ConsoleEvent e ) { @@ -492,6 +494,24 @@ extend Class SWWMHandler } else if ( e.Name ~== "swwmccstart" ) gdat.ccstartonce = true; + else if ( e.Name.Left(14) ~== "swwmselweapon." ) + { + Class wpn = e.Name.Mid(14); + if ( !wpn ) return; + let w = Weapon(players[e.player].mo.FindInventory(wpn)); + if ( !w ) return; + if ( !w.CheckAmmo(Weapon.EitherFire,false) ) + { + S_StartSound("menu/democlose",CHAN_AUTO,CHANF_UI); + return; + } + players[e.player].mo.UseInventory(w); + if ( e.player != consoleplayer ) return; + bool rslt = (players[e.player].PendingWeapon == w); + if ( (w is 'SWWMWeapon') && (players[e.player].PendingWeapon == w.SisterWeapon) ) + rslt = true; // switching to dual gun + S_StartSound(rslt?"menu/demosel":"menu/democlose",CHAN_AUTO,CHANF_UI); + } // cheats go here else CheatEvent(e); } @@ -500,13 +520,55 @@ extend Class SWWMHandler { if ( e.Type != InputEvent.TYPE_KeyDown ) return false; // block invprev/next inputs when paused + String cmd = Bindings.GetBinding(e.KeyScan); if ( paused ) { - String cmd = Bindings.GetBinding(e.KeyScan); if ( (cmd ~== "invprev") || (cmd ~== "invnext") ) return true; // skip the rest of this function return false; } + // weapon selector is active + int WeapSel = 0; + if ( cmd ~== "weapnext" ) WeapSel = 1; + else if ( cmd ~== "weapprev" ) WeapSel = -1; + if ( wsel && (wsel.stage < 2) ) + { + if ( WeapSel == 1 ) + { + wsel.WeapNext(); + return true; + } + if ( WeapSel == -1 ) + { + wsel.WeapPrev(); + return true; + } + if ( cmd ~== "+attack" ) + { + wsel.WeapSel(); + return true; + } + if ( cmd ~== "+altattack" ) + { + wsel.WeapCancel(); + return true; + } + } + else if ( WeapSel && swwm_useweaponbar && !paused && (players[consoleplayer].playerstate == PST_LIVE) && players[consoleplayer].mo && (gamestate == GS_LEVEL) ) + { + // special case: ignore if we used the mousewheel and the automap is active + if ( automapactive && ((e.KeyScan == InputEvent.Key_MWheelUp) || (e.KeyScan == InputEvent.Key_MWheelDown)) ) + return false; + // only if player owns any selectable weapons + if ( !wsel && SWWMWeaponSelect.PlayerHasWeapons(players[consoleplayer].mo) ) + { + wsel = new("SWWMWeaponSelect").Init(players[consoleplayer].mo); + StatusBar.AttachMessage(wsel,-2920,layer:StatusBar.HUDMSGLayer_UnderHUD); + if ( WeapSel == 1 ) wsel.WeapNext(); + else if ( WeapSel == -1 ) wsel.WeapPrev(); + } + return true; + } // F if ( e.KeyChar == 0x66 ) { diff --git a/zscript/handler/swwm_handler_shaders.zsc b/zscript/handler/swwm_handler_shaders.zsc index 1ef554e47..ef618cbcb 100644 --- a/zscript/handler/swwm_handler_shaders.zsc +++ b/zscript/handler/swwm_handler_shaders.zsc @@ -18,6 +18,7 @@ extend Class SWWMHandler PPShader.SetEnabled("Glitch",false); PPShader.SetEnabled("Grain",false); PPShader.SetEnabled("WindBlur",false); + PPShader.SetEnabled("BokehSel",false); } private ui void RenderShaders( RenderEvent e ) @@ -145,8 +146,7 @@ extend Class SWWMHandler Vector3 worlddir = vel/spd; PPShader.SetUniform1f("ZoomBlur","Fade",clamp((spd-20.)/60.,0.,1.)); double str = min(spd/40.,15.); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(e.ViewAngle,e.ViewPitch,e.ViewRoll); + let [x, y, z] = SWWMUtility.GetAxes(e.ViewAngle,e.ViewPitch,e.ViewRoll); Vector3 reldir = (worlddir dot y, worlddir dot z, worlddir dot x); Vector2 centerspot = (.5+reldir.x*.5,.5+reldir.y*.5); if ( reldir.z < 0 ) diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc index fb46bc383..c57cbb81e 100644 --- a/zscript/handler/swwm_handler_worldload.zsc +++ b/zscript/handler/swwm_handler_worldload.zsc @@ -146,70 +146,6 @@ extend Class SWWMHandler SWWMUtility.MarkAchievement("hurry",players[consoleplayer]); } - private void SetupLockdefsCache( SWWMCachedLockInfo cli ) - { - for ( int i=0; i lines; - lines.Clear(); - data.Split(lines,"\n"); - bool valid = false; - for ( int j=0; j spl; - spl.Clear(); - lines[j].Split(spl," ",TOK_SKIPEMPTY); - // check game string (if any) - if ( spl.Size() > 2 ) - { - if ( (spl[2] ~== "DOOM") && !(gameinfo.gametype&GAME_Doom) ) continue; - else if ( (spl[2] ~== "HERETIC") && !(gameinfo.gametype&GAME_Heretic) ) continue; - else if ( (spl[2] ~== "HEXEN") && !(gameinfo.gametype&GAME_Hexen) ) continue; - else if ( (spl[2] ~== "STRIFE") && !(gameinfo.gametype&GAME_Strife) ) continue; - else if ( (spl[2] ~== "CHEX") && !(gameinfo.gametype&GAME_Chex) ) continue; - } - // valid lock, prepare it - let li = new("LIEntry"); - li.locknumber = spl[1].ToInt(); - li.hascolor = false; - // see if there's a Mapcolor defined - int k = j+1; - for ( int k=j+2; k skipme; skipme.Clear(); @@ -409,9 +342,7 @@ extend Class SWWMHandler let a = SWWMTeleportLine(Actor.Spawn("SWWMTeleportLine")); a.tline = l; } - bool isexit; - int exittype; - [isexit, exittype] = SWWMUtility.IsExitLine(l); + let [isexit, exittype] = SWWMUtility.IsExitLine(l); if ( !isexit ) continue; if ( skipme.Find(l) < skipme.Size() ) continue; skipme.Push(l); diff --git a/zscript/handler/swwm_statichandler.zsc b/zscript/handler/swwm_statichandler.zsc index 3185ef809..07fd5029c 100644 --- a/zscript/handler/swwm_statichandler.zsc +++ b/zscript/handler/swwm_statichandler.zsc @@ -213,7 +213,7 @@ Class SWWMStaticHandler : StaticEventHandler if ( (gamestate != GS_LEVEL) || !swwm_showmaptitle ) return; StatusBar.AttachMessage(new("DSMapTitle").Init(),-7777); } - else if ( e.Name ~== "swwmflushud" ) + else if ( e.Name ~== "swwmflushhud" ) { if ( !(StatusBar is 'SWWMStatusBar') ) return; SWWMStatusBar(StatusBar).Flush(); diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index bedacbb66..51db44a08 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -154,6 +154,9 @@ Class SWWMStatusBar : BaseStatusBar int mm_colorset; Color mm_backcolor, mm_cdwallcolor, mm_efwallcolor, mm_fdwallcolor, mm_interlevelcolor, mm_intralevelcolor, mm_lockedcolor, mm_notseencolor, mm_portalcolor, mm_secretsectorcolor, mm_secretwallcolor, mm_specialwallcolor, mm_thingcolor, mm_thingcolor_citem, mm_thingcolor_friend, mm_thingcolor_item, mm_thingcolor_monster, mm_thingcolor_ncmonster, mm_thingcolor_shootable, mm_thingcolor_vipitem, mm_thingcolor_missile, mm_tswallcolor, mm_unexploredsecretcolor, mm_wallcolor, mm_yourcolor; bool mm_displaylocks; + transient bool mm_cvfirstdraw; + transient Canvas mm_canvas; + transient TextureID mm_canvastex; // deathmatch stuff int playercount, rank, lead; diff --git a/zscript/hud/swwm_hud_topstuff.zsc b/zscript/hud/swwm_hud_topstuff.zsc index dd58e9f6e..9825d911d 100644 --- a/zscript/hud/swwm_hud_topstuff.zsc +++ b/zscript/hud/swwm_hud_topstuff.zsc @@ -457,7 +457,7 @@ extend Class SWWMStatusBar return false; } - private void DrawMapLines( Vector2 basepos ) + private void DrawMapLines( Vector2 basepos, bool bUseCanvas = false ) { double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic); double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; @@ -503,8 +503,13 @@ extend Class SWWMStatusBar [visible, rv1, rv2] = SWWMUtility.LiangBarsky((-1,-1)*zoomclip,(1,1)*zoomclip,rv1,rv2); if ( !visible ) continue; // scale to minimap frame - rv1 *= (HALFMAPSIZE/zoomclip)*hs; - rv2 *= (HALFMAPSIZE/zoomclip)*hs; + rv1 *= HALFMAPSIZE/zoomclip; + rv2 *= HALFMAPSIZE/zoomclip; + if ( !bUseCanvas ) + { + rv1 *= hs; + rv2 *= hs; + } // offset to minimap center rv1 += basepos; rv2 += basepos; @@ -538,7 +543,7 @@ extend Class SWWMStatusBar else if ( mm_displaylocks && (lock > 0) && (lock < 256) ) { - let lcol = SWWMUtility.GetLockColor(lock); + let lcol = Key.GetMapColorForLock(lock); if ( !lcol ) { // "all keys" locks lack a color @@ -583,13 +588,18 @@ extend Class SWWMStatusBar if ( isportal ) { col = Color((col.r+mm_portalcolor.r*7)/8,(col.g+mm_portalcolor.g*7)/8,(col.b+mm_portalcolor.b*7)/8); - Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.25),col); + if ( bUseCanvas ) mm_canvas.DrawLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),col); + else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.25),col); + } + else + { + if ( bUseCanvas ) mm_canvas.DrawLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),col); + else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.5),col); } - else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.5),col); } } } - private void DrawMapMarkers( Vector2 basepos ) + private void DrawMapMarkers( Vector2 basepos, bool bUseCanvas = false ) { double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic); double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; @@ -636,11 +646,13 @@ extend Class SWWMStatusBar // rotate by view rv = Actor.RotateVector(rv,ViewRot.x-90); // scale to minimap frame - rv *= (HALFMAPSIZE/zoomclip)*hs; + rv *= HALFMAPSIZE/zoomclip; + if ( !bUseCanvas ) rv *= hs; // offset to minimap center rv += basepos; // draw - Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); + if ( bUseCanvas ) mm_canvas.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,scl.x,DTA_ScaleY,scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); + else Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); } ai.Destroy(); continue; @@ -661,14 +673,16 @@ extend Class SWWMStatusBar // rotate by view rv = Actor.RotateVector(rv,ViewRot.x-90); // scale to minimap frame - rv *= (HALFMAPSIZE/zoomclip)*hs; + rv *= HALFMAPSIZE/zoomclip; + if ( !bUseCanvas ) rv *= hs; // offset to minimap center rv += basepos; // draw - Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); + if ( bUseCanvas ) mm_canvas.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,scl.x,DTA_ScaleY,scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); + else Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation); } } - private void DrawMapThings( Vector2 basepos ) + private void DrawMapThings( Vector2 basepos, bool bUseCanvas = false ) { double zoomlevel = SWWMUtility.Lerp(oldminimapzoom,minimapzoom,FracTic); double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; @@ -777,13 +791,19 @@ extend Class SWWMStatusBar if ( visible ) { // scale to minimap frame - x0 *= (HALFMAPSIZE/zoomclip)*hs; - x1 *= (HALFMAPSIZE/zoomclip)*hs; + x0 *= HALFMAPSIZE/zoomclip; + x1 *= HALFMAPSIZE/zoomclip; + if ( !bUseCanvas ) + { + x0 *= hs; + x1 *= hs; + } // offset to minimap center x0 += basepos; x1 += basepos; // draw the line - if ( isportal ) Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs*.25),col,int(t.smoothalpha*255)); + if ( bUseCanvas ) mm_canvas.DrawLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),col,int(t.smoothalpha*255)); + else if ( isportal ) Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs*.25),col,int(t.smoothalpha*255)); else Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs*.5),col,int(t.smoothalpha*255)); drawn = true; } @@ -807,6 +827,45 @@ extend Class SWWMStatusBar return StringTable.Localize("$SWWM_PLACE"..val); } + private void DrawMinimap( int xx, int yy ) + { + // experiment: use canvas + if ( swwm_mm_usecanvas ) + { + if ( !mm_canvas ) mm_canvas = TexMan.GetCanvas("MMCANVAS"); + if ( !mm_canvastex ) mm_canvastex = TexMan.CheckForTexture("MMCANVAS"); + mm_canvas.Clear(0,0,HALFMAPSIZE*2,HALFMAPSIZE*2,mm_backcolor); + Vector2 basemappos = (HALFMAPSIZE,HALFMAPSIZE); + // draw dat stuff + DrawMapLines(basemappos,true); + DrawMapThings(basemappos,true); + DrawMapMarkers(basemappos,true); + // finally, draw the player arrow + Vector2 tv[] = {(0,-4),(-3,2),(3,2)}; + for ( int i=0; i<3; i++ ) mm_canvas.DrawLine(int(tv[i].x+HALFMAPSIZE),int(tv[i].y+HALFMAPSIZE),int(tv[(i+1)%3].x+HALFMAPSIZE),int(tv[(i+1)%3].y+HALFMAPSIZE),mm_yourcolor); + // HACK: don't draw before the first refresh of the canvas + // there is a one-frame delay for its contents to get updated when drawing in the HUD + if ( (level.maptime > 1) && mm_cvfirstdraw ) + Screen.DrawTexture(mm_canvastex,false,xx+2,yy+2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + else Screen.Dim(mm_backcolor,1.,int((xx+2)*hs),int((yy+2)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs)); + mm_cvfirstdraw = true; + return; + } + mm_cvfirstdraw = false; + Vector2 basemappos = (xx+HALFMAPSIZE+2,yy+HALFMAPSIZE+2); + Screen.Dim(mm_backcolor,1.,int((basemappos.x-HALFMAPSIZE)*hs),int((basemappos.y-HALFMAPSIZE)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs)); + Screen.SetClipRect(int((basemappos.x-HALFMAPSIZE)*hs),int((basemappos.y-HALFMAPSIZE)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs)); + // draw dat stuff + DrawMapLines(basemappos*hs); + DrawMapThings(basemappos*hs); + DrawMapMarkers(basemappos*hs); + // finally, draw the player arrow + Vector2 tv[] = {(0,-4),(-3,2),(3,2)}; + for ( int i=0; i<3; i++ ) tv[i] = (tv[i]+basemappos)*hs; + for ( int i=0; i<3; i++ ) Screen.DrawThickLine(int(tv[i].x),int(tv[i].y),int(tv[(i+1)%3].x),int(tv[(i+1)%3].y),max(1.,hs*.5),mm_yourcolor); + Screen.ClearClipRect(); + } + private void DrawTopStuff() { int xx, yy = margin; @@ -816,21 +875,7 @@ extend Class SWWMStatusBar GetMinimapColors(); xx = int(ss.x-(margin+(HALFMAPSIZE+2)*2)); Screen.DrawTexture(MiniBox,false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - Vector2 basemappos = (xx+HALFMAPSIZE+2,yy+HALFMAPSIZE+2); - Screen.Dim(mm_backcolor,1.,int((basemappos.x-HALFMAPSIZE)*hs),int((basemappos.y-HALFMAPSIZE)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs)); - Screen.SetClipRect(int((basemappos.x-HALFMAPSIZE)*hs),int((basemappos.y-HALFMAPSIZE)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs)); - // draw dat stuff - DrawMapLines(basemappos*hs); - DrawMapThings(basemappos*hs); - DrawMapMarkers(basemappos*hs); - // finally, draw the player arrow - Vector2 tv[3]; - tv[0] = (0,-4); - tv[1] = (-3,2); - tv[2] = (3,2); - for ( int i=0; i<3; i++ ) tv[i] = (tv[i]+basemappos)*hs; - for ( int i=0; i<3; i++ ) Screen.DrawThickLine(int(tv[i].x),int(tv[i].y),int(tv[(i+1)%3].x),int(tv[(i+1)%3].y),max(1.,hs*.5),mm_yourcolor); - Screen.ClearClipRect(); + DrawMinimap(xx,yy); yy += ((HALFMAPSIZE+2)*2)+5; } // draw stats and timer when automap is open diff --git a/zscript/hud/swwm_hud_weapons.zsc b/zscript/hud/swwm_hud_weapons.zsc index 200a5c070..e250144f5 100644 --- a/zscript/hud/swwm_hud_weapons.zsc +++ b/zscript/hud/swwm_hud_weapons.zsc @@ -57,8 +57,7 @@ extend Class SWWMStatusBar override void ReceivedWeapon( Weapon weapn ) { Super.ReceivedWeapon(weapn); - int dummy, slot; - [dummy, slot] = players[consoleplayer].weapons.LocateWeapon(weapn.GetClass()); + let [dummy, slot] = players[consoleplayer].weapons.LocateWeapon(weapn.GetClass()); EventHandler.SendNetworkEvent("swwmweaponreceive",slot,consoleplayer); } diff --git a/zscript/hud/swwm_hudextra.zsc b/zscript/hud/swwm_hudextra.zsc index f09713421..ce5807cd7 100644 --- a/zscript/hud/swwm_hudextra.zsc +++ b/zscript/hud/swwm_hudextra.zsc @@ -819,3 +819,338 @@ Class DSMapTitle : HUDMessageBase MySubDrawText(txtsub,xx-w2/2,yy+fheight_sub+12,ss,alpha); } } + +// ez weapon selector +Class SWWMWeaponSelect : HUDMessageBase +{ + Actor mo; + Array weaps; + int cursel; + double alph, olalph; + double curY, smoothY, olsmoothY; + int stage; + Font fnt; + + private int CmpWeapon( Weapon a, Weapon b ) + { + let [dummya, slota] = mo.player.weapons.LocateWeapon(a.GetClass()); + if ( slota == 0 ) slota = 10; + let [dummyb, slotb] = mo.player.weapons.LocateWeapon(b.GetClass()); + if ( slotb == 0 ) slotb = 10; + if ( slota == slotb ) + return (a.SlotPriority <= b.SlotPriority); + return slota > slotb; + } + + private int partition_weapons( int l, int h ) + { + Weapon pv = weaps[h]; + int i = (l-1); + for ( int j=l; j<=(h-1); j++ ) + { + if ( CmpWeapon(pv,weaps[j]) ) + { + i++; + Weapon tmp = weaps[j]; + weaps[j] = weaps[i]; + weaps[i] = tmp; + } + } + Weapon tmp = weaps[h]; + weaps[h] = weaps[i+1]; + weaps[i+1] = tmp; + return i+1; + } + private void qsort_weapons( int l, int h ) + { + if ( l >= h ) return; + int p = partition_weapons(l,h); + qsort_weapons(l,p-1); + qsort_weapons(p+1,h); + } + + static clearscope bool PlayerHasWeapons( Actor mo ) + { + for ( Inventory i=mo.inv; i; i=i.inv ) + { + if ( !(i is 'Weapon') ) continue; + let w = Weapon(i); + if ( !mo.player.weapons.LocateWeapon(w.GetClass()) ) continue; + if ( (w is 'SWWMWeapon') && SWWMWeapon(w).bHIDEINMENU ) continue; + return true; + } + return false; + } + + private double CalcHeight() + { + double th = 0.; + double cur = -1.; + for ( int i=0; i 1) && ((mo.player.ReadyWeapon == sw) || ((mo.player.ReadyWeapon != sw.SisterWeapon) && !swwm_singlefirst)) ) + bar.ntagstr = sw.SisterWeapon.GetTag(); + else bar.ntagstr = weaps[cursel].GetTag(); + bar.ntagtic = level.totaltime; + bar.ntagcol = nametagcolor; + } + + private bool CanScroll() + { + double ht = 20.; // extra padding + if ( weaps[cursel] ) + { + if ( weaps[cursel].Icon.IsValid() ) + { + Vector2 sz = TexMan.GetScaledSize(weaps[cursel].Icon); + if ( weaps[cursel] is 'SWWMWeapon' ) + ht += sz.y*.0625; + else ht += sz.y*.5; + } + else ht += fnt.GetHeight()*.5; + } + return (abs(smoothY-curY) < ht); + } + + private bool WeaponHasAmmo( Weapon w ) + { + if ( SWWMWeapon(w) ) + return SWWMWeapon(w).ReportHUDAmmo(); + if ( (!w.Ammo1 || (w.Ammo1.Amount > 0) || w.bAMMO_OPTIONAL) || (w.Ammo2 && ((w.Ammo2.Amount > 0) || w.bALT_AMMO_OPTIONAL)) ) + return true; + return false; + } + + void WeapPrev() + { + if ( (weaps.Size() <= 1) || !CanScroll() ) return; + for ( int i=0; i= weaps.Size() ) cursel = 0; + if ( WeaponHasAmmo(weaps[cursel]) ) break; + } + curY = CalcHeight(); + S_StartSound("menu/demoscroll",CHAN_AUTO,CHANF_UI); + if ( !weaps[cursel] || !(displaynametags&2) ) return; + ShowNameTag(); + } + + void WeapSel() + { + if ( !CanScroll() ) return; + stage = 2; + if ( !weaps[cursel] ) S_StartSound("menu/democlose",CHAN_AUTO,CHANF_UI|CHANF_OVERLAP); + else EventHandler.SendNetworkEvent(String.Format("swwmselweapon.%s",weaps[cursel].GetClassName()),mo.PlayerNumber()); + } + + void WeapCancel() + { + if ( !CanScroll() ) return; + stage = 2; + S_StartSound("menu/democlose",CHAN_AUTO,CHANF_UI|CHANF_OVERLAP); + } + + override bool Tick() + { + int oldsiz = weaps.Size(); + bool bChanged = false; + Weapon oldsel = (weaps.Size()<=0)?null:weaps[cursel]; + for ( int i=0; i i ) cursel--; + i--; + } + for ( Inventory i=mo.inv; i; i=i.inv ) + { + if ( !(i is 'Weapon') ) continue; + let w = Weapon(i); + if ( !mo.player.weapons.LocateWeapon(w.GetClass()) ) continue; + if ( (w is 'SWWMWeapon') && SWWMWeapon(w).bHIDEINMENU ) continue; + if ( weaps.Find(w) < weaps.Size() ) continue; + weaps.Push(w); + bChanged = true; + } + if ( cursel >= weaps.Size() ) cursel = max(0,weaps.Size()-1); + if ( weaps.Size() <= 0 ) stage = 2; // force close if no weapons available + else if ( bChanged ) + { + // re-sort and reposition + qsort_weapons(0,weaps.Size()-1); + let idx = weaps.Find(oldsel); + if ( idx < weaps.Size() ) cursel = idx; + curY = CalcHeight(); + } + olalph = alph; + switch ( stage ) + { + case 0: + // fade in + alph += 4./GameTicRate; + if ( alph >= 1. ) + { + alph = 1.; + stage = 1; + return false; + } + break; + case 1: + // do nothing + break; + case 2: + // fade out + alph -= 6./GameTicRate; + if ( alph <= 0. ) + { + PPShader.SetEnabled("BokehSel",false); // clear the shader + return true; + } + break; + } + // smooth scroll + olsmoothY = smoothY; + smoothY = smoothY*.8+curY*.2; + double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/360.)),1.); + if ( abs(smoothY-curY) < (1./hs) ) smoothY = curY; + return false; + } + + override void Draw( int bottom, int visibility ) + { + double fractic = System.GetTimeFrac(); + double ssmoothY = SWWMUtility.Lerp(olsmoothY,smoothY,fractic); + double salph = SWWMUtility.Lerp(olalph,alph,fractic); + if ( swwm_shaders ) + { + PPShader.SetEnabled("BokehSel",true); + PPShader.SetUniform1f("BokehSel","strength",salph); + } + Screen.Dim("Black",.4*salph,0,0,Screen.GetWidth(),Screen.GetHeight()); + double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/360.)),1.); + Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs; + Vector2 hss = ss*.5; + double x = Screen.GetWidth()*.5; + double y = hss.y-ssmoothY; + for ( int i=0; i 1) && ((mo.player.ReadyWeapon == sw) || ((mo.player.ReadyWeapon != sw.SisterWeapon) && !swwm_singlefirst)) ) + { + // double draw + Screen.DrawTexture(ico,false,x-(4.*hs),(y-4.)*hs,DTA_ScaleX,scl*hs,DTA_ScaleY,scl*hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true,DTA_Color,bHasAmmo?0xFFFFFFFF:0xFF800000,DTA_ColorOverlay,(i==cursel)?0x00000000:0x80000000); + Screen.DrawTexture(ico,false,x+(4.*hs),(y+4.)*hs,DTA_ScaleX,scl*hs,DTA_ScaleY,scl*hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true,DTA_Color,bHasAmmo?0xFFFFFFFF:0xFF800000,DTA_ColorOverlay,(i==cursel)?0x00000000:0x80000000); + } + else Screen.DrawTexture(ico,false,x,y*hs,DTA_ScaleX,scl*hs,DTA_ScaleY,scl*hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true,DTA_Color,bHasAmmo?0xFFFFFFFF:0xFF800000,DTA_ColorOverlay,(i==cursel)?0x00000000:0x80000000); + if ( i == cursel ) + { + Screen.DrawChar(fnt,Font.CR_FIRE,x-((sz.x*scl*.5+16.+2.*sin((gametic+fractic)*8.))*hs),y*hs,0x25BA,DTA_ScaleX,hs,DTA_ScaleY,hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true); + Screen.DrawChar(fnt,Font.CR_FIRE,x+((sz.x*scl*.5+16.+2.*sin((gametic+fractic)*8.))*hs),y*hs,0x25C4,DTA_ScaleX,hs,DTA_ScaleY,hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true); + } + y += sz.y*scl*.5; + } + else + { + String label = "?WeaponName?"; + if ( sw && sw.SisterWeapon && (sw.Amount > 1) && ((mo.player.ReadyWeapon == sw) || ((mo.player.ReadyWeapon != sw.SisterWeapon) && !swwm_singlefirst)) ) + label = sw.SisterWeapon.GetTag(); + else label = w.GetTag(); + Vector2 sz = (fnt.StringWidth(label),fnt.GetHeight()); + Screen.DrawText(fnt,bHasAmmo?Font.CR_WHITE:Font.CR_RED,x-sz.x*.5*hs,y*hs,label,DTA_ScaleX,hs,DTA_ScaleY,hs,DTA_Alpha,salph*fade,DTA_ColorOverlay,(i==cursel)?0x00000000:0x80000000); + y += sz.y*.5; + if ( i == cursel ) + { + Screen.DrawChar(fnt,Font.CR_FIRE,x-((sz.x*.5+16.+2.*sin((gametic+fractic)*8.))*hs),y*hs,0x25BA,DTA_ScaleX,hs,DTA_ScaleY,hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true); + Screen.DrawChar(fnt,Font.CR_FIRE,x+((sz.x*.5+16.+2.*sin((gametic+fractic)*8.))*hs),y*hs,0x25C4,DTA_ScaleX,hs,DTA_ScaleY,hs,DTA_Alpha,salph*fade,DTA_CenterOffset,true); + } + y += sz.y*.5; + } + y += 8.; + } + } +} diff --git a/zscript/items/swwm_baseitem.zsc b/zscript/items/swwm_baseitem.zsc index 3374286f3..d4a3e9923 100644 --- a/zscript/items/swwm_baseitem.zsc +++ b/zscript/items/swwm_baseitem.zsc @@ -83,7 +83,7 @@ Mixin Class SWWMUseToPickup double dist = tracedir.length(); tracedir /= dist; let cf = new("CrossLineFinder"); - cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0); + cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0,ignoreallactors:true); // trigger all player cross lines found between user and item for ( int i=0; i l.bbox[0] ) continue; - if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue; + if ( Level.BoxOnLineSide(pos.xy,32,l) != -1 ) continue; // there isn't enough space to spawn a box here let b = Spawn("HealthNuggetItem",pos); SWWMUtility.TransferItemProp(self,b); @@ -1032,7 +1032,7 @@ Class Chancebox : Actor if ( tbox[3] < l.bbox[2] ) continue; if ( tbox[0] < l.bbox[1] ) continue; if ( tbox[1] > l.bbox[0] ) continue; - if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue; + if ( Level.BoxOnLineSide(testpos.xy,32,l) != -1 ) continue; blocked = true; break; } @@ -1344,7 +1344,7 @@ Class Chancebox : Actor XZW2 A 1 { A_SetSize(default.radius*scale.x,2.5*scale.y); - A_QuakeEx(2,2,2,9,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.2); + A_QuakeEx(2.4,2.4,2.4,9,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.2); A_StartSound("chancebox/explode",CHAN_VOICE,pitch:1./scale.x); angle = specialf1; pitch = roll = 0; diff --git a/zscript/items/swwm_lamp.zsc b/zscript/items/swwm_lamp.zsc index ee2199261..16e2c66b3 100644 --- a/zscript/items/swwm_lamp.zsc +++ b/zscript/items/swwm_lamp.zsc @@ -407,7 +407,7 @@ Class CompanionLamp : Actor { // push away from wall Vector3 normal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit(); - if ( !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) ) normal *= -1; + if ( !Level.PointOnLineSide(pos.xy,BlockingLine) ) normal *= -1; vel += 4.*normal; blocked = true; } diff --git a/zscript/items/swwm_miscitems.zsc b/zscript/items/swwm_miscitems.zsc index b3a53a074..cceabf0c1 100644 --- a/zscript/items/swwm_miscitems.zsc +++ b/zscript/items/swwm_miscitems.zsc @@ -210,7 +210,7 @@ Class BallImpact : SWWMNonInteractiveActor override void PostBeginPlay() { Super.PostBeginPlay(); - A_QuakeEx(3,3,3,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3); + A_QuakeEx(3.,3.,3.,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3); A_StartSound("leadball/hit",CHAN_VOICE); A_SprayDecal("WallCrack",-20); int numpt = Random[Spreadgun](5,10); @@ -291,7 +291,7 @@ Class TheBall : Actor A_AlertMonsters(swwm_uncapalert?0:2500,AMF_EMITFROMTARGET); A_StartSound(snd,CHAN_VOICE,CHANF_OVERLAP,1.,.2); A_StartSound(snd,CHAN_VOICE,CHANF_OVERLAP,1.,.2); - victim.A_QuakeEx(8,8,8,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); + victim.A_QuakeEx(8.,8.,8.,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); victim.A_StartSound(snd,CHAN_DAMAGE,CHANF_OVERLAP,1.,.2); slamforce *= 4; dmg *= 4; @@ -450,7 +450,6 @@ Class TheBall : Actor Class SaltTracer : LineTracer { - Actor ignore; Array ShootThroughList; Array WaterHitList; @@ -473,7 +472,6 @@ Class SaltTracer : LineTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignore ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; return TRACE_Skip; } @@ -525,7 +523,7 @@ Class SaltImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:6000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,30+special2*4,15000,100,40); - A_QuakeEx(3,3,3,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); + A_QuakeEx(3.,3.,3.,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); A_StartSound("saltshot/hit",CHAN_VOICE,attenuation:.35); A_SprayDecal("ShockMarkSmall",-172); A_SprayDecal("SaltMark",-172); @@ -592,11 +590,9 @@ Class SaltBeam : SWWMNonInteractiveActor void SpreadOut() { special1 = 1; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); let t = new("SaltTracer"); - t.ignore = target; - t.Trace(pos,cursector,x,speed,TRACE_HitSky); + t.Trace(pos,cursector,x,speed,0,ignore:target); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -631,16 +627,13 @@ Class SaltBeam : SWWMNonInteractiveActor } Vector3 norm = SWWMUtility.GetLineTracerHitNormal(t.Results); if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos); - if ( t.Results.HitType != TRACE_HasHitSky ) - { - let i = Spawn("SaltImpact",level.Vec3Offset(t.Results.HitPos,norm*4)); - i.angle = atan2(norm.y,norm.x); - i.pitch = asin(-norm.z); - i.target = target; - i.special1 = (Stamina-9)/4; - i.special2 = Accuracy; - i.args[0] = args[1]; - } + let i = Spawn("SaltImpact",level.Vec3Offset(t.Results.HitPos,norm*4)); + i.angle = atan2(norm.y,norm.x); + i.pitch = asin(-norm.z); + i.target = target; + i.special1 = (Stamina-9)/4; + i.special2 = Accuracy; + i.args[0] = args[1]; speed = t.Results.Distance; // shortens in minimap return; } diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc index d7676d445..f5f1100c6 100644 --- a/zscript/items/swwm_powerups.zsc +++ b/zscript/items/swwm_powerups.zsc @@ -41,7 +41,7 @@ Class GrilledCheeseSandwich : Inventory { SWWMUtility.AchievementProgressInc("gcsandwich",1,Owner.player); SWWMHandler.DoFlash(Owner,Color(64,255,255,64),10); - Owner.A_QuakeEx(9,9,9,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(9.,9.,9.,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); Owner.GiveBody(1000,1000); if ( Owner is 'Demolitionist' ) { @@ -339,7 +339,7 @@ Class GhostPower : Powerup Actor snd; - bool bSavedInvisible, bSavedCantSeek, bSavedShadow; + bool bSavedInvisible, bSavedCantSeek, bSavedShadow, bSavedMVisBlocked; Default { @@ -356,9 +356,11 @@ Class GhostPower : Powerup bSavedInvisible = Owner.bINVISIBLE; bSavedCantSeek = Owner.bCANTSEEK; bSavedShadow = Owner.bSHADOW; - Owner.bINVISIBLE = true; - Owner.bCANTSEEK = true; - Owner.bSHADOW = true; + bSavedMVisBlocked = Owner.bMVISBLOCKED; + Owner.bINVISIBLE = true; // makes sure player doesn't render while still keeping psprites intact + Owner.bCANTSEEK = true; // seeking missiles don't track + Owner.bSHADOW = true; // monsters don't aim straight + Owner.bMVISBLOCKED = true; // ensure full invisibility SWWMHandler.DoFlash(Owner,Color(96,224,192,255),20); if ( Owner is 'Demolitionist' ) Demolitionist(Owner).lastbump *= 1.04; @@ -371,6 +373,7 @@ Class GhostPower : Powerup Owner.bINVISIBLE = bSavedInvisible; Owner.bCANTSEEK = bSavedCantSeek; Owner.bSHADOW = bSavedShadow; + Owner.bMVISBLOCKED = bSavedMVisBlocked; Owner.A_StartSound("powerup/ghostend",CHAN_ITEMEXTRA,CHANF_OVERLAP); SWWMHandler.DoFlash(Owner,Color(96,224,192,255),20); if ( Owner is 'Demolitionist' ) @@ -1013,7 +1016,7 @@ Class RagekitPower : Powerup lastrage = SWWMHandler.AddOneliner("ragekit",2,20)+40; Owner.A_AlertMonsters(swwm_uncapalert?0:5000); SWWMHandler.DoFlash(Owner,Color(64,255,0,0),30); - Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(8.,8.,8.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); lasteffect = int.min; lastpulse = max(lastpulse,gametic+35); Demolitionist(Owner).lastbump *= .95; @@ -1036,7 +1039,7 @@ Class RagekitPower : Powerup Owner.A_AlertMonsters(swwm_uncapalert?0:2000); if ( (Owner.player == players[consoleplayer]) && (gametic > lastrage) && (swwm_mutevoice < 2) ) lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+20; - Owner.A_QuakeEx(2,2,2,Random[Rage](1,2),0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + Owner.A_QuakeEx(1.5,1.5,1.5,Random[Rage](1,2),0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); lastpulse = max(lastpulse,gametic+10); Demolitionist(Owner).lastbump *= .995; } @@ -1055,7 +1058,7 @@ Class RagekitPower : Powerup if ( !Owner ) return; Owner.A_StartSound("powerup/ragekitend",CHAN_ITEMEXTRA,CHANF_OVERLAP); SWWMHandler.DoFlash(Owner,Color(128,255,0,0),30); - Owner.A_QuakeEx(4,4,4,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(4.,4.,4.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); Owner.A_AlertMonsters(2000); Demolitionist(Owner).lastbump *= .9; if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_RAGEKIT")); @@ -1067,7 +1070,7 @@ Class RagekitPower : Powerup Owner.GiveBody(5,100); Owner.A_AlertMonsters(swwm_uncapalert?0:5000); SWWMHandler.DoFlash(Owner,Color(64,255,0,0),10); - Owner.A_QuakeEx(8,8,8,Random[Rage](3,8),0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(8.,8.,8.,Random[Rage](3,8),0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); if ( (Owner.player == players[consoleplayer]) && (gametic > lastrage) && (swwm_mutevoice < 2) ) lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+40; Owner.A_StartSound("powerup/ragekithit",CHAN_POWERUP,CHANF_OVERLAP); @@ -1114,7 +1117,7 @@ Class Ragekit : Inventory if ( !(Owner is 'Demolitionist') ) { SWWMHandler.DoFlash(Owner,Color(64,255,0,0),30); - Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(8.,8.,8.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); return true; } let r = RagekitPower(Owner.FindInventory("RagekitPower")); @@ -1122,7 +1125,7 @@ Class Ragekit : Inventory { r.EffectTics += r.default.EffectTics; SWWMHandler.DoFlash(Owner,Color(64,255,0,0),30); - Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + Owner.A_QuakeEx(8.,8.,8.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); r.lastpulse = max(r.lastpulse,gametic+35); Demolitionist(Owner).lastbump *= .95; } diff --git a/zscript/items/swwm_powerups_vip.zsc b/zscript/items/swwm_powerups_vip.zsc index 622c44beb..5f6aa0799 100644 --- a/zscript/items/swwm_powerups_vip.zsc +++ b/zscript/items/swwm_powerups_vip.zsc @@ -2,7 +2,6 @@ Class TendrilTracer : LineTracer { - Actor ignore; Array ShootThroughList; Array HitList; @@ -10,7 +9,6 @@ Class TendrilTracer : LineTracer { if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignore ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("HitListEntry"); @@ -38,15 +36,13 @@ Class MykradvoTendril : SWWMNonInteractiveActor void A_Trace() { tics = bMISSILEMORE?2:1; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); if ( !bSTANDSTILL ) { let t = new("TendrilTracer"); - t.ignore = target; t.hitlist.Clear(); t.ShootThroughList.Clear(); - t.Trace(pos,CurSector,x,speed,0); + t.Trace(pos,CurSector,x,speed,0,ignore:target); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -96,8 +92,7 @@ Class MykradvoTendril : SWWMNonInteractiveActor if ( bMISSILEMORE && bMISSILEEVENMORE ) { // spread into sub-tendrils - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); int ntendies = tracer?clamp(tracer.GetSpawnHealth()/400,2,10):2; for ( int i=0; i l.bbox[0] ) continue; - if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue; + if ( Level.BoxOnLineSide(pos.xy,radius+8,l) != -1 ) continue; touching.Push(l); } let pi = swwm_PolyobjectIterator.Create(); @@ -376,7 +381,7 @@ Class Demolitionist : PlayerPawn else if ( source is 'ThrustFloor' ) { let q = Spawn("BustedQuake",source.pos); - q.special1 = 4; + q.specialf1 = 4.; int numpt = Random[ExploS](30,40); for ( int i=0; i 1. ) + Vector3 angles = SWWMUtility.LerpVector3(oldlagangles,lagangles,ticfrac); + Vector3 dangles = SWWMUtility.LerpVector3(oldlagdangles,lagdangles,ticfrac); + if ( abs(dangles.x) > 1. ) { - int sgn = (diffang>0)?1:-1; - diffang = abs(diffang)**.7*sgn; + int sgn = (dangles.x>0)?1:-1; + dangles.x = abs(dangles.x)**.75*sgn; } - if ( abs(diffpitch) > 1. ) + if ( abs(dangles.y) > 1. ) { - int sgn = (diffpitch>0)?1:-1; - diffpitch = abs(diffpitch)**.7*sgn; + int sgn = (dangles.y>0)?1:-1; + dangles.y = abs(dangles.y)**.75*sgn; } - if ( abs(diffroll) > 1. ) + if ( abs(dangles.z) > 1. ) { - int sgn = (diffroll>0)?1:-1; - diffroll = abs(diffroll)**.7*sgn; + int sgn = (dangles.z>0)?1:-1; + dangles.z = abs(dangles.z)**.75*sgn; } Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac); - let [x, y, z] = SWWMUtility.GetAxes(flagangle,flagpitch,flagroll); - let [x2, y2, z2] = SWWMUtility.GetAxes(flagangle,0,flagroll); + let [x, y, z] = SWWMUtility.GetAxes(angles.x,angles.y,angles.z); + let [x2, y2, z2] = SWWMUtility.GetAxes(angles.x,0,angles.z); double diffx = flagvel dot x; double diffy = flagvel dot y; double diffz = flagvel dot z; @@ -488,27 +486,27 @@ Class Demolitionist : PlayerPawn if ( abs(diffx) > 1. ) { int sgn = (diffx>0)?1:-1; - diffx = abs(diffx)**.5*sgn; + diffx = abs(diffx)**.75*sgn; } if ( abs(diffy) > 1. ) { int sgn = (diffy>0)?1:-1; - diffy = abs(diffy)**.5*sgn; + diffy = abs(diffy)**.75*sgn; } if ( abs(diffz) > 1. ) { int sgn = (diffz>0)?1:-1; - diffz = abs(diffz)**.5*sgn; + diffz = abs(diffz)**.75*sgn; } if ( abs(diffy2) > 1. ) { int sgn = (diffy2>0)?1:-1; - diffy2 = abs(diffy2)**.5*sgn; + diffy2 = abs(diffy2)**.75*sgn; } if ( abs(diffz2) > 1. ) { int sgn = (diffz2>0)?1:-1; - diffz2 = abs(diffz2)**.5*sgn; + diffz2 = abs(diffz2)**.75*sgn; } Vector3 bobvec = (diffy,-diffz,diffx*.5)*20. + (cur.x,-cur.y,cur.y)*15.; Vector3 bobang = (dangles.x,dangles.y,dangles.z)*.15 - (cur.x,cur.y,-cur.x*2.)*.05 - (diffy2,diffz2,0)*.02; @@ -523,7 +521,7 @@ Class Demolitionist : PlayerPawn return bobvec*fready*vfact, bobang*fready*rfact; } - // compatibility with 2D weapons + // compatibility with 2D weapons (may cause sprite cutoff) override Vector2 BobWeapon( double ticfrac ) { if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob ) @@ -532,88 +530,36 @@ Class Demolitionist : PlayerPawn player.WeaponState |= WF_WEAPONBOBBING; // always bob Vector2 cur = BobWeaponAngle(ticfrac); if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING; - double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac); - double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac); - double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac); - double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac); - double diffang = fangle-flagangle; - double diffpitch = fpitch-flagpitch; - if ( abs(diffang) > 1. ) + Vector3 angles = SWWMUtility.LerpVector3(oldlagangles,lagangles,ticfrac); + Vector3 dangles = SWWMUtility.LerpVector3(oldlagdangles,lagdangles,ticfrac); + if ( abs(dangles.x) > 1. ) { - int sgn = (diffang>0)?1:-1; - diffang = abs(diffang)**.7*sgn; + int sgn = (dangles.x>0)?1:-1; + dangles.x = abs(dangles.x)**.75*sgn; } - if ( abs(diffpitch) > 1. ) + if ( abs(dangles.y) > 1. ) { - int sgn = (diffpitch>0)?1:-1; - diffpitch = abs(diffpitch)**.7*sgn; + int sgn = (dangles.y>0)?1:-1; + dangles.y = abs(dangles.y)**.75*sgn; } - cur.x += diffang*.4; - cur.y -= diffpitch*.4; + cur.x += dangles.x*.4; + cur.y -= dangles.y*.4; Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac); - double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac); - let [x, y, z] = SWWMUtility.GetAxes(flagangle,0,flagroll); + let [x, y, z] = SWWMUtility.GetAxes(angles.x,0,angles.z); double diffy = flagvel dot y; double diffz = flagvel dot z; if ( abs(diffy) > 1. ) { int sgn = (diffy>0)?1:-1; - diffy = abs(diffy)**.5*sgn; + diffy = abs(diffy)**.75*sgn; } if ( abs(diffz) > 1. ) { int sgn = (diffz>0)?1:-1; - diffz = abs(diffz)**.5*sgn; + diffz = abs(diffz)**.75*sgn; } - cur.x -= diffy*.8; - cur.y += diffz*.8; - return cur*SWWMUtility.Lerp(oldlagready,lagready,ticfrac); - }*/ - - override Vector2 BobWeapon( double ticfrac ) - { - if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob ) - return (0,0); - bool oldbob = !!(player.WeaponState&WF_WEAPONBOBBING); - player.WeaponState |= WF_WEAPONBOBBING; // always bob - Vector2 cur = BobWeaponAngle(ticfrac); - if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING; - double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac); - double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac); - double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac); - double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac); - double diffang = fangle-flagangle; - double diffpitch = fpitch-flagpitch; - if ( abs(diffang) > 1. ) - { - int sgn = (diffang>0)?1:-1; - diffang = abs(diffang)**.7*sgn; - } - if ( abs(diffpitch) > 1. ) - { - int sgn = (diffpitch>0)?1:-1; - diffpitch = abs(diffpitch)**.7*sgn; - } - cur.x += diffang*.4; - cur.y -= diffpitch*.4; - Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac); - double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(flagangle,0,flagroll); - double diffy = flagvel dot y; - double diffz = flagvel dot z; - if ( abs(diffy) > 1. ) - { - int sgn = (diffy>0)?1:-1; - diffy = abs(diffy)**.5*sgn; - } - if ( abs(diffz) > 1. ) - { - int sgn = (diffz>0)?1:-1; - diffz = abs(diffz)**.5*sgn; - } - cur.x -= diffy*.8; - cur.y += diffz*.8; + cur.x -= diffy*.4; + cur.y += diffz*.4; return cur*SWWMUtility.Lerp(oldlagready,lagready,ticfrac); } @@ -762,6 +708,13 @@ Class Demolitionist : PlayerPawn dashboost = 0.; // prevent sudden stomping if we were previously falling lastvelz = vel.z; + // clear bob data + oldlagangles = lagangles = oldangles = (angle,pitch,roll); + oldlagdangles = lagdangles = (0.,0.,0.); + oldlagvel = lagvel = vel; + bumpvelz = bumpangle = bumppitch = bumproll = 0.; + ViewAngle = ViewPitch = ViewRoll = 0.; + SetViewPos((0.,0.,0.)); // early cancel gestures if ( player ) { @@ -789,14 +742,15 @@ Class Demolitionist : PlayerPawn // reset all smooth bob variables if angles/velocity aren't carried over if ( !(flags&TELF_KEEPORIENTATION) ) { - oldlagangle = lagangle = oldangle = angle; - oldlagpitch = lagpitch = oldpitch = pitch; - oldlagroll = lagroll = oldroll = roll; + oldlagangles = lagangles = oldangles = (angle,pitch,roll); + oldlagdangles = lagdangles = (0.,0.,0.); + bumpangle = bumppitch = bumproll = 0.; } if ( !(flags&TELF_KEEPVELOCITY) ) { oldlagvel = lagvel = vel; lastvelz = vel.z; + bumpvelz = 0.; } // notify carried lamp that we just moved let l = SWWMLamp(FindInventory("SWWMLamp")); diff --git a/zscript/player/swwm_player_anim.zsc b/zscript/player/swwm_player_anim.zsc index ba34b263d..a1f9dc317 100644 --- a/zscript/player/swwm_player_anim.zsc +++ b/zscript/player/swwm_player_anim.zsc @@ -404,7 +404,7 @@ extend Class Demolitionist int loudlv = swwm_voiceamp; if ( lastdamage > 70 ) { - A_QuakeEx(3,3,3,9,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(3.2,3.2,3.2,9,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_StartSound("demolitionist/hipain",CHAN_VOICE); lastbump *= 1.04; if ( swwm_mutevoice < 4 ) @@ -419,7 +419,7 @@ extend Class Demolitionist } else if ( lastdamage > 30 ) { - A_QuakeEx(2,2,2,6,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(1.6,1.6,1.6,6,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_StartSound("demolitionist/pain",CHAN_VOICE); lastbump *= 1.02; if ( swwm_mutevoice < 4 ) @@ -434,7 +434,7 @@ extend Class Demolitionist } else if ( lastdamage > 0 ) { - A_QuakeEx(1,1,1,3,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(.4,.4,.4,3,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_StartSound("demolitionist/lopain",CHAN_VOICE); lastbump *= 1.01; if ( swwm_mutevoice < 4 ) diff --git a/zscript/player/swwm_player_fx.zsc b/zscript/player/swwm_player_fx.zsc index ef5664e5a..74dee0ac2 100644 --- a/zscript/player/swwm_player_fx.zsc +++ b/zscript/player/swwm_player_fx.zsc @@ -45,6 +45,26 @@ Class SWWMMagItem play } } +// 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; + } + 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; + } +} + // finds the closest reflective surface // can only match lines, as reflective sector plane data isn't obtainable from zscript Class SWWMMirrorTracer : LineTracer @@ -247,7 +267,7 @@ Class DemolitionistShockwave : SWWMNonInteractiveActor override void PostBeginPlay() { Super.PostBeginPlay(); - A_QuakeEx(7,7,7,30,0,300+min(special1,50)*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:1.5); + A_QuakeEx(7.,7.,7.,30,0,300+min(special1,50)*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:1.5); if ( target.player != players[consoleplayer] ) { A_StartSound("demolitionist/hardland",CHAN_FOOTSTEP,CHANF_OVERLAP,attenuation:.3); diff --git a/zscript/player/swwm_player_inventory.zsc b/zscript/player/swwm_player_inventory.zsc index 661fc07ce..1384f3a82 100644 --- a/zscript/player/swwm_player_inventory.zsc +++ b/zscript/player/swwm_player_inventory.zsc @@ -233,9 +233,7 @@ extend Class Demolitionist private Weapon PickPNWeapon( bool bPrev = false ) { - bool found; - int sslot, sidx; - [found, sslot, sidx] = FindMostRecentWeaponSWWM(); + let [found, sslot, sidx] = FindMostRecentWeaponSWWM(); let cur = player.ReadyWeapon; if ( cur is 'SWWMGesture' ) cur = SWWMGesture(cur).formerweapon; else if ( cur is 'SWWMItemGesture' ) cur = SWWMItemGesture(cur).gest.formerweapon; diff --git a/zscript/player/swwm_player_move.zsc b/zscript/player/swwm_player_move.zsc index 9f82a17b7..791f9fa67 100644 --- a/zscript/player/swwm_player_move.zsc +++ b/zscript/player/swwm_player_move.zsc @@ -146,8 +146,7 @@ extend Class Demolitionist if ( bFly && !bFlyCheat && !(player.cheats&CF_NOCLIP2) ) { double fs = TweakSpeed(); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); Vector3 accel; if ( (player.cmd.upmove == -32768) || sendtoground ) { @@ -220,8 +219,7 @@ extend Class Demolitionist if ( player.cmd.buttons&BT_JUMP ) jcmove += 4096.; if ( player.cmd.buttons&BT_CROUCH ) jcmove -= 4096.; if ( CanCrouch() && (player.crouchfactor != -1) ) fs *= player.crouchfactor; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); Vector2 nmove = NormalizedMove(); Vector3 accel = x*nmove.x-y*nmove.y+z*jcmove; accel *= fs/320.; @@ -251,8 +249,7 @@ extend Class Demolitionist if ( player.cmd.forwardmove|player.cmd.sidemove ) { double bobfactor; - double friction, movefactor; - [friction, movefactor] = GetFriction(); + let [friction, movefactor] = GetFriction(); bobfactor = (friction mirrorcooldown) && (swwm_mutevoice < 2) ) @@ -200,9 +198,7 @@ extend Class Demolitionist override void PlayerThink() { - oldangle = angle; - oldpitch = pitch; - oldroll = roll; + oldangles = (angle,pitch,roll); if ( player && (player.mo == self) && (player.playerstate != PST_DEAD) && (player.cmd.buttons&BT_USE) ) { if ( !player.usedown ) lastuse = gametic; @@ -236,12 +232,10 @@ extend Class Demolitionist } } else if ( gametic > lastuse+50 ) failcounter = 0; - oldlagangle = lagangle; - oldlagpitch = lagpitch; - oldlagroll = lagroll; - lagangle = lagangle*.8+angle*.2; - lagpitch = lagpitch*.8+pitch*.2; - lagroll = lagroll*.8+roll*.2; + oldlagangles = lagangles; + lagangles = lagangles*.8+(angle,pitch,roll)*.2; + oldlagdangles = lagdangles; + lagdangles = lagdangles*.8+(deltaangle(oldangles.x,angle),deltaangle(oldangles.y,pitch),deltaangle(oldangles.z,roll))*.2; if ( !player || (player.mo != self) ) return; if ( (player.playerstate != PST_DEAD) && (player.jumptics != 0) ) { @@ -263,6 +257,7 @@ extend Class Demolitionist override void DeathThink() { + oldangles = (angle,pitch,roll); player.Uncrouch(); TickPSprites(); player.onground = (pos.Z<=floorz); @@ -278,6 +273,11 @@ extend Class Demolitionist double droll = clamp(deltaangle(roll,50)*.5,-5,5); if ( abs(droll) < 2. ) roll = 50.; else A_SetRoll(roll+droll,SPF_INTERPOLATE); + // bob interpolation still active + oldlagangles = lagangles; + lagangles = lagangles*.8+(angle,pitch,roll)*.2; + oldlagdangles = lagdangles; + lagdangles = lagdangles*.8+(deltaangle(oldangles.x,angle),deltaangle(oldangles.y,pitch),deltaangle(oldangles.z,roll))*.2; player.mo.CalcHeight(); if ( player.damagecount ) player.damagecount--; if ( player.poisoncount ) player.poisoncount--; diff --git a/zscript/player/swwm_player_tick.zsc b/zscript/player/swwm_player_tick.zsc index 4611d2a14..37598f3ba 100644 --- a/zscript/player/swwm_player_tick.zsc +++ b/zscript/player/swwm_player_tick.zsc @@ -369,9 +369,7 @@ extend Class Demolitionist } } // crush anything we're standing on - bool dummy; - Actor encroached; - [dummy, encroached] = TestMobjZ(); + let [dummy, encroached] = TestMobjZ(); // add special check so corpses don't get stuck on top of monsters and players if ( encroached && encroached.bSOLID && (bSOLID || encroached.bACTLIKEBRIDGE) ) { @@ -422,33 +420,33 @@ extend Class Demolitionist } } } + double bstr = CVar.GetCVar('swwm_bumpstrength',player).GetFloat(); if ( abs(bumpvelz) > double.epsilon ) { - lagvel.z += bumpvelz*.2; + lagvel.z += bumpvelz*bstr*.5; bumpvelz *= .8; } Vector3 temp = (ViewAngle,ViewPitch,ViewRoll); if ( abs(bumpangle) > double.epsilon ) { - temp.x += bumpangle*.5; + temp.x += bumpangle*bstr*.5; bumpangle *= .8; } if ( abs(bumppitch) > double.epsilon ) { - temp.y += bumppitch*.5; + temp.y += bumppitch*bstr*.5; bumppitch *= .8; } if ( abs(bumproll) > double.epsilon ) { - temp.z += bumproll*.5; + temp.z += bumproll*bstr*.5; bumproll *= .8; } // stabilize view angles if ( temp dot temp < double.epsilon ) temp = (0,0,0); else temp *= .8; if ( ViewAngle != temp.x ) A_SetViewAngle(temp.x,SPF_INTERPOLATE); - // IMPORTANT: don't call A_SetViewPitch if the player's min/max pitch are not yet initialized - if ( (ViewPitch != temp.y) && !(player.MinPitch == player.MaxPitch == pitch) ) A_SetViewPitch(temp.y,SPF_INTERPOLATE); + if ( ViewPitch != temp.y ) A_SetViewPitch(temp.y,SPF_INTERPOLATE); if ( ViewRoll != temp.z ) A_SetViewRoll(temp.z,SPF_INTERPOLATE); if ( player.onground && !lastground ) landvelz = lastvelz; else if ( !player.onground && lastground ) landvelz = 0; @@ -563,7 +561,7 @@ extend Class Demolitionist Vector3 diff = level.Vec3Diff(pos,a.pos); Vector3 dirto = diff.unit(); // large monsters will stop the player (unless hit from above if we're going at ground pound speed) - A_QuakeEx(4,4,4,10,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(4.,4.,4.,10,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_AlertMonsters(swwm_uncapalert?0:800); A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP); a.A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP); @@ -574,7 +572,7 @@ extend Class Demolitionist if ( bumped ) continue; bumped = true; SWWMUtility.AchievementProgressInc("bonk",1,player); - A_QuakeEx(8,8,8,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(8.,8.,8.,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); vel *= .2; vel -= dir*(10+(spd*30/mass)); vel -= dirto*(10+(spd*50/mass)); @@ -612,7 +610,7 @@ extend Class Demolitionist A_StartSound("demolitionist/buttslam",CHAN_DAMAGE,CHANF_OVERLAP,1.,.4); if ( swwm_buttsfx ) A_StartSound("demolitionist/buttslamx",CHAN_DAMAGE,CHAN_OVERLAP,1.,.2); Spawn("SWWMItemFog",level.Vec3Offset(pos,diff/2)); - A_QuakeEx(8,8,8,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); + A_QuakeEx(8.,8.,8.,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); mystats.buttslams++; lastbump *= .8; } @@ -677,7 +675,7 @@ extend Class Demolitionist A_StartSound("demolitionist/buttslam",CHAN_DAMAGE,CHANF_OVERLAP,1.,.4); if ( swwm_buttsfx ) A_StartSound("demolitionist/buttslamx",CHAN_DAMAGE,CHAN_OVERLAP,1.,.2); Spawn("SWWMItemFog",Vec3Offset(0,0,Height)); - A_QuakeEx(8,8,8,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); + A_QuakeEx(8.,8.,8.,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); mystats.buttslams++; lastbump *= .8; } @@ -691,7 +689,7 @@ extend Class Demolitionist A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP); bumptic = gametic+int(20+spd/4.); lastbump *= .8; - A_QuakeEx(8,8,8,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(8.,8.,8.,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_AlertMonsters(swwm_uncapalert?0:800); vel *= .2; vel -= dir*(10+(spd*30/mass)); @@ -721,7 +719,7 @@ extend Class Demolitionist { Vector3 wallnorm = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit(); int lside = 1; - if ( !BlockingLine.sidedef[1] || !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) ) + if ( !BlockingLine.sidedef[1] || !Level.PointOnLineSide(pos.xy,BlockingLine) ) { lside = 0; wallnorm *= -1; @@ -776,7 +774,7 @@ extend Class Demolitionist A_StartSound("demolitionist/buttslam",CHAN_DAMAGE,CHANF_OVERLAP,1.,.4); if ( swwm_buttsfx ) A_StartSound("demolitionist/buttslamx",CHAN_DAMAGE,CHAN_OVERLAP,1.,.2); Spawn("SWWMItemFog",Vec3Offset(dir.x*radius,dir.y*radius,(tempme.Results.Tier==TIER_UPPER)?Height:(tempme.Results.Tier==TIER_LOWER)?0:(Height/2))); - A_QuakeEx(8,8,8,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); + A_QuakeEx(8.,8.,8.,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); mystats.buttslams++; lastbump *= .8; } @@ -789,7 +787,7 @@ extend Class Demolitionist A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP); bumptic = gametic+int(25+spd/4.); lastbump *= .8; - A_QuakeEx(8,8,8,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(8.,8.,8.,16,0,128,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_AlertMonsters(swwm_uncapalert?0:800); vel *= .2; vel -= dir*(10+(spd*30/mass)); diff --git a/zscript/swwm_blod.zsc b/zscript/swwm_blod.zsc index 0b2ce3829..d9b77adeb 100644 --- a/zscript/swwm_blod.zsc +++ b/zscript/swwm_blod.zsc @@ -678,10 +678,8 @@ Class mkGibber : SWWMNonInteractiveActor virtual void BurstGibs() { - Actor a; double ang, pt; Vector3 dir; - bool dummy; int bloodthrottle = 0, gibthrottle = 0; let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); if ( hnd ) @@ -694,7 +692,7 @@ Class mkGibber : SWWMNonInteractiveActor for ( int i=0; i WaterHitList; Array ShootThroughList; - Actor ignoreme; static play void DoTrail( Actor target, Vector3 pos, Vector3 dir, double dist, int bubblechance, bool smoky = false ) { let t = new("SWWMBulletTrail"); - t.ignoreme = target; t.WaterHitList.Clear(); t.ShootThroughList.Clear(); - t.Trace(pos,level.PointInSector(pos.xy),dir,dist,0); + t.Trace(pos,level.PointInSector(pos.xy),dir,dist,0,ignore:target); foreach ( l:t.ShootThroughList ) { // have to do both separately, for whatever reason @@ -1236,7 +1234,6 @@ Class SWWMBulletTrail : LineTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; return TRACE_Skip; } @@ -1288,26 +1285,6 @@ Class SWWMPuff : SWWMNonInteractiveActor } } -// 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 for player and (eventually) monsters Class SWWMShadow : SWWMNonInteractiveActor { diff --git a/zscript/swwm_gesture.zsc b/zscript/swwm_gesture.zsc index 299eb76a7..5d63ba90a 100644 --- a/zscript/swwm_gesture.zsc +++ b/zscript/swwm_gesture.zsc @@ -280,10 +280,9 @@ Class SWWMGesture : SWWMWeapon { let weap = Weapon(invoker); if ( !weap ) return; - Vector3 x2, y2, z2; Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.005); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn("ExplodiumMagProj",origin); p.special1 = 7; @@ -304,7 +303,7 @@ Class SWWMGesture : SWWMWeapon if ( !weap ) return false; Vector3 origin = SWWMUtility.GetFireOffset(self,10,0,0); FLineTraceData d; - LineTrace(angle+viewangle,DEFMELEERANGE*1.5,pitch+viewpitch,TRF_ABSPOSITION|TRF_THRUACTORS|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(angle+viewangle,DEFMELEERANGE*1.5,pitch+viewpitch,TRF_ABSPOSITION|TRF_THRUACTORS,origin.z,origin.x,origin.y,d); return (d.HitType != TRACE_HitNone); } @@ -341,9 +340,9 @@ Class SWWMGesture : SWWMWeapon { let weap = Weapon(invoker); if ( !weap ) return; - Vector3 x2, y2, z2, dir; + Vector3 dir; Vector3 origin = SWWMUtility.GetFireOffset(self,10,0,-1); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); let p = Spawn("LoveHeart",origin); p.target = self; p.angle = atan2(x2.y,x2.x); diff --git a/zscript/swwm_gesture_fx.zsc b/zscript/swwm_gesture_fx.zsc index 978d82b5f..cc88db4b3 100644 --- a/zscript/swwm_gesture_fx.zsc +++ b/zscript/swwm_gesture_fx.zsc @@ -99,6 +99,7 @@ Class LoveHeart : Actor +PAINLESS; +NODAMAGETHRUST; +NOFRICTION; + +SKYEXPLODE; } override int DoSpecialDamage( Actor target, int damage, Name damagetype ) @@ -220,7 +221,7 @@ Class LoveHeart : Actor { HitLine = BlockingLine; // which side and part we hit? - LineSide = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine); + LineSide = Level.PointOnLineSide(pos.xy,BlockingLine); double fl, cl; if ( BlockingLine.sidedef[1] ) { @@ -285,9 +286,7 @@ Class LoveHeart : Actor HitCeiling = false; HitTexture = floorpic; } - bool remove; - TextureID replacewith; - [remove, replacewith] = SWWMUtility.DefaceTexture(HitTexture); + let [remove, replacewith] = SWWMUtility.DefaceTexture(HitTexture); if ( !remove ) return; A_StartSound("bestsound",CHAN_ITEMEXTRA,CHANF_OVERLAP); if ( target && target.player ) @@ -437,7 +436,7 @@ Class LoveHeart : Actor // use line if ( BlockingLine ) { - int s = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine); + int s = Level.PointOnLineSide(pos.xy,BlockingLine); int locknum = SWWMUtility.GetLineLock(BlockingLine); if ( !locknum || (target && target.CheckKeys(locknum,false,true)) ) BlockingLine.RemoteActivate(target,s,SPAC_Use,pos); @@ -455,7 +454,7 @@ Class LoveHeart : Actor A_AttachLight('LOVELIGHT',DynamicLight.PointLight,0,0,0); //A_RemoveLight('LOVELIGHT'); CheckSplash(40); - A_QuakeEx(2,2,2,8,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); + A_QuakeEx(1.5,1.5,1.5,8,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D); A_SprayDecal("HeartyGlow",64); A_StartSound("bestsound",CHAN_VOICE); Spawn("LoveHeartBurstLight",pos); diff --git a/zscript/swwm_monsters.zsc b/zscript/swwm_monsters.zsc index cd481c7e7..05af23cd5 100644 --- a/zscript/swwm_monsters.zsc +++ b/zscript/swwm_monsters.zsc @@ -100,7 +100,7 @@ Class SWWMBossBrainExpl : SWWMNonInteractiveActor { void A_Ignite() { - A_QuakeEx(3,3,3,20,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:2.); + A_QuakeEx(3.,3.,3.,20,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:2.); A_StartSound("explodium/hit",CHAN_VOICE,CHANF_DEFAULT,.4,.5); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); @@ -291,7 +291,7 @@ Class SWWMBossBrain : BossBrain MBRN A 10 { A_StartSound("brain/pain",CHAN_VOICE,attenuation:ATTN_NONE); - A_QuakeEx(3,3,3,15,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:.3); + A_QuakeEx(3.,3.,3.,15,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:.3); if ( !eyeless ) SpawnBrainExpl(false); Spawn("SWWMBossBrainPain",pos); } @@ -301,7 +301,7 @@ Class SWWMBossBrain : BossBrain { A_SetTranslation('DeadOats'); A_StartSound("brain/death",CHAN_VOICE,attenuation:ATTN_NONE); - A_QuakeEx(9,9,9,120,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.); + A_QuakeEx(9.,9.,9.,120,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.); if ( !eyeless ) { SpawnBrainExpl(true); diff --git a/zscript/swwm_thinkers.zsc b/zscript/swwm_thinkers.zsc index b8a8ca866..8255ad465 100644 --- a/zscript/swwm_thinkers.zsc +++ b/zscript/swwm_thinkers.zsc @@ -169,58 +169,6 @@ Class SWWMCrusherBroken : Thinker } } -// cache data for manual lockdefs parsing nonsense -Class LIEntry -{ - int locknumber; - bool hascolor; - Color mapcolor; -} - -Class SWWMCachedLockInfo : SWWMStaticThinker -{ - Array ent; - - static clearscope bool IsValidLock( int l ) - { - let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC); - SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next()); - if ( !cli ) return false; - foreach ( e:cli.ent ) - { - if ( e.locknumber == l ) - return true; - } - return false; - } - - static clearscope Color GetLockColor( int l ) - { - let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC); - SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next()); - if ( !cli ) return -1; - foreach ( e:cli.ent ) - { - if ( e.locknumber == l ) - { - if ( e.hascolor ) return e.mapcolor; - return 0; - } - } - return -1; - } - - static SWWMCachedLockInfo GetInstance() - { - let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC); - SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next()); - if ( cli ) return cli; - cli = new("SWWMCachedLockInfo"); - cli.ChangeStatNum(STAT_STATIC); - return cli; - } -} - Class SWWMCorpseCleaner : Thinker { transient ThinkerIterator ti; diff --git a/zscript/utility/swwm_utility_map.zsc b/zscript/utility/swwm_utility_map.zsc index b8b7ad3cf..6705a78e3 100644 --- a/zscript/utility/swwm_utility_map.zsc +++ b/zscript/utility/swwm_utility_map.zsc @@ -9,68 +9,6 @@ enum EExitType extend Class SWWMUtility { - // because this just wasn't in ZScript before - // copied from P_PointOnLineSidePrecise() - deprecated("4.11", "Use Level.PointOnLineSide() instead") static int PointOnLineSide( Vector2 p, Line l ) - { - if ( !l ) return 0; - return (((p.y-l.v1.p.y)*l.delta.x+(l.v1.p.x-p.x)*l.delta.y) > double.epsilon); - } - - // haha another one - // copied from BoxOnLineSide() - deprecated("4.11", "Use Level.BoxOnLineSide() instead") static int BoxOnLineSide( double top, double bottom, double left, double right, Line l ) - { - if ( !l ) return 0; - int p1, p2; - if ( l.delta.x == 0 ) - { - // ST_VERTICAL: - p1 = (right < l.v1.p.x); - p2 = (left < l.v1.p.x); - if ( l.delta.y < 0 ) - { - p1 ^= 1; - p2 ^= 1; - } - } - else if ( l.delta.y == 0 ) - { - // ST_HORIZONTAL: - p1 = (top > l.v1.p.y); - p2 = (bottom > l.v1.p.y); - if ( l.delta.x < 0 ) - { - p1 ^= 1; - p2 ^= 1; - } - } - else if ( (l.delta.x*l.delta.y) >= 0 ) - { - // ST_POSITIVE: - p1 = PointOnLineSide((left,top),l); - p2 = PointOnLineSide((right,bottom),l); - } - else - { - // ST_NEGATIVE: - p1 = PointOnLineSide((right,top),l); - p2 = PointOnLineSide((left,bottom),l); - } - return (p1==p2)?p1:-1; - } - - // wrapper - deprecated("4.11", "Use Level.ActorOnLineSide() instead") static int ActorOnLineSide( Actor a, Line l ) - { - double box[4]; - box[0] = a.pos.y+a.radius; - box[1] = a.pos.y-a.radius; - box[2] = a.pos.x-a.radius; - box[3] = a.pos.x+a.radius; - return BoxOnLineSide(box[0],box[1],box[2],box[3],l); - } - // Thanks to ZZYZX and Nash static play void SetToSlopeSpecific( Actor a, double dang, SecPlane plane, bool flipnorm ) { @@ -208,17 +146,6 @@ extend Class SWWMUtility return false; } - deprecated("4.11","Use Key.IsLockDefined() instead") static bool IsValidLockNum( int l ) - { - if ( (l < 1) || (l > 255) ) return true; - return SWWMCachedLockInfo.IsValidLock(l); - } - - deprecated("4.11","Use Key.GetMapColorForLock() instead") static Color GetLockColor( int l ) - { - return SWWMCachedLockInfo.GetLockColor(l); - } - static bool IsDoorSector( Sector s, int part ) { // super-easy mode: check for boss special sectors @@ -586,7 +513,7 @@ extend Class SWWMUtility else if ( a.BlockingLine && BlockingLineIsBlocking(a,Line.ML_BLOCKEVERYTHING|Line.ML_BLOCKPROJECTILE,a.BlockingLine) ) { HitNormal = (-a.BlockingLine.delta.y,a.BlockingLine.delta.x,0).unit(); - if ( !SWWMUtility.PointOnLineSide(a.pos.xy,a.BlockingLine) ) + if ( !Level.PointOnLineSide(a.pos.xy,a.BlockingLine) ) HitNormal *= -1; } else @@ -747,6 +674,6 @@ extend Class SWWMUtility } } // is the point behind both lines? - return (PointOnLineSide(p,a) && PointOnLineSide(p,b)); + return (Level.PointOnLineSide(p,a) && Level.PointOnLineSide(p,b)); } } diff --git a/zscript/utility/swwm_utility_math.zsc b/zscript/utility/swwm_utility_math.zsc index 1efdd3c1f..ef0dc0b78 100644 --- a/zscript/utility/swwm_utility_math.zsc +++ b/zscript/utility/swwm_utility_math.zsc @@ -21,8 +21,7 @@ extend Class SWWMUtility d.wtc = perp.multiplyMatrix(view); // screen coord data int sblocks = CVar.FindCVar('screenblocks').GetInt(); - int viewx, viewy, vieww, viewh; - [viewx, viewy, vieww, viewh] = Screen.GetViewWindow(); + let [viewx, viewy, vieww, viewh] = Screen.GetViewWindow(); int sh = Screen.GetHeight(); int h = sh; if ( sblocks < 10 ) h = (sblocks*sh/10)&~7; diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index 9ca38e53f..1b2b89ac4 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -27,6 +27,10 @@ Class SWWMWeapon : Weapon abstract int oldtagcolor; + double bvstr, bastr; + Vector3 bvdir; + int bvtics, batics; + bool IsSwapWeapon( Inventory i ) const { if ( bNoSwapWeapon || (i.GetClass() == GetClass()) ) return false; @@ -176,7 +180,7 @@ Class SWWMWeapon : Weapon abstract double dist = tracedir.length(); tracedir /= dist; let cf = new("CrossLineFinder"); - cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0); + cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0,ignoreallactors:true); // trigger all player cross lines found between user and item for ( int i=0; i 1 ) + { + invoker.bvstr = factor; + invoker.bvdir = dir; + invoker.bvtics = tics-1; + } } - action void A_BumpAngle( double factor ) + action void A_BumpAngle( double factor, int tics = 0 ) { if ( !(self is 'Demolitionist') ) return; Demolitionist(self).bumpangle += factor; + if ( tics > 1 ) + { + invoker.bastr = factor; + invoker.batics = tics-1; + } } // subtracts given ammo from price, drops excess @@ -602,6 +617,18 @@ Class SWWMWeapon : Weapon abstract override void Tick() { Super.Tick(); + if ( bvtics > 0 ) + { + if ( Demolitionist(Owner) && Owner.player && (Owner.player.ReadyWeapon == self) ) + Demolitionist(Owner).BumpView(bvstr,bvdir); + bvtics--; + } + if ( batics > 0 ) + { + if ( Demolitionist(Owner) && Owner.player && (Owner.player.ReadyWeapon == self) ) + Demolitionist(Owner).BumpAngle += bastr; + batics--; + } if ( !Owner ) { angle -= (180./64.); @@ -838,7 +865,7 @@ Class SWWMDualWeaponGiver : Inventory double dist = tracedir.length(); tracedir /= dist; let cf = new("CrossLineFinder"); - cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0); + cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0,ignoreallactors:true); // trigger all player cross lines found between user and item for ( int i=0; i= special2 ) // perfect parry { @@ -283,7 +283,6 @@ Class MHitList Class MeleeTracer : LineTracer { - Actor ignoreme; Array hits; Vector3 x; // used to get closest hit to center bool dorip; @@ -293,7 +292,6 @@ Class MeleeTracer : LineTracer if ( Results.HitType == TRACE_HitActor ) { if ( !Results.HitActor.bSHOOTABLE - || (Results.HitActor == ignoreme) || Results.HitActor.FindInventory("ParriedBuff") ) return TRACE_Skip; bool addme = true; foreach ( hit:hits ) @@ -367,12 +365,11 @@ extend Class SWWMWeapon // multi-hit cone rather than the usual one-hit arc, more fun private action bool TryMelee( double spread, int dmg, String hitsound, double rangemul, double kickmul, int flags, Class impactclass ) { - Vector3 x, y, z, dir; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 dir; + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetPlayerEye(self); if ( !invoker.mt ) invoker.mt = new("MeleeTracer"); let mt = invoker.mt; // for convenience - mt.ignoreme = self; mt.hits.Clear(); mt.dorip = !!(flags&MELEE_Rip); int rings = 1; @@ -387,7 +384,7 @@ extend Class SWWMWeapon // wide ring if ( flags&MELEE_Vertical ) dir = SWWMUtility.ConeSpread(x,y,z*widemul,j,i); else dir = SWWMUtility.ConeSpread(x,y*widemul,z,j,i); - mt.Trace(origin,level.PointInSector(origin.xy),dir,range,0); + mt.Trace(origin,level.PointInSector(origin.xy),dir,range,0,ignore:self); } rings += 5; } @@ -397,7 +394,7 @@ extend Class SWWMWeapon bool bloodless = false; int flg = DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF; if ( raging ) flg |= DMG_FOILINVUL; - int quakin = raging?8:2; + double quakin = raging?8.:2.; double diff = 0.; foreach ( hit:mt.hits ) { @@ -435,7 +432,7 @@ extend Class SWWMWeapon } } self.angle += clamp(diff/mt.hits.Size(),-5.,5.); // averaged reorient - A_QuakeEx(quakin/2,quakin/2,quakin/2,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:0.06*quakin); + A_QuakeEx(quakin/2.,quakin/2.,quakin/2.,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.06*quakin); if ( (flags&MELEE_HammerHit) && swwm_bonkhammer ) { flags |= MELEE_ForceSound; @@ -475,7 +472,7 @@ extend Class SWWMWeapon if ( !invoker.ut ) invoker.ut = new("UseLineTracer"); let ut = invoker.ut; // for convenience ut.uses.Clear(); - ut.Trace(origin,level.PointInSector(origin.xy),dir,DEFMELEERANGE*rangemul,0); + ut.Trace(origin,level.PointInSector(origin.xy),dir,DEFMELEERANGE*rangemul,0,ignore:self); invoker.wallponch = true; foreach ( u:ut.uses ) { @@ -522,8 +519,8 @@ extend Class SWWMWeapon ps.target = self; ps.special1 = dmg; } - int quakin = raging?4:1; - A_QuakeEx(quakin,quakin,quakin,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:0.12*quakin); + double quakin = raging?4.:1.; + A_QuakeEx(quakin,quakin,quakin,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.12*quakin); A_BumpFOV(.98); A_StartSound((raging&&!(flags&MELEE_ForceSound))?"demolitionist/xpunch":(hitsound!="")?hitsound:"demolitionist/punch",CHAN_WEAPON,CHANF_OVERLAP); A_AlertMonsters(swwm_uncapalert?0:100); diff --git a/zscript/weapons/swwm_blazeit.zsc b/zscript/weapons/swwm_blazeit.zsc index 0b7c71ea3..dff52ae30 100644 --- a/zscript/weapons/swwm_blazeit.zsc +++ b/zscript/weapons/swwm_blazeit.zsc @@ -60,22 +60,21 @@ Class Hellblazer : SWWMWeapon { A_StartSound(bAlt?"hellblazer/altfire":"hellblazer/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:(bAlt?1.7:.8)); A_AlertMonsters(swwm_uncapalert?0:bAlt?400:1200); - int qstr = bAlt?4:5; - A_QuakeEx(qstr,qstr,qstr,bAlt?4:12,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.12*qstr); + double qstr = bAlt?4.:5.; + A_QuakeEx(qstr,qstr,qstr,bAlt?4:12,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.12*qstr); A_BumpFOV(bAlt?.96:.93); + A_BumpView(bAlt?-2:-3); A_PlayerFire(); invoker.clipcount = max(0,invoker.clipcount-1); invoker.magstate[invoker.magpos-invoker.preload] = true; invoker.spinskipped++; - Vector3 x, y, z, x2, y2, z2, dir, origin; - double a, s; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); SWWMUtility.DoKnockback(self,-x,bAlt?22000.:32000.); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); - origin = SWWMUtility.GetFireOffset(self,10,3.5,-5); - a = FRandom[Hellblazer](0,360); - s = FRandom[Hellblazer](0,bAlt?.02:.005); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + Vector3 origin = SWWMUtility.GetFireOffset(self,10,3.5,-5); + double a = FRandom[Hellblazer](0,360); + double s = FRandom[Hellblazer](0,bAlt?.02:.005); + Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn(bAlt?"HellblazerMissile2":"HellblazerMissile",origin); p.target = self; int tidx = max(0,invoker.seekcnt-(invoker.preload+1)); @@ -219,8 +218,8 @@ Class Hellblazer : SWWMWeapon if ( invoker.seekcnt > invoker.preload ) return; Vector3 origin = SWWMUtility.GetPlayerEye(self); // try to catch target in cone of vision - Vector3 x, y, z, dir; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 dir; + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Array hits; hits.Clear(); int rings = 1; @@ -331,6 +330,7 @@ Class Hellblazer : SWWMWeapon Default { Tag "$T_HELLBLAZER"; + Inventory.Icon "graphics/HUD/Icons/W_Hellblazer.png"; Inventory.PickupMessage "$I_HELLBLAZER"; Obituary "$O_HELLBLAZER"; SWWMWeapon.Tooltip "$TT_HELLBLAZER"; @@ -368,7 +368,7 @@ Class Hellblazer : SWWMWeapon A_StartSound("hellblazer/deselect",CHAN_WEAPON,CHANF_OVERLAP); A_GlassOverlay("Deselect_G"); } - XZW2 BCDEFGHI 2; + XZW2 BCDEFGH 2; XZW2 I -1 A_FullLower(); Stop; Deselect_G: @@ -604,10 +604,17 @@ Class Hellblazer : SWWMWeapon XZW8 JKL 2; XZW8 M 2 A_StartSound("hellblazer/open",CHAN_WEAPON,CHANF_OVERLAP); XZW8 NOPQ 2; - XZW8 RSTUVWXY 2; - XZW8 Z 2 A_StartSound("hellblazer/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 R 2 A_QuakeEx(.8,.8,.8,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + XZW8 STUVWXY 2; + XZW8 Z 2 + { + A_BumpView(-1.); + A_StartSound("hellblazer/magout",CHAN_WEAPON,CHANF_OVERLAP); + } XZW9 ABCDEFGHIJ 2; - XZWB VWXYZ 3; + XZWB VW 3 A_BumpView(.3,tics:3); + XZWB X 3; + XZWB YZ 3 A_BumpView(-.3,tics:3); Goto Load_G; Load: XZW4 JKLMNOPQRSTUVWXYZ 2; @@ -616,11 +623,16 @@ Class Hellblazer : SWWMWeapon Load_G: XZW9 J 2 A_PlayerReload(); XZW9 KLMNOP 2; - XZW9 Q 2 A_StartSound("hellblazer/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZW9 Q 2 + { + A_BumpView(1.); + A_StartSound("hellblazer/magin",CHAN_WEAPON,CHANF_OVERLAP); + } XZW9 RSTUVWX 2; XZW9 Y 2 A_StartSound("hellblazer/close",CHAN_WEAPON,CHANF_OVERLAP); XZW9 Z 2; - XZWA ABC 2; + XZWA A 2 A_QuakeEx(1.2,1.2,1.2,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + XZWA BC 2; XZWA D 2 A_StartSound("hellblazer/meleestop",CHAN_WEAPON,CHANF_OVERLAP); XZWA EFGHIJ 2; Goto Ready_G; @@ -655,9 +667,14 @@ Class Hellblazer : SWWMWeapon A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZWB BCD 2; - XZWB E 2 A_Parry(9); - XZWB FG 1; + XZWB BCD 2 A_BumpView(.5,tics:2); + XZWB E 2 + { + A_BumpFOV(.96); + A_QuakeEx(1.2,1.2,1.2,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_Parry(9); + } + XZWB FG 1 A_BumpView(-3); XZWB H 1 A_Melee(75,"demolitionist/whitl",1.05,1.2,1.2); XZWB IJKLM 2; XZWB N 2 A_StartSound("hellblazer/meleeend",CHAN_WEAPON,CHANF_OVERLAP); diff --git a/zscript/weapons/swwm_blazeit_fx.zsc b/zscript/weapons/swwm_blazeit_fx.zsc index 2bd5eea66..cf47b3ad2 100644 --- a/zscript/weapons/swwm_blazeit_fx.zsc +++ b/zscript/weapons/swwm_blazeit_fx.zsc @@ -198,6 +198,7 @@ Class HellblazerMissile : Actor +FORCERADIUSDMG; +NODAMAGETHRUST; +HITTRACER; + +SKYEXPLODE; } override void PostBeginPlay() @@ -289,7 +290,7 @@ Class HellblazerMissile : Actor A_SetScale(4.5); SWWMUtility.DoExplosion(self,200,320000,150,100); A_NoGravity(); - A_QuakeEx(5,5,5,15,0,1500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollIntensity:.8); + A_QuakeEx(5.,5.,5.,15,0,1500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollIntensity:.8); A_StopSound(CHAN_BODY); A_StartSound("hellblazer/hit",CHAN_WEAPON,attenuation:.8); A_StartSound("hellblazer/hit",CHAN_VOICE,attenuation:.5); @@ -396,7 +397,6 @@ Class HellblazerMissile2 : HellblazerMissile +BOUNCEONCEILINGS; +ALLOWBOUNCEONACTORS; +DONTBOUNCEONSHOOTABLES; - +DONTBOUNCEONSKY; +CANBOUNCEWATER; +INTERPOLATEANGLES; +ROLLSPRITE; diff --git a/zscript/weapons/swwm_cbt.zsc b/zscript/weapons/swwm_cbt.zsc index 310c44c0b..713075f03 100644 --- a/zscript/weapons/swwm_cbt.zsc +++ b/zscript/weapons/swwm_cbt.zsc @@ -113,7 +113,7 @@ Class Wallbuster : SWWMWeapon hit.HitActor.A_StartSound("spreadgun/pelletf",CHAN_DAMAGE,CHANF_OVERLAP,.4,4.); } } - if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) && (t.Results.HitType != TRACE_HitActor) ) + if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HitActor) ) { Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(t.Results); let p = Spawn(impact,t.Results.HitPos+hitnormal*4); @@ -178,10 +178,10 @@ Class Wallbuster : SWWMWeapon player.SetPsprite(PSP_WEAPON,ResolveState("DryFire")); return; } - Vector3 x, y, z, origin, x2, y2, z2, dir; + Vector3 origin, dir; double a, s; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); int flashstr = 0; int alertness = 0; // second pass, play the fire effects @@ -220,10 +220,11 @@ Class Wallbuster : SWWMWeapon player.SetPsprite(PSP_WEAPON,ResolveState("FireTwentyFive")); SWWMHandler.DoFlash(self,Color(80,255,192,64),7); } - int qk = min(9,1+howmany/5); + double qk = min(9.,1.+howmany/4.); int ql = min(25,6+howmany/2); A_QuakeEx(qk,qk,qk,ql,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:qk*.15); A_BumpFOV(1.-qk*.04); + A_BumpView(-qk*.6); A_AlertMonsters(swwm_uncapalert?0:alertness); A_PlayerFire(); if ( flashstr > 0 ) @@ -258,7 +259,6 @@ Class Wallbuster : SWWMWeapon origin = level.Vec3Offset(base,n.x*y+n.y*z); // the shooting if ( !st ) st = new("SpreadgunTracer"); - st.ignoreme = self; // attempt to uniformize expected damage while reducing traces (mainly for performance) int expecteddmg = 200; int numshot = max(21-howmany,5); @@ -271,7 +271,7 @@ Class Wallbuster : SWWMWeapon st.hitlist.Clear(); st.shootthroughlist.Clear(); st.waterhitlist.Clear(); - st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); + st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,0,ignore:self); ProcessTraceHit(st,origin,dir,individualdmg,7000,bc:5+howmany/6,(howmany>1)); } for ( int i=0; i<(16-howmany/2); i++ ) @@ -360,8 +360,7 @@ Class Wallbuster : SWWMWeapon { if ( invoker.fired[invoker.rotation[5]*5+i] ) { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,-3,-13); let c = Spawn("RedShellCasing",origin); c.angle = angle; @@ -463,6 +462,7 @@ Class Wallbuster : SWWMWeapon Default { Tag "$T_WALLBUSTER"; + Inventory.Icon "graphics/HUD/Icons/W_Wallbuster.png"; Inventory.PickupMessage "$I_WALLBUSTER"; Obituary "$O_WALLBUSTER"; SWWMWeapon.Tooltip "$TT_WALLBUSTER"; @@ -484,7 +484,9 @@ Class Wallbuster : SWWMWeapon Stop; Select: XZW2 G 1 A_FullRaise(); - XZW2 HIJKLMNOP 2; + XZW2 HI 2 A_BumpView(.2,tics:2); + XZW2 JKL 2 A_BumpView(-.3,tics:2); + XZW2 MNOP 2; Goto Ready; Ready: XZW2 A 1 @@ -563,7 +565,11 @@ Class Wallbuster : SWWMWeapon XZW2 A 2 A_StartSound("wallbuster/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW4 DEFG 2; XZW4 HIJK 1; - XZW4 L 1 A_StartSound("wallbuster/unlock",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 L 1 + { + A_QuakeEx(.8,.8,.8,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_StartSound("wallbuster/unlock",CHAN_WEAPON,CHANF_OVERLAP); + } XZW4 MNOPQ 1; XZW4 RSTUV 1; Goto Detach; @@ -705,7 +711,11 @@ Class Wallbuster : SWWMWeapon A_ChangeModel("",1,"","",4+i,"models","",CMDL_USESURFACESKIN,-1); } XZW8 OPQRS 1; - XZW8 T 1 A_StartSound("wallbuster/lock",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 T 1 + { + A_QuakeEx(1.,1.,1.,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_StartSound("wallbuster/lock",CHAN_WEAPON,CHANF_OVERLAP); + } XZW8 UVWXY 1; XZW8 Z 1 A_StartSound("wallbuster/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW9 ABC 1; @@ -718,9 +728,14 @@ Class Wallbuster : SWWMWeapon A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZW9 GHI 2; - XZW9 J 2 A_Parry(9); - XZW9 KLM 1; + XZW9 GHI 2 A_BumpView(1,tics:2); + XZW9 J 2 + { + A_BumpFOV(.96); + A_QuakeEx(1.2,1.2,1.2,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_Parry(9); + } + XZW9 KLM 1 A_BumpView(-4); XZW9 N 1 A_Melee(70,"demolitionist/whitl",1.2,1.4,1.3); XZW9 OPQRS 2; XZW9 T 2 A_StartSound("wallbuster/meleeend",CHAN_WEAPON,CHANF_OVERLAP); @@ -730,7 +745,9 @@ Class Wallbuster : SWWMWeapon Goto Ready; Deselect: XZW2 A 2 A_StartSound("wallbuster/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZW2 BCDEFG 2; + XZW2 B 2; + XZW2 CD 2 A_BumpView(.1,tics:2); + XZW2 EF 2 A_BumpView(.2,tics:2); XZW2 G -1 A_FullLower(); Stop; FlashRed: diff --git a/zscript/weapons/swwm_cbt_fx.zsc b/zscript/weapons/swwm_cbt_fx.zsc index 15b512e8a..342abd42b 100644 --- a/zscript/weapons/swwm_cbt_fx.zsc +++ b/zscript/weapons/swwm_cbt_fx.zsc @@ -4,17 +4,17 @@ Class BustedQuake : SWWMNonInteractiveActor { override void PostBeginPlay() { - if ( (special1 < 3) || (special1 > 6) ) + if ( (specialf1 < 3) || (specialf1 > 6) ) { - A_StartSound("wallbuster/smallbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,special1*.32),1./max(1.,special1*.35),1.-special1*.05); - A_StartSound("wallbuster/smallbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,special1*.32),1./max(1.,special1*.35),1.-special1*.05); + A_StartSound("wallbuster/smallbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,specialf1*.32),1./max(1.,specialf1*.35),1.-specialf1*.05); + A_StartSound("wallbuster/smallbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,specialf1*.32),1./max(1.,specialf1*.35),1.-specialf1*.05); } - if ( special1 >= 3 ) + if ( specialf1 >= 3 ) { - A_StartSound("wallbuster/bigbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,special1*.35),1./max(1.,special1*.35),1.-special1*.01); - A_StartSound("wallbuster/bigbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,special1*.35),1./max(1.,special1*.35),1.-special1*.01); + A_StartSound("wallbuster/bigbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,specialf1*.35),1./max(1.,specialf1*.35),1.-specialf1*.01); + A_StartSound("wallbuster/bigbust",CHAN_VOICE,CHANF_OVERLAP,min(1.,specialf1*.35),1./max(1.,specialf1*.35),1.-specialf1*.01); } - A_QuakeEx(special1,special1,special1,20+special1*5,0,300+special1*90,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:special1*.1); + A_QuakeEx(specialf1,specialf1,specialf1,20+int(specialf1*5),0,300+int(specialf1*90),"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:specialf1*.1); A_AlertMonsters(swwm_uncapalert?0:2500,AMF_EMITFROMTARGET); } States @@ -223,7 +223,7 @@ Class BusterWall : Thinker else if ( a.BlockingLine && SWWMUtility.BlockingLineIsBlocking(a,Line.ML_BLOCKEVERYTHING|Line.ML_BLOCKPROJECTILE,a.BlockingLine) ) { HitNormal = (-a.BlockingLine.delta.y,a.BlockingLine.delta.x,0).unit(); - int wside = SWWMUtility.PointOnLineSide(a.pos.xy,a.BlockingLine); + int wside = Level.PointOnLineSide(a.pos.xy,a.BlockingLine); if ( !wside ) HitNormal *= -1; faketracer.Results.HitType = TRACE_HitWall; faketracer.Results.HitLine = a.BlockingLine; @@ -345,7 +345,7 @@ Class BusterWall : Thinker bust.bustmax = min(30,int(12+girthitude**.1)); // quakin' let q = Actor.Spawn("BustedQuake",(p.LastPos.x,p.LastPos.y,(b.z+a.z)/2)); - q.special1 = clamp(int(girthitude**.15),1,9); + q.specialf1 = clamp(girthitude**.15,0.,9.); // "precache" the grid for busting effects bust.boundsmin = a; bust.boundsmax = b; @@ -546,7 +546,7 @@ Class BusterWall : Thinker SWWMCrusherBroken.Remove(hp?null:hs,hp?hs:null); // quakin' let q = Actor.Spawn("BustedQuake",(hs.centerspot.x,hs.centerspot.y,thisheight)); - q.special1 = clamp(int(girthitude**.15),1,9); + q.specialf1 = clamp(int(girthitude**.15),1,9); if ( hp ) { // remove any current movers diff --git a/zscript/weapons/swwm_danmaku.zsc b/zscript/weapons/swwm_danmaku.zsc index e03f5b975..c4193a1bf 100644 --- a/zscript/weapons/swwm_danmaku.zsc +++ b/zscript/weapons/swwm_danmaku.zsc @@ -71,18 +71,18 @@ Class Eviscerator : SWWMWeapon if ( !weap ) return; invoker.isfiring = true; A_StartSound("eviscerator/fire",CHAN_WEAPON,CHANF_OVERLAP); - A_QuakeEx(6,6,6,3,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); + A_QuakeEx(6.,6.,6.,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); A_BumpFOV(.94); A_SWWMFlash(); A_PlayerFire(); SWWMHandler.DoFlash(self,Color(64,255,224,96),3); A_AlertMonsters(swwm_uncapalert?0:4500); - Vector3 x, y, z, x2, y2, z2, dir, origin; + Vector3 dir; double a, s; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); SWWMUtility.DoKnockback(self,-x,25000.); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); - origin = SWWMUtility.GetFireOffset(self,10,4,-5); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + Vector3 origin = SWWMUtility.GetFireOffset(self,10,4,-5); int trail = CVar.GetCVar('swwm_funtrails',player).GetInt(); if ( trail == 8 ) trail = Random[Eviscerator](1,7); for ( int i=0; i<30; i++ ) @@ -146,20 +146,19 @@ Class Eviscerator : SWWMWeapon invoker.isfiring = true; A_StartSound("eviscerator/altfire",CHAN_WEAPON,CHANF_OVERLAP); A_StartSound("eviscerator/fire",CHAN_WEAPON,CHANF_OVERLAP); - A_QuakeEx(4,4,4,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.9); + A_QuakeEx(4.,4.,4.,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.9); A_BumpFOV(.91); A_SWWMFlash(); A_PlayerFire(); SWWMHandler.DoFlash(self,Color(16,255,224,96),3); A_AlertMonsters(swwm_uncapalert?0:4000); - Vector3 x, y, z, x2, y2, z2, dir, origin; - double a, s; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 dir; + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); SWWMUtility.DoKnockback(self,-x,32000.); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); - origin = SWWMUtility.GetFireOffset(self,10,3,-5); - a = FRandom[Eviscerator](0,360); - s = FRandom[Eviscerator](0,invoker.extended?.003:.02); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + Vector3 origin = SWWMUtility.GetFireOffset(self,10,3,-5); + double a = FRandom[Eviscerator](0,360); + double s = FRandom[Eviscerator](0,invoker.extended?.003:.02); dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn("EvisceratorProj",origin); p.target = self; @@ -186,9 +185,8 @@ Class Eviscerator : SWWMWeapon action void A_EvisceratorEject() { - Vector3 x, y, z, origin; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); - origin = SWWMUtility.GetFireOffset(self,10,-10,-10); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 origin = SWWMUtility.GetFireOffset(self,10,-10,-10); let c = Spawn("EvisceratorCasing",origin); c.angle = angle; c.pitch = pitch; @@ -199,9 +197,8 @@ Class Eviscerator : SWWMWeapon action void A_EvisceratorCasingSmoke( Vector3 ofs ) { - Vector3 x, y, z, origin; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); - origin = SWWMUtility.GetFireOffset(self,ofs.x,ofs.y,ofs.z); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 origin = SWWMUtility.GetFireOffset(self,ofs.x,ofs.y,ofs.z); let s = Spawn("SWWMHalfSmoke",origin); s.scale *= .2; s.alpha *= .4; @@ -254,6 +251,7 @@ Class Eviscerator : SWWMWeapon Default { Tag "$T_EVISCERATOR"; + Inventory.Icon "graphics/HUD/Icons/W_Eviscerator.png"; Inventory.PickupMessage "$I_EVISCERATOR"; Obituary "$O_EVISCERATOR"; SWWMWeapon.Tooltip "$TT_EVISCERATOR"; @@ -278,12 +276,12 @@ Class Eviscerator : SWWMWeapon A_StartSound("eviscerator/deselect",CHAN_WEAPON,CHANF_OVERLAP); return A_JumpIf(invoker.extended,"DeselectExt"); } - XZW2 BCDEFGH 2; + XZW2 BCDEFG 2; XZW2 H -1 A_FullLower(); Stop; DeselectExt: XZW4 Z 2; - XZW5 ABCDEFG 2; + XZW5 ABCDEF 2; XZW5 G -1 A_FullLower(); Stop; Select: @@ -349,7 +347,11 @@ Class Eviscerator : SWWMWeapon Eject: XZW2 A 4; XZW3 STUV 2; - XZW3 W 1 A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 W 1 + { + A_QuakeEx(.3,.3,.3,4,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP); + } XZW3 X 1 { int layer = PSP_WEAPON+1; @@ -361,6 +363,7 @@ Class Eviscerator : SWWMWeapon XZW4 AB 1; XZW4 C 1 { + A_QuakeEx(.5,.5,.5,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.15); A_StartSound("eviscerator/ejectend",CHAN_WEAPON,CHANF_OVERLAP); A_StartLoad(); } @@ -370,7 +373,11 @@ Class Eviscerator : SWWMWeapon EjectExt: XZW4 Z 4; XZW6 RSTU 2; - XZW6 V 1 A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 V 1 + { + A_QuakeEx(.3,.3,.3,4,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP); + } XZW6 W 1 { int layer = PSP_WEAPON+1; @@ -382,6 +389,7 @@ Class Eviscerator : SWWMWeapon XZW7 A 1; XZW7 B 1 { + A_QuakeEx(.5,.5,.5,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.15); A_StartSound("eviscerator/ejectend",CHAN_WEAPON,CHANF_OVERLAP); A_StartLoad(); } @@ -434,7 +442,11 @@ Class Eviscerator : SWWMWeapon return A_JumpIf(invoker.extended,"ZoomExt"); } XZW4 JKLMN 2; - XZW4 O 1 A_StartSound("eviscerator/switch"); + XZW4 O 1 + { + A_QuakeEx(.25,.25,.25,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("eviscerator/switch"); + } XZW4 PQR 1; XZW4 S 2 { @@ -447,7 +459,11 @@ Class Eviscerator : SWWMWeapon ZoomExt: XZW4 Z 2; XZW7 IJK 3; - XZW7 L 1 A_StartSound("eviscerator/switch"); + XZW7 L 1 + { + A_QuakeEx(.25,.25,.25,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); + A_StartSound("eviscerator/switch"); + } XZW7 MNO 1; XZW7 P 2 { @@ -490,23 +506,42 @@ Class Eviscerator : SWWMWeapon A_PlayerMelee(); return A_JumpIf(invoker.extended,"User1Ext"); } - XZW8 WXY 2; - XZW8 Z 1; + XZW8 WXY 2 A_BumpAngle(2,2); + XZW8 Z 1 A_BumpAngle(2); XZW9 AB 1; - XZW9 C 1 A_Parry(9); - XZW9 D 1; - XZW9 E 2 A_Melee(60,"demolitionist/whitm",1.1,1.2,1.2); + XZW9 C 1 + { + A_BumpFOV(.98); + A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_Parry(9); + } + XZW9 D 1 A_BumpAngle(-8); + XZW9 E 2 + { + A_BumpAngle(-4); + A_Melee(60,"demolitionist/whitm",1.1,1.2,1.2); + } XZW9 FGH 2; XZW9 I 2 A_StartSound("eviscerator/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW9 JKL 2; Goto Ready; User1Ext: XZW4 Z 2; - XZWA NOP 2; - XZWA QRS 1; - XZWA T 1 A_Parry(9); - XZWA U 1; - XZWA V 2 A_Melee(60,"demolitionist/whitm",1.1,1.2); + XZWA NOP 2 A_BumpAngle(2,2); + XZWA Q 1 A_BumpAngle(2); + XZWA RS 1; + XZWA T 1 + { + A_BumpFOV(.98); + A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_Parry(9); + } + XZWA U 1 A_BumpAngle(-8); + XZWA V 2 + { + A_BumpAngle(-4); + A_Melee(60,"demolitionist/whitm",1.1,1.2); + } XZWA WXY 2; XZWA Z 2 A_StartSound("eviscerator/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZWB ABC 2; diff --git a/zscript/weapons/swwm_danmaku_fx.zsc b/zscript/weapons/swwm_danmaku_fx.zsc index f4ae708ee..82eff0a69 100644 --- a/zscript/weapons/swwm_danmaku_fx.zsc +++ b/zscript/weapons/swwm_danmaku_fx.zsc @@ -147,7 +147,6 @@ Class EvisceratorChunk : Actor +BOUNCEONCEILINGS; +ALLOWBOUNCEONACTORS; +NODAMAGETHRUST; - +DONTBOUNCEONSKY; +CANBOUNCEWATER; +INTERPOLATEANGLES; +ROLLSPRITE; @@ -402,6 +401,7 @@ Class EvisceratorProj : Actor +HITTRACER; +FORCERADIUSDMG; +NODAMAGETHRUST; + +SKYEXPLODE; } override void PostBeginPlay() { @@ -423,15 +423,14 @@ Class EvisceratorProj : Actor A_NoGravity(); A_SetScale(3.); SWWMUtility.DoExplosion(self,120,120000,150,80); - A_QuakeEx(6,6,6,20,0,1200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.7); + A_QuakeEx(6.,6.,6.,20,0,1200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.7); A_StartSound("eviscerator/shell",CHAN_WEAPON,attenuation:.5); A_StartSound("eviscerator/shell",CHAN_VOICE,attenuation:.3); A_AlertMonsters(swwm_uncapalert?0:3000,AMF_EMITFROMTARGET); if ( !Tracer ) Spawn("EvisceratorProjSmoke",pos); Spawn("EvisceratorProjLight",pos); - Vector3 x, y, z; double a, s; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); EvisceratorChunk p; Vector3 spawnofs; if ( BlockingMobj ) spawnofs = (0,0,0); @@ -440,7 +439,7 @@ Class EvisceratorProj : Actor else if ( BlockingLine ) { spawnofs = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit()*4; - if ( !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) ) + if ( !Level.PointOnLineSide(pos.xy,BlockingLine) ) spawnofs *= -1; } int trail = 0; diff --git a/zscript/weapons/swwm_deathlydeathcannon.zsc b/zscript/weapons/swwm_deathlydeathcannon.zsc index d55036a60..bc78bf70b 100644 --- a/zscript/weapons/swwm_deathlydeathcannon.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon.zsc @@ -75,7 +75,8 @@ Class Ynykron : SWWMWeapon for ( Actor a=s.thinglist; a; a=a.snext ) a.LastHeard = self; } - A_QuakeEx(9,9,9,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.5); + A_QuakeEx(9.,9.,9.,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.5); + A_BumpView(-5); A_BumpFOV(.7); A_PlayerFire(); SWWMHandler.DoFlash(self,Color(120,255,255,255),30); @@ -98,9 +99,8 @@ Class Ynykron : SWWMWeapon action void A_Backblast() { - Vector3 x, y, z, origin; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); - origin = SWWMUtility.GetFireOffset(self,-15,4,-1); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let origin = SWWMUtility.GetFireOffset(self,-15,4,-1); int numpt = Random[Ynykron](10,20); for ( int i=0; i 10.) && !(level.maptime&3) ) + { + double str = (chargelevel-10.)/50.; + Owner.A_QuakeEx(str,str,str,4,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:str/5.); + } let pspm = Owner.player.FindPSprite(PSP_WEAPON); if ( pspm ) { @@ -197,6 +202,7 @@ Class Ynykron : SWWMWeapon Default { Tag "$T_YNYKRON"; + Inventory.Icon "graphics/HUD/Icons/W_Ynykron.png"; Inventory.PickupMessage "$T_YNYKRON"; Inventory.PickupSound "misc/w_pkup_vip"; Obituary "$O_YNYKRON"; @@ -228,7 +234,9 @@ Class Ynykron : SWWMWeapon A_StartSound("ynykron/ready",CHAN_WEAPONEXTRA2,CHANF_LOOP,(.025*invoker.chargelevel)**3.,2.); A_FullRaise(); } - XZW2 MNOPQRSTUVWXYZ 2; + XZW2 MNOP 2 A_BumpView(-.2,tics:2); + XZW2 QRSTUV 2 A_BumpView(-.6,tics:2); + XZW2 WXYZ 2 A_BumpView(.5,tics:2); XZW3 A 2; Goto Ready; Ready: @@ -263,16 +271,24 @@ Class Ynykron : SWWMWeapon A_OverlayFlags(PSP_WEAPON+1,PSPF_RENDERSTYLE|PSPF_ALPHA|PSPF_FORCESTYLE|PSPF_FORCEALPHA,true); A_OverlayRenderStyle(PSP_WEAPON+1,STYLE_Add); A_OverlayAlpha(PSP_WEAPON+1,0.); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); A_StartSound("ynykron/ventopen",CHAN_WEAPON,CHANF_OVERLAP); + A_BumpFOV(.995); + A_QuakeEx(1.2,1.2,1.2,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); } XZWA ABCDEF 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); XZWA G 2 { - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); A_StartSound("ynykron/ventclose",CHAN_WEAPON,CHANF_OVERLAP); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + } + XZWA H 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + XZWA I 2 + { + A_BumpFOV(.99); + A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); } - XZWA HI 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); Goto Ready; ReadyVentSmoke: XZWB D 1 @@ -332,10 +348,19 @@ Class Ynykron : SWWMWeapon A_StartSound("ynykron/magout",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerReload(); } - XZW3 WXYZ 2; + XZW3 WXYZ 2 A_BumpView(.5,tics:2); XZW4 A 2; - XZW4 B 2 A_StopSound(CHAN_WEAPONEXTRA); - XZW4 CDEFGHIJKLMNO 2; + XZW4 B 2 + { + A_BumpView(-2.); + A_BumpFOV(.99); + A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_StopSound(CHAN_WEAPONEXTRA); + } + XZW4 CDEF 2; + XZW4 GHIJ 2 A_BumpView(.5,tics:2); + XZW4 K 2 A_BumpView(2.); + XZW4 LMNO 2; XZW4 P 0 { invoker.inverted = true; @@ -350,9 +375,19 @@ Class Ynykron : SWWMWeapon A_StartSound("ynykron/magout",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerReload(); } - XZW5 UVWXY 2; - XZW5 Z 2 A_StopSound(CHAN_WEAPONEXTRA); - XZW6 ABCDEFGHIJKLM 2; + XZW5 UVWX 2 A_BumpView(.5,tics:2); + XZW5 Y 2; + XZW5 Z 2 + { + A_BumpView(-2.); + A_BumpFOV(.99); + A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_StopSound(CHAN_WEAPONEXTRA); + } + XZW6 ABCD 2; + XZW6 EFGH 2 A_BumpView(.5,tics:2); + XZW6 I 2 A_BumpView(2.); + XZW6 JKLM 2; XZW6 N 0 { invoker.inverted = false; @@ -362,19 +397,36 @@ Class Ynykron : SWWMWeapon PutNormal: XZW4 PQRS 2; XZW4 T 2 A_StartSound("ynykron/magin",CHAN_WEAPON,CHANF_OVERLAP); - XZW4 UVWXYZ 2; + XZW4 UVWX 2 A_BumpView(.5,tics:2); + XZW4 YZ 2 A_BumpView(.5,tics:2); XZW5 A 2 A_StartSound("ynykron/meleeend",CHAN_WEAPON,CHANF_OVERLAP); - XZW5 B 2 A_StartSound("ynykron/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.3,4.); - XZW5 CDEFGHIJK 2; + XZW5 B 2 + { + A_BumpView(4.); + A_BumpFOV(.98); + A_QuakeEx(2.,2.,2.,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_StartSound("ynykron/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.3,4.); + } + XZW5 C 2; + XZW5 DEFG 2 A_BumpView(-1,tics:2); + XZW5 HIJK 2; XZW5 L 4; Goto Ready; PutInverted: XZW6 NOPQ 2; XZW6 R 2 A_StartSound("ynykron/magin",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 STUVWX 2; + XZW6 STUVWX 2 A_BumpView(.5,tics:2); XZW6 Y 2 A_StartSound("ynykron/meleeend",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 Z 2 A_StartSound("ynykron/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.3,4.); - XZW7 ABCDEFGHI 2; + XZW6 Z 2 + { + A_BumpView(4.); + A_BumpFOV(.98); + A_QuakeEx(2.,2.,2.,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_StartSound("ynykron/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.3,4.); + } + XZW7 A 2; + XZW7 BCDE 2 A_BumpView(-1,tics:2); + XZW7 FGHI 2; XZW7 J 4; XZW5 P 0; Goto Ready; @@ -392,7 +444,14 @@ Class Ynykron : SWWMWeapon A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); A_StartSound("ynykron/ventopen",CHAN_WEAPON,CHANF_OVERLAP); } - XZW7 RSTUV 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + XZW7 R 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + XZW7 S 2 + { + A_BumpFOV(.995); + A_QuakeEx(1.2,1.2,1.2,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + } + XZW7 TUV 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); Discharging: XZW7 W 2 { @@ -406,7 +465,13 @@ Class Ynykron : SWWMWeapon A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); A_StartSound("ynykron/ventclose",CHAN_WEAPON,CHANF_OVERLAP); } - XZW7 YZ 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + XZW7 Y 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + XZW7 Z 2 + { + A_BumpFOV(.99); + A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + } Goto Ready; DischargeSmoke: XZWA T 2 @@ -433,7 +498,9 @@ Class Ynykron : SWWMWeapon XZW2 A 2; XZW3 BC 2; XZW3 D 2 A_StartSound("ynykron/latch",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 EFGHI 2; + XZW3 EF 2; + XZW3 G 2 A_QuakeEx(1.,1.,1.,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + XZW3 HI 2; XZW2 A 0 { invoker.chargestate = CS_CHARGING; @@ -452,7 +519,13 @@ Class Ynykron : SWWMWeapon UnloadNormal: XZW2 A 2; XZW3 STU 2; - XZW3 V 2 A_StartSound("ynykron/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 V 2 + { + A_BumpView(-2.); + A_BumpFOV(.99); + A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_StartSound("ynykron/magout",CHAN_WEAPON,CHANF_OVERLAP); + } XZW3 WXYZ 2; XZW4 A 2; XZW4 B 2 A_StopSound(CHAN_WEAPONEXTRA); @@ -503,7 +576,11 @@ Class Ynykron : SWWMWeapon A_StartSound("ynykron/checkout",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerCheckGun(); } - XZW8 ABCDEFGHIJKLMNOPQRSTUVW 2; + XZW8 ABCDE 2 A_BumpView(.3,tics:2); + XZW8 FGHIJKL 2 A_BumpView(-.8,tics:2); + XZW8 MNOPQR 2 A_BumpView(-.4,tics:2); + XZW8 STU 2 A_BumpView(.5,tics:2); + XZW8 VW 2; XZW8 X 4; // smoothen more Goto Ready; User1: @@ -514,19 +591,26 @@ Class Ynykron : SWWMWeapon A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZW8 YZ 2; - XZW9 AB 2; - XZW9 C 1 A_Parry(9); - XZW9 DE 1; + XZW8 YZ 2 A_BumpAngle(-1.,2); + XZW9 AB 2 A_BumpAngle(-.5,2); + XZW9 C 1 + { + A_BumpFOV(.93); + A_QuakeEx(2.,2.,2.,10,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); + A_Parry(9); + } + XZW9 DE 1 A_BumpAngle(10.); XZW9 F 1 A_Melee(100,"demolitionist/whitl",1.5,1.6,1.7,MELEE_Wider); - XZW9 GHIJK 1; - XZW9 LMNO 2; + XZW9 GHIJK 1 A_BumpAngle(2.); + XZW9 LMNO 2 A_BumpAngle(.5,2); XZW9 P 2 A_StartSound("ynykron/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW9 QRSTUVWXYZ 2; Goto Ready; Deselect: XZW2 A 2 A_StartSound("ynykron/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZW2 BCDEFGHIJK 2; + XZW2 BCDE 2 A_BumpView(.1,tics:2); + XZW2 FGH 2 A_BumpView(.2,tics:2); + XZW2 IJK 2 A_BumpView(.3,tics:2); XZW2 L -1 { A_StopSound(CHAN_WEAPONEXTRA); diff --git a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc index 1d1204b47..a5013723b 100644 --- a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc @@ -2,7 +2,6 @@ Class YnykronAltTracer : LineTracer { - Actor ignore; Array ShootThroughList; Array WaterHitList; @@ -25,7 +24,6 @@ Class YnykronAltTracer : LineTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignore ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE || (Results.HitActor is 'YnykronSingularityHitbox') ) return TRACE_Stop; return TRACE_Skip; } @@ -259,7 +257,7 @@ Class YnykronVoidBeam : SWWMNonInteractiveActor t.ShootThroughList.Clear(); t.WaterHitList.Clear(); t.HitList.Clear(); - t.Trace(pos,cursector,x,16*scale.x,TRACE_HitSky); + t.Trace(pos,cursector,x,16*scale.x,0); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -339,7 +337,7 @@ Class YnykronLightningImpact : SWWMNonInteractiveActor { Super.PostBeginPlay(); SWWMUtility.DoExplosion(self,400,120000,100,40); - A_QuakeEx(3,3,3,12,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.4); + A_QuakeEx(3.,3.,3.,12,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.4); A_SprayDecal("ShockMark",-172); int numpt = Random[ExploS](8,16); for ( int i=0; i 60 ) { - if ( IsActorPlayingSound(CHAN_VOICE,-1) ) return; + if ( IsActorPlayingSound(CHAN_VOICE) ) return; for ( int i=0; i ShootThroughList; Array WaterHitList; Array HitList; @@ -547,7 +546,6 @@ Class YnykronTracer : LineTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignore ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE || (Results.HitActor is 'YnykronSingularityHitbox') ) { let ent = new("HitListEntry"); @@ -590,7 +588,6 @@ Class YnykronInWallTracer : YnykronTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignore ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("HitListEntry"); @@ -615,11 +612,10 @@ Class YnykronBeam : SWWMNonInteractiveActor { Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); let t = new("YnykronTracer"); - t.ignore = target; t.ShootThroughList.Clear(); t.WaterHitList.Clear(); t.HitList.Clear(); - t.Trace(pos,cursector,x,speed,TRACE_HitSky); + t.Trace(pos,cursector,x,speed,0,ignore:target); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -678,13 +674,6 @@ Class YnykronBeam : SWWMNonInteractiveActor if ( YnykronShot(master) ) YnykronShot(master).blastcount++; } - if ( t.Results.HitType == TRACE_HasHitSky ) - { - // goodbye - nospread = true; - speed = t.Results.Distance; // shortens in minimap - return; - } if ( t.Results.HitType != TRACE_HitNone ) { // hit something @@ -718,11 +707,10 @@ Class YnykronBeam : SWWMNonInteractiveActor } // extra hit traces let it = new("YnykronInWallTracer"); - it.ignore = target; it.ShootThroughList.Clear(); it.WaterHitList.Clear(); it.HitList.Clear(); - it.Trace(t.Results.HitPos,level.PointInSector(t.Results.HitPos.xy),x,i,TRACE_HitSky); + it.Trace(t.Results.HitPos,level.PointInSector(t.Results.HitPos.xy),x,i,0,ignore:target); foreach ( l:it.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -932,7 +920,7 @@ Class DelayedWallBeam : SWWMNonInteractiveActor YnykronShot(master).blastcount++; // trace back to get the proper "exit surface" so we can trigger lines if needed let at = new("AuxiliarySilverBulletTracer"); - at.Trace(pos,CurSector,-x,2.,TRACE_NoSky); + at.Trace(pos,CurSector,-x,2.,0,ignoreallactors:true); if ( at.Results.HitType == TRACE_HitWall ) { if ( at.Results.HitLine.sidedef[1] ) @@ -1020,16 +1008,16 @@ Class YnykronShot : SWWMNonInteractiveActor } override void PostBeginPlay() { - A_QuakeEx(6,6,6,150,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.); + A_QuakeEx(6.,6.,6.,150,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.); A_StartSound("ynykron/beam",CHAN_VOICE,CHANF_DEFAULT,1.,0.); FlashPlayer(240,8000); hitlist.Clear(); beamcount = 0; blastcount = 0; int rings = 1; - Vector3 x, y, z, dir; + Vector3 dir; double a, s; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); for ( double i=0; i<.04; i+=.006 ) { for ( int j=0; j<360; j+=(360/rings) ) @@ -1084,7 +1072,7 @@ Class YnykronShot : SWWMNonInteractiveActor SWWMUtility.AchievementProgress("ezkill",enemykills,target.player); enemykills = 0; } - if ( IsActorPlayingSound(CHAN_VOICE,-1) ) + if ( IsActorPlayingSound(CHAN_VOICE) ) return; // we're done here Destroy(); diff --git a/zscript/weapons/swwm_deepdarkimpact.zsc b/zscript/weapons/swwm_deepdarkimpact.zsc index a48b82ed2..fdf2f529b 100644 --- a/zscript/weapons/swwm_deepdarkimpact.zsc +++ b/zscript/weapons/swwm_deepdarkimpact.zsc @@ -3,7 +3,6 @@ Class DeepTracer : LineTracer { - Actor ignoreme; Array hitlist; Array hitdist; Array hitposx, hitposy, hitposz; @@ -12,7 +11,6 @@ Class DeepTracer : LineTracer { if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { hitlist.Push(Results.HitActor); @@ -72,7 +70,7 @@ Class DeepImpact : SWWMWeapon { invoker.charge = 0; A_StartSound("deepimpact/charge",CHAN_WEAPONEXTRA); - A_QuakeEx(2,2,2,35,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.2); + A_QuakeEx(2.,2.,2.,35,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.2); A_AlertMonsters(swwm_uncapalert?0:100); } @@ -96,6 +94,8 @@ Class DeepImpact : SWWMWeapon { let weap = Weapon(invoker); if ( !weap ) return; + A_BumpView(-.05); + A_QuakeEx(.1,.1,.1,2,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.05); A_StartSound("deepimpact/dryfire",CHAN_WEAPON,CHANF_OVERLAP,.5); A_AlertMonsters(swwm_uncapalert?0:70); Vector3 x = SWWMUtility.GetPlayerViewDir(self); @@ -116,17 +116,18 @@ Class DeepImpact : SWWMWeapon { let weap = Weapon(invoker); if ( !weap ) return; - A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.05); + A_BumpFOV(.995); + A_BumpView(-.2); + A_QuakeEx(.8,.8,.8,2,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.05); A_StartSound("deepimpact/fire",CHAN_WEAPON,CHANF_OVERLAP); A_AlertMonsters(swwm_uncapalert?0:300); A_PlayerFire(); invoker.clipcount = max(0,invoker.clipcount-3); - Vector3 x, y, z, dir; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + Vector3 dir; + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); SWWMUtility.DoKnockback(self,-x,2000.); Vector3 origin = SWWMUtility.GetFireOffset(self,10,2,-3); DeepTracer t = new("DeepTracer"); - t.ignoreme = self; Array list; list.Clear(); int rings = 1; @@ -143,7 +144,7 @@ Class DeepImpact : SWWMWeapon t.hitposx.Clear(); t.hitposy.Clear(); t.hitposz.Clear(); - t.Trace(origin,level.PointInSector(origin.xy),dir,250-i*150,0); + t.Trace(origin,level.PointInSector(origin.xy),dir,250-i*150,0,ignore:self); SWWMBulletTrail.DoTrail(self,origin,dir,250-i*150,0); for ( int k=0; k=invoker.default.clipcount,"NoReload"); XZW2 A 2 A_StartSound("deepimpact/reloadbeg",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 HIJ 2; + XZW3 HIJ 2 A_BumpView(.1,tics:2); ReloadHold: - XZW3 K 2 A_Crank(); - XZW3 LM 2; + XZW3 K 2 + { + A_Crank(); + A_BumpView(-.1,tics:2); + } + XZW3 LM 2 A_BumpView(-.2,tics:2); XZW3 NOPQ 3; XZW3 K 0 A_JumpIf((player.cmd.buttons&(BT_RELOAD|BT_ALTATTACK))&&(invoker.clipcount hitlist; Array shootthroughlist; Array waterhitlist; @@ -27,7 +26,6 @@ Class SpreadgunTracer : LineTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { int amt = SWWMDamageAccumulator.GetAmount(Results.HitActor); @@ -141,8 +139,7 @@ Class Spreadgun : SWWMWeapon else amo.Amount = min(amo.Amount+1,amo.MaxAmount); return; } - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,0,-10); let c = Spawn(invoker.wasgold?"GoldShellCasing":"RedShellCasing",origin); c.angle = angle; @@ -196,7 +193,7 @@ Class Spreadgun : SWWMWeapon hit.HitActor.A_StartSound("spreadgun/pelletf",CHAN_DAMAGE,CHANF_OVERLAP,.4,4.); } } - if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) && (t.Results.HitType != TRACE_HitActor) ) + if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HitActor) ) { Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(t.Results); let p = Spawn(impact,t.Results.HitPos+hitnormal*4); @@ -220,8 +217,9 @@ Class Spreadgun : SWWMWeapon A_SWWMFlash("FlashGold"); A_StartSound("spreadgun/goldfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); A_AlertMonsters(swwm_uncapalert?0:2500); - A_QuakeEx(6,6,6,9,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); + A_QuakeEx(6.,6.,6.,12,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); A_BumpFOV(.76); + A_BumpView(-4); SWWMHandler.DoFlash(self,Color(96,255,224,16),5); } else @@ -229,16 +227,15 @@ Class Spreadgun : SWWMWeapon A_SWWMFlash("FlashRed"); A_StartSound("spreadgun/redfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); A_AlertMonsters(swwm_uncapalert?0:800); - A_QuakeEx(3,3,3,9,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); - A_BumpFOV(.88); + A_QuakeEx(2.5,2.5,2.5,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); + A_BumpFOV(.93); + A_BumpView(-1); SWWMHandler.DoFlash(self,Color(40,255,192,64),5); } A_PlayerFire(); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,2,-2); - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); double a, s; Vector3 dir; if ( invoker.goldload ) @@ -247,7 +244,7 @@ Class Spreadgun : SWWMWeapon s = FRandom[Spreadgun](0,.01); dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2,true); if ( d.HitType != TRACE_HitNone ) { @@ -289,7 +286,6 @@ Class Spreadgun : SWWMWeapon else { SpreadgunTracer st = new("SpreadgunTracer"); - st.ignoreme = self; for ( int j=0; j<20; j++ ) { a = FRandom[Spreadgun](0,360); @@ -298,7 +294,7 @@ Class Spreadgun : SWWMWeapon st.hitlist.Clear(); st.shootthroughlist.Clear(); st.waterhitlist.Clear(); - st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); + st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,0,ignore:self); ProcessTraceHit(st,origin,dir,10,7000,bc:5); } for ( int i=0; i<16; i++ ) @@ -449,6 +445,7 @@ Class Spreadgun : SWWMWeapon Default { Tag "$T_SPREADGUN"; + Inventory.Icon "graphics/HUD/Icons/W_Spreadgun.png"; Inventory.PickupMessage "$I_SPREADGUN"; Obituary "$O_SPREADGUN"; SWWMWeapon.Tooltip "$TT_SPREADGUN"; @@ -474,26 +471,37 @@ Class Spreadgun : SWWMWeapon XZW2 A 1 { A_StartSound("spreadgun/deselect",CHAN_WEAPON,CHANF_OVERLAP); + A_BumpView(-.1); return A_JumpIf(invoker.fired,"DeselectFired"); } - XZW2 BCDEFGHI 1; + XZW2 BCD 1 A_BumpView(.1); + XZW2 EF 1 A_BumpView(.2); + XZW2 GH 1 A_BumpView(.3); XZW2 I -1 A_FullLower(); Stop; DeselectFired: - XZW2 Z 1; - XZW3 ABCDEFGH 1; + XZW2 Z 1 A_BumpView(-.1); + XZW3 ABC 1 A_BumpView(.1); + XZW3 DE 1 A_BumpView(.2); + XZW3 FG 1 A_BumpView(.3); XZW3 H -1 A_FullLower(); Stop; Select: XZW2 I 1 { A_FullRaise(); + A_BumpView(.2); return A_JumpIf(invoker.fired,"SelectFired"); } - XZW2 JKLMNOPQ 1; + XZW2 JKL 1 A_BumpView(-.1); + XZW2 MNO 1 A_BumpView(-.2); + XZW2 PQ 1 A_BumpView(.1); Goto Ready; SelectFired: - XZW3 HIJKLMNOP 1; + XZW3 H 1 A_BumpView(.2); + XZW3 IJK 1 A_BumpView(-.1); + XZW3 LMN 1 A_BumpView(-.2); + XZW3 OP 1 A_BumpView(.1); Goto ReadyFired; Ready: XZW2 A 1 A_SpreadgunReady(); @@ -587,9 +595,12 @@ Class Spreadgun : SWWMWeapon A_PlayerCheckGun(); return A_JumpIf(invoker.fired,"ZoomFired"); } - XZW5 PQRSTUVWXYZ 1; - XZW6 ABCDEFGHI 2; - XZW6 JKLMNO 1; + XZW5 PQR 1 A_BumpView(.1); + XZW5 STUVWXYZ 1 A_BumpView(-.2); + XZW6 ABCDEF 2 A_BumpView(-.15,tics:2); + XZW6 GHI 2 A_BumpView(-.1,tics:2); + XZW6 JKL 1 A_BumpView(.2); + XZW6 MNO 1 A_BumpView(.1); Goto Ready; ZoomFired: XZW2 Z 1; @@ -612,35 +623,41 @@ Class Spreadgun : SWWMWeapon A_StartSound("spreadgun/deselect",CHAN_WEAPON,CHANF_OVERLAP); return A_JumpIf(invoker.fired,"User1Fired"); } - XZW7 PQ 2; + XZW7 PQ 2 A_BumpView(.05,tics:2); User1Hold: XZW7 R 1 { + A_BumpAngle(1.); A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Overlay(-9999,"DummyMelee"); } - XZW7 STUV 2; + XZW7 ST 2 A_BumpAngle(-.25,tics:2); + XZW7 UV 2; XZW7 WX 3; XZW7 Y 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1Hold"); XZW7 Y 0 { invoker.PlayUpSound(self); } - XZW7 Y 2; - XZW7 Z 2; - XZW8 AB 2; + XZW7 Y 2 A_BumpView(.2,tics:2); + XZW7 Z 2 A_BumpView(.1,tics:2); + XZW8 AB 2 A_BumpView(-.1,tics:2); Goto Ready; User1Fired: XZW2 Z 2; - XZW9 CD 2; + XZW9 CD 2 A_BumpView(.05,tics:2); User1FiredHold: XZW9 E 1 { + A_BumpAngle(1.); A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Overlay(-9999,"DummyMelee"); } - XZW9 FGHI 2; + XZW9 FG 2 A_BumpAngle(-.25,tics:2); + XZW9 HI 2; XZW9 JK 3; XZW9 L 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1FiredHold"); XZW9 L 0 { invoker.PlayUpSound(self); } - XZW9 LMNO 2; + XZW9 L 2 A_BumpView(.2,tics:2); + XZW9 M 2 A_BumpView(.1,tics:2); + XZW9 NO 2 A_BumpView(-.1,tics:2); Goto ReadyFired; FlashRed: XZW0 A 2 Bright diff --git a/zscript/weapons/swwm_shot_fx.zsc b/zscript/weapons/swwm_shot_fx.zsc index 51addb38b..8ab5f6c3a 100644 --- a/zscript/weapons/swwm_shot_fx.zsc +++ b/zscript/weapons/swwm_shot_fx.zsc @@ -98,7 +98,7 @@ Class GoldenImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:40000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,7777,90000,600,500,DE_EXTRAZTHRUST); - A_QuakeEx(9,9,9,40,0,5000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollintensity:1.5); + A_QuakeEx(9.,9.,9.,40,0,5000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollintensity:1.5); A_StartSound("spreadgun/goldexpl",CHAN_VOICE,attenuation:.3); A_StartSound("spreadgun/goldexpl",CHAN_WEAPON,attenuation:.15); A_SprayDecal("WumboRocketBlast",-172); @@ -200,7 +200,7 @@ Class GoldenSubImpact : SWWMNonInteractiveActor { Super.PostBeginPlay(); SWWMUtility.DoExplosion(self,777,80000,500,400,DE_EXTRAZTHRUST); - A_QuakeEx(7,7,7,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.8); + A_QuakeEx(7.,7.,7.,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.8); A_SprayDecal("BigRocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); @@ -298,7 +298,7 @@ Class GoldenSubSubImpact : SWWMNonInteractiveActor { Super.PostBeginPlay(); SWWMUtility.DoExplosion(self,77,70000,400,300,DE_EXTRAZTHRUST); - A_QuakeEx(4,4,4,15,0,1000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.4); + A_QuakeEx(4.,4.,4.,15,0,1000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.4); A_SprayDecal("RocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); diff --git a/zscript/weapons/swwm_sparkyboi.zsc b/zscript/weapons/swwm_sparkyboi.zsc index 142daf2c9..baabf1921 100644 --- a/zscript/weapons/swwm_sparkyboi.zsc +++ b/zscript/weapons/swwm_sparkyboi.zsc @@ -38,10 +38,10 @@ Class Sparkster : SWWMWeapon else invoker.clipcount = 0; } else invoker.clipcount = max(0,invoker.clipcount-1); - Vector3 x, x2, y2, z2, dir; - x = SWWMUtility.GetPlayerViewDir(self); + Vector3 dir; + Vector3 x = SWWMUtility.GetPlayerViewDir(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,4.5,-5); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); double a, s; Actor p; switch ( mode ) @@ -49,8 +49,9 @@ Class Sparkster : SWWMWeapon case 0: // spark A_StartSound("biospark/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.7); - A_QuakeEx(2,2,2,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); + A_QuakeEx(2.,2.,2.,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); A_BumpFOV(.96); + A_BumpView(-.5); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,192,255,96),3); A_AlertMonsters(swwm_uncapalert?0:5000); @@ -68,8 +69,9 @@ Class Sparkster : SWWMWeapon case 1: // beam A_StartSound("biospark/altfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.8); - A_QuakeEx(3,3,3,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_QuakeEx(3.,3.,3.,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); A_BumpFOV(.95); + A_BumpView(-.6); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,192,255,96),3); A_AlertMonsters(swwm_uncapalert?0:4000); @@ -87,8 +89,9 @@ Class Sparkster : SWWMWeapon case 2: // big spark A_StartSound("biospark/thirdfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:1.5); - A_QuakeEx(5,5,5,10,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); + A_QuakeEx(5.,5.,5.,10,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); A_BumpFOV(.94); + A_BumpView(-.8); A_AlertMonsters(swwm_uncapalert?0:1200); A_PlayerFire(); SWWMUtility.DoKnockback(self,-x,2500.); @@ -114,8 +117,7 @@ Class Sparkster : SWWMWeapon action void A_DropMag( bool stacc = false ) { if ( swwm_nomagdrop ) return; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-10); let c = Spawn("SparksterMag",origin); c.angle = angle; @@ -209,6 +211,7 @@ Class Sparkster : SWWMWeapon Default { Tag "$T_SPARKSTER"; + Inventory.Icon "graphics/HUD/Icons/W_Sparkster.png"; Inventory.PickupMessage "$I_SPARKSTER"; Obituary "$O_SPARKSTER"; SWWMWeapon.Tooltip "$TT_SPARKSTER"; @@ -254,7 +257,7 @@ Class Sparkster : SWWMWeapon A_StartSound("biospark/deselect",CHAN_WEAPON,CHANF_OVERLAP); return A_JumpIf(invoker.doublestacc,"DoubleDeselect"); } - XZW2 BCDEFG 2; + XZW2 BCDEF 2; XZW2 G -1 { A_StopSound(CHAN_WEAPONEXTRA); @@ -263,7 +266,7 @@ Class Sparkster : SWWMWeapon Stop; DoubleDeselect: XZW5 Z 2; - XZW6 STUVWX 2; + XZW6 STUVW 2; XZW6 X -1 { A_StopSound(CHAN_WEAPONEXTRA); @@ -437,6 +440,8 @@ Class Sparkster : SWWMWeapon { invoker.clipcount = 0; invoker.nomag = true; + A_BumpView(1); + A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("biospark/magout",CHAN_WEAPON,CHANF_OVERLAP); A_StopSound(CHAN_WEAPONEXTRA); } @@ -455,6 +460,8 @@ Class Sparkster : SWWMWeapon invoker.clipcount = 0; invoker.nomag = true; invoker.doublestacc = false; + A_BumpView(1); + A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("biospark/magout",CHAN_WEAPON,CHANF_OVERLAP); A_StopSound(CHAN_WEAPONEXTRA); A_StopSound(CHAN_WEAPONEXTRA2); @@ -471,6 +478,8 @@ Class Sparkster : SWWMWeapon invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); invoker.clipcount = invoker.default.clipcount; invoker.nomag = false; + A_BumpView(-1.5); + A_QuakeEx(.6,.6,.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP); A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.4,4.); } @@ -491,6 +500,8 @@ Class Sparkster : SWWMWeapon invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); invoker.clipcount += invoker.default.clipcount; invoker.doublestacc = true; + A_BumpView(-2); + A_QuakeEx(.75,.75,.75,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.25); A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP); A_SoundVolume(CHAN_WEAPONEXTRA,.6); A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.); @@ -512,6 +523,8 @@ Class Sparkster : SWWMWeapon invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); invoker.clipcount += invoker.default.clipcount; invoker.doublestacc = true; + A_BumpView(-.8); + A_QuakeEx(.6,.6,.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2); A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP); A_SoundVolume(CHAN_WEAPONEXTRA,.6); A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.); @@ -551,9 +564,14 @@ Class Sparkster : SWWMWeapon A_PlayerMelee(); return A_JumpIf(invoker.doublestacc,"DoubleUser1"); } - XZW4 EFG 2; - XZW4 H 1 A_Parry(9); - XZW4 IJ 1; + XZW4 EFG 2 A_BumpView(1,tics:2); + XZW4 H 1 + { + A_BumpFOV(.98); + A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_Parry(9); + } + XZW4 IJ 1 A_BumpView(-4); XZW4 K 2 A_Melee(60,"demolitionist/whitm",1.,1.1,1.1); XZW4 LMNOPQ 2; XZW4 R 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP); @@ -561,9 +579,14 @@ Class Sparkster : SWWMWeapon Goto Ready; DoubleUser1: XZW5 Z 2; - XZW7 RST 2; - XZW7 U 1 A_Parry(9); - XZW7 VW 1; + XZW7 RST 2 A_BumpView(1,tics:2); + XZW7 U 1 + { + A_BumpFOV(.98); + A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3); + A_Parry(9); + } + XZW7 VW 1 A_BumpView(-4); XZW7 X 2 A_Melee(60,"demolitionist/whitm",1.,1.1); XZW7 YZ 2; XZW8 ABCD 2; diff --git a/zscript/weapons/swwm_sparkyboi_fx.zsc b/zscript/weapons/swwm_sparkyboi_fx.zsc index 87707cf08..dedec5911 100644 --- a/zscript/weapons/swwm_sparkyboi_fx.zsc +++ b/zscript/weapons/swwm_sparkyboi_fx.zsc @@ -139,7 +139,7 @@ Class BigBiospark : Actor void A_BigsparkTick() { if ( !(special2%4) ) - A_QuakeEx(Random[Sparkster](1,3),Random[Sparkster](1,3),Random[Sparkster](1,3),Random[Sparkster](4,6),0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:FRandom[Sparkster](.1,.3)); + A_QuakeEx(FRandom[Sparkster](.5,3.),FRandom[Sparkster](.5,3.),FRandom[Sparkster](.5,3.),Random[Sparkster](4,6),0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:FRandom[Sparkster](.1,.3)); special2++; int numpt = Random[ExploS](8,12); for ( int i=0; i hitlist; Array ShootThroughList; @@ -639,7 +639,6 @@ Class BiosparkTracer : LineTracer { if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE || (Results.HitActor is 'BiosparkHitbox') ) { let ent = new("HitListEntry"); @@ -678,7 +677,7 @@ Class BiosparkBeamImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:2000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,40,20000,100,40,flags:DE_HOWL); - A_QuakeEx(3,3,3,12,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.4); + A_QuakeEx(3.,3.,3.,12,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.4); A_StartSound("biospark/beamhit",CHAN_ITEM,attenuation:1.1); A_StartSound("biospark/beamhit",CHAN_WEAPON,attenuation:.8); A_SprayDecal("ShockMark",-172); @@ -842,7 +841,7 @@ Class BiosparkComboImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:6000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,bAMBUSH?(400+Args[0]*25):200,bAMBUSH?120000:60000,bAMBUSH?500:300,bAMBUSH?350:150,DE_HOWL); - A_QuakeEx(9,9,9,25,0,2000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:600,rollIntensity:1.5); + A_QuakeEx(9.,9.,9.,25,0,2000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:600,rollIntensity:1.5); A_StartSound("biospark/bighit",CHAN_ITEM,attenuation:.4); A_StartSound("biospark/bighit",CHAN_WEAPON,attenuation:.3); A_SprayDecal("BigShockMark",172); @@ -1008,10 +1007,9 @@ Class BiosparkBeam : SWWMNonInteractiveActor { let t = new("BiosparkTracer"); t.hitlist.Clear(); - t.ignoreme = target; Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); t.ShootThroughList.Clear(); - t.Trace(pos,CurSector,x,speed,TRACE_HitSky); + t.Trace(pos,CurSector,x,speed,0,ignore:target); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -1045,12 +1043,6 @@ Class BiosparkBeam : SWWMNonInteractiveActor } Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector; if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - if ( t.Results.HitType == TRACE_HasHitSky ) - { - bAMBUSH = true; - speed = t.Results.Distance; // shortens in minimap - return; - } if ( t.Results.HitType != TRACE_HitNone ) { let s = Spawn("BiosparkBeamImpact",t.Results.HitPos+normal*8.); @@ -1154,10 +1146,9 @@ Class BiosparkBeam : SWWMNonInteractiveActor A_FadeOut(.05); let t = new("BiosparkTracer"); t.hitlist.Clear(); - t.ignoreme = target; Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); t.ShootThroughList.Clear(); - t.Trace(pos,CurSector,x,speed,0); + t.Trace(pos,CurSector,x,speed,0,ignore:target); foreach ( hit:t.hitlist ) { if ( !hit.hitactor ) continue; @@ -1330,10 +1321,9 @@ Class BiosparkArc : SWWMNonInteractiveActor { let t = new("CandyBeamTracer"); t.hitlist.Clear(); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); t.ShootThroughList.Clear(); - t.Trace(pos,CurSector,x,speed,TRACE_HitSky); + t.Trace(pos,CurSector,x,speed,0); foreach ( l:t.ShootThroughList ) { l.Activate(target,0,SPAC_PCross); @@ -1350,16 +1340,11 @@ Class BiosparkArc : SWWMNonInteractiveActor } Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector; if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - if ( t.Results.HitType == TRACE_HasHitSky ) - { - bAMBUSH = true; - speed = t.Results.Distance; // shortens in minimap - return; - } if ( t.Results.HitType != TRACE_HitNone ) { speed = t.Results.Distance; // shortens in minimap nextpos = level.Vec3Offset(t.Results.HitPos,normal); // offset by normal so next segment doesn't spawn inside walls + dir = dir-(2.*normal*(dir dot normal)); // bounce direction } else nextpos = t.Results.HitPos; double a = FRandom[Sparkster](0,360), s = FRandom[Sparkster](0.,.8); @@ -1515,7 +1500,6 @@ Class BiosparkCore : Actor BounceType "Hexen"; +CANBOUNCEWATER; +USEBOUNCESTATE; - +DONTBOUNCEONSKY; +NODAMAGETHRUST; +NOTELEPORT; +INTERPOLATEANGLES; @@ -1565,7 +1549,7 @@ Class BiosparkCore : Actor void A_Deploy() { A_AlertMonsters(swwm_uncapalert?0:700,AMF_EMITFROMTARGET); - A_QuakeEx(7,7,7,8,0,1400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); + A_QuakeEx(7.,7.,7.,8,0,1400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); A_StartSound("biospark/deploy",CHAN_ITEM,attenuation:.7); A_StartSound("biospark/deploy",CHAN_WEAPON,attenuation:.5); let s = Spawn("BigBiospark",pos); @@ -1582,7 +1566,7 @@ Class BiosparkCore : Actor A_SetRenderStyle(1.,STYLE_Add); A_AlertMonsters(swwm_uncapalert?0:5000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,120,120000,150,60); - A_QuakeEx(6,6,6,16,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.8); + A_QuakeEx(6.,6.,6.,16,0,800,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:.8); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); Scale.y *= RandomPick[ExploS](-1,1); diff --git a/zscript/weapons/swwm_splode.zsc b/zscript/weapons/swwm_splode.zsc index b9fb4c49d..4d1e4339c 100644 --- a/zscript/weapons/swwm_splode.zsc +++ b/zscript/weapons/swwm_splode.zsc @@ -78,21 +78,21 @@ Class ExplodiumGun : SWWMWeapon invoker.chambered = invoker.clipcount; invoker.clipcount = max(invoker.clipcount-1,0); A_StartSound("explodium/fire",CHAN_WEAPON,CHANF_OVERLAP); - A_QuakeEx(5,5,5,3,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); + A_QuakeEx(4.5,4.5,4.5,3,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); A_BumpFOV(.96); + A_BumpView(-.2); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,224,64),3); A_AlertMonsters(swwm_uncapalert?0:5000); A_PlayerFire(); - Vector3 x, x2, y2, z2; - x = SWWMUtility.GetPlayerViewDir(self); + Vector3 x = SWWMUtility.GetPlayerViewDir(self); SWWMUtility.DoKnockback(self,-x,4000.); Vector3 origin = SWWMUtility.GetFireOffset(self,10,3,-2); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.002); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { @@ -155,10 +155,9 @@ Class ExplodiumGun : SWWMWeapon invoker.deadeyecnt = 0; let weap = Weapon(invoker); if ( !weap ) return; - Vector3 x2, y2, z2; Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.005); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn("ExplodiumMagProj",origin); p.special1 = invoker.special1; @@ -179,8 +178,7 @@ Class ExplodiumGun : SWWMWeapon { invoker.deadeyecnt = 0; if ( swwm_nomagdrop ) return; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-10); let c = Spawn("ExplodiumMag",origin); c.angle = angle; @@ -191,8 +189,7 @@ Class ExplodiumGun : SWWMWeapon action void A_DropCasing() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,8,-10); let c = Spawn("ExplodiumCasing",origin); c.angle = angle; @@ -208,8 +205,8 @@ Class ExplodiumGun : SWWMWeapon override bool Use( bool pickup ) { - // switch to dual if already selected - if ( Owner.player && (Owner.player.ReadyWeapon == self) && (Amount > 1) ) + // switch to dual if already selected or if first selecting (unless disabled) + if ( Owner.player && (Amount > 1) && ((Owner.player.ReadyWeapon == self) || ((Owner.player.ReadyWeapon != SisterWeapon) && !swwm_singlefirst)) ) { // if the player's current weapon is a gesture, set sister as the former weapon, to avoid breaking gesture sequences if ( Owner.player.ReadyWeapon is 'SWWMGesture' ) @@ -325,6 +322,7 @@ Class ExplodiumGun : SWWMWeapon Default { Tag "$T_EXPLODIUM"; + Inventory.Icon "graphics/HUD/Icons/W_ExplodiumGun.png"; Inventory.PickupMessage "$T_EXPLODIUM"; Obituary "$O_EXPLODIUM"; SWWMWeapon.Tooltip "$TT_EXPLODIUM"; @@ -350,7 +348,8 @@ Class ExplodiumGun : SWWMWeapon A_FullRaise(); return A_JumpIf(invoker.firstselect,"FirstSelect"); } - XZW2 CDEFGH 2; + XZW2 CDE 2 A_BumpView(-.1,tics:2); + XZW2 FGH 2 A_BumpView(.05,tics:2); Goto Ready; FirstSelect: XZW2 B 1 A_JumpIf(level.maptime>8,1); @@ -360,7 +359,8 @@ Class ExplodiumGun : SWWMWeapon invoker.firstselect = false; invoker.PlayUpSound(self); } - XZW2 CDEFGH 2; + XZW2 CDE 2 A_BumpView(-.1,tics:2); + XZW2 FGH 2 A_BumpView(.05,tics:2); XZW2 A 2; Goto Slide; Ready: @@ -409,13 +409,23 @@ Class ExplodiumGun : SWWMWeapon XZWB E 1 { invoker.clipcount = 0; } XZWB F 1; XZWB G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZWB HIJK 1; + XZWB H 1 A_BumpView(.3); + XZWB IJK 1; XZWB L 1 A_DropMag(); XZWB MNOPQR 1; - XZWB S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZWB S 1 + { + A_BumpView(-.1); + A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + } XZWB TUVWXYZ 1; XZWC ABCD 1; - XZWC E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZWC E 1 + { + A_BumpView(-.4); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount = invoker.default.clipcount; + } XZWC FGHI 1; XZWC J 1 { @@ -458,7 +468,9 @@ Class ExplodiumGun : SWWMWeapon A_StartSound("explodium/throwmag",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZW6 EFGHIJKLMNOPRS 1; + XZW6 EFGHI 1 A_BumpView(.25); + XZW6 JKLMNO 1; + XZW6 PRS 1 A_BumpView(-1.5); XZW6 T 1 A_ThrowMag(); XZW6 UV 2; XZW6 W 2 @@ -482,32 +494,43 @@ Class ExplodiumGun : SWWMWeapon XZW3 B 1 { invoker.clipcount = 0; } XZW3 C 1; XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 EFGH 1; + XZW3 E 1 A_BumpView(.3); + XZW3 FGH 1; XZW3 I 1 A_DropMag(); Goto ReloadEnd; ReloadEmpty: XZW2 A 1; XZW3 JKLMNOPQRS 1; XZW3 T 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 UVWX 1; + XZW3 U 1 A_BumpView(.3); + XZW3 VWX 1; XZW3 Y 1 A_DropMag(); Goto ReloadEnd; ReloadEnd: XZW3 Z 1; XZW4 ABCDE 1; - XZW4 F 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 F 1 + { + A_BumpView(-.1); + A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); + } XZW4 GHIJKLMNOPQ 1; - XZW4 R 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZW4 R 1 + { + A_BumpView(-.4); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount = invoker.default.clipcount; + } XZW4 STUV 1; XZW2 A 1 A_JumpIf(!invoker.chambered,"Slide"); Goto Ready; Slide: XZW2 A 1; - XZW4 WXY 1; + XZW4 WXY 1 A_BumpView(-.1); XZW5 A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP); XZW5 BC 1; XZW5 D 1 { invoker.chambered = true; invoker.clipcount--; } - XZW5 EFG 1; + XZW5 EFG 1 A_BumpView(.1); XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); XZW5 IJKLM 1; Goto Ready; @@ -521,10 +544,14 @@ Class ExplodiumGun : SWWMWeapon CheckBullet: XZW2 A 1; XZW7 A 1 A_Overlay(PSP_WEAPON+1,"CheckBulletCasing"); - XZW7 BCDE 1; + XZW7 BCDE 1 A_BumpView(-.2); XZW7 F 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP); XZW7 GHIJKLMNOP 1; - XZW7 Q 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + XZW7 Q 1 + { + A_BumpView(.6); + A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); + } XZW7 RS 1; Goto Ready; CheckBulletCasing: @@ -533,15 +560,16 @@ Class ExplodiumGun : SWWMWeapon Stop; User1: XZW2 A 1; - XZW7 TU 1; + XZW7 TU 1 A_BumpView(.1); User1Hold: XZW7 V 1 { + A_BumpAngle(1.); A_PlayerMelee(true); A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Parry(9); } - XZW7 WX 1; + XZW7 WX 1 A_BumpAngle(-.5); XZW7 Y 1 A_Melee(); XZW7 Z 2; XZW8 ABCDE 2; @@ -550,16 +578,23 @@ Class ExplodiumGun : SWWMWeapon Goto Select; Zoom1: XZW2 A 2 A_StartSound("explodium/checkout",CHAN_WEAPON,CHANF_OVERLAP); - XZW8 GHIJKLMNOPQRSTUVWXYZ 2; + XZW8 GHIJ 2 A_BumpView(-.2); + XZW8 KLMNO 2 A_BumpView(-.3); + XZW8 PQR 2 A_BumpView(.5); + XZW8 STUV 2 A_BumpView(.2); + XZW8 WXYZ 2; Goto Ready; Zoom2: XZW2 A 1 A_StartSound("explodium/speen",CHAN_WEAPON,CHANF_OVERLAP); - XZW9 ABCDEFGHIJKLMNOPQRSTUVW 1; + XZW9 ABCD 1 A_BumpView(.2); + XZW9 EFGHIJ 1 A_BumpView(-.2); + XZW9 KLMNOP 1 A_BumpView(-.1); + XZW9 QRST 1 A_BumpView(.3); + XZW9 UVW 1; Goto Ready; Deselect: XZW2 A 2 A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZWA TUVW 2; - XZW2 B 2; + XZWA TUVW 2 A_BumpView(.1,tics:2); XZW2 B -1 A_FullLower(); Stop; Flash: @@ -623,8 +658,9 @@ Class DualExplodiumGun : SWWMWeapon invoker.clipcount = max(invoker.clipcount-1,0); } A_StartSound("explodium/fire",CHAN_WEAPON,CHANF_OVERLAP); - A_QuakeEx(5,5,5,3,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); + A_QuakeEx(4.5,4.5,4.5,3,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5); A_BumpFOV(.96); + A_BumpView(-.2); if ( side == 1 ) A_SWWMFlash("Flash"); else if ( side == -1 ) @@ -632,15 +668,14 @@ Class DualExplodiumGun : SWWMWeapon SWWMHandler.DoFlash(self,Color(64,255,224,64),3); A_AlertMonsters(swwm_uncapalert?0:5000); A_PlayerFire(); - Vector3 x, x2, y2, z2; - x = SWWMUtility.GetPlayerViewDir(self); + Vector3 x = SWWMUtility.GetPlayerViewDir(self); SWWMUtility.DoKnockback(self,-x,4000.); Vector3 origin = SWWMUtility.GetFireOffset(self,10,3.5*side,-2); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.002); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { @@ -702,8 +737,7 @@ Class DualExplodiumGun : SWWMWeapon { ExplodiumGun(invoker.SisterWeapon).deadeyecnt = 0; if ( swwm_nomagdrop ) return; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2*side,-10); let c = Spawn("ExplodiumMag",origin); c.angle = angle; @@ -714,8 +748,7 @@ Class DualExplodiumGun : SWWMWeapon action void A_DropCasing( int side = 1 ) { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,8*side,-10); let c = Spawn("ExplodiumCasing",origin); c.angle = angle; @@ -783,12 +816,20 @@ Class DualExplodiumGun : SWWMWeapon A_FullRaise(); ExplodiumGun(invoker.SisterWeapon).firstselect = false; } - XZW2 C 2; - XZW2 D 2 { player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftSelect")); } - XZW2 EFGHAA 2; + XZW2 C 2 A_BumpView(-.1,tics:2); + XZW2 D 2 + { + A_BumpView(-.1,tics:2); + player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftSelect")); + } + XZW2 E 2 A_BumpView(-.1,tics:2); + XZW2 FGH 2 A_BumpView(.05,tics:2); + XZW2 AA 2; Goto Ready; LeftSelect: - XZWB BCDEFGH 2; + XZWB B 2; + XZWB CDE 2 A_BumpView(-.1,tics:2); + XZWB FGH 2 A_BumpView(.05,tics:2); Goto LeftReady; Ready: XZW2 A 1 @@ -879,18 +920,25 @@ Class DualExplodiumGun : SWWMWeapon A_PlayerReload(); A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); } - XZWI WXYZ 2; - XZWJ AB 2; + XZWI WXY 2 A_BumpView(.2,tics:2); + XZWI Z 2 A_BumpView(.1,tics:2); + XZWJ AB 2 A_BumpView(.1,tics:2); XZWJ CD 1; XZWJ E 1 { ExplodiumGun(invoker.SisterWeapon).clipcount = 0; } XZWJ F 1; XZWJ G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZWJ HIJ 1; + XZWJ H 1 A_BumpView(.2); + XZWJ IJ 1; XZWJ K 0 A_DropMag(); XZWJ LMN 3; XZWJ O 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); XZWJ PQR 2; - XZWJ S 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; } + XZWJ S 1 + { + A_BumpView(-.2); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; + } XZWJ TUVW 1; XZWJ X 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP); XZWJ Y 2 @@ -945,17 +993,24 @@ Class DualExplodiumGun : SWWMWeapon A_PlayerReload(); A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); } - XZWL ABCDEF 2; + XZWL ABC 2 A_BumpView(.2,tics:2); + XZWL DEF 2 A_BumpView(.1,tics:2); XZWL GH 1; XZWL I 1 { invoker.clipcount = 0; } XZWL J 1; XZWL K 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZWL LMN 1; + XZWL L 1 A_BumpView(.2); + XZWL MN 1; XZWL O 0 A_DropMag(); XZWL PQR 3; XZWL S 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); XZWL TUV 2; - XZWL W 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZWL W 1 + { + A_BumpView(-.2); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount = invoker.default.clipcount; + } XZWL XYZ 1; XZWM A 1; XZWM B 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP); @@ -989,22 +1044,22 @@ Class DualExplodiumGun : SWWMWeapon Stop; Lower: XZW2 A 2; - XZW7 TUV 2; + XZW7 TUV 2 A_BumpView(.1,tics:2); XZW2 B -1; Stop; LeftLower: XZWB A 2; - XZWG TUV 2; + XZWG TUV 2 A_BumpView(.1,tics:2); XZWB B -1; Stop; Raise: XZW2 B 2; - XZW7 VUT 2; + XZW7 VUT 2 A_BumpView(-.1,tics:2); XZW2 A 1; Goto Ready; LeftRaise: XZWB B 2; - XZWG VUT 2; + XZWG VUT 2 A_BumpView(-.1,tics:2); XZWB A 1; Goto LeftReady; Reload: @@ -1015,36 +1070,46 @@ Class DualExplodiumGun : SWWMWeapon if ( ExplodiumGun(invoker.SisterWeapon).clipcount <= 0 ) return ResolveState("ReloadEmpty"); return ResolveState(null); } - XZW2 TUVWXY 2; + XZW2 TUV 2 A_BumpView(.2,tics:2); + XZW2 WXY 2 A_BumpView(.1,tics:2); XZW2 Z 1; XZW3 A 1; XZW3 B 1 { ExplodiumGun(invoker.SisterWeapon).clipcount = 0; } XZW3 C 1; XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 EFG 1; + XZW3 E 1 A_BumpView(.2); + XZW3 FG 1; XZW3 H 0 A_DropMag(); Goto ReloadEnd; ReloadEmpty: XZW2 A 1; - XZW3 IJKLMN 2; + XZW3 IJK 2 A_BumpView(.2,tics:2); + XZW3 LMN 2 A_BumpView(.1,tics:2); XZW3 OPQR 1; XZW3 S 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZW3 TUV 1; + XZW3 T 1 A_BumpView(.2); + XZW3 UV 1; XZW3 W 0 A_DropMag(); Goto ReloadEnd; ReloadEnd: XZW3 XYZ 3; XZW4 A 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); XZW4 BCD 2; - XZW4 E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; } + XZW4 E 1 + { + A_BumpView(-.2); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; + } XZW4 FGHI 1; XZW4 J 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP); - XZW4 KLMNOP 2; + XZW4 KLM 2 A_BumpView(-.2,tics:2); + XZW4 NOP 2 A_BumpView(.1,tics:2); Goto Ready; Slide: XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); } XZW2 A 1; - XZW4 WXY 1; + XZW4 WXY 1 A_BumpView(-.1); XZW5 A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP); XZW5 BC 1; XZW5 D 1 @@ -1052,7 +1117,7 @@ Class DualExplodiumGun : SWWMWeapon ExplodiumGun(invoker.SisterWeapon).chambered = true; ExplodiumGun(invoker.SisterWeapon).clipcount--; } - XZW5 EFG 1; + XZW5 EFG 1 A_BumpView(.1); XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); XZW5 IJKLM 1; XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); } @@ -1072,36 +1137,46 @@ Class DualExplodiumGun : SWWMWeapon if ( invoker.clipcount <= 0 ) return ResolveState("LeftReloadEmpty"); return ResolveState(null); } - XZWB TUVWXY 2; + XZWB TUV 2 A_BumpView(.2,tics:2); + XZWB WXY 2 A_BumpView(.1,tics:2); XZWB Z 1; XZWC A 1; XZWC B 1 { invoker.clipcount = 0; } XZWC C 1; XZWC D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZWC EFG 1; + XZWC E 1 A_BumpView(.2); + XZWC FG 1; XZWC H 0 A_DropMag(); Goto LeftReloadEnd; LeftReloadEmpty: XZWB A 1; - XZWC IJKLMN 2; + XZWC IJK 2 A_BumpView(.2,tics:2); + XZWC LMN 2 A_BumpView(.1,tics:2); XZWC OPQR 1; XZWC S 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); - XZWC TUV 1; + XZWC T 1 A_BumpView(.2); + XZWC UV 1; XZWC W 0 A_DropMag(); Goto LeftReloadEnd; LeftReloadEnd: XZWC XYZ 3; XZWD A 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP); XZWD BCD 2; - XZWD E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; } + XZWD E 1 + { + A_BumpView(-.2); + A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); + invoker.clipcount = invoker.default.clipcount; + } XZWD FGHI 1; XZWD J 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP); - XZWD KLMNOP 2; + XZWD KLM 2 A_BumpView(-.2,tics:2); + XZWD NOP 2 A_BumpView(.1,tics:2); Goto LeftReady; LeftSlide: XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); } XZWB A 1; - XZWD WXY 1; + XZWD WXY 1 A_BumpView(-.1); XZWE A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP); XZWE BC 1; XZWE D 1 @@ -1109,7 +1184,7 @@ Class DualExplodiumGun : SWWMWeapon invoker.chambered = true; invoker.clipcount--; } - XZWE EFG 1; + XZWE EFG 1 A_BumpView(.1); XZWE H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP); XZWE IJKLM 1; XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); } @@ -1120,25 +1195,38 @@ Class DualExplodiumGun : SWWMWeapon A_PlayerCheckGun(); A_StartSound("explodium/speen",CHAN_WEAPON,CHANF_OVERLAP); } - XZW9 ABCDEFG 1; - XZW9 H 1 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftZoom")); } - XZW9 IJKLMNOPQRSTUVW 1; + XZW9 ABCD 1 A_BumpView(.2); + XZW9 EFG 1 A_BumpView(-.2); + XZW9 H 1 + { + A_BumpView(-.2); + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftZoom")); + } + XZW9 IJ 1 A_BumpView(-.2); + XZW9 KLMNOP 1 A_BumpView(-.1); + XZW9 QRST 1 A_BumpView(.3); + XZW9 UVW 1; Goto Ready; LeftZoom: XZWB A 1; - XZWH ABCDEFGHIJKLMNOPQRSTUVW 1; + XZWH ABCD 1 A_BumpView(.2); + XZWH EFGHIJ 1 A_BumpView(-.2); + XZWH KLMNOP 1 A_BumpView(-.1); + XZWH QRST 1 A_BumpView(.3); + XZWH UVW 1; Goto LeftReady; User1: XZW2 A 1 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftUser1")); } - XZW7 TU 1; + XZW7 TU 1 A_BumpView(.1); User1Hold: XZW7 V 1 { + A_BumpAngle(1.); A_PlayerMelee(true); A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Parry(9); } - XZW7 WX 1; + XZW7 WX 1 A_BumpAngle(-.5); XZW7 Y 1 A_Melee(); XZW7 Z 2; XZW8 ABCDE 2; @@ -1152,16 +1240,19 @@ Class DualExplodiumGun : SWWMWeapon Stop; Deselect: XZW2 A 2 A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP); - XZWA T 2; - XZWA U 2 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftDeselect")); } - XZWA VW 2; - XZW2 B 6; + XZWA T 2 A_BumpView(.1,tics:2); + XZWA U 2 + { + A_BumpView(.1,tics:2); + player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftDeselect")); + } + XZWA VW 2 A_BumpView(.1,tics:2); XZW2 B -1 A_FullLower(); Stop; LeftDeselect: XZWB A 2; - XZWA PQRS 2; - XZWB B 2; + XZWA PQRS 2 A_BumpView(.1,tics:2); + XZWB B 0; Stop; Flash: XZWZ A 2 Bright diff --git a/zscript/weapons/swwm_splode_fx.zsc b/zscript/weapons/swwm_splode_fx.zsc index 4d8c05df6..57f0e3ca9 100644 --- a/zscript/weapons/swwm_splode_fx.zsc +++ b/zscript/weapons/swwm_splode_fx.zsc @@ -68,8 +68,7 @@ Class ExplodiumMagArm : Actor Spawn("ExplodiumMagTrail",pos); if ( !(ReactionTime%2) ) { - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,3+reactiontime/2,3000+500*reactiontime,40+3*reactiontime,20,DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,3+reactiontime/2,3000+500*reactiontime,40+3*reactiontime,20,DE_COUNTENEMIES); if ( target && special1 ) SWWMUtility.AchievementProgressInc("grenade",nkill,target.player); } Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); @@ -130,7 +129,6 @@ Class ExplodiumMagProj : Actor +ALLOWBOUNCEONACTORS; +DONTBOUNCEONSHOOTABLES; +CANBOUNCEWATER; - +DONTBOUNCEONSKY; +USEBOUNCESTATE; BounceFactor 0.4; WallBounceFactor 0.4; @@ -150,10 +148,9 @@ Class ExplodiumMagProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 2.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:6000,AMF_EMITFROMTARGET); - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,20+25*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,20+25*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST|DE_COUNTENEMIES); if ( target && isplanted ) SWWMUtility.AchievementProgressInc("grenade",nkill,target.player); - A_QuakeEx(9,9,9,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:2.); + A_QuakeEx(9.,9.,9.,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:2.); A_StartSound("explodium/maghit",CHAN_VOICE,attenuation:.35); A_StartSound("explodium/maghit",CHAN_WEAPON,attenuation:.2); A_SprayDecal("BigRocketBlast",172); @@ -291,6 +288,7 @@ Class ExplodiumMagAttach : ExplodiumMagProj { +MOVEWITHSECTOR; +EXPLODEONWATER; + +SKYEXPLODE; -BOUNCEONFLOORS; -BOUNCEONCEILINGS; -BOUNCEONWALLS; @@ -398,7 +396,7 @@ Class ExplodiumMagAttach : ExplodiumMagProj { atline = BlockingLine; normal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit(); - atside = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine); + atside = Level.PointOnLineSide(pos.xy,BlockingLine); if ( !atside ) normal *= -1; Vector3 orig = (BlockingLine.v1.p.x,BlockingLine.v1.p.y,0); Vector3 onwall = pos-(normal dot (pos-orig))*normal; @@ -504,7 +502,7 @@ Class ExplodiumBulletImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:3000,AMF_EMITFROMTARGET); SWWMUtility.DoExplosion(self,25,40000,70,40,DE_EXTRAZTHRUST); - A_QuakeEx(4,4,4,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); + A_QuakeEx(4.,4.,4.,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); A_StartSound("explodium/hit",CHAN_VOICE,attenuation:.6); A_StartSound("explodium/hit",CHAN_WEAPON,attenuation:.3); A_SprayDecal("RocketBlast",-172); diff --git a/zscript/weapons/swwm_tastytreat.zsc b/zscript/weapons/swwm_tastytreat.zsc index 6f5363f2c..87bca0378 100644 --- a/zscript/weapons/swwm_tastytreat.zsc +++ b/zscript/weapons/swwm_tastytreat.zsc @@ -19,8 +19,7 @@ Class CandyGun : SWWMWeapon return true; if ( (item.GetClass() == GetClass()) && !item.ShouldStay() ) { - bool ammoget, spareget; - [ammoget, spareget] = CandyGun(item).PickupForAmmoAndSpares(self); + let [ammoget, spareget] = CandyGun(item).PickupForAmmoAndSpares(self); if ( ammoget || spareget ) item.bPickupGood = true; if ( !deathmatch && !spareget ) @@ -125,21 +124,21 @@ Class CandyGun : SWWMWeapon invoker.chambered = invoker.clipcount; invoker.clipcount = max(invoker.clipcount-1,0); A_StartSound("candygun/fire",CHAN_WEAPON,CHANF_OVERLAP); - A_QuakeEx(5,5,5,5,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.); - A_BumpFOV(.94); + A_QuakeEx(6.3,6.3,6.3,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.); + A_BumpFOV(.88); + A_BumpView(-.35); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,224,64,255),5); A_AlertMonsters(swwm_uncapalert?0:9000); A_PlayerFire(); - Vector3 x, x2, y2, z2; - x = SWWMUtility.GetPlayerViewDir(self); + Vector3 x = SWWMUtility.GetPlayerViewDir(self); SWWMUtility.DoKnockback(self,-x,18000.); Vector3 origin = SWWMUtility.GetFireOffset(self,10,3,-2); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.005); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { @@ -194,10 +193,9 @@ Class CandyGun : SWWMWeapon { let weap = Weapon(invoker); if ( !weap ) return; - Vector3 x2, y2, z2; Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.01); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn("CandyMagProj",origin); p.special1 = invoker.special1; @@ -219,10 +217,9 @@ Class CandyGun : SWWMWeapon if ( weap.Ammo2.Amount <= 0 ) weap.Amount = 0; weap.Ammo2.Amount = max(0,weap.Ammo2.Amount-1); } - Vector3 x2, y2, z2; Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3); double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.015); - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); let p = Spawn("CandyGunProj",origin); p.special1 = invoker.clipcount+invoker.chambered; @@ -239,8 +236,7 @@ Class CandyGun : SWWMWeapon action void A_DropMag() { if ( swwm_nomagdrop ) return; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-10); let c = Spawn("CandyMag",origin); c.angle = angle; @@ -291,8 +287,7 @@ Class CandyGun : SWWMWeapon action void A_DropCasing() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,8,-10); let c = Spawn("CandyCasing",origin); c.special1 = special1; @@ -361,6 +356,7 @@ Class CandyGun : SWWMWeapon Default { Tag "$T_CANDYGUN"; + Inventory.Icon "graphics/HUD/Icons/W_CandyGun.png"; Inventory.PickupMessage "$I_CANDYGUN"; Obituary "$O_CANDYGUN"; SWWMWeapon.Tooltip "$TT_CANDYGUN"; @@ -672,13 +668,11 @@ Class CandyGun : SWWMWeapon return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"DeselectLast"); } XZWA TUVW 2; - XZW2 B 2; XZW2 B -1 A_FullLower(); Stop; DeselectLast: XZW9 X 2; XZWE QRST 2; - XZWE U 2; XZWE U -1 A_FullLower(); Stop; Flash: diff --git a/zscript/weapons/swwm_tastytreat_fx.zsc b/zscript/weapons/swwm_tastytreat_fx.zsc index b62e2ae5d..38a7e89d6 100644 --- a/zscript/weapons/swwm_tastytreat_fx.zsc +++ b/zscript/weapons/swwm_tastytreat_fx.zsc @@ -59,7 +59,6 @@ Class HitListEntry Class CandyBeamTracer : LineTracer { - Actor ignoreme; Array hitlist; Array ShootThroughList; @@ -67,7 +66,6 @@ Class CandyBeamTracer : LineTracer { if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("HitListEntry"); @@ -97,8 +95,7 @@ Class CandyBeam : SWWMNonInteractiveActor { let t = new("CandyBeamTracer"); t.hitlist.Clear(); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); + let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); t.ShootThroughList.Clear(); t.Trace(pos,CurSector,x,speed,0); foreach ( l:t.ShootThroughList ) @@ -119,6 +116,7 @@ Class CandyBeam : SWWMNonInteractiveActor { speed = t.Results.Distance; // shortens in minimap nextpos = level.Vec3Offset(t.Results.HitPos,normal); // offset by normal so next segment doesn't spawn inside walls + dir = dir-(2.*normal*(dir dot normal)); // bounce direction } else nextpos = t.Results.HitPos; double a = FRandom[Candy](0,360), s = FRandom[Candy](0.,.8); @@ -468,6 +466,7 @@ Class CandyGunProj : Actor +FORCEXYBILLBOARD; +FOILINVUL; +EXPLODEONWATER; + +SKYEXPLODE; } override void PostBeginPlay() { @@ -504,7 +503,7 @@ Class CandyGunProj : Actor Scale *= 7.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:40000); SWWMUtility.DoExplosion(self,3000+900*special1,80000+15000*special1,500+30*special1,300,DE_EXTRAZTHRUST); - A_QuakeEx(9,9,9,70,0,1500+100*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:1200,rollintensity:2.); + A_QuakeEx(9.,9.,9.,70,0,1500+100*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:1200,rollintensity:2.); A_StartSound("candygun/gunhit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/gunhit",CHAN_WEAPON,attenuation:.12); A_SprayDecal("WumboRocketBlast",172); @@ -612,7 +611,6 @@ Class CandyMagProj : Actor +ALLOWBOUNCEONACTORS; +DONTBOUNCEONSHOOTABLES; +CANBOUNCEWATER; - +DONTBOUNCEONSKY; +USEBOUNCESTATE; BounceFactor 0.4; WallBounceFactor 0.4; @@ -632,7 +630,7 @@ Class CandyMagProj : Actor Scale *= 3.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:20000); SWWMUtility.DoExplosion(self,800+900*special1,60000+15000*special1,200+20*special1,100,DE_EXTRAZTHRUST); - A_QuakeEx(9,9,9,30,0,500+80*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollintensity:2.); + A_QuakeEx(9.,9.,9.,30,0,500+80*special1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollintensity:2.); A_StartSound("candygun/maghit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/maghit",CHAN_WEAPON,attenuation:.12); A_SprayDecal("HugeRocketBlast",172); @@ -739,7 +737,7 @@ Class CandyBulletImpact : SWWMNonInteractiveActor Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:9000); SWWMUtility.DoExplosion(self,900,48000,150,80,DE_EXTRAZTHRUST); - A_QuakeEx(6,6,6,15,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:0.2); + A_QuakeEx(6.,6.,6.,15,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:0.2); A_StartSound("candygun/hit",CHAN_VOICE,attenuation:.25); A_StartSound("candygun/hit",CHAN_WEAPON,attenuation:.5); A_SprayDecal("BigRocketBlast",-172); diff --git a/zscript/weapons/swwm_thiccboolet.zsc b/zscript/weapons/swwm_thiccboolet.zsc index e588dcbcb..3fadb252f 100644 --- a/zscript/weapons/swwm_thiccboolet.zsc +++ b/zscript/weapons/swwm_thiccboolet.zsc @@ -15,8 +15,7 @@ Class AuxiliarySilverBulletTracer : LineTracer { override ETraceStatus TraceCallback() { - if ( Results.HitType == TRACE_HitActor ) return TRACE_Skip; - else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) { if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) return TRACE_Stop; @@ -52,7 +51,6 @@ Class SilverBulletTracer : SpreadgunTracer } if ( Results.HitType == TRACE_HitActor ) { - if ( Results.HitActor == ignoreme ) return TRACE_Skip; if ( Results.HitActor.bSHOOTABLE ) { let ent = new("HitListEntry"); @@ -78,11 +76,6 @@ Class SilverBulletTracer : SpreadgunTracer } return TRACE_Skip; } - else if ( Results.HitType == TRACE_HasHitSky ) - { - fullstop = true; - return TRACE_Stop; - } else if ( Results.HitType != TRACE_HitNone ) { if ( Results.HitType == TRACE_HitWall ) @@ -137,7 +130,7 @@ Class SilverBulletTracer : SpreadgunTracer penetration = max(0,penetration-i*4); // trace backwards to find exit surface let at = new("AuxiliarySilverBulletTracer"); - at.Trace(ofs,level.PointInSector(ofs.xy),-Results.HitVector,2.,0); + at.Trace(ofs,level.PointInSector(ofs.xy),-Results.HitVector,2.,0,ignoreallactors:true); let wp2 = new("WallPenetrate"); wp2.hittype = at.Results.HitType; wp2.hitline = at.Results.HitLine; @@ -355,7 +348,7 @@ Class SilverBullet : SWWMWeapon BusterWall.Bust(faketracer.Results,wp.penetration,self,wp.BustDir,wp.HitPos.z); } } - if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) && (t.Results.HitType != TRACE_HitActor) ) + if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HitActor) ) { Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(t.Results); let p = Spawn("SilverImpact",t.Results.HitPos+hitnormal*4); @@ -475,20 +468,18 @@ Class SilverBullet : SWWMWeapon A_SWWMFlash(); A_StartSound("silverbullet/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.3); A_AlertMonsters(swwm_uncapalert?0:16000); - A_QuakeEx(8,8,8,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.); + A_QuakeEx(8.5,8.5,8.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.2); double basezoom = invoker.zoomed?clamp(invoker.zoomlevel,1.,16.):1.; - A_BumpFOV(.76); + A_BumpView(invoker.proneme?-2:-8); + A_BumpFOV(.64); A_PlayerFire(); SWWMHandler.DoFlash(self,Color(110,255,192,80),8); - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin; if ( !invoker.zoomed ) origin = SWWMUtility.GetFireOffset(self,10,1,-1); else origin = SWWMUtility.GetPlayerEye(self); - Vector3 x2, y2, z2; - [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); + let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self); SilverBulletTracer sst = new("SilverBulletTracer"); - sst.ignoreme = self; sst.penetration = invoker.proneme?1200.:1000.; sst.hitlist.Clear(); sst.shootthroughlist.Clear(); @@ -500,7 +491,7 @@ Class SilverBullet : SWWMWeapon do { sst.fullstop = true; - sst.Trace(norigin,level.PointInSector(norigin.xy),x2,maxdist,TRACE_HitSky); + sst.Trace(norigin,level.PointInSector(norigin.xy),x2,maxdist,0,ignore:self); maxdist -= (sst.exitpoint-norigin).length(); norigin = sst.exitpoint; x2 = sst.Results.HitVector; @@ -540,8 +531,7 @@ Class SilverBullet : SWWMWeapon } action void A_DropCasing() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,10,-8); let c = Spawn("SilverBulletCasing",origin); c.angle = angle; @@ -551,8 +541,7 @@ Class SilverBullet : SWWMWeapon } action void A_DropBullet() { - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,10,10,-8); MagAmmo ma = MagAmmo(FindInventory("SilverBullets")); if ( !ma ) @@ -601,8 +590,7 @@ Class SilverBullet : SWWMWeapon ma.MagFill(); invoker.ClipCount = 0; if ( swwm_nomagdrop ) return; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,6,0,-15); let c = Spawn("SilverBulletMag",origin); c.angle = angle; @@ -613,8 +601,7 @@ Class SilverBullet : SWWMWeapon action void A_JetCompensate() { invoker.specialf1 -= .06; - Vector3 x, y, z; - [x, y, z] = SWWMUtility.GetPlayerAxes(self); + let [x, y, z] = SWWMUtility.GetPlayerAxes(self); vel += x*min(1.,invoker.specialf1)*(600./Mass); A_OverlayAlpha(PSP_WEAPON+1,clamp(invoker.specialf1*3.,0.,1.)); if ( Random[SilverBullet](0,int(invoker.specialf1*2)) ) @@ -732,6 +719,7 @@ Class SilverBullet : SWWMWeapon Default { Tag "$T_SILVERBULLET"; + Inventory.Icon "graphics/HUD/Icons/W_SilverBullet.png"; Inventory.PickupMessage "$T_SILVERBULLET"; Obituary "$O_SILVERBULLET"; SWWMWeapon.Tooltip "$TT_SILVERBULLET"; @@ -835,6 +823,8 @@ Class SilverBullet : SWWMWeapon TNT1 A 12 A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); TNT1 A 10 { + A_QuakeEx(.5,.5,.5,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_BumpFOV(.99); A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP); if ( invoker.chambered ) { @@ -848,7 +838,12 @@ Class SilverBullet : SWWMWeapon invoker.chambered = (invoker.clipcount>0); invoker.clipcount = max(0,invoker.clipcount-1); } - TNT1 A 2 A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + TNT1 A 2 + { + A_QuakeEx(1.2,1.2,1.2,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.65); + A_BumpFOV(.98); + A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + } TNT1 A 20 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); Goto ZoomReady; DoCock: @@ -857,6 +852,8 @@ Class SilverBullet : SWWMWeapon XZW3 AB 2; XZW3 C 2 { + A_QuakeEx(.5,.5,.5,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); + A_BumpFOV(.99); A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP); if ( invoker.chambered ) { @@ -871,7 +868,12 @@ Class SilverBullet : SWWMWeapon invoker.clipcount = max(0,invoker.clipcount-1); } XZW3 DEFG 2; - XZW3 H 2 A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 H 2 + { + A_QuakeEx(1.2,1.2,1.2,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.65); + A_BumpFOV(.98); + A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + } XZW3 I 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW3 JKLMNOPQR 2; Goto Ready; @@ -970,7 +972,13 @@ Class SilverBullet : SWWMWeapon A_ChangeModel("",1,"","",4,"models",String.Format("SilverbulletAmmo%s.png",(invoker.clipcount<=0)?"_Empty":""),CMDL_USESURFACESKIN,-1); } XZW4 DEFGHI 2; - XZW4 J 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 J 2 + { + A_BumpView(-2); + A_BumpFOV(.92); + A_QuakeEx(1.8,1.8,1.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8); + A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + } XZW4 KLMN 2; Goto Load; Load: @@ -983,6 +991,9 @@ Class SilverBullet : SWWMWeapon XZW4 S 2 { A_LoadMag(); + A_BumpView(-12); + A_BumpFOV(.89); + A_QuakeEx(2.6,2.6,2.6,12,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); A_StartSound("silverbullet/magin",CHAN_WEAPON,CHANF_OVERLAP); } XZW4 T 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); @@ -1030,12 +1041,17 @@ Class SilverBullet : SWWMWeapon A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } - XZW5 XYZ 3; - XZW6 A 1 A_Parry(9); - XZW6 BC 1; + XZW5 XYZ 3 A_BumpAngle(-1,3); + XZW6 A 1 + { + A_BumpFOV(.94); + A_QuakeEx(1.6,1.6,1.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.65); + A_Parry(9); + } + XZW6 BC 1 A_BumpAngle(6); XZW6 D 1 A_Melee(90,"demolitionist/whitl",1.6,2.,2.,MELEE_Wider); - XZW6 EF 1; - XZW6 GHI 2; + XZW6 EF 1 A_BumpAngle(4); + XZW6 GHI 2 A_BumpAngle(1,2); XZW6 J 3 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW6 KLMNO 3; XZW6 PQR 2; diff --git a/zscript/weapons/swwm_thiccboolet_fx.zsc b/zscript/weapons/swwm_thiccboolet_fx.zsc index 1f9be9ee9..19226b0b2 100644 --- a/zscript/weapons/swwm_thiccboolet_fx.zsc +++ b/zscript/weapons/swwm_thiccboolet_fx.zsc @@ -48,8 +48,7 @@ Class SilverAirRip : SWWMNonInteractiveActor } virtual void Explode( bool thruwall = false ) { - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,40,2000,40,flags:DE_COUNTENEMIES|DE_NONEXPLOSIVE,ignoreme:target); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,40,2000,40,flags:DE_COUNTENEMIES|DE_NONEXPLOSIVE,ignoreme:target); if ( SilverBullet(master) ) { Silverbullet(master).nkills += nkill; @@ -78,8 +77,7 @@ Class SilverImpact : SWWMNonInteractiveActor override void PostBeginPlay() { Super.PostBeginPlay(); - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,100,8000,100,20,DE_COUNTENEMIES|DE_NONEXPLOSIVE); + let [nhit, nkill] = SWWMUtility.DoExplosion(self,100,8000,100,20,DE_COUNTENEMIES|DE_NONEXPLOSIVE); if ( SilverBullet(master) ) { Silverbullet(master).nkills += nkill; @@ -87,7 +85,7 @@ Class SilverImpact : SWWMNonInteractiveActor if ( bAMBUSH ) SWWMUtility.AchievementProgressInc("thruwall",nkill,target.player); } A_AlertMonsters(swwm_uncapalert?0:2500,AMF_EMITFROMTARGET); - A_QuakeEx(4,4,4,20,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.9); + A_QuakeEx(4.,4.,4.,20,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.9); if ( special1 ) { Destroy();