Skip to content

Commit

Permalink
- converted FuncGrenade into a class.
Browse files Browse the repository at this point in the history
  • Loading branch information
coelckers committed Oct 15, 2021
1 parent cdc7fba commit e73725a
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 127 deletions.
7 changes: 7 additions & 0 deletions source/games/exhumed/src/aistuff.h
Expand Up @@ -472,6 +472,13 @@ class AIFishLimb : public ExhumedAI
void Draw(RunListEvent* ev) override;
};

struct AIGrenade : public ExhumedAI
{
void Tick(RunListEvent* ev) override;
void Draw(RunListEvent* ev) override;
void RadialDamage(RunListEvent* ev) override;
};


void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun);

Expand Down
245 changes: 118 additions & 127 deletions source/games/exhumed/src/grenade.cpp
Expand Up @@ -276,173 +276,164 @@ void ExplodeGrenade(short nGrenade)
DestroyGrenade(nGrenade);
}

void FuncGrenade(int nObject, int nMessage, int, int nRun)
void AIGrenade::Draw(RunListEvent* ev)
{
short nGrenade = RunData[nRun].nVal;
short nGrenade = RunData[ev->nRun].nVal;
assert(nGrenade >= 0 && nGrenade < kMaxGrenades);
short nSeq = GrenadeList[nGrenade].field_C ? SeqOffsets[kSeqGrenBoom] : SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A;
seq_PlotSequence(ev->nIndex, nSeq, GrenadeList[nGrenade].field_2 >> 8, 1);
}


