Skip to content

Commit

Permalink
- finally got rid of the xsprite array.
Browse files Browse the repository at this point in the history
xsprites are now part of the actor class and the extra field in spritetype is not used anymore, aside from initializing the actor.
  • Loading branch information
coelckers committed Sep 6, 2021
1 parent 1ca5faf commit d432a67
Show file tree
Hide file tree
Showing 10 changed files with 22 additions and 122 deletions.
1 change: 0 additions & 1 deletion source/build/include/build.h
Expand Up @@ -688,7 +688,6 @@ extern int32_t rintersect(int32_t x1, int32_t y1, int32_t z1,

extern int32_t(*animateoffs_replace)(int const tilenum, int fakevar);
extern void(*initspritelists_replace)(void);
extern int32_t(*insertsprite_replace)(int16_t sectnum, int16_t statnum);
extern int32_t(*deletesprite_replace)(int16_t spritenum);
extern int32_t(*changespritesect_replace)(int16_t spritenum, int16_t newsectnum);
extern int32_t(*changespritestat_replace)(int16_t spritenum, int16_t newstatnum);
Expand Down
3 changes: 0 additions & 3 deletions source/build/src/engine.cpp
Expand Up @@ -314,11 +314,8 @@ static void do_deletespritestat(int16_t deleteme)
//
// insertsprite
//
int32_t(*insertsprite_replace)(int16_t sectnum, int16_t statnum) = NULL;
int32_t insertsprite(int16_t sectnum, int16_t statnum)
{
if (insertsprite_replace)
return insertsprite_replace(sectnum, statnum);
// TODO: guard against bad sectnum?
int32_t const newspritenum = insertspritestat(statnum);

Expand Down
28 changes: 2 additions & 26 deletions source/games/blood/src/actor.cpp
Expand Up @@ -6383,20 +6383,7 @@ void actProcessSprites(void)

DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool setextra)
{
DBloodActor* actor;
int nSprite = InsertSprite(nSector, nStat);
if (nSprite >= 0)
{
actor = &bloodActors[nSprite];
}
else
{
BloodStatIterator it(kStatPurge);
actor = it.Next();
assert(actor != nullptr);
ChangeActorSect(actor, nSector);
actPostSprite(actor, nStat);
}
DBloodActor* actor = InsertSprite(nSector, nStat);

vec3_t pos = { x, y, z };
setActorPos(actor, &pos);
Expand All @@ -6421,18 +6408,7 @@ DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool se
DBloodActor* actSpawnSprite(DBloodActor* source, int nStat)
{
auto pSource = &source->s();
int nSprite = InsertSprite(pSource->sectnum, nStat);
DBloodActor* actor;
if (nSprite < 0)
{
BloodStatIterator it(kStatPurge);
actor = it.Next();
assert(actor);
assert(pSource->sectnum >= 0 && pSource->sectnum < kMaxSectors);
ChangeActorSect(actor, pSource->sectnum);
actPostSprite(actor, nStat);
}
else actor = &bloodActors[nSprite];
DBloodActor* actor = InsertSprite(pSource->sectnum, nStat);

spritetype* pSprite = &actor->s();
pSprite->x = pSource->x;
Expand Down
1 change: 0 additions & 1 deletion source/games/blood/src/blood.cpp
Expand Up @@ -110,7 +110,6 @@ void StartLevel(MapRecord* level, bool newgame)
gHealthTemp[i] = gPlayer[i].actor->x().health;
}
}
memset(xsprite, 0, sizeof(xsprite));
//drawLoadingScreen();
dbLoadMap(currentLevel->fileName, (int*)&startpos.x, (int*)&startpos.y, (int*)&startpos.z, &startang, &startsectnum, nullptr);
SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name);
Expand Down
18 changes: 9 additions & 9 deletions source/games/blood/src/bloodactor.h
@@ -1,7 +1,5 @@
#pragma once

#define ex_tra extra

BEGIN_BLD_NS

class DBloodActor;
Expand Down Expand Up @@ -94,13 +92,15 @@ class DBloodActor

public:
int dudeSlope;
int xvel, yvel, zvel;
bool hasx;
XSPRITE xsprite;
SPRITEHIT hit;
DUDEEXTRA dudeExtra;
SPRITEMASS spriteMass;
GENDUDEEXTRA genDudeExtra;
DBloodActor* prevmarker; // needed by the nnext marker code. This originally hijacked targetX in XSPRITE
POINT3D basePoint;
int xvel, yvel, zvel;

// transient data (not written to savegame)
int cumulDamage;
Expand All @@ -119,15 +119,15 @@ class DBloodActor
spriteMass = {};
hit = {};
basePoint = {};
xsprite = {};
hasx = false;
xvel = yvel = zvel = 0;
}
bool hasX() { return sprite[index].ex_tra > 0; }
void addX()
{
if (s().ex_tra == -1) dbInsertXSprite(s().index);
}
bool hasX() { return hasx; }
void addX() { hasx = true; }

spritetype& s() { return sprite[index]; }
XSPRITE& x() { return xsprite[sprite[index].ex_tra]; } // calling this does not validate the xsprite!
XSPRITE& x() { return xsprite; } // calling this does not validate the xsprite!
int GetIndex() { return index; } // this is for error printing only!

void SetOwner(DBloodActor* own)
Expand Down
63 changes: 9 additions & 54 deletions source/games/blood/src/db.cpp
Expand Up @@ -45,11 +45,9 @@ DBloodActor bloodActors[kMaxSprites];
bool gModernMap = false;
unsigned short gStatCount[kMaxStatus + 1];

XSPRITE xsprite[kMaxXSprites];
XSECTOR xsector[kMaxXSectors];
XWALL xwall[kMaxXWalls];

unsigned short nextXSprite[kMaxXSprites];
int XWallsUsed, XSectorsUsed;


Expand Down Expand Up @@ -176,13 +174,14 @@ void qinitspritelists(void) // Replace
Numsprites = 0;
}

int InsertSprite(int nSector, int nStat)
DBloodActor* InsertSprite(int nSector, int nStat)
{
int nSprite = headspritestat[kMaxStatus];
assert(nSprite < kMaxSprites);
if (nSprite < 0)
{
return nSprite;
I_Error("Out of sprites!"); // we cannot deal with this - and most of the calling code never checks...
return nullptr;
}
RemoveSpriteStat(nSprite);
DBloodActor* actor = &bloodActors[nSprite];
Expand All @@ -195,29 +194,19 @@ int InsertSprite(int nSector, int nStat)
pSprite->clipdist = 32;
pSprite->xrepeat = pSprite->yrepeat = 64;
actor->SetOwner(nullptr);
pSprite->ex_tra = -1;
pSprite->index = nSprite;

Numsprites++;

sprite[nSprite].time = leveltimer++;
return nSprite;
}

int qinsertsprite(short nSector, short nStat) // Replace
{
return InsertSprite(nSector, nStat);
return actor;
}

int DeleteSprite(int nSprite)
{
FVector3 pos = GetSoundPos(&sprite[nSprite].pos);
soundEngine->RelinkSound(SOURCE_Actor, &sprite[nSprite], nullptr, &pos);

if (sprite[nSprite].ex_tra > 0)
{
InsertFree(nextXSprite, sprite[nSprite].ex_tra);
}
assert(sprite[nSprite].statnum >= 0 && sprite[nSprite].statnum < kMaxStatus);
RemoveSpriteStat(nSprite);
assert(sprite[nSprite].sectnum >= 0 && sprite[nSprite].sectnum < kMaxSectors);
Expand Down Expand Up @@ -276,40 +265,6 @@ void InitFreeList(unsigned short *pList, int nCount)
pList[0] = nCount - 1;
}

void InitFreeList(unsigned short* pList, int nCount, FixedBitArray<MAXSPRITES>&used)
{
int lastfree = 0;
for (int i = 1; i < nCount; i++)
{
if (!used[i])
{
pList[i] = lastfree;
lastfree = i;
}
}
pList[0] = lastfree;
}

void InsertFree(unsigned short *pList, int nIndex)
{
pList[nIndex] = pList[0];
pList[0] = nIndex;
}

unsigned short dbInsertXSprite(int nSprite)
{
int nXSprite = nextXSprite[0];
nextXSprite[0] = nextXSprite[nXSprite];
if (nXSprite == 0)
{
I_Error("Out of free XSprites");
}
memset(&xsprite[nXSprite], 0, sizeof(XSPRITE));
bloodActors[nSprite].hit = {};
sprite[nSprite].ex_tra = nXSprite;
return nXSprite;
}

