Add player path tracing in minimap.
This commit is contained in:
parent
820f10c9f8
commit
13b2cb53b3
10 changed files with 166 additions and 4 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue