diff --git a/source/core/maploader.cpp b/source/core/maploader.cpp index 1cef5a0c8..3536d17b2 100644 --- a/source/core/maploader.cpp +++ b/source/core/maploader.cpp @@ -414,6 +414,28 @@ void fixSectors() } } +void validateStartSector(const char* filename, const vec3_t& pos, int* cursectnum, unsigned numsectors) +{ + + if ((unsigned)(*cursectnum) >= numsectors) + { + sectortype* sect = nullptr; + updatesectorz(pos.X, pos.Y, pos.Z, §); + if (!sect) updatesector(pos.X, pos.Y, §); + if (sect) + { + Printf(PRINT_HIGH, "Error in map %s: Start sector %d out of range. Max. sector is %d\n", filename, *cursectnum, numsectors); + *cursectnum = sectnum(sect); + } + else + { + I_Error("Unable to start map %s: Start sector %d out of range. Max. sector is %d. No valid location at start spot\n", filename, *cursectnum, numsectors); + } + } + + +} + void loadMap(const char* filename, int flags, vec3_t* pos, int16_t* ang, int* cursectnum, SpawnSpriteDef& sprites) { inputState.ClearAllInput(); @@ -507,6 +529,7 @@ void loadMap(const char* filename, int flags, vec3_t* pos, int16_t* ang, int* cu wallbackup = wall; sectorbackup = sector; + validateStartSector(filename, *pos, cursectnum, numsectors); } diff --git a/source/core/maptypes.h b/source/core/maptypes.h index 971b07618..df16bbe03 100644 --- a/source/core/maptypes.h +++ b/source/core/maptypes.h @@ -648,3 +648,4 @@ void loadMap(const char *filename, int flags, vec3_t *pos, int16_t *ang, int *cu TArray loadMapWalls(const char* filename); void loadMapBackup(const char* filename); void loadMapHack(const char* filename, const unsigned char*, SpawnSpriteDef& sprites); +void validateStartSector(const char* filename, const vec3_t& pos, int* cursectnum, unsigned numsectors); diff --git a/source/games/blood/src/blood.cpp b/source/games/blood/src/blood.cpp index 42a2c6b7e..d220fb222 100644 --- a/source/games/blood/src/blood.cpp +++ b/source/games/blood/src/blood.cpp @@ -248,7 +248,9 @@ void StartLevel(MapRecord* level, bool newgame) #endif //drawLoadingScreen(); BloodSpawnSpriteDef sprites; - dbLoadMap(currentLevel->fileName, (int*)&startpos.X, (int*)&startpos.Y, (int*)&startpos.Z, &startang, &startsector, nullptr, sprites); + int startsectno; + dbLoadMap(currentLevel->fileName, (int*)&startpos.X, (int*)&startpos.Y, (int*)&startpos.Z, &startang, &startsectno, nullptr, sprites); + startsector = §or[startsectno]; SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name); STAT_NewLevel(currentLevel->fileName); wsrand(dbReadMapCRC(currentLevel->LabelName())); diff --git a/source/games/blood/src/db.cpp b/source/games/blood/src/db.cpp index 56885cdf3..844f5fa81 100644 --- a/source/games/blood/src/db.cpp +++ b/source/games/blood/src/db.cpp @@ -129,7 +129,7 @@ unsigned int dbReadMapCRC(const char* pPath) // //--------------------------------------------------------------------------- -void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sectortype** ppSector, unsigned int* pCRC, BloodSpawnSpriteDef& sprites) +void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, int* cursectnum, unsigned int* pCRC, BloodSpawnSpriteDef& sprites) { const int nXSectorSize = 60; const int nXSpriteSize = 56; @@ -221,7 +221,7 @@ void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sect #if 1 // bad, bad hack, just for making Polymost happy... PolymostAllocFakeSector(); #endif - * ppSector = mapHeader.sect >= 0 ? §or[mapHeader.sect] : nullptr; + *cursectnum = mapHeader.sect; if (encrypted) { @@ -673,6 +673,7 @@ void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sect sectionGeometry.SetSize(sections.Size()); wallbackup = wall; sectorbackup = sector; + validateStartSector(mapname.GetChars(), { *pX, *pY, *pZ }, cursectnum, mapHeader.numsectors); } @@ -687,6 +688,6 @@ END_BLD_NS void qloadboard(const char* filename, char flags, vec3_t* dapos, int16_t* daang) { Blood::BloodSpawnSpriteDef sprites; - sectortype* sp; + int sp; Blood::dbLoadMap(filename, &dapos->X, &dapos->Y, &dapos->Z, daang, &sp, nullptr, sprites); } diff --git a/source/games/blood/src/db.h b/source/games/blood/src/db.h index 180610fd6..5d078d760 100644 --- a/source/games/blood/src/db.h +++ b/source/games/blood/src/db.h @@ -101,7 +101,7 @@ DBloodActor* InsertSprite(sectortype* pSector, int nStat); int DeleteSprite(DBloodActor* actor); unsigned int dbReadMapCRC(const char* pPath); -void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sectortype** pSector, unsigned int* pCRC, BloodSpawnSpriteDef& sprites); +void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, int* pSector, unsigned int* pCRC, BloodSpawnSpriteDef& sprites); END_BLD_NS