mirror of
https://github.com/DrBeef/Raze.git
synced 2025-02-22 19:51:16 +00:00
- Object, part 1.
This commit is contained in:
parent
d3e55739c7
commit
b59cb67f05
1 changed files with 45 additions and 47 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue