From c9b532ad84c2754cd3f3c9f0f5b10d136b922f75 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 | 13 ++++++++--- src/k_terrain.h | 7 +++--- 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/am_map.c b/src/am_map.c index 604a9cb33..e2c29f6cb 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) @@ -1272,7 +1265,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; } } @@ -1320,8 +1352,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); } @@ -1377,6 +1409,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 6832ebbb8..35f14516a 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -1635,12 +1635,19 @@ 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->trickPanel != 0 + || (terrain->flags & TRF_STAIRJANK)) + return true; + + if (badonly) + return false; + + return (terrain->friction != 0 + //|| terrain->trickPanel != 0 || terrain->speedPad != 0 || terrain->springStrength != 0 || terrain->flags != 0); diff --git a/src/k_terrain.h b/src/k_terrain.h index c8a94aba5..12367a2d3 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -595,18 +595,19 @@ boolean K_InitTerrainPwad(UINT16 wadNum); void K_InitTerrain(void); /*-------------------------------------------------- - 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"