unsigned short dbInsertXWall(int nWall)
{
int nXWall = XWallsUsed++;
Expand Down Expand Up @@ -338,7 +293,6 @@ unsigned short dbInsertXSector(int nSector)

void dbInit(void)
{
InitFreeList(nextXSprite, kMaxXSprites);
XWallsUsed = XSectorsUsed = 1; // 0 is not usable because it's the default for 'extra' and some code actually uses it to clobber the contents in here. :(
for (int i = 1; i < kMaxXWalls; i++)
{
Expand Down Expand Up @@ -847,7 +801,9 @@ void dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, shor
{
RemoveSpriteStat(i);
spritetypedisk load;
spritetype *pSprite = &sprite[i];
auto actor = &bloodActors[i];
actor->Clear();
spritetype *pSprite = &actor->s();
fr.Read(&load, sizeof(spritetypedisk)); // load into an intermediate buffer so that spritetype is no longer bound by file formats.
if (encrypted) // What were these people thinking? :(
{
Expand Down Expand Up @@ -886,9 +842,8 @@ void dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, shor
if (pSprite->extra > 0)
{
char pBuffer[nXSpriteSize];
int nXSprite = dbInsertXSprite(i);
XSPRITE *pXSprite = &xsprite[nXSprite];
memset(pXSprite, 0, sizeof(XSPRITE));
actor->addX();
XSPRITE *pXSprite = &actor->x();
int nCount;
if (!encrypted)
{
Expand Down
11 changes: 1 addition & 10 deletions source/games/blood/src/db.h
Expand Up @@ -292,13 +292,9 @@ extern unsigned short gStatCount[kMaxStatus + 1];;
extern bool drawtile2048, encrypted;
extern MAPHEADER2 byte_19AE44;

extern XSPRITE xsprite[kMaxXSprites];
extern XSECTOR xsector[kMaxXSectors];
extern XWALL xwall[kMaxXWalls];

extern FixedBitArray<MAXSPRITES> activeXSprites;


extern char qsector_filler[kMaxSectors];

extern int gVisibility;
Expand All @@ -307,7 +303,6 @@ extern const char *gItemText[];
extern const char *gAmmoText[];
extern const char *gWeaponText[];

extern unsigned short nextXSprite[kMaxXSprites];
extern int XWallsUsed, XSectorsUsed;

static inline int GetWallType(int nWall)
Expand Down Expand Up @@ -347,18 +342,14 @@ void RemoveSpriteSect(int nSprite);
void InsertSpriteStat(int nSprite, int nStat);
void RemoveSpriteStat(int nSprite);
void qinitspritelists(void);
int InsertSprite(int nSector, int nStat);
int qinsertsprite(short nSector, short nStat);
DBloodActor* InsertSprite(int nSector, int nStat);
int DeleteSprite(int nSprite);
int qdeletesprite(short nSprite);
int ChangeSpriteSect(int nSprite, int nSector);
int qchangespritesect(short nSprite, short nSector);
int ChangeSpriteStat(int nSprite, int nStatus);
int qchangespritestat(short nSprite, short nStatus);
void InitFreeList(unsigned short *pList, int nCount);
void InitFreeList(unsigned short* pList, int nCount, FixedBitArray<MAXSPRITES>& activeXSprites);
void InsertFree(unsigned short *pList, int nIndex);
unsigned short dbInsertXSprite(int nSprite);
unsigned short dbInsertXWall(int nWall);
unsigned short dbInsertXSector(int nSector);
void dbInit(void);
Expand Down
14 changes: 0 additions & 14 deletions source/games/blood/src/loadsave.cpp
Expand Up @@ -37,8 +37,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

BEGIN_BLD_NS

FixedBitArray<MAXSPRITES> activeXSprites;

// All AI states for assigning an index.
static AISTATE* allAIStates[] =
{
Expand Down Expand Up @@ -696,7 +694,6 @@ void SerializeState(FSerializer& arc)

.Array("xwall", xwall, XWallsUsed) // todo
.Array("xsector", xsector, XSectorsUsed)
.SparseArray("xsprite", xsprite, kMaxXSprites, activeXSprites)
.SparseArray("actors", bloodActors, kMaxSprites, activeSprites)
.EndObject();
}
Expand All @@ -718,26 +715,15 @@ void GameInterface::SerializeGameState(FSerializer& arc)
{
if (arc.isWriting())
{
activeXSprites.Zero();
for (int i = 0; i < kMaxSprites; i++)
{
//if (activeSprites[i] && bloodActors[i].hasX()) activeXSprites.Set(bloodAc);
}
}
else
{
sndKillAllSounds();
sfxKillAllSounds();
ambKillAll();
seqKillAll();
if (gamestate != GS_LEVEL)
{
memset(xsprite, 0, sizeof(xsprite));
}
}
arc.SerializeMemory("activexsprites", activeXSprites.Storage(), activeXSprites.StorageSize());
SerializeState(arc);
InitFreeList(nextXSprite, kMaxXSprites, activeXSprites);
SerializeActor(arc);
SerializePlayers(arc);
SerializeEvents(arc);
Expand Down
3 changes: 1 addition & 2 deletions source/games/blood/src/nnexts.cpp
Expand Up @@ -3621,8 +3621,7 @@ void useSeqSpawnerGen(DBloodActor* sourceactor, int objType, int index, DBloodAc
{
if (pXSource->data3 > 0)
{
int nSpawned = InsertSprite(pSprite->sectnum, kStatDecoration);
auto spawned = &bloodActors[nSpawned];
auto spawned = InsertSprite(pSprite->sectnum, kStatDecoration);
auto pSpawned = &spawned->s();
int top, bottom; GetActorExtents(spawned, &top, &bottom);
pSpawned->x = pSprite->x;
Expand Down
2 changes: 0 additions & 2 deletions source/games/blood/src/replace.cpp
Expand Up @@ -63,7 +63,6 @@ int qanimateoffs(int a1, int a2)
}

void qinitspritelists();
int32_t qinsertsprite(int16_t nSector, int16_t nStat);
int32_t qdeletesprite(int16_t nSprite);
int32_t qchangespritesect(int16_t nSprite, int16_t nSector);
int32_t qchangespritestat(int16_t nSprite, int16_t nStatus);
Expand All @@ -72,7 +71,6 @@ void HookReplaceFunctions(void)
{
animateoffs_replace = qanimateoffs;
initspritelists_replace = qinitspritelists;
insertsprite_replace = qinsertsprite;
deletesprite_replace = qdeletesprite;
changespritesect_replace = qchangespritesect;
changespritestat_replace = qchangespritestat;
Expand Down

0 comments on commit d432a67

Please sign in to comment.