- changed map loader to work without relying on spritetype::sectnum.

All access to this field is done through access functions now.
This commit is contained in:
Christoph Oelckers 2021-12-06 17:18:11 +01:00
parent 8ee5d1b0d7
commit 2d913982da
7 changed files with 37 additions and 23 deletions

View file

@ -324,7 +324,7 @@ struct SpawnSpriteDef
void insertAllSprites(SpawnSpriteDef& sprites); void insertAllSprites(SpawnSpriteDef& sprites);
void allocateMapArrays(int numsprites); void allocateMapArrays(int numsprites);
void ValidateSprite(spritetype& spr, int index); void ValidateSprite(spritetype& spr, int secno, int index);
void engineLoadBoard(const char *filename, int flags, vec3_t *dapos, int16_t *daang, int *dacursectnum, SpawnSpriteDef& sprites); void engineLoadBoard(const char *filename, int flags, vec3_t *dapos, int16_t *daang, int *dacursectnum, SpawnSpriteDef& sprites);
void loadMapBackup(const char* filename); void loadMapBackup(const char* filename);
void G_LoadMapHack(const char* filename, const unsigned char*, SpawnSpriteDef& sprites); void G_LoadMapHack(const char* filename, const unsigned char*, SpawnSpriteDef& sprites);
@ -614,12 +614,23 @@ inline sectortype* spritetypebase::sector() const
return !validSectorIndex(sectnum)? nullptr : &::sector[sectnum]; return !validSectorIndex(sectnum)? nullptr : &::sector[sectnum];
} }
inline int spritetypebase::sectno() const
{
return sectnum;
}
inline void spritetypebase::setsector(sectortype* sect) inline void spritetypebase::setsector(sectortype* sect)
{ {
// place for asserts. // place for asserts.
sectnum = sect? ::sector.IndexOf(sect) : -1; sectnum = sect? ::sector.IndexOf(sect) : -1;
} }
inline void spritetypebase::setsector(int sec)
{
// place for asserts.
sectnum = validSectorIndex(sec)? sec : -1;
}
inline bool spritetypebase::insector() const inline bool spritetypebase::insector() const
{ {
return validSectorIndex(sectnum); return validSectorIndex(sectnum);

View file

@ -408,8 +408,10 @@ struct spritetypebase
} }
sectortype* sector() const; sectortype* sector() const;
int sectno() const;
bool insector() const; bool insector() const;
void setsector(sectortype*); void setsector(sectortype*);
void setsector(int);
}; };

View file

@ -186,7 +186,7 @@ class TObjPtr
public: public:
TObjPtr() = default; TObjPtr() = default;
TObjPtr(const TObjPtr<T> &q) = delete; TObjPtr(const TObjPtr<T> &q) = default;
TObjPtr(T q) noexcept TObjPtr(T q) noexcept
: pp(q) : pp(q)

View file

@ -257,7 +257,7 @@ static void AddSectHead(DCoreActor *actor, sectortype* sect)
else sect->lastEntry = actor; else sect->lastEntry = actor;
sect->firstEntry = actor; sect->firstEntry = actor;
assert(ValidateSectList(sect)); assert(ValidateSectList(sect));
actor->s().sectnum = sectnum(sect); actor->s().setsector(sect);
actor->link_sector = sect; actor->link_sector = sect;
GC::WriteBarrier(actor); GC::WriteBarrier(actor);
GC::WriteBarrier(head); GC::WriteBarrier(head);

View file

@ -160,7 +160,7 @@ static int32_t LoadMapHack(const char *filename, SpawnSpriteDef& sprites)
{ {
if (currentsprite != -1 && validateSprite()) if (currentsprite != -1 && validateSprite())
{ {
sprites.sprites[currentsprite].sectnum = sc.Number; sprites.sprites[currentsprite].setsector(sc.Number);
} }
} }
} }

View file

