From 13b2cb53b39c365583baf5b07f234f0b07fb5355 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Thu, 7 Dec 2023 23:17:27 +0100 Subject: [PATCH] Add player path tracing in minimap. --- cvarinfo.base | 3 + language.def_menu | 6 ++ language.es_menu | 6 ++ language.version | 4 +- menudef.txt | 3 + zscript/handler/swwm_handler.zsc | 7 ++ zscript/handler/swwm_handler_process.zsc | 79 +++++++++++++++++++ zscript/hud/swwm_hud_topstuff.zsc | 52 ++++++++++++ zscript/player/swwm_player_tick.zsc | 8 +- zscript/utility/swwm_utility_achievements.zsc | 2 +- 10 files changed, 166 insertions(+), 4 deletions(-) diff --git a/cvarinfo.base b/cvarinfo.base index cce4f3147..89d7606d4 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -89,6 +89,9 @@ server bool swwm_altclear = false; // use an alternate, less graphically demand nosave bool swwm_mm_enable = true; // show a minimap below the score counter nosave bool swwm_mm_missiles = true; // show projectiles (how revolutionary) nosave bool swwm_mm_usecanvas = false; // use a canvas to draw the minimap, so its pixel density is consistent with the rest of the HUD +nosave noarchive bool swwm_mm_steptrace = false;// traces the player path in the minimap +nosave int swwm_mm_maxsteps = 5000; // how many steps to keep track of +nosave float swwm_mm_minstep = 32.; // minimum 2D distance between steps in map units server noarchive bool swwm_iseriouslywanttoplaythiswithbd = false; // self-explanatory diff --git a/language.def_menu b/language.def_menu index e3bd9e052..7adb98ea8 100644 --- a/language.def_menu +++ b/language.def_menu @@ -197,6 +197,9 @@ SWWM_ALTCLEAR = "Alternate 100% FX"; SWWM_MM_ENABLE = "Show Minimap"; SWWM_MM_MISSILES = "Projectiles In Minimap"; SWWM_MM_USECANVAS = "Fixed Scale Minimap"; +SWWM_MM_STEPTRACE = "Minimap Step Tracing"; +SWWM_MM_MAXSTEPS = "Minimap Max Steps"; +SWWM_MM_MINSTEP = "Minimap Step Size"; SWWM_AC_UNLOCKED = "Unlocked: "; SWWM_AC_INCOMPLETE = "Incomplete: "; SWWM_AC_UNDISCOVERED = "Undiscovered: "; @@ -288,6 +291,9 @@ TOOLTIP_SWWMACHIEVEMENTMENU = "View your achievements."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap on the top right corner of the screen."; TOOLTIP_SWWM_MM_MISSILES = "Displays projectiles in the minimap. Can be toggled if this clutters too much."; TOOLTIP_SWWM_MM_USECANVAS = "Rather than being drawn directly on-screen, the minimap will be drawn to a texture, maintaining the same pixel density as the rest of the HUD. Due to engine quirks, this causes the map to have a one-frame delay."; +TOOLTIP_SWWM_MM_STEPTRACE = "Traces the player's path on the minimap. Note: Previously recorded data will be erased when starting a new trace."; +TOOLTIP_SWWM_MM_MAXSTEPS = "Maximum player steps to hold in memory."; +TOOLTIP_SWWM_MM_MINSTEP = "Minimum distance in map units to count as an individual step."; TOOLTIP_SWWMDEBUGMENU = "Don't touch this unless you know what you're doing."; TOOLTIP_SWWM_DEBUGBLAST = "Shows radii of DoExplosion calls. Damaging explosions are green, with yellow for the hotspot. Non-damaging explosions are blue, with magenta for the hotspot."; TOOLTIP_SWWM_DEBUGVIEW = "Shows collision, orientation and velocity of actors, as well as relationship lines to their target/tracer/master pointers (gold/orange/purple respectively)."; diff --git a/language.es_menu b/language.es_menu index f8cd4e250..9d27ce7db 100644 --- a/language.es_menu +++ b/language.es_menu @@ -191,6 +191,9 @@ SWWM_ALTCLEAR = "Efecto Alternativo de 100%"; SWWM_MM_ENABLE = "Mostrar Minimapa"; SWWM_MM_MISSILES = "Proyectiles en Minimapa"; SWWM_MM_USECANVAS = "Minimapa a Escala Fija"; +SWWM_MM_STEPTRACE = "Trazo de Pasos en Minimapa"; +SWWM_MM_MAXSTEPS = "Máx. de Pasos en Minimapa"; +SWWM_MM_MINSTEP = "Tam. de Pasos en Minimapa"; SWWM_AC_UNLOCKED = "Desbloqueados: "; SWWM_AC_INCOMPLETE = "Incompletos: "; SWWM_AC_UNDISCOVERED = "Sin descubrir: "; @@ -283,6 +286,9 @@ TOOLTIP_SWWMACHIEVEMENTMENU = "Revisa tus logros."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa en la esquina superior derecha de la pantalla."; TOOLTIP_SWWM_MM_MISSILES = "Muestra proyectiles en el minimapa. Puede ser desactivado si causa problemas de visibilidad."; TOOLTIP_SWWM_MM_USECANVAS = "En vez de dibujarse directamente a la pantalla, el mapa se dibujará en una texture, mantentiendo la misma densidad de píxel que el resto del HUD. Debido a peculiaridades del motor, esto causa que el mapa tenga un frame de retardo."; +TOOLTIP_SWWM_MM_STEPTRACE = "Traza el camino del jugador en el minimapa. Nota: Los datos anteriores serán borrados al comenzar un nuevo trazado."; +TOOLTIP_SWWM_MM_MAXSTEPS = "Pasos máximos a almacenar en memoria."; +TOOLTIP_SWWM_MM_MINSTEP = "Distancia mínima en unidades de mapa que cuente como un paso individual."; TOOLTIP_SWWMDEBUGMENU = "No toques esto a menos que sepas lo que estás haciendo."; TOOLTIP_SWWM_DEBUGBLAST = "Muestra el radio de funciones DoExplosion. Las explosiones con daño son verdes, con amarillo para su punto caliente. Las explosiones sin daño son azules, con magenta para su punto caliente."; TOOLTIP_SWWM_DEBUGVIEW = "Muestra la colisión, orientación y velocidad de actores, junto con lineas de relación hacia sus punteros de objetivo/trazador/maestro (dorado/naranja/púrpura respectivamente)."; diff --git a/language.version b/language.version index 122681b31..56e849efc 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1043 \cu(Thu 7 Dec 18:12:07 CET 2023)\c-"; -SWWM_SHORTVER="\cw1.3pre r1043 \cu(2023-12-07 18:12:07)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1044 \cu(Thu 7 Dec 23:17:27 CET 2023)\c-"; +SWWM_SHORTVER="\cw1.3pre r1044 \cu(2023-12-07 23:17:27)\c-"; diff --git a/menudef.txt b/menudef.txt index 608c3d5dc..a3fe5b530 100644 --- a/menudef.txt +++ b/menudef.txt @@ -146,6 +146,9 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_MM_ENABLE", "swwm_mm_enable", "YesNo" Option "$SWWM_MM_MISSILES", "swwm_mm_missiles", "YesNo" Option "$SWWM_MM_USECANVAS", "swwm_mm_usecanvas", "YesNo" + Option "$SWWM_MM_STEPTRACE", "swwm_mm_steptrace", "YesNo" + Slider "$SWWM_MM_MAXSTEPS", "swwm_mm_maxsteps", 100, 8000, 100, 0 + Slider "$SWWM_MM_MINSTEP", "swwm_mm_minstep", 8, 256, 8, 0 Option "$SWWM_TARGET", "swwm_targeter", "SWWMTarget" ScaleSliderFix "$SWWM_BARDIST", "swwm_bardist", 0, 4000, 100, "$SWWM_UNLIMITED" Option "$SWWM_TARGETVAL", "swwm_targetvals", "YesNo" diff --git a/zscript/handler/swwm_handler.zsc b/zscript/handler/swwm_handler.zsc index 10244b149..5e189adf6 100644 --- a/zscript/handler/swwm_handler.zsc +++ b/zscript/handler/swwm_handler.zsc @@ -46,6 +46,13 @@ Class SWWMHandler : EventHandler // corruption cards stuff ui bool incardmenu, cardmessaged; + // ring buffer for player path tracing in minimap + const MAX_TRACED_BUFSZ = 8192; + transient ui Vector2 traced_steps[MAX_TRACED_BUFSZ]; + transient ui int traced_steppos, traced_stepnum; + transient ui Vector2 oldplayerpos; + transient ui bool do_trace_steps; + enum EProfileTimer { PT_WORLDTICK, diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index 78882210a..1e8f87b87 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -34,6 +34,63 @@ extend Class SWWMHandler if ( !bar ) return; bar.mm_zoom = min(1.,bar.mm_zoom+.25); } + else if ( e.Name ~== "swwmstepclear" ) + { + Console.Printf("Cleared %d steps.",traced_stepnum); + traced_steppos = 0; + traced_stepnum = 0; + } + else if ( e.Name ~== "swwmstepcount" ) + { + double cmdist = 0.; + int startpos = traced_steppos-traced_stepnum; + if ( startpos < 0 ) startpos += MAX_TRACED_BUFSZ; + for ( int i=1; i 0) ) return; UpdateFace(); UpdateTags(); + if ( !hnd ) hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); + if ( hnd ) + { + if ( hasteleported ) hnd.SendInterfaceEvent(PlayerNumber(),"swwmsendplayertele"); + else hnd.SendInterfaceEvent(PlayerNumber(),"swwmsendplayerstep"); + } if ( hasteleported ) { // we just got teleported, don't count the travel distance @@ -261,7 +267,7 @@ extend Class Demolitionist if ( vel dot vel > lagvel dot lagvel ) lagvel = lagvel*.8+vel*.2; else lagvel = lagvel*.4+vel*.6; double traveldist = level.Vec3Diff(oldpos,pos).length(); - if ( (traveldist == double.infinity) || (traveldist == double.nan) ) + if ( (traveldist == double.infinity) || (traveldist != traveldist) ) traveldist = 0.; // prevent glitches from breaking stats if ( !player.onground || bNoGravity ) { diff --git a/zscript/utility/swwm_utility_achievements.zsc b/zscript/utility/swwm_utility_achievements.zsc index 78ede01ad..23ad983e8 100644 --- a/zscript/utility/swwm_utility_achievements.zsc +++ b/zscript/utility/swwm_utility_achievements.zsc @@ -67,7 +67,7 @@ extend class SWWMUtility if ( developer >= 2 ) Console.Printf("AchievementProgressIncDOuble: achievement '"..pvar.."' not found"); return; } - if ( pval == "NaN" ) // this can happen, yup + if ( pval ~== "NaN" ) // this can happen, yup pval = "0"; hnd.achievementprogress.Insert(pvar,String.Format("%g",pval.ToDouble()+inc)); }