void AIGrenade::Tick(RunListEvent* ev)
{
short nGrenade = RunData[ev->nRun].nVal;
assert(nGrenade >= 0 && nGrenade < kMaxGrenades);

short nGrenadeSprite = GrenadeList[nGrenade].nSprite;
auto pGrenadeSprite = &sprite[nGrenadeSprite];
short nSeq;
auto pGrenadeSprite = &sprite[nGrenadeSprite];
short nSeq = GrenadeList[nGrenade].field_C ? SeqOffsets[kSeqGrenBoom] : SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A;

if (GrenadeList[nGrenade].field_C)
{
nSeq = SeqOffsets[kSeqGrenBoom];
}
else
{
nSeq = SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A;
}
seq_MoveSequence(nGrenadeSprite, nSeq, GrenadeList[nGrenade].field_2 >> 8);
pGrenadeSprite->picnum = seq_GetSeqPicnum2(nSeq, GrenadeList[nGrenade].field_2 >> 8);

switch (nMessage)
GrenadeList[nGrenade].field_E--;
if (!GrenadeList[nGrenade].field_E)
{
case 0x90000:
{
seq_PlotSequence(nObject, nSeq, GrenadeList[nGrenade].field_2 >> 8, 1);
break;
}
short nPlayer = nGrenadePlayer[nGrenade];

default:
if (GrenadeList[nGrenade].field_10 < 0)
{
Printf("unknown msg %d for grenade\n", nMessage);
return;
}
PlayerList[nPlayer].field_3A = 0;
PlayerList[nPlayer].field_3FOUR = 0;

case 0x20000:
{
seq_MoveSequence(nGrenadeSprite, nSeq, GrenadeList[nGrenade].field_2 >> 8);
pGrenadeSprite->picnum = seq_GetSeqPicnum2(nSeq, GrenadeList[nGrenade].field_2 >> 8);

GrenadeList[nGrenade].field_E--;
if (!GrenadeList[nGrenade].field_E)
if (PlayerList[nPlayer].nAmmo[kWeaponGrenade])
{
short nPlayer = nGrenadePlayer[nGrenade];

if (GrenadeList[nGrenade].field_10 < 0)
{
PlayerList[nPlayer].field_3A = 0;
PlayerList[nPlayer].field_3FOUR = 0;

if (PlayerList[nPlayer].nAmmo[kWeaponGrenade])
{
PlayerList[nPlayer].bIsFiring = false;
}
else
{
SelectNewWeapon(nPlayer);

PlayerList[nPlayer].nCurrentWeapon = PlayerList[nPlayer].field_38;
PlayerList[nPlayer].field_38 = -1;
}
}

ExplodeGrenade(nGrenade);
return;
PlayerList[nPlayer].bIsFiring = false;
}
else
{
if (GrenadeList[nGrenade].field_10 < 0) {
return;
}
SelectNewWeapon(nPlayer);

PlayerList[nPlayer].nCurrentWeapon = PlayerList[nPlayer].field_38;
PlayerList[nPlayer].field_38 = -1;
}
}

ExplodeGrenade(nGrenade);
return;
}
else
{
if (GrenadeList[nGrenade].field_10 < 0) {
return;
}

int ebp = (GrenadeList[nGrenade].field_2 + GrenadeList[nGrenade].field_0) >> 8;
int ebp = (GrenadeList[nGrenade].field_2 + GrenadeList[nGrenade].field_0) >> 8;

GrenadeList[nGrenade].field_2 += GrenadeList[nGrenade].field_0;
GrenadeList[nGrenade].field_2 += GrenadeList[nGrenade].field_0;

if (ebp < 0)
if (ebp < 0)
{
GrenadeList[nGrenade].field_2 += SeqSize[nSeq] << 8;
}
else
{
if (ebp >= SeqSize[nSeq])
{
if (GrenadeList[nGrenade].field_C)
{
GrenadeList[nGrenade].field_2 += SeqSize[nSeq] << 8;
DestroyGrenade(nGrenade);
return;
}
else
{
if (ebp >= SeqSize[nSeq])
{
if (GrenadeList[nGrenade].field_C)
{
DestroyGrenade(nGrenade);
return;
}
else
{
GrenadeList[nGrenade].field_2 = GrenadeList[nGrenade].field_C;
}
}
GrenadeList[nGrenade].field_2 = GrenadeList[nGrenade].field_C;
}
}
}

if (GrenadeList[nGrenade].field_C) {
return;
}
if (GrenadeList[nGrenade].field_C) {
return;
}

int zVel = pGrenadeSprite->zvel;
int zVel = pGrenadeSprite->zvel;

Gravity(nGrenadeSprite);
int nMov = movesprite(nGrenadeSprite, GrenadeList[nGrenade].x, GrenadeList[nGrenade].y, pGrenadeSprite->zvel, pGrenadeSprite->clipdist >> 1, pGrenadeSprite->clipdist >> 1, CLIPMASK1);
Gravity(nGrenadeSprite);
int nMov = movesprite(nGrenadeSprite, GrenadeList[nGrenade].x, GrenadeList[nGrenade].y, pGrenadeSprite->zvel, pGrenadeSprite->clipdist >> 1, pGrenadeSprite->clipdist >> 1, CLIPMASK1);

if (!nMov)
return;
if (!nMov)
return;

if (nMov & 0x20000)
if (nMov & 0x20000)
{
if (zVel)
{
if (SectDamage[pGrenadeSprite->sectnum] > 0)
{
if (zVel)
{
if (SectDamage[pGrenadeSprite->sectnum] > 0)
{
ExplodeGrenade(nGrenade);
return;
}

GrenadeList[nGrenade].field_0 = (uint8_t)totalmoves; // limit to 8bits?

D3PlayFX(StaticSound[kSound3], nGrenadeSprite);

pGrenadeSprite->zvel = -(zVel >> 1);

if (pGrenadeSprite->zvel > -1280)
{
D3PlayFX(StaticSound[kSound5], nGrenadeSprite);
GrenadeList[nGrenade].field_0 = 0;
GrenadeList[nGrenade].field_2 = 0;
pGrenadeSprite->zvel = 0;
GrenadeList[nGrenade].field_A = 1;
}
}

GrenadeList[nGrenade].field_0 = 255 - (RandomByte() * 2);
GrenadeList[nGrenade].x -= (GrenadeList[nGrenade].x >> 4);
GrenadeList[nGrenade].y -= (GrenadeList[nGrenade].y >> 4);
ExplodeGrenade(nGrenade);
return;
}

// loc_2CF60:
if ((nMov & 0xC000) >= 0x8000)
GrenadeList[nGrenade].field_0 = (uint8_t)totalmoves; // limit to 8bits?

D3PlayFX(StaticSound[kSound3], nGrenadeSprite);

pGrenadeSprite->zvel = -(zVel >> 1);

if (pGrenadeSprite->zvel > -1280)
{
if ((nMov & 0xC000) <= 0x8000)
{
BounceGrenade(nGrenade, GetWallNormal(nMov & 0x3FFF));
}
else if ((nMov & 0xC000) == 0xC000)
{
BounceGrenade(nGrenade, sprite[nMov & 0x3FFF].ang);
}
D3PlayFX(StaticSound[kSound5], nGrenadeSprite);
GrenadeList[nGrenade].field_0 = 0;
GrenadeList[nGrenade].field_2 = 0;
pGrenadeSprite->zvel = 0;
GrenadeList[nGrenade].field_A = 1;
}

GrenadeList[nGrenade].field_2 = 0;
return;
}

break;
GrenadeList[nGrenade].field_0 = 255 - (RandomByte() * 2);
GrenadeList[nGrenade].x -= (GrenadeList[nGrenade].x >> 4);
GrenadeList[nGrenade].y -= (GrenadeList[nGrenade].y >> 4);
}

case 0xA0000:
// loc_2CF60:
if ((nMov & 0xC000) >= 0x8000)
{
if (nGrenadeSprite != nRadialSpr && !GrenadeList[nGrenade].field_C)
if ((nMov & 0xC000) <= 0x8000)
{
if (runlist_CheckRadialDamage(nGrenadeSprite) > 280)
{
GrenadeList[nGrenade].field_E = RandomSize(4) + 1;
}
BounceGrenade(nGrenade, GetWallNormal(nMov & 0x3FFF));
}
break;
else if ((nMov & 0xC000) == 0xC000)
{
BounceGrenade(nGrenade, sprite[nMov & 0x3FFF].ang);
}
}

GrenadeList[nGrenade].field_2 = 0;
}
}

void AIGrenade::RadialDamage(RunListEvent* ev)
{
short nGrenade = RunData[ev->nRun].nVal;
assert(nGrenade >= 0 && nGrenade < kMaxGrenades);

short nGrenadeSprite = GrenadeList[nGrenade].nSprite;
auto pGrenadeSprite = &sprite[nGrenadeSprite];

if (nGrenadeSprite != nRadialSpr && !GrenadeList[nGrenade].field_C)
{
if (runlist_CheckRadialDamage(nGrenadeSprite) > 280)
{
GrenadeList[nGrenade].field_E = RandomSize(4) + 1;
}
}
}

void FuncGrenade(int nObject, int nMessage, int nDamage, int nRun)
{
AIGrenade ai;
runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun);
}

END_PS_NS

0 comments on commit e73725a

Please sign in to comment.