From 61df236588cc85341c4660166538cb1101ea70a6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Oct 2021 23:18:58 +0200 Subject: [PATCH] - converted FuncSet/FuncSoul to a class. --- source/games/exhumed/src/aistuff.h | 15 + source/games/exhumed/src/set.cpp | 975 +++++++++++++++-------------- 2 files changed, 505 insertions(+), 485 deletions(-) diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index d28e8335b..de17e7027 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -626,6 +626,21 @@ struct AIScorp : public ExhumedAI void RadialDamage(RunListEvent* ev) override; }; +struct AISet : public ExhumedAI +{ + void Tick(RunListEvent* ev) override; + void Damage(RunListEvent* ev) override; + void Draw(RunListEvent* ev) override; + void RadialDamage(RunListEvent* ev) override; +}; + +struct AISoul : public ExhumedAI +{ + void Tick(RunListEvent* ev) override; +}; + + + void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun); typedef void(*AiFunc)(int, int, int, int nRun); diff --git a/source/games/exhumed/src/set.cpp b/source/games/exhumed/src/set.cpp index 1dbc86b27..9ba5ca150 100644 --- a/source/games/exhumed/src/set.cpp +++ b/source/games/exhumed/src/set.cpp @@ -89,11 +89,11 @@ void InitSets() void BuildSet(short nSprite, int x, int y, int z, short nSector, short nAngle, int nChannel) { auto nSet = SetList.Reserve(1); - auto pSprite = &sprite[nSprite]; + auto pSprite = &sprite[nSprite]; if (nSprite == -1) { nSprite = insertsprite(nSector, 120); - pSprite = &sprite[nSprite]; + pSprite = &sprite[nSprite]; } else { @@ -131,7 +131,7 @@ void BuildSet(short nSprite, int x, int y, int z, short nSector, short nAngle, i SetList[nSet].nAction = 1; SetList[nSet].nHealth = 8000; SetList[nSet].nSprite = nSprite; - SetList[nSet].nFrame = 0; + SetList[nSet].nFrame = 0; SetList[nSet].nTarget = -1; SetList[nSet].nCount = 90; SetList[nSet].nIndex = 0; @@ -151,7 +151,7 @@ void BuildSoul(int nSet) { int nSetSprite = SetList[nSet].nSprite; int nSprite = insertsprite(sprite[nSetSprite].sectnum, 0); - auto pSprite = &sprite[nSprite]; + auto pSprite = &sprite[nSprite]; assert(nSprite >= 0 && nSprite < kMaxSprites); @@ -178,519 +178,524 @@ void BuildSoul(int nSet) pSprite->lotag = runlist_HeadRun() + 1; pSprite->extra = 0; -// GrabTimeSlot(3); + // GrabTimeSlot(3); pSprite->owner = runlist_AddRunRec(NewRun, nSprite, 0x230000); } -void FuncSoul(int nObject, int nMessage, int, int nRun) +void AISoul::Tick(RunListEvent* ev) { - short nSprite = RunData[nRun].nVal; - auto pSprite = &sprite[nSprite]; + short nSprite = RunData[ev->nRun].nVal; + auto pSprite = &sprite[nSprite]; - switch (nMessage) + seq_MoveSequence(nSprite, SeqOffsets[kSeqSet] + 75, 0); + + if (pSprite->xrepeat < 32) { - case 0x20000: - { - seq_MoveSequence(nSprite, SeqOffsets[kSeqSet] + 75, 0); + pSprite->xrepeat++; + pSprite->yrepeat++; + } - if (pSprite->xrepeat < 32) - { - pSprite->xrepeat++; - pSprite->yrepeat++; - } + pSprite->extra += (nSprite & 0x0F) + 5; + pSprite->extra &= kAngleMask; - pSprite->extra += (nSprite & 0x0F) + 5; - pSprite->extra &= kAngleMask; + int nVel = bcos(pSprite->extra, -7); - int nVel = bcos(pSprite->extra, -7); + if (movesprite(nSprite, bcos(pSprite->ang) * nVel, bsin(pSprite->ang) * nVel, pSprite->zvel, 5120, 0, CLIPMASK0) & 0x10000) + { + int nSet = pSprite->hitag; + int nSetSprite = SetList[nSet].nSprite; - if (movesprite(nSprite, bcos(pSprite->ang) * nVel, bsin(pSprite->ang) * nVel, pSprite->zvel, 5120, 0, CLIPMASK0) & 0x10000) - { - int nSet = pSprite->hitag; - int nSetSprite = SetList[nSet].nSprite; - - pSprite->cstat = 0; - pSprite->yrepeat = 1; - pSprite->xrepeat = 1; - pSprite->x = sprite[nSetSprite].x; - pSprite->y = sprite[nSetSprite].y; - pSprite->z = sprite[nSetSprite].z - (GetSpriteHeight(nSetSprite) >> 1); - mychangespritesect(nSprite, sprite[nSetSprite].sectnum); - return; - } - } - - case 0x80000: - case 0xA0000: - case 0x90000: - return; - - default: - Printf("unknown msg %d for Soul\n", nMessage); + pSprite->cstat = 0; + pSprite->yrepeat = 1; + pSprite->xrepeat = 1; + pSprite->x = sprite[nSetSprite].x; + pSprite->y = sprite[nSetSprite].y; + pSprite->z = sprite[nSetSprite].z - (GetSpriteHeight(nSetSprite) >> 1); + mychangespritesect(nSprite, sprite[nSetSprite].sectnum); + return; } } -void FuncSet(int nObject, int nMessage, int nDamage, int nRun) + + +void FuncSoul(int nObject, int nMessage, int nDamage, int nRun) { - short nSet = RunData[nRun].nVal; + AISoul ai; + runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun); +} + +void AISet::RadialDamage(RunListEvent* ev) +{ + short nSet = RunData[ev->nRun].nVal; assert(nSet >= 0 && nSet < (int)SetList.Size()); short nSprite = SetList[nSet].nSprite; short nAction = SetList[nSet].nAction; - auto pSprite = &sprite[nSprite]; - bool bVal = false; - - switch (nMessage) + if (nAction == 5) { - default: + ev->nDamage = runlist_CheckRadialDamage(nSprite); + // fall through to case 0x80000 + } + Damage(ev); +} + +void AISet::Damage(RunListEvent* ev) +{ + short nSet = RunData[ev->nRun].nVal; + assert(nSet >= 0 && nSet < (int)SetList.Size()); + + short nSprite = SetList[nSet].nSprite; + short nAction = SetList[nSet].nAction; + auto pSprite = &sprite[nSprite]; + + if (ev->nDamage && SetList[nSet].nHealth > 0) + { + if (nAction != 1) { - Printf("unknown msg %d for Set\n", nMessage); - return; + SetList[nSet].nHealth -= dmgAdjust(ev->nDamage); } - case 0xA0000: + if (SetList[nSet].nHealth <= 0) { - if (nAction == 5) - { - nDamage = runlist_CheckRadialDamage(nSprite); - // fall through to case 0x80000 - } - fallthrough__; - } + pSprite->xvel = 0; + pSprite->yvel = 0; + pSprite->zvel = 0; + pSprite->cstat &= 0xFEFE; - case 0x80000: - { - if (nDamage && SetList[nSet].nHealth > 0) - { - if (nAction != 1) - { - SetList[nSet].nHealth -= dmgAdjust(nDamage); - } + SetList[nSet].nHealth = 0; - if (SetList[nSet].nHealth <= 0) - { - pSprite->xvel = 0; - pSprite->yvel = 0; - pSprite->zvel = 0; - pSprite->cstat &= 0xFEFE; + nCreaturesKilled++; - SetList[nSet].nHealth = 0; - - nCreaturesKilled++; - - if (nAction < 10) - { - SetList[nSet].nFrame = 0; - SetList[nSet].nAction = 10; - } - } - else if (nAction == 1) - { - SetList[nSet].nAction = 2; - SetList[nSet].nFrame = 0; - } - } - return; - } - - case 0x90000: - { - seq_PlotSequence(nObject, SeqOffsets[kSeqSet] + SetSeq[nAction].a, SetList[nSet].nFrame, SetSeq[nAction].b); - return; - } - - case 0x20000: - { - Gravity(nSprite); - - short nSeq = SeqOffsets[kSeqSet] + SetSeq[SetList[nSet].nAction].a; - pSprite->picnum = seq_GetSeqPicnum2(nSeq, SetList[nSet].nFrame); - seq_MoveSequence(nSprite, nSeq, SetList[nSet].nFrame); - - if (nAction == 3) - { - if (SetList[nSet].nIndex2) { - SetList[nSet].nFrame++; - } - } - - SetList[nSet].nFrame++; - if (SetList[nSet].nFrame >= SeqSize[nSeq]) + if (nAction < 10) { SetList[nSet].nFrame = 0; - bVal = true; + SetList[nSet].nAction = 10; } - - short nFlag = FrameFlag[SeqBase[nSeq] + SetList[nSet].nFrame]; - short nTarget = SetList[nSet].nTarget; - - if (nTarget > -1 && nAction < 10) - { - if (!(sprite[nTarget].cstat & 0x101)) - { - SetList[nSet].nTarget = -1; - SetList[nSet].nAction = 0; - SetList[nSet].nFrame = 0; - nTarget = -1; - } - } - - int nMov = MoveCreature(nSprite); - - pushmove_old(&pSprite->x, &pSprite->y, &pSprite->z, &pSprite->sectnum, pSprite->clipdist << 2, 5120, -5120, CLIPMASK0); - - if (pSprite->zvel > 4000) - { - if (nMov & 0x20000) - { - SetQuake(nSprite, 100); - } - } - - switch (nAction) - { - default: - return; - - case 0: - { - if ((nSet & 0x1F) == (totalmoves & 0x1F)) - { - if (nTarget < 0) - { - nTarget = FindPlayer(nSprite, 1000); - } - - if (nTarget >= 0) - { - SetList[nSet].nAction = 3; - SetList[nSet].nFrame = 0; - SetList[nSet].nTarget = nTarget; - - pSprite->xvel = bcos(pSprite->ang, -1); - pSprite->yvel = bsin(pSprite->ang, -1); - } - } - - return; - } - - case 1: - { - if (FindPlayer(nSprite, 1000) >= 0) - { - SetList[nSet].nCount--; - if (SetList[nSet].nCount <= 0) - { - SetList[nSet].nAction = 2; - SetList[nSet].nFrame = 0; - } - } - - return; - } - - case 2: - { - if (bVal) - { - SetList[nSet].nAction = 7; - SetList[nSet].nIndex = 0; - SetList[nSet].nFrame = 0; - - pSprite->xvel = 0; - pSprite->yvel = 0; - - SetList[nSet].nTarget = FindPlayer(nSprite, 1000); - } - return; - } - - case 3: - { - if (nTarget != -1) - { - if ((nFlag & 0x10) && (nMov & 0x20000)) - { - SetQuake(nSprite, 100); - } - - int nCourse = PlotCourseToSprite(nSprite, nTarget); - - if ((nSet & 0x1F) == (totalmoves & 0x1F)) - { - int nRand = RandomSize(3); - - switch (nRand) - { - case 0: - case 2: - { - SetList[nSet].nIndex = 0; - SetList[nSet].nAction = 7; - SetList[nSet].nFrame = 0; - pSprite->xvel = 0; - pSprite->yvel = 0; - return; - } - case 1: - { - PlotCourseToSprite(nSprite, nTarget); - - SetList[nSet].nAction = 6; - SetList[nSet].nFrame = 0; - SetList[nSet].nRun = 5; - pSprite->xvel = 0; - pSprite->yvel = 0; - return; - } - default: - { - if (nCourse <= 100) - { - SetList[nSet].nIndex2 = 0; - } - else - { - SetList[nSet].nIndex2 = 1; - } - break; - } - } - } - - // loc_338E2 - int nAngle = pSprite->ang & 0xFFF8; - pSprite->xvel = bcos(nAngle, -1); - pSprite->yvel = bsin(nAngle, -1); - - if (SetList[nSet].nIndex2) - { - pSprite->xvel *= 2; - pSprite->yvel *= 2; - } - - if ((nMov & 0xC000) == 0x8000) - { - short nWall = nMov & 0x3FFF; - short nSector = wall[nWall].nextsector; - - if (nSector >= 0) - { - if ((pSprite->z - sector[nSector].floorz) < 55000) - { - if (pSprite->z > sector[nSector].ceilingz) - { - SetList[nSet].nIndex = 1; - SetList[nSet].nAction = 7; - SetList[nSet].nFrame = 0; - pSprite->xvel = 0; - pSprite->yvel = 0; - return; - } - } - } - - pSprite->ang = (pSprite->ang + 256) & kAngleMask; - pSprite->xvel = bcos(pSprite->ang, -1); - pSprite->yvel = bsin(pSprite->ang, -1); - break; - } - else if ((nMov & 0xC000) == 0xC000) - { - if (nTarget == (nMov & 0x3FFF)) - { - int nAng = getangle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y); - if (AngleDiff(pSprite->ang, nAng) < 64) - { - SetList[nSet].nAction = 4; - SetList[nSet].nFrame = 0; - } - break; - } - else - { - SetList[nSet].nIndex = 1; - SetList[nSet].nAction = 7; - SetList[nSet].nFrame = 0; - pSprite->xvel = 0; - pSprite->yvel = 0; - return; - } - } - - break; - } - else - { - SetList[nSet].nAction = 0; - SetList[nSet].nFrame = 0; - return; - } - } - - case 4: - { - if (nTarget == -1) - { - SetList[nSet].nAction = 0; - SetList[nSet].nCount = 50; - } - else - { - if (PlotCourseToSprite(nSprite, nTarget) >= 768) - { - SetList[nSet].nAction = 3; - } - else if (nFlag & 0x80) - { - runlist_DamageEnemy(nTarget, nSprite, 5); - } - } - - break; - } - - case 5: - { - if (bVal) - { - SetList[nSet].nAction = 0; - SetList[nSet].nCount = 15; - } - return; - } - - case 6: - { - if (nFlag & 0x80) - { - // low 16 bits of returned var contains the sprite index, the high 16 the bullet number - int nBullet = BuildBullet(nSprite, 11, 0, 0, -1, pSprite->ang, nTarget + 10000, 1); - SetBulletEnemy(nBullet >> 16, nTarget); // isolate the bullet number (shift off the sprite index) - - SetList[nSet].nRun--; - if (SetList[nSet].nRun <= 0 || !RandomBit()) - { - SetList[nSet].nAction = 0; - SetList[nSet].nFrame = 0; - } - } - return; - } - - case 7: - { - if (bVal) - { - if (SetList[nSet].nIndex) - { - pSprite->zvel = -10000; - } - else - { - pSprite->zvel = -(PlotCourseToSprite(nSprite, nTarget)); - } - - SetList[nSet].nAction = 8; - SetList[nSet].nFrame = 0; - - pSprite->xvel = bcos(pSprite->ang); - pSprite->yvel = bsin(pSprite->ang); - } - return; - } - - case 8: - { - if (bVal) - { - SetList[nSet].nFrame = SeqSize[nSeq] - 1; - } - - if (nMov & 0x20000) - { - SetQuake(nSprite, 200); - SetList[nSet].nAction = 9; - SetList[nSet].nFrame = 0; - } - return; - } - - case 9: - { - pSprite->xvel >>= 1; - pSprite->yvel >>= 1; - - if (bVal) - { - pSprite->xvel = 0; - pSprite->yvel = 0; - - PlotCourseToSprite(nSprite, nTarget); - - SetList[nSet].nAction = 6; - SetList[nSet].nFrame = 0; - SetList[nSet].nRun = 5; - - pSprite->xvel = 0; - pSprite->yvel = 0; - } - return; - } - - case 10: - { - if (nFlag & 0x80) - { - pSprite->z -= GetSpriteHeight(nSprite); - BuildCreatureChunk(nSprite, seq_GetSeqPicnum(kSeqSet, 76, 0)); - pSprite->z += GetSpriteHeight(nSprite); - } - - if (bVal) - { - SetList[nSet].nAction = 11; - SetList[nSet].nFrame = 0; - - runlist_ChangeChannel(SetList[nSet].nChannel, 1); - - for (int i = 0; i < 20; i++) - { - BuildSoul(nSet); - } - } - return; - } - - case 11: - { - pSprite->cstat &= 0xFEFE; - return; - } - } - - // loc_33AE3: ? - if (nAction) - { - if (nTarget != -1) - { - if (!(sprite[nTarget].cstat & 0x101)) - { - SetList[nSet].nAction = 0; - SetList[nSet].nFrame = 0; - SetList[nSet].nCount = 100; - SetList[nSet].nTarget = -1; - pSprite->xvel = 0; - pSprite->yvel = 0; - } - } - } - - return; + } + else if (nAction == 1) + { + SetList[nSet].nAction = 2; + SetList[nSet].nFrame = 0; } } } + +void AISet::Draw(RunListEvent* ev) +{ + short nSet = RunData[ev->nRun].nVal; + assert(nSet >= 0 && nSet < (int)SetList.Size()); + + short nAction = SetList[nSet].nAction; + + seq_PlotSequence(ev->nIndex, SeqOffsets[kSeqSet] + SetSeq[nAction].a, SetList[nSet].nFrame, SetSeq[nAction].b); + return; +} + +void AISet::Tick(RunListEvent* ev) +{ + short nSet = RunData[ev->nRun].nVal; + assert(nSet >= 0 && nSet < (int)SetList.Size()); + + short nSprite = SetList[nSet].nSprite; + short nAction = SetList[nSet].nAction; + auto pSprite = &sprite[nSprite]; + + bool bVal = false; + + Gravity(nSprite); + + short nSeq = SeqOffsets[kSeqSet] + SetSeq[SetList[nSet].nAction].a; + pSprite->picnum = seq_GetSeqPicnum2(nSeq, SetList[nSet].nFrame); + seq_MoveSequence(nSprite, nSeq, SetList[nSet].nFrame); + + if (nAction == 3) + { + if (SetList[nSet].nIndex2) { + SetList[nSet].nFrame++; + } + } + + SetList[nSet].nFrame++; + if (SetList[nSet].nFrame >= SeqSize[nSeq]) + { + SetList[nSet].nFrame = 0; + bVal = true; + } + + short nFlag = FrameFlag[SeqBase[nSeq] + SetList[nSet].nFrame]; + short nTarget = SetList[nSet].nTarget; + + if (nTarget > -1 && nAction < 10) + { + if (!(sprite[nTarget].cstat & 0x101)) + { + SetList[nSet].nTarget = -1; + SetList[nSet].nAction = 0; + SetList[nSet].nFrame = 0; + nTarget = -1; + } + } + + int nMov = MoveCreature(nSprite); + + pushmove_old(&pSprite->x, &pSprite->y, &pSprite->z, &pSprite->sectnum, pSprite->clipdist << 2, 5120, -5120, CLIPMASK0); + + if (pSprite->zvel > 4000) + { + if (nMov & 0x20000) + { + SetQuake(nSprite, 100); + } + } + + switch (nAction) + { + default: + return; + + case 0: + { + if ((nSet & 0x1F) == (totalmoves & 0x1F)) + { + if (nTarget < 0) + { + nTarget = FindPlayer(nSprite, 1000); + } + + if (nTarget >= 0) + { + SetList[nSet].nAction = 3; + SetList[nSet].nFrame = 0; + SetList[nSet].nTarget = nTarget; + + pSprite->xvel = bcos(pSprite->ang, -1); + pSprite->yvel = bsin(pSprite->ang, -1); + } + } + + return; + } + + case 1: + { + if (FindPlayer(nSprite, 1000) >= 0) + { + SetList[nSet].nCount--; + if (SetList[nSet].nCount <= 0) + { + SetList[nSet].nAction = 2; + SetList[nSet].nFrame = 0; + } + } + + return; + } + + case 2: + { + if (bVal) + { + SetList[nSet].nAction = 7; + SetList[nSet].nIndex = 0; + SetList[nSet].nFrame = 0; + + pSprite->xvel = 0; + pSprite->yvel = 0; + + SetList[nSet].nTarget = FindPlayer(nSprite, 1000); + } + return; + } + + case 3: + { + if (nTarget != -1) + { + if ((nFlag & 0x10) && (nMov & 0x20000)) + { + SetQuake(nSprite, 100); + } + + int nCourse = PlotCourseToSprite(nSprite, nTarget); + + if ((nSet & 0x1F) == (totalmoves & 0x1F)) + { + int nRand = RandomSize(3); + + switch (nRand) + { + case 0: + case 2: + { + SetList[nSet].nIndex = 0; + SetList[nSet].nAction = 7; + SetList[nSet].nFrame = 0; + pSprite->xvel = 0; + pSprite->yvel = 0; + return; + } + case 1: + { + PlotCourseToSprite(nSprite, nTarget); + + SetList[nSet].nAction = 6; + SetList[nSet].nFrame = 0; + SetList[nSet].nRun = 5; + pSprite->xvel = 0; + pSprite->yvel = 0; + return; + } + default: + { + if (nCourse <= 100) + { + SetList[nSet].nIndex2 = 0; + } + else + { + SetList[nSet].nIndex2 = 1; + } + break; + } + } + } + + // loc_338E2 + int nAngle = pSprite->ang & 0xFFF8; + pSprite->xvel = bcos(nAngle, -1); + pSprite->yvel = bsin(nAngle, -1); + + if (SetList[nSet].nIndex2) + { + pSprite->xvel *= 2; + pSprite->yvel *= 2; + } + + if ((nMov & 0xC000) == 0x8000) + { + short nWall = nMov & 0x3FFF; + short nSector = wall[nWall].nextsector; + + if (nSector >= 0) + { + if ((pSprite->z - sector[nSector].floorz) < 55000) + { + if (pSprite->z > sector[nSector].ceilingz) + { + SetList[nSet].nIndex = 1; + SetList[nSet].nAction = 7; + SetList[nSet].nFrame = 0; + pSprite->xvel = 0; + pSprite->yvel = 0; + return; + } + } + } + + pSprite->ang = (pSprite->ang + 256) & kAngleMask; + pSprite->xvel = bcos(pSprite->ang, -1); + pSprite->yvel = bsin(pSprite->ang, -1); + break; + } + else if ((nMov & 0xC000) == 0xC000) + { + if (nTarget == (nMov & 0x3FFF)) + { + int nAng = getangle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y); + if (AngleDiff(pSprite->ang, nAng) < 64) + { + SetList[nSet].nAction = 4; + SetList[nSet].nFrame = 0; + } + break; + } + else + { + SetList[nSet].nIndex = 1; + SetList[nSet].nAction = 7; + SetList[nSet].nFrame = 0; + pSprite->xvel = 0; + pSprite->yvel = 0; + return; + } + } + + break; + } + else + { + SetList[nSet].nAction = 0; + SetList[nSet].nFrame = 0; + return; + } + } + + case 4: + { + if (nTarget == -1) + { + SetList[nSet].nAction = 0; + SetList[nSet].nCount = 50; + } + else + { + if (PlotCourseToSprite(nSprite, nTarget) >= 768) + { + SetList[nSet].nAction = 3; + } + else if (nFlag & 0x80) + { + runlist_DamageEnemy(nTarget, nSprite, 5); + } + } + + break; + } + + case 5: + { + if (bVal) + { + SetList[nSet].nAction = 0; + SetList[nSet].nCount = 15; + } + return; + } + + case 6: + { + if (nFlag & 0x80) + { + // low 16 bits of returned var contains the sprite index, the high 16 the bullet number + int nBullet = BuildBullet(nSprite, 11, 0, 0, -1, pSprite->ang, nTarget + 10000, 1); + SetBulletEnemy(nBullet >> 16, nTarget); // isolate the bullet number (shift off the sprite index) + + SetList[nSet].nRun--; + if (SetList[nSet].nRun <= 0 || !RandomBit()) + { + SetList[nSet].nAction = 0; + SetList[nSet].nFrame = 0; + } + } + return; + } + + case 7: + { + if (bVal) + { + if (SetList[nSet].nIndex) + { + pSprite->zvel = -10000; + } + else + { + pSprite->zvel = -(PlotCourseToSprite(nSprite, nTarget)); + } + + SetList[nSet].nAction = 8; + SetList[nSet].nFrame = 0; + + pSprite->xvel = bcos(pSprite->ang); + pSprite->yvel = bsin(pSprite->ang); + } + return; + } + + case 8: + { + if (bVal) + { + SetList[nSet].nFrame = SeqSize[nSeq] - 1; + } + + if (nMov & 0x20000) + { + SetQuake(nSprite, 200); + SetList[nSet].nAction = 9; + SetList[nSet].nFrame = 0; + } + return; + } + + case 9: + { + pSprite->xvel >>= 1; + pSprite->yvel >>= 1; + + if (bVal) + { + pSprite->xvel = 0; + pSprite->yvel = 0; + + PlotCourseToSprite(nSprite, nTarget); + + SetList[nSet].nAction = 6; + SetList[nSet].nFrame = 0; + SetList[nSet].nRun = 5; + + pSprite->xvel = 0; + pSprite->yvel = 0; + } + return; + } + + case 10: + { + if (nFlag & 0x80) + { + pSprite->z -= GetSpriteHeight(nSprite); + BuildCreatureChunk(nSprite, seq_GetSeqPicnum(kSeqSet, 76, 0)); + pSprite->z += GetSpriteHeight(nSprite); + } + + if (bVal) + { + SetList[nSet].nAction = 11; + SetList[nSet].nFrame = 0; + + runlist_ChangeChannel(SetList[nSet].nChannel, 1); + + for (int i = 0; i < 20; i++) + { + BuildSoul(nSet); + } + } + return; + } + + case 11: + { + pSprite->cstat &= 0xFEFE; + return; + } + } + + // loc_33AE3: ? + if (nAction) + { + if (nTarget != -1) + { + if (!(sprite[nTarget].cstat & 0x101)) + { + SetList[nSet].nAction = 0; + SetList[nSet].nFrame = 0; + SetList[nSet].nCount = 100; + SetList[nSet].nTarget = -1; + pSprite->xvel = 0; + pSprite->yvel = 0; + } + } + } + + return; +} + +void FuncSet(int nObject, int nMessage, int nDamage, int nRun) +{ + AISet ai; + runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun); +} END_PS_NS