mirror of
https://github.com/DrBeef/Raze.git
synced 2025-02-20 18:52:43 +00:00
- refactor Roach to use actors.
This commit is contained in:
parent
3a051b8acb
commit
937e71cfbb
8 changed files with 77 additions and 119 deletions
|
@ -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
|
||||
|
|
|
@ -81,6 +81,8 @@ enum ECounter
|
|||
kCountLion,
|
||||
kCountMummy,
|
||||
kCountRex,
|
||||
kCountRoach,
|
||||
kCountScorp,
|
||||
|
||||
kNumCounters
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue