Add misccap and add rings minimap debugger

This commit is contained in:
NepDisk 2025-09-05 19:47:12 -04:00
parent 2e4901e78d
commit 360a2541a4
8 changed files with 171 additions and 13 deletions

View file

@ -577,6 +577,7 @@ consvar_t cv_kartdebugwaypoints = CVAR_INIT ("kartdebugwaypoints", "Off", CV_NET
consvar_t cv_kartdebuglap = CVAR_INIT ("kartdebuglap", "Off", CV_NETVAR|CV_CHEAT, kartdebugwaypoint_cons_t, NULL);
consvar_t cv_kartdebugbot = CVAR_INIT ("kartdebugbot", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdebugcluster = CVAR_INIT ("kartdebugcluster", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdebugrings = CVAR_INIT ("kartdebugrings", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdebugcheckpoint = CVAR_INIT ("kartdebugcheckpoint", "Off", 0, CV_OnOff, NULL);
consvar_t cv_kartdebugnodes = CVAR_INIT ("kartdebugnodes", "Off", 0, CV_OnOff, NULL);

View file

@ -203,7 +203,7 @@ extern consvar_t cv_votetime;
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugdistribution, cv_kartdebughuddrop;
extern consvar_t cv_kartdebugshrink;
extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector;
extern consvar_t cv_kartdebugwaypoints, cv_kartdebuglap, cv_kartdebugbot, cv_kartdebugcluster;
extern consvar_t cv_kartdebugwaypoints, cv_kartdebuglap, cv_kartdebugbot, cv_kartdebugcluster, cv_kartdebugrings;
extern consvar_t cv_itemfinder;

View file

@ -3703,6 +3703,14 @@ static void K_drawKartMinimapWaypoint(waypoint_t *wp, INT32 hudx, INT32 hudy, IN
K_drawKartMinimapDot(wp->mobj->x, wp->mobj->y, hudx, hudy, flags, pal, size);
}
static void K_drawKartMinimapRings(mobj_t *mobj, INT32 hudx, INT32 hudy, INT32 flags)
{
UINT8 pal = 0x40; // yellow
UINT8 size = 1;
K_drawKartMinimapDot(mobj->x, mobj->y, hudx, hudy, flags, pal, size);
}
static void K_drawKartMinimapCluster(INT32 hudx, INT32 hudy, INT32 flags)
{
UINT8 pal = 180; // Strong pink color.
@ -3957,10 +3965,9 @@ static void K_drawKartMinimap(void)
// draw minimap-pertinent objects
for (mobj = kitemcap; mobj; mobj = next)
{
next = mobj->itnext;
workingPic = NULL;
colormap = NULL;
next = mobj->itnext;
if (mobj->health <= 0)
continue;
@ -3990,6 +3997,30 @@ static void K_drawKartMinimap(void)
workingPic = NULL;
}
break;
default:
break;
}
if (!workingPic)
continue;
interpx = R_InterpolateFixed(mobj->old_x, mobj->x);
interpy = R_InterpolateFixed(mobj->old_y, mobj->y);
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, workingPic, colormap);
}
for (mobj = misccap; mobj; mobj = next)
{
workingPic = NULL;
colormap = NULL;
next = mobj->itnext;
if (mobj->health <= 0)
continue;
switch (mobj->type)
{
case MT_RANDOMITEM:
if (itembreaker && (mobj->flags2 & MF2_BOSSNOTRAP) && !(mobj->flags2 & MF2_BOSSFLEE))
{
@ -3997,7 +4028,9 @@ static void K_drawKartMinimap(void)
colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_YELLOW, GTC_CACHE);
}
else
{
workingPic = NULL;
}
break;
default:
break;
@ -4174,13 +4207,25 @@ static void K_drawKartMinimap(void)
}
}
if (cv_kartdebugrings.value != 0)
{
for (mobj = misccap; mobj; mobj = next)
{
next = mobj->itnext;
if (mobj->type != MT_RING && mobj->type != MT_FLINGRING)
continue;
K_drawKartMinimapRings(mobj, x, y, splitflags);
}
}
if (cv_kartdebugcluster.value != 0)
{
K_drawKartMinimapCluster(x, y, splitflags);
}
}
static void K_drawKartStartCountdown(void)
{
INT32 pnum = 0;

View file

@ -280,6 +280,7 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartdebuglap);
CV_RegisterVar(&cv_kartdebugbot);
CV_RegisterVar(&cv_kartdebugcluster);
CV_RegisterVar(&cv_kartdebugrings);
CV_RegisterVar(&cv_kartdebugcheckpoint);
CV_RegisterVar(&cv_kartdebugnodes);

