Overhaul stat screen, remove fanart.

This commit is contained in:
Marisa the Magician 2023-09-09 14:47:30 +02:00
parent 1d13d74f19
commit bb8478af4a
43 changed files with 464 additions and 1013 deletions

View File

@ -32,10 +32,5 @@ Most of the work here is original, but there are some notable exceptions:
- Takao Gothic font by Jun Kobayashi et al (https://launchpad.net/takao-fonts). Modified to add gradients and drop shadow.
- Nashgore footprint texture by Valerie Lavender.
- Slope alignment utility code by ZZYZX & Nash.
- Intermission fanart:
* Substance20 (@S20TBL)
* Sgt. Shivers (@Sgt_Shivers_)
* Moa Dixøn / Endie (@MoaDixon)
* Monsoon-Soft (@MonsoonSoft)
- SiFi270 (Less mean-spirited Keen replacement)
- Widescreen version of Hexen finale screens by Nash.

View File

@ -19,7 +19,6 @@ nosave bool swwm_pois = true; // show points of interest highlighted by omnisi
nosave bool swwm_shaders = true; // use pp shaders for some effects
server bool swwm_revive = true; // allows the player to do an "emergency reboot" when dying
server int swwm_revivecooldown = 60; // cooldown after using a revive, in seconds (0: no limit)
nosave int swwm_interart = 1; // show art on intermissions (2: only fanart, 3: only official renders)
server int swwm_blood = 1; // custom blood/gibbing (2: forcibly use our blood)
server int swwm_maxblood = 200; // max blood effects at any time
server int swwm_maxgibs = 100; // max gibs at any time
@ -36,7 +35,6 @@ server bool swwm_omnibust = false; // add wallbusting effect to all weapons
server bool swwm_superfuel = false; // enable unlimited fuel
server bool swwm_partytime = false; // killed enemies burst into confetti
nosave bool swwm_bigtags = false; // use a bigger font for targeter tags
nosave bool swwm_intermusic = false; // use original intermission music
server int swwm_enemydrops = 0; // allow enemies to drop ammo and weapons (-1 - no ammo or weapons, 0 - ammo only, 1 - both)
user bool swwm_collectanim = true; // player special gestures for collectables (first person only)
nosave int swwm_precisecrosshair = 1; // use mod's own, more precise crosshair (2 - force even when crosshair is not on)
@ -63,7 +61,6 @@ nosave bool swwm_nomapmsg = false; // disables special map dialogue messages
nosave bool swwm_weapontooltips = true; // shows a tooltip on weapon operation when first selected
nosave string swwm_tooltipshown = ""; // which weapons have already had their tooltips displayed
nosave noarchive bool swwm_tooltipnote = false; // set if the note on how to disable tooltips was already displayed
nosave bool swwm_nointertips = false; // hides intermission tips, in case you don't want to see them
nosave bool swwm_beepboop = false; // prompts the Demolitionist to go "beep", "boop" and "bop" when pressing any switch (may get annoying)
nosave string swwm_menuposehistory = ""; // stores currently seen poses for the main menu, for shuffling
nosave string swwm_titlesubhistory = ""; // stores currently seen subtitles for the title screen, for shuffling

View File

@ -303,107 +303,71 @@ Material Sprite "MBRNB0"
{
Shader "shaders/glsl/Whew.fp"
}
Material Texture "graphics/InterBG.png"
Material Texture "graphics/Renders/Marisa.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Endie.jpg"
Material Texture "graphics/Renders/Marisa2.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa.jpg"
Material Texture "graphics/Renders/Marisa3.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa2.jpg"
Material Texture "graphics/Renders/Marisa4.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa3.jpg"
Material Texture "graphics/Renders/Marisa5.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa4.jpg"
Material Texture "graphics/Renders/Marisa6.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa5.jpg"
Material Texture "graphics/Renders/Marisa7.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa6.jpg"
Material Texture "graphics/Renders/Marisa8.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa7.jpg"
Material Texture "graphics/Renders/Marisa9.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa8.jpg"
Material Texture "graphics/Renders/Marisa10.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa9.jpg"
Material Texture "graphics/Renders/Marisa11.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa10.jpg"
Material Texture "graphics/Renders/Marisa12.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa11.jpg"
Material Texture "graphics/Renders/Marisa13.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa12.jpg"
Material Texture "graphics/Renders/Marisa14.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa13.jpg"
Material Texture "graphics/Renders/Marisa15.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa14.jpg"
Material Texture "graphics/Renders/Marisa16.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa15.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa16.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Marisa17.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Monsoon.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Monsoon2.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Monsoon3.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Monsoon4.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/S20TBL.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Shivers.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
Material Texture "graphics/Fanart/Shivers2.png"
Material Texture "graphics/Renders/Marisa17.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 925 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 940 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 957 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

View File

Before

Width:  |  Height:  |  Size: 713 KiB

After

Width:  |  Height:  |  Size: 713 KiB

View File

Before

Width:  |  Height:  |  Size: 899 KiB

After

Width:  |  Height:  |  Size: 899 KiB

View File

Before

Width:  |  Height:  |  Size: 960 KiB

After

Width:  |  Height:  |  Size: 960 KiB

View File

Before

Width:  |  Height:  |  Size: 878 KiB

After

Width:  |  Height:  |  Size: 878 KiB

View File

Before

Width:  |  Height:  |  Size: 923 KiB

After

Width:  |  Height:  |  Size: 923 KiB

View File

Before

Width:  |  Height:  |  Size: 987 KiB

After

Width:  |  Height:  |  Size: 987 KiB

View File

Before

Width:  |  Height:  |  Size: 379 KiB

After

Width:  |  Height:  |  Size: 379 KiB

View File

Before

Width:  |  Height:  |  Size: 904 KiB

After

Width:  |  Height:  |  Size: 904 KiB

View File

Before

Width:  |  Height:  |  Size: 980 KiB

After

Width:  |  Height:  |  Size: 980 KiB

View File

Before

Width:  |  Height:  |  Size: 877 KiB

After

Width:  |  Height:  |  Size: 877 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 370 KiB

After

Width:  |  Height:  |  Size: 370 KiB

View File

Before

Width:  |  Height:  |  Size: 707 KiB

After

Width:  |  Height:  |  Size: 707 KiB

View File

Before

Width:  |  Height:  |  Size: 900 KiB

After

Width:  |  Height:  |  Size: 900 KiB

View File

Before

Width:  |  Height:  |  Size: 1001 KiB

After

Width:  |  Height:  |  Size: 1001 KiB

View File

Before

Width:  |  Height:  |  Size: 913 KiB

After

Width:  |  Height:  |  Size: 913 KiB

View File

@ -655,6 +655,14 @@ SWWM_TITLESUB11 = "Slaughterwads too hard? No problem!\nJust play them with this
SWWM_TITLESUB12 = " Did you know this subtitle is misaligned?";
SWWM_TITLESUB13 = "I like big explosions and I cannot lie";
SWWM_TITLESUB14 = "If you wrapped a cat in a tortilla,\nwould you call that a purrito?";
SWWM_INTERDONE = "COMPLETED";
SWWM_INTERNEXT = "NEXT STOP";
SWWM_INTERKILLS = "MONSTERS DEFEATED:";
SWWM_INTERITEMS = "ITEMS COLLECTED:";
SWWM_INTERSECRETS = "SECRETS UNCOVERED:";
SWWM_INTERTIME = "YOUR TIME:";
SWWM_INTERPAR = "PAR TIME:";
SWWM_INTERTOTAL = "TOTAL TIME:";
SWWM_UNIT_METER = "m";
SWWM_UNIT_KILOMETER = "km";
SWWM_UNIT_KPH = "kph";
@ -1100,34 +1108,25 @@ SWWM_INTERTIP207 = "The Sheen HMG's three speed options allow for optimal balanc
SWWM_INTERTIP208 = "\"Faster and farther than a plague only hatred can extend.\"\n — Nukurines Mei Mess";
SWWM_INTERTIP209 = "This mod requires hardware rendering. If you've come this far without realizing that, you have a problem.";
SWWM_INTERTIP210 = "\"Ian Kelliher is like the Elon Musk of his generation, and I automatically hate him for that.\"\n — Saya Miyamoto";
// intermission fanart
SWWM_FANART = "Art: ";
SWWM_NFANART = "25";
SWWM_FANART1 = "S20TBL.jpg;Substance20 (@S20_TBL)";
SWWM_FANART2 = "Shivers.png;Sgt. Shivers (@Sgt_Shivers_)";
SWWM_FANART3 = "Shivers2.png;Sgt. Shivers (@Sgt_Shivers_)";
SWWM_FANART4 = "Endie.jpg;Moa Dixøn / Endie (@MoaDixon)";
SWWM_FANART5 = "Marisa.jpg";
SWWM_FANART6 = "Marisa2.jpg";
SWWM_FANART7 = "Marisa3.jpg";
SWWM_FANART8 = "Marisa4.jpg";
SWWM_FANART9 = "Marisa5.jpg";
SWWM_FANART10 = "Marisa6.jpg";
SWWM_FANART11 = "Marisa7.jpg";
SWWM_FANART12 = "Marisa8.jpg";
SWWM_FANART13 = "Marisa9.jpg";
SWWM_FANART14 = "Marisa10.jpg";
SWWM_FANART15 = "Marisa11.jpg";
SWWM_FANART16 = "Marisa12.jpg";
SWWM_FANART17 = "Marisa13.jpg";
SWWM_FANART18 = "Marisa14.jpg";
SWWM_FANART19 = "Monsoon.jpg;Monsoon-Soft (@MonsoonSoft)";
SWWM_FANART20 = "Monsoon2.jpg;Monsoon-Soft (@MonsoonSoft)";
SWWM_FANART21 = "Monsoon3.png;Monsoon-Soft (@MonsoonSoft)";
SWWM_FANART22 = "Monsoon4.png;Monsoon-Soft (@MonsoonSoft)";
SWWM_FANART23 = "Marisa15.jpg";
SWWM_FANART24 = "Marisa16.jpg";
SWWM_FANART25 = "Marisa17.jpg";
// intermission renders
SWWM_NRENDER = "17";
SWWM_RENDER1 = "Marisa.jpg";
SWWM_RENDER2 = "Marisa2.jpg";
SWWM_RENDER3 = "Marisa3.jpg";
SWWM_RENDER4 = "Marisa4.jpg";
SWWM_RENDER5 = "Marisa5.jpg";
SWWM_RENDER6 = "Marisa6.jpg";
SWWM_RENDER7 = "Marisa7.jpg";
SWWM_RENDER8 = "Marisa8.jpg";
SWWM_RENDER9 = "Marisa9.jpg";
SWWM_RENDER10 = "Marisa10.jpg";
SWWM_RENDER11 = "Marisa11.jpg";
SWWM_RENDER12 = "Marisa12.jpg";
SWWM_RENDER13 = "Marisa13.jpg";
SWWM_RENDER14 = "Marisa14.jpg";
SWWM_RENDER15 = "Marisa15.jpg";
SWWM_RENDER16 = "Marisa16.jpg";
SWWM_RENDER17 = "Marisa17.jpg";
// achievements
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "The Full Set";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtain all collectibles in a single save";

View File

@ -55,9 +55,6 @@ SWWM_REVIVECOOLDOWN = "Reboot Cooldown";
SWWM_UNLIMITED = "Unlimited";
SWWM_ONERETRY = "One Retry";
SWWM_NONE = "None";
SWWM_INTERART = "Intermission Art";
SWWM_NORENDER = "Yes (Fanart Only)";
SWWM_NOFANART = "Yes (Renders Only)";
SWWM_BTITLE = "Balance Options";
SWWM_BLOOD = "Enable Custom Blood";
SWWM_FUZZ = "Enable Animated Menu BG";
@ -71,7 +68,6 @@ SWWM_OMNIBUST = "Omni-Busting";
SWWM_SUPERFUEL = "Unlimited Fuel";
SWWM_PARTYTIME = "Super Fun Party Time";
SWWM_BIGTAGS = "Use Large Font for Names";
SWWM_INTERMUSIC = "Use Original Intermission Music";
SWWM_MAXBLOOD = "Blood Limit";
SWWM_MAXGIBS = "Gib Limit";
SWWM_MAXCASINGS = "Casing Limit";
@ -148,7 +144,6 @@ SWWM_WEAPONTOOLTIPS = "Weapon Tooltips";
SWWM_RESETTOOLTIPS = "Reset Weapon Tooltips";
SWWM_CRESET = "Reset to Defaults";
SWWM_ARESET = "Wipe Achievements";
SWWM_NOINTERTIPS = "Hide Intermission Tips";
SWWM_BEEPBOOP = "Switch Emoting";
SWWM_VOICEAMP = "Voice Amplification";
SWWM_CLEARFX = "Clear All Effects";
@ -216,7 +211,6 @@ TOOLTIP_SWWM_POIS = "Show points of interest (such as key items and exits) when
TOOLTIP_SWWM_SHADERS = "Use postprocess shaders for things like powerups and the Silver Bullet scope. You can disable this if you'd prefer something lighter on the eyes.";
TOOLTIP_SWWM_REVIVE = "Allows the player to get back up after dying by pressing Fire. Has a configurable cooldown.";
TOOLTIP_SWWM_REVIVECOOLDOWN = "Time in seconds of downtime after using a reboot, where if you die again, you can't get back up. Set to 0 to allow unlimited reboots. Alternatively, you can also set it to only allow one reboot per map (enforced on expert difficulties).";
TOOLTIP_SWWM_INTERART = "If enabled, displays randomly selected fanart and official renders during intermissions. There are extra options to only show each category.";
TOOLTIP_SWWM_BLOOD = "Enable custom blood and gore effects, adapted from Soundless Mound. Other loaded mods' gore will take priority unless set to \"Always\". BLUDTYPE patches from Nashgore are supported.";
TOOLTIP_SWWM_FUZZ = "Toggling this off is recommended if you're recording/streaming as this effect can harm video quality.";
TOOLTIP_SWWM_CBTALL = "Allows the Wallbuster and other weapons capable of map geometry destruction to break pretty much anything, not just doors and platforms. Note that this can break some maps, which is why this option is here.";
@ -228,7 +222,6 @@ TOOLTIP_SWWM_OMNIBUST = "Allows any weapon to potentially bust walls. This is ob
TOOLTIP_SWWM_SUPERFUEL = "Your fuel never runs out.";
TOOLTIP_SWWM_PARTYTIME = "When something dies, it shoots out a cloud of confetti.";
TOOLTIP_SWWM_BIGTAGS = "By default name labels on healthbars are shown with a small, compact font. Enabling this will use a bigger one.";
TOOLTIP_SWWM_INTERMUSIC = "If enabled, intermission screens will use the original music from the current IWAD or map pack.";
TOOLTIP_SWWM_MAXBLOOD = "Caps the maximum amount of blood effects. Surpassing this limit will cause the excess to fade out.";
TOOLTIP_SWWM_MAXGIBS = "Caps the maximum amount of gibs. Surpassing this limit will cause the excess to fade out.";
TOOLTIP_SWWM_MAXCASINGS = "Caps the maximum amount of casings and spent magazines. Surpassing this limit will cause the excess to fade out.";
@ -261,7 +254,6 @@ TOOLTIP_SWWM_WEAPONTOOLTIPS = "Shows a summary of controls when a weapon is sele
TOOLTIP_EVENT_SWWMRESETTOOLTIPS = "Resets weapon tooltips so you can see them all over again.";
TOOLTIP_EVENT_SWWMRESETCVARS = "Resets all the mod's settings to their original values.";
TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Erases all your archievement progress.";
TOOLTIP_SWWM_NOINTERTIPS = "Hides intermission tips, in case you don't want to see them.";
TOOLTIP_SWWM_BEEPBOOP = "The Demolitionist will make cute noises whenever pressing any usable line. This might get annoying, so it's optional.";
TOOLTIP_SWWM_VOICEAMP = "At their default volume, the Demolitionist's voice lines might be drowned out by in-game audio. This sets an additional amplification level so they're louder than other sounds.";
TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Fades out any active blood, gore, debris and casings.";
@ -338,7 +330,6 @@ SWWM_CASSETS = "Additional Assets:";
SWWM_ASSKEEN = "Less Mean-Spirited Keen Replacement";
SWWM_CMUSIC = "Music Tracks Used:";
SWWM_CVOICE = "Voices:";
SWWM_CFANART = "Intermission Fanart:";
SWWM_CPATRON = "Patreon Backers:";
SWWM_CTHANK = "Special Thanks:";
SWWM_CMAB2 = "For your work in Lithium, one of the mods that have inspired me the most. I'm really really happy to have met you.";

View File

@ -545,6 +545,14 @@ SWWM_TITLESUB11 = "¿Slaughterwads demasiado difíciles? ¡No hay problema!\n¡S
SWWM_TITLESUB12 = " ¿Sabías que este subtítulo está desencuadrado?";
SWWM_TITLESUB13 = "Me gustan las grandes explosiones y no puedo mentir";
SWWM_TITLESUB14 = "Si las gafas son buenas para la vista,\n¿por que no llevan lentes?";
SWWM_INTERDONE = "COMPLETADO";
SWWM_INTERNEXT = "PRÓXIMA PARADA";
SWWM_INTERKILLS = "MONSTRUOS DERROTADOS:";
SWWM_INTERITEMS = "ÍTEMS RECOLECTADOS:";
SWWM_INTERSECRETS = "SECRETOS DESCUBIERTOS:";
SWWM_INTERTIME = "TU TIEMPO:";
SWWM_INTERPAR = "TIEMPO PAR:";
SWWM_INTERTOTAL = "TIEMPO TOTAL:";
SWWM_YOURSELF = "Tú";
SWWM_DOKIDOKI = "El Poder del Amor™";
SWWM_GRAVKILL = "Gravedad";
@ -978,8 +986,6 @@ SWWM_INTERTIP207 = "Las tres opciones de velocidad de la Ametralladora Sheen per
SWWM_INTERTIP208 = "\"Más veloz y lejano que una plaga solo el odio puede extenderse.\"\n — Nukurines Mei Mess";
SWWM_INTERTIP209 = "Este mod requiere renderizado por hardware. Si has llegado hasta este punto sin darte cuenta de eso, tienes un problema.";
SWWM_INTERTIP210 = "\"Ian Kelliher es como el Elon Musk de su generación, y lo odio automáticamente por eso.\"\n — Saya Miyamoto";
// intermission fanart
SWWM_FANART = "Arte: ";
// achievements
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "El Set Completo";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtén todos los coleccionables en una sola partida";

View File

@ -54,9 +54,6 @@ SWWM_REVIVECOOLDOWN = "Tiempo de recarga de Reinicio";
SWWM_UNLIMITED = "Ilimitado";
SWWM_ONERETRY = "Un Reintento";
SWWM_NONE = "Ninguno";
SWWM_INTERART = "Arte de Intermisión";
SWWM_NORENDER = "Sí (Sólo Fanart)";
SWWM_NOFANART = "Sí (Sólo Renders)";
SWWM_BTITLE = "Opciones de Balance";
SWWM_BLOOD = "Habilitar Sangre Personalizada";
SWWM_FUZZ = "Habilitar Fondo Animado de Menú";
@ -70,7 +67,6 @@ SWWM_OMNIBUST = "Omni-Reventamiento";
SWWM_SUPERFUEL = "Combustible Ilimitado";
SWWM_PARTYTIME = "Modo Fiesta Tope";
SWWM_BIGTAGS = "Usar Fuente Grande para Nombres";
SWWM_INTERMUSIC = "Usar Música de Intermisión Original";
SWWM_MAXBLOOD = "Límite de Sangre";
SWWM_MAXGIBS = "Límite de Vísceras";
SWWM_MAXCASINGS = "Límite de Casquillos";
@ -146,7 +142,6 @@ SWWM_WEAPONTOOLTIPS = "Ayuda de Armas";
SWWM_RESETTOOLTIPS = "Resetear Ayuda de Armas";
SWWM_CRESET = "Restaurar Predeterminado";
SWWM_ARESET = "Borrar Logros";
SWWM_NOINTERTIPS = "Ocultar Consejos de Intermisión";
SWWM_BEEPBOOP = "Ruiditos de Activación";
SWWM_VOICEAMP = "Amplificación de Voz";
SWWM_CLEARFX = "Limpiar todos los Efectos";
@ -213,7 +208,6 @@ TOOLTIP_SWWM_POIS = "Muestra puntos de interés (tales como llaves y salidas) cu
TOOLTIP_SWWM_SHADERS = "Usa shaders de postprocesado para cosas como potenciadores y la mira del Silver Bullet. Puedes desactivar esto si prefieres algo más ligero para la vista.";
TOOLTIP_SWWM_REVIVE = "Permite al jugador volver a levantarse tras morir pulsando Fuego. Tiene un cooldown configurable.";
TOOLTIP_SWWM_REVIVECOOLDOWN = "Tiempo en segundos tras reiniciar, durante el cual si mueres otra vez, no puedes volver a levantarte. Pon a 0 para permitir reinicios ilimitados. Alternativamente, puedes elegir que solo se permita un reinicio por mapa (forzado en dificultades expertas).";
TOOLTIP_SWWM_INTERART = "Si está activado, muestra fanart y renders oficiales aleatorios durante intermisiones. Hay opciones extra para mostrar sólo una categoría.";
TOOLTIP_SWWM_BLOOD = "Activa efectos de sangre y vísceras personalizados, adaptados de Soundless Mound. La sangre de otros mods tiene prioridad a menos que se elija \"Siempre\". Se soportan parches BLUDTYPE para Nashgore.";
TOOLTIP_SWWM_FUZZ = "Desactivar esto es recomendado si estás grabando o haciendo streaming, ya que este effecto puede dañar la calidad del vídeo.";
TOOLTIP_SWWM_CBTALL = "Permite a la Wallbuster y otras armas capaces de reventar geometría del mapa destruír 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.";
@ -225,7 +219,6 @@ TOOLTIP_SWWM_OMNIBUST = "Permite que cualquier arma puede potencialmente reventa
TOOLTIP_SWWM_SUPERFUEL = "Tu combustible no se agota nunca.";
TOOLTIP_SWWM_PARTYTIME = "Cuando algo muere, expulsa una nube de confetti.";
TOOLTIP_SWWM_BIGTAGS = "Por defecto los nombres de las barras de vida usan una fuente pequeña. Activando esta opción, se cambiará por una mayor.";
TOOLTIP_SWWM_INTERMUSIC = "Al activar, las pantallas de intermisión usan la música original del IWAD o pack de mapas usado.";
TOOLTIP_SWWM_MAXBLOOD = "Limita la cantidad máxima de efectos de sangre. Sobrepasar este límite causará que el exceso se desvanezca.";
TOOLTIP_SWWM_MAXGIBS = "Limita la cantidad máxima de vísceras. Sobrepasar este límite causará que el exceso se desvanezca.";
TOOLTIP_SWWM_MAXCASINGS = "Limita la cantidad máxima de casquillos y cargadores usados. Sobrepasar este límite causará que el exceso se desvanezca.";
@ -258,7 +251,6 @@ TOOLTIP_SWWM_WEAPONTOOLTIPS = "Muestra un resumen de controles cuando se selecci
TOOLTIP_EVENT_SWWMRESETTOOLTIPS = "Resetea la ayuda de armas para que puedas volver a verla de nuevo.";
TOOLTIP_EVENT_SWWMRESETCVARS = "Resetea todas las opciones del mod a sus valores originales.";
TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Borra todo tu progreso de logros.";
TOOLTIP_SWWM_NOINTERTIPS = "Oculta los consejos de intermisión, por si no quieres verlos.";
TOOLTIP_SWWM_BEEPBOOP = "La Demolicionista hará ruiditos adorables cuando pulse cualquier línea utilizable. Esto puede que resulte cansino, así que es opcional.";
TOOLTIP_SWWM_VOICEAMP = "A su volumen normal, las voces de la Demolicionista pueden ser ahogadas por el audio del juego. Con esto se le dá un nivel de amplificación extra para que sean más estridentes que otros sonidos.";
TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Desvanece cualquier sangre, vísceras, escombros y casquillos activos.";
@ -296,7 +288,6 @@ SWWM_CASSETS = "Assets Adicionales:";
SWWM_ASSKEEN = "Reemplazo Menos Vil de Keen";
SWWM_CMUSIC = "Música Usada:";
SWWM_CVOICE = "Voces:";
SWWM_CFANART = "Fanart de Intermisión:";
SWWM_CPATRON = "Mecenas de Patreon:";
SWWM_CTHANK = "Agradecimientos Especiales:";
SWWM_CMAB2 = "Por tu trabajo en Lithium, uno de los mods que más me han inspirado. Me alegro muchísimo de haberte conocido.";

View File

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r951 \cu(Tue 5 Sep 23:33:46 CEST 2023)\c-";
SWWM_SHORTVER="\cw1.3pre r951 \cu(2023-09-05 23:33:46)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r952 \cu(Sat 9 Sep 14:47:30 CEST 2023)\c-";
SWWM_SHORTVER="\cw1.3pre r952 \cu(2023-09-09 14:47:30)\c-";

View File

@ -67,13 +67,6 @@ OptionValue "SWWMPistolStart"
1, "$SWWM_PISTOLSTART_MAP"
2, "$SWWM_PISTOLSTART_CLUSTER"
}
OptionValue "SWWMInterArt"
{
0, "$TXT_NO"
1, "$TXT_YES"
2, "$SWWM_NORENDER"
3, "$SWWM_NOFANART"
}
OptionValue "SWWMTagColor"
{
0, "$SWWM_COL_0"
@ -163,12 +156,6 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_POIS", "swwm_pois", "YesNo"
}
Option "$SWWM_NOMAPMSG", "swwm_nomapmsg", "NoYes"
IfGame(Doom, Heretic)
{
Option "$SWWM_INTERART", "swwm_interart", "SWWMInterArt"
Option "$SWWM_NOINTERTIPS", "swwm_nointertips", "YesNo"
Option "$SWWM_INTERMUSIC", "swwm_intermusic", "YesNo"
}
Option "$SWWM_NOINTROEX", "swwm_nointroex", "YesNo"
Option "$SWWM_FILTERACHIEVEMENTS", "swwm_filterachievements", "SWWMFilterAchievements"
Option "$SWWM_SHOWMAPTITLE", "swwm_showmaptitle", "YesNo"

