mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-25 21:41:03 +00:00
Add an option to display the path travalled by the local player
This is useful to avoid getting lost on larger maps.
This commit is contained in:
parent
5870ec2e7a
commit
7444c22950
2 changed files with 114 additions and 5 deletions
114
src/am_map.cpp
114
src/am_map.cpp
|
@ -197,6 +197,8 @@ CUSTOM_CVAR(Int, am_emptyspacemargin, 0, CVAR_ARCHIVE)
|
||||||
CVAR(Bool, am_followplayer, true, CVAR_ARCHIVE)
|
CVAR(Bool, am_followplayer, true, CVAR_ARCHIVE)
|
||||||
CVAR(Bool, am_portaloverlay, true, CVAR_ARCHIVE)
|
CVAR(Bool, am_portaloverlay, true, CVAR_ARCHIVE)
|
||||||
CVAR(Bool, am_showgrid, false, CVAR_ARCHIVE)
|
CVAR(Bool, am_showgrid, false, CVAR_ARCHIVE)
|
||||||
|
CVAR(Bool, am_path, false, CVAR_ARCHIVE)
|
||||||
|
CVAR(Int, am_pathlength, 1000, CVAR_ARCHIVE)
|
||||||
CVAR(Float, am_zoomdir, 0.f, CVAR_ARCHIVE)
|
CVAR(Float, am_zoomdir, 0.f, CVAR_ARCHIVE)
|
||||||
|
|
||||||
static const char *const DEFAULT_FONT_NAME = "AMMNUMx";
|
static const char *const DEFAULT_FONT_NAME = "AMMNUMx";
|
||||||
|
@ -296,6 +298,7 @@ CVAR (Color, am_thingcolor_ncmonster, 0xfcfcfc, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_thingcolor_item, 0xfcfcfc, CVAR_ARCHIVE);
|
CVAR (Color, am_thingcolor_item, 0xfcfcfc, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_thingcolor_citem, 0xfcfcfc, CVAR_ARCHIVE);
|
CVAR (Color, am_thingcolor_citem, 0xfcfcfc, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_portalcolor, 0x404040, CVAR_ARCHIVE);
|
CVAR (Color, am_portalcolor, 0x404040, CVAR_ARCHIVE);
|
||||||
|
CVAR (Color, am_pathcolor, 0x4080c0, CVAR_ARCHIVE);
|
||||||
|
|
||||||
CVAR (Color, am_ovyourcolor, 0xfce8d8, CVAR_ARCHIVE);
|
CVAR (Color, am_ovyourcolor, 0xfce8d8, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_ovwallcolor, 0x00ff00, CVAR_ARCHIVE);
|
CVAR (Color, am_ovwallcolor, 0x00ff00, CVAR_ARCHIVE);
|
||||||
|
@ -318,6 +321,7 @@ CVAR (Color, am_ovthingcolor_ncmonster, 0xe88800, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_ovthingcolor_item, 0xe88800, CVAR_ARCHIVE);
|
CVAR (Color, am_ovthingcolor_item, 0xe88800, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_ovthingcolor_citem, 0xe88800, CVAR_ARCHIVE);
|
CVAR (Color, am_ovthingcolor_citem, 0xe88800, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_ovportalcolor, 0x004022, CVAR_ARCHIVE);
|
CVAR (Color, am_ovportalcolor, 0x004022, CVAR_ARCHIVE);
|
||||||
|
CVAR (Color, am_ovpathcolor, 0x4080c0, CVAR_ARCHIVE);
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
|
@ -381,6 +385,7 @@ static const char *ColorNames[] = {
|
||||||
"SecretSectorColor",
|
"SecretSectorColor",
|
||||||
"UnexploredSecretColor",
|
"UnexploredSecretColor",
|
||||||
"PortalColor",
|
"PortalColor",
|
||||||
|
"PathColor",
|
||||||
"AlmostBackgroundColor",
|
"AlmostBackgroundColor",
|
||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
@ -413,6 +418,7 @@ struct AMColorset
|
||||||
SecretSectorColor,
|
SecretSectorColor,
|
||||||
UnexploredSecretColor,
|
UnexploredSecretColor,
|
||||||
PortalColor,
|
PortalColor,
|
||||||
|
PathColor,
|
||||||
AlmostBackgroundColor,
|
AlmostBackgroundColor,
|
||||||
AM_NUM_COLORS
|
AM_NUM_COLORS
|
||||||
};
|
};
|
||||||
|
@ -538,7 +544,8 @@ static FColorCVarRef *cv_standard[] = {
|
||||||
&am_interlevelcolor,
|
&am_interlevelcolor,
|
||||||
&am_secretsectorcolor,
|
&am_secretsectorcolor,
|
||||||
&am_unexploredsecretcolor,
|
&am_unexploredsecretcolor,
|
||||||
&am_portalcolor
|
&am_portalcolor,
|
||||||
|
&am_pathcolor
|
||||||
};
|
};
|
||||||
|
|
||||||
static FColorCVarRef *cv_overlay[] = {
|
static FColorCVarRef *cv_overlay[] = {
|
||||||
|
@ -565,7 +572,8 @@ static FColorCVarRef *cv_overlay[] = {
|
||||||
&am_ovinterlevelcolor,
|
&am_ovinterlevelcolor,
|
||||||
&am_ovsecretsectorcolor,
|
&am_ovsecretsectorcolor,
|
||||||
&am_ovunexploredsecretcolor,
|
&am_ovunexploredsecretcolor,
|
||||||
&am_ovportalcolor
|
&am_ovportalcolor,
|
||||||
|
&am_ovpathcolor
|
||||||
};
|
};
|
||||||
|
|
||||||
CCMD(am_restorecolors)
|
CCMD(am_restorecolors)
|
||||||
|
@ -608,8 +616,9 @@ static unsigned char DoomColors[]= {
|
||||||
NOT_USED, // interteleport
|
NOT_USED, // interteleport
|
||||||
NOT_USED, // secretsector
|
NOT_USED, // secretsector
|
||||||
NOT_USED, // unexploredsecretsector
|
NOT_USED, // unexploredsecretsector
|
||||||
|
0x40,0x40,0x40, // portal
|
||||||
|
0x40,0x80,0xb0, // path
|
||||||
0x10,0x10,0x10, // almostbackground
|
0x10,0x10,0x10, // almostbackground
|
||||||
0x40,0x40,0x40 // portal
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char StrifeColors[]= {
|
static unsigned char StrifeColors[]= {
|
||||||
|
@ -636,8 +645,9 @@ static unsigned char StrifeColors[]= {
|
||||||
NOT_USED, // interteleport
|
NOT_USED, // interteleport
|
||||||
NOT_USED, // secretsector
|
NOT_USED, // secretsector
|
||||||
NOT_USED, // unexploredsecretsector
|
NOT_USED, // unexploredsecretsector
|
||||||
|
0x40,0x40,0x40, // portal
|
||||||
|
0x40,0x80,0xb0, // path
|
||||||
0x10,0x10,0x10, // almostbackground
|
0x10,0x10,0x10, // almostbackground
|
||||||
0x40,0x40,0x40 // portal
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char RavenColors[]= {
|
static unsigned char RavenColors[]= {
|
||||||
|
@ -664,8 +674,9 @@ static unsigned char RavenColors[]= {
|
||||||
NOT_USED, // interteleport
|
NOT_USED, // interteleport
|
||||||
NOT_USED, // secretsector
|
NOT_USED, // secretsector
|
||||||
NOT_USED, // unexploredsecretsector
|
NOT_USED, // unexploredsecretsector
|
||||||
|
0x50,0x50,0x50, // portal
|
||||||
|
0x40,0x80,0xb0, // path
|
||||||
0x10,0x10,0x10, // almostbackground
|
0x10,0x10,0x10, // almostbackground
|
||||||
0x50,0x50,0x50 // portal
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef NOT_USED
|
#undef NOT_USED
|
||||||
|
@ -971,6 +982,8 @@ class DAutomap :public DAutomapBase
|
||||||
|
|
||||||
TArray<FVector2> points;
|
TArray<FVector2> points;
|
||||||
|
|
||||||
|
TArray<mline_t> path_history; // history of points the local player has travelled to
|
||||||
|
|
||||||
// translates between frame-buffer and map distances
|
// translates between frame-buffer and map distances
|
||||||
double FTOM(double x)
|
double FTOM(double x)
|
||||||
{
|
{
|
||||||
|
@ -1015,6 +1028,8 @@ class DAutomap :public DAutomapBase
|
||||||
bool clipMline(mline_t *ml, fline_t *fl);
|
bool clipMline(mline_t *ml, fline_t *fl);
|
||||||
void drawMline(mline_t *ml, const AMColor &color);
|
void drawMline(mline_t *ml, const AMColor &color);
|
||||||
void drawMline(mline_t *ml, int colorindex);
|
void drawMline(mline_t *ml, int colorindex);
|
||||||
|
void collectPath();
|
||||||
|
void drawPath(int color);
|
||||||
void drawGrid(int color);
|
void drawGrid(int color);
|
||||||
void drawSubsectors();
|
void drawSubsectors();
|
||||||
void drawSeg(seg_t *seg, const AMColor &color);
|
void drawSeg(seg_t *seg, const AMColor &color);
|
||||||
|
@ -1544,6 +1559,10 @@ void DAutomap::doFollowPlayer ()
|
||||||
|
|
||||||
void DAutomap::Ticker ()
|
void DAutomap::Ticker ()
|
||||||
{
|
{
|
||||||
|
// Player path is collected even while the automap isn't visible or if am_path is disabled.
|
||||||
|
// This way, you can toggle am_path during gameplay and still see your previously travelled path.
|
||||||
|
collectPath();
|
||||||
|
|
||||||
if (!automapactive)
|
if (!automapactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1808,6 +1827,88 @@ void DAutomap::drawMline (mline_t *ml, int colorindex)
|
||||||
drawMline(ml, AMColors[colorindex]);
|
drawMline(ml, AMColors[colorindex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
// Computes the list of lines to be drawn in drawPath() based on local player
|
||||||
|
// position.
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void DAutomap::collectPath ()
|
||||||
|
{
|
||||||
|
DVector2 pos = players[consoleplayer].camera->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||||
|
mline_t ml;
|
||||||
|
if (path_history.Size() >= 1)
|
||||||
|
{
|
||||||
|
// Create a path between the last point and current point if there's enough distance
|
||||||
|
// travelled by the player since the last point.
|
||||||
|
mline_t last_line = path_history.Last();
|
||||||
|
constexpr int MIN_DISTANCE_BETWEEN_POINTS = 32;
|
||||||
|
if (abs(last_line.b.x - pos.X) >= MIN_DISTANCE_BETWEEN_POINTS || abs(last_line.b.y - pos.Y) >= MIN_DISTANCE_BETWEEN_POINTS)
|
||||||
|
{
|
||||||
|
// If the distance between two points is very high, the player has likely teleported so no path should be drawn between the points.
|
||||||
|
constexpr int MAX_DISTANCE_BETWEEN_TICKS = 100;
|
||||||
|
if (abs(last_line.b.x - pos.X) >= MAX_DISTANCE_BETWEEN_TICKS || abs(last_line.b.y - pos.Y) >= MAX_DISTANCE_BETWEEN_TICKS)
|
||||||
|
{
|
||||||
|
ml.a.x = pos.X;
|
||||||
|
ml.a.y = pos.Y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ml.a.x = last_line.b.x;
|
||||||
|
ml.a.y = last_line.b.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
ml.b.x = pos.X;
|
||||||
|
ml.b.y = pos.Y;
|
||||||
|
|
||||||
|
if (path_history.Size() > am_pathlength)
|
||||||
|
{
|
||||||
|
// Path is too long; remove the oldest lines.
|
||||||
|
path_history.Delete(0);
|
||||||
|
}
|
||||||
|
path_history.Push(ml);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Create the first line in the path history.
|
||||||
|
ml.a.x = pos.X;
|
||||||
|
ml.a.y = pos.Y;
|
||||||
|
ml.b.x = pos.X;
|
||||||
|
ml.b.y = pos.Y;
|
||||||
|
path_history.Push(ml);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
// Draws the path taken by the local player.
|
||||||
|
// This can be useful to avoid getting lost in larger maps.
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void DAutomap::drawPath (int color)
|
||||||
|
{
|
||||||
|
if (am_rotate == 1 || (am_rotate == 2 && viewactive))
|
||||||
|
{
|
||||||
|
TArray<mline_t> path_history_rotated = path_history;
|
||||||
|
for (mline_t line : path_history_rotated)
|
||||||
|
{
|
||||||
|
rotatePoint(&line.a.x, &line.a.y);
|
||||||
|
rotatePoint(&line.b.x, &line.b.y);
|
||||||
|
drawMline(&line, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (mline_t line : path_history)
|
||||||
|
{
|
||||||
|
drawMline(&line, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
// Draws flat (floor/ceiling tile) aligned grid lines.
|
// Draws flat (floor/ceiling tile) aligned grid lines.
|
||||||
|
@ -3311,6 +3412,9 @@ void DAutomap::Drawer (int bottom)
|
||||||
if (am_showgrid)
|
if (am_showgrid)
|
||||||
drawGrid(AMColors.GridColor);
|
drawGrid(AMColors.GridColor);
|
||||||
|
|
||||||
|
if (am_path)
|
||||||
|
drawPath(AMColors.PathColor);
|
||||||
|
|
||||||
drawWalls(allmap);
|
drawWalls(allmap);
|
||||||
drawPlayers();
|
drawPlayers();
|
||||||
if (G_SkillProperty(SKILLP_EasyKey) || am_showkeys_always)
|
if (G_SkillProperty(SKILLP_EasyKey) || am_showkeys_always)
|
||||||
|
|
|
@ -1336,6 +1336,8 @@ OptionMenu AutomapOptions protected
|
||||||
StaticText ""
|
StaticText ""
|
||||||
Option "$AUTOMAPMNU_ROTATE", "am_rotate", "RotateTypes"
|
Option "$AUTOMAPMNU_ROTATE", "am_rotate", "RotateTypes"
|
||||||
Option "$AUTOMAPMNU_FOLLOW", "am_followplayer", "OnOff"
|
Option "$AUTOMAPMNU_FOLLOW", "am_followplayer", "OnOff"
|
||||||
|
Option "$AUTOMAPMNU_PATH", "am_path", "OnOff"
|
||||||
|
Slider "$AUTOMAPMNU_PATHLENGTH", "am_pathlength", 100, 10000, 100, 0
|
||||||
Option "$AUTOMAPMNU_OVERLAY", "am_overlay", "OverlayTypes"
|
Option "$AUTOMAPMNU_OVERLAY", "am_overlay", "OverlayTypes"
|
||||||
Option "$AUTOMAPMNU_TEXTURED", "am_textured", "OnOff"
|
Option "$AUTOMAPMNU_TEXTURED", "am_textured", "OnOff"
|
||||||
Slider "$AUTOMAPMNU_LINEALPHA", "am_linealpha", 0.1, 1.0, 0.1, 1
|
Slider "$AUTOMAPMNU_LINEALPHA", "am_linealpha", 0.1, 1.0, 0.1, 1
|
||||||
|
@ -1395,6 +1397,7 @@ OptionMenu MapControlsMenu protected
|
||||||
MapControl "$MAPCNTRLMNU_TOGGLEZOOM", "am_gobig"
|
MapControl "$MAPCNTRLMNU_TOGGLEZOOM", "am_gobig"
|
||||||
MapControl "$MAPCNTRLMNU_TOGGLEFOLLOW", "am_togglefollow"
|
MapControl "$MAPCNTRLMNU_TOGGLEFOLLOW", "am_togglefollow"
|
||||||
MapControl "$MAPCNTRLMNU_ROTATE", "toggle am_rotate"
|
MapControl "$MAPCNTRLMNU_ROTATE", "toggle am_rotate"
|
||||||
|
MapControl "$MAPCNTRLMNU_PATH", "toggle am_path"
|
||||||
MapControl "$MAPCNTRLMNU_TOGGLEGRID", "am_togglegrid"
|
MapControl "$MAPCNTRLMNU_TOGGLEGRID", "am_togglegrid"
|
||||||
MapControl "$MAPCNTRLMNU_TOGGLETEXTURE", "am_toggletexture"
|
MapControl "$MAPCNTRLMNU_TOGGLETEXTURE", "am_toggletexture"
|
||||||
|
|
||||||
|
@ -1434,6 +1437,7 @@ OptionMenu MapColorMenu protected
|
||||||
ColorPicker "$MAPCOLORMNU_UNEXPLOREDSECRETCOLOR", "am_unexploredsecretcolor"
|
ColorPicker "$MAPCOLORMNU_UNEXPLOREDSECRETCOLOR", "am_unexploredsecretcolor"
|
||||||
ColorPicker "$MAPCOLORMNU_SPECIALWALLCOLOR", "am_specialwallcolor"
|
ColorPicker "$MAPCOLORMNU_SPECIALWALLCOLOR", "am_specialwallcolor"
|
||||||
ColorPicker "$MAPCOLORMNU_PORTAL", "am_portalcolor"
|
ColorPicker "$MAPCOLORMNU_PORTAL", "am_portalcolor"
|
||||||
|
ColorPicker "$MAPCOLORMNU_PATH", "am_pathcolor"
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionMenu MapColorMenuCheats protected
|
OptionMenu MapColorMenuCheats protected
|
||||||
|
@ -1465,6 +1469,7 @@ OptionMenu MapColorMenuOverlay protected
|
||||||
ColorPicker "$MAPCOLORMNU_UNEXPLOREDSECRETCOLOR", "am_ovunexploredsecretcolor"
|
ColorPicker "$MAPCOLORMNU_UNEXPLOREDSECRETCOLOR", "am_ovunexploredsecretcolor"
|
||||||
ColorPicker "$MAPCOLORMNU_SPECIALWALLCOLOR", "am_ovspecialwallcolor"
|
ColorPicker "$MAPCOLORMNU_SPECIALWALLCOLOR", "am_ovspecialwallcolor"
|
||||||
ColorPicker "$MAPCOLORMNU_PORTAL", "am_ovportalcolor"
|
ColorPicker "$MAPCOLORMNU_PORTAL", "am_ovportalcolor"
|
||||||
|
ColorPicker "$MAPCOLORMNU_PATH", "am_ovpathcolor"
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionMenu MapColorMenuCheatsOverlay protected
|
OptionMenu MapColorMenuCheatsOverlay protected
|
||||||
|
|
Loading…
Reference in a new issue