@ -237,7 +237,7 @@ static void SetWallPalV5()
} }
} }
void ValidateSprite(spritetype& spr, int index) void ValidateSprite(spritetype& spr, int sectnum, int index)
{ {
bool bugged = false; bool bugged = false;
if ((unsigned)spr.statnum >= MAXSTATUS) if ((unsigned)spr.statnum >= MAXSTATUS)
@ -250,27 +250,27 @@ void ValidateSprite(spritetype& spr, int index)
Printf("Sprite #%d (%d,%d) has invalid picnum %d.\n", index, spr.x, spr.y, spr.picnum); Printf("Sprite #%d (%d,%d) has invalid picnum %d.\n", index, spr.x, spr.y, spr.picnum);
bugged = true; bugged = true;
} }
else if (!validSectorIndex(spr.sectnum)) else if (!validSectorIndex(sectnum))
{ {
int sectnum = -1; sectnum = -1;
updatesector(spr.x, spr.y, &sectnum); updatesector(spr.x, spr.y, &sectnum);
bugged = sectnum < 0; bugged = sectnum < 0;
if (!DPrintf(DMSG_WARNING, "Sprite #%d (%d,%d) with invalid sector %d was corrected to sector %d\n", index, spr.x, spr.y, spr.sectnum, sectnum)) if (!DPrintf(DMSG_WARNING, "Sprite #%d (%d,%d) with invalid sector %d was corrected to sector %d\n", index, spr.x, spr.y, sectnum, sectnum))
{ {
if (bugged) Printf("Sprite #%d (%d,%d) with invalid sector %d\n", index, spr.x, spr.y, spr.sectnum); if (bugged) Printf("Sprite #%d (%d,%d) with invalid sector %d\n", index, spr.x, spr.y, sectnum);
} }
spr.sectnum = sectnum;
} }
if (bugged) if (bugged)
{ {
spr.clear(); spr.clear();
spr.statnum = MAXSTATUS; spr.statnum = MAXSTATUS;
spr.sectnum = MAXSECTORS; sectnum = -1;
} }
spr.setsector(sectnum);
} }
static void ReadSpriteV7(FileReader& fr, spritetype& spr) static void ReadSpriteV7(FileReader& fr, spritetype& spr, int& secno)
{ {
spr.pos.x = fr.ReadInt32(); spr.pos.x = fr.ReadInt32();
spr.pos.y = fr.ReadInt32(); spr.pos.y = fr.ReadInt32();
@ -285,7 +285,7 @@ static void ReadSpriteV7(FileReader& fr, spritetype& spr)
spr.yrepeat = fr.ReadUInt8(); spr.yrepeat = fr.ReadUInt8();
spr.xoffset = fr.ReadInt8(); spr.xoffset = fr.ReadInt8();
spr.yoffset = fr.ReadInt8(); spr.yoffset = fr.ReadInt8();
spr.sectnum = fr.ReadInt16(); secno = fr.ReadInt16();
spr.statnum = fr.ReadInt16(); spr.statnum = fr.ReadInt16();
spr.ang = fr.ReadInt16(); spr.ang = fr.ReadInt16();
spr.owner = fr.ReadInt16(); spr.owner = fr.ReadInt16();
@ -298,7 +298,7 @@ static void ReadSpriteV7(FileReader& fr, spritetype& spr)
spr.detail = 0; spr.detail = 0;
} }
static void ReadSpriteV6(FileReader& fr, spritetype& spr) static void ReadSpriteV6(FileReader& fr, spritetype& spr, int& secno)
{ {
spr.pos.x = fr.ReadInt32(); spr.pos.x = fr.ReadInt32();
spr.pos.y = fr.ReadInt32(); spr.pos.y = fr.ReadInt32();
@ -317,7 +317,7 @@ static void ReadSpriteV6(FileReader& fr, spritetype& spr)
spr.yvel = fr.ReadInt16(); spr.yvel = fr.ReadInt16();
spr.zvel = fr.ReadInt16(); spr.zvel = fr.ReadInt16();
spr.owner = fr.ReadInt16(); spr.owner = fr.ReadInt16();
spr.sectnum = fr.ReadInt16(); secno = fr.ReadInt16();
spr.statnum = fr.ReadInt16(); spr.statnum = fr.ReadInt16();
spr.lotag = fr.ReadInt16(); spr.lotag = fr.ReadInt16();
spr.hitag = fr.ReadInt16(); spr.hitag = fr.ReadInt16();
@ -326,7 +326,7 @@ static void ReadSpriteV6(FileReader& fr, spritetype& spr)
spr.detail = 0; spr.detail = 0;
} }
static void ReadSpriteV5(FileReader& fr, spritetype& spr) static void ReadSpriteV5(FileReader& fr, spritetype& spr, int& secno)
{ {
spr.pos.x = fr.ReadInt32(); spr.pos.x = fr.ReadInt32();
spr.pos.y = fr.ReadInt32(); spr.pos.y = fr.ReadInt32();
@ -341,7 +341,7 @@ static void ReadSpriteV5(FileReader& fr, spritetype& spr)
spr.yvel = fr.ReadInt16(); spr.yvel = fr.ReadInt16();
spr.zvel = fr.ReadInt16(); spr.zvel = fr.ReadInt16();
spr.owner = fr.ReadInt16(); spr.owner = fr.ReadInt16();
spr.sectnum = fr.ReadInt16(); secno = fr.ReadInt16();
spr.statnum = fr.ReadInt16(); spr.statnum = fr.ReadInt16();
spr.lotag = fr.ReadInt16(); spr.lotag = fr.ReadInt16();
spr.hitag = fr.ReadInt16(); spr.hitag = fr.ReadInt16();
@ -446,13 +446,14 @@ void engineLoadBoard(const char* filename, int flags, vec3_t* pos, int16_t* ang,
fr.Seek(spritepos, FileReader::SeekSet); fr.Seek(spritepos, FileReader::SeekSet);
for (int i = 0; i < numsprites; i++) for (int i = 0; i < numsprites; i++)
{ {
int secno = -1;
switch (mapversion) switch (mapversion)
{ {
case 5: ReadSpriteV5(fr, sprites.sprites[i]); break; case 5: ReadSpriteV5(fr, sprites.sprites[i], secno); break;
case 6: ReadSpriteV6(fr, sprites.sprites[i]); break; case 6: ReadSpriteV6(fr, sprites.sprites[i], secno); break;
default: ReadSpriteV7(fr, sprites.sprites[i]); break; default: ReadSpriteV7(fr, sprites.sprites[i], secno); break;
} }
ValidateSprite(sprites.sprites[i], i); ValidateSprite(sprites.sprites[i], secno, i);
} }

View file

@ -532,7 +532,7 @@ void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sect
pSprite->z = LittleLong(load.z); pSprite->z = LittleLong(load.z);
pSprite->cstat = LittleShort(load.cstat); pSprite->cstat = LittleShort(load.cstat);
pSprite->picnum = LittleShort(load.picnum); pSprite->picnum = LittleShort(load.picnum);
pSprite->sectnum = LittleShort(load.sectnum); int secno = LittleShort(load.sectnum);
pSprite->statnum = LittleShort(load.statnum); pSprite->statnum = LittleShort(load.statnum);
pSprite->ang = LittleShort(load.ang); pSprite->ang = LittleShort(load.ang);
pSprite->owner = LittleShort(load.owner); pSprite->owner = LittleShort(load.owner);
@ -552,7 +552,7 @@ void dbLoadMap(const char* pPath, int* pX, int* pY, int* pZ, short* pAngle, sect
pSprite->shade = load.shade; pSprite->shade = load.shade;
pSprite->blend = 0; pSprite->blend = 0;
pSprite->time = i; pSprite->time = i;
ValidateSprite(*pSprite, i); ValidateSprite(*pSprite, secno, i);
if (pSprite->extra > 0) if (pSprite->extra > 0)
{ {