View File

@ -86,6 +86,10 @@ $limit misc/flame 32
misc/magitem = "sounds/general/magitem.ogg"
$limit misc/magitem 16
misc/newarea = "sounds/general/AreaName.ogg"
$alias misc/interstart title/explo
$alias misc/intercnt menu/demoscroll
$alias misc/intercntdone menu/buyinv
$alias misc/interdone misc/w_pkup
misc/underwater = "sounds/general/uWater1a.ogg"
misc/underslime = "sounds/general/uGoop1.ogg"

View File

@ -4,9 +4,7 @@ GameInfo
PlayerClasses = "Demolitionist"
StatusBarClass = "SWWMStatusBar"
BackpackType = "HammerspaceEmbiggener"
StatScreen_Single = "SWWMStatScreen_SP"
StatScreen_Coop = "SWWMStatScreen_Coop"
StatScreen_DM = "SWWMStatScreen_DM"
StatScreen_Single = "SWWMStatScreen"
QuitSound = "misc/teleport"
QuitMessages = "$QUITMSG", "$QUITMSG1", "$QUITMSG2", "$QUITMSG3",
"$QUITMSG4", "$QUITMSG5", "$QUITMSG6", "$QUITMSG7",

View File

@ -66,9 +66,6 @@ version "4.11"
#include "zscript/menu/swwm_menus.zsc"
#include "zscript/menu/swwm_title.zsc"
#include "zscript/menu/swwm_inter.zsc"
#include "zscript/menu/swwm_inter_sp.zsc"
#include "zscript/menu/swwm_inter_coop.zsc"
#include "zscript/menu/swwm_inter_dm.zsc"
#include "zscript/menu/swwm_help.zsc"
#include "zscript/menu/swwm_credits.zsc"
#include "zscript/menu/swwm_achievementmenu.zsc"

