Check if certain mandatory linedef and sidedef fields are set, and use fallback values if not

This commit is contained in:
MascaraSnake 2020-01-01 14:27:01 +01:00
parent 3fc9749316
commit 699de06c05

View file

@ -1022,6 +1022,26 @@ static void P_InitializeLinedef(line_t *ld)
} }
} }
static void P_SetLinedefV1(size_t i, UINT16 vertex_num)
{
if (vertex_num >= numvertexes)
{
CONS_Debug(DBG_SETUP, "P_SetLinedefV1: linedef %s has out-of-range v1 num %u\n", sizeu1(i), vertex_num);
vertex_num = 0;
}
lines[i].v1 = &vertexes[vertex_num];
}
static void P_SetLinedefV2(size_t i, UINT16 vertex_num)
{
if (vertex_num >= numvertexes)
{
CONS_Debug(DBG_SETUP, "P_SetLinedefV2: linedef %s has out-of-range v2 num %u\n", sizeu1(i), vertex_num);
vertex_num = 0;
}
lines[i].v2 = &vertexes[vertex_num];
}
static void P_LoadLinedefs(UINT8 *data) static void P_LoadLinedefs(UINT8 *data)
{ {
maplinedef_t *mld = (maplinedef_t *)data; maplinedef_t *mld = (maplinedef_t *)data;
@ -1033,8 +1053,8 @@ static void P_LoadLinedefs(UINT8 *data)
ld->flags = SHORT(mld->flags); ld->flags = SHORT(mld->flags);
ld->special = SHORT(mld->special); ld->special = SHORT(mld->special);
ld->tag = SHORT(mld->tag); ld->tag = SHORT(mld->tag);
ld->v1 = &vertexes[SHORT(mld->v1)]; P_SetLinedefV1(i, SHORT(mld->v1));
ld->v2 = &vertexes[SHORT(mld->v2)]; P_SetLinedefV2(i, SHORT(mld->v2));
ld->sidenum[0] = SHORT(mld->sidenum[0]); ld->sidenum[0] = SHORT(mld->sidenum[0]);
ld->sidenum[1] = SHORT(mld->sidenum[1]); ld->sidenum[1] = SHORT(mld->sidenum[1]);
@ -1043,6 +1063,17 @@ static void P_LoadLinedefs(UINT8 *data)
} }
} }
static void P_SetSidedefSector(size_t i, UINT16 sector_num)
{
// cph 2006/09/30 - catch out-of-range sector numbers; use sector 0 instead
if (sector_num >= numsectors)
{
CONS_Debug(DBG_SETUP, "P_SetSidedefSector: sidedef %s has out-of-range sector num %u\n", sizeu1(i), sector_num);
sector_num = 0;
}
sides[i].sector = &sectors[sector_num];
}
static void P_LoadSidedefs(UINT8 *data) static void P_LoadSidedefs(UINT8 *data)
{ {
mapsidedef_t *msd = (mapsidedef_t*)data; mapsidedef_t *msd = (mapsidedef_t*)data;
@ -1052,12 +1083,11 @@ static void P_LoadSidedefs(UINT8 *data)
for (i = 0; i < numsides; i++, sd++, msd++) for (i = 0; i < numsides; i++, sd++, msd++)
{ {
INT16 textureoffset = SHORT(msd->textureoffset); INT16 textureoffset = SHORT(msd->textureoffset);
UINT16 sector_num;
boolean isfrontside; boolean isfrontside;
if (!sd->line) if (!sd->line)
{ {
CONS_Debug(DBG_SETUP, "P_LoadSidedefs: Sidedef %s is not used by any linedef\n", sizeu1((size_t)(sd - sides))); CONS_Debug(DBG_SETUP, "P_LoadSidedefs: Sidedef %s is not used by any linedef\n", sizeu1(i));
sd->line = &lines[0]; sd->line = &lines[0];
} }
@ -1077,14 +1107,7 @@ static void P_LoadSidedefs(UINT8 *data)
} }
sd->rowoffset = SHORT(msd->rowoffset)<<FRACBITS; sd->rowoffset = SHORT(msd->rowoffset)<<FRACBITS;
// cph 2006/09/30 - catch out-of-range sector numbers; use sector 0 instead P_SetSidedefSector(i, SHORT(msd->sector));
sector_num = SHORT(msd->sector);
if (sector_num >= numsectors)
{
CONS_Debug(DBG_SETUP, "P_LoadSidedefs: sidedef %s has out-of-range sector num %u\n", sizeu1(i), sector_num);
sector_num = 0;
}
sd->sector = &sectors[sector_num];
sd->colormap_data = NULL; sd->colormap_data = NULL;
@ -1385,7 +1408,7 @@ static void ParseTextmapSidedefParameter(UINT32 i, char *param)
else if (fastcmp(param, "texturemiddle")) else if (fastcmp(param, "texturemiddle"))
sides[i].midtexture = R_TextureNumForName(dat = M_GetToken(NULL)); sides[i].midtexture = R_TextureNumForName(dat = M_GetToken(NULL));
else if (fastcmp(param, "sector")) else if (fastcmp(param, "sector"))
sides[i].sector = &sectors[atol(dat = M_GetToken(NULL))]; P_SetSidedefSector(i, atol(dat = M_GetToken(NULL)));
else if (fastcmp(param, "repeatcnt")) else if (fastcmp(param, "repeatcnt"))
sides[i].repeatcnt = atol(dat = M_GetToken(NULL)); sides[i].repeatcnt = atol(dat = M_GetToken(NULL));
} }
@ -1397,9 +1420,9 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param)
else if (fastcmp(param, "special")) else if (fastcmp(param, "special"))
lines[i].special = atol(dat = M_GetToken(NULL)); lines[i].special = atol(dat = M_GetToken(NULL));
else if (fastcmp(param, "v1")) else if (fastcmp(param, "v1"))
lines[i].v1 = &vertexes[atol(dat = M_GetToken(NULL))]; P_SetLinedefV1(i, atol(dat = M_GetToken(NULL)));
else if (fastcmp(param, "v2")) else if (fastcmp(param, "v2"))
lines[i].v2 = &vertexes[atol(dat = M_GetToken(NULL))]; P_SetLinedefV2(i, atol(dat = M_GetToken(NULL)));
else if (fastcmp(param, "sidefront")) else if (fastcmp(param, "sidefront"))
lines[i].sidenum[0] = atol(dat = M_GetToken(NULL)); lines[i].sidenum[0] = atol(dat = M_GetToken(NULL));
else if (fastcmp(param, "sideback")) else if (fastcmp(param, "sideback"))
@ -1589,7 +1612,16 @@ static void P_LoadTextmap(void)
ld->sidenum[1] = 0xffff; ld->sidenum[1] = 0xffff;
TextmapParse(linesPos[i], i, ParseTextmapLinedefParameter); TextmapParse(linesPos[i], i, ParseTextmapLinedefParameter);
if (!ld->v1)
{
CONS_Debug(DBG_SETUP, "P_LoadTextmap: linedef %s has no v1 set; defaulting to 0\n", sizeu1(i));
ld->v1 = &vertexes[0];
}
if (!ld->v2)
{
CONS_Debug(DBG_SETUP, "P_LoadTextmap: linedef %s has no v2 set; defaulting to 0\n", sizeu1(i));
ld->v2 = &vertexes[0];
}
P_InitializeLinedef(ld); P_InitializeLinedef(ld);
} }
@ -1605,6 +1637,12 @@ static void P_LoadTextmap(void)
sd->repeatcnt = 0; sd->repeatcnt = 0;
TextmapParse(sidesPos[i], i, ParseTextmapSidedefParameter); TextmapParse(sidesPos[i], i, ParseTextmapSidedefParameter);
if (!sd->sector)
{
CONS_Debug(DBG_SETUP, "P_LoadTextmap: sidedef %s has no sector set; defaulting to 0\n", sizeu1(i));
sd->sector = &sectors[0];
}
} }
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++) for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)