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
parent 6f14b91022
commit fa92c880e0
3 changed files with 59 additions and 18 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)
@ -1269,7 +1262,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;
}
}
@ -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);

View file

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

View file

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