- Object, part 1.

This commit is contained in:
Christoph Oelckers 2021-10-21 15:33:41 +02:00
parent d3e55739c7
commit b59cb67f05

View file

@ -104,13 +104,12 @@ struct MoveSect
struct Object struct Object
{ {
short field_0; short nFrame;
short nHealth; short nHealth;
short field_4; short nRun;
short nSprite; short nSprite;
short field_8; short nIndex;
short field_10; short nTarget;
short field_12;
}; };
struct wallFace struct wallFace
@ -282,14 +281,13 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Object& w, Object*
{ {
if (arc.BeginObject(keyname)) if (arc.BeginObject(keyname))
{ {
arc("at0", w.field_0) arc("at0", w.nFrame)
("health", w.nHealth) ("health", w.nHealth)
("at4", w.field_4) ("at4", w.nRun)
("at8", w.field_8) ("at8", w.nIndex)
("sprite", w.nSprite) ("sprite", w.nSprite)
("at8", w.field_8) ("at8", w.nIndex)
("at10", w.field_10) ("at10", w.nTarget)
("at12", w.field_12)
.EndObject(); .EndObject();
} }
return arc; return arc;
@ -1950,14 +1948,14 @@ void FuncEnergyBlock(int nObject, int nMessage, int nDamage, int nRun)
runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun); runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun);
} }
int BuildObject(int const nSprite, int nOjectType, int nHitag) int BuildObject(DExhumedActor* pActor, int nOjectType, int nHitag)
{ {
auto spr = &sprite[nSprite]; auto spr = &pActor->s();
auto nObject = ObjectList.Reserve(1); auto nObject = ObjectList.Reserve(1);
ObjectList[nObject] = {}; ObjectList[nObject] = {};
changespritestat(nSprite, ObjectStatnum[nOjectType]); ChangeActorStat(pActor, ObjectStatnum[nOjectType]);
// 0x7FFD to ensure set as blocking ('B' and 'H') sprite and also disable translucency and set not invisible // 0x7FFD to ensure set as blocking ('B' and 'H') sprite and also disable translucency and set not invisible
spr->cstat = (spr->cstat | 0x101) & 0x7FFD; spr->cstat = (spr->cstat | 0x101) & 0x7FFD;
@ -1970,31 +1968,31 @@ int BuildObject(int const nSprite, int nOjectType, int nHitag)
spr->owner = runlist_AddRunRec(spr->lotag - 1, nObject, 0x170000); spr->owner = runlist_AddRunRec(spr->lotag - 1, nObject, 0x170000);
// GrabTimeSlot(3); // GrabTimeSlot(3);
auto pObject = &ObjectList[nObject];
if (spr->statnum == kStatDestructibleSprite) { if (spr->statnum == kStatDestructibleSprite) {
ObjectList[nObject].nHealth = 4; pObject->nHealth = 4;
} }
else { else {
ObjectList[nObject].nHealth = 120; pObject->nHealth = 120;
} }
ObjectList[nObject].nSprite = nSprite; pObject->nSprite = pActor->GetSpriteIndex();
ObjectList[nObject].field_4 = runlist_AddRunRec(NewRun, nObject, 0x170000); pObject->nRun = runlist_AddRunRec(NewRun, nObject, 0x170000);
short nSeq = ObjectSeq[nOjectType]; short nSeq = ObjectSeq[nOjectType];
if (nSeq > -1) if (nSeq > -1)
{ {
ObjectList[nObject].field_8 = SeqOffsets[nSeq]; pObject->nIndex = SeqOffsets[nSeq];
if (!nOjectType) // if not Explosion Trigger (e.g. Exploding Fire Cauldron) if (!nOjectType) // if not Explosion Trigger (e.g. Exploding Fire Cauldron)
{ {
ObjectList[nObject].field_0 = RandomSize(4) % (SeqSize[ObjectList[nObject].field_8] - 1); pObject->nFrame = RandomSize(4) % (SeqSize[pObject->nIndex] - 1);
} }
int nSprite2 = insertsprite(spr->sectnum, 0); int nSprite2 = insertsprite(spr->sectnum, 0);
auto pSprite2 = &sprite[nSprite2]; auto pSprite2 = &sprite[nSprite2];
ObjectList[nObject].field_10 = nSprite2; pObject->nTarget = nSprite2;
pSprite2->cstat = 0x8000; pSprite2->cstat = 0x8000;
pSprite2->x = spr->x; pSprite2->x = spr->x;
@ -2003,14 +2001,14 @@ int BuildObject(int const nSprite, int nOjectType, int nHitag)
} }
else else
{ {
ObjectList[nObject].field_0 = 0; pObject->nFrame = 0;
ObjectList[nObject].field_8 = -1; pObject->nIndex = -1;
if (spr->statnum == kStatDestructibleSprite) { if (spr->statnum == kStatDestructibleSprite) {
ObjectList[nObject].field_10 = -1; pObject->nTarget = -1;
} }
else { else {
ObjectList[nObject].field_10 = -nHitag; pObject->nTarget = -nHitag;
} }
} }
spr->backuppos(); spr->backuppos();
@ -2041,7 +2039,7 @@ void AIObject::Tick(RunListEvent* ev)
short nSprite = pObject->nSprite; short nSprite = pObject->nSprite;
auto pSprite = &sprite[nSprite]; auto pSprite = &sprite[nSprite];
short nStat = pSprite->statnum; short nStat = pSprite->statnum;
short bx = pObject->field_8; short bx = pObject->nIndex;
if (nStat == 97 || (!(pSprite->cstat & 0x101))) { if (nStat == 97 || (!(pSprite->cstat & 0x101))) {
return; return;
@ -2054,12 +2052,12 @@ void AIObject::Tick(RunListEvent* ev)
// do animation // do animation
if (bx != -1) if (bx != -1)
{ {
pObject->field_0++; pObject->nFrame++;
if (pObject->field_0 >= SeqSize[bx]) { if (pObject->nFrame >= SeqSize[bx]) {
pObject->field_0 = 0; pObject->nFrame = 0;
} }
pSprite->picnum = seq_GetSeqPicnum2(bx, pObject->field_0); pSprite->picnum = seq_GetSeqPicnum2(bx, pObject->nFrame);
} }
if (pObject->nHealth >= 0) { if (pObject->nHealth >= 0) {
@ -2131,7 +2129,7 @@ void AIObject::Tick(RunListEvent* ev)
if (!(currentLevel->gameflags & LEVEL_EX_MULTI) || nStat != kStatExplodeTrigger) if (!(currentLevel->gameflags & LEVEL_EX_MULTI) || nStat != kStatExplodeTrigger)
{ {
runlist_SubRunRec(pSprite->owner); runlist_SubRunRec(pSprite->owner);
runlist_SubRunRec(pObject->field_4); runlist_SubRunRec(pObject->nRun);
mydeletesprite(nSprite); mydeletesprite(nSprite);
return; return;
@ -2141,11 +2139,11 @@ void AIObject::Tick(RunListEvent* ev)
StartRegenerate(pActor); StartRegenerate(pActor);
pObject->nHealth = 120; pObject->nHealth = 120;
pSprite->x = sprite[pObject->field_10].x; pSprite->x = sprite[pObject->nTarget].x;
pSprite->y = sprite[pObject->field_10].y; pSprite->y = sprite[pObject->nTarget].y;
pSprite->z = sprite[pObject->field_10].z; pSprite->z = sprite[pObject->nTarget].z;
mychangespritesect(nSprite, sprite[pObject->field_10].sectnum); mychangespritesect(nSprite, sprite[pObject->nTarget].sectnum);
return; return;
} }
} }
@ -2159,7 +2157,7 @@ void AIObject::Damage(RunListEvent* ev)
short nSprite = pObject->nSprite; short nSprite = pObject->nSprite;
auto pSprite = &sprite[nSprite]; auto pSprite = &sprite[nSprite];
short nStat = pSprite->statnum; short nStat = pSprite->statnum;
short bx = pObject->field_8; short bx = pObject->nIndex;
if (nStat >= 150 || pObject->nHealth <= 0) { if (nStat >= 150 || pObject->nHealth <= 0) {
return; return;
@ -2190,11 +2188,11 @@ void AIObject::Draw(RunListEvent* ev)
{ {
short nObject = RunData[ev->nRun].nObjIndex; short nObject = RunData[ev->nRun].nObjIndex;
auto pObject = &ObjectList[nObject]; auto pObject = &ObjectList[nObject];
short bx = pObject->field_8; short bx = pObject->nIndex;
if (bx > -1) if (bx > -1)
{ {
seq_PlotSequence(ev->nParam, bx, pObject->field_0, 1); seq_PlotSequence(ev->nParam, bx, pObject->nFrame, 1);
} }
return; return;
} }
@ -2243,7 +2241,7 @@ void AIObject::RadialDamage(RunListEvent* ev)
if (pSprite->statnum == kStatExplodeTarget) if (pSprite->statnum == kStatExplodeTarget)
{ {
pObject->nHealth = -1; pObject->nHealth = -1;
short ax = pObject->field_10; short ax = pObject->nTarget;
if (ax < 0 || ObjectList[ax].nHealth <= 0) { if (ax < 0 || ObjectList[ax].nHealth <= 0) {
return; return;
@ -2771,20 +2769,20 @@ void PostProcess()
if (sprite[nObjectSprite].statnum == kStatExplodeTarget) if (sprite[nObjectSprite].statnum == kStatExplodeTarget)
{ {
if (!ObjectList[i].field_10) { if (!ObjectList[i].nTarget) {
ObjectList[i].field_10 = -1; ObjectList[i].nTarget = -1;
} }
else else
{ {
int edi = ObjectList[i].field_10; int edi = ObjectList[i].nTarget;
ObjectList[i].field_10 = -1; ObjectList[i].nTarget = -1;
for (unsigned j = 0; j < ObjectList.Size(); j++) for (unsigned j = 0; j < ObjectList.Size(); j++)
{ {
if (i != j && sprite[ObjectList[j].nSprite].statnum == kStatExplodeTarget && edi == ObjectList[j].field_10) if (i != j && sprite[ObjectList[j].nSprite].statnum == kStatExplodeTarget && edi == ObjectList[j].nTarget)
{ {
ObjectList[i].field_10 = j; ObjectList[i].nTarget = j;
ObjectList[j].field_10 = i; ObjectList[j].nTarget = i;
} }
} }
} }