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.
This commit is contained in:
toaster 2023-01-24 18:59:13 +00:00 committed by GenericHeroGuy
parent 1b163a93f9
commit c9b532ad84
3 changed files with 60 additions and 19 deletions

View file

@ -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<<FRACBITS, plr->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<<FRACBITS, t->angle, colors, t->x, t->y);
if (!t->player)
AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16<<FRACBITS, t->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<<FRACBITS, t->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);

View file

@ -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);

View file

@ -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"