Merge branch 'experimental' into devel

I can't be bothered to keep these two separate anymore, it's annoying.
This commit is contained in:
Mari the Deer 2023-07-29 15:05:24 +02:00
commit e85883f2bb
98 changed files with 1732 additions and 1149 deletions

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

View file

@ -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).";

View file

@ -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).";

View file

@ -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-";

View file

@ -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
View 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;
}

View file

@ -1,4 +1,4 @@
version "4.10"
version "4.11"
/*
DEMOLITIONIST Main Codebase

View file

@ -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";

View file

@ -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;
}

View file

@ -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 )
{

View file

@ -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);

View file

@ -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:

View file

@ -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);

View file

@ -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();

View file

@ -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);

View file

@ -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);
}

View file

@ -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" )

View file

@ -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);

View file

@ -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);

View file

@ -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");

View file

@ -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++ )
{

View file

@ -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")

View file

@ -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 )
{

View file

@ -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 )

View file

@ -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);

View file

@ -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();

View file

@ -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;

View file

@ -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

View file

@ -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);
}

View file

@ -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.;
}
}
}

View file

@ -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);

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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 )
{

View file

@ -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);

View file

@ -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();

View file

@ -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"));

View file

@ -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 )

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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--;

View file

@ -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));

View file

@ -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);

View file

@ -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 = "";
}

View file

@ -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
{

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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));
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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:

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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();

View file

@ -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;
}

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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:

View file

@ -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);

View file

@ -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;

View file

@ -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();