0.9.8b release:

- Crouched gesture animations.
 - Proper crouch-jumping (now always enabled).
 - New fanart by Endie.
 - Swimming animations (also used by flight).
 - Hexen-style startup screen.
 - More model cleanup.
 - Prevent Wallbuster reload menu from opening on intermissions.
 - Intermissions now only handle fire and use for advance, to prevent some lil' accidents.
 - Holding altfire on intermissions hides ui elements, so the bg is fully visible.
 - Begin writing lore for collectibles (these will come in a couple updates).
 - Fix fuzz shader being affected by texture upscaling.
 - Enemies with >=1000 starting hp also can drop golden shells.
 - Explodium Gun no longer shows with a "1x" prefix on menus when single.
 - Player animation transition tweaks.
This commit is contained in:
Mari the Deer 2020-09-24 14:05:04 +02:00
commit 65db7e8367
73 changed files with 561 additions and 76 deletions

1
NETNOTCH.dat Normal file
View file

@ -0,0 +1 @@
<EFBFBD><EFBFBD>鈿鈿鈿鈿鈿鈿鈿鈿鈿鈿鈿鈿<EFBFBD><EFBFBD>w

1
NOTCH.dat Normal file
View file

@ -0,0 +1 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>镲镲镲镲铑铑铑铑揶揶揶揶眄眄眄眄葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺眄眄眄眄揶揶揶揶眄眄眄眄铑铑铑铑铑铑铑铑镲镲镲镲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>镲镲镲镲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

BIN
STARTUP.dat Normal file

Binary file not shown.

View file

@ -1,7 +1,5 @@
**Not so fundamental things during first beta:**
- Extra Demolitionist animations (swimming, additional gestures)
- Quick grenade function (Explodium Mag)
- Fun options
- Omnibusting (all weapons can bust walls)
- Infinite fuel

View file

@ -19,6 +19,7 @@ Most of the work here is original, but there are some notable exceptions:
- This mod uses libeye, by KeksDose. Big thanks.
- Title theme, "Traumatic State", by Teque (which a lot of people just know as "the AS-Golgotha music").
- Intermission theme, "Dragony", also by Teque (very comfy music considering the rest of his repertoire).
- Startup theme, "Hidden Tune #242", also by Teque too (super comfy music, ideal for this use, especially when the load times may be long).
- The anti-BD feature uses art and music by IOSYS, art was edited into the Doom palette.
- The crash handler uses a sound bit from Umineko and a short clip of the Curb Your Enthusiasm theme.
- Tewi font by lucy (https://github.com/lucy/tewi-font). Modified to add gradients and drop shadow.
@ -33,4 +34,5 @@ Most of the work here is original, but there are some notable exceptions:
* Captain J (@Jho7835)
* Redead-ITA
* Sgt. Shivers (@Sgt_Shivers_)
* Moa Dixøn / Endie (@MoaDixon)
- A certain hidden easter egg / meme uses crappified/bassboosted edits of Old Days and the CBT Wikipedia article.

View file

@ -63,7 +63,6 @@ user bool swwm_fuzz = true; // allows toggling the fuzz shader on the demoliti
user bool swwm_cbtpause = true; // wallbuster menu pauses the game
user noarchive int swwm_cbtmeme = 0; // easter egg, hidden cvar
user noarchive bool swwm_cbttime = false; // debug: times how long a reload takes
server bool swwm_crouchjump = false; // allows crouch-jumping (which looks weird af but some maps may need it)
user noarchive int swwm_cbtlast = 0; // last selected ammo for the wallbuster
server bool swwm_cbtall = true; // wallbuster breaks any wall, not just movable ones
server bool swwm_doomfall = false; // monsters take fall damage outside of hexen

6
gameinfo.txt Normal file
View file

@ -0,0 +1,6 @@
STARTUPCOLORS = "FF FF FF", "80 40 FF"
STARTUPTITLE = "Some Weird Weapons Mod: GZDoom Edition"
STARTUPTYPE = "Hexen"
STARTUPSONG = "music/H2I4D2E.XM"
LOADLIGHTS = 1
LOADBRIGHTMAPS = 1

View file

@ -5,7 +5,7 @@ HardwareShader Texture "graphics/HUD/HealthBarS.png"
}
HardwareShader Texture "graphics/HUD/EnemyBarS.png"
{
Shader "shaders/glsl/Fuzz_Gray.fp"
Shader "shaders/glsl/Fuzz_GraySmall.fp"
Texture "noisetex" "textures/graynoise.png"
}
HardwareShader Texture "graphics/tempbg.png"

BIN
graphics/Fanart/Endie.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

View file

@ -82,8 +82,34 @@ T_RAGEKIT = "Ragekit";
T_REFRESHER = "Refresher";
T_SANDWICH = "Grilled Cheese Sandwich";
T_WARARMOR = "War Armor";
T_FROGGY = "Froggy Chair";
T_BARRIER = "Elemental Coating";
T_FROGGY = "Froggy Chair";
T_SEXROBOT1 = "Saya Miyamoto - My Maid Is A Sex Robot Vol. 1";
T_SEXROBOT2 = "Saya Miyamoto - My Maid Is A Sex Robot Vol. 2";
T_SEXROBOT3 = "Saya Miyamoto - My Maid Is A Sex Robot Vol. 3";
T_MOTHPLUSH = "Mashiro Plushie";
T_BLACKRATS = "The Black Rat's Coven - Walpurgisnacht";
T_AKARIPROJECT = "Saya Miyamoto - The Akari Project";
T_CATCATCHER = "Cat Catcher Promotional Poster";
T_LOVESIGNALS = "Meidobot - Love Signals";
T_NUTATCO = "Nutatco™ Chocolate Bar";
T_HEGE = "Hege Cactus";
T_RAIDEMIN = "Raidemin Action Figure";
T_FRISPYCORN = "Frispy™ Tasty Corn Snack";
T_HOAGIE = "Hoagie";
T_LITHIUM = "Lithium - Volume One";
T_PISS = "PISS Whiskey";
T_DEMOPLUSH = "Demolitionist Plushie";
T_FIREMACE = "Firemace";
T_DOOMFIG = "Doomguy Action Figure";
T_TOMEPOWER = "Tyketto's Tome of Power";
T_YEFLASK = "Quartz Flask";
T_SAYABEAN = "Haunted Saya Bean Plush";
T_PUZZLEBOOK = "Lord Vilkreath - Fundamentals of Puzzle Design";
T_PEACH = "Toot Froot™ Peach Juice";
T_MILKBREAD = "Akkouxhei Milk Bread";
T_OBELISK = "Obelisk of the Golden Vale";
T_KIRINMANGA = "Saya Miyamoto - I Married A Cherry Boy Emperor But It Turns Out He's Really Cute In Lingerie?!";
// colored tags for keys
T_REDCARD = "\cgRed Keycard\c-";
T_BLUECARD = "\chBlue Keycard\c-";
@ -898,9 +924,10 @@ SWWM_INTERTIP39 = "If you experience slowdowns when many sound effects are playi
SWWM_INTERTIP40 = "Item Sense can help you detect items that would be otherwise hard to see among the chaos of an after-battle corpse pile. With an Omnisight, you can even see where items are through walls!";
// intermission fanart
SWWM_FANART = "Art: ";
SWWM_NFANART = "4";
SWWM_NFANART = "5";
SWWM_FANART1 = "S20TBL.jpg;Substance20 (@S20_TBL)";
SWWM_FANART2 = "CaptainJ.png;Captain J (@Jho7835)";
SWWM_FANART3 = "RedeadITA.png;Redead-ITA";
SWWM_FANART4 = "Shivers.png;Sgt. Shivers (@Sgt_Shivers_)";
SWWM_FANART5 = "Endie.jpg;Moa Dixøn / Endie (@MoaDixon)";
// intermission 4komas (TBD)

View file

@ -105,7 +105,6 @@ SWWM_GZSCALE = "Use GZDoom Setting";
SWWM_BLOOD = "Enable Custom Blood";
SWWM_FUZZ = "Enable Animated Menu BG";
SWWM_BUSTERPAUSE = "Pause on Wallbuster Reload";
SWWM_CROUCHJUMP = "Allow Crouch-Jump";
SWWM_CBTALL = "Unlimited Wallbuster Destruction";
SWWM_DOOMFALL = "Force Monster Fall Damage";
SWWM_CAPMCRANGE = "Cap Ynykron Chain Reaction";
@ -177,7 +176,6 @@ TOOLTIP_SWWM_DETSCALE = "Scaling factor for sensed items. Set to 0 to use GZDoom
TOOLTIP_SWWM_BLOOD = "Enable custom blood and gore effects, adapted from Soundless Mound. I'd honestly recommend Nashgore instead, it's better.";
TOOLTIP_SWWM_FUZZ = "Toggling this off is recommended if you're recording/streaming as this effect can harm video quality.";
TOOLTIP_SWWM_CBTPAUSE = "The game will pause while the Wallbuster reload menu is open (only in singleplayer).";
TOOLTIP_SWWM_CROUCHJUMP = "Allow the player to crouch-jump (which may be needed on some maps). Note that there are no animations for this and it'll look weird.";
TOOLTIP_SWWM_CBTALL = "Allows the Wallbuster to break pretty much anything, not just doors and platforms. Note that this can break some maps, which is why this option is here.";
TOOLTIP_SWWM_DOOMFALL = "Makes monsters take fall damage outside of Hexen. Requires map reload if previously disabled.";
TOOLTIP_SWWM_CAPMCRANGE = "By default the Ynykron's chain reactions will propagate until no more targets can be reached. This option limits this spread, making it at least somewhat more \"balanced\".";

