mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-21 19:11:06 +00:00
- Exhumed: pActor->s() in queen.cpp
This commit is contained in:
parent
b641da3959
commit
d162c36113
1 changed files with 121 additions and 138 deletions
|
@ -246,11 +246,10 @@ void DestroyEgg(int nEgg)
|
||||||
{
|
{
|
||||||
DExhumedActor* pActor = QueenEgg[nEgg].pActor;
|
DExhumedActor* pActor = QueenEgg[nEgg].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
|
|
||||||
if (QueenEgg[nEgg].nAction != 4)
|
if (QueenEgg[nEgg].nAction != 4)
|
||||||
{
|
{
|
||||||
BuildAnim(nullptr, 34, 0, pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z, pSprite->sector(), pSprite->xrepeat, 4);
|
BuildAnim(nullptr, 34, 0, pActor->spr.pos.X, pActor->spr.pos.Y, pActor->spr.pos.Z, pActor->spr.sector(), pActor->spr.xrepeat, 4);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -260,8 +259,8 @@ void DestroyEgg(int nEgg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
runlist_DoSubRunRec(pSprite->owner);
|
runlist_DoSubRunRec(pActor->spr.owner);
|
||||||
runlist_DoSubRunRec(pSprite->lotag - 1);
|
runlist_DoSubRunRec(pActor->spr.lotag - 1);
|
||||||
runlist_SubRunRec(QueenEgg[nEgg].nRun);
|
runlist_SubRunRec(QueenEgg[nEgg].nRun);
|
||||||
|
|
||||||
QueenEgg[nEgg].nRun = -1;
|
QueenEgg[nEgg].nRun = -1;
|
||||||
|
@ -283,34 +282,32 @@ void DestroyAllEggs()
|
||||||
|
|
||||||
void SetHeadVel(DExhumedActor* pActor)
|
void SetHeadVel(DExhumedActor* pActor)
|
||||||
{
|
{
|
||||||
auto pSprite = &pActor->s();
|
int nAngle = pActor->spr.ang;
|
||||||
int nAngle = pSprite->ang;
|
|
||||||
|
|
||||||
pSprite->xvel = bcos(nAngle, nVelShift);
|
pActor->spr.xvel = bcos(nAngle, nVelShift);
|
||||||
pSprite->yvel = bsin(nAngle, nVelShift);
|
pActor->spr.yvel = bsin(nAngle, nVelShift);
|
||||||
}
|
}
|
||||||
|
|
||||||
Collision QueenAngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int val1, int val2)
|
Collision QueenAngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int val1, int val2)
|
||||||
{
|
{
|
||||||
int nAngle;
|
int nAngle;
|
||||||
|
|
||||||
spritetype* pSprite = &pActor->s();
|
|
||||||
if (pActor2 == nullptr)
|
if (pActor2 == nullptr)
|
||||||
{
|
{
|
||||||
pSprite->zvel = 0;
|
pActor->spr.zvel = 0;
|
||||||
nAngle = pSprite->ang;
|
nAngle = pActor->spr.ang;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
spritetype* pSprite2 = &pActor2->s();
|
spritetype* pSprite2 = &pActor2->s();
|
||||||
int nTileY = (tileHeight(pSprite2->picnum) * pSprite2->yrepeat) * 2;
|
int nTileY = (tileHeight(pSprite2->picnum) * pSprite2->yrepeat) * 2;
|
||||||
|
|
||||||
int nMyAngle = GetMyAngle(pSprite2->pos.X - pSprite->pos.X, pSprite2->pos.Y - pSprite->pos.Y);
|
int nMyAngle = GetMyAngle(pSprite2->pos.X - pActor->spr.pos.X, pSprite2->pos.Y - pActor->spr.pos.Y);
|
||||||
|
|
||||||
int edx = ((pSprite2->pos.Z - nTileY) - pSprite->pos.Z) >> 8;
|
int edx = ((pSprite2->pos.Z - nTileY) - pActor->spr.pos.Z) >> 8;
|
||||||
|
|
||||||
uint32_t xDiff = abs(pSprite2->pos.X - pSprite->pos.X);
|
uint32_t xDiff = abs(pSprite2->pos.X - pActor->spr.pos.X);
|
||||||
uint32_t yDiff = abs(pSprite2->pos.Y - pSprite->pos.Y);
|
uint32_t yDiff = abs(pSprite2->pos.Y - pActor->spr.pos.Y);
|
||||||
|
|
||||||
uint32_t sqrtVal = xDiff * xDiff + yDiff * yDiff;
|
uint32_t sqrtVal = xDiff * xDiff + yDiff * yDiff;
|
||||||
|
|
||||||
|
@ -324,7 +321,7 @@ Collision QueenAngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int val
|
||||||
|
|
||||||
int var_14 = GetMyAngle(nSqrt, edx);
|
int var_14 = GetMyAngle(nSqrt, edx);
|
||||||
|
|
||||||
int nAngDelta = AngleDelta(pSprite->ang, nMyAngle, 1024);
|
int nAngDelta = AngleDelta(pActor->spr.ang, nMyAngle, 1024);
|
||||||
|
|
||||||
if (abs(nAngDelta) > 127)
|
if (abs(nAngDelta) > 127)
|
||||||
{
|
{
|
||||||
|
@ -341,14 +338,14 @@ Collision QueenAngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int val
|
||||||
nAngDelta = val2;
|
nAngDelta = val2;
|
||||||
}
|
}
|
||||||
|
|
||||||
nAngle = (nAngDelta + pSprite->ang) & kAngleMask;
|
nAngle = (nAngDelta + pActor->spr.ang) & kAngleMask;
|
||||||
|
|
||||||
pSprite->zvel = (AngleDelta(pSprite->zvel, var_14, 24) + pSprite->zvel) & kAngleMask;
|
pActor->spr.zvel = (AngleDelta(pActor->spr.zvel, var_14, 24) + pActor->spr.zvel) & kAngleMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSprite->ang = nAngle;
|
pActor->spr.ang = nAngle;
|
||||||
|
|
||||||
int da = pSprite->zvel;
|
int da = pActor->spr.zvel;
|
||||||
int x = abs(bcos(da));
|
int x = abs(bcos(da));
|
||||||
|
|
||||||
int v26 = x * ((val1 * bcos(nAngle)) >> 14);
|
int v26 = x * ((val1 * bcos(nAngle)) >> 14);
|
||||||
|
@ -449,13 +446,12 @@ void BuildQueenEgg(int nQueen, int nVal)
|
||||||
|
|
||||||
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
|
|
||||||
int x = pSprite->pos.X;
|
int x = pActor->spr.pos.X;
|
||||||
int y = pSprite->pos.Y;
|
int y = pActor->spr.pos.Y;
|
||||||
auto pSector =pSprite->sector();
|
auto pSector =pActor->spr.sector();
|
||||||
int nFloorZ = pSector->floorz;
|
int nFloorZ = pSector->floorz;
|
||||||
int nAngle = pSprite->ang;
|
int nAngle = pActor->spr.ang;
|
||||||
|
|
||||||
auto pActor2 = insertActor(pSector, 121);
|
auto pActor2 = insertActor(pSector, 121);
|
||||||
auto pSprite2 = &pActor2->s();
|
auto pSprite2 = &pActor2->s();
|
||||||
|
@ -520,7 +516,6 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
Egg* pEgg = &QueenEgg[nEgg];
|
Egg* pEgg = &QueenEgg[nEgg];
|
||||||
DExhumedActor* pActor = pEgg->pActor;
|
DExhumedActor* pActor = pEgg->pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
int nAction = pEgg->nAction;
|
int nAction = pEgg->nAction;
|
||||||
|
|
||||||
DExhumedActor* pTarget = nullptr;
|
DExhumedActor* pTarget = nullptr;
|
||||||
|
@ -539,7 +534,7 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
int nSeq = SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a;
|
int nSeq = SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a;
|
||||||
|
|
||||||
pSprite->picnum = seq_GetSeqPicnum2(nSeq, pEgg->nFrame);
|
pActor->spr.picnum = seq_GetSeqPicnum2(nSeq, pEgg->nFrame);
|
||||||
|
|
||||||
if (nAction != 4)
|
if (nAction != 4)
|
||||||
{
|
{
|
||||||
|
@ -603,9 +598,9 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSprite->ang = nAngle;
|
pActor->spr.ang = nAngle;
|
||||||
pSprite->xvel = bcos(nAngle, -1);
|
pActor->spr.xvel = bcos(nAngle, -1);
|
||||||
pSprite->yvel = bsin(nAngle, -1);
|
pActor->spr.yvel = bsin(nAngle, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -616,7 +611,7 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
if (bVal)
|
if (bVal)
|
||||||
{
|
{
|
||||||
pEgg->nAction = 3;
|
pEgg->nAction = 3;
|
||||||
pSprite->cstat = CSTAT_SPRITE_BLOCK_ALL;
|
pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -635,11 +630,11 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
}
|
}
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case kHitWall:
|
case kHitWall:
|
||||||
pSprite->ang += (RandomSize(9) + 768);
|
pActor->spr.ang += (RandomSize(9) + 768);
|
||||||
pSprite->ang &= kAngleMask;
|
pActor->spr.ang &= kAngleMask;
|
||||||
pSprite->xvel = bcos(pSprite->ang, -3);
|
pActor->spr.xvel = bcos(pActor->spr.ang, -3);
|
||||||
pSprite->yvel = bsin(pSprite->ang, -3);
|
pActor->spr.yvel = bsin(pActor->spr.ang, -3);
|
||||||
pSprite->zvel = -RandomSize(5);
|
pActor->spr.zvel = -RandomSize(5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -652,18 +647,18 @@ void AIQueenEgg::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
if (nMov.exbits & kHitAux2)
|
if (nMov.exbits & kHitAux2)
|
||||||
{
|
{
|
||||||
pSprite->zvel = -(pSprite->zvel - 256);
|
pActor->spr.zvel = -(pActor->spr.zvel - 256);
|
||||||
if (pSprite->zvel < -512)
|
if (pActor->spr.zvel < -512)
|
||||||
{
|
{
|
||||||
pSprite->zvel = 0;
|
pActor->spr.zvel = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pEgg->nCounter--;
|
pEgg->nCounter--;
|
||||||
if (pEgg->nCounter <= 0)
|
if (pEgg->nCounter <= 0)
|
||||||
{
|
{
|
||||||
auto pWaspSprite = BuildWasp(nullptr, pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z, pSprite->sector(), pSprite->ang, true);
|
auto pWaspSprite = BuildWasp(nullptr, pActor->spr.pos.X, pActor->spr.pos.Y, pActor->spr.pos.Z, pActor->spr.sector(), pActor->spr.ang, true);
|
||||||
pSprite->pos.Z = pWaspSprite->spr.pos.Z;
|
pActor->spr.pos.Z = pWaspSprite->spr.pos.Z;
|
||||||
|
|
||||||
DestroyEgg(nEgg);
|
DestroyEgg(nEgg);
|
||||||
}
|
}
|
||||||
|
@ -678,10 +673,9 @@ void AIQueenEgg::RadialDamage(RunListEvent* ev)
|
||||||
Egg* pEgg = &QueenEgg[nEgg];
|
Egg* pEgg = &QueenEgg[nEgg];
|
||||||
DExhumedActor* pActor = pEgg->pActor;
|
DExhumedActor* pActor = pEgg->pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
auto pRadial = &ev->pRadialActor->s();
|
auto pRadial = &ev->pRadialActor->s();
|
||||||
|
|
||||||
if (pRadial->statnum != 121 && (pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL) != 0)
|
if (pRadial->statnum != 121 && (pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL) != 0)
|
||||||
{
|
{
|
||||||
int nDamage = runlist_CheckRadialDamage(pActor);
|
int nDamage = runlist_CheckRadialDamage(pActor);
|
||||||
|
|
||||||
|
@ -714,12 +708,11 @@ void BuildQueenHead(int nQueen)
|
||||||
{
|
{
|
||||||
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
|
|
||||||
int x = pSprite->pos.X;
|
int x = pActor->spr.pos.X;
|
||||||
int y = pSprite->pos.Y;
|
int y = pActor->spr.pos.Y;
|
||||||
int nAngle = pSprite->ang;
|
int nAngle = pActor->spr.ang;
|
||||||
auto pSector = pSprite->sector();
|
auto pSector = pActor->spr.sector();
|
||||||
int z = pSector->floorz;
|
int z = pSector->floorz;
|
||||||
|
|
||||||
auto pActor2 = insertActor(pSector, 121);
|
auto pActor2 = insertActor(pSector, 121);
|
||||||
|
@ -767,8 +760,7 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
{
|
{
|
||||||
DExhumedActor* pActor = QueenHead.pActor;
|
DExhumedActor* pActor = QueenHead.pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
|
|
||||||
int nAction = QueenHead.nAction;
|
int nAction = QueenHead.nAction;
|
||||||
int nHd;
|
int nHd;
|
||||||
int var_14 = 0;
|
int var_14 = 0;
|
||||||
|
@ -781,7 +773,7 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
seq_MoveSequence(pActor, nSeq, QueenHead.nFrame);
|
seq_MoveSequence(pActor, nSeq, QueenHead.nFrame);
|
||||||
|
|
||||||
pSprite->picnum = seq_GetSeqPicnum2(nSeq, QueenHead.nFrame);
|
pActor->spr.picnum = seq_GetSeqPicnum2(nSeq, QueenHead.nFrame);
|
||||||
|
|
||||||
QueenHead.nFrame++;
|
QueenHead.nFrame++;
|
||||||
if (QueenHead.nFrame >= SeqSize[nSeq])
|
if (QueenHead.nFrame >= SeqSize[nSeq])
|
||||||
|
@ -818,11 +810,11 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
QueenHead.nAction = 6;
|
QueenHead.nAction = 6;
|
||||||
nHeadVel = 800;
|
nHeadVel = 800;
|
||||||
pSprite->cstat = CSTAT_SPRITE_BLOCK_ALL;
|
pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
|
||||||
}
|
}
|
||||||
else if (QueenHead.nIndex < 60)
|
else if (QueenHead.nIndex < 60)
|
||||||
{
|
{
|
||||||
pSprite->shade--;
|
pActor->spr.shade--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -830,7 +822,7 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
auto nMov = MoveCreature(pActor);
|
auto nMov = MoveCreature(pActor);
|
||||||
|
|
||||||
// original BUG - this line doesn't exist in original code?
|
// original BUG - this line doesn't exist in original code?
|
||||||
int nNewAng = pSprite->ang;
|
int nNewAng = pActor->spr.ang;
|
||||||
|
|
||||||
if (nMov.exbits == 0)
|
if (nMov.exbits == 0)
|
||||||
{
|
{
|
||||||
|
@ -839,17 +831,17 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
}
|
}
|
||||||
else if (nMov.exbits == kHitAux2)
|
else if (nMov.exbits == kHitAux2)
|
||||||
{
|
{
|
||||||
pSprite->zvel = -(pSprite->zvel >> 1);
|
pActor->spr.zvel = -(pActor->spr.zvel >> 1);
|
||||||
|
|
||||||
if (pSprite->zvel > -256)
|
if (pActor->spr.zvel > -256)
|
||||||
{
|
{
|
||||||
nVelShift = 100;
|
nVelShift = 100;
|
||||||
pSprite->zvel = 0;
|
pActor->spr.zvel = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// original BUG - var_18 isn't being set if the check above == 0x20000 ?
|
// original BUG - var_18 isn't being set if the check above == 0x20000 ?
|
||||||
pSprite->ang = nNewAng;
|
pActor->spr.ang = nNewAng;
|
||||||
nVelShift++;
|
nVelShift++;
|
||||||
|
|
||||||
if (nVelShift < 5)
|
if (nVelShift < 5)
|
||||||
|
@ -858,10 +850,10 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pSprite->xvel = 0;
|
pActor->spr.xvel = 0;
|
||||||
pSprite->yvel = 0;
|
pActor->spr.yvel = 0;
|
||||||
|
|
||||||
if (pSprite->zvel == 0)
|
if (pActor->spr.zvel == 0)
|
||||||
{
|
{
|
||||||
QueenHead.nIndex = 120;
|
QueenHead.nIndex = 120;
|
||||||
}
|
}
|
||||||
|
@ -880,14 +872,14 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
if ((pTarget->spr.pos.Z - 51200) > pSprite->pos.Z)
|
if ((pTarget->spr.pos.Z - 51200) > pActor->spr.pos.Z)
|
||||||
{
|
{
|
||||||
QueenHead.nAction = 4;
|
QueenHead.nAction = 4;
|
||||||
QueenHead.nFrame = 0;
|
QueenHead.nFrame = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pSprite->pos.Z -= 2048;
|
pActor->spr.pos.Z -= 2048;
|
||||||
goto __MOVEQS;
|
goto __MOVEQS;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -924,10 +916,10 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
runlist_DamageEnemy(pTarget, pActor, 10);
|
runlist_DamageEnemy(pTarget, pActor, 10);
|
||||||
D3PlayFX(StaticSound[kSoundQTail] | 0x2000, pActor);
|
D3PlayFX(StaticSound[kSoundQTail] | 0x2000, pActor);
|
||||||
|
|
||||||
pSprite->ang += RandomSize(9) + 768;
|
pActor->spr.ang += RandomSize(9) + 768;
|
||||||
pSprite->ang &= kAngleMask;
|
pActor->spr.ang &= kAngleMask;
|
||||||
|
|
||||||
pSprite->zvel = (-20) - RandomSize(6);
|
pActor->spr.zvel = (-20) - RandomSize(6);
|
||||||
|
|
||||||
SetHeadVel(pActor);
|
SetHeadVel(pActor);
|
||||||
}
|
}
|
||||||
|
@ -936,12 +928,12 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
// switch break. MoveQS stuff?
|
// switch break. MoveQS stuff?
|
||||||
__MOVEQS:
|
__MOVEQS:
|
||||||
MoveQX[nQHead] = pSprite->pos.X;
|
MoveQX[nQHead] = pActor->spr.pos.X;
|
||||||
MoveQY[nQHead] = pSprite->pos.Y;
|
MoveQY[nQHead] = pActor->spr.pos.Y;
|
||||||
MoveQZ[nQHead] = pSprite->pos.Z;
|
MoveQZ[nQHead] = pActor->spr.pos.Z;
|
||||||
assert(pSprite->sector());
|
assert(pActor->spr.sector());
|
||||||
MoveQS[nQHead] = pSprite->sector();
|
MoveQS[nQHead] = pActor->spr.sector();
|
||||||
MoveQA[nQHead] = pSprite->ang;
|
MoveQA[nQHead] = pActor->spr.ang;
|
||||||
|
|
||||||
nHd = nQHead;
|
nHd = nQHead;
|
||||||
|
|
||||||
|
@ -989,16 +981,16 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
{
|
{
|
||||||
if (QueenHead.nIndex2 >= 15 || QueenHead.nIndex2 < 10)
|
if (QueenHead.nIndex2 >= 15 || QueenHead.nIndex2 < 10)
|
||||||
{
|
{
|
||||||
int x = pSprite->pos.X;
|
int x = pActor->spr.pos.X;
|
||||||
int y = pSprite->pos.Y;
|
int y = pActor->spr.pos.Y;
|
||||||
int z = pSprite->pos.Z;
|
int z = pActor->spr.pos.Z;
|
||||||
auto pSector =pSprite->sector();
|
auto pSector =pActor->spr.sector();
|
||||||
int nAngle = RandomSize(11) & kAngleMask;
|
int nAngle = RandomSize(11) & kAngleMask;
|
||||||
|
|
||||||
pSprite->xrepeat = 127 - QueenHead.nIndex2;
|
pActor->spr.xrepeat = 127 - QueenHead.nIndex2;
|
||||||
pSprite->yrepeat = 127 - QueenHead.nIndex2;
|
pActor->spr.yrepeat = 127 - QueenHead.nIndex2;
|
||||||
|
|
||||||
pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
|
pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
|
||||||
|
|
||||||
// DEMO-TODO: in disassembly angle was used without masking and thus causing OOB issue.
|
// DEMO-TODO: in disassembly angle was used without masking and thus causing OOB issue.
|
||||||
// This behavior probably would be needed emulated for demo compatibility
|
// This behavior probably would be needed emulated for demo compatibility
|
||||||
|
@ -1013,9 +1005,9 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
ChangeActorSect(pActor, pSector);
|
ChangeActorSect(pActor, pSector);
|
||||||
|
|
||||||
pSprite->pos.X = x;
|
pActor->spr.pos.X = x;
|
||||||
pSprite->pos.Y = y;
|
pActor->spr.pos.Y = y;
|
||||||
pSprite->pos.Z = z;
|
pActor->spr.pos.Z = z;
|
||||||
|
|
||||||
if (QueenHead.nIndex2 < 10) {
|
if (QueenHead.nIndex2 < 10) {
|
||||||
for (int i = (10 - QueenHead.nIndex2) * 2; i > 0; i--)
|
for (int i = (10 - QueenHead.nIndex2) * 2; i > 0; i--)
|
||||||
|
@ -1041,7 +1033,7 @@ void AIQueenHead::Tick(RunListEvent* ev)
|
||||||
BuildLavaLimb(pActor, i, GetActorHeight(pActor));
|
BuildLavaLimb(pActor, i, GetActorHeight(pActor));
|
||||||
}
|
}
|
||||||
|
|
||||||
runlist_SubRunRec(pSprite->owner);
|
runlist_SubRunRec(pActor->spr.owner);
|
||||||
runlist_SubRunRec(QueenHead.nRun);
|
runlist_SubRunRec(QueenHead.nRun);
|
||||||
DeleteActor(pActor);
|
DeleteActor(pActor);
|
||||||
runlist_ChangeChannel(QueenHead.nChannel, 1);
|
runlist_ChangeChannel(QueenHead.nChannel, 1);
|
||||||
|
@ -1066,7 +1058,6 @@ void AIQueenHead::Damage(RunListEvent* ev)
|
||||||
{
|
{
|
||||||
DExhumedActor* pActor = QueenHead.pActor;
|
DExhumedActor* pActor = QueenHead.pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
|
|
||||||
if (QueenHead.nHealth > 0 && ev->nDamage != 0)
|
if (QueenHead.nHealth > 0 && ev->nDamage != 0)
|
||||||
{
|
{
|
||||||
|
@ -1092,7 +1083,7 @@ void AIQueenHead::Damage(RunListEvent* ev)
|
||||||
QueenHead.nFrame = 0;
|
QueenHead.nFrame = 0;
|
||||||
QueenHead.nIndex = 0;
|
QueenHead.nIndex = 0;
|
||||||
QueenHead.nIndex2 = 80;
|
QueenHead.nIndex2 = 80;
|
||||||
pSprite->cstat = 0;
|
pActor->spr.cstat = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1129,42 +1120,39 @@ void BuildQueen(DExhumedActor* pActor, int x, int y, int z, sectortype* pSector,
|
||||||
if (nQueen < 0) {
|
if (nQueen < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
spritetype* pSprite;
|
|
||||||
|
|
||||||
if (pActor == nullptr)
|
if (pActor == nullptr)
|
||||||
{
|
{
|
||||||
pActor = insertActor(pSector, 121);
|
pActor = insertActor(pSector, 121);
|
||||||
pSprite = &pActor->s();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ChangeActorStat(pActor, 121);
|
ChangeActorStat(pActor, 121);
|
||||||
pSprite = &pActor->s();
|
x = pActor->spr.pos.X;
|
||||||
x = pSprite->pos.X;
|
y = pActor->spr.pos.Y;
|
||||||
y = pSprite->pos.Y;
|
z = pActor->spr.sector()->floorz;
|
||||||
z = pSprite->sector()->floorz;
|
nAngle = pActor->spr.ang;
|
||||||
nAngle = pSprite->ang;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pSprite->pos.X = x;
|
pActor->spr.pos.X = x;
|
||||||
pSprite->pos.Y = y;
|
pActor->spr.pos.Y = y;
|
||||||
pSprite->pos.Z = z;
|
pActor->spr.pos.Z = z;
|
||||||
pSprite->cstat = CSTAT_SPRITE_BLOCK_ALL;
|
pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
|
||||||
pSprite->pal = 0;
|
pActor->spr.pal = 0;
|
||||||
pSprite->shade = -12;
|
pActor->spr.shade = -12;
|
||||||
pSprite->clipdist = 100;
|
pActor->spr.clipdist = 100;
|
||||||
pSprite->xrepeat = 80;
|
pActor->spr.xrepeat = 80;
|
||||||
pSprite->yrepeat = 80;
|
pActor->spr.yrepeat = 80;
|
||||||
pSprite->xoffset = 0;
|
pActor->spr.xoffset = 0;
|
||||||
pSprite->yoffset = 0;
|
pActor->spr.yoffset = 0;
|
||||||
pSprite->picnum = 1;
|
pActor->spr.picnum = 1;
|
||||||
pSprite->ang = nAngle;
|
pActor->spr.ang = nAngle;
|
||||||
pSprite->xvel = 0;
|
pActor->spr.xvel = 0;
|
||||||
pSprite->yvel = 0;
|
pActor->spr.yvel = 0;
|
||||||
pSprite->zvel = 0;
|
pActor->spr.zvel = 0;
|
||||||
pSprite->lotag = runlist_HeadRun() + 1;
|
pActor->spr.lotag = runlist_HeadRun() + 1;
|
||||||
pSprite->extra = -1;
|
pActor->spr.extra = -1;
|
||||||
pSprite->hitag = 0;
|
pActor->spr.hitag = 0;
|
||||||
|
|
||||||
GrabTimeSlot(3);
|
GrabTimeSlot(3);
|
||||||
|
|
||||||
|
@ -1180,7 +1168,7 @@ void BuildQueen(DExhumedActor* pActor, int x, int y, int z, sectortype* pSector,
|
||||||
|
|
||||||
nHeadVel = 800;
|
nHeadVel = 800;
|
||||||
|
|
||||||
pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, nQueen, 0x1A0000);
|
pActor->spr.owner = runlist_AddRunRec(pActor->spr.lotag - 1, nQueen, 0x1A0000);
|
||||||
|
|
||||||
runlist_AddRunRec(NewRun, nQueen, 0x1A0000);
|
runlist_AddRunRec(NewRun, nQueen, 0x1A0000);
|
||||||
|
|
||||||
|
@ -1189,10 +1177,8 @@ void BuildQueen(DExhumedActor* pActor, int x, int y, int z, sectortype* pSector,
|
||||||
|
|
||||||
void SetQueenSpeed(DExhumedActor* pActor, int nSpeed)
|
void SetQueenSpeed(DExhumedActor* pActor, int nSpeed)
|
||||||
{
|
{
|
||||||
auto pSprite = &pActor->s();
|
pActor->spr.xvel = bcos(pActor->spr.ang, -(2 - nSpeed));
|
||||||
|
pActor->spr.yvel = bsin(pActor->spr.ang, -(2 - nSpeed));
|
||||||
pSprite->xvel = bcos(pSprite->ang, -(2 - nSpeed));
|
|
||||||
pSprite->yvel = bsin(pSprite->ang, -(2 - nSpeed));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIQueen::Tick(RunListEvent* ev)
|
void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
@ -1202,7 +1188,6 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
int nAction = QueenList[nQueen].nAction;
|
int nAction = QueenList[nQueen].nAction;
|
||||||
int si = QueenList[nQueen].nAction2;
|
int si = QueenList[nQueen].nAction2;
|
||||||
DExhumedActor* pTarget = QueenList[nQueen].pTarget;
|
DExhumedActor* pTarget = QueenList[nQueen].pTarget;
|
||||||
|
@ -1215,7 +1200,7 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
int nSeq = SeqOffsets[kSeqQueen] + QueenSeq[nAction].a;
|
int nSeq = SeqOffsets[kSeqQueen] + QueenSeq[nAction].a;
|
||||||
|
|
||||||
pSprite->picnum = seq_GetSeqPicnum2(nSeq, QueenList[nQueen].nFrame);
|
pActor->spr.picnum = seq_GetSeqPicnum2(nSeq, QueenList[nQueen].nFrame);
|
||||||
|
|
||||||
seq_MoveSequence(pActor, nSeq, QueenList[nQueen].nFrame);
|
seq_MoveSequence(pActor, nSeq, QueenList[nQueen].nFrame);
|
||||||
|
|
||||||
|
@ -1232,7 +1217,7 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
{
|
{
|
||||||
if (nAction < 7)
|
if (nAction < 7)
|
||||||
{
|
{
|
||||||
if (!(pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL))
|
if (!(pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL))
|
||||||
{
|
{
|
||||||
pTarget = nullptr;
|
pTarget = nullptr;
|
||||||
QueenList[nQueen].pTarget = nullptr;
|
QueenList[nQueen].pTarget = nullptr;
|
||||||
|
@ -1286,8 +1271,8 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
if (QueenList[nQueen].nIndex <= 0)
|
if (QueenList[nQueen].nIndex <= 0)
|
||||||
{
|
{
|
||||||
QueenList[nQueen].nFrame = 0;
|
QueenList[nQueen].nFrame = 0;
|
||||||
pSprite->xvel = 0;
|
pActor->spr.xvel = 0;
|
||||||
pSprite->yvel = 0;
|
pActor->spr.yvel = 0;
|
||||||
QueenList[nQueen].nAction = si + 4;
|
QueenList[nQueen].nAction = si + 4;
|
||||||
QueenList[nQueen].nIndex = RandomSize(6) + 30;
|
QueenList[nQueen].nIndex = RandomSize(6) + 30;
|
||||||
break;
|
break;
|
||||||
|
@ -1337,8 +1322,8 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
}
|
}
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case 0x8000:
|
case 0x8000:
|
||||||
pSprite->ang += 256;
|
pActor->spr.ang += 256;
|
||||||
pSprite->ang &= kAngleMask;
|
pActor->spr.ang &= kAngleMask;
|
||||||
|
|
||||||
SetQueenSpeed(pActor, si);
|
SetQueenSpeed(pActor, si);
|
||||||
break;
|
break;
|
||||||
|
@ -1354,8 +1339,8 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
QueenList[nQueen].nIndex = 100;
|
QueenList[nQueen].nIndex = 100;
|
||||||
QueenList[nQueen].pTarget = nullptr;
|
QueenList[nQueen].pTarget = nullptr;
|
||||||
|
|
||||||
pSprite->xvel = 0;
|
pActor->spr.xvel = 0;
|
||||||
pSprite->yvel = 0;
|
pActor->spr.yvel = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1380,7 +1365,7 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
if (!si)
|
if (!si)
|
||||||
{
|
{
|
||||||
BuildBullet(pActor, 12, -1, pSprite->ang, pTarget, 1);
|
BuildBullet(pActor, 12, -1, pActor->spr.ang, pTarget, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1413,7 +1398,7 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
QueenList[nQueen].nIndex--;
|
QueenList[nQueen].nIndex--;
|
||||||
if (QueenList[nQueen].nIndex <= 0)
|
if (QueenList[nQueen].nIndex <= 0)
|
||||||
{
|
{
|
||||||
pSprite->cstat = 0;
|
pActor->spr.cstat = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 20; i++)
|
for (int i = 0; i < 20; i++)
|
||||||
{
|
{
|
||||||
|
@ -1432,9 +1417,9 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
PlayFXAtXYZ(
|
PlayFXAtXYZ(
|
||||||
StaticSound[kSound40],
|
StaticSound[kSound40],
|
||||||
pSprite->pos.X,
|
pActor->spr.pos.X,
|
||||||
pSprite->pos.Y,
|
pActor->spr.pos.Y,
|
||||||
pSprite->pos.Z);
|
pActor->spr.pos.Z);
|
||||||
|
|
||||||
BuildQueenHead(nQueen);
|
BuildQueenHead(nQueen);
|
||||||
|
|
||||||
|
@ -1450,7 +1435,7 @@ void AIQueen::Tick(RunListEvent* ev)
|
||||||
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
{
|
||||||
pSprite->cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
|
pActor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1462,10 +1447,9 @@ void AIQueen::RadialDamage(RunListEvent* ev)
|
||||||
assert(nQueen >= 0 && nQueen < kMaxQueens);
|
assert(nQueen >= 0 && nQueen < kMaxQueens);
|
||||||
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
auto pRadial = &ev->pRadialActor->s();
|
auto pRadial = &ev->pRadialActor->s();
|
||||||
|
|
||||||
if (pRadial->statnum != 121 && (pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL) != 0)
|
if (pRadial->statnum != 121 && (pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL) != 0)
|
||||||
{
|
{
|
||||||
ev->nDamage = runlist_CheckRadialDamage(pActor);
|
ev->nDamage = runlist_CheckRadialDamage(pActor);
|
||||||
if (ev->nDamage) Damage(ev);
|
if (ev->nDamage) Damage(ev);
|
||||||
|
@ -1479,7 +1463,6 @@ void AIQueen::Damage(RunListEvent* ev)
|
||||||
|
|
||||||
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
DExhumedActor* pActor = QueenList[nQueen].pActor;
|
||||||
if (!pActor) return;
|
if (!pActor) return;
|
||||||
auto pSprite = &pActor->s();
|
|
||||||
int si = QueenList[nQueen].nAction2;
|
int si = QueenList[nQueen].nAction2;
|
||||||
|
|
||||||
if (QueenList[nQueen].nHealth > 0)
|
if (QueenList[nQueen].nHealth > 0)
|
||||||
|
@ -1488,9 +1471,9 @@ void AIQueen::Damage(RunListEvent* ev)
|
||||||
|
|
||||||
if (QueenList[nQueen].nHealth <= 0)
|
if (QueenList[nQueen].nHealth <= 0)
|
||||||
{
|
{
|
||||||
pSprite->xvel = 0;
|
pActor->spr.xvel = 0;
|
||||||
pSprite->yvel = 0;
|
pActor->spr.yvel = 0;
|
||||||
pSprite->zvel = 0;
|
pActor->spr.zvel = 0;
|
||||||
|
|
||||||
QueenList[nQueen].nAction2++;
|
QueenList[nQueen].nAction2++;
|
||||||
|
|
||||||
|
@ -1500,7 +1483,7 @@ void AIQueen::Damage(RunListEvent* ev)
|
||||||
QueenList[nQueen].nHealth = 4000;
|
QueenList[nQueen].nHealth = 4000;
|
||||||
QueenList[nQueen].nAction = 7;
|
QueenList[nQueen].nAction = 7;
|
||||||
|
|
||||||
BuildAnim(nullptr, 36, 0, pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z - 7680, pSprite->sector(), pSprite->xrepeat, 4);
|
BuildAnim(nullptr, 36, 0, pActor->spr.pos.X, pActor->spr.pos.Y, pActor->spr.pos.Z - 7680, pActor->spr.sector(), pActor->spr.xrepeat, 4);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
QueenList[nQueen].nHealth = 4000;
|
QueenList[nQueen].nHealth = 4000;
|
||||||
|
|
Loading…
Reference in a new issue