From fa92c880e02a6b97f1319589a4ac2ec5bd28b32a Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 24 Jan 2023 18:59:13 +0000 Subject: [PATCH] minigen: Add black fragments to common objects on valid road - Drawn underneath absolutely everything else, because it's the least specific of all the guides minigen can provide - "Common objects" includes: - Rings/spheres - Waypoints - Item boxes/spots - Overtime kiosk - Rings - Item Capsules - The above were chosen because they're a good distinctor between sectors that are valid to drive on and sectors that would be valid were there no impassable lines or massive height differences preventing the player from getting there. Related: - K_TerrainHasAffect now has a "bad only" check mode. - If true only report back for strong friction, any offroad, any damage, or stairjank. --- src/am_map.c | 59 ++++++++++++++++++++++++++++++++++++++----------- src/k_terrain.c | 11 +++++++-- src/k_terrain.h | 7 +++--- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/am_map.c b/src/am_map.c index c9a443730..e5ae874f4 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -962,8 +962,8 @@ static ffloor_t *AM_CompareFOFs(size_t i, ffloor_t *rover, ffloor_t *secondaryst terrain2 = K_GetTerrainForFlatNum(*secondaryrover->bottompic); } - if ((terrain1 && K_TerrainHasAffect(terrain1)) - || (terrain2 && K_TerrainHasAffect(terrain2))) + if ((terrain1 && K_TerrainHasAffect(terrain1, false)) + || (terrain2 && K_TerrainHasAffect(terrain2, false))) continue; break; @@ -1106,8 +1106,8 @@ static void AM_drawWalls(UINT8 pass) defercol = CDWALLCOLORS; // possible ceiling offroad boundary } - if ((terrain1 && K_TerrainHasAffect(terrain1)) - || (terrain2 && K_TerrainHasAffect(terrain2))) + if ((terrain1 && K_TerrainHasAffect(terrain1, false)) + || (terrain2 && K_TerrainHasAffect(terrain2, false))) { if (pass & PASS_INTANGIBLE) AM_drawMline(&l, defercol); // Yep, definitely a functionality boundary @@ -1239,13 +1239,6 @@ static inline void AM_drawPlayers(void) player_t *p; INT32 color = GREENS; - if (!multiplayer) - { - AM_drawLineCharacter(player_arrow, NUMPLYRLINES, 16<mo->angle, DWHITE, plr->mo->x, plr->mo->y); - return; - } - - // multiplayer (how??) for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i] || players[i].spectator) @@ -1269,7 +1262,46 @@ static inline void AM_drawThings(UINT8 colors) t = sectors[i].thinglist; while (t) { - AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16<angle, colors, t->x, t->y); + if (!t->player) + AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16<angle, colors, t->x, t->y); + t = t->snext; + } + } +} + +static inline void AM_drawSpecialThingsOnly(UINT8 colors) +{ + size_t i; + + for (i = 0; i < numsectors; i++) + { + terrain_t *terrain = NULL; + mobj_t *t = NULL; + + if (sectors[i].damagetype != 0 + || sectors[i].friction < ORIG_FRICTION + || sectors[i].offroad != 0) + continue; + + terrain = K_GetTerrainForFlatNum(sectors[i].floorpic); + if (!terrain) + terrain = K_GetTerrainForFlatNum(sectors[i].ceilingpic); + + if (terrain && K_TerrainHasAffect(terrain, true)) + continue; + + t = sectors[i].thinglist; + while (t) + { + if (t->type == MT_RANDOMITEM + || t->type == MT_PAPERITEMSPOT + || t->type == MT_OVERTIME_CENTER + || t->type == MT_RING + || t->type == MT_BLUESPHERE + || t->type == MT_WAYPOINT + || t->type == MT_ITEMCAPSULE + || t->flags & MF_SPRING) + AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16<angle, colors, t->x, t->y); t = t->snext; } } @@ -1317,8 +1349,8 @@ void AM_Drawer(void) AM_clearFB(BACKGROUND); if (draw_grid) AM_drawGrid(GRIDCOLORS); AM_drawWalls(PASS_FOF|PASS_INTANGIBLE|PASS_SOLID); - AM_drawPlayers(); AM_drawThings(THINGCOLORS); + AM_drawPlayers(); if (!followplayer) AM_drawCrosshair(XHAIRCOLORS); } @@ -1374,6 +1406,7 @@ minigen_t *AM_MinimapGenerate(INT32 mul) //AM_clearFB(BACKGROUND); memset(am_buf, 0xff, (f_w*f_h)); + AM_drawSpecialThingsOnly(BACKGROUND); AM_drawWalls(PASS_FOF); AM_drawWalls(PASS_INTANGIBLE); AM_drawWalls(PASS_SOLID); diff --git a/src/k_terrain.c b/src/k_terrain.c index 24af5dcb9..0bf90fc17 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -1542,11 +1542,18 @@ static void K_TerrainDefaults(terrain_t *terrain) See header file for description. --------------------------------------------------*/ -boolean K_TerrainHasAffect(terrain_t *terrain) +boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly) { - return (terrain->friction != 0 + if (terrain->friction > 0 || terrain->offroad != 0 || terrain->damageType != -1 + || (terrain->flags & TRF_STAIRJANK)) + return true; + + if (badonly) + return false; + + return (terrain->friction != 0 || terrain->trickPanel != 0 || terrain->speedPad != 0 || terrain->springStrength != 0 diff --git a/src/k_terrain.h b/src/k_terrain.h index 92241d923..e3cce83ad 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -570,18 +570,19 @@ void K_UpdateTerrainOverlay(mobj_t *mo); void K_InitTerrain(UINT16 wadNum); /*-------------------------------------------------- - boolean K_TerrainHasAffect(terrain_t *terrain) + boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly) Checks if Terrain block has a gameplay-affecting property. Input Arguments:- - terrain - Terrain structure to default. + terrain - Terrain structure to compare with default. + badonly - Only checks for negative properties if true Return:- false if functionally default, otherwise true. --------------------------------------------------*/ -boolean K_TerrainHasAffect(terrain_t *terrain); +boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly); #ifdef __cplusplus } // extern "C"