View file

@ -76,8 +76,34 @@ I_OMNISIGHT = "Unidad de Mapeado Omnivisión";
T_REFRESHER = "Refrescador";
T_SANDWICH = "Sandwich de Queso a la Plancha";
T_WARARMOR = "Armadura de Guerra";
T_FROGGY = "Silla Rana";
T_BARRIER = "Revestimiento Elemental";
T_FROGGY = "Silla Rana";
T_SEXROBOT1 = "Saya Miyamoto - Mi Maid Es Un Robot Del Sexo Vol. 1";
T_SEXROBOT2 = "Saya Miyamoto - Mi Maid Es Un Robot Del Sexo Vol. 2";
T_SEXROBOT3 = "Saya Miyamoto - Mi Maid Es Un Robot Del Sexo Vol. 3";
T_MOTHPLUSH = "Peluche de Mashiro";
T_BLACKRATS = "El Aquelarre de la Rata Negra - Noche de Walpurgis";
T_AKARIPROJECT = "Saya Miyamoto - El Proyecto Akari";
T_CATCATCHER = "Poster Promocional de Cat Catcher";
T_LOVESIGNALS = "Meidobot - Señales de Amor";
T_NUTATCO = "Barrita de Chocolate Nutatco™";
T_HEGE = "Cactus Hege";
T_RAIDEMIN = "Figura de Acción de Raidemin";
T_FRISPYCORN = "Snack de Maíz Delicioso Frispy™";
T_HOAGIE = "Emparedado";
T_LITHIUM = "Lithium - Volumen Uno";
T_PISS = "Whiskey PISS";
T_DEMOPLUSH = "Peluche de Demolicionista";
T_FIREMACE = "Maza de Fuego";
T_DOOMFIG = "Figura de Acción de Doomguy";
T_TOMEPOWER = "Tomo del Poder de Tyketto";
T_YEFLASK = "Frasco de Cuarzo";
T_SAYABEAN = "Peluche Bean Maldito de Saya";
T_PUZZLEBOOK = "Lord Vilkreath - Fundamentos del Diseño de Puzzles";
T_PEACH = "Zumo de Melocotón Toot Froot™";
T_MILKBREAD = "Pan de Leche Akkouxhei";
T_OBELISK = "Obelisco del Valle Dorado";
T_KIRINMANGA = "Saya Miyamoto - Me Casé Con Un Emperador Virgen Pero Resulta Que Es Monísimo Con Lencería?!";
// colored tags for keys
T_REDCARD = "\cgTarjeta Llave Roja\c-";
T_BLUECARD = "\chTarjeta Llave Azul\c-";

View file

@ -102,7 +102,6 @@ SWWM_GZSCALE = "Usar Opción de GZDoom";
SWWM_BLOOD = "Habilitar Sangre Personalizada";
SWWM_FUZZ = "Habilitar Fondo Animado de Menú";
SWWM_BUSTERPAUSE = "Pausar en Regarga de Wallbuster";
SWWM_CROUCHJUMP = "Permitir Salto Agachado";
SWWM_CBTALL = "Destrucción Ilimitada de Wallbuster";
SWWM_DOOMFALL = "Forzar Daño por Caída en Monstruos";
SWWM_CAPMCRANGE = "Limitar Reacción en Cadena de Ynykron";
@ -174,7 +173,6 @@ TOOLTIP_SWWM_DETSCALE = "Factor de escalado para los items detectados. Pon a 0 p
TOOLTIP_SWWM_BLOOD = "Activa efectos de sangre y vísceras personalizados, adaptados de Soundless Mound. Sinceramente, recomendaría usar Nashgore, es mejor.";
TOOLTIP_SWWM_FUZZ = "Desactivar ésto es recomendado si estás grabando o haciendo streaming, ya que este effecto puede dañar la calidad del vídeo.";
TOOLTIP_SWWM_CBTPAUSE = "El juego será pausado mientras el menú de recarga de Wallbuster está abierto (sólo en modo de un jugador).";
TOOLTIP_SWWM_CROUCHJUMP = "Permite al jugador agacharse saltando (lo cual puede ser necesario en algunos mapas). Ten en cuenta que no hay animaciones para esto, así que se verá raro.";
TOOLTIP_SWWM_CBTALL = "Permite a la Wallbuster romper casi cualquier cosa, no solo puertas y plataformas. Ten en cuenta que esto puede romper algunos mapas, razón de que haya esta opción.";
TOOLTIP_SWWM_DOOMFALL = "Hace que los monstruos reciban daño por caída fuera de Hexen. Requiere reinicio de mapa si fue desactivado anteriormente.";
TOOLTIP_SWWM_CAPMCRANGE = "Por defecto las reacciones en cadena del Ynykron se propagarán hasta que no se puedan alcanzar más objetivos. Esta opción limita su extensión, haciéndolo al menos un poco más \"balanceado\".";

View file

@ -1,2 +1,2 @@
[default]
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.7b r557 \cu(Mon 21 Sep 21:39:06 CEST 2020)";
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.8b r557 \cu(Thu 24 Sep 14:05:04 CEST 2020)";

View file

@ -0,0 +1,22 @@
TAG
Akari Project
TAB
Item
REL
Saya;LunaEvent;Nukuri;UAC;Hell
TXT
\cxTitle:\c-
\cf The Akari Project\c-
\cxAuthor:\c-
\cf Saya Miyamoto\c-
\cxGenre:\c-
\cf Science Fiction\c-
\cfSynopsis:\c- In the year 2040, human science has evolved to levels never before seen. Mankind has explored not just their nearest planets, but those of neighboring suns too, and yet, there is more they wish, to go farther, to step beyond even the confines of their galaxy, and have every corner of the universe at the reach of their fingertips. It is then, that the greatest minds from all around the world are reunited, with one purpose, one mission: The Akari Project.
**The Akari Project** is **Saya Miyamoto**'s first foray into sci-fi novel writing, all the way back in 2021, when humanity had only just made its first alien contact through the **Luna Event**. It was advertised as a possible look into the future that the **Nukuri** alliance would provide, though nowadays it's seen more as an unfortunately "too optimistic" vision of said future. Nevertheless, its main premise still stands to become a reality, with Saya herself promising to spearhead a real Akari Project someday, for humanity to create its own gates into the farthest corners of the universe and beyond.
\cxSaya's Notes:\c-
\cfYeah... I was really dumb back then, thinking everything would turn out so well and all, but instead look at where we are, with humankind's first interdimensional travel experiments opening a goddamn portal to Hell of all places (fuck the UAC). And let's not get started on all those "advances" in science I fantasized about. Most of those are way far for us, even though all the others have them (or even better stuff). We're just lagging behind because of all the stupid shit people keep doing and all the work those capitalist trashlords do to set everything back (fuck 'em).\c-
\cfBut yeah, I totally want to make this real now, since I've got the know-how to do all this, mainly thanks to Zana-sama and her contacts. Well, I know the basics, at least, so I'll have to figure out the rest myself.\c-

View file

View file

View file

View file

View file

View file

View file

View file

0
lore/default/hoagie.txt Normal file
View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

@ -35,7 +35,6 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_6DOF", "swwm_fly6dof", "YesNo"
Option "$SWWM_REVIVE", "swwm_revive", "YesNo"
ScaleSlider "$SWWM_REVIVECOOLDOWN", "swwm_revivecooldown", 0, 300, 30, "$SWWM_UNLIMITED"
Option "$SWWM_CROUCHJUMP", "swwm_crouchjump", "YesNo"
Option "$SWWM_MENUPAUSE", "swwm_menupause", "YesNo"
StaticText " "
StaticText "$SWWM_OTITLE", "Gold"
@ -152,6 +151,7 @@ OptionMenu "SWWMCreditsMenu"
StaticText "Teque", "Gold"
StaticText "Traumatic State", "White"
StaticText "Dragony", "White"
StaticText "Hidden Tune #242", "White"
StaticText " "
StaticText "$SWWM_CFANART", "Red"
StaticText " "
@ -159,6 +159,7 @@ OptionMenu "SWWMCreditsMenu"
StaticText "Captain J (@Jho7835)", "Gold"
StaticText "Redead-ITA", "Gold"
StaticText "Sgt. Shivers (@Sgt_Shivers_)", "Gold"
StaticText "Moa Dixøn / Endie (@MoaDixon)", "Gold"
StaticText " "
StaticText "$SWWM_CLOCAL", "Red"
StaticText " "

View file

