- refactor Roach to use actors.

This commit is contained in:
Christoph Oelckers 2021-10-18 18:54:35 +02:00
parent 3a051b8acb
commit 937e71cfbb
8 changed files with 77 additions and 119 deletions

View file

@ -416,8 +416,7 @@ void FuncRex(int, int, int, int);
// roach
void InitRoachs();
void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int angle);
void BuildRoach(int nType, DExhumedActor* nSprite, int x, int y, int z, short nSector, int angle);
void FuncRoach(int a, int, int nDamage, int nRun);
// runlist

View file

@ -81,6 +81,8 @@ enum ECounter
kCountLion,
kCountMummy,
kCountRex,
kCountRoach,
kCountScorp,
kNumCounters
};

View file

@ -607,7 +607,9 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, DExhumedActor& w,
("target", w.pTarget)
("count", w.nCount)
("run", w.nRun)
//("index", w.nIndex)
("index", w.nIndex)
("index2", w.nIndex2) // scorpion
("channel", w.nChannel) // scorpion
.EndObject();
}
return arc;

View file

@ -94,7 +94,9 @@ public:
short nAction;
short nCount;
short nRun;
//short nIndex;
short nIndex;
short nIndex2;
short nChannel;
DExhumedActor() :index(int(this - base())) {}
DExhumedActor& operator=(const DExhumedActor& other) = default;

View file

@ -94,8 +94,7 @@ uint8_t LoadLevel(MapRecord* map)
InitSets();
InitQueens();
InitRoachs();
InitWasps();
InitWasps();
InitRats();
InitBullets();
InitWeapons();
@ -594,7 +593,7 @@ void ProcessSpriteTag(short nSprite, short nLotag, short nHitag)
return;
}
BuildRoach(1, nSprite, 0, 0, 0, 0, 0);
BuildRoach(1, pActor, 0, 0, 0, 0, 0);
return;
}
case 103:
@ -604,7 +603,7 @@ void ProcessSpriteTag(short nSprite, short nLotag, short nHitag)
return;
}
BuildRoach(0, nSprite, 0, 0, 0, 0, 0);
BuildRoach(0, pActor, 0, 0, 0, 0, 0);
return;
}
case 102:

View file

@ -89,8 +89,8 @@ static int osdcmd_spawn(CCmdFuncPtr parm)
else if (!stricmp(c, "rex")) BuildRex(nullptr, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount);
else if (!stricmp(c, "set")) BuildSet(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount);
else if (!stricmp(c, "queen")) BuildQueen(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount);
else if (!stricmp(c, "roach")) BuildRoach(0, -1, initx, inity, sector[initsect].floorz, initsect, inita);
else if (!stricmp(c, "roach2")) BuildRoach(1, -1, initx, inity, sector[initsect].floorz, initsect, inita);
else if (!stricmp(c, "roach")) BuildRoach(0, nullptr, initx, inity, sector[initsect].floorz, initsect, inita);
else if (!stricmp(c, "roach2")) BuildRoach(1, nullptr, initx, inity, sector[initsect].floorz, initsect, inita);
else if (!stricmp(c, "wasp")) BuildWasp(-1, initx, inity, sector[initsect].floorz - 25600, initsect, inita);
else if (!stricmp(c, "scorp")) BuildScorp(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount);
else if (!stricmp(c, "rat")) BuildRat(nullptr, initx, inity, sector[initsect].floorz, initsect, inita);

View file

