Merge branch 'experimental' into devel
I can't be bothered to keep these two separate anymore, it's annoying.
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
BIN
graphics/HUD/Icons/W_CandyGun.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
graphics/HUD/Icons/W_DeepImpact.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
graphics/HUD/Icons/W_Eviscerator.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
graphics/HUD/Icons/W_ExplodiumGun.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
graphics/HUD/Icons/W_Hellblazer.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
graphics/HUD/Icons/W_ItamexHammer.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
graphics/HUD/Icons/W_MortalRifle.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
graphics/HUD/Icons/W_PlasmaBlast.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
graphics/HUD/Icons/W_Quadravol.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
graphics/HUD/Icons/W_SheenHMG.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
graphics/HUD/Icons/W_SilverBullet.png
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
graphics/HUD/Icons/W_Sparkster.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
graphics/HUD/Icons/W_Spreadgun.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
graphics/HUD/Icons/W_Wallbuster.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
graphics/HUD/Icons/W_Ynykron.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
|
|
@ -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).";
|
||||
|
|
|
|||
|
|
@ -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).";
|
||||
|
|
|
|||
|
|
@ -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-";
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
27
shaders/pp/BokehSel.fp
Normal file
|
|
@ -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<rsamples; j++ )
|
||||
{
|
||||
bstep = PI*2.0/rsamples;
|
||||
rcoord = vec2(cos(j*bstep),sin(j*bstep))*i;
|
||||
tstep++;
|
||||
res += texture(InputTexture,coord+rcoord*bof*strength);
|
||||
}
|
||||
}
|
||||
res /= tstep;
|
||||
FragColor = res;
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
version "4.10"
|
||||
version "4.11"
|
||||
|
||||
/*
|
||||
DEMOLITIONIST Main Codebase
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ Class PlasmaBlast : SWWMWeapon
|
|||
Default
|
||||
{
|
||||
Tag "$T_PLASMABLAST";
|
||||
Inventory.Icon "graphics/HUD/Icons/W_PlasmaBlast.png";
|
||||
Inventory.PickupMessage "$T_PLASMABLAST";
|
||||
Obituary "$O_PLASMABLAST";
|
||||
SWWMWeapon.Tooltip "$TT_PLASMABLAST";
|
||||
|
|
|
|||
|
|
@ -21,12 +21,12 @@ Class ItamexHammer : SWWMWeapon
|
|||
if ( A_Melee(100,"itamex/hit",1.6,1.1,1.,MELEE_Rip|MELEE_FleshSound|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);
|
||||
return nojump?ResolveState(null):ResolveState("FireHit");
|
||||
}
|
||||
A_BumpFOV(.95);
|
||||
A_QuakeEx(1,1,1,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
return ResolveState(null);
|
||||
}
|
||||
action void A_HammerAltHit()
|
||||
|
|
@ -36,12 +36,12 @@ Class ItamexHammer : SWWMWeapon
|
|||
if ( A_Melee(int(100+invoker.charge*2.),"itamex/hit",2.,1.1,1.2,MELEE_Rip|MELEE_FleshSound|MELEE_HammerHit|MELEE_Vertical|MELEE_ExtraWide|MELEE_ForceBust) )
|
||||
{
|
||||
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);
|
||||
return;
|
||||
}
|
||||
A_BumpFOV(.95);
|
||||
A_QuakeEx(1,1,1,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
}
|
||||
|
||||
override void DoEffect()
|
||||
|
|
@ -89,14 +89,14 @@ Class ItamexHammer : SWWMWeapon
|
|||
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||
SWWMUtility.DoKnockback(self,(x.x,x.y,x.z*.1),1500.*invoker.charge);
|
||||
if ( vel.z < 0 ) vel.z *= 1.-invoker.charge*.008;
|
||||
A_QuakeEx(1,1,1,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
||||
A_PlayerFire();
|
||||
invoker.spintime++;
|
||||
if ( invoker.hitcnt > 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<MRHitListEntry> hitlist;
|
||||
Array<Line> shootthroughlist;
|
||||
Array<WaterHit> 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:
|
||||
|
|
|
|||
|
|
@ -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<numpt; i++ )
|
||||
|
|
@ -700,10 +696,9 @@ Class MisterRailExitImpact : MisterBulletImpact
|
|||
override void A_BulletExplode()
|
||||
{
|
||||
A_AlertMonsters(swwm_uncapalert?0:4000,AMF_EMITFROMTARGET);
|
||||
int nhit, nkill;
|
||||
[nhit, nkill] = SWWMUtility.DoExplosion(self,444,80000,200,200,DE_EXTRAZTHRUST|DE_COUNTENEMIES);
|
||||
let [nhit, nkill] = SWWMUtility.DoExplosion(self,444,80000,200,200,DE_EXTRAZTHRUST|DE_COUNTENEMIES);
|
||||
if ( mrc ) mrc.nkill += nkill;
|
||||
A_QuakeEx(8,8,8,15,0,600,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:250,rollintensity:1.2);
|
||||
A_QuakeEx(8.,8.,8.,15,0,600,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:250,rollintensity:1.2);
|
||||
A_StartSound("mister/hitover",CHAN_WEAPON,attenuation:.2);
|
||||
A_SprayDecal("BigRocketBlast",-172);
|
||||
Scale *= FRandom[ExploS](0.8,1.1);
|
||||
|
|
@ -753,8 +748,7 @@ Class MisterRailExitImpact : MisterBulletImpact
|
|||
{
|
||||
if ( special1 && (special1 <= 20) )
|
||||
{
|
||||
int nhit, nkill;
|
||||
[nhit, nkill] = SWWMUtility.DoExplosion(self,44,6000+special1*100,150+special1*5,150+special1*5,DE_EXTRAZTHRUST|DE_COUNTENEMIES);
|
||||
let [nhit, nkill] = SWWMUtility.DoExplosion(self,44,6000+special1*100,150+special1*5,150+special1*5,DE_EXTRAZTHRUST|DE_COUNTENEMIES);
|
||||
if ( mrc ) mrc.nkill += nkill;
|
||||
int numpt = Random[ExploS](0,special1/2);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
|
|
@ -807,8 +801,7 @@ Class MisterRailHit : SWWMNonInteractiveActor
|
|||
}
|
||||
virtual void Explode( bool thruwall = false )
|
||||
{
|
||||
int nhit, nkill;
|
||||
[nhit, nkill] = SWWMUtility.DoExplosion(self,44,120000,100,100,DE_EXTRAZTHRUST|DE_COUNTENEMIES,ignoreme:target);
|
||||
let [nhit, nkill] = SWWMUtility.DoExplosion(self,44,120000,100,100,DE_EXTRAZTHRUST|DE_COUNTENEMIES,ignoreme:target);
|
||||
if ( mrc ) mrc.nkill += nkill;
|
||||
}
|
||||
States
|
||||
|
|
@ -855,10 +848,10 @@ Class MisterRailBeam : SWWMNonInteractiveActor
|
|||
cbt.hitlist.Clear();
|
||||
Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch-90);
|
||||
cbt.ShootThroughList.Clear();
|
||||
cbt.Trace(pos,CurSector,dir,scale.y,0);
|
||||
cbt.Trace(pos,CurSector,dir,scale.y,0,ignore:target);
|
||||
foreach ( hit:cbt.hitlist )
|
||||
{
|
||||
if ( !hit.hitactor || (hit.hitactor == target) ) continue;
|
||||
if ( !hit.hitactor ) continue;
|
||||
SWWMUtility.DoKnockback(hit.hitactor,hit.x,12000);
|
||||
let p = SWWMPuff.Setup(hit.hitlocation,hit.x,self,target,hit.hitactor);
|
||||
hit.hitactor.DamageMobj(p,target,44,'Mortal',DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF);
|
||||
|
|
@ -971,7 +964,6 @@ Class MisterGrenade : Actor
|
|||
+BOUNCEONFLOORS;
|
||||
+BOUNCEONCEILINGS;
|
||||
+THRUACTORS;
|
||||
+DONTBOUNCEONSKY;
|
||||
+CANBOUNCEWATER;
|
||||
}
|
||||
|
||||
|
|
@ -1100,7 +1092,7 @@ Class MisterGrenade : Actor
|
|||
Scale.x *= RandomPick[ExploS](-1,1);
|
||||
Scale.y *= RandomPick[ExploS](-1,1);
|
||||
SWWMUtility.DoExplosion(self,444,120000,250,250,DE_EXTRAZTHRUST);
|
||||
A_QuakeEx(8,8,8,20,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:1.5);
|
||||
A_QuakeEx(8.,8.,8.,20,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:1.5);
|
||||
A_StartSound("mister/hitgrenade",CHAN_VOICE,attenuation:.3);
|
||||
A_StartSound("mister/hitgrenade",CHAN_WEAPON,attenuation:.2);
|
||||
A_AlertMonsters(swwm_uncapalert?0:3500,AMF_EMITFROMTARGET);
|
||||
|
|
@ -1300,7 +1292,7 @@ Class MisterSubGrenade : MisterGrenade
|
|||
Scale.x *= RandomPick[ExploS](-1,1);
|
||||
Scale.y *= RandomPick[ExploS](-1,1);
|
||||
SWWMUtility.DoExplosion(self,444,80000,150,150,DE_EXTRAZTHRUST);
|
||||
A_QuakeEx(5,5,5,10,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8);
|
||||
A_QuakeEx(5.,5.,5.,10,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8);
|
||||
A_StartSound("mister/hitgrenadesub",CHAN_VOICE,attenuation:.5);
|
||||
A_StartSound("mister/hitgrenadesub",CHAN_WEAPON,attenuation:.4);
|
||||
A_AlertMonsters(swwm_uncapalert?0:1500,AMF_EMITFROMTARGET);
|
||||
|
|
|
|||
|
|
@ -48,8 +48,7 @@ Class Quadravol : SWWMWeapon
|
|||
int idx = clamp(invoker.chargelevel-1,0,4);
|
||||
A_StartSound("quadshot/fire"..BaseNum[idx],CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_PlayerFire();
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = SWWMUtility.GetPlayerAxes(self);
|
||||
let [x, y, z] = SWWMUtility.GetPlayerAxes(self);
|
||||
double offy = invoker.onehand?3.5:3;
|
||||
double offz = invoker.onehand?-2:-2.5;
|
||||
Vector3 origin = SWWMUtility.GetFireOffset(self,10,offy,offz);
|
||||
|
|
@ -65,7 +64,7 @@ Class Quadravol : SWWMWeapon
|
|||
for ( int j=0; j<360; j+=(360/rings) )
|
||||
{
|
||||
dir = SWWMUtility.ConeSpread(x,y,z,j,i);
|
||||
pointblank |= LineTrace(atan2(dir.y,dir.x),60,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d);
|
||||
pointblank |= LineTrace(atan2(dir.y,dir.x),60,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( (d.HitType == TRACE_HitActor) && !fool ) fool = d.HitActor;
|
||||
if ( (d.HitType == TRACE_HitWall) && !fline )
|
||||
{
|
||||
|
|
@ -77,8 +76,7 @@ Class Quadravol : SWWMWeapon
|
|||
}
|
||||
if ( bMelee && fool ) SWWMUtility.AchievementProgressInc("roast",1,player);
|
||||
if ( bMelee || fool || (idx>=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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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" )
|
||||
|
|
|
|||
|
|
@ -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<numcrosshairs; i++ )
|
||||
{
|
||||
ofs = traceofs[i].x*x+traceofs[i].y*y+traceofs[i].z*z;
|
||||
origin = level.Vec3Offset(e.ViewPos,ofs);
|
||||
ctr.Trace(origin,level.PointInSector(origin.xy),x,10000.,TRACE_ReportPortals);
|
||||
ctr.Trace(origin,level.PointInSector(origin.xy),x,10000.,TRACE_ReportPortals,ignore:mo);
|
||||
if ( chp >= 2 )
|
||||
{
|
||||
int hp = Clamp(mo.Health,0,200);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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<numpt; i++ )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ extend Class SWWMHandler
|
|||
if ( players[consoleplayer].mo.FindInventory("RagekitPower") && (type != "ragekit") ) return 0;
|
||||
// suppress beep-boop lines if voice channel already in use
|
||||
if ( ((type == "buttonpush") || (type == "mrtouch") || (type == "mrflick"))
|
||||
&& players[consoleplayer].mo.IsActorPlayingSound(CHAN_DEMOVOICE,-1)
|
||||
&& players[consoleplayer].mo.IsActorPlayingSound(CHAN_DEMOVOICE)
|
||||
&& !players[consoleplayer].mo.IsActorPlayingSound(CHAN_DEMOVOICE,"voice/default/buttonpush1")
|
||||
&& !players[consoleplayer].mo.IsActorPlayingSound(CHAN_DEMOVOICE,"voice/default/buttonpush2")
|
||||
&& !players[consoleplayer].mo.IsActorPlayingSound(CHAN_DEMOVOICE,"voice/default/buttonpush3")
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ extend Class SWWMHandler
|
|||
transient Array<MenuTransaction> 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<Weapon> 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 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -146,70 +146,6 @@ extend Class SWWMHandler
|
|||
SWWMUtility.MarkAchievement("hurry",players[consoleplayer]);
|
||||
}
|
||||
|
||||
private void SetupLockdefsCache( SWWMCachedLockInfo cli )
|
||||
{
|
||||
for ( int i=0; i<Wads.GetNumLumps(); i++ )
|
||||
{
|
||||
String lname = Wads.GetLumpName(i);
|
||||
if ( !(lname ~== "LOCKDEFS") ) continue;
|
||||
String data = Wads.ReadLump(i);
|
||||
Array<String> lines;
|
||||
lines.Clear();
|
||||
data.Split(lines,"\n");
|
||||
bool valid = false;
|
||||
for ( int j=0; j<lines.Size(); j++ )
|
||||
{
|
||||
// strip leading whitespace
|
||||
while ( (lines[j].Left(1) == " ") || (lines[j].Left(1) == "\t") )
|
||||
lines[j] = lines[j].Mid(1);
|
||||
if ( lines[j].Left(10) ~== "CLEARLOCKS" )
|
||||
{
|
||||
for ( int k=0; k<cli.ent.Size(); k++ )
|
||||
cli.ent[k].Destroy();
|
||||
cli.ent.Clear();
|
||||
}
|
||||
else if ( Lines[j].Left(5) ~== "LOCK " )
|
||||
{
|
||||
Array<String> 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<lines.Size(); k++ )
|
||||
{
|
||||
// strip leading whitespace
|
||||
while ( (lines[k].Left(1) == " ") || (lines[k].Left(1) == "\t") )
|
||||
lines[k] = lines[k].Mid(1);
|
||||
if ( lines[k].Left(5) ~== "LOCK " )
|
||||
break; // we reached the next lock
|
||||
if ( !(lines[k].Left(9) ~== "MAPCOLOR ") )
|
||||
continue;
|
||||
// here it is
|
||||
spl.Clear();
|
||||
lines[k].Split(spl," ",TOK_SKIPEMPTY);
|
||||
if ( spl.Size() < 4 ) break;
|
||||
li.hascolor = true;
|
||||
li.mapcolor = Color(spl[1].ToInt(),spl[2].ToInt(),spl[3].ToInt());
|
||||
}
|
||||
cli.ent.Push(li);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void MapStartDialogues()
|
||||
{
|
||||
int whichboss = WhichVanillaBossMap();
|
||||
|
|
@ -391,9 +327,6 @@ extend Class SWWMHandler
|
|||
}
|
||||
break;
|
||||
}
|
||||
// setup cached lockdefs data
|
||||
let cli = SWWMCachedLockInfo.GetInstance();
|
||||
if ( cli.ent.Size() == 0 ) SetupLockdefsCache(cli);
|
||||
// for skipping over merged exit lines (sharing vertices)
|
||||
Array<Line> 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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<Weapon> 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<weaps.Size(); i++ )
|
||||
{
|
||||
if ( !weaps[i] ) continue;
|
||||
double h = 16.; // padding
|
||||
TextureID ico = weaps[i].Icon;
|
||||
if ( ico.IsValid() )
|
||||
{
|
||||
Vector2 sz = TexMan.GetScaledSize(ico);
|
||||
if ( weaps[i] is 'SWWMWeapon' ) // SWWM weapon icons are larger
|
||||
sz *= .125;
|
||||
h += sz.y;
|
||||
}
|
||||
else h += fnt.GetHeight();
|
||||
if ( i == cursel ) cur = th+(h*.5);
|
||||
th += h;
|
||||
}
|
||||
return (cur<0.)?(th*.5):cur;
|
||||
}
|
||||
|
||||
SWWMWeaponSelect Init( Actor mo )
|
||||
{
|
||||
self.mo = mo;
|
||||
// enumerate all selectable weapons
|
||||
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);
|
||||
}
|
||||
// sort weapons
|
||||
qsort_weapons(0,weaps.Size()-1);
|
||||
// find current selected
|
||||
Weapon curweap = mo.player.ReadyWeapon;
|
||||
if ( curweap is 'SWWMGesture' ) curweap = SWWMGesture(curweap).formerweapon;
|
||||
else if ( curweap is 'SWWMItemGesture' ) curweap = SWWMItemGesture(curweap).gest.formerweapon;
|
||||
for ( int i=0; i<weaps.Size(); i++ )
|
||||
{
|
||||
if ( (weaps[i] != curweap) && (weaps[i].SisterWeapon != curweap) )
|
||||
continue;
|
||||
cursel = i;
|
||||
break;
|
||||
}
|
||||
// initial state
|
||||
S_StartSound("menu/demotab",CHAN_AUTO,CHANF_UI);
|
||||
stage = 0;
|
||||
alph = 0.;
|
||||
fnt = Font.FindFont("TewiFontOutline");
|
||||
olsmoothY = smoothY = curY = CalcHeight();
|
||||
return self;
|
||||
}
|
||||
|
||||
private void ShowNameTag()
|
||||
{
|
||||
let bar = SWWMStatusBar(StatusBar);
|
||||
if ( !bar ) return;
|
||||
let sw = SWWMWeapon(weaps[cursel]);
|
||||
if ( sw && sw.SisterWeapon && (sw.Amount > 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(); i++ )
|
||||
{
|
||||
cursel--;
|
||||
if ( cursel < 0 ) cursel = weaps.Size()-1;
|
||||
if ( WeaponHasAmmo(weaps[cursel]) ) break;
|
||||
}
|
||||
curY = CalcHeight();
|
||||
S_StartSound("menu/demoscroll",CHAN_AUTO,CHANF_UI);
|
||||
if ( !weaps[cursel] || !(displaynametags&2) ) return;
|
||||
ShowNameTag();
|
||||
}
|
||||
|
||||
void WeapNext()
|
||||
{
|
||||
if ( (weaps.Size() <= 1) || !CanScroll() ) return;
|
||||
for ( int i=0; i<weaps.Size(); i++ )
|
||||
{
|
||||
cursel++;
|
||||
if ( cursel >= 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<weaps.Size(); i++ )
|
||||
{
|
||||
if ( weaps[i] && (weaps[i].Owner == mo) ) continue;
|
||||
bChanged = true;
|
||||
weaps.Delete(i);
|
||||
if ( cursel > 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<weaps.Size(); i++ )
|
||||
{
|
||||
if ( !weaps[i] ) continue;
|
||||
let w = weaps[i];
|
||||
let sw = SWWMWeapon(weaps[i]);
|
||||
double scl = sw?.125:1.;
|
||||
y += 8.;
|
||||
double fade = clamp(.8-abs(y-hss.y)/hss.y,0.,.8)/.8;
|
||||
bool bHasAmmo = WeaponHasAmmo(w);
|
||||
TextureID ico = w.Icon;
|
||||
if ( ico.IsValid() )
|
||||
{
|
||||
Vector2 sz = TexMan.GetScaledSize(ico);
|
||||
y += sz.y*scl*.5;
|
||||
if ( sw && sw.SisterWeapon && (sw.Amount > 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.;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<cf.clines.Size(); i++ )
|
||||
cf.clines[i].Activate(user,cf.csides[i],SPAC_Cross);
|
||||
|
|
|
|||
|
|
@ -626,7 +626,7 @@ Class PartyTime : SWWMNonInteractiveActor
|
|||
if ( ignite )
|
||||
{
|
||||
// wait for the sound to stop
|
||||
if ( !IsActorPlayingSound(CHAN_ITEM,-1) )
|
||||
if ( !IsActorPlayingSound(CHAN_ITEM) )
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
|
|
@ -704,7 +704,7 @@ Class ChanceboxSpawner : 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(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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Line> ShootThroughList;
|
||||
Array<WaterHit> 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
Class TendrilTracer : LineTracer
|
||||
{
|
||||
Actor ignore;
|
||||
Array<Line> ShootThroughList;
|
||||
Array<HitListEntry> 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<ntendies; i++ )
|
||||
{
|
||||
|
|
@ -118,8 +113,7 @@ Class MykradvoTendril : SWWMNonInteractiveActor
|
|||
if ( !bSTANDSTILL )
|
||||
{
|
||||
int numpt = bMISSILEMORE?9:3;
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
double a = FRandom[ExploS](0,360), s = FRandom[ExploS](0,1.);
|
||||
|
|
@ -367,7 +361,7 @@ Class MykradvoBurst : SWWMNonInteractiveActor
|
|||
{
|
||||
nstep = clamp(targets.Size()/10,1,5);
|
||||
A_AlertMonsters(swwm_uncapalert?0:8000);
|
||||
A_QuakeEx(9,9,9,80,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:1000,rollintensity:2.);
|
||||
A_QuakeEx(9.,9.,9.,80,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:1000,rollintensity:2.);
|
||||
A_StartSound("powerup/mykradvo",CHAN_BODY,CHANF_DEFAULT,1.,.25);
|
||||
A_StartSound("powerup/mykradvo",CHAN_VOICE,CHANF_DEFAULT,1.,.25);
|
||||
FlashPlayer(100,1500);
|
||||
|
|
@ -458,7 +452,7 @@ Class MykradvoBurst : SWWMNonInteractiveActor
|
|||
{
|
||||
Spawn:
|
||||
XEX4 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\ 2 Bright;
|
||||
TNT1 A 1 A_JumpIf(!IsActorPlayingSound(CHAN_VOICE,-1)&&!(targets.Size()),1);
|
||||
TNT1 A 1 A_JumpIf(!IsActorPlayingSound(CHAN_VOICE)&&!(targets.Size()),1);
|
||||
Wait;
|
||||
TNT1 A 1;
|
||||
Stop;
|
||||
|
|
@ -555,7 +549,7 @@ Class Mykradvo : Inventory
|
|||
}
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= 0.98;
|
||||
Owner.A_QuakeEx(1,1,1,4,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D);
|
||||
Owner.A_QuakeEx(.5,.5,.5,4,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D);
|
||||
// don't consume on failure
|
||||
Amount++;
|
||||
return true;
|
||||
|
|
@ -833,7 +827,7 @@ Class AngeryPower : Powerup
|
|||
if ( !Owner ) return;
|
||||
Owner.A_AlertMonsters(swwm_uncapalert?0:5000);
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),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);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
|
|
@ -857,7 +851,7 @@ Class AngeryPower : Powerup
|
|||
if ( !Owner ) return;
|
||||
Owner.A_StartSound("powerup/devastationend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
|
||||
SWWMHandler.DoFlash(Owner,Color(128,224,0,255),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(swwm_uncapalert?0:2000);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .9;
|
||||
|
|
@ -869,7 +863,7 @@ Class AngeryPower : Powerup
|
|||
if ( level.maptime <= lasteffect+5 ) return;
|
||||
Owner.A_AlertMonsters(swwm_uncapalert?0:5000);
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),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.);
|
||||
Owner.A_StartSound("powerup/devastationhit",CHAN_POWERUP,CHANF_OVERLAP);
|
||||
lasteffect = level.maptime;
|
||||
lastpulse = max(lastpulse,gametic+35);
|
||||
|
|
@ -916,7 +910,7 @@ Class AngerySigil : Inventory
|
|||
{
|
||||
r.EffectTics += r.default.EffectTics;
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),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.);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .95;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,8 +38,7 @@ Class DemolitionistMenuList ui
|
|||
void Drawer( Vector2 offset )
|
||||
{
|
||||
Vector2 pos, rpos, rsiz;
|
||||
int cx, cy, cw, ch;
|
||||
[cx, cy, cw, ch] = Screen.GetClipRect();
|
||||
let [cx, cy, cw, ch] = Screen.GetClipRect();
|
||||
for ( int i=0; i<items.Size(); i++ )
|
||||
{
|
||||
pos = (items[i].xpos,items[i].ypos)+offset;
|
||||
|
|
|
|||
|
|
@ -32,11 +32,9 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
|
|||
{
|
||||
if ( a is 'Weapon' )
|
||||
{
|
||||
bool dummy;
|
||||
int slota, slotb;
|
||||
[dummy, slota] = players[consoleplayer].weapons.LocateWeapon(Weapon(a).GetClass());
|
||||
let [dummya, slota] = players[consoleplayer].weapons.LocateWeapon(Weapon(a).GetClass());
|
||||
if ( slota == 0 ) slota = 10;
|
||||
[dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(Weapon(b).GetClass());
|
||||
let [dummyb, slotb] = players[consoleplayer].weapons.LocateWeapon(Weapon(b).GetClass());
|
||||
if ( slotb == 0 ) slotb = 10;
|
||||
if ( slota == slotb )
|
||||
return (Weapon(a).SlotPriority <= Weapon(b).SlotPriority);
|
||||
|
|
@ -69,11 +67,9 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
|
|||
}
|
||||
if ( usesa && usesb )
|
||||
{
|
||||
bool dummy;
|
||||
int slota, slotb;
|
||||
[dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
|
||||
let [dummya, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
|
||||
if ( slota == 0 ) slota = 10;
|
||||
[dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
|
||||
let [dummyb, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
|
||||
if ( slotb == 0 ) slotb = 10;
|
||||
if ( slota == slotb )
|
||||
{
|
||||
|
|
@ -121,11 +117,9 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
|
|||
}
|
||||
if ( usesa && usesb )
|
||||
{
|
||||
bool dummy;
|
||||
int slota, slotb;
|
||||
[dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
|
||||
let [dummya, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
|
||||
if ( slota == 0 ) slota = 10;
|
||||
[dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
|
||||
let [dummyb, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
|
||||
if ( slotb == 0 ) slotb = 10;
|
||||
if ( slota == slotb )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -535,8 +535,7 @@ Class DemolitionistMenuStoreItem : DemolitionistMenuListItem
|
|||
// formatted name
|
||||
private void UpdateLabel()
|
||||
{
|
||||
int price, amt;
|
||||
[price, amt] = GetPriceUnits();
|
||||
let [price, amt] = GetPriceUnits();
|
||||
let def = GetDefaultByType(inv);
|
||||
if ( bSell )
|
||||
{
|
||||
|
|
@ -567,8 +566,7 @@ Class DemolitionistMenuStoreItem : DemolitionistMenuListItem
|
|||
|
||||
void BuySellItem()
|
||||
{
|
||||
int price, amt;
|
||||
[price, amt] = GetPriceUnits();
|
||||
let [price, amt] = GetPriceUnits();
|
||||
if ( bSell )
|
||||
{
|
||||
EventHandler.SendNetworkEvent(String.Format("swwmstoretake.%s",inv.GetClassName()),consoleplayer,price,amt);
|
||||
|
|
|
|||
|
|
@ -392,9 +392,7 @@ Class SWWMScrollMenu : SWWMCleanMenu
|
|||
{
|
||||
let ti = ListMenuItemTextItem(itm);
|
||||
let rep = new("ListMenuItemSWWMTextItemM");
|
||||
Name c;
|
||||
int p;
|
||||
[c, p] = ti.GetAction();
|
||||
let [c, p] = ti.GetAction();
|
||||
rep.InitDirect(ti.GetX(),ti.GetY(),mDesc.mLineSpacing,ti.mHotkey,ti.mText,ti.mFont,ti.mColor,ti.mColorSelected,c,p);
|
||||
if ( (ti.mText == "$M_EPITNT") || (tntfix && (tntfix < 5)) )
|
||||
rep.mText = tutnt_ep[tntfix++];
|
||||
|
|
@ -405,9 +403,7 @@ Class SWWMScrollMenu : SWWMCleanMenu
|
|||
{
|
||||
let pi = ListMenuItemPatchItem(itm);
|
||||
let rep = new("ListMenuItemSWWMPatchItemM");
|
||||
Name c;
|
||||
int p;
|
||||
[c, p] = pi.GetAction();
|
||||
let [c, p] = pi.GetAction();
|
||||
rep.InitDirect(pi.GetX(),pi.GetY(),mDesc.mLineSpacing,pi.mHotkey,pi.mTexture,c,p);
|
||||
mDesc.mItems[i] = rep;
|
||||
pi.Destroy();
|
||||
|
|
|
|||
|
|
@ -42,13 +42,14 @@ Class Demolitionist : PlayerPawn
|
|||
|
||||
double guideangle, guidepitch, guideroll;
|
||||
|
||||
// for weapon bobbing stuff
|
||||
// for weapon bobbing and stuff
|
||||
double bumpvelz, bumpangle, bumppitch, bumproll;
|
||||
double oldangle, oldpitch, oldroll;
|
||||
double oldlagangle, oldlagpitch, oldlagroll, oldlagready;
|
||||
Vector3 oldlagvel;
|
||||
double lagangle, lagpitch, lagroll, lagready;
|
||||
Vector3 lagvel;
|
||||
|
||||
Vector3 oldangles;
|
||||
Vector3 oldlagangles, lagangles;
|
||||
Vector3 oldlagdangles, lagdangles;
|
||||
Vector3 oldlagvel, lagvel;
|
||||
double oldlagready, lagready;
|
||||
|
||||
enum EUnderType
|
||||
{
|
||||
|
|
@ -146,6 +147,8 @@ Class Demolitionist : PlayerPawn
|
|||
Player.ForwardMove 1., 1.;
|
||||
Player.SideMove 1., 1.;
|
||||
Player.SoundClass "demolitionist";
|
||||
Player.FlyBob 0.;
|
||||
Player.WaterClimbSpeed 0.;
|
||||
DamageFactor "Drowning", 0.;
|
||||
DamageFactor "Poison", 0.;
|
||||
DamageFactor "PoisonCloud", 0.;
|
||||
|
|
@ -183,6 +186,8 @@ Class Demolitionist : PlayerPawn
|
|||
Super.PostBeginPlay();
|
||||
lastground = true; // prevent sudden landing sound on map start
|
||||
blinktime = 30;
|
||||
// prevent jumpy weapon bob on game start
|
||||
oldangles = (angle,pitch,roll);
|
||||
// swap ourselves for a voodoo doll
|
||||
if ( !player || (player.mo != self) )
|
||||
{
|
||||
|
|
@ -289,23 +294,23 @@ Class Demolitionist : PlayerPawn
|
|||
{
|
||||
// snap both planes
|
||||
let q = Spawn("BustedQuake",(ceil.centerspot.x,ceil.centerspot.y,ceil.ceilingplane.ZAtPoint(ceil.centerspot)));
|
||||
q.special1 = 6;
|
||||
q.specialf1 = 6.;
|
||||
q = Spawn("BustedQuake",(flor.centerspot.x,flor.centerspot.y,flor.floorplane.ZAtPoint(flor.centerspot)));
|
||||
q.special1 = 6;
|
||||
q.specialf1 = 6.;
|
||||
SWWMCrusherBroken.Create(flor,ceil,diffh/2.);
|
||||
}
|
||||
else if ( ceilse )
|
||||
{
|
||||
// snap ceiling
|
||||
let q = Spawn("BustedQuake",(ceil.centerspot.x,ceil.centerspot.y,ceil.ceilingplane.ZAtPoint(ceil.centerspot)));
|
||||
q.special1 = 10;
|
||||
q.specialf1 = 10.;
|
||||
SWWMCrusherBroken.Create(null,ceil,diffh);
|
||||
}
|
||||
else if ( florse )
|
||||
{
|
||||
// snap floor
|
||||
let q = Spawn("BustedQuake",(flor.centerspot.x,flor.centerspot.y,flor.floorplane.ZAtPoint(flor.centerspot)));
|
||||
q.special1 = 10;
|
||||
q.specialf1 = 10.;
|
||||
SWWMCrusherBroken.Create(flor,null,diffh);
|
||||
}
|
||||
SWWMUtility.MarkAchievement("crush",player);
|
||||
|
|
@ -330,7 +335,7 @@ Class Demolitionist : PlayerPawn
|
|||
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(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<numpt; i++ )
|
||||
{
|
||||
|
|
@ -444,8 +449,8 @@ Class Demolitionist : PlayerPawn
|
|||
return SWWMUtility.LerpVector2(prevbob,bob,ticfrac)*bobstr*clamp(viewbob,0.,1.5);
|
||||
}
|
||||
|
||||
// [4.11] proper 3D/2D weapon bob separation
|
||||
/*override Vector3, Vector3 BobWeapon3D( double ticfrac )
|
||||
// proper 3D weapon bob
|
||||
override Vector3, Vector3 BobWeapon3D( double ticfrac )
|
||||
{
|
||||
if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob )
|
||||
return (0,0,0), (0,0,0);
|
||||
|
|
@ -453,33 +458,26 @@ 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 froll = SWWMUtility.Lerp(oldroll,roll,ticfrac);
|
||||
double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac);
|
||||
double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac);
|
||||
double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac);
|
||||
double diffang = fangle-flagangle;
|
||||
double diffpitch = fpitch-flagpitch;
|
||||
double diffroll = froll-flagroll;
|
||||
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;
|
||||
}
|
||||
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"));
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<ORIG_FRICTION)?movefactor:ORIG_FRICTION_FACTOR;
|
||||
if ( !player.onground && !bNoGravity )
|
||||
{
|
||||
|
|
@ -379,8 +376,8 @@ extend Class Demolitionist
|
|||
else lastairtic = level.maptime;
|
||||
if ( !(player.cheats & CF_PREDICTING) && !(player.cmd.forwardmove|player.cmd.sidemove) )
|
||||
PlayIdle();
|
||||
Vector3 dodge = (0,0,0), x, y, z;
|
||||
[x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
Vector3 dodge = (0,0,0);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
int fm = player.cmd.forwardmove;
|
||||
int sm = player.cmd.sidemove;
|
||||
if ( !(fm|sm) ) fm = 1;
|
||||
|
|
|
|||
|
|
@ -8,9 +8,7 @@ extend Class Demolitionist
|
|||
FLineTraceData d;
|
||||
LineTrace(angle,DEFMELEERANGE*2,pitch,TRF_THRUACTORS,player.viewheight,data:d);
|
||||
if ( d.HitType == TRACE_HitNone ) return;
|
||||
bool remove;
|
||||
TextureID replacewith;
|
||||
[remove, replacewith] = SWWMUtility.DefaceTexture(d.HitTexture);
|
||||
let [remove, replacewith] = SWWMUtility.DefaceTexture(d.HitTexture);
|
||||
if ( !remove ) return;
|
||||
if ( (d.HitType != TRACE_HitWall) || !d.HitLine.special || !(d.HitLine.activation&SPAC_Use) )
|
||||
player.usedown = true;
|
||||
|
|
@ -160,8 +158,8 @@ extend Class Demolitionist
|
|||
if ( player.usedown )
|
||||
return;
|
||||
if ( !itrace ) itrace = new("SWWMItemTracer");
|
||||
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);
|
||||
Sector os = level.PointInSector(origin.xy);
|
||||
int rings = 1;
|
||||
|
|
@ -172,7 +170,7 @@ extend Class Demolitionist
|
|||
for ( int j=0; j<360; j+=(360/rings) )
|
||||
{
|
||||
dir = SWWMUtility.ConeSpread(x,y,z,j,i);
|
||||
itrace.Trace(origin,os,dir,UseRange,0);
|
||||
itrace.Trace(origin,os,dir,UseRange,0,ignore:self);
|
||||
if ( itrace.Results.HitType != TRACE_HitActor ) continue;
|
||||
if ( ignoreme.Find(itrace.Results.HitActor) < ignoreme.Size() ) continue;
|
||||
player.usedown = true; // we found an item, ignore further uses
|
||||
|
|
@ -188,7 +186,7 @@ extend Class Demolitionist
|
|||
if ( !mtrace ) mtrace = new("SWWMMirrorTracer");
|
||||
Vector3 dir = SWWMUtility.GetPlayerAimDir(self);
|
||||
Vector3 origin = SWWMUtility.GetPlayerEye(self);
|
||||
mtrace.Trace(origin,level.PointInSector(origin.xy),dir,UseRange,0);
|
||||
mtrace.Trace(origin,level.PointInSector(origin.xy),dir,UseRange,0,ignoreallactors:true);
|
||||
if ( mtrace.Results.HitType != TRACE_HitWall ) return false;
|
||||
// there's a mirror here
|
||||
if ( (gametic > 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--;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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<gibsize; i++ )
|
||||
{
|
||||
if ( bloodthrottle && (!i || (i%bloodthrottle)) ) continue;
|
||||
a = Spawn("mkBloodSmoke2",pos+(FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height));
|
||||
let a = Spawn("mkBloodSmoke2",pos+(FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height));
|
||||
ang = FRandom[Gibs](0,360);
|
||||
pt = FRandom[Gibs](-90,90);
|
||||
dir = SWWMUtility.Vec3FromAngles(ang,pt);
|
||||
|
|
@ -707,7 +705,8 @@ Class mkGibber : SWWMNonInteractiveActor
|
|||
for ( int i=0; i<gibsize; i++ )
|
||||
{
|
||||
if ( gibthrottle && (!i || (i%gibthrottle)) ) continue;
|
||||
[dummy, a] = A_SpawnItemEx(gibtype,FRandom[Gibs](-.5,.5)*radius,FRandom[Gibs](-.5,.5)*radius,FRandom[Gibs](.1,.9)*height,flags:SXF_ABSOLUTEANGLE|SXF_USEBLOODCOLOR);
|
||||
let [b, a] = A_SpawnItemEx(gibtype,FRandom[Gibs](-.5,.5)*radius,FRandom[Gibs](-.5,.5)*radius,FRandom[Gibs](.1,.9)*height,flags:SXF_ABSOLUTEANGLE|SXF_USEBLOODCOLOR);
|
||||
if ( !b ) continue;
|
||||
a.translation = translation;
|
||||
a.CopyBloodColor(self);
|
||||
a.scale *= scale.x;
|
||||
|
|
@ -724,7 +723,8 @@ Class mkGibber : SWWMNonInteractiveActor
|
|||
for ( int i=0; i<gibsize; i++ )
|
||||
{
|
||||
if ( bloodthrottle && (!i || (i%bloodthrottle)) ) continue;
|
||||
[dummy, a] = A_SpawnItemEx("mkBloodDrop",FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height,flags:SXF_ABSOLUTEANGLE|SXF_USEBLOODCOLOR);
|
||||
let [b, a] = A_SpawnItemEx("mkBloodDrop",FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height,flags:SXF_ABSOLUTEANGLE|SXF_USEBLOODCOLOR);
|
||||
if ( !b ) continue;
|
||||
ang = FRandom[Gibs](0,360);
|
||||
pt = FRandom[Gibs](-90,90);
|
||||
dir = SWWMUtility.Vec3FromAngles(ang,pt);
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ Class SWWMQuickCombatTracker : Inventory
|
|||
realtag = Owner.GetClassName();
|
||||
SWWMUtility.BeautifyClassName(realtag);
|
||||
}
|
||||
mytag = Owner.player?(Owner.player.mo!=Owner)?multiplayer?String.Format(StringTable.Localize("$FN_VOODOO"),Owner.player.GetUserName()):StringTable.Localize("$FN_VOODOO_NP"):Owner.player.GetUserName():((Owner is 'PlayerPawn')&&(!Owner.player))?StringTable.Localize("$FN_VOODOO_NP"):realtag;
|
||||
mytag = Owner.player?(Owner.player.mo!=Owner)?multiplayer?String.Format(StringTable.Localize("$FN_VOODOO"),Owner.player.GetUserName()):StringTable.Localize("$FN_VOODOO_NP"):Owner.player.GetUserName():(Owner is 'PlayerPawn')?StringTable.Localize("$FN_VOODOO_NP"):realtag;
|
||||
}
|
||||
else mytag = "";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -984,7 +984,7 @@ Class SWWMPickupFlash : SWWMNonInteractiveActor
|
|||
// needed since cube roots scale very badly when there's thousands of these on the map
|
||||
private static double AlphaCubeRoot( double alpha )
|
||||
{
|
||||
double lut[256] =
|
||||
static const double lut[] =
|
||||
{
|
||||
0.000000000, 0.250244738, 0.297592823, 0.329340597, 0.353899503, 0.374203165, 0.391654181, 0.407042226,
|
||||
0.420859807, 0.433436601, 0.445005066, 0.455735780, 0.465757939, 0.475171947, 0.484057512, 0.492479061,
|
||||
|
|
@ -1187,15 +1187,13 @@ Class SWWMBulletTrail : LineTracer
|
|||
{
|
||||
Array<WaterHit> WaterHitList;
|
||||
Array<Line> 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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<LIEntry> 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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<cf.clines.Size(); i++ )
|
||||
cf.clines[i].Activate(user,cf.csides[i],SPAC_Cross);
|
||||
|
|
@ -205,15 +209,26 @@ Class SWWMWeapon : Weapon abstract
|
|||
Demolitionist(self).lastbump *= factor;
|
||||
}
|
||||
|
||||
action void A_BumpView( double factor, Vector3 dir = (0,0,0) )
|
||||
action void A_BumpView( double factor, Vector3 dir = (0,0,0), int tics = 0 )
|
||||
{
|
||||
if ( !(self is 'Demolitionist') ) return;
|
||||
Demolitionist(self).BumpView(factor,dir);
|
||||
if ( tics > 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<cf.clines.Size(); i++ )
|
||||
cf.clines[i].Activate(user,cf.csides[i],SPAC_Cross);
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ Class PunchImpact : SWWMNonInteractiveActor
|
|||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_QuakeEx(2,2,2,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3);
|
||||
A_QuakeEx(2.,2.,2.,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3);
|
||||
A_StartSound("demolitionist/punch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
|
||||
A_SprayDecal(GetTag(),-20);
|
||||
int numpt = Random[Ponch](5,10);
|
||||
|
|
@ -232,7 +232,7 @@ Class BigPunchImpact : SWWMNonInteractiveActor
|
|||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_QuakeEx(8,8,8,18,0,600,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.9);
|
||||
A_QuakeEx(8.,8.,8.,18,0,600,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollIntensity:.9);
|
||||
A_StartSound("demolitionist/xpunch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
|
||||
A_SprayDecal("BigWallCrack",-20);
|
||||
int numpt = Random[Ponch](9,16);
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ Class ParryField : SWWMNonInteractiveActor
|
|||
i.angle = atan2(dir.y,dir.x);
|
||||
i.pitch = asin(-dir.z);
|
||||
i.bAMBUSH = true;
|
||||
A_QuakeEx(3,3,3,10,0,64,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
||||
A_QuakeEx(3.,3.,3.,10,0,64,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
||||
A_StartSound("demolitionist/parry",CHAN_WEAPON);
|
||||
if ( special1 >= special2 ) // perfect parry
|
||||
{
|
||||
|
|
@ -283,7 +283,6 @@ Class MHitList
|
|||
|
||||
Class MeleeTracer : LineTracer
|
||||
{
|
||||
Actor ignoreme;
|
||||
Array<MHitList> 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<Actor> 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);
|
||||
|
|
|
|||
|
|
@ -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<HHitList> 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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<numpt; i++ )
|
||||
{
|
||||
|
|
@ -131,6 +131,11 @@ Class Ynykron : SWWMWeapon
|
|||
Owner.A_SoundVolume(CHAN_WEAPONEXTRA2,(.025*chargelevel)**3.);
|
||||
}
|
||||
if ( Owner.player.ReadyWeapon != self ) return;
|
||||
if ( (chargelevel > 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);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
Class YnykronAltTracer : LineTracer
|
||||
{
|
||||
Actor ignore;
|
||||
Array<Line> ShootThroughList;
|
||||
Array<WaterHit> 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<numpt; i++ )
|
||||
|
|
@ -379,10 +377,9 @@ Class YnykronLightningArc : 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);
|
||||
|
|
@ -398,15 +395,12 @@ Class YnykronLightningArc : SWWMNonInteractiveActor
|
|||
Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector;
|
||||
if ( t.Results.HitType != TRACE_HitNone )
|
||||
{
|
||||
if ( t.Results.HitType != TRACE_HasHitSky )
|
||||
{
|
||||
if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos);
|
||||
let s = Spawn("YnykronLightningImpact",level.Vec3Offset(t.Results.HitPos,normal*8));
|
||||
s.target = target;
|
||||
s.angle = atan2(normal.y,normal.x);
|
||||
s.pitch = asin(-normal.z);
|
||||
if ( swwm_omnibust ) BusterWall.Bust(t.Results,GetMissileDamage(0,0),target,t.Results.HitVector,t.Results.HitPos.z);
|
||||
}
|
||||
if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos);
|
||||
let s = Spawn("YnykronLightningImpact",level.Vec3Offset(t.Results.HitPos,normal*8));
|
||||
s.target = target;
|
||||
s.angle = atan2(normal.y,normal.x);
|
||||
s.pitch = asin(-normal.z);
|
||||
if ( swwm_omnibust ) BusterWall.Bust(t.Results,GetMissileDamage(0,0),target,t.Results.HitVector,t.Results.HitPos.z);
|
||||
nextpos = t.Results.HitPos;
|
||||
bAMBUSH = true;
|
||||
speed = t.Results.Distance; // shortens in minimap
|
||||
|
|
@ -453,8 +447,7 @@ Class YnykronLightningArc : SWWMNonInteractiveActor
|
|||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
let r = Spawn("YnykronLightningArcSub",level.Vec3Offset(pos,tdir*FRandom[Ynykron](0,1)));
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll);
|
||||
double a = FRandom[Ynykron](0,360), s = FRandom[Sparkster](0.,1.);
|
||||
Vector3 sdir = SWWMUtility.ConeSpread(x,y,z,a,s);
|
||||
r.angle = atan2(sdir.y,sdir.x);
|
||||
|
|
@ -659,8 +652,7 @@ Class SimpleMoveTracer : 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_BLOCKPROJECTILE) )
|
||||
return TRACE_Stop;
|
||||
|
|
@ -993,7 +985,7 @@ Class YnykronSingularity : SWWMNonInteractiveActor
|
|||
Vector3 dir = vel;
|
||||
double dist = vel.length();
|
||||
dir /= dist;
|
||||
mt.Trace(pos,CurSector,dir,dist,0);
|
||||
mt.Trace(pos,CurSector,dir,dist,0,ignoreallactors:true);
|
||||
if ( mt.Results.HitType == TRACE_HitNone ) newpos = level.Vec3Offset(pos,vel);
|
||||
else newpos = level.Vec3Offset(mt.Results.HitPos,-mt.Results.HitVector);
|
||||
if ( level.IsPointInLevel(newpos) )
|
||||
|
|
@ -1246,7 +1238,7 @@ Class YnykronSingularity : SWWMNonInteractiveActor
|
|||
A_ChangeLinkFlags(true); // unlink from blockmap
|
||||
A_AlertMonsters(0,AMF_EMITFROMTARGET);
|
||||
SWWMUtility.DoExplosion(self,int.max,500000,800,400);
|
||||
A_QuakeEx(8,8,8,100,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.6);
|
||||
A_QuakeEx(8.,8.,8.,100,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:1.6);
|
||||
A_StopAllSounds();
|
||||
A_StartSound("ynykron/vortexend",CHAN_VOICE,attenuation:0.);
|
||||
FlashPlayer(250,9000);
|
||||
|
|
@ -1274,7 +1266,7 @@ Class YnykronSingularity : SWWMNonInteractiveActor
|
|||
special1++;
|
||||
if ( special1 > 60 )
|
||||
{
|
||||
if ( IsActorPlayingSound(CHAN_VOICE,-1) ) return;
|
||||
if ( IsActorPlayingSound(CHAN_VOICE) ) return;
|
||||
for ( int i=0; i<MAXBEAMS; i++ ) if ( beamers[i] ) return;
|
||||
Destroy();
|
||||
return;
|
||||
|
|
@ -1342,10 +1334,9 @@ Class YnykronAltBeam : SWWMNonInteractiveActor
|
|||
{
|
||||
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||
let t = new("YnykronAltTracer");
|
||||
t.ignore = target;
|
||||
t.ShootThroughList.Clear();
|
||||
t.WaterHitList.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);
|
||||
|
|
@ -1366,13 +1357,6 @@ Class YnykronAltBeam : SWWMNonInteractiveActor
|
|||
b.A_SetRenderStyle(b.alpha*.3,STYLE_Subtract);
|
||||
b.vel += x*FRandom[Ynykron](-.2,.4);
|
||||
}
|
||||
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
|
||||
|
|
@ -1507,7 +1491,7 @@ Class YnykronAltShot : SWWMNonInteractiveActor
|
|||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
A_QuakeEx(4,4,4,80,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:.8);
|
||||
A_QuakeEx(4.,4.,4.,80,0,65535,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65535,rollIntensity:.8);
|
||||
A_StartSound("ynykron/altbeam",CHAN_VOICE,CHANF_DEFAULT,1.,0.);
|
||||
FlashPlayer(240,8000);
|
||||
let b = Spawn("YnykronAltBeam",pos);
|
||||
|
|
@ -1522,7 +1506,7 @@ Class YnykronAltShot : SWWMNonInteractiveActor
|
|||
freezetics--;
|
||||
return;
|
||||
}
|
||||
if ( isFrozen() || IsActorPlayingSound(CHAN_VOICE,-1) ) return;
|
||||
if ( isFrozen() || IsActorPlayingSound(CHAN_VOICE) ) return;
|
||||
Destroy();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -375,7 +375,7 @@ Class YnykronImpact : SWWMNonInteractiveActor
|
|||
{
|
||||
Super.PostBeginPlay();
|
||||
rad = args[0]+300+10*clamp(special1/10,0,15);
|
||||
A_QuakeEx(4,4,4,50,0,rad*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:rad*2,rollintensity:.6);
|
||||
A_QuakeEx(4.,4.,4.,50,0,rad*4,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:rad*2,rollintensity:.6);
|
||||
FlashPlayer(60,1200);
|
||||
if ( tracer )
|
||||
{
|
||||
|
|
@ -523,7 +523,6 @@ Class YnykronImpact : SWWMNonInteractiveActor
|
|||
|
||||
Class YnykronTracer : LineTracer
|
||||
{
|
||||
Actor ignore;
|
||||
Array<Line> ShootThroughList;
|
||||
Array<WaterHit> WaterHitList;
|
||||
Array<HitListEntry> 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();
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
Class DeepTracer : LineTracer
|
||||
{
|
||||
Actor ignoreme;
|
||||
Array<Actor> hitlist;
|
||||
Array<double> hitdist;
|
||||
Array<double> 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<THitList> 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<t.hitlist.Size(); k++ )
|
||||
{
|
||||
|
|
@ -252,6 +253,8 @@ Class DeepImpact : SWWMWeapon
|
|||
{
|
||||
invoker.failtime = gametic+32;
|
||||
A_StartSound("deepimpact/dryaltfire",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_BumpView(-.05);
|
||||
A_QuakeEx(.1,.1,.1,2,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.05);
|
||||
}
|
||||
|
||||
action void A_AltBullet()
|
||||
|
|
@ -259,17 +262,18 @@ Class DeepImpact : SWWMWeapon
|
|||
let weap = Weapon(invoker);
|
||||
if ( !weap ) return;
|
||||
A_StopSound(CHAN_WEAPONEXTRA);
|
||||
A_QuakeEx(6,6,6,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.7);
|
||||
A_BumpFOV(.85);
|
||||
A_BumpView(-5);
|
||||
A_QuakeEx(6.,6.,6.,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.7);
|
||||
A_StartSound("deepimpact/altfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.5);
|
||||
A_AlertMonsters(swwm_uncapalert?0:8000);
|
||||
A_PlayerFire();
|
||||
invoker.clipcount = 0;
|
||||
Vector3 x, x2, y2, z2;
|
||||
x = SWWMUtility.GetPlayerViewDir(self);
|
||||
Vector3 x = SWWMUtility.GetPlayerViewDir(self);
|
||||
SWWMUtility.DoKnockback(self,-x,42000.);
|
||||
Vector3 origin = SWWMUtility.GetFireOffset(self,10,2,-3);
|
||||
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);
|
||||
let p = Spawn("AirBullet",origin);
|
||||
p.target = self;
|
||||
|
|
@ -294,14 +298,14 @@ Class DeepImpact : SWWMWeapon
|
|||
{
|
||||
invoker.clipcount = min(invoker.default.clipcount,invoker.clipcount+25);
|
||||
A_StartSound("deepimpact/reload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_QuakeEx(1,1,1,7,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.05);
|
||||
A_QuakeEx(.3,.3,.3,7,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.05);
|
||||
invoker.wastecycle = 0;
|
||||
}
|
||||
|
||||
action void A_NoCrank()
|
||||
{
|
||||
A_StartSound("deepimpact/noreload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.05);
|
||||
A_QuakeEx(.2,.2,.2,2,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.05);
|
||||
invoker.wastecycle++;
|
||||
let s = Demolitionist(self).mystats;
|
||||
if ( s.deepegg < 4 )
|
||||
|
|
@ -337,6 +341,7 @@ Class DeepImpact : SWWMWeapon
|
|||
Default
|
||||
{
|
||||
Tag "$T_DEEPIMPACT";
|
||||
Inventory.Icon "graphics/HUD/Icons/W_DeepImpact.png";
|
||||
Inventory.PickupMessage "$I_DEEPIMPACT";
|
||||
Obituary "$O_DEEPIMPACT_WEAK";
|
||||
SWWMWeapon.Tooltip "$TT_DEEPIMPACT";
|
||||
|
|
@ -359,7 +364,10 @@ Class DeepImpact : SWWMWeapon
|
|||
Stop;
|
||||
Select:
|
||||
XZW2 I 2 A_FullRaise();
|
||||
XZW2 JKLMNOP 2;
|
||||
XZW2 J 2 A_BumpView(.2,tics:2);
|
||||
XZW2 KL 2 A_BumpView(-.2,tics:2);
|
||||
XZW2 MN 2 A_BumpView(-.1,tics:2);
|
||||
XZW2 OP 2 A_BumpView(.1,tics:2);
|
||||
Goto Ready;
|
||||
Ready:
|
||||
XZW2 A 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWUSER1|WRF_ALLOWZOOM);
|
||||
|
|
@ -391,7 +399,7 @@ Class DeepImpact : SWWMWeapon
|
|||
Goto Ready;
|
||||
AltRelease:
|
||||
XZW2 V 1 A_AltBullet();
|
||||
XZW2 W 1;
|
||||
XZW2 W 1 A_BumpView(.15,tics:15);
|
||||
XZW2 X 2;
|
||||
XZW2 YZ 3;
|
||||
XZW3 AB 5;
|
||||
|
|
@ -401,36 +409,45 @@ Class DeepImpact : SWWMWeapon
|
|||
Reload:
|
||||
XZW2 A 0 A_JumpIf(invoker.clipcount>=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<invoker.default.clipcount),"ReloadHold");
|
||||
XZW3 K 2 A_StartSound("deepimpact/reloadend",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 RSTUV 2;
|
||||
XZW3 RSTUV 2 A_BumpView(.1,tics:2);
|
||||
Goto Ready;
|
||||
NoReload:
|
||||
XZW2 A 2 A_StartSound("deepimpact/reloadbeg",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 HIJ 2;
|
||||
XZW3 HIJ 2 A_BumpView(.1,tics:2);
|
||||
NoReloadHold:
|
||||
XZW3 K 2 A_NoCrank();
|
||||
XZW3 L 2;
|
||||
XZW3 M 5;
|
||||
XZW3 K 2
|
||||
{
|
||||
A_NoCrank();
|
||||
A_BumpView(-.1,tics:2);
|
||||
}
|
||||
XZW3 L 2 A_BumpView(-.2,tics:2);
|
||||
XZW3 M 5 A_BumpView(-.2,tics:2);
|
||||
XZW3 L 3;
|
||||
XZW3 K 2 A_StartSound("deepimpact/reloadend",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 RSTUV 2;
|
||||
XZW3 RSTUV 2 A_BumpView(.1,tics:2);
|
||||
Goto Ready;
|
||||
Zoom:
|
||||
XZW2 A 3
|
||||
{
|
||||
A_StartSound("deepimpact/checkout",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_PlayerCheckGun();
|
||||
A_BumpView(.2,tics:3);
|
||||
}
|
||||
XZW3 WXYZ 3;
|
||||
XZW4 AB 4;
|
||||
XZW4 CD 3;
|
||||
XZW4 EFG 2;
|
||||
XZW3 WXYZ 3 A_BumpView(-.2,tics:3);
|
||||
XZW4 AB 4 A_BumpView(-.1,tics:4);
|
||||
XZW4 CD 3 A_BumpView(.2,tics:3);
|
||||
XZW4 EFG 2 A_BumpView(.1,tics:2);
|
||||
Goto Ready;
|
||||
User1:
|
||||
XZW2 A 2
|
||||
|
|
@ -438,17 +455,33 @@ Class DeepImpact : SWWMWeapon
|
|||
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_PlayerMelee();
|
||||
}
|
||||
XZW4 H 2 A_StartSound("demolitionist/reloadbeg",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW4 H 2
|
||||
{
|
||||
A_BumpView(.5,tics:4);
|
||||
A_StartSound("demolitionist/reloadbeg",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
}
|
||||
XZW4 I 2;
|
||||
XZW4 J 1 A_Parry(9);
|
||||
XZW4 KLM 1;
|
||||
XZW4 J 1
|
||||
{
|
||||
A_BumpFOV(.98);
|
||||
A_QuakeEx(.5,.5,.5,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
||||
A_Parry(9);
|
||||
}
|
||||
XZW4 KLM 1 A_BumpView(-1);
|
||||
XZW4 N 4 A_Melee(60,"demolitionist/whits");
|
||||
XZW4 O 3 { invoker.PlayUpSound(self); }
|
||||
XZW4 PQRSTUV 2;
|
||||
Goto Ready;
|
||||
Deselect:
|
||||
XZW2 A 2 A_StartSound("deepimpact/deselect",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW2 BCDEFGHI 2;
|
||||
XZW2 A 2
|
||||
{
|
||||
A_StartSound("deepimpact/deselect",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_BumpView(-.2,tics:2);
|
||||
}
|
||||
XZW2 BC 2 A_BumpView(-.1,tics:2);
|
||||
XZW2 DE 2 A_BumpView(-.1,tics:2);
|
||||
XZW2 FG 2 A_BumpView(.1,tics:2);
|
||||
XZW2 H 2 A_BumpView(.2,tics:2);
|
||||
XZW2 I -1 A_FullLower();
|
||||
Stop;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ Class AirBullet : FastProjectile
|
|||
SWWMUtility.DoKnockback(target,dir,mm);
|
||||
}
|
||||
SWWMUtility.DoExplosion(self,20,80000,200,80,DE_NONEXPLOSIVE,ignoreme:target);
|
||||
A_QuakeEx(6,6,6,20,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.);
|
||||
A_QuakeEx(6.,6.,6.,20,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.);
|
||||
A_StartSound("deepimpact/bullethit",CHAN_VOICE,CHANF_DEFAULT,1.,.3);
|
||||
A_SprayDecal("ImpactMark");
|
||||
Spawn("AirBulletLight",pos);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
Class SpreadgunTracer : LineTracer
|
||||
{
|
||||
Actor ignoreme;
|
||||
Array<HitListEntry> hitlist;
|
||||
Array<Line> shootthroughlist;
|
||||
Array<WaterHit> 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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<numpt; i++ )
|
||||
|
|
@ -252,7 +252,7 @@ Class BigBiospark : Actor
|
|||
A_StopSound(CHAN_VOICE);
|
||||
A_AlertMonsters(swwm_uncapalert?0:15000,AMF_EMITFROMTARGET);
|
||||
SWWMUtility.DoExplosion(self,250,90000,300,100,flags:DE_HOWL);
|
||||
A_QuakeEx(9,9,9,30,0,1400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollIntensity:1.5);
|
||||
A_QuakeEx(9.,9.,9.,30,0,1400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollIntensity:1.5);
|
||||
A_StartSound("biospark/bighit",CHAN_ITEM,attenuation:.4);
|
||||
A_StartSound("biospark/bighit",CHAN_WEAPON,attenuation:.3);
|
||||
A_SprayDecal("ShockMarkBig",172);
|
||||
|
|
@ -410,6 +410,7 @@ Class BiosparkBall : Actor
|
|||
+EXPLODEONWATER;
|
||||
+FORCEXYBILLBOARD;
|
||||
+NOFRICTION;
|
||||
+SKYEXPLODE;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
|
|
@ -517,7 +518,7 @@ Class BiosparkBall : Actor
|
|||
A_StopSound(CHAN_VOICE);
|
||||
A_AlertMonsters(swwm_uncapalert?0:5000,AMF_EMITFROMTARGET);
|
||||
SWWMUtility.DoExplosion(self,50,20000,150,80,flags:DE_HOWL);
|
||||
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);
|
||||
A_StartSound("biospark/hit",CHAN_ITEM,attenuation:.8);
|
||||
A_StartSound("biospark/hit",CHAN_WEAPON,attenuation:.6);
|
||||
A_SprayDecal("ShockMark",172);
|
||||
|
|
@ -631,7 +632,6 @@ Class BiosparkBall : Actor
|
|||
|
||||
Class BiosparkTracer : LineTracer
|
||||
{
|
||||
Actor ignoreme;
|
||||
Array<HitListEntry> hitlist;
|
||||
Array<Line> 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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -59,7 +59,6 @@ Class HitListEntry
|
|||
|
||||
Class CandyBeamTracer : LineTracer
|
||||
{
|
||||
Actor ignoreme;
|
||||
Array<HitListEntry> hitlist;
|
||||
Array<Line> 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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||