diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index a8b24c3ed..4bab1ea1b 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -108,14 +108,16 @@ public: void Clear() { - explosionhackflag = false; - prevmarker = nullptr; dudeSlope = 0; + hit = {}; dudeExtra = {}; spriteMass = {}; - hit = {}; + genDudeExtra = {}; + prevmarker = nullptr; basePoint = {}; xvel = yvel = zvel = 0; + explosionhackflag = false; + interpolated = false; } bool hasX() { return sprite[index].extra > 0; } void addX() diff --git a/source/games/blood/src/db.cpp b/source/games/blood/src/db.cpp index 061ab8898..0520dcdef 100644 --- a/source/games/blood/src/db.cpp +++ b/source/games/blood/src/db.cpp @@ -522,6 +522,7 @@ void dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, shor memset(sector, 0, sizeof(sector)); memset(wall, 0, sizeof(wall)); memset(sprite, 0, sizeof(sprite)); + memset(xsprite, 0, sizeof(xsprite)); #ifdef NOONE_EXTENSIONS for (auto& ctrl : gPlayerCtrl) ctrl.qavScene.initiator = nullptr; diff --git a/source/games/blood/src/db.h b/source/games/blood/src/db.h index f2611bd86..624117153 100644 --- a/source/games/blood/src/db.h +++ b/source/games/blood/src/db.h @@ -202,6 +202,7 @@ struct XSECTOR { uint16_t waitTimeB; // ON->OFF waitTime DBloodActor* marker0; DBloodActor* marker1; + DBloodActor* basePath; uint16_t windAng; // Wind ang uint16_t bobTheta; // Motion Theta int16_t bobSpeed; // Motion speed diff --git a/source/games/blood/src/loadsave.cpp b/source/games/blood/src/loadsave.cpp index c8f2174a0..ebdf4d9e3 100644 --- a/source/games/blood/src/loadsave.cpp +++ b/source/games/blood/src/loadsave.cpp @@ -571,6 +571,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, XSECTOR& w, XSECTO ("panangle", w.panAngle, def->panAngle) ("marker0", w.marker0, def->marker0) ("marker1", w.marker1, def->marker1) + ("basepath", w.basePath, def->basePath) ("windang", w.windAng, def->windAng) ("bobtheta", w.bobTheta, def->bobTheta) ("bobspeed", w.bobSpeed, def->bobSpeed) diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 71d6a74a0..24c6bbe69 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -383,6 +383,7 @@ bool nnExtEraseModernStuff(DBloodActor* actor) bool erased = false; switch (pSprite->type) { // erase all modern types if the map is not extended + case kModernSpriteDamager: case kModernCustomDudeSpawn: case kModernRandomTX: case kModernSequentialTX: @@ -393,7 +394,6 @@ bool nnExtEraseModernStuff(DBloodActor* actor) case kModernDudeTargetChanger: case kModernSectorFXChanger: case kModernObjDataChanger: - case kModernSpriteDamager: case kModernObjDataAccumulator: case kModernEffectSpawner: case kModernWindGenerator: @@ -493,23 +493,19 @@ void nnExtResetGlobals() memset(gImpactSpritesList, 0, sizeof(gImpactSpritesList)); // reset tracking conditions, if any - if (gTrackingCondsCount > 0) + for (int i = 0; i < countof(gCondition); i++) { - for (int i = 0; i < gTrackingCondsCount; i++) - { - TRCONDITION* pCond = &gCondition[i]; + TRCONDITION* pCond = &gCondition[i]; for (unsigned k = 0; k < kMaxTracedObjects; k++) - { - pCond->obj[k].actor = nullptr; - pCond->obj[k].index_ = pCond->obj[k].cmd = 0; - pCond->obj[k].type = -1; - } - - pCond->length = 0; + { + pCond->obj[k].actor = nullptr; + pCond->obj[k].index_ = pCond->obj[k].cmd = 0; + pCond->obj[k].type = -1; } - - gTrackingCondsCount = 0; + pCond->actor = nullptr; + pCond->length = 0; } + gTrackingCondsCount = 0; // clear sprite mass cache for (int i = 0; i < kMaxSprites; i++) diff --git a/source/games/blood/src/triggers.cpp b/source/games/blood/src/triggers.cpp index 4a6aa5bba..adc94f137 100644 --- a/source/games/blood/src/triggers.cpp +++ b/source/games/blood/src/triggers.cpp @@ -33,9 +33,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_BLD_NS -int basePath[kMaxSectors]; - - unsigned int GetWaveValue(unsigned int nPhase, int nType) { switch (nType) @@ -1352,13 +1349,13 @@ int PathBusy(unsigned int nSector, unsigned int a2) int nXSector = pSector->extra; assert(nXSector > 0 && nXSector < kMaxXSectors); XSECTOR *pXSector = &xsector[nXSector]; - spritetype *pSprite = &sprite[basePath[nSector]]; - if (!pXSector->marker0 || !pXSector->marker1) return 0; + if (!pXSector->basePath || !pXSector->marker0 || !pXSector->marker1) return 0; + spritetype* pSprite = &pXSector->basePath->s(); spritetype* pSprite1 = &pXSector->marker0->s(); spritetype* pSprite2 = &pXSector->marker1->s(); - XSPRITE *pXSprite1 = &xsprite[pSprite1->extra]; - XSPRITE *pXSprite2 = &xsprite[pSprite2->extra]; + XSPRITE *pXSprite1 = &pXSector->marker0->x(); + XSPRITE *pXSprite2 = &pXSector->marker1->x(); int nWave = pXSprite1->wave; TranslateSector(nSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite->x, pSprite->y, pSprite1->x, pSprite1->y, pSprite1->ang, pSprite2->x, pSprite2->y, pSprite2->ang, 1); @@ -1656,8 +1653,7 @@ void InitPath(unsigned int nSector, XSECTOR *pXSector) } - pXSector->marker0 = &bloodActors[nSprite]; - basePath[nSector] = nSprite; + pXSector->basePath = pXSector->marker0 = &bloodActors[nSprite]; if (pXSector->state) evPostSector(nSector, 0, kCmdOn); } @@ -2122,6 +2118,7 @@ void trInit(void) #ifdef NOONE_EXTENSIONS case kModernRandom: case kModernRandom2: + if (!gModernMap || pXSprite->state == pXSprite->restState) break; evPostActor(&bloodActors[i], (120 * pXSprite->busyTime) / 10, kCmdRepeat); if (pXSprite->waitTime > 0) @@ -2305,9 +2302,22 @@ void SerializeTriggers(FSerializer& arc) { if (arc.BeginObject("triggers")) { +#ifdef OLD_SAVEGAME + if (arc.BeginArray("basepath")) + { + int nul = 0; + for (int i = 0; i < numsectors; i++) + { + if (sector[i].extra > 0) + arc(nullptr, xsector[sector[i].extra].basePath); + else + arc(nullptr, nul); + } + arc.EndArray(); + } +#endif arc("busycount", gBusyCount) .Array("busy", gBusy, gBusyCount) - .Array("basepath", basePath, numsectors) .EndObject(); } }