@ -415,12 +415,113 @@ Model "Demolitionist"
SurfaceSkin 0 1 "DemoFace_Default.png"
FrameIndex XZWD V 0 360
FrameIndex XZWD W 0 361
// TODO Crouched Wave
// TODO Crouched Thumbs Up
// TODO Crouched Victory
// TODO Crouched Blow Kiss
// TODO Swim
// TODO Float
// Float
FrameIndex XZWD W 0 363
FrameIndex XZWD X 0 364
FrameIndex XZWD Y 0 365
FrameIndex XZWD Z 0 366
FrameIndex XZWE A 0 367
FrameIndex XZWE B 0 368
FrameIndex XZWE C 0 369
FrameIndex XZWE D 0 370
FrameIndex XZWE E 0 371
FrameIndex XZWE F 0 372
FrameIndex XZWE G 0 373
FrameIndex XZWE H 0 374
// Swim Start
FrameIndex XZWE I 0 376
FrameIndex XZWE J 0 377
FrameIndex XZWE K 0 378
// Swim
FrameIndex XZWE L 0 379
FrameIndex XZWE M 0 380
FrameIndex XZWE N 0 381
FrameIndex XZWE O 0 382
FrameIndex XZWE P 0 383
FrameIndex XZWE Q 0 384
FrameIndex XZWE R 0 385
FrameIndex XZWE S 0 386
FrameIndex XZWE T 0 387
FrameIndex XZWE U 0 388
FrameIndex XZWE V 0 389
FrameIndex XZWE W 0 390
// Swim End
FrameIndex XZWE X 0 392
FrameIndex XZWE Y 0 393
// Crouched Wave
FrameIndex XZWE Z 0 397
FrameIndex XZWF A 0 398
FrameIndex XZWF B 0 399
FrameIndex XZWF C 0 400
FrameIndex XZWF D 0 401
FrameIndex XZWF E 0 402
FrameIndex XZWF F 0 403
FrameIndex XZWF G 0 404
FrameIndex XZWF H 0 405
FrameIndex XZWF I 0 406
FrameIndex XZWF J 0 407
FrameIndex XZWF K 0 408
FrameIndex XZWF L 0 409
FrameIndex XZWF M 0 410
FrameIndex XZWF N 0 411
// Crouched Thumbs Up
FrameIndex XZWF O 0 413
FrameIndex XZWF P 0 414
FrameIndex XZWF Q 0 415
FrameIndex XZWF R 0 416
FrameIndex XZWF S 0 417
FrameIndex XZWF T 0 418
FrameIndex XZWF U 0 419
FrameIndex XZWF V 0 420
FrameIndex XZWF W 0 421
FrameIndex XZWF X 0 422
FrameIndex XZWF Y 0 423
FrameIndex XZWF Z 0 424
FrameIndex XZWG A 0 425
FrameIndex XZWG B 0 426
FrameIndex XZWG C 0 427
FrameIndex XZWG D 0 428
FrameIndex XZWG E 0 429
// Crouched Victory
FrameIndex XZWG F 0 431
FrameIndex XZWG G 0 432
FrameIndex XZWG H 0 433
FrameIndex XZWG I 0 434
FrameIndex XZWG J 0 435
FrameIndex XZWG K 0 436
FrameIndex XZWG L 0 437
FrameIndex XZWG M 0 438
FrameIndex XZWG N 0 439
FrameIndex XZWG O 0 440
FrameIndex XZWG P 0 441
FrameIndex XZWG Q 0 442
FrameIndex XZWG R 0 443
FrameIndex XZWG S 0 444
FrameIndex XZWG T 0 445
FrameIndex XZWG U 0 446
FrameIndex XZWG V 0 447
FrameIndex XZWG W 0 448
FrameIndex XZWG X 0 449
// Crouched Blow Kiss
FrameIndex XZWG Y 0 451
FrameIndex XZWG Z 0 452
FrameIndex XZWH A 0 453
FrameIndex XZWH B 0 454
FrameIndex XZWH C 0 455
FrameIndex XZWH D 0 456
FrameIndex XZWH E 0 457
FrameIndex XZWH F 0 458
FrameIndex XZWH G 0 459
FrameIndex XZWH H 0 460
FrameIndex XZWH I 0 461
FrameIndex XZWH J 0 462
FrameIndex XZWH K 0 463
FrameIndex XZWH L 0 464
FrameIndex XZWH M 0 465
FrameIndex XZWH N 0 466
FrameIndex XZWH O 0 467
FrameIndex XZWH P 0 468
FrameIndex XZWH Q 0 469
}
// Voodoo Doll

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,10 +0,0 @@
Demolitionist:
- titlemap animations
- powering up
- stretch
- crack knuckles
- additional animations
- more gestures
- blow kiss
- dedicated swim animation set

BIN
music/H2I4D2E.XM Normal file

Binary file not shown.

BIN
palettes/SWWMGZStartup.pal Normal file

Binary file not shown.

View file

@ -32,7 +32,7 @@ vec4 ProcessTexel()
vec3 col = vec3(1.);
for ( int i=0; i<3; i++ )
{
coord = floor(vTexCoord.st*textureSize(tex,0)/zoom[i]);
coord = floor(vTexCoord.st*vec2(640.,400.)/zoom[i]);
col *= layers[i]*2.0*abs(fract(rnd(coord)+timer*speed[i])-0.5);
}
return vec4(col,1.);

View file

@ -32,7 +32,7 @@ vec4 ProcessTexel()
vec3 col = vec3(1.);
for ( int i=0; i<3; i++ )
{
coord = floor(vTexCoord.st*textureSize(tex,0)/zoom[i]);
coord = floor(vTexCoord.st*vec2(100.,12.)/zoom[i]);
col *= layers[i]*2.0*abs(fract(rnd(coord)+timer*speed[i])-0.5);
}
col += getTexel(vTexCoord.st).rgb;

View file

@ -0,0 +1,40 @@
float rnd( in vec2 sd )
{
//return cos(sd.y*3874.8674+sd.x*6783.5325)*2737.8474;
// use noise tex instead of trig-based PRNG, much better and doesn't break on intel
return texelFetch(noisetex,ivec2(mod(sd.x,256.),mod(sd.y,256.)),0).x;
}
// haha are you telling me I can't declare arrays like in C?
// what the fuck even is this insane syntax?
const vec3 layers[3] =
vec3[](
vec3(1.01,1.07,1.05),
vec3(1.06,1.04,1.03),
vec3(1.05,1.03,1.01)
);
const float speed[3] =
float[](
.5526,
.7843,
.3725
);
const float zoom[3] =
float[](
1.,
2.,
3.
);
vec4 ProcessTexel()
{
vec2 coord;
vec3 col = vec3(1.);
for ( int i=0; i<3; i++ )
{
coord = floor(vTexCoord.st*vec2(50.,3.)/zoom[i]);
col *= layers[i]*2.0*abs(fract(rnd(coord)+timer*speed[i])-0.5);
}
col += getTexel(vTexCoord.st).rgb;
return vec4(col,1.);
}

View file

@ -971,3 +971,4 @@ menu/buyinv sounds/menu/buysnd.ogg
$alias misc/invchange menu/demosel
UseArtifact DSEMPTY
StartupTick DSEMPTY

94
tools/mkstartup.c Normal file
View file

@ -0,0 +1,94 @@
/*
mkstartup.c : Makes a Hexen startup screen from provided images.
Requires all the files to be in the same folder it's executed in.
(C)2020 Marisa Kirisame, UnSX Team.
Released under the MIT license:
Copyright (c) 2020 Marisa Kirisame
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdint.h>
int main( void )
{
// we expect everything to be exported straight from gimp in raw image
// data format, indexed, no alpha, all graphics must share the same
// 16-color palette and have the exact dimensions shown here:
// STARTUP.data : 640x480, I8 (307200 bytes)
// STARTUP.data.pal : 16 colors, RGB8 (48 bytes)
// NOTCH.data : 16x23, I8 (368 bytes)
// NETNOTCH.data : 4x16, I8 (64 bytes)
uint8_t pal[48] = {0};
uint8_t startup[4][38400] = {{0}};
uint8_t notch[184] = {{0}};
uint8_t netnotch[32] = {{0}};
uint8_t blk[8] = {0};
FILE *fout = fopen("STARTUP.dat","wb");
FILE *fin = fopen("STARTUP.data.pal","rb");
fread(&pal,1,48,fin);
// reduce 8BPC palette to 6BPC
for ( int i=0; i<48; i++ )
pal[i] = (pal[i]>>2)&0x3f;
fwrite(&pal,1,48,fout);
fclose(fin);
fin = fopen("STARTUP.data","rb");
// compose 4-bit planar startup image
for ( int i=0; i<38400; i++ )
{
fread(&blk,1,8,fin);
for ( int j=0; j<8; j++ )
{
startup[0][i] |= !!(blk[j]&1)<<(7-j);
startup[1][i] |= !!(blk[j]&2)<<(7-j);
startup[2][i] |= !!(blk[j]&4)<<(7-j);
startup[3][i] |= !!(blk[j]&8)<<(7-j);
}
}
fclose(fin);
fwrite(&startup,1,153600,fout);
fclose(fout);
fin = fopen("NOTCH.data","rb");
fout = fopen("NOTCH.dat","wb");
// compose 4-bit linear notch image
for ( int i=0; i<184; i++ )
{
fread(&blk,1,2,fin);
notch[i] |= (blk[0]<<4)&0xF0;
notch[i] |= blk[1]&0x0F;
}
fclose(fin);
fwrite(&notch,1,184,fout);
fclose(fout);
fin = fopen("NETNOTCH.data","rb");
fout = fopen("NETNOTCH.dat","wb");
// compose 4-bit linear netnotch image
for ( int i=0; i<32; i++ )
{
fread(&blk,1,2,fin);
netnotch[i] |= (blk[0]<<4)&0xF0;
netnotch[i] |= blk[1]&0x0F;
}
fclose(fin);
fwrite(&netnotch,1,32,fout);
fclose(fout);
return 0;
}

View file

@ -54,7 +54,7 @@ Class WallbusterReloadMenu : GenericMenu
if ( !pauseme ) pauseme = CVar.GetCVar('swwm_cbtpause',players[consoleplayer]);
if ( pauseme.GetBool() ) menuactive = Menu.On;
else menuactive = Menu.OnNoPause;
if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') ) return;
if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') && (gamestate == GS_LEVEL) ) return;
MenuEvent(MKEY_BACK,false);
}

View file

@ -80,7 +80,6 @@ Class FroggyChair : SWWMCollectable
}
// The other collectables, which will be implemented eventually
/*
Class MMiaSRVol1 : SWWMCollectable
{
Default
@ -328,7 +327,6 @@ Class KirinManga : SWWMCollectable
Stamina 1600;
}
}
*/
// yay!
Class FancyConfetti : Actor