View File

@ -100,8 +100,8 @@ Class SWWMCreditsMenu : GenericMenu
TextureID bgtex;
TextureID logo;
String stitle, stitle2;
String sdev, sassets, smusic, svoice, sfanart, slocal, spatrons, sthanks;
Array<SWWMCreditsEntry> cdev, cassets, cmusic, cvoice, cfanart, clocal, cpatrons, cthanks;
String sdev, sassets, smusic, svoice, slocal, spatrons, sthanks;
Array<SWWMCreditsEntry> cdev, cassets, cmusic, cvoice, clocal, cpatrons, cthanks;
String oldlang;
Vector2 ss;
double hs;
@ -144,7 +144,6 @@ Class SWWMCreditsMenu : GenericMenu
sassets = StringTable.Localize("$SWWM_CASSETS");
smusic = StringTable.Localize("$SWWM_CMUSIC");
svoice = StringTable.Localize("$SWWM_CVOICE");
sfanart = StringTable.Localize("$SWWM_CFANART");
slocal = StringTable.Localize("$SWWM_CLOCAL");
spatrons = StringTable.Localize("$SWWM_CPATRON");
sthanks = StringTable.Localize("$SWWM_CTHANK");
@ -161,10 +160,6 @@ Class SWWMCreditsMenu : GenericMenu
cmusic.Push(new("SWWMCreditsEntry").Init("Teque","Traumatic State\nDragony\nHidden Tune #242\nHypercardish 1.1"));
cmusic.Push(new("SWWMCreditsEntry").Init("BouncyTEM","Solitary Apprehension"));
cvoice.Push(new("SWWMCreditsEntry").Init("Vyolette","$T_DEMOLITIONIST"));
cfanart.Push(new("SWWMCreditsEntry").Init("Substance20 (@S20TBL)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Sgt. Shivers (@Sgt_Shivers_)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Moa Dixøn / Endie (@MoaDixon)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Monsoon-Soft (@MonsoonSoft)"));
clocal.Push(new("SWWMCreditsEntry").Init("Marisa the Magician","$SWWM_LOCES"));
cpatrons.Push(new("SWWMCreditsEntry").Init("Snacks"));
cpatrons.Push(new("SWWMCreditsEntry").Init("john"));
@ -215,11 +210,6 @@ Class SWWMCreditsMenu : GenericMenu
theight += ENTRY_PAD;
theight += c.height;
}
foreach ( c:cfanart )
{
theight += ENTRY_PAD;
theight += c.height;
}
foreach ( c:clocal )
{
theight += ENTRY_PAD;
@ -312,14 +302,6 @@ Class SWWMCreditsMenu : GenericMenu
yy += ENTRY_PAD;
yy += c.Draw(ss,xx,yy);
}
// fanart
yy += SECTION_PAD;
yy += DrawSection(xx,yy,sfanart);
foreach ( c:cfanart )
{
yy += ENTRY_PAD;
yy += c.Draw(ss,xx,yy);
}
// localization
yy += SECTION_PAD;
yy += DrawSection(xx,yy,slocal);

View File

@ -1,20 +1,41 @@
// Custom intermission screens
Class SWWMStatScreen : StatusScreen abstract
Class SWWMStatScreen : StatusScreen
{
transient TextureID bgtex, arttex;
TextureID gradtex, arttex, bgtex;
int glarestr, sndcnt;
int whichart, whichtip;
int tipalphastate;
double tipalpha;
String tipstr;
transient BrokenLines tipl;
Font TewiFont, TewiFontOutline, MiniwiFont;
double FracTic; // for smooth animations
bool bNoDrawNextLoc;
int tipflash; // for switching
// customizable colors
int lnamecolor, lauthcolor; // name / author text
int lsubcolor; // finished / entering text
int statbasecolor, statcolor0, // stat label / color for numbers
statcolor1, statcolor2; // color for 100% / color for SUCKS
int tipcolor0, tipcolor1; // tip header / tip text
Color glarecolor; // for the eye glare when advancing
int flashcolor, tipflashcolor;
double hs, hs2;
Vector2 ss, ss2, origin, origin2;
Font mSmallFont;
String tipstr;
transient BrokenLines tipl;
double bgfade;
bool bFade;
SWWMStaticHandler shnd;
override void Start( wbstartstruct wbstartstruct )
{
Super.Start(wbstartstruct);
mSmallFont = Font.GetFont('TewiFont');
TewiFont = Font.GetFont('TewiFont');
TewiFontOutline = Font.GetFont('TewiFontOutline');
MiniwiFont = Font.GetFont('MiniwiFont');
// support for old author text style
int iof;
for ( int i=0; i<=1; i++ )
@ -37,27 +58,182 @@ Class SWWMStatScreen : StatusScreen abstract
// level name may contain trailing whitespace due to DEHACKED nonsense, so strip it
lnametexts[i].StripRight();
}
tipalpha = -1.;
// defaults
lnamecolor = Font.CR_WHITE;
lauthcolor = Font.CR_DARKGRAY;
lsubcolor = Font.CR_SAPPHIRE;
statbasecolor = Font.CR_SAPPHIRE;
statcolor0 = Font.CR_WHITE;
statcolor1 = Font.CR_GOLD;
statcolor2 = Font.CR_RED;
tipcolor0 = Font.CR_SAPPHIRE;
tipcolor1 = Font.CR_WHITE;
flashcolor = Font.FindFontColor('MiniFlash');
tipflashcolor = Font.FindFontColor('MiniWhiteFlash');
glarecolor = 0xFF4080FF;
}
override void StartMusic()
{
if ( swwm_intermusic ) Level.SetInterMusic(wbs.next);
else S_ChangeMusic("music/DRAGONY.XM");
S_ChangeMusic("music/DRAGONY.XM");
}
private String StatCnt( int a, int b )
{
if ( b <= 0 ) return "N/A";
return String.Format("%s \cu/\c- %s \cu(\c-%3d%%\cu)",SWWMUtility.ThousandsNum(max(a,0)),SWWMUtility.ThousandsNum(b),GetPct(a,b));
}
private String TimeStr( int secs )
{
secs = max(secs,0);
int h = secs/3600;
int m = (secs/60)%60;
int s = secs%60;
if ( h ) return String.Format("%02d\cu:\c-%02d\cu:\c-%02d",h,m,s);
return String.Format("%02d\cu:\c-%02d",m,s);
}
private int GetPct( int a, int b )
{
if ( a < 0 ) return 0;
if ( b <= 0 ) return 100; // for "missed" percentage
return (a*100)/b;
}
override int DrawLF()
{
if ( sp_state < 1 ) return 0;
double GameSecs = (bcnt+FracTic)/double(GameTicRate);
int th = (TewiFont.GetHeight()*(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime))+32)*CleanYFac_1; // height of the stats box + margin
int bh = ((authortexts[0]!="")?(MiniwiFont.GetHeight()+TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2):(TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2))*CleanYFac_1; // height of the "level finished" box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()-th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
yy -= bh;
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawText(TewiFont,lnamecolor,xx-TewiFont.StringWidth(lnametexts[0])*CleanXFac_1,yy,lnametexts[0],DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
yy += TewiFont.GetHeight()*2*CleanYFac_1;
if ( authortexts[0] != "" )
{
Screen.DrawText(MiniwiFont,lauthcolor,xx-MiniwiFont.StringWidth(authortexts[0])*CleanXFac_1/2,yy,authortexts[0],DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += MiniwiFont.GetHeight()*CleanYFac_1;
}
String str = StringTable.Localize("$SWWM_INTERDONE");
Screen.DrawText(TewiFontOutline,lsubcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
if ( (glarestr > 0) && (sp_state < 2) )
{
double alf = clamp((glarestr-FracTic)/20.,0.,1.)**2;
Screen.DrawText(TewiFontOutline,flashcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf);
}
return 0;
}
override void DrawEL()
{
int th = (TewiFont.GetHeight()*(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime))+32)*CleanYFac_1; // height of the stats box + margin
int bh = ((authortexts[1]!="")?(MiniwiFont.GetHeight()+TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2):(TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2))*CleanYFac_1; // height of the "level finished" box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()+th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
String str = StringTable.Localize("$SWWM_INTERNEXT");
Screen.DrawText(TewiFontOutline,lsubcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
if ( (glarestr > 0) && (sp_state >= 10) )
{
double alf = clamp((glarestr-FracTic)/20.,0.,1.)**2;
Screen.DrawText(TewiFontOutline,flashcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf);
}
yy += TewiFontOutline.GetHeight()*2*CleanYFac_1;
Screen.DrawText(TewiFont,lnamecolor,xx-TewiFont.StringWidth(lnametexts[1])*CleanXFac_1,yy,lnametexts[1],DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanXFac_1*2);
yy += TewiFont.GetHeight()*2*CleanYFac_1;
if ( authortexts[0] == "" ) return;
Screen.DrawText(MiniwiFont,lauthcolor,xx-MiniwiFont.StringWidth(authortexts[1])*CleanXFac_1/2,yy,authortexts[1],DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
override void drawStats( void )
{
if ( sp_state < 2 ) return;
int ne = (sp_state>=8)?(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime)):(sp_state>=6)?6:(sp_state>=4)?4:2;
int th = (TewiFont.GetHeight()*ne)*CleanYFac_1; // height of the stats box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()-th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+th/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,th+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+th/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,th+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
String str = StringTable.Localize("$SWWM_INTERKILLS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_kills[0],wbs.maxkills);
Screen.DrawText(TewiFont,((wbs.maxkills>0)&&(cnt_kills[0]>=wbs.maxkills))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 4 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERITEMS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_items[0],wbs.maxitems);
Screen.DrawText(TewiFont,((wbs.maxitems>0)&&(cnt_items[0]>=wbs.maxitems))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 6 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERSECRETS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_secret[0],wbs.maxsecret);
Screen.DrawText(TewiFont,((wbs.maxsecret>0)&&(cnt_secret[0]>=wbs.maxsecret))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 8 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = "┈┈┄┄╌╌────╌╌┄┄┈┈";
Screen.DrawText(TewiFont,statbasecolor,xx-TewiFont.StringWidth(str)*CleanXFac_1/2,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERTIME");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_time,0));
Screen.DrawText(TewiFont,(wbs.partime&&(cnt_time<=(wbs.partime/GameTicRate)))?statcolor1:((wbs.sucktime>0)&&(cnt_time>(wbs.sucktime*3600)))?statcolor2:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( wbs.partime )
{
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERPAR");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_par,0));
Screen.DrawText(TewiFont,statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
if ( wbs.totaltime == Plrs[me].stime ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERTOTAL");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_total_time,0));
Screen.DrawText(TewiFont,statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
private void drawSWWMBg()
{
let shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
if ( !whichart && swwm_interart )
if ( !shnd ) shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
if ( !whichart )
{
int no = StringTable.Localize("$SWWM_NFANART").ToInt();
int no = StringTable.Localize("$SWWM_NRENDER").ToInt();
Array<Int> ents;
ents.Clear();
int rno = 0;
for ( int i=1; i<=no; i++ )
{
if ( (swwm_interart == 2) && (StringTable.Localize("$SWWM_FANART"..i).Left(6) == "Marisa") )
continue;
else if ( (swwm_interart == 3) && (StringTable.Localize("$SWWM_FANART"..i).Left(6) != "Marisa") )
continue;
ents.Push(i);
rno++;
}
@ -83,38 +259,24 @@ Class SWWMStatScreen : StatusScreen abstract
}
double ar = Screen.GetAspectRatio(), sar;
Vector2 tsize, vsize;
if ( whichart ) Screen.Clear(0,0,Screen.GetWidth(),Screen.GetHeight(),"Black");
else
{
if ( !bgtex ) bgtex = TexMan.CheckForTexture("graphics/InterBG.png");
tsize = TexMan.GetScaledSize(bgtex);
sar = tsize.x/tsize.y;
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);
}
Screen.Clear(0,0,Screen.GetWidth(),Screen.GetHeight(),"Black");
// background pics
if ( whichart )
{
String artstr = StringTable.Localize(String.Format("$SWWM_FANART%d",whichart));
int semic = artstr.IndexOf(";");
if ( !arttex ) arttex = TexMan.CheckForTexture(String.Format("graphics/Fanart/%s",(semic==-1)?artstr:artstr.Left(semic)));
String artstr = StringTable.Localize(String.Format("$SWWM_RENDER%d",whichart));
if ( !arttex ) arttex = TexMan.CheckForTexture("graphics/Renders/"..artstr);
tsize = TexMan.GetScaledSize(arttex);
sar = tsize.x/tsize.y;
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);
if ( semic != -1 )
{
String bstr = String.Format("\cx%s\c- %s",StringTable.Localize("$SWWM_FANART"),artstr.Mid(semic+1));
int len = mSmallFont.StringWidth(bstr);
int bw = int((len+8)*hs), bh = int((mSmallFont.GetHeight()+4)*hs);
Screen.Dim("Black",.8,Screen.GetWidth()-bw,Screen.GetHeight()-bh,bw,bh);
Screen.DrawText(mSmallFont,Font.CR_GOLD,ss.x-(len+4),ss.y-(mSmallFont.GetHeight()+2),bstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}
Screen.Dim("Black",.25,0,0,Screen.GetWidth(),Screen.GetHeight());
}
private void drawSWWMFg()
{
if ( !shnd ) shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
// intermission tips at the bottom
if ( !whichtip )
{
@ -139,136 +301,101 @@ Class SWWMStatScreen : StatusScreen abstract
}
}
whichtip = ents[Random[InterArt](0,ents.Size()-1)];
tipstr = "\cd"..String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\c-\n"..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip));
tipstr = String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\n"..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip));
if ( tipl ) tipl.Destroy();
shnd.lasttip.Push(whichtip);
}
if ( swwm_nointertips ) return;
if ( tipalpha <= 0. ) return;
double alf = clamp(tipalpha+(tipalphastate*fractic)/GameTicRate,0.,1.);
if ( !tipl ) tipl = TewiFontOutline.BreakLines(tipstr,400);
int lw = 0;
if ( !tipl ) tipl = mSmallFont.BreakLines(tipstr,400);
for ( int i=0; i<tipl.Count(); i++ )
if ( tipl.StringWidth(i) > lw )
lw = tipl.StringWidth(i);
int bw = int((lw+12)*hs), bh = int((mSmallFont.GetHeight()*tipl.Count()+8)*hs);
double xx = 8, yy = (ss.y-8)-(mSmallFont.GetHeight()*tipl.Count());
Screen.Dim("Black",.8,int((xx-4)*hs),int((yy-4)*hs),bw,bh);
double xx = (Screen.GetWidth()-lw*CleanXFac_1)/2;
double yy = Screen.GetHeight()-60*CleanYFac_1;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// downshift to fit tips
int fct = clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)/3;
yy += fct;
}
yy -= (tipl.Count()-1)*TewiFontOutline.GetHeight();
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,Screen.GetWidth()/2,yy+TewiFontOutline.GetHeight()*tipl.Count()*CleanYFac_1/2.,DTA_DestWidth,350*CleanXFac_1,DTA_DestHeight,(TewiFontOutline.GetHeight()*tipl.Count()+8)*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8*alf,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,Screen.GetWidth()/2,yy+TewiFontOutline.GetHeight()*tipl.Count()*CleanYFac_1/2.,DTA_DestWidth,350*CleanXFac_1,DTA_DestHeight,(TewiFontOutline.GetHeight()*tipl.Count()+8)*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8*alf,DTA_TopOffset,256,DTA_LeftOffset,128);
double alph;
if ( tipflash && (gametic < tipflash) ) alph = max((tipflash-(gametic+fractic))/25.,0.)**1.5;
xx -= 8*CleanXFac_1;
for ( int i=0; i<tipl.Count(); i++ )
{
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx,yy,tipl.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += mSmallFont.GetHeight();
xx = 12;
Screen.DrawText(TewiFontOutline,(i==0)?tipcolor0:tipcolor1,xx,yy,tipl.StringAt(i),DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1,DTA_Alpha,alf);
if ( tipflash && (gametic < tipflash) )
Screen.DrawText(TewiFontOutline,tipflashcolor,xx,yy,tipl.StringAt(i),DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf*alph);
yy += TewiFontOutline.GetHeight()*CleanYFac_1;
if ( i == 0 ) xx += 16*CleanXFac_1;
}
}
override int DrawLF()
override void Drawer( void )
{
int len[2];
len[0] = mSmallFont.StringWidth(lnametexts[0]);
len[1] = mSmallFont.StringWidth(authortexts[0]);
int dimlen = max(int((len[0]+8)*hs2),int((len[1]+8)*hs));
bool auth = (authortexts[0].Length()>0);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(4*hs2),dimlen,int((mSmallFont.GetHeight()+(auth?2:4))*hs2));
Screen.DrawText(mSmallFont,Font.CR_GREEN,int((ss2.x-len[0])/2.),6,lnametexts[0],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
double foy = mSmallFont.GetHeight()+(auth?6:8);
if ( auth )
{
double oy = foy*(hs2/hs);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((mSmallFont.GetHeight()+2)*hs));
Screen.DrawText(mSmallFont,Font.CR_WHITE,int((ss.x-len[1])/2.),oy,authortexts[0],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
foy += (mSmallFont.GetHeight()+2)*(hs/hs2);
}
foy += 4.;
String str = StringTable.Localize("$WI_FINISHED");
len[0] = mSmallFont.StringWidth(str);
Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(foy*hs2),int((len[0]+8)*hs2),int((mSmallFont.GetHeight()+4)*hs2));
Screen.DrawText(mSmallFont,Font.CR_FIRE,int((ss2.x-len[0])/2.),foy+2,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
// return not used
return 0;
}
override void DrawEL()
{
String str = StringTable.Localize("$WI_ENTERING");
// remove trailing colon (usually appearing on Heretic)
if ( str.RightIndexOf(":") == (str.length()-1) ) str.Truncate(str.length()-1);
int len[2];
len[0] = mSmallFont.StringWidth(str);
Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(4*hs2),int((len[0]+8)*hs2),int((mSmallFont.GetHeight()+4)*hs2));
Screen.DrawText(mSmallFont,Font.CR_FIRE,int((ss2.x-len[0])/2.),6,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
double foy = mSmallFont.GetHeight()+12;
len[0] = mSmallFont.StringWidth(lnametexts[1]);
len[1] = mSmallFont.StringWidth(authortexts[1]);
int dimlen = max(int((len[0]+8)*hs2),int((len[1]+8)*hs));
bool auth = (authortexts[1].Length()>0);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(foy*hs2),dimlen,int((mSmallFont.GetHeight()+(auth?2:4))*hs2));
Screen.DrawText(mSmallFont,Font.CR_GREEN,int((ss2.x-len[0])/2.),foy+2,lnametexts[1],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
if ( auth )
{
double oy = (foy+mSmallFont.GetHeight()+2)*(hs2/hs);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((mSmallFont.GetHeight()+2)*hs));
Screen.DrawText(mSmallFont,Font.CR_WHITE,int((ss.x-len[1])/2.),oy,authortexts[1],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}
override void drawShowNextLoc( void )
{
drawSWWMBg();
drawEL();
}
override void Drawer()
{
// nothing here
}
override void Draw( double smoothratio )
{
hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
hs2 = max(min(floor(Screen.GetWidth()/320.),floor(Screen.GetHeight()/200.)),1.);
ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
ss2 = (Screen.GetWidth(),Screen.GetHeight())/hs2;
origin = (ss.x-640,ss.y-400)/2.;
origin2 = (ss2.x-320,ss2.y-200)/2.;
switch ( CurState )
{
case StatCount:
drawSWWMBg();
drawLF();
drawStats();
drawSWWMFg();
break;
case ShowNextLoc:
case NoState:
case LeavingIntermission:
drawShowNextLoc();
break;
break;
default:
drawNoState();
drawSWWMBg();
drawLF();
drawStats();
if ( !bNoDrawNextLoc ) drawEL();
drawSWWMFg();
break;
}
if ( bgfade <= 0. ) return;
if ( (bgfade <= 0.) || !arttex ) return;
double alph = bgfade;
if ( bFade ) alph = min(1.,bgfade+(3.*smoothratio)/GameTicRate);
else alph = max(0.,bgfade-(4.*smoothratio)/GameTicRate);
if ( bFade ) alph = min(1.,bgfade+(3.*FracTic)/GameTicRate);
else alph = max(0.,bgfade-(4.*FracTic)/GameTicRate);
// redraw BG on top, hiding the rest of the ui
TextureID tx;
if ( whichart ) tx = arttex;
else tx = bgtex;
double ar = Screen.GetAspectRatio();
Vector2 tsize = TexMan.GetScaledSize(tx);
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(tx,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,alph);
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,alph);
}
override void Draw( double smoothratio )
{
FracTic = smoothratio;
Drawer();
if ( glarestr > 0 )
Screen.Dim(glarecolor,(clamp((glarestr-fractic)/20.,0.,1.)**2)*.3,0,0,Screen.GetWidth(),Screen.GetHeight());
}
override void Ticker( void )
{
bcnt++;
if ( bcnt == 1 ) StartMusic();
glarestr = max(glarestr-1,0);
tipalpha = min(tipalpha+tipalphastate/double(GameTicRate),2.);
switch (CurState)
{
case StatCount:
tipalphastate = 1;
updateStats();
break;
case ShowNextLoc:
updateShowNextLoc();
break;
case NoState:
tipalphastate = -2;
updateNoState();
break;
case LeavingIntermission:
@ -278,29 +405,7 @@ Class SWWMStatScreen : StatusScreen abstract
// check fade
if ( bFade ) bgfade = min(1.,bgfade+3./GameTicRate);
else bgfade = max(0.,bgfade-4./GameTicRate);
// force toggle
if ( !swwm_interart && (whichart != 0) )
{
whichart = 0;
arttex.SetNull();
}
}
protected String TimeStr( int secs )
{
secs = max(secs,0);
int h = secs/3600;
int m = (secs/60)%60;
int s = secs%60;
if ( h ) return String.Format("%02d\cu:\c-%02d\cu:\c-%02d",h,m,s);
return String.Format("%02d\cu:\c-%02d",m,s);
}
protected int GetPct( int a, int b, bool inv = false )
{
if ( a < 0 ) return 0;
if ( b <= 0 ) return inv?0:100; // for "missed" percentage
return (a*100)/b;
}
override bool OnEvent( InputEvent evt )
{
if ( evt.type == InputEvent.Type_KeyDown )
@ -318,13 +423,14 @@ Class SWWMStatScreen : StatusScreen abstract
}
if ( cmd ~== "+reload" )
{
if ( !swwm_nointertips ) PlaySound("menu/demoscroll");
PlaySound("misc/chat");
whichtip = 0;
tipflash = gametic+25;
return true;
}
if ( cmd ~== "+zoom" )
{
if ( swwm_interart ) PlaySound("menu/demoscroll");
PlaySound("misc/chat");
whichart = 0;
arttex.SetNull();
return true;
@ -339,4 +445,155 @@ Class SWWMStatScreen : StatusScreen abstract
}
return false;
}
override void updateNoState()
{
// make sure tip alpha is zero, so this transition is less jarring
if ( tipalpha > 0. ) return;
Super.updateNoState();
}
override void initShowNextLoc()
{
if ( wbs.next == "" )
{
// the base statscreen skips directly here, which looks
// very jarring with this one, so just skip to NoState
bNoDrawNextLoc = true;
initNoState();
return;
}
CurState = ShowNextLoc;
acceleratestage = 0;
cnt = SHOWNEXTLOCDELAY*GameTicRate;
noautostartmap = false;
}
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
sp_state = 0;
cnt_kills[0] = cnt_items[0] = cnt_secret[0] = -1;
cnt_time = cnt_par = -1;
cnt_pause = GameTicRate*2;
cnt_total_time = -1;
}
override void updateStats()
{
if ( sp_state == 0 )
{
if ( bcnt > GameTicRate )
{
S_StartSound("misc/interstart",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
acceleratestage = 0;
glarestr = 20;
sp_state++;
}
return;
}
if ( acceleratestage && (sp_state != 10) )
{
acceleratestage = 0;
sp_state = 10;
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 10;
cnt_kills[0] = Plrs[me].skills;
cnt_items[0] = Plrs[me].sitems;
cnt_secret[0] = Plrs[me].ssecret;
cnt_time = Thinker.Tics2Seconds(Plrs[me].stime);
cnt_par = wbs.partime/GameTicRate;
cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime);
}
if ( sp_state == 2 )
{
cnt_kills[0] += max((Plrs[me].skills-cnt_kills[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_kills[0] >= Plrs[me].skills )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_kills[0] = Plrs[me].skills;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 4 )
{
cnt_items[0] += max((Plrs[me].sitems-cnt_items[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_items[0] >= Plrs[me].sitems )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_items[0] = Plrs[me].sitems;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 6 )
{
cnt_secret[0] += max((Plrs[me].ssecret-cnt_secret[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_secret[0] >= Plrs[me].ssecret )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_secret[0] = Plrs[me].ssecret;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 8 )
{
int sec = Thinker.Tics2Seconds(Plrs[me].stime);
int tsec = Thinker.Tics2Seconds(wbs.totaltime);
int psec = wbs.partime/GameTicRate;
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
cnt_time += max((sec-cnt_time)/GameTicRate,1);
cnt_par += max((psec-cnt_par)/GameTicRate,1);
cnt_total_time += max((tsec-cnt_total_time)/GameTicRate,1);
if ( cnt_time >= sec ) cnt_time = sec;
if ( cnt_total_time >= tsec ) cnt_total_time = tsec;
if ( cnt_par >= psec )
{
cnt_par = psec;
if ( cnt_time >= sec )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_total_time = tsec;
glarestr = 10;
sp_state++;
}
}
}
else if ( sp_state == 10 )
{
if ( acceleratestage )
{
S_StartSound("misc/interdone",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 20;
initShowNextLoc();
}
}
else if ( sp_state&1 )
{
if ( !--cnt_pause )
{
sp_state++;
cnt_pause = GameTicRate;
sndcnt = 0;
}
}
}
}

View File

@ -1,249 +0,0 @@
// Cooperative stats
Class SWWMStatScreen_Coop : SWWMStatScreen
{
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
ng_state = 1;
cnt_pause = GameTicRate;
for ( int i=0; i<MAXPLAYERS; i++ )
{
playerready[i] = false;
cnt_kills[i] = cnt_items[i] = cnt_secret[i] = cnt_frags[i] = 0;
if ( !playeringame[i] ) continue;
dofrags += fragSum(i);
}
dofrags = !!dofrags;
}
override void updateStats()
{
int fsum;
bool stillticking;
bool autoskip = autoSkip();
if ( (acceleratestage || autoskip) && (ng_state != 10) )
{
acceleratestage = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_kills[i] = Plrs[i].skills;
cnt_items[i] = Plrs[i].sitems;
cnt_secret[i] = Plrs[i].ssecret;
if ( dofrags ) cnt_frags[i] = fragSum(i);
}
PlaySound("menu/buyinv");
ng_state = 10;
}
if ( ng_state == 2 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_kills[i] += max((Plrs[i].skills-cnt_kills[i])/10,2);
if ( cnt_kills[i] > Plrs[i].skills ) cnt_kills[i] = Plrs[i].skills;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 4 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_items[i] += max((Plrs[i].sitems-cnt_items[i])/10,2);
if ( cnt_items[i] > Plrs[i].sitems ) cnt_items[i] = Plrs[i].sitems;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 6 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_secret[i] += max((Plrs[i].ssecret-cnt_secret[i])/10,2);
if ( cnt_secret[i] > Plrs[i].ssecret ) cnt_secret[i] = Plrs[i].ssecret;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state += 1+2*!dofrags;
}
}
else if ( ng_state == 8 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
fsum = fragSum(i);
cnt_frags[i] += max((fsum-cnt_frags[i])/10,1);
if ( cnt_frags[i] >= fsum ) cnt_frags[i] = fsum;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 10 )
{
int i;
for ( i=0; i<MAXPLAYERS; i++ )
{
// If the player is in the game and not ready, stop checking
if ( playeringame[i] && !players[i].Bot && !playerready[i] )
break;
}
// All players are ready; proceed.
if ( ((i == MAXPLAYERS) && acceleratestage) || autoskip )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( ng_state&1 )
{
if ( !--cnt_pause )
{
ng_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
int checkmark = 0x2714; // "✔"
String namestr = StringTable.Localize("$SCORE_NAME");
String itemsstr = StringTable.Localize((gameinfo.gametype&GAME_Raven)?"$SCORE_BONUS":"$SCORE_ITEMS");
String secretstr = StringTable.Localize("$SCORE_SECRET");
String killsstr = StringTable.Localize("$SCORE_KILLS");
String missedstr = StringTable.Localize("$SCORE_MISSED");
String totalstr = StringTable.Localize("$SCORE_TOTAL");
int namelen = max(max(mSmallFont.StringWidth(namestr),mSmallFont.StringWidth("XXXXXXXXXX")),max(mSmallFont.StringWidth(missedstr),mSmallFont.StringWidth(totalstr)));
int nplayers = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
namelen = max(namelen,mSmallFont.StringWidth(players[i].GetUserName()));
nplayers++;
}
int misseditems = wbs.maxitems;
int missedsecret = wbs.maxsecret;
int missedkills = wbs.maxkills;
String itemstotal = String.Format("%d",misseditems);
String secrettotal = String.Format("%d",missedsecret);
String killstotal = String.Format("%d",missedkills);
int itemslen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(itemstotal),mSmallFont.StringWidth(itemsstr)));
int secretlen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(secrettotal),mSmallFont.StringWidth(secretstr)));
int killslen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(killstotal),mSmallFont.StringWidth(killsstr)));
int pad = 2;
int spc = 12;
int hspc = 6;
int lspc = 2;
int rwidth = mSmallFont.GetCharWidth(checkmark)+4;
int linew = pad+rwidth+namelen+spc+itemslen+spc+secretlen+spc+killslen+pad;
int boxwidth = pad+linew+pad;
int lineh = mSmallFont.GetHeight();
int boxheight = pad+lineh+hspc+(lineh+lspc)*nplayers+hspc+lineh+lspc+lineh+pad;
Screen.Dim("Black",.8,int((ss.x-boxwidth)*hs)/2,int((ss.y-boxheight)*hs)/2,int(boxwidth*hs),int(boxheight*hs));
// header
int xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
int yy = int((ss.y-boxheight)/2+pad);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,namestr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,itemsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += itemslen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,secretstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += secretlen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,killsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+hspc;
String str;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
xx = int((ss.x-boxwidth)/2.+pad);
Screen.Dim(players[i].GetDisplayColor(),.4,int(xx*hs),int(yy*hs),int(linew*hs),int(lineh*hs));
xx += pad;
if ( playerready[i] || players[i].Bot ) Screen.DrawChar(mSmallFont,Font.CR_GREEN,xx,yy,checkmark,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += rwidth;
Screen.DrawText(mSmallFont,GetRowColor(players[i],i==me),xx,yy,players[i].GetUserName(),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%3d\cu%%\c-",GetPct(cnt_items[i],wbs.maxitems));
Screen.DrawText(mSmallFont,(!wbs.maxitems||(cnt_items[i]>=wbs.maxitems))?Font.CR_GOLD:Font.CR_WHITE,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
misseditems -= cnt_items[i];
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%3d\cu%%\c-",GetPct(cnt_secret[i],wbs.maxsecret));
Screen.DrawText(mSmallFont,(!wbs.maxsecret||(cnt_secret[i]>=wbs.maxsecret))?Font.CR_GOLD:Font.CR_WHITE,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
missedsecret -= cnt_secret[i];
}
xx += secretlen+spc;
str = String.Format("%3d\cu%%\c-",GetPct(cnt_kills[i],wbs.maxkills));
Screen.DrawText(mSmallFont,(!wbs.maxkills||(cnt_kills[i]>=wbs.maxkills))?Font.CR_GOLD:Font.CR_WHITE,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
missedkills -= cnt_kills[i];
yy += lineh+lspc;
}
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
yy += hspc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,missedstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%3d\cu%%\c-",GetPct(misseditems,wbs.maxitems,true));
Screen.DrawText(mSmallFont,(wbs.maxitems&&(misseditems>0))?Font.CR_WHITE:Font.CR_GOLD,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%3d\cu%%\c-",GetPct(missedsecret,wbs.maxsecret,true));
Screen.DrawText(mSmallFont,(wbs.maxsecret&&(missedsecret>0))?Font.CR_WHITE:Font.CR_GOLD,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += secretlen+spc;
str = String.Format("%3d\cu%%\c-",GetPct(missedkills,wbs.maxkills,true));
Screen.DrawText(mSmallFont,(wbs.maxkills&&(missedkills>0))?Font.CR_WHITE:Font.CR_GOLD,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+lspc;
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%d",wbs.maxitems);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%d",wbs.maxsecret);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += secretlen+spc;
str = String.Format("%d",wbs.maxkills);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View File

@ -1,181 +0,0 @@
// Deathmatch stats
Class SWWMStatScreen_DM : SWWMStatScreen
{
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
for( int i=0; i<MAXPLAYERS; i++ )
{
playerready[i] = false;
cnt_frags[i] = cnt_deaths[i] = player_deaths[i] = 0;
}
total_frags = 0;
total_deaths = 0;
ng_state = 1;
cnt_pause = GameTicRate;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
for ( int j=0; j<MAXPLAYERS; j++ )
{
if ( !playeringame[j] ) continue;
player_deaths[i] += Plrs[j].frags[i];
}
total_deaths += player_deaths[i];
total_frags += Plrs[i].fragcount;
}
}
override void updateStats()
{
bool stillticking;
bool doautoskip = autoSkip();
if ( (acceleratestage || doautoskip) && (ng_state != 6) )
{
acceleratestage = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_frags[i] = Plrs[i].fragcount;
cnt_deaths[i] = player_deaths[i];
}
PlaySound("menu/buyinv");
ng_state = 6;
}
if ( ng_state == 2 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_frags[i] += max((Plrs[i].fragcount-cnt_frags[i])/10,2);
if ( cnt_frags[i] > Plrs[i].fragcount ) cnt_frags[i] = Plrs[i].fragcount;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 4 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_deaths[i] += max((player_deaths[i]-cnt_deaths[i])/10,2);
if ( cnt_deaths[i] > player_deaths[i] ) cnt_deaths[i] = player_deaths[i];
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 6 )
{
int i;
for ( i=0; i<MAXPLAYERS; i++ )
{
// If the player is in the game and not ready, stop checking
if ( playeringame[i] && !players[i].Bot && !playerready[i] )
break;
}
// All players are ready; proceed.
if ( ((i == MAXPLAYERS) && acceleratestage) || doautoskip )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( ng_state&1 )
{
if ( !--cnt_pause )
{
ng_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
int checkmark = 0x2714; // "✔"
String namestr = StringTable.Localize("$SCORE_NAME");
String deathsstr = StringTable.Localize("$SCORE_DEATHS");
String fragsstr = StringTable.Localize("$SCORE_FRAGS");
String totalstr = StringTable.Localize("$SCORE_TOTAL");
int namelen = max(max(mSmallFont.StringWidth(namestr),mSmallFont.StringWidth("XXXXXXXXXX")),mSmallFont.StringWidth(totalstr));
int nplayers = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
namelen = max(namelen,mSmallFont.StringWidth(players[i].GetUserName()));
nplayers++;
}
String deathstotal = String.Format("%d",total_deaths);
String fragstotal = String.Format("%d",total_frags);
int deathslen = max(mSmallFont.StringWidth(deathstotal),mSmallFont.StringWidth(deathsstr));
int fragslen = max(mSmallFont.StringWidth(fragstotal),mSmallFont.StringWidth(fragsstr));
int pad = 2;
int spc = 12;
int hspc = 6;
int lspc = 2;
int rwidth = mSmallFont.GetCharWidth(checkmark)+4;
int linew = pad+rwidth+namelen+spc+deathslen+spc+fragslen+pad;
int boxwidth = pad+linew+pad;
int lineh = mSmallFont.GetHeight();
int boxheight = pad+lineh+hspc+(lineh+lspc)*nplayers+hspc+lineh+pad;
Screen.Dim("Black",.8,int((ss.x-boxwidth)*hs)/2,int((ss.y-boxheight)*hs)/2,int(boxwidth*hs),int(boxheight*hs));
// header
int xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
int yy = int((ss.y-boxheight)/2+pad);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,namestr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,deathsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += deathslen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,fragsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+hspc;
String str;
Array<Int> sorted;
GetSortedPlayers(sorted,teamplay);
foreach ( i:sorted )
{
if ( !playeringame[i] ) continue;
xx = int((ss.x-boxwidth)/2+pad);
Screen.Dim(players[i].GetDisplayColor(),.4,int(xx*hs),int(yy*hs),int(linew*hs),int(lineh*hs));
xx += pad;
if ( playerready[i] || players[i].Bot ) Screen.DrawChar(mSmallFont,Font.CR_GREEN,xx,yy,checkmark,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += rwidth;
Screen.DrawText(mSmallFont,GetRowColor(players[i],i==me),xx,yy,players[i].GetUserName(),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 2 )
{
str = String.Format("%d",cnt_deaths[i]);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+deathslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += deathslen+spc;
str = String.Format("%d",cnt_frags[i]);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+fragslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+lspc;
}
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
yy += hspc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%d",total_deaths);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+deathslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += deathslen+spc;
str = String.Format("%d",total_frags);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+fragslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View File

@ -1,287 +0,0 @@
// Single-player stats
Class SWWMStatScreen_SP : SWWMStatScreen
{
int intermissioncounter;
override void initStats()
{
intermissioncounter = gameinfo.intermissioncounter;
CurState = StatCount;
acceleratestage = 0;
sp_state = 1;
cnt_kills[0] = cnt_items[0] = cnt_secret[0] = -1;
cnt_time = cnt_par = -1;
cnt_pause = GameTicRate;
cnt_total_time = -1;
}
override void updateStats()
{
if ( acceleratestage && (sp_state != 10) )
{
acceleratestage = 0;
sp_state = 10;
PlaySound("menu/buyinv");
cnt_kills[0] = Plrs[me].skills;
cnt_items[0] = Plrs[me].sitems;
cnt_secret[0] = Plrs[me].ssecret;
cnt_time = Thinker.Tics2Seconds(Plrs[me].stime);
cnt_par = wbs.partime/GameTicRate;
cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime);
}
if ( sp_state == 2 )
{
if ( intermissioncounter )
{
cnt_kills[0] += max((Plrs[me].skills-cnt_kills[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_kills[0] >= Plrs[me].skills) )
{
cnt_kills[0] = Plrs[me].skills;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 4 )
{
if ( intermissioncounter )
{
cnt_items[0] += max((Plrs[me].sitems-cnt_items[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_items[0] >= Plrs[me].sitems) )
{
cnt_items[0] = Plrs[me].sitems;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 6 )
{
if ( intermissioncounter )
{
cnt_secret[0] += max((Plrs[me].ssecret-cnt_secret[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_secret[0] >= Plrs[me].ssecret) )
{
cnt_secret[0] = Plrs[me].ssecret;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 8 )
{
int sec = Thinker.Tics2Seconds(Plrs[me].stime);
int tsec = Thinker.Tics2Seconds(wbs.totaltime);
int psec = wbs.partime/GameTicRate;
if ( intermissioncounter )
{
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
cnt_time += max((sec-cnt_time)/10,3);
cnt_par += max((psec-cnt_par)/10,3);
cnt_total_time += max((tsec-cnt_total_time)/10,3);
}
if ( !intermissioncounter || (cnt_time >= sec) )
cnt_time = sec;
if ( !intermissioncounter || (cnt_total_time >= tsec) )
cnt_total_time = tsec;
if ( !intermissioncounter || (cnt_par >= psec) )
{
cnt_par = psec;
if ( cnt_time >= sec )
{
cnt_total_time = tsec;
PlaySound("menu/buyinv");
sp_state++;
}
}
}
else if ( sp_state == 10 )
{
if ( acceleratestage )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( sp_state&1 )
{
if ( !--cnt_pause )
{
sp_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
// estimate max width of the whole stat counter
int maxlen, maxlenl = 0, maxlenr = 0;
// left strings
String str = StringTable.Localize("$TXT_IMKILLS")..":";
int len = mSmallFont.StringWidth(str);
maxlenl = len;
str = StringTable.Localize("$TXT_IMITEMS")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
str = StringTable.Localize("$TXT_IMSECRETS")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
str = StringTable.Localize("$TXT_IMTIME")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
if ( wbs.partime )
{
str = StringTable.Localize("$TXT_IMPAR")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) )
{
str = StringTable.Localize("$SCORE_TOTAL")..":"; // hey, as long as it works
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
}
// right strings
if ( wi_percents )
{
str = (!wbs.maxkills)?"N/A":String.Format("%d%%",GetPct(Plrs[me].skills,wbs.maxkills));
len = mSmallFont.StringWidth(str);
maxlenr = len;
str = (!wbs.maxitems)?"N/A":String.Format("%d%%",GetPct(Plrs[me].sitems,wbs.maxitems));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
str = (!wbs.maxsecret)?"N/A":String.Format("%d%%",GetPct(Plrs[me].ssecret,wbs.maxsecret));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
else
{
str = (!wbs.maxkills)?"N/A":String.Format("%d / %d",Plrs[me].skills,wbs.maxkills);
len = mSmallFont.StringWidth(str);
maxlenr = len;
str = (!wbs.maxitems)?"N/A":String.Format("%d / %d",Plrs[me].sitems,wbs.maxitems);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
str = (!wbs.maxsecret)?"N/A":String.Format("%d / %d",Plrs[me].ssecret,wbs.maxsecret);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
str = TimeStr(Thinker.Tics2Seconds(Plrs[me].stime));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
if ( wbs.partime )
{
str = TimeStr(wbs.partime/GameTicRate);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) )
{
str = TimeStr(Thinker.Tics2Seconds(wbs.totaltime));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
int step = mSmallFont.GetHeight()+1;
int nl = clamp(sp_state/2,0,4);
if ( (nl == 4) )
{
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) ) nl++;
if ( wbs.partime ) nl++;
}
nl *= step;
maxlen = maxlenl+max(100,maxlenr);
// draw the whole damn thing
if ( sp_state >= 2 ) Screen.Dim("Black",.8,int((ss2.x-maxlen-8)*.5*hs2),int((ss2.y-nl-8)*.5*hs2),int((maxlen+8)*hs2),int((nl+8)*hs2));
int xx = int((ss2.x-maxlen)/2), yy = int((ss2.y-nl)/2);
if ( sp_state >= 2 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMKILLS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 4 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMITEMS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 6 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMSECRETS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 8 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMTIME")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( wbs.partime )
{
if ( sp_state >= 8 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMPAR")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) && (sp_state >= 8) )
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$SCORE_TOTAL")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
xx = int((ss2.x+maxlen)/2);
yy = int((ss2.y-nl)/2);
if ( wi_percents )
{
if ( cnt_kills[0] >= 0 )
{
str = (!wbs.maxkills)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_kills[0],wbs.maxkills));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_kills[0]>=wbs.maxkills)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_items[0] >= 0 )
{
str = (!wbs.maxitems)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_items[0],wbs.maxitems));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_items[0]>=wbs.maxitems)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_secret[0] >= 0 )
{
str = (!wbs.maxsecret)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_secret[0],wbs.maxsecret));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_secret[0]>=wbs.maxsecret)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
}
else
{
if ( cnt_kills[0] >= 0 )
{
str = (!wbs.maxkills)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_kills[0],0),wbs.maxkills);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_kills[0]>=wbs.maxkills)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_items[0] >= 0 )
{
str = (!wbs.maxitems)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_items[0],0),wbs.maxitems);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_items[0]>=wbs.maxitems)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_secret[0] >= 0 )
{
str = (!wbs.maxsecret)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_secret[0],0),wbs.maxsecret);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_secret[0]>=wbs.maxsecret)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
}
if ( cnt_time >= 0 )
{
str = TimeStr(cnt_time);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(wbs.partime&&(cnt_time<=(wbs.partime/GameTicRate)))?Font.CR_GOLD:((wbs.sucktime>0)&&(cnt_time>(wbs.sucktime*3600)))?Font.CR_RED:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( wbs.partime && (cnt_par >= 0) )
{
str = TimeStr(cnt_par);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) && (cnt_total_time >= 0) )
{
str = TimeStr(cnt_total_time);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
}
}