@ -46,61 +46,25 @@ struct Roach
short nIndex;
};
TArray<Roach> RoachList;
FSerializer& Serialize(FSerializer& arc, const char* keyname, Roach& w, Roach* def)
{
if (arc.BeginObject(keyname))
{
arc("health", w.nHealth)
("frame", w.nFrame)
("action", w.nAction)
("sprite", w.nSprite)
("target", w.nTarget)
("run", w.nRun)
("count", w.nCount)
("index", w.nIndex)
.EndObject();
}
return arc;
}
void SerializeRoach(FSerializer& arc)
{
arc("roach", RoachList);
}
/* Kilmaat Sentry */
void InitRoachs()
{
RoachList.Clear();
}
// TODO - make nType a bool?
void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int angle)
void BuildRoach(int nType, DExhumedActor* pActor, int x, int y, int z, short nSector, int angle)
{
auto RoachCount = RoachList.Reserve(1);
auto pSprite = &sprite[nSprite];
if (nSprite == -1)
spritetype* pSprite;
if (pActor == nullptr)
{
nSprite = insertsprite(nSector, 105);
pSprite = &sprite[nSprite];
pActor = insertActor(nSector, 105);
pSprite = &pActor->s();
}
else
{
changespritestat(nSprite, 105);
ChangeActorStat(pActor, 105);
pSprite = &pActor->s();
x = pSprite->x;
y = pSprite->y;
z = sector[pSprite->sectnum].floorz;
angle = pSprite->ang;
}
assert(nSprite >= 0 && nSprite < kMaxSprites);
pSprite->x = x;
pSprite->y = y;
pSprite->z = z;
@ -125,37 +89,35 @@ void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int
if (nType)
{
RoachList[RoachCount].nAction = 0;
pActor->nAction = 0;
}
else
{
RoachList[RoachCount].nAction = 1;
pActor->nAction = 1;
}
RoachList[RoachCount].nSprite = nSprite;
RoachList[RoachCount].nFrame = 0;
RoachList[RoachCount].nCount = 0;
RoachList[RoachCount].nTarget = -1;
RoachList[RoachCount].nHealth = 600;
pActor->nFrame = 0;
pActor->nCount = 0;
pActor->pTarget = nullptr;
pActor->nHealth = 600;
pActor->nPhase = Counters[kCountRoach]++;
pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, RoachCount, 0x1C0000);
RoachList[RoachCount].nRun = runlist_AddRunRec(NewRun, RoachCount, 0x1C0000);
pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, pActor, 0x1C0000);
pActor->nRun = runlist_AddRunRec(NewRun, pActor, 0x1C0000);
nCreaturesTotal++;
}
void GoRoach(short nSprite)
void GoRoach(spritetype* pSprite)
{
auto pSprite = &sprite[nSprite];
pSprite->xvel = bcos(pSprite->ang, -1) - bcos(pSprite->ang, -3);
pSprite->yvel = bsin(pSprite->ang, -1) - bsin(pSprite->ang, -3);
}
void AIRoach::Draw(RunListEvent* ev)
{
short nRoach = RunData[ev->nRun].nObjIndex;
assert(nRoach >= 0 && nRoach < (int)RoachList.Size());
auto pActor = &RoachList[nRoach];
auto pActor = ev->pObjActor;
if (!pActor) return;
short nAction = pActor->nAction;
seq_PlotSequence(ev->nParam, RoachSeq[nAction].a + SeqOffsets[kSeqRoach], pActor->nFrame, RoachSeq[nAction].b);
@ -164,23 +126,19 @@ void AIRoach::Draw(RunListEvent* ev)
void AIRoach::RadialDamage(RunListEvent* ev)
{
short nRoach = RunData[ev->nRun].nObjIndex;
assert(nRoach >= 0 && nRoach < (int)RoachList.Size());
auto pActor = &RoachList[nRoach];
short nSprite = pActor->nSprite;
ev->nDamage = runlist_CheckRadialDamage(nSprite);
auto pActor = ev->pObjActor;
if (!pActor) return;
ev->nDamage = runlist_CheckRadialDamage(pActor);
Damage(ev);
}
void AIRoach::Damage(RunListEvent* ev)
{
short nRoach = RunData[ev->nRun].nObjIndex;
assert(nRoach >= 0 && nRoach < (int)RoachList.Size());
auto pActor = &RoachList[nRoach];
auto pActor = ev->pObjActor;
if (!pActor) return;
short nSprite = pActor->nSprite;
auto pSprite = &sprite[nSprite];
auto pSprite = &pActor->s();
short nAction = pActor->nAction;
if (ev->nDamage)
@ -201,7 +159,7 @@ void AIRoach::Damage(RunListEvent* ev)
if (nAction < 5)
{
DropMagic(nSprite);
DropMagic(pActor);
pActor->nAction = 5;
pActor->nFrame = 0;
}
@ -210,17 +168,17 @@ void AIRoach::Damage(RunListEvent* ev)
}
else
{
short nSprite2 = ev->nParam;
if (nSprite2 >= 0)
auto pSprite2 = ev->pOtherActor;
if (pSprite2)
{
if (sprite[nSprite2].statnum < 199) {
pActor->nTarget = nSprite2;
if (pSprite2->s().statnum < 199) {
pActor->pTarget = pSprite2;
}
if (nAction == 0)
{
pActor->nAction = 2;
GoRoach(nSprite);
GoRoach(pSprite);
pActor->nFrame = 0;
}
else
@ -238,21 +196,19 @@ void AIRoach::Damage(RunListEvent* ev)
void AIRoach::Tick(RunListEvent* ev)
{
short nRoach = RunData[ev->nRun].nObjIndex;
assert(nRoach >= 0 && nRoach < (int)RoachList.Size());
auto pActor = &RoachList[nRoach];
auto pActor = ev->pObjActor;
if (!pActor) return;
short nSprite = pActor->nSprite;
auto pSprite = &sprite[nSprite];
auto pSprite = &pActor->s();
short nAction = pActor->nAction;
bool bVal = false;
Gravity(nSprite);
Gravity(pActor);
int nSeq = SeqOffsets[kSeqRoach] + RoachSeq[pActor->nAction].a;
pSprite->picnum = seq_GetSeqPicnum2(nSeq, pActor->nFrame);
seq_MoveSequence(nSprite, nSeq, pActor->nFrame);
seq_MoveSequence(pActor, nSeq, pActor->nFrame);
pActor->nFrame++;
if (pActor->nFrame >= SeqSize[nSeq])
@ -262,7 +218,7 @@ void AIRoach::Tick(RunListEvent* ev)
}
int nFlag = FrameFlag[SeqBase[nSeq] + pActor->nFrame];
short nTarget = pActor->nTarget;
auto pTarget = pActor->pTarget;
if (nAction > 5) {
return;
@ -285,15 +241,15 @@ void AIRoach::Tick(RunListEvent* ev)
}
}
if (((nRoach & 0xF) == (totalmoves & 0xF)) && nTarget < 0)
if (((pActor->nPhase & 0xF) == (totalmoves & 0xF)) && pTarget == nullptr)
{
short nTarget = FindPlayer(nSprite, 50);
if (nTarget >= 0)
auto pTarget = FindPlayer(pActor, 50);
if (pTarget)
{
pActor->nAction = 2;
pActor->nFrame = 0;
pActor->nTarget = nTarget;
GoRoach(nSprite);
pActor->pTarget = pTarget;
GoRoach(pSprite);
}
}
@ -303,15 +259,15 @@ void AIRoach::Tick(RunListEvent* ev)
case 1:
{
// partly the same as case 0.
if (((nRoach & 0xF) == (totalmoves & 0xF)) && nTarget < 0)
if (((pActor->nPhase & 0xF) == (totalmoves & 0xF)) && pTarget == nullptr)
{
short nTarget = FindPlayer(nSprite, 100);
if (nTarget >= 0)
auto pTarget = FindPlayer(pActor, 100);
if (pTarget)
{
pActor->nAction = 2;
pActor->nFrame = 0;
pActor->nTarget = nTarget;
GoRoach(nSprite);
pActor->pTarget = pTarget;
GoRoach(pSprite);
}
}
@ -320,17 +276,17 @@ void AIRoach::Tick(RunListEvent* ev)
case 2:
{
if ((totalmoves & 0xF) == (nRoach & 0xF))
if ((totalmoves & 0xF) == (pActor->nPhase & 0xF))
{
PlotCourseToSprite(nSprite, nTarget);
GoRoach(nSprite);
PlotCourseToSprite(pActor, pTarget);
GoRoach(pSprite);
}
int nMov = MoveCreatureWithCaution(nSprite);
auto nMov = MoveCreatureWithCaution(pActor);
if ((nMov & 0xC000) == 0xC000)
if (nMov.type == kHitSprite)
{
if ((nMov & 0x3FFF) == nTarget)
if (nMov.actor == pTarget)
{
// repeated below
pActor->nIndex = RandomSize(2) + 1;
@ -338,20 +294,20 @@ void AIRoach::Tick(RunListEvent* ev)
pSprite->xvel = 0;
pSprite->yvel = 0;
pSprite->ang = GetMyAngle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y);
pSprite->ang = GetMyAngle(pTarget->s().x - pSprite->x, pTarget->s().y - pSprite->y);
pActor->nFrame = 0;
}
else
{
pSprite->ang = (pSprite->ang + 256) & kAngleMask;
GoRoach(nSprite);
GoRoach(pSprite);
}
}
else if ((nMov & 0xC000) == 0x8000)
else if (nMov.type == kHitWall)
{
pSprite->ang = (pSprite->ang + 256) & kAngleMask;
GoRoach(nSprite);
GoRoach(pSprite);
}
else
{
@ -367,18 +323,18 @@ void AIRoach::Tick(RunListEvent* ev)
pSprite->xvel = 0;
pSprite->yvel = 0;
pSprite->ang = GetMyAngle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y);
pSprite->ang = GetMyAngle(pTarget->s().x - pSprite->x, pTarget->s().y - pSprite->y);
pActor->nFrame = 0;
}
}
if (nTarget != -1 && !(sprite[nTarget].cstat & 0x101))
if (pTarget && !(pTarget->s().cstat & 0x101))
{
pActor->nAction = 1;
pActor->nFrame = 0;
pActor->nCount = 100;
pActor->nTarget = -1;
pActor->pTarget = nullptr;
pSprite->xvel = 0;
pSprite->yvel = 0;
}
@ -394,7 +350,7 @@ void AIRoach::Tick(RunListEvent* ev)
if (pActor->nIndex <= 0)
{
pActor->nAction = 2;
GoRoach(nSprite);
GoRoach(pSprite);
pActor->nFrame = 0;
pActor->nCount = RandomSize(7);
}
@ -403,7 +359,7 @@ void AIRoach::Tick(RunListEvent* ev)
{
if (nFlag & 0x80)
{
BuildBullet(nSprite, 13, 0, 0, -1, pSprite->ang, nTarget + 10000, 1);
BuildBullet(pActor, 13, -1, pSprite->ang, pTarget, 1);
}
}

View file

@ -50,7 +50,6 @@ void SerializeView(FSerializer& arc);
void SerializeQueen(FSerializer& arc);
void SerializeRat(FSerializer& arc);
void SerializeRoach(FSerializer& arc);
void SerializeScorpion(FSerializer& arc);
void SerializeSet(FSerializer& arc);
void SerializeSpider(FSerializer& arc);
@ -82,7 +81,6 @@ void GameInterface::SerializeGameState(FSerializer& arc)
SerializeQueen(arc);
SerializeRat(arc);
SerializeRoach(arc);
SerializeScorpion(arc);
SerializeSet(arc);
SerializeSpider(arc);