mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Add support for Finishline, shortcut, and disabled waypoints.
Remove warning that should be impossible to trip, and doesn't describe problem anymore.
This commit is contained in:
parent
7efe868c99
commit
4c26589d5c
4 changed files with 126 additions and 13 deletions
|
|
@ -46,6 +46,9 @@ enum
|
||||||
ML_BLOCKMAP, // LUT, motion clipping, walls/grid element
|
ML_BLOCKMAP, // LUT, motion clipping, walls/grid element
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Extra flag for objects
|
||||||
|
#define MTF_EXTRA 1
|
||||||
|
|
||||||
// Reverse gravity flag for objects.
|
// Reverse gravity flag for objects.
|
||||||
#define MTF_OBJECTFLIP 2
|
#define MTF_OBJECTFLIP 2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,49 @@ static const size_t NODESARRAY_BASE_SIZE = 256U;
|
||||||
|
|
||||||
static waypoint_t **waypointheap = NULL;
|
static waypoint_t **waypointheap = NULL;
|
||||||
static waypoint_t *firstwaypoint = NULL;
|
static waypoint_t *firstwaypoint = NULL;
|
||||||
|
static waypoint_t *finishline = NULL;
|
||||||
static size_t numwaypoints = 0U;
|
static size_t numwaypoints = 0U;
|
||||||
static size_t numwaypointmobjs = 0U;
|
static size_t numwaypointmobjs = 0U;
|
||||||
static size_t baseopensetsize = OPENSET_BASE_SIZE;
|
static size_t baseopensetsize = OPENSET_BASE_SIZE;
|
||||||
static size_t baseclosedsetsize = CLOSEDSET_BASE_SIZE;
|
static size_t baseclosedsetsize = CLOSEDSET_BASE_SIZE;
|
||||||
static size_t basenodesarraysize = NODESARRAY_BASE_SIZE;
|
static size_t basenodesarraysize = NODESARRAY_BASE_SIZE;
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------
|
||||||
|
waypoint_t *K_GetFinishLineWaypoint(void)
|
||||||
|
|
||||||
|
See header file for description.
|
||||||
|
--------------------------------------------------*/
|
||||||
|
waypoint_t *K_GetFinishLineWaypoint(void)
|
||||||
|
{
|
||||||
|
return finishline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------
|
||||||
|
boolean K_GetWaypointIsFinishline(waypoint_t *waypoint)
|
||||||
|
|
||||||
|
See header file for description.
|
||||||
|
--------------------------------------------------*/
|
||||||
|
boolean K_GetWaypointIsFinishline(waypoint_t *waypoint)
|
||||||
|
{
|
||||||
|
boolean waypointisfinishline = false;
|
||||||
|
|
||||||
|
if (waypoint == NULL)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "NULL waypoint in K_GetWaypointIsShortcut.\n");
|
||||||
|
}
|
||||||
|
else if (waypoint->mobj == NULL)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "NULL waypoint mobj in K_GetWaypointIsShortcut.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
waypointisfinishline = (waypoint->mobj->extravalue2 == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return waypointisfinishline;
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
||||||
|
|
||||||
|
|
@ -45,7 +82,7 @@ boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO
|
waypointisshortcut = (waypoint->mobj->lastlook == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return waypointisshortcut;
|
return waypointisshortcut;
|
||||||
|
|
@ -58,7 +95,7 @@ boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
boolean K_GetWaypointIsEnabled(waypoint_t *waypoint)
|
boolean K_GetWaypointIsEnabled(waypoint_t *waypoint)
|
||||||
{
|
{
|
||||||
boolean waypointisshortcut = true;
|
boolean waypointisenabled = true;
|
||||||
|
|
||||||
if (waypoint == NULL)
|
if (waypoint == NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -70,10 +107,10 @@ boolean K_GetWaypointIsEnabled(waypoint_t *waypoint)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO
|
waypointisenabled = (waypoint->mobj->extravalue1 == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return waypointisshortcut;
|
return waypointisenabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
|
|
@ -1581,6 +1618,19 @@ static waypoint_t *K_SetupWaypoint(mobj_t *const mobj)
|
||||||
firstwaypoint = thiswaypoint;
|
firstwaypoint = thiswaypoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (K_GetWaypointIsFinishline(thiswaypoint))
|
||||||
|
{
|
||||||
|
if (finishline != NULL)
|
||||||
|
{
|
||||||
|
const INT32 oldfinishlineid = K_GetWaypointID(finishline);
|
||||||
|
const INT32 thiswaypointid = K_GetWaypointID(thiswaypoint);
|
||||||
|
CONS_Alert(
|
||||||
|
CONS_WARNING, "Multiple finish line waypoints with IDs %d and %d! Using %d.",
|
||||||
|
oldfinishlineid, thiswaypointid, thiswaypointid);
|
||||||
|
}
|
||||||
|
finishline = thiswaypoint;
|
||||||
|
}
|
||||||
|
|
||||||
if (thiswaypoint->numnextwaypoints > 0)
|
if (thiswaypoint->numnextwaypoints > 0)
|
||||||
{
|
{
|
||||||
waypoint_t *nextwaypoint = NULL;
|
waypoint_t *nextwaypoint = NULL;
|
||||||
|
|
@ -1747,18 +1797,19 @@ boolean K_SetupWaypointList(void)
|
||||||
K_SetupWaypoint(waypointmobj);
|
K_SetupWaypoint(waypointmobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!firstwaypoint)
|
if (firstwaypoint == NULL)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "No waypoints in map.\n");
|
CONS_Alert(CONS_ERROR, "No waypoints in map.\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_SETUP, "Successfully setup %zu waypoints.\n", numwaypoints);
|
CONS_Debug(DBG_SETUP, "Successfully setup %zu waypoints.\n", numwaypoints);
|
||||||
if (numwaypoints < numwaypointmobjs)
|
if (finishline == NULL)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING,
|
CONS_Alert(
|
||||||
"Not all waypoints in the map are connected! %zu waypoints setup but %zu waypoint mobjs.\n",
|
CONS_WARNING, "No finish line waypoint in the map! Using first setup waypoint with ID %d.\n",
|
||||||
numwaypoints, numwaypointmobjs);
|
K_GetWaypointID(firstwaypoint));
|
||||||
|
finishline = firstwaypoint;
|
||||||
}
|
}
|
||||||
setupsuccessful = true;
|
setupsuccessful = true;
|
||||||
}
|
}
|
||||||
|
|
@ -1775,8 +1826,9 @@ boolean K_SetupWaypointList(void)
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
void K_ClearWaypoints(void)
|
void K_ClearWaypoints(void)
|
||||||
{
|
{
|
||||||
waypointheap = NULL;
|
waypointheap = NULL;
|
||||||
firstwaypoint = NULL;
|
firstwaypoint = NULL;
|
||||||
numwaypoints = 0;
|
finishline = NULL;
|
||||||
|
numwaypoints = 0;
|
||||||
numwaypointmobjs = 0;
|
numwaypointmobjs = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,36 @@ typedef struct path_s {
|
||||||
// AVAILABLE FOR LUA
|
// AVAILABLE FOR LUA
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------
|
||||||
|
waypoint_t *K_GetFinishLineWaypoint(void);
|
||||||
|
|
||||||
|
Returns the waypoint actually being used as the finish line.
|
||||||
|
|
||||||
|
Input Arguments:-
|
||||||
|
None
|
||||||
|
|
||||||
|
Return:-
|
||||||
|
The waypoint that is being used as the finishline.
|
||||||
|
--------------------------------------------------*/
|
||||||
|
|
||||||
|
waypoint_t *K_GetFinishLineWaypoint(void);
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------
|
||||||
|
boolean K_GetWaypointIsFinishline(waypoint_t *waypoint)
|
||||||
|
|
||||||
|
Returns whether the waypoint is marked as the finishline. This may not actually be the finishline.
|
||||||
|
|
||||||
|
Input Arguments:-
|
||||||
|
waypoint - The waypoint to return finishline status of.
|
||||||
|
|
||||||
|
Return:-
|
||||||
|
true if the waypoint is marked as being the finishline, false if it isn't.
|
||||||
|
--------------------------------------------------*/
|
||||||
|
|
||||||
|
boolean K_GetWaypointIsFinishline(waypoint_t *waypoint);
|
||||||
|
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
boolean K_GetWaypointIsShortcut(waypoint_t *waypoint)
|
||||||
|
|
||||||
|
|
|
||||||
30
src/p_mobj.c
30
src/p_mobj.c
|
|
@ -11805,16 +11805,44 @@ ML_NOCLIMB : Direction not controllable
|
||||||
// Use threshold to store the next waypoint ID
|
// Use threshold to store the next waypoint ID
|
||||||
// movecount is being used for the current waypoint ID
|
// movecount is being used for the current waypoint ID
|
||||||
// reactiontime lets us know if we can respawn at it
|
// reactiontime lets us know if we can respawn at it
|
||||||
|
// lastlook is used for indicating the waypoint is a shortcut
|
||||||
|
// extravalue1 is used for indicating the waypoint is disabled
|
||||||
|
// extravalue2 is used for indicating the waypoint is the finishline
|
||||||
mobj->threshold = ((mthing->options >> ZSHIFT));
|
mobj->threshold = ((mthing->options >> ZSHIFT));
|
||||||
mobj->movecount = mthing->angle;
|
mobj->movecount = mthing->angle;
|
||||||
|
if (mthing->options & MTF_EXTRA)
|
||||||
|
{
|
||||||
|
mobj->extravalue1 = 0; // The waypoint is disabled if extra is on
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->extravalue1 = 1;
|
||||||
|
}
|
||||||
|
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||||
|
{
|
||||||
|
mobj->lastlook = 1; // the waypoint is a shortcut if objectspecial is on
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->lastlook = 0;
|
||||||
|
}
|
||||||
if (mthing->options & MTF_AMBUSH)
|
if (mthing->options & MTF_AMBUSH)
|
||||||
{
|
{
|
||||||
mobj->reactiontime = 0; // Can't respawn at if Ambush is off
|
mobj->reactiontime = 0; // Can't respawn at if Ambush is on
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mobj->reactiontime = 1;
|
mobj->reactiontime = 1;
|
||||||
}
|
}
|
||||||
|
if (mthing->extrainfo == 1)
|
||||||
|
{
|
||||||
|
mobj->extravalue2 = 1; // extrainfo of 1 means the waypoint is at the finish line
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->extravalue2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Sryder 2018-12-7: Grabbed this from the old MT_BOSS3WAYPOINT section so they'll be in the waypointcap instead
|
// Sryder 2018-12-7: Grabbed this from the old MT_BOSS3WAYPOINT section so they'll be in the waypointcap instead
|
||||||
P_SetTarget(&mobj->tracer, waypointcap);
|
P_SetTarget(&mobj->tracer, waypointcap);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue