mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-14 11:50:49 +00:00
- Exhumed: Queen
This commit is contained in:
parent
026d355096
commit
531d7c96b4
2 changed files with 125 additions and 80 deletions
|
@ -70,19 +70,6 @@ static actionSeq EggSeq[] = {
|
||||||
{23, 1},
|
{23, 1},
|
||||||
};
|
};
|
||||||
|
|
||||||
int nQHead = 0;
|
|
||||||
|
|
||||||
short nEggsFree;
|
|
||||||
short nHeadVel;
|
|
||||||
short nVelShift;
|
|
||||||
|
|
||||||
short tailspr[kMaxTails];
|
|
||||||
short nEggFree[kMaxEggs];
|
|
||||||
|
|
||||||
short QueenChan[kMaxQueens];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Queen
|
struct Queen
|
||||||
{
|
{
|
||||||
short nHealth;
|
short nHealth;
|
||||||
|
@ -92,7 +79,6 @@ struct Queen
|
||||||
short nTarget;
|
short nTarget;
|
||||||
short field_A;
|
short field_A;
|
||||||
short field_C;
|
short field_C;
|
||||||
short pad;
|
|
||||||
short field_10;
|
short field_10;
|
||||||
short field_12;
|
short field_12;
|
||||||
};
|
};
|
||||||
|
@ -100,7 +86,7 @@ struct Queen
|
||||||
struct Egg
|
struct Egg
|
||||||
{
|
{
|
||||||
short nHealth;
|
short nHealth;
|
||||||
short field_2;
|
short nFrame;
|
||||||
short nAction;
|
short nAction;
|
||||||
short nSprite;
|
short nSprite;
|
||||||
short field_8;
|
short field_8;
|
||||||
|
@ -112,16 +98,26 @@ struct Egg
|
||||||
struct Head
|
struct Head
|
||||||
{
|
{
|
||||||
short nHealth;
|
short nHealth;
|
||||||
short field_2;
|
short nFrame;
|
||||||
short nAction;
|
short nAction;
|
||||||
short nSprite;
|
short nSprite;
|
||||||
short field_8;
|
short field_8;
|
||||||
short nTarget;
|
short nTarget;
|
||||||
short field_C;
|
short field_C;
|
||||||
short field_E;
|
short tails;
|
||||||
};
|
};
|
||||||
|
|
||||||
Egg QueenEgg[kMaxEggs];
|
FreeListArray<Egg, kMaxEggs> QueenEgg;
|
||||||
|
|
||||||
|
int nQHead = 0;
|
||||||
|
|
||||||
|
short nHeadVel;
|
||||||
|
short nVelShift;
|
||||||
|
|
||||||
|
short tailspr[kMaxTails];
|
||||||
|
|
||||||
|
short QueenChan[kMaxQueens];
|
||||||
|
|
||||||
Queen QueenList[kMaxQueens];
|
Queen QueenList[kMaxQueens];
|
||||||
Head QueenHead;
|
Head QueenHead;
|
||||||
|
|
||||||
|
@ -131,49 +127,98 @@ int MoveQZ[25];
|
||||||
short MoveQS[25];
|
short MoveQS[25];
|
||||||
short MoveQA[25];
|
short MoveQA[25];
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, Queen& w, Queen* def)
|
||||||
|
{
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("health", w.nHealth)
|
||||||
|
("frame", w.nFrame)
|
||||||
|
("action", w.nAction)
|
||||||
|
("sprite", w.nSprite)
|
||||||
|
("target", w.nTarget)
|
||||||
|
("ata", w.field_A)
|
||||||
|
("atc", w.field_C)
|
||||||
|
("at10", w.field_10)
|
||||||
|
("at12", w.field_12)
|
||||||
|
.EndObject();
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, Egg& w, Egg* def)
|
||||||
|
{
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("health", w.nHealth)
|
||||||
|
("frame", w.nFrame)
|
||||||
|
("action", w.nAction)
|
||||||
|
("sprite", w.nSprite)
|
||||||
|
("target", w.nTarget)
|
||||||
|
("at8", w.field_8)
|
||||||
|
("atc", w.field_C)
|
||||||
|
("ate", w.field_E)
|
||||||
|
.EndObject();
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
static SavegameHelper sghqueen("queen",
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, Head& w, Head* def)
|
||||||
SV(QueenCount),
|
{
|
||||||
SV(nQHead),
|
if (arc.BeginObject(keyname))
|
||||||
SV(nEggsFree),
|
{
|
||||||
SV(nHeadVel),
|
arc("health", w.nHealth)
|
||||||
SV(nVelShift),
|
("frame", w.nFrame)
|
||||||
SV(QueenHead),
|
("action", w.nAction)
|
||||||
SA(tailspr),
|
("sprite", w.nSprite)
|
||||||
SA(nEggFree),
|
("target", w.nTarget)
|
||||||
SA(QueenChan),
|
("at8", w.field_8)
|
||||||
SA(QueenEgg),
|
("atc", w.field_C)
|
||||||
SA(QueenList),
|
("tails", w.tails)
|
||||||
SA(MoveQX),
|
.EndObject();
|
||||||
SA(MoveQY),
|
}
|
||||||
SA(MoveQZ),
|
return arc;
|
||||||
SA(MoveQS),
|
}
|
||||||
SA(MoveQA),
|
|
||||||
nullptr);
|
|
||||||
|
|
||||||
|
void SerializeQueen(FSerializer& arc)
|
||||||
|
{
|
||||||
|
if (arc.BeginObject("queen"))
|
||||||
|
{
|
||||||
|
arc("count", QueenCount);
|
||||||
|
if (QueenCount == 0) // only save the rest if we got a queen. There can only be one.
|
||||||
|
{
|
||||||
|
arc("qhead", nQHead)
|
||||||
|
("headvel", nHeadVel)
|
||||||
|
("velshift", nVelShift)
|
||||||
|
("head", QueenHead)
|
||||||
|
.Array("tailspr", tailspr, countof(tailspr))
|
||||||
|
("queenchan", QueenChan[0])
|
||||||
|
("queen", QueenList[0])
|
||||||
|
("eggs", QueenEgg)
|
||||||
|
.Array("moveqx", MoveQX, countof(MoveQX))
|
||||||
|
.Array("moveqy", MoveQY, countof(MoveQY))
|
||||||
|
.Array("moveqz", MoveQZ, countof(MoveQZ))
|
||||||
|
.Array("moveqa", MoveQA, countof(MoveQA))
|
||||||
|
.Array("moveqs", MoveQS, countof(MoveQS));
|
||||||
|
}
|
||||||
|
arc.EndObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void InitQueens()
|
void InitQueens()
|
||||||
{
|
{
|
||||||
QueenCount = 1;
|
QueenCount = 1;
|
||||||
|
QueenEgg.Clear();
|
||||||
for (int i = 0; i < kMaxEggs; i++)
|
for (int i = 0; i < kMaxEggs; i++)
|
||||||
{
|
{
|
||||||
nEggFree[i] = i;
|
|
||||||
QueenEgg[i].field_8 = -1;
|
QueenEgg[i].field_8 = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
nEggsFree = kMaxEggs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GrabEgg()
|
int GrabEgg()
|
||||||
{
|
{
|
||||||
if (!nEggsFree) {
|
auto egg = QueenEgg.Get();
|
||||||
return -1;
|
if (egg == -1) return -1;
|
||||||
}
|
return egg;
|
||||||
|
|
||||||
nEggsFree--;
|
|
||||||
return nEggFree[nEggsFree];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlowChunks(int nSprite)
|
void BlowChunks(int nSprite)
|
||||||
|
@ -207,9 +252,7 @@ void DestroyEgg(short nEgg)
|
||||||
QueenEgg[nEgg].field_8 = -1;
|
QueenEgg[nEgg].field_8 = -1;
|
||||||
|
|
||||||
mydeletesprite(nSprite);
|
mydeletesprite(nSprite);
|
||||||
|
QueenEgg.Release(nEgg);
|
||||||
nEggFree[nEggsFree] = nEgg;
|
|
||||||
nEggsFree++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DestroyAllEggs()
|
void DestroyAllEggs()
|
||||||
|
@ -313,11 +356,11 @@ int QueenAngleChase(short nSprite, short nSprite2, int val1, int val2)
|
||||||
|
|
||||||
int DestroyTailPart()
|
int DestroyTailPart()
|
||||||
{
|
{
|
||||||
if (!QueenHead.field_E) {
|
if (!QueenHead.tails) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
short nSprite = tailspr[--QueenHead.field_E];
|
short nSprite = tailspr[--QueenHead.tails];
|
||||||
|
|
||||||
BlowChunks(nSprite);
|
BlowChunks(nSprite);
|
||||||
BuildExplosion(nSprite);
|
BuildExplosion(nSprite);
|
||||||
|
@ -380,7 +423,7 @@ void BuildTail()
|
||||||
}
|
}
|
||||||
|
|
||||||
nQHead = 0;
|
nQHead = 0;
|
||||||
QueenHead.field_E = 7;
|
QueenHead.tails = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BuildQueenEgg(short nQueen, int nVal)
|
int BuildQueenEgg(short nQueen, int nVal)
|
||||||
|
@ -438,7 +481,7 @@ int BuildQueenEgg(short nQueen, int nVal)
|
||||||
GrabTimeSlot(3);
|
GrabTimeSlot(3);
|
||||||
|
|
||||||
QueenEgg[nEgg].nHealth = 200;
|
QueenEgg[nEgg].nHealth = 200;
|
||||||
QueenEgg[nEgg].field_2 = 0;
|
QueenEgg[nEgg].nFrame = 0;
|
||||||
QueenEgg[nEgg].nSprite = nSprite2;
|
QueenEgg[nEgg].nSprite = nSprite2;
|
||||||
QueenEgg[nEgg].field_E = nVal;
|
QueenEgg[nEgg].field_E = nVal;
|
||||||
QueenEgg[nEgg].nTarget = QueenList[nQueen].nTarget;
|
QueenEgg[nEgg].nTarget = QueenList[nQueen].nTarget;
|
||||||
|
@ -493,16 +536,16 @@ void FuncQueenEgg(int a, int nDamage, int nRun)
|
||||||
|
|
||||||
short nSeq = SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a;
|
short nSeq = SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a;
|
||||||
|
|
||||||
sprite[nSprite].picnum = seq_GetSeqPicnum2(nSeq, pEgg->field_2);
|
sprite[nSprite].picnum = seq_GetSeqPicnum2(nSeq, pEgg->nFrame);
|
||||||
|
|
||||||
if (nAction != 4)
|
if (nAction != 4)
|
||||||
{
|
{
|
||||||
seq_MoveSequence(nSprite, nSeq, pEgg->field_2);
|
seq_MoveSequence(nSprite, nSeq, pEgg->nFrame);
|
||||||
|
|
||||||
pEgg->field_2++;
|
pEgg->nFrame++;
|
||||||
if (pEgg->field_2 >= SeqSize[nSeq])
|
if (pEgg->nFrame >= SeqSize[nSeq])
|
||||||
{
|
{
|
||||||
pEgg->field_2 = 0;
|
pEgg->nFrame = 0;
|
||||||
bVal = true;
|
bVal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,7 +578,7 @@ void FuncQueenEgg(int a, int nDamage, int nRun)
|
||||||
if (!RandomSize(1))
|
if (!RandomSize(1))
|
||||||
{
|
{
|
||||||
pEgg->nAction = 1;
|
pEgg->nAction = 1;
|
||||||
pEgg->field_2 = 0;
|
pEgg->nFrame = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -653,7 +696,7 @@ void FuncQueenEgg(int a, int nDamage, int nRun)
|
||||||
|
|
||||||
case 0x90000:
|
case 0x90000:
|
||||||
{
|
{
|
||||||
seq_PlotSequence(a & 0xFFFF, SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a, pEgg->field_2, EggSeq[nAction].b);
|
seq_PlotSequence(a & 0xFFFF, SeqOffsets[kSeqQueenEgg] + EggSeq[nAction].a, pEgg->nFrame, EggSeq[nAction].b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -699,14 +742,14 @@ int BuildQueenHead(short nQueen)
|
||||||
QueenHead.nHealth = 800;
|
QueenHead.nHealth = 800;
|
||||||
QueenHead.nAction = 0;
|
QueenHead.nAction = 0;
|
||||||
QueenHead.nTarget = QueenList[nQueen].nTarget;
|
QueenHead.nTarget = QueenList[nQueen].nTarget;
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
QueenHead.nSprite = nSprite2;
|
QueenHead.nSprite = nSprite2;
|
||||||
QueenHead.field_C = 0;
|
QueenHead.field_C = 0;
|
||||||
|
|
||||||
sprite[nSprite2].owner = runlist_AddRunRec(sprite[nSprite2].lotag - 1, 0x1B0000);
|
sprite[nSprite2].owner = runlist_AddRunRec(sprite[nSprite2].lotag - 1, 0x1B0000);
|
||||||
|
|
||||||
QueenHead.field_8 = runlist_AddRunRec(NewRun, 0x1B0000);
|
QueenHead.field_8 = runlist_AddRunRec(NewRun, 0x1B0000);
|
||||||
QueenHead.field_E = 0;
|
QueenHead.tails = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -737,14 +780,14 @@ void FuncQueenHead(int a, int nDamage, int nRun)
|
||||||
|
|
||||||
short nSeq = SeqOffsets[kSeqQueen] + HeadSeq[QueenHead.nAction].a;
|
short nSeq = SeqOffsets[kSeqQueen] + HeadSeq[QueenHead.nAction].a;
|
||||||
|
|
||||||
seq_MoveSequence(nSprite, nSeq, QueenHead.field_2);
|
seq_MoveSequence(nSprite, nSeq, QueenHead.nFrame);
|
||||||
|
|
||||||
sprite[nSprite].picnum = seq_GetSeqPicnum2(nSeq, QueenHead.field_2);
|
sprite[nSprite].picnum = seq_GetSeqPicnum2(nSeq, QueenHead.nFrame);
|
||||||
|
|
||||||
QueenHead.field_2++;
|
QueenHead.nFrame++;
|
||||||
if (QueenHead.field_2 >= SeqSize[nSeq])
|
if (QueenHead.nFrame >= SeqSize[nSeq])
|
||||||
{
|
{
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
var_14 = 1;
|
var_14 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -837,7 +880,7 @@ void FuncQueenHead(int a, int nDamage, int nRun)
|
||||||
if (var_14)
|
if (var_14)
|
||||||
{
|
{
|
||||||
QueenHead.nAction = 1;
|
QueenHead.nAction = 1;
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fallthrough__;
|
fallthrough__;
|
||||||
|
@ -846,7 +889,7 @@ void FuncQueenHead(int a, int nDamage, int nRun)
|
||||||
if ((sprite[nTarget].z - 51200) > sprite[nSprite].z)
|
if ((sprite[nTarget].z - 51200) > sprite[nSprite].z)
|
||||||
{
|
{
|
||||||
QueenHead.nAction = 4;
|
QueenHead.nAction = 4;
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -912,7 +955,7 @@ __MOVEQS:
|
||||||
|
|
||||||
nHd = nQHead;
|
nHd = nQHead;
|
||||||
|
|
||||||
for (int i = 0; i < QueenHead.field_E; i++)
|
for (int i = 0; i < QueenHead.tails; i++)
|
||||||
{
|
{
|
||||||
nHd -= 3;
|
nHd -= 3;
|
||||||
if (nHd < 0) {
|
if (nHd < 0) {
|
||||||
|
@ -949,9 +992,9 @@ __MOVEQS:
|
||||||
{
|
{
|
||||||
QueenHead.field_C = 3;
|
QueenHead.field_C = 3;
|
||||||
|
|
||||||
if (QueenHead.field_E--)
|
if (QueenHead.tails--)
|
||||||
{
|
{
|
||||||
if (QueenHead.field_E >= 15 || QueenHead.field_E < 10)
|
if (QueenHead.tails >= 15 || QueenHead.tails < 10)
|
||||||
{
|
{
|
||||||
int x = sprite[nSprite].x;
|
int x = sprite[nSprite].x;
|
||||||
int y = sprite[nSprite].y;
|
int y = sprite[nSprite].y;
|
||||||
|
@ -959,8 +1002,8 @@ __MOVEQS:
|
||||||
short nSector = sprite[nSprite].sectnum;
|
short nSector = sprite[nSprite].sectnum;
|
||||||
int nAngle = RandomSize(11) & kAngleMask;
|
int nAngle = RandomSize(11) & kAngleMask;
|
||||||
|
|
||||||
sprite[nSprite].xrepeat = 127 - QueenHead.field_E;
|
sprite[nSprite].xrepeat = 127 - QueenHead.tails;
|
||||||
sprite[nSprite].yrepeat = 127 - QueenHead.field_E;
|
sprite[nSprite].yrepeat = 127 - QueenHead.tails;
|
||||||
|
|
||||||
sprite[nSprite].cstat = 0x8000;
|
sprite[nSprite].cstat = 0x8000;
|
||||||
|
|
||||||
|
@ -981,8 +1024,8 @@ __MOVEQS:
|
||||||
sprite[nSprite].y = y;
|
sprite[nSprite].y = y;
|
||||||
sprite[nSprite].z = z;
|
sprite[nSprite].z = z;
|
||||||
|
|
||||||
if (QueenHead.field_E < 10) {
|
if (QueenHead.tails < 10) {
|
||||||
for (int i = (10 - QueenHead.field_E) * 2; i > 0; i--)
|
for (int i = (10 - QueenHead.tails) * 2; i > 0; i--)
|
||||||
{
|
{
|
||||||
BuildLavaLimb(nSprite, i, GetSpriteHeight(nSprite));
|
BuildLavaLimb(nSprite, i, GetSpriteHeight(nSprite));
|
||||||
}
|
}
|
||||||
|
@ -1037,7 +1080,7 @@ __MOVEQS:
|
||||||
{
|
{
|
||||||
QueenHead.nTarget = a & 0xFFFF;
|
QueenHead.nTarget = a & 0xFFFF;
|
||||||
QueenHead.nAction = 7;
|
QueenHead.nAction = 7;
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QueenHead.nHealth <= 0)
|
if (QueenHead.nHealth <= 0)
|
||||||
|
@ -1050,9 +1093,9 @@ __MOVEQS:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QueenHead.nAction = 5;
|
QueenHead.nAction = 5;
|
||||||
QueenHead.field_2 = 0;
|
QueenHead.nFrame = 0;
|
||||||
QueenHead.field_C = 0;
|
QueenHead.field_C = 0;
|
||||||
QueenHead.field_E = 80;
|
QueenHead.tails = 80;
|
||||||
sprite[nSprite].cstat = 0;
|
sprite[nSprite].cstat = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1076,7 +1119,7 @@ __MOVEQS:
|
||||||
nSeq += 73;
|
nSeq += 73;
|
||||||
}
|
}
|
||||||
|
|
||||||
seq_PlotSequence(a & 0xFFFF, nSeq, QueenHead.field_2, edx);
|
seq_PlotSequence(a & 0xFFFF, nSeq, QueenHead.nFrame, edx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ void SerializeFish(FSerializer& arc);
|
||||||
void SerializeLavadude(FSerializer& arc);
|
void SerializeLavadude(FSerializer& arc);
|
||||||
void SerializeLion(FSerializer& arc);
|
void SerializeLion(FSerializer& arc);
|
||||||
void SerializeMummy(FSerializer& arc);
|
void SerializeMummy(FSerializer& arc);
|
||||||
|
void SerializeQueen(FSerializer& arc);
|
||||||
void SerializeRat(FSerializer& arc);
|
void SerializeRat(FSerializer& arc);
|
||||||
void SerializeRex(FSerializer& arc);
|
void SerializeRex(FSerializer& arc);
|
||||||
void SerializeRoach(FSerializer& arc);
|
void SerializeRoach(FSerializer& arc);
|
||||||
|
@ -79,6 +80,7 @@ void GameInterface::SerializeGameState(FSerializer& arc)
|
||||||
SerializeLavadude(arc);
|
SerializeLavadude(arc);
|
||||||
SerializeLion(arc);
|
SerializeLion(arc);
|
||||||
SerializeMummy(arc);
|
SerializeMummy(arc);
|
||||||
|
SerializeQueen(arc);
|
||||||
SerializeRat(arc);
|
SerializeRat(arc);
|
||||||
SerializeRex(arc);
|
SerializeRex(arc);
|
||||||
SerializeRoach(arc);
|
SerializeRoach(arc);
|
||||||
|
|
Loading…
Reference in a new issue