- BuildSpark

This commit is contained in:
Christoph Oelckers 2021-10-21 13:15:47 +02:00
parent 56d0f41a36
commit b480bb3634

View file

@ -1475,17 +1475,12 @@ int BuildFireBall(DExhumedActor* nSprite, int a, int b)
return BuildTrap(nSprite, 1, a, b); return BuildTrap(nSprite, 1, a, b);
} }
int BuildSpark(int nSprite, int nVal) DExhumedActor* BuildSpark(DExhumedActor* pActor, int nVal)
{ {
auto pSprite = &sprite[nSprite]; auto pSprite = &pActor->s();
int var_14 = insertsprite(pSprite->sectnum, 0); auto pSpark = insertActor(pSprite->sectnum, 0);
if (var_14 < 0) { auto spr = &pSpark->s();
return -1;
}
auto spr = &sprite[var_14];
assert(var_14 < kMaxSprites);
spr->x = pSprite->x; spr->x = pSprite->x;
spr->y = pSprite->y; spr->y = pSprite->y;
@ -1541,18 +1536,17 @@ int BuildSpark(int nSprite, int nVal)
// GrabTimeSlot(3); // GrabTimeSlot(3);
spr->extra = -1; spr->extra = -1;
spr->owner = runlist_AddRunRec(spr->lotag - 1, var_14, 0x260000); spr->owner = runlist_AddRunRec(spr->lotag - 1, pSpark, 0x260000);
spr->hitag = runlist_AddRunRec(NewRun, var_14, 0x260000); spr->hitag = runlist_AddRunRec(NewRun, pSpark, 0x260000);
return var_14; return pSpark;
} }
void AISpark::Tick(RunListEvent* ev) void AISpark::Tick(RunListEvent* ev)
{ {
int nSprite = RunData[ev->nRun].nObjIndex; auto pActor = ev->pObjActor;
auto pSprite = &sprite[nSprite]; if (!pActor) return;
auto pSprite = &pActor->s();
assert(nSprite >= 0 && nSprite < kMaxSprites);
pSprite->shade += 3; pSprite->shade += 3;
pSprite->xrepeat -= 2; pSprite->xrepeat -= 2;
@ -1564,7 +1558,7 @@ void AISpark::Tick(RunListEvent* ev)
// calling BuildSpark() with 2nd parameter as '1' will set kTile986 // calling BuildSpark() with 2nd parameter as '1' will set kTile986
if (pSprite->picnum == kTile986 && (pSprite->xrepeat & 2)) if (pSprite->picnum == kTile986 && (pSprite->xrepeat & 2))
{ {
BuildSpark(nSprite, 2); BuildSpark(pActor, 2);
} }
if (pSprite->picnum >= kTile3000) { if (pSprite->picnum >= kTile3000) {
@ -1573,8 +1567,8 @@ void AISpark::Tick(RunListEvent* ev)
pSprite->zvel += 128; pSprite->zvel += 128;
int nMov = movesprite(nSprite, pSprite->xvel << 12, pSprite->yvel << 12, pSprite->zvel, 2560, -2560, CLIPMASK1); auto nMov = movesprite(pActor, pSprite->xvel << 12, pSprite->yvel << 12, pSprite->zvel, 2560, -2560, CLIPMASK1);
if (!nMov) { if (!nMov.type && !nMov.exbits) {
return; return;
} }
@ -1594,7 +1588,7 @@ void AISpark::Tick(RunListEvent* ev)
runlist_DoSubRunRec(pSprite->owner); runlist_DoSubRunRec(pSprite->owner);
runlist_FreeRun(pSprite->lotag - 1); runlist_FreeRun(pSprite->lotag - 1);
runlist_SubRunRec(pSprite->hitag); runlist_SubRunRec(pSprite->hitag);
mydeletesprite(nSprite); DeleteActor(pActor);
} }
@ -1647,7 +1641,7 @@ void DoFinale()
{ {
int nAng = RandomSize(11); int nAng = RandomSize(11);
sprite[nFinaleSpr].ang = nAng; sprite[nFinaleSpr].ang = nAng;
BuildSpark(nFinaleSpr, 1); BuildSpark(&exhumedActors[nFinaleSpr], 1);
} }
if (!RandomSize(2)) if (!RandomSize(2))
@ -1786,6 +1780,7 @@ void KillCreatures()
void ExplodeEnergyBlock(int nSprite) void ExplodeEnergyBlock(int nSprite)
{ {
auto pActor = &exhumedActors[nSprite];
auto pSprite = &sprite[nSprite]; auto pSprite = &sprite[nSprite];
short nSector = pSprite->sectnum; short nSector = pSprite->sectnum;
@ -1822,7 +1817,7 @@ void ExplodeEnergyBlock(int nSprite)
pSprite->z = (pSprite->z + sector[nSector].floorz) / 2; pSprite->z = (pSprite->z + sector[nSector].floorz) / 2;
BuildSpark(nSprite, 3); BuildSpark(pActor, 3);
pSprite->cstat = 0; pSprite->cstat = 0;
pSprite->xrepeat = 100; pSprite->xrepeat = 100;
@ -1836,7 +1831,7 @@ void ExplodeEnergyBlock(int nSprite)
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
{ {
pSprite->ang = RandomSize(11); pSprite->ang = RandomSize(11);
BuildSpark(nSprite, 1); // shoot out blue orbs BuildSpark(pActor, 1); // shoot out blue orbs
} }
TintPalette(64, 64, 64); TintPalette(64, 64, 64);
@ -1900,16 +1895,16 @@ void AIEnergyBlock::Damage(RunListEvent* ev)
{ {
spr->xrepeat -= ev->nDamage; spr->xrepeat -= ev->nDamage;
int nSprite2 = insertsprite(lasthitsect, 0); auto pActor2 = insertActor(lasthitsect, 0);
auto pSprite2 = &sprite[nSprite2]; auto pSprite2 = &pActor2->s();
pSprite2->ang = ev->nParam; pSprite2->ang = ev->nParam;
pSprite2->x = lasthitx; pSprite2->x = lasthitx;
pSprite2->y = lasthity; pSprite2->y = lasthity;
pSprite2->z = lasthitz; pSprite2->z = lasthitz;
BuildSpark(nSprite2, 0); // shoot out blue orb when damaged BuildSpark(pActor2, 0); // shoot out blue orb when damaged
mydeletesprite(nSprite2); DeleteActor(pActor2);
} }
else else
{ {
@ -2031,7 +2026,7 @@ void ExplodeScreen(short nSprite)
pSprite->z -= GetSpriteHeight(nSprite) / 2; pSprite->z -= GetSpriteHeight(nSprite) / 2;
for (int i = 0; i < 30; i++) { for (int i = 0; i < 30; i++) {
BuildSpark(nSprite, 0); // shoot out blue orbs BuildSpark(&exhumedActors[nSprite], 0); // shoot out blue orbs
} }
pSprite->cstat = 0x8000; pSprite->cstat = 0x8000;