Add player path tracing in minimap.

This commit is contained in:
Mari the Deer 2023-12-07 23:17:27 +01:00
commit 13b2cb53b3
10 changed files with 166 additions and 4 deletions

View file

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

View file

@ -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<traced_stepnum; i++ )
{
int idx1 = (startpos+(i-1))%MAX_TRACED_BUFSZ;
int idx2 = (startpos+i)%MAX_TRACED_BUFSZ;
// skip if vectors are NaN, for safety
if ( (traced_steps[idx1] != traced_steps[idx1])
|| (traced_steps[idx2] != traced_steps[idx2]) ) continue;
double sdist = level.Vec2Diff(traced_steps[idx1],traced_steps[idx2]).length();
cmdist += sdist;
}
Console.Printf("%d steps, %g map units total.",traced_stepnum,cmdist);
}
}
private ui void CheckPlayerStep()
{
if ( swwm_mm_steptrace && !do_trace_steps )
{
// begin tracing now
traced_steppos = 0;
traced_stepnum = 0;
oldplayerpos = (double.nan,double.nan);
do_trace_steps = true;
}
else if ( !swwm_mm_steptrace && do_trace_steps )
{
// just stop tracing, don't touch the data
do_trace_steps = false;
}
}
private ui void DoPlayerStep( Vector2 playerpos, bool ignoremindist = false )
{
// ignore if current position is NaN
if ( playerpos != playerpos ) return;
// clamp into map bounds to avoid weirdness
playerpos.x = clamp(playerpos.x,-32768.,32767.);
playerpos.y = clamp(playerpos.y,-32768.,32767.);
double clamped_mdist = clamp(swwm_mm_minstep,8.,256.);
double mindistsq = clamped_mdist*clamped_mdist;
if ( !ignoremindist && (oldplayerpos == oldplayerpos) && ((oldplayerpos-playerpos).lengthsquared() < mindistsq) )
return;
oldplayerpos = playerpos;
traced_steps[traced_steppos] = playerpos;
traced_steppos = (traced_steppos+1)%MAX_TRACED_BUFSZ;
traced_stepnum = min(traced_stepnum+1,clamp(swwm_mm_maxsteps,2,MAX_TRACED_BUFSZ));
}
override void InterfaceProcess( ConsoleEvent e )
@ -92,6 +149,28 @@ extend Class SWWMHandler
GenericFlash gf = new("GenericFlash").Setup(flash_camera,flash_color,flash_duration);
StatusBar.AttachMessage(gf,0,BaseStatusBar.HUDMSGLayer_UnderHUD);
}
else if ( e.Name ~== "swwmsendplayerstep" )
{
CheckPlayerStep();
let demo = Demolitionist(players[consoleplayer].mo);
if ( !demo || !do_trace_steps ) return;
DoPlayerStep(demo.pos.xy);
}
else if ( e.Name ~== "swwmsendplayertele" )
{
CheckPlayerStep();
let demo = Demolitionist(players[consoleplayer].mo);
if ( !demo || !do_trace_steps ) return;
// send the position we had before teleporting
DoPlayerStep(demo.pretelepos.xy,true);
// to indicate that the player has teleported, we write a NaN into the buffer (yup)
oldplayerpos = (double.nan,double.nan);
traced_steps[traced_steppos] = (double.nan,double.nan);
traced_steppos = (traced_steppos+1)%MAX_TRACED_BUFSZ;
traced_stepnum = min(traced_stepnum+1,clamp(swwm_mm_maxsteps,2,MAX_TRACED_BUFSZ));
// send the post-teleport position
DoPlayerStep(demo.pos.xy,true);
}
}
override void NetworkProcess( ConsoleEvent e )