- Regenerates.

MP only so not really relevant - the code looked broken anyway.
This commit is contained in:
Christoph Oelckers 2021-10-21 10:20:08 +02:00
parent 2f511b3cff
commit 1591d6fbdb
4 changed files with 29 additions and 69 deletions

View file

@ -162,13 +162,9 @@ void FillItems(short nPlayer);
void UseItem(short nPlayer, short nItem); void UseItem(short nPlayer, short nItem);
void UseCurItem(short nPlayer); void UseCurItem(short nPlayer);
int GrabItem(short nPlayer, short nItem); int GrabItem(short nPlayer, short nItem);
void DropMagic(short nSprite); void DropMagic(DExhumedActor* actor);
inline void DropMagic(DExhumedActor* actor)
{
DropMagic(actor->GetSpriteIndex());
}
void InitItems(); void InitItems();
void StartRegenerate(short nSprite); void StartRegenerate(DExhumedActor* nSprite);
void DoRegenerates(); void DoRegenerates();
// lavadude // lavadude

View file

@ -105,16 +105,14 @@ short x/y repeat
*/ */
short nRegenerates; TArray<DExhumedActor*> Regenerates;
short nFirstRegenerate;
short nMagicCount; short nMagicCount;
void SerializeItems(FSerializer& arc) void SerializeItems(FSerializer& arc)
{ {
if (arc.BeginObject("items")) if (arc.BeginObject("items"))
{ {
arc("regenerates", nRegenerates) arc("regenerates", Regenerates)
("first", nFirstRegenerate)
("magiccount", nMagicCount) ("magiccount", nMagicCount)
.EndObject(); .EndObject();
} }
@ -330,9 +328,9 @@ int GrabItem(short nPlayer, short nItem)
return 1; return 1;
} }
void DropMagic(short nSprite) void DropMagic(DExhumedActor* pActor)
{ {
auto pSprite = &sprite[nSprite]; auto pSprite = &pActor->s();
if (lFinaleStart) { if (lFinaleStart) {
return; return;
@ -364,59 +362,30 @@ void DropMagic(short nSprite)
void InitItems() void InitItems()
{ {
nRegenerates = 0; Regenerates.Clear();
nFirstRegenerate = -1;
nMagicCount = 0; nMagicCount = 0;
} }
void StartRegenerate(short nSprite) void StartRegenerate(DExhumedActor* pActor)
{ {
spritetype *pSprite = &sprite[nSprite]; spritetype *pSprite = &pActor->s();
int edi = -1; DExhumedActor* pCurr = nullptr;
int nReg = nFirstRegenerate; auto pos = Regenerates.Find(pActor);
if (pos >= Regenerates.Size())
int i = 0;
// for (int i = 0; i < nRegenerates; i++)
while (1)
{
if (i >= nRegenerates)
{ {
// ?? CHECKME // ?? CHECKME
pSprite->xvel = pSprite->xrepeat; pSprite->xvel = pSprite->xrepeat;
pSprite->zvel = pSprite->shade; pSprite->zvel = pSprite->shade;
pSprite->yvel = pSprite->pal; pSprite->yvel = pSprite->pal;
break;
} }
else else
{ {
if (nReg != nSprite) Regenerates.Delete(pos);
{
edi = nReg;
nReg = sprite[nReg].ang;
i++;
continue;
}
else
{
if (edi == -1)
{
nFirstRegenerate = pSprite->ang;
}
else
{
sprite[edi].ang = pSprite->ang;
}
nRegenerates--;
}
}
} }
pSprite->extra = 1350; pSprite->extra = 1350;
pSprite->ang = nFirstRegenerate;
if (!(currentLevel->gameflags & LEVEL_EX_MULTI)) if (!(currentLevel->gameflags & LEVEL_EX_MULTI))
{ {
@ -428,17 +397,15 @@ void StartRegenerate(short nSprite)
pSprite->yrepeat = 1; pSprite->yrepeat = 1;
pSprite->pal = 1; pSprite->pal = 1;
nRegenerates++; Regenerates.Push(pActor);
nFirstRegenerate = nSprite;
} }
void DoRegenerates() void DoRegenerates()
{ {
int nSprite = nFirstRegenerate; for(unsigned i = 0; i < Regenerates.Size(); i++)
auto pSprite = &sprite[nSprite];
for (int i = nRegenerates; i > 0; i--, nSprite = pSprite->ang)
{ {
auto pActor = Regenerates[i];
auto pSprite = &pActor->s();
if (pSprite->extra > 0) if (pSprite->extra > 0)
{ {
pSprite->extra--; pSprite->extra--;
@ -446,7 +413,7 @@ void DoRegenerates()
if (pSprite->extra <= 0) if (pSprite->extra <= 0)
{ {
BuildAnim(nullptr, 38, 0, pSprite->x, pSprite->y, pSprite->z, pSprite->sectnum, 64, 4); BuildAnim(nullptr, 38, 0, pSprite->x, pSprite->y, pSprite->z, pSprite->sectnum, 64, 4);
D3PlayFX(StaticSound[kSoundTorchOn], nSprite); D3PlayFX(StaticSound[kSoundTorchOn], pActor);
} }
else { else {
continue; continue;
@ -468,7 +435,6 @@ void DoRegenerates()
pSprite->pal = (uint8_t)pSprite->yvel; pSprite->pal = (uint8_t)pSprite->yvel;
pSprite->yvel = pSprite->zvel; // setting to 0 pSprite->yvel = pSprite->zvel; // setting to 0
pSprite->xvel = pSprite->zvel; // setting to 0 pSprite->xvel = pSprite->zvel; // setting to 0
nRegenerates--;
if (pSprite->statnum == kStatExplodeTrigger) { if (pSprite->statnum == kStatExplodeTrigger) {
pSprite->cstat = 0x101; pSprite->cstat = 0x101;
@ -476,10 +442,8 @@ void DoRegenerates()
else { else {
pSprite->cstat = 0; pSprite->cstat = 0;
} }
Regenerates.Delete(i);
if (nRegenerates == 0) { i--;
nFirstRegenerate = -1;
}
} }
} }
END_PS_NS END_PS_NS

View file

@ -2143,7 +2143,7 @@ void AIObject::Tick(RunListEvent* ev)
} }
else else
{ {
StartRegenerate(nSprite); StartRegenerate(pActor);
pObject->nHealth = 120; pObject->nHealth = 120;
pSprite->x = sprite[pObject->field_10].x; pSprite->x = sprite[pObject->field_10].x;

View file

@ -1404,7 +1404,7 @@ sectdone:
} }
else else
{ {
StartRegenerate(nValB); StartRegenerate(pActorB);
} }
do_default_b: do_default_b:
// loc_1BA74 // loc_1BA74