View file

@ -61,6 +61,7 @@ actioncache_t actioncachehead;
static mobj_t *overlaycap = NULL;
mobj_t *kitemcap = NULL; // Used for Kart offensive items (the ones that can get removed by sizedown)
mobj_t *misccap = NULL; // Used for misc object tracking
mobj_t *waypointcap = NULL;
mobj_t *boss3cap = NULL;
@ -6526,10 +6527,6 @@ boolean P_IsKartItem(INT32 type)
// Primarily for minimap data, handle with care
case MT_SPB:
return true;
case MT_RANDOMITEM:
if (itembreaker)
return true;
// FALLTHRU
default:
@ -6613,6 +6610,77 @@ void P_RunKartItems(void)
P_SetTarget(&kitemcap, NULL);
}
static boolean P_IsMiscCapObject(INT32 type)
{
switch (type)
{
case MT_RING:
case MT_FLINGRING:
return true;
break;
case MT_RANDOMITEM:
return true;
break;
default:
return false;
break;
}
return false;
}
// Called when a misc mobj "thinks"
void P_AddMiscCap(mobj_t *thing)
{
I_Assert(thing != NULL);
if (misccap == NULL)
P_SetTarget(&misccap, thing);
else {
mobj_t *mo;
for (mo = misccap; mo && mo->itnext; mo = mo->itnext)
;
I_Assert(mo != NULL);
I_Assert(mo->itnext == NULL);
P_SetTarget(&mo->itnext, thing);
}
P_SetTarget(&thing->itnext, NULL);
}
// Called only when a kart item is removed
// Keeps the hnext list from corrupting.
static void P_RemoveMiscCap(mobj_t *thing)
{
mobj_t *mo, **p;
for (mo = *(p = &misccap); mo; mo = *(p = &mo->itnext))
{
if (mo != thing)
continue;
P_SetTarget(p, thing->itnext);
P_SetTarget(&thing->itnext, NULL);
return;
}
}
// Doesn't actually do anything since objects can have their own thinkers,
// but this is necessary for the sole purpose of updating misccap
void P_RunMiscCap(void)
{
mobj_t *mobj, *next;
for (mobj = misccap; mobj; mobj = next)
{
next = mobj->itnext;
P_SetTarget(&mobj->itnext, NULL);
}
P_SetTarget(&misccap, NULL);
}
void P_RunOverlays(void)
{
// run overlays
@ -7074,6 +7142,9 @@ static void P_MobjSceneryThink(mobj_t *mobj)
if (P_MobjWasRemoved(mobj))
return;
if (P_IsMiscCapObject(mobj->type)) // mobj is object we want on the list:
P_AddMiscCap(mobj); // add to misccap list
switch (mobj->type)
{
case MT_SHADOW:
@ -8268,6 +8339,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
// No need to check water. Who cares?
P_RingThinker(mobj);
P_AddMiscCap(mobj);
A_AttractChase(mobj);
return false;
// Flung items
@ -10473,6 +10546,9 @@ void P_MobjThinker(mobj_t *mobj)
if (P_IsKartItem(mobj->type)) // mobj is a kart item we want on the list:
P_AddKartItem(mobj); // add to kitem list
if (P_IsMiscCapObject(mobj->type)) // mobj is object we want on the list:
P_AddMiscCap(mobj); // add to misccap list
// Can end up here if a player dies.
if (mobj->player)
P_CyclePlayerMobjState(mobj);
@ -11524,6 +11600,9 @@ void P_RemoveMobj(mobj_t *mobj)
if (P_IsKartItem(mobj->type))
P_RemoveKartItem(mobj);
if (P_IsMiscCapObject(mobj->type))
P_RemoveMiscCap(mobj);
if (mobj->player && mobj->player->followmobj)
{
P_RemoveMobj(mobj->player->followmobj);

View file

@ -528,6 +528,7 @@ extern actioncache_t actioncachehead;
extern mobj_t *kitemcap;
extern mobj_t *waypointcap;
extern mobj_t *boss3cap;
extern mobj_t *misccap;
void P_InitCachedActions(void);
void P_RunCachedActions(void);
@ -541,6 +542,9 @@ boolean P_CanDeleteKartItem(INT32 type);
void P_AddKartItem(mobj_t *thing); // needs to be called in k_kart.c
void P_RunKartItems(void);
void P_AddMiscCap(mobj_t *thing);
void P_RunMiscCap(void);
// check mobj against water content, before movement code
void P_MobjCheckWater(mobj_t *mobj);

View file

@ -2064,9 +2064,16 @@ typedef enum
MD2_LASTMOMZ = 1<<28,
MD2_TERRAIN = 1<<29,
MD2_LIGHTLEVEL = 1<<30,
MD2_GRAVITY = (INT32)(1U<<31)
MD2_MORE = (INT32)(1U<<31)
} mobj_diff2_t;
typedef enum
{
MD3_GRAVITY = 1,
MD3_MISCCAP = 1<<1,
} mobj_diff3_t;
typedef enum
{
tc_mobj,
@ -2148,6 +2155,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
const mobj_t *mobj = (const mobj_t *)th;
UINT32 diff;
UINT32 diff2;
UINT32 diff3;
size_t j;
// Ignore stationary hoops - these will be respawned from mapthings.
@ -2170,7 +2178,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
if (mobj->flags2 & MF2_DONTSYNC)
return;
diff2 = 0;
diff = diff2 = diff3 = 0;
if (mobj->spawnpoint)
{
@ -2370,8 +2378,14 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
diff2 |= MD2_LASTMOMZ;
if (mobj->terrain != NULL || mobj->terrainOverlay != NULL)
diff2 |= MD2_TERRAIN;
if (mobj->gravity != FRACUNIT)
diff2 |= MD2_GRAVITY;
diff3 |= MD3_GRAVITY;
if (mobj == misccap)
diff3 |= MD3_MISCCAP;
if (diff3 != 0)
diff2 |= MD2_MORE;
if (diff2 != 0)
diff |= MD_MORE;
@ -2384,6 +2398,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
WRITEUINT32(save->p, diff);
if (diff & MD_MORE)
WRITEUINT32(save->p, diff2);
if (diff2 & MD2_MORE)
WRITEUINT32(save->p, diff3);
WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise.
WRITEFIXED(save->p, mobj->floorz);
@ -2638,7 +2654,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
WRITEUINT32(save->p, K_GetTerrainHeapIndex(mobj->terrain));
WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay));
}
if (diff2 & MD2_GRAVITY)
if (diff3 & MD3_GRAVITY)
{
WRITEFIXED(save->p, mobj->gravity);
}
@ -3529,6 +3545,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
mobj_t *mobj;
UINT32 diff;
UINT32 diff2;
UINT32 diff3;
INT32 i;
fixed_t z, floorz, ceilingz;
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
@ -3540,6 +3557,11 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
else
diff2 = 0;
if (diff2 & MD2_MORE)
diff3 = READUINT32(save->p);
else
diff3 = 0;
z = READFIXED(save->p); // Force this so 3dfloor problems don't arise.
floorz = READFIXED(save->p);
ceilingz = READFIXED(save->p);
@ -3882,7 +3904,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
{
mobj->terrain = NULL;
}
if (diff2 & MD2_GRAVITY)
if (diff3 & MD3_GRAVITY)
{
mobj->gravity = READFIXED(save->p);
}
@ -3925,6 +3947,9 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
if (diff2 & MD2_KITEMCAP)
P_SetTarget(&kitemcap, mobj);
if (diff3 & MD3_MISCCAP)
P_SetTarget(&misccap, mobj);
R_AddMobjInterpolator(mobj);
return &mobj->thinker;

View file

@ -218,6 +218,7 @@ void P_InitThinkers(void)
boss3cap = NULL;
waypointcap = NULL;
kitemcap = NULL;
misccap = NULL;
iquehead = iquetail = 0;
@ -757,6 +758,8 @@ void P_Ticker(boolean run)
// formality so kitemcap gets updated properly each frame.
P_RunKartItems();
P_RunMiscCap();
if (run)
{
ps_thinkertime = I_GetPreciseTime();