diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 95a143eea..6c229bd68 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 375af51de..824ba6d4b 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -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; diff --git a/src/k_hud.c b/src/k_hud.c index ba181547f..986201ed2 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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; diff --git a/src/k_kart.c b/src/k_kart.c index 83b40a273..bc4780b14 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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); diff --git a/src/p_mobj.c b/src/p_mobj.c index 32b3bc641..457a7893c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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); diff --git a/src/p_mobj.h b/src/p_mobj.h index 36cfdd07b..c042a6994 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -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); diff --git a/src/p_saveg.c b/src/p_saveg.c index 361792abe..ed7c98fc9 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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; diff --git a/src/p_tick.c b/src/p_tick.c index c51a5aa83..46d682c43 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -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();