- converted FuncPlayer into a class

This commit is contained in:
Christoph Oelckers 2021-10-15 22:19:07 +02:00
parent f13e1f2127
commit 93b0a35927
2 changed files with 1900 additions and 1884 deletions

View file

@ -555,6 +555,14 @@ struct AIObject : public ExhumedAI
void RadialDamage(RunListEvent* ev) override; void RadialDamage(RunListEvent* ev) override;
}; };
struct AIPlayer : public ExhumedAI
{
void Tick(RunListEvent* ev) override;
void Damage(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); void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun);
typedef void(*AiFunc)(int, int, int, int nRun); typedef void(*AiFunc)(int, int, int, int nRun);

View file

@ -652,66 +652,50 @@ void UpdatePlayerSpriteAngle(Player* pPlayer)
inita = sprite[pPlayer->nSprite].ang = pPlayer->angle.ang.asbuild(); inita = sprite[pPlayer->nSprite].ang = pPlayer->angle.ang.asbuild();
} }
void FuncPlayer(int nObject, int nMessage, int nDamage, int nRun) void AIPlayer::Draw(RunListEvent* ev)
{ {
int var_48 = 0; short nPlayer = RunData[ev->nRun].nVal;
int var_40; assert(nPlayer >= 0 && nPlayer < kMaxPlayers);
bool mplevel = (currentLevel->gameflags & LEVEL_EX_MULTI); short nAction = PlayerList[nPlayer].nAction;
short nPlayer = RunData[nRun].nVal; seq_PlotSequence(ev->nIndex, SeqOffsets[PlayerList[nPlayer].nSeq] + PlayerSeq[nAction].a, PlayerList[nPlayer].field_2, PlayerSeq[nAction].b);
}
void AIPlayer::RadialDamage(RunListEvent* ev)
{
short nPlayer = RunData[ev->nRun].nVal;
assert(nPlayer >= 0 && nPlayer < kMaxPlayers); assert(nPlayer >= 0 && nPlayer < kMaxPlayers);
short nPlayerSprite = PlayerList[nPlayer].nSprite; short nPlayerSprite = PlayerList[nPlayer].nSprite;
auto pPlayerSprite = &sprite[nPlayerSprite];
if (PlayerList[nPlayer].nHealth <= 0)
{
return;
}
ev->nDamage = runlist_CheckRadialDamage(nPlayerSprite);
Damage(ev);
}
void AIPlayer::Damage(RunListEvent* ev)
{
int nSprite2;
int nDamage = ev->nDamage;
short nPlayer = RunData[ev->nRun].nVal;
short nAction = PlayerList[nPlayer].nAction;
short nPlayerSprite = PlayerList[nPlayer].nSprite;
auto pPlayerSprite = &sprite[nPlayerSprite];
short nDopple = nDoppleSprite[nPlayer]; short nDopple = nDoppleSprite[nPlayer];
short nAction = PlayerList[nPlayer].nAction;
short nActionB = PlayerList[nPlayer].nAction;
short nSprite2;
PlayerList[nPlayer].angle.backup();
PlayerList[nPlayer].horizon.backup();
PlayerList[nPlayer].angle.resetadjustment();
PlayerList[nPlayer].horizon.resetadjustment();
oeyelevel[nPlayer] = eyelevel[nPlayer];
switch (nMessage)
{
case 0x90000:
{
seq_PlotSequence(nObject, SeqOffsets[PlayerList[nPlayer].nSeq] + PlayerSeq[nAction].a, PlayerList[nPlayer].field_2, PlayerSeq[nAction].b);
return;
}
case 0xA0000:
{
if (PlayerList[nPlayer].nHealth <= 0) {
return;
}
nDamage = runlist_CheckRadialDamage(nPlayerSprite);
if (!nDamage) { if (!nDamage) {
return; return;
} }
nSprite2 = nRadialOwner; if (ev->nMessage != EMessageType::RadialDamage)
// fall through to case 0x80000
fallthrough__;
}
case 0x80000:
{ {
// Dunno how to do this otherwise... we fall through from above but don't want to do this check.. nSprite2 = ev->nIndex;
if (nMessage != 0xA0000)
{
if (!nDamage) {
return;
}
nSprite2 = nObject;
} }
else nSprite2 = nRadialOwner;
// ok continue case 0x80000 as normal, loc_1C57C // ok continue case 0x80000 as normal, loc_1C57C
if (!PlayerList[nPlayer].nHealth) { if (!PlayerList[nPlayer].nHealth) {
@ -787,7 +771,7 @@ void FuncPlayer(int nObject, int nMessage, int nDamage, int nRun)
nPlayerScore[nPlayer]--; nPlayerScore[nPlayer]--;
} }
if (nMessage == 0xA0000) if (ev->nMessage == EMessageType::RadialDamage)
{ {
for (int i = 122; i <= 131; i++) for (int i = 122; i <= 131; i++)
{ {
@ -801,12 +785,32 @@ void FuncPlayer(int nObject, int nMessage, int nDamage, int nRun)
StartDeathSeq(nPlayer, 0); StartDeathSeq(nPlayer, 0);
} }
} }
return;
} }
case 0x20000:
void AIPlayer::Tick(RunListEvent* ev)
{ {
int var_48 = 0;
int var_40;
bool mplevel = (currentLevel->gameflags & LEVEL_EX_MULTI);
short nPlayer = RunData[ev->nRun].nVal;
assert(nPlayer >= 0 && nPlayer < kMaxPlayers);
short nPlayerSprite = PlayerList[nPlayer].nSprite;
auto pPlayerSprite = &sprite[nPlayerSprite];
short nDopple = nDoppleSprite[nPlayer];
short nAction = PlayerList[nPlayer].nAction;
short nActionB = PlayerList[nPlayer].nAction;
PlayerList[nPlayer].angle.backup();
PlayerList[nPlayer].horizon.backup();
PlayerList[nPlayer].angle.resetadjustment();
PlayerList[nPlayer].horizon.resetadjustment();
oeyelevel[nPlayer] = eyelevel[nPlayer];
pPlayerSprite->xvel = sPlayerInput[nPlayer].xVel >> 14; pPlayerSprite->xvel = sPlayerInput[nPlayer].xVel >> 14;
pPlayerSprite->yvel = sPlayerInput[nPlayer].yVel >> 14; pPlayerSprite->yvel = sPlayerInput[nPlayer].yVel >> 14;
@ -2663,10 +2667,14 @@ loc_1BD2E:
} }
MoveWeapons(nPlayer); MoveWeapons(nPlayer);
}
return;
}
} void FuncPlayer(int nObject, int nMessage, int nDamage, int nRun)
{
AIPlayer ai;
runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun);
} }