View file

@ -835,7 +835,7 @@ Class SWWMHandler : EventHandler
override void WorldThingDied( WorldEvent e )
{
if ( e.Thing.default.bBOSS && !Random[GoldDrop](0,2) )
if ( ((e.Thing.default.bBOSS) || (e.Thing.default.Health >= 1000)) && !Random[GoldDrop](0,2) )
{
let g = Actor.Spawn("GoldShell",e.Thing.Vec3Offset(0,0,e.Thing.Height/2));
double ang = FRandom[SpareShells](0,360);
@ -1202,6 +1202,8 @@ Class SWWMHandler : EventHandler
}
}
}
if ( (kcode > 2) || (lcode > 2) )
return true; // eat keypresses from this point
}
return false;
}

View file

@ -13,6 +13,7 @@ Class SWWMStatScreen : StatusScreen abstract
transient CVar intertype, lang, origmus;
double hs, hs2;
Vector2 ss, ss2, origin, origin2;
double bgfade;
// returns MPlus if we're playing in Japanese, otherwise returns the requested font
Font LangFont( Font req )
@ -247,6 +248,75 @@ Class SWWMStatScreen : StatusScreen abstract
drawNoState();
break;
}
if ( bgfade <= 0. ) return;
// redraw bgs on top, hiding the rest of the ui
if ( intertype.GetInt() == 1 )
{
double ar = Screen.GetAspectRatio();
Vector2 tsize = TexMan.GetScaledSize(arttex);
double sar = tsize.x/tsize.y;
Vector2 vsize;
if ( sar > ar ) vsize = (tsize.y*ar,tsize.y);
else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar);
else vsize = tsize;
Screen.DrawTexture(arttex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,bgfade);
}
/*else if ( intertype.GetInt() == 2 )
{
// TBD when there's art
}*/
else
{
double ar = Screen.GetAspectRatio();
Vector2 tsize = TexMan.GetScaledSize(bgtex);
double sar = tsize.x/tsize.y;
Vector2 vsize;
if ( sar > ar ) vsize = (tsize.y*ar,tsize.y);
else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar);
else vsize = tsize;
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,bgfade);
}
}
protected void checkForAccelerateNew( void )
{
// check for button presses to skip delays (but only recognize fire/use buttons)
for ( int i=0; i < MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
{
PlayerInfo p = players[i];
if ( (p.cmd.buttons^p.oldbuttons) && ((p.cmd.buttons&p.oldbuttons) == p.oldbuttons) && !p.Bot && (p.cmd.buttons&(BT_ATTACK|BT_USE)) )
{
acceleratestage = 1;
playerready[i] = true;
}
p.oldbuttons = p.buttons;
}
}
}
override void Ticker( void )
{
bcnt++;
if ( bcnt == 1 ) StartMusic();
checkForAccelerateNew();
switch (CurState)
{
case StatCount:
updateStats();
break;
case ShowNextLoc:
updateShowNextLoc();
break;
case NoState:
updateNoState();
break;
case LeavingIntermission:
// sorry nothing
break;
}
// check fade
if ( players[consoleplayer].cmd.buttons&BT_ALTATTACK ) bgfade = min(1.,bgfade+3./Thinker.TICRATE);
else bgfade = max(0.,bgfade-4./Thinker.TICRATE);
}
protected String TimeStr( int secs )
{

View file

@ -809,7 +809,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -854,7 +854,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -883,7 +883,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -928,7 +928,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -1338,7 +1338,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -2384,7 +2384,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -2396,7 +2396,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
int clscol = Font.CR_WHITE;
if ( invlist[i] is 'Weapon' ) clscol = Font.CR_GOLD;

View file

@ -1398,7 +1398,8 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
@ -1407,8 +1408,7 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
|| InStateSequence(CurState,FindState("Float")) )
{
SetStateLabel("Spawn");
A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
@ -1416,25 +1416,16 @@ Class Demolitionist : PlayerPawn
else if ( InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop")) )
SetStateLabel("SeeFastEnd");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
}
}
else if ( !bNoGravity && (waterlevel < 1) )
{
// Falling
if ( (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")))
&& (abs(pos.z-floorz) > maxstepheight) )
SetStateLabel("Fall");
}
else
if ( player.crouchdir == -1 )
{
// Floating
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
@ -1443,8 +1434,70 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
{
if ( (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float")))
&& (abs(pos.z-floorz) > maxstepheight) )
SetStateLabel("Fall");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
}
}
else
{
// Swimming
if ( player.crouchdir == -1 )
{
// Crouching
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
{
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop")) )
SetStateLabel("Float");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
}
}
}
override void PlayRunning()
@ -1467,7 +1520,12 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd")) )
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
else if ( InStateSequence(CurState,FindState("Crouch")) )
SetStateLabel("CrouchMove");
@ -1477,6 +1535,9 @@ Class Demolitionist : PlayerPawn
if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
else if ( FastCheck()
&& (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
@ -1497,7 +1558,10 @@ Class Demolitionist : PlayerPawn
}
else
{
// Floating
// Swimming
if ( player.crouchdir == -1 )
{
// Crouching
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
@ -1506,8 +1570,31 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop")) )
SetStateLabel("Float");
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
else if ( InStateSequence(CurState,FindState("Crouch")) )
SetStateLabel("CrouchMove");
}
else
{
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float")) )
SetStateLabel("Swim");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
}
}
}
override void PlayAttacking()
@ -1716,9 +1803,6 @@ Class Demolitionist : PlayerPawn
{
if ( player.cmd.buttons&BT_JUMP ) return false;
if ( InStateSequence(CurState,FindState("Dash")) ) return false; // no crouch during dash
if ( swwm_crouchjump ) return true; // allowed
if ( (waterlevel > 2) || bNOGRAVITY ) return false; // no crouch while swimming/floating
if ( !player.onground ) return false; // no crouch while in air
return true;
}
// Imagine having to duplicate two functions only to change a couple values in both
@ -1946,18 +2030,6 @@ Class Demolitionist : PlayerPawn
// landing
XZW4 CIJKLMN 2;
Goto Spawn+1;
Float:
// start
#### # 2;
XZW4 O 3;
Goto FloatLoop;
FloatLoop:
XZW4 PQRS 6;
Loop;
FloatEnd:
#### # 2;
XZW4 TUVWX 3;
Goto Spawn+1;
Dash:
#### # 2;
XZW4 O 2 A_Dash();
@ -2031,6 +2103,25 @@ Class Demolitionist : PlayerPawn
XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZW7 TUV 2;
Loop;
CrouchWave:
#### # 3;
XZWE Z 3;
XZWF ABCDEFGHIJKLMN 3;
Goto Crouch+1;
CrouchApprove:
#### # 3;
XZWF OPQRSTUVWXYZ 3;
XZWG ABCDE 3;
Goto Crouch+1;
CrouchVictory:
#### # 3;
XZWG FGHIJKLMNOPQRSTUVWX 3;
Goto Crouch+1;
CrouchBlowKiss:
#### # 3;
XZWG YZ 3;
XZWH ABCDEFGHIJKLMNOPQ 3;
Goto Crouch+1;
CrouchMissile:
XZW7 M 2;
XZW7 WXYZ 2;
@ -2075,6 +2166,26 @@ Class Demolitionist : PlayerPawn
#### # 2 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.45);
XZW8 MNOPQRS 2;
Goto Spawn+1;
Float:
#### # 3;
XZWD WXYZ 3;
XZWE ABCDEFGH 3;
Goto Float+1;
Swim:
#### # 2;
XZWE IJK 2;
Goto SwimLoop;
SwimLoop:
XZWE LMN 2;
XZWE O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZWE OPQRST 2;
XZWE U 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZWE UVW 2;
Loop;
SwimEnd:
#### # 2;
XZWE LXY 2;
Goto Float+1;
VoodooSpawn:
XZWZ A -1;
Loop;
@ -2731,10 +2842,9 @@ Class SWWMGesture : SWWMWeapon
action void A_CallPlayerGesture( statelabel st, statelabel cst )
{
if ( invoker.Owner.Health <= 0 ) return;
// crouched gestures not yet added
/*if ( (player.crouchdir == -1) && invoker.Owner.FindState(cst) )
if ( (player.crouchdir == -1) && invoker.Owner.FindState(cst) )
invoker.Owner.SetStateLabel(cst);
else */if ( invoker.Owner.FindState(st) )
else if ( invoker.Owner.FindState(st) )
invoker.Owner.SetStateLabel(st);
}