named sequences WIP.

This commit is contained in:
Christoph Oelckers 2023-10-10 22:51:08 +02:00
parent e0195ecab5
commit 142ca04d80
15 changed files with 189 additions and 146 deletions

View file

@ -836,9 +836,7 @@ static void actInitThings()
SEQINST* pInst = GetInstance(act);
if (pInst)
{
auto seq = getSequence(pInst->nSeqID);
if (!seq) break;
seqSpawn(pInst->nSeqID, act);
seqSpawn(pInst->nName, pInst->nSeqID, act);
}
break;
}
@ -893,7 +891,6 @@ static void actInitDudes()
if (!act->hasX()) continue;
int seqStartId = act->seqStartID();
if (!act->IsPlayerActor())
{
act->clipdist = act->fClipDist();
@ -906,7 +903,7 @@ static void actInitDudes()
act->xspr.health = act->startHealth() << 4;
}
if (getSequence(seqStartId)) seqSpawn(seqStartId, act);
seqSpawn(act->seqStartName(), act->seqStartID(), act);
}
aiInit();
}
@ -1083,7 +1080,7 @@ static void actNapalmMove(DBloodActor* actor)
auto pOwner = actor->GetOwner();
actPostSprite(actor, kStatDecoration);
seqSpawn(9, actor);
seqSpawn(NAME_None, 9, actor);
if (Chance(0x8000)) actor->spr.cstat |= CSTAT_SPRITE_XFLIP;
sfxPlay3DSound(actor, 303, 24 + (actor->spr.flags & 3), 1);
@ -1104,7 +1101,7 @@ static void actNapalmMove(DBloodActor* actor)
actor->spr.Angles.Yaw = (ang + rndang).Normalized360();
auto spawned = actFireThing(actor, 0., 0., -0.5774, kThingNapalmBall, t1);
spawned->SetOwner(actor->GetOwner());
seqSpawn(61, spawned, AF(NapalmSeqCallback));
seqSpawn(NAME_None, 61, spawned, AF(NapalmSeqCallback));
spawned->xspr.data4 = spawnparam[i];
}
}
@ -1147,7 +1144,7 @@ static bool actKillDudeStage1(DBloodActor* actor, DAMAGE_TYPE damageType)
break;
#endif
case kDudeCerberusTwoHead: // Cerberus
seqSpawn(actor->seqStartID() + 1, actor, nullptr);
seqSpawn(actor->seqStartName(), actor->seqStartID() + 1, actor, nullptr);
return true;
case kDudeCultistTommy:
@ -1330,12 +1327,12 @@ static void zombieAxeNormalDeath(DBloodActor* actor, int nSeq)
sfxPlay3DSound(actor, 1107 + Random(2), -1, 0);
if (nSeq == 2)
{
seqSpawn(actor->seqStartID() + nSeq, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor, AF(DudeToGibCallback1));
spawnGibs(actor, GIBTYPE_27, -0xccccc);
}
else if (nSeq == 1 && Chance(0x4000))
{
seqSpawn(actor->seqStartID() + 7, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 7, actor, AF(DudeToGibCallback1));
evPostActor(actor, 0, AF(fxZombieBloodSpurt));
sfxPlay3DSound(actor, 362, -1, 0);
actor->xspr.data1 = 35;
@ -1343,9 +1340,9 @@ static void zombieAxeNormalDeath(DBloodActor* actor, int nSeq)
spawnGibs(actor, GIBTYPE_27, -0x111111);
}
else if (nSeq == 14)seqSpawn(actor->seqStartID() + nSeq, actor, nullptr);
else if (nSeq == 3) seqSpawn(actor->seqStartID() + 13, actor, AF(DudeToGibCallback2));
else seqSpawn(actor->seqStartID() + nSeq, actor, AF(DudeToGibCallback1));
else if (nSeq == 14)seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor, nullptr);
else if (nSeq == 3) seqSpawn(actor->seqStartName(), actor->seqStartID() + 13, actor, AF(DudeToGibCallback2));
else seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor, AF(DudeToGibCallback1));
}
//---------------------------------------------------------------------------
@ -1363,10 +1360,10 @@ static void burningCultistDeath(DBloodActor* actor, int nSeq)
{
for (int i = 0; i < 3; i++)
GibSprite(actor, GIBTYPE_7, nullptr, nullptr);
seqSpawn(actor->seqStartID() + 16 - Random(1), actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 16 - Random(1), actor, AF(DudeToGibCallback1));
}
else
seqSpawn(actor->seqStartID() + 15, actor, AF(DudeToGibCallback2));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 15, actor, AF(DudeToGibCallback2));
}
//---------------------------------------------------------------------------
@ -1384,11 +1381,11 @@ void zombieAxeBurningDeath(DBloodActor* actor, int nSeq)
if (Chance(0x8000))
{
seqSpawn(actor->seqStartID() + 13, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 13, actor, AF(DudeToGibCallback1));
spawnGibs(actor, GIBTYPE_27, -0xccccc);
}
else
seqSpawn(actor->seqStartID() + 13, actor, AF(DudeToGibCallback2));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 13, actor, AF(DudeToGibCallback2));
}
//---------------------------------------------------------------------------
@ -1402,14 +1399,14 @@ static void zombieButcherDeath(DBloodActor* actor, int nSeq)
if (nSeq == 14)
{
sfxPlay3DSound(actor, 1206, -1, 0);
seqSpawn(actor->seqStartID() + 11, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + 11, actor);
return;
}
sfxPlay3DSound(actor, 1204 + Random(2), -1, 0);
if (nSeq == 3)
seqSpawn(actor->seqStartID() + 10, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + 10, actor);
else
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
}
//---------------------------------------------------------------------------
@ -1451,7 +1448,7 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
int nSeq = checkDamageType(actor, damageType);
if (!getSequence(actor->seqStartID() + nSeq))
if (!getSequence(actor->seqStartName(), actor->seqStartID() + nSeq))
{
seqKill(actor);
AddKill(killerActor, actor);
@ -1471,7 +1468,7 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
case kDudeCultistTesla:
case kDudeCultistTNT:
sfxPlay3DSound(actor, 1018 + Random(2), -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor, nSeq == 3 ? AF(DudeToGibCallback2) : AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor, nSeq == 3 ? AF(DudeToGibCallback2) : AF(DudeToGibCallback1));
break;
case kDudeBurningCultist:
@ -1502,7 +1499,7 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
case kDudeBurningInnocent:
damageType = kDamageExplode;
seqSpawn(actor->seqStartID() + 7, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 7, actor, AF(DudeToGibCallback1));
break;
case kDudeZombieButcher:
@ -1546,7 +1543,7 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
case kDudeSpiderMother:
sfxPlay3DSound(actor, 1850, -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
case kDudeGillBeast:
@ -1577,15 +1574,15 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
break;
case kDudeTentacleGreen:
sfxPlay3DSound(actor, damage == 5 ? 2471 : 2472, -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
case kDudePodFire:
sfxPlay3DSound(actor, damage == 5 ? 2451 : 2452, -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
case kDudeTentacleFire:
sfxPlay3DSound(actor, 2501, -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
}
break;
@ -1602,26 +1599,26 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag
case kDudeTchernobog:
sfxPlay3DSound(actor, 2380, -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
case kDudeBurningTinyCaleb:
damageType = kDamageExplode;
seqSpawn(actor->seqStartID() + 11, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 11, actor, AF(DudeToGibCallback1));
break;
case kDudeBeast:
sfxPlay3DSound(actor, 9000 + Random(2), -1, 0);
seqSpawn(actor->seqStartID() + nSeq, actor, nSeq == 3 ? AF(DudeToGibCallback2) : AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor, nSeq == 3 ? AF(DudeToGibCallback2) : AF(DudeToGibCallback1));
break;
case kDudeBurningBeast:
damageType = kDamageExplode;
seqSpawn(actor->seqStartID() + 12, actor, AF(DudeToGibCallback1));
seqSpawn(actor->seqStartName(), actor->seqStartID() + 12, actor, AF(DudeToGibCallback1));
break;
default:
seqSpawn(actor->seqStartID() + nSeq, actor);
seqSpawn(actor->seqStartName(), actor->seqStartID() + nSeq, actor);
break;
}
@ -1733,20 +1730,20 @@ static int actDamageThing(DBloodActor* source, DBloodActor* actor, int damage, D
}
break;
case kTrapMachinegun:
seqSpawn(28, actor);
seqSpawn(NAME_None, 28, actor);
break;
case kThingFluorescent:
seqSpawn(12, actor);
seqSpawn(NAME_None, 12, actor);
GibSprite(actor, GIBTYPE_6, nullptr, nullptr);
break;
case kThingSpiderWeb:
seqSpawn(15, actor);
seqSpawn(NAME_None, 15, actor);
break;
case kThingMetalGrate:
seqSpawn(21, actor);
seqSpawn(NAME_None, 21, actor);
GibSprite(actor, GIBTYPE_4, nullptr, nullptr);
break;
@ -1760,12 +1757,12 @@ static int actDamageThing(DBloodActor* source, DBloodActor* actor, int damage, D
break;
case 0:
seqSpawn(25, actor, AF(TreeToGibCallback));
seqSpawn(NAME_None, 25, actor, AF(TreeToGibCallback));
sfxPlay3DSound(actor, 351, -1, 0);
break;
case 1:
seqSpawn(26, actor, AF(TreeToGibCallback));
seqSpawn(NAME_None, 26, actor, AF(TreeToGibCallback));
sfxPlay3DSound(actor, 351, -1, 0);
break;
}
@ -1892,7 +1889,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
actPostSprite(missileActor, kStatDecoration);
if (missileActor->spr.Angles.Yaw == DAngle180) sfxPlay3DSound(missileActor, 307, -1, 0);
missileActor->ChangeType(kSpriteDecoration);
seqSpawn(9, missileActor);
seqSpawn(NAME_None, 9, missileActor);
}
else
{
@ -2060,7 +2057,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSectorSound(missileActor->spr.pos, 522, missileActor->sector());
actPostSprite(missileActor, kStatDebris);
seqSpawn(20, missileActor);
seqSpawn(NAME_None, 20, missileActor);
if (hitCode == 3 && actorHit && actorHit->hasX())
{
if (actorHit->spr.statnum == kStatDude)
@ -2075,7 +2072,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
actPostSprite(missileActor, kStatDebris);
missileActor->spr.cstat &= ~CSTAT_SPRITE_ALIGNMENT_WALL;
missileActor->ChangeType(kSpriteDecoration);
seqSpawn(20, missileActor);
seqSpawn(NAME_None, 20, missileActor);
if (hitCode == 3 && actorHit && actorHit->hasX())
{
if (actorHit->spr.statnum == kStatDude)
@ -3364,7 +3361,7 @@ void actExplodeSprite(DBloodActor* actor)
{
case kMissileFireballNapalm:
nType = kExplosionNapalm;
seqSpawn(4, actor);
seqSpawn(NAME_None, 4, actor);
if (Chance(0x8000)) actor->spr.cstat |= CSTAT_SPRITE_XFLIP;
sfxPlay3DSound(actor, 303, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
@ -3372,7 +3369,7 @@ void actExplodeSprite(DBloodActor* actor)
case kMissileFlareAlt:
nType = kExplosionFireball;
seqSpawn(9, actor);
seqSpawn(NAME_None, 9, actor);
if (Chance(0x8000)) actor->spr.cstat |= CSTAT_SPRITE_XFLIP;
sfxPlay3DSound(actor, 306, 24 + (actor->GetIndex() & 3), FX_GlobalChannel);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
@ -3381,7 +3378,7 @@ void actExplodeSprite(DBloodActor* actor)
case kMissileFireballCerberus:
case kMissileFireballTchernobog:
nType = kExplosionFireball;
seqSpawn(5, actor);
seqSpawn(NAME_None, 5, actor);
sfxPlay3DSound(actor, 304, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
break;
@ -3389,7 +3386,7 @@ void actExplodeSprite(DBloodActor* actor)
case kThingArmedTNTStick:
nType = kExplosionSmall;
if (actor->hit.florhit.type == kHitNone) seqSpawn(4, actor);
else seqSpawn(3, actor);
else seqSpawn(NAME_None, 3, actor);
sfxPlay3DSound(actor, 303, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
break;
@ -3401,16 +3398,16 @@ void actExplodeSprite(DBloodActor* actor)
case kModernThingTNTProx:
#endif
nType = kExplosionStandard;
if (actor->hit.florhit.type == kHitNone) seqSpawn(4, actor);
if (actor->hit.florhit.type == kHitNone) seqSpawn(NAME_None, 4, actor);
else
seqSpawn(3, actor);
seqSpawn(NAME_None, 3, actor);
sfxPlay3DSound(actor, 304, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
break;
case kThingArmedSpray:
nType = kExplosionSpray;
seqSpawn(5, actor);
seqSpawn(NAME_None, 5, actor);
sfxPlay3DSound(actor, 307, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
break;
@ -3427,7 +3424,7 @@ void actExplodeSprite(DBloodActor* actor)
else actPostSprite(actor, kStatFree);
nType = kExplosionLarge;
seqSpawn(4, spawned);
seqSpawn(NAME_None, 4, spawned);
actor = spawned;
sfxPlay3DSound(actor, 305, -1, 0);
@ -3461,13 +3458,13 @@ void actExplodeSprite(DBloodActor* actor)
if (tSnd > 0) nSnd = tSnd;
}
if (getSequence(nSeq)) seqSpawn(nSeq, actor);
seqSpawn(NAME_None, nSeq, actor);
sfxPlay3DSound(actor, nSnd, -1, 0);
break;
}
case kThingPodFireBall:
nType = kExplosionFireball;
seqSpawn(9, actor);
seqSpawn(NAME_None, 9, actor);
sfxPlay3DSound(actor, 307, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
fxSpawnPodStuff(actor, 240);
@ -3475,7 +3472,7 @@ void actExplodeSprite(DBloodActor* actor)
default:
nType = kExplosionStandard;
seqSpawn(4, actor);
seqSpawn(NAME_None, 4, actor);
if (Chance(0x8000)) actor->spr.cstat |= CSTAT_SPRITE_XFLIP;
sfxPlay3DSound(actor, 303, -1, 0);
GibSprite(actor, GIBTYPE_5, nullptr, nullptr);
@ -4218,8 +4215,7 @@ DBloodActor* actSpawnDude(DBloodActor* source, int nType, double dist)
spawned->clipdist = spawned->fClipDist();
spawned->xspr.health = spawned->startHealth() << 4;
spawned->xspr.respawn = 1;
if (getSequence(spawned->seqStartID()))
seqSpawn(spawned->seqStartID(), spawned);
seqSpawn(spawned->seqStartName(), spawned->seqStartID(), spawned);
#ifdef NOONE_EXTENSIONS
// add a way to inherit some values of spawner type 18 by dude.

View file

@ -81,12 +81,16 @@ void aiNewState(DBloodActor* actor, FState* pAIState)
actor->xspr.stateTimer = pAIState->Tics;
actor->xspr.aiState = pAIState;
int seqStartId = -1;
FName seqStartName = NAME_None;
switch (pAIState->StateFlags & STF_SPRITESEQMASK)
{
case STF_SPRITESEQNAME:
if (pAIState->sprite > 0)
I_Error("Named SEQs not supported yet!");
{
seqStartName = ENamedName(pAIState->sprite);
seqStartId = 0;
}
break;
case STF_SPRITESEQINDEX:
@ -100,8 +104,7 @@ void aiNewState(DBloodActor* actor, FState* pAIState)
if (seqStartId >= 0)
{
if (getSequence(seqStartId))
seqSpawn(seqStartId, actor, pAIState->ActionFunc);
seqSpawn(seqStartName, seqStartId, actor, pAIState->ActionFunc);
}
if (pAIState->EnterFunc)

View file

@ -62,7 +62,7 @@ void podAttack(DBloodActor* actor)
pMissile = actFireThing(actor, 0., -500., dv.Z / 32768 - 0.22125, kThingPodGreenBall, nDist * (2048. / 64800));
}
if (pMissile)
seqSpawn(68, pMissile);
seqSpawn(NAME_None, 68, pMissile);
break;
case kDudePodFire:
dv.Z += 31.25;
@ -72,7 +72,7 @@ void podAttack(DBloodActor* actor)
pMissile = actFireThing(actor, 0., -500., dv.Z / 32768 - 0.22125, kThingPodFireBall, nDist * (2048. / 64800));
}
if (pMissile)
seqSpawn(22, pMissile);
seqSpawn(NAME_None, 22, pMissile);
break;
}
for (int i = 0; i < 4; i++)

View file

@ -2617,10 +2617,10 @@ void modernCustomDudeDeath(DBloodActor* actor, int nSeq, int damageType)
{
GENDUDEEXTRA* pExtra = &actor->genDudeExtra;
if (pExtra->availDeaths[kDmgBurn] == 3) seqSpawn((15 + Random(2)) + actor->xspr.data2, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 2) seqSpawn(16 + actor->xspr.data2, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 1) seqSpawn(15 + actor->xspr.data2, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 2) seqSpawn(NAME_None, 16 + actor->xspr.data2, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 1) seqSpawn(NAME_None, 15 + actor->xspr.data2, actor, dudeToGib);
else if (getSequence(actor->xspr.data2 + nSeq))seqSpawn(nSeq + actor->xspr.data2, actor, dudeToGib);
else seqSpawn(1 + actor->xspr.data2, actor, dudeToGib);
else seqSpawn(NAME_None, 1 + actor->xspr.data2, actor, dudeToGib);
}
else
@ -2645,9 +2645,9 @@ void modernCustomDudeBurningDeath(DBloodActor* actor, int nSeq)
GENDUDEEXTRA* pExtra = &actor->genDudeExtra;
int seqofs = actor->xspr.data2;
if (pExtra->availDeaths[kDmgBurn] == 3) seqSpawn((15 + Random(2)) + seqofs, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 2) seqSpawn(16 + seqofs, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 1) seqSpawn(15 + seqofs, actor, dudeToGib);
else seqSpawn(1 + seqofs, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 2) seqSpawn(NAME_None, 16 + seqofs, actor, dudeToGib);
else if (pExtra->availDeaths[kDmgBurn] == 1) seqSpawn(NAME_None, 15 + seqofs, actor, dudeToGib);
else seqSpawn(NAME_None, 1 + seqofs, actor, dudeToGib);
}
@ -2669,7 +2669,7 @@ case kDudePodMother: // FakeDude type (no seq, custom flags, clipdist and cstat
/* onHit
case kModernThingThrowableRock:
seqSpawn(24, actor);
seqSpawn(NAME_None, 24, actor);
if (hit.type == kHitSprite)
{
self.scale = DVector2(0.5, 0.5);

View file

@ -205,6 +205,11 @@ public:
// dudeinfo helpers.
inline FName seqStartName() const
{
return NAME_None;
}
inline int seqStartID() const
{
return *(int*)(GetClass()->Meta + o_seqStartID);

View file

@ -292,8 +292,7 @@ void Respawn(DBloodActor* actor) // 9
switch (actor->GetType()) {
default:
actor->clipdist = actor->fClipDist();
if (getSequence(actor->seqStartID()))
seqSpawn(actor->seqStartID(), actor);
seqSpawn(actor->seqStartName(), actor->seqStartID(), actor);
break;
case kDudeModernCustom:
seqSpawn(genDudeSeqStartId(actor), actor);
@ -308,8 +307,7 @@ void Respawn(DBloodActor* actor) // 9
#else
actor->clipdist = actor->fClipDist();
actor->xspr.health = actor->startHealth() << 4;
if (getSequence(actor->seqStartID()))
seqSpawn(actor->seqStartID(), actor);
seqSpawn(actor->seqStartName(), actor->seqStartID(), actor);
#endif
aiInitSprite(actor);
actor->xspr.key = 0;

View file

@ -374,7 +374,7 @@ void fxPrecache()
{
tilePrecacheTile(gFXData[i].textureID(), 0, 0);
if (gFXData[i].seq)
seqPrecacheId(gFXData[i].seq, 0);
seqPrecacheId(NAME_None, gFXData[i].seq, 0);
}
}

View file

@ -2210,8 +2210,8 @@ int playerDamageSprite(DBloodActor* source, DBloodPlayer* pPlayer, DAMAGE_TYPE n
#endif
}
assert(getSequence(pActor->seqStartID() + nDeathSeqID) != NULL);
seqSpawn(pActor->seqStartID() + nDeathSeqID, pPlayer->GetActor(), nKneelingPlayer);
//assert(getSequence(pActor->seqStartID() + nDeathSeqID) != NULL);
seqSpawn(pActor->seqStartName(), pActor->seqStartID() + nDeathSeqID, pPlayer->GetActor(), nKneelingPlayer);
return nDamage;
}

View file

@ -78,44 +78,44 @@ void tilePrecacheTile(FTextureID nTex, int nType, int palette)
void PrecacheDude(DBloodActor* actor)
{
int palette = actor->spr.pal;
seqPrecacheId(actor->seqStartID(), palette);
seqPrecacheId(actor->seqStartID() + 5, palette);
seqPrecacheId(actor->seqStartID() + 1, palette);
seqPrecacheId(actor->seqStartID() + 2, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID(), palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 5, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 1, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 2, palette);
switch (actor->GetType())
{
case kDudeCultistTommy:
case kDudeCultistShotgun:
case kDudeCultistTesla:
case kDudeCultistTNT:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartID() + 13, palette);
seqPrecacheId(actor->seqStartID() + 14, palette);
seqPrecacheId(actor->seqStartID() + 15, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 13, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 14, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 15, palette);
break;
case kDudeZombieButcher:
case kDudeGillBeast:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartID() + 10, palette);
seqPrecacheId(actor->seqStartID() + 11, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 10, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 11, palette);
break;
case kDudeGargoyleStatueFlesh:
case kDudeGargoyleStatueStone:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 6, palette); //???
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); //???
[[fallthrough]];
case kDudeGargoyleFlesh:
case kDudeGargoyleStone:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette);
break;
case kDudePhantasm:
case kDudeHellHound:
@ -124,38 +124,38 @@ void PrecacheDude(DBloodActor* actor)
case kDudeSpiderBlack:
case kDudeSpiderMother:
case kDudeTchernobog:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette);
break;
case kDudeCerberusTwoHead:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
[[fallthrough]];
case kDudeHand:
case kDudeBoneEel:
case kDudeBat:
case kDudeRat:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
break;
case kDudeCultistBeast:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
break;
case kDudeZombieAxeBuried:
seqPrecacheId(actor->seqStartID() + 12, palette);
seqPrecacheId(actor->seqStartID() + 9, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 12, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette);
[[fallthrough]];
case kDudeZombieAxeLaying:
seqPrecacheId(actor->seqStartID() + 10, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 10, palette);
[[fallthrough]];
case kDudeZombieAxeNormal:
seqPrecacheId(actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartID() + 11, palette);
seqPrecacheId(actor->seqStartID() + 13, palette);
seqPrecacheId(actor->seqStartID() + 14, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 11, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 13, palette);
seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 14, palette);
break;
}
}

View file

@ -52,9 +52,9 @@ void Seq::Precache(int palette)
tilePrecacheTile(seqGetTexture(&frames[i]), -1, palette);
}
void seqPrecacheId(int id, int palette)
void seqPrecacheId(FName name, int id, int palette)
{
auto pSeq = getSequence(id);
auto pSeq = getSequence(name, id);
if (pSeq) pSeq->Precache(palette);
}
@ -506,21 +506,36 @@ static void ByteSwapSEQ(Seq* pSeq)
}
FMemArena seqcache;
static TMap<int, Seq*> sequences;
Seq* getSequence(int res_id)
static TMap<int64_t, Seq*> sequences;
Seq* getSequence(FName res_name, int res_id)
{
int64_t key = ((int64_t)res_name.GetIndex() << 32) | res_id;
auto p = sequences.CheckKey(res_id);
if (p != nullptr) return *p;
int index = fileSystem.FindResource(res_id, "SEQ");
int index;
if (res_name == NAME_None)
{
index = fileSystem.FindResource(res_id, "SEQ");
}
else
{
// named sequences are only read from the seq folder.
FString frame;
if (res_id > 0) frame.Format("@%d", res_id);
FStringf path("seq/%s%s.seq", res_name.GetChars(), frame.GetChars());
index = fileSystem.CheckNumForFullName(path.GetChars());
}
if (index < 0)
{
return nullptr;
}
auto fr = fileSystem.OpenFileReader(index);
auto seqdata = (Seq*)seqcache.Alloc(fr.GetLength());
fr.Read(seqdata, fr.GetLength());
sequences.Insert(res_id, seqdata);
sequences.Insert(key, seqdata);
ByteSwapSEQ(seqdata);
return seqdata;
}
@ -531,9 +546,9 @@ Seq* getSequence(int res_id)
//
//---------------------------------------------------------------------------
void seqSpawn_(int nSeqID, int type, const EventObject& eob, VMFunction* callback)
void seqSpawn_(FName name, int nSeqID, int type, const EventObject& eob, VMFunction* callback)
{
Seq* pSequence = getSequence(nSeqID);
Seq* pSequence = getSequence(name, nSeqID);
if (pSequence == nullptr) return;
@ -551,6 +566,7 @@ void seqSpawn_(int nSeqID, int type, const EventObject& eob, VMFunction* callbac
pInst->pSequence = pSequence;
pInst->nSeqID = nSeqID;
pInst->nName = name;
pInst->callback = callback;
pInst->timeCounter = (short)pSequence->ticksPerFrame;
pInst->frameIndex = 0;
@ -561,19 +577,36 @@ void seqSpawn_(int nSeqID, int type, const EventObject& eob, VMFunction* callbac
void seqSpawn(int nSeqID, DBloodActor* actor, VMFunction* callback)
{
seqSpawn_(nSeqID, SS_SPRITE, EventObject(actor), callback);
seqSpawn_(NAME_None, nSeqID, SS_SPRITE, EventObject(actor), callback);
}
void seqSpawn(int nSeqID, int type, sectortype* sect, VMFunction* callback)
{
assert(type == SS_FLOOR || type == SS_CEILING);
seqSpawn_(nSeqID, type, EventObject(sect), callback);
seqSpawn_(NAME_None, nSeqID, type, EventObject(sect), callback);
}
void seqSpawn(int nSeqID, int type, walltype* wal, VMFunction* callback)
{
assert(type == SS_WALL || type == SS_MASKED);
seqSpawn_(nSeqID, type, EventObject(wal), callback);
seqSpawn_(NAME_None, nSeqID, type, EventObject(wal), callback);
}
void seqSpawn(FName name, int nSeqID, DBloodActor* actor, VMFunction* callback)
{
seqSpawn_(name, nSeqID, SS_SPRITE, EventObject(actor), callback);
}
void seqSpawn(FName name, int nSeqID, int type, sectortype* sect, VMFunction* callback)
{
assert(type == SS_FLOOR || type == SS_CEILING);
seqSpawn_(name, nSeqID, type, EventObject(sect), callback);
}
void seqSpawn(FName name, int nSeqID, int type, walltype* wal, VMFunction* callback)
{
assert(type == SS_WALL || type == SS_MASKED);
seqSpawn_(name, nSeqID, type, EventObject(wal), callback);
}
//---------------------------------------------------------------------------
@ -701,6 +734,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, SEQINST& w, SEQINS
arc("type", w.type)
("callback", w.callback)
("seqid", w.nSeqID)
("name", w.nName)
("timecounter", w.timeCounter)
("frameindex", w.frameIndex)
("target", w.target);
@ -715,7 +749,7 @@ void SerializeSequences(FSerializer& arc)
arc("sequences", activeList.list);
if (arc.isReading()) for (unsigned i = 0; i < activeList.list.Size(); i++)
{
activeList.list[i].pSequence = getSequence(activeList.list[i].nSeqID);
activeList.list[i].pSequence = getSequence(activeList.list[i].nName, activeList.list[i].nSeqID);
}
}

View file

@ -79,32 +79,37 @@ struct SEQINST
EventObject target;
int type;
int nSeqID;
int nSeqID; // only one of these two may be set
FName nName;
VMFunction* callback;
int16_t timeCounter;
uint8_t frameIndex;
void Update();
};
inline int seqGetTile(SEQFRAME* pFrame)
{
return pFrame->tile + (pFrame->tile2 << 12);
}
inline FTextureID seqGetTexture(SEQFRAME* pFrame)
{
return tileGetTextureID(pFrame->tile + (pFrame->tile2 << 12));
}
int seqRegisterClient(void(*pClient)(int, int));
void seqPrecacheId(int id, int palette);
void seqPrecacheId(FName name, int id, int palette);
inline void seqPrecacheId(int id, int palette)
{
seqPrecacheId(NAME_None, id, palette);
}
SEQINST* GetInstance(int a1, EventObject& a2);
SEQINST* GetInstance(DBloodActor* actor);
void UnlockInstance(SEQINST* pInst);
void seqSpawn(int a1, int ty, walltype* a2, VMFunction* a4 = nullptr);
void seqSpawn(int a1, int ty, sectortype* a2, VMFunction* a4 = nullptr);
void seqSpawn(int a1, DBloodActor* actor, VMFunction* a4 = nullptr);
void seqSpawn(FName name, int nSeqID, DBloodActor* actor, VMFunction* callback = nullptr);
void seqSpawn(FName name, int nSeqID, int type, sectortype* sect, VMFunction* callback = nullptr);
void seqSpawn(FName name, int nSeqID, int type, walltype* wal, VMFunction* callback = nullptr);
void seqKill(int a1, walltype* a2);
void seqKill(int a1, sectortype* a2);
void seqKill(DBloodActor* actor);
@ -117,7 +122,7 @@ int seqGetID(int a1, sectortype* a2);
int seqGetID(DBloodActor*);
void seqProcess(int a1);
Seq* getSequence(int res_id);
Seq* getSequence(FName res_name, int res_id);
END_BLD_NS

View file

@ -350,11 +350,11 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) {
case kCmdOff:
if (!SetSpriteState(actor, 0, initiator)) break;
seqSpawn(40, actor);
seqSpawn(NAME_None, 40, actor);
break;
case kCmdOn:
if (!SetSpriteState(actor, 1, initiator)) break;
seqSpawn(38, actor, AF(MGunOpenSeqCallback));
seqSpawn(NAME_None, 38, actor, AF(MGunOpenSeqCallback));
if (actor->xspr.data1 > 0)
actor->xspr.data2 = actor->xspr.data1;
break;
@ -395,12 +395,12 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) {
case kCmdOff:
if (!SetSpriteState(actor, 0, initiator)) break;
seqSpawn(40, actor);
seqSpawn(NAME_None, 40, actor);
sfxKill3DSound(actor, 0, -1);
break;
case kCmdOn:
if (!SetSpriteState(actor, 1, initiator)) break;
seqSpawn(38, actor);
seqSpawn(NAME_None, 38, actor);
sfxPlay3DSound(actor, 441, 0, 0);
break;
}
@ -412,11 +412,11 @@ void OperateSprite(DBloodActor* actor, EVENT event)
break;
case kCmdOn:
if (!SetSpriteState(actor, 1, initiator)) break;
seqSpawn(37, actor);
seqSpawn(NAME_None, 37, actor);
break;
default:
SetSpriteState(actor, actor->xspr.state ^ 1, initiator);
if (actor->xspr.state) seqSpawn(37, actor);
if (actor->xspr.state) seqSpawn(NAME_None, 37, actor);
break;
}
break;
@ -2484,10 +2484,10 @@ void ActivateGenerator(DBloodActor* actor)
FireballTrapSeqCallback(actor);
break;
case 1:
seqSpawn(35, actor, AF(FireballTrapSeqCallback));
seqSpawn(NAME_None, 35, actor, AF(FireballTrapSeqCallback));
break;
case 2:
seqSpawn(36, actor, AF(FireballTrapSeqCallback));
seqSpawn(NAME_None, 36, actor, AF(FireballTrapSeqCallback));
break;
}
break;
@ -2546,7 +2546,7 @@ void MGunFireSeqCallback(DBloodActor* actor)
void MGunOpenSeqCallback(DBloodActor* actor)
{
seqSpawn(39, actor, AF(MGunFireSeqCallback));
seqSpawn(NAME_None, 39, actor, AF(MGunFireSeqCallback));
}

View file

@ -362,7 +362,7 @@ DEFINE_ACTION_FUNCTION(DBloodActor, seqSpawnID) // will be changed later.
PARAM_SELF_PROLOGUE(DBloodActor);
PARAM_INT(seqid);
PARAM_POINTER(cbid, VMFunction);
seqSpawn(seqid, self, cbid);
seqSpawn(NAME_None, seqid, self, cbid);
return 0;
}

View file

@ -1948,7 +1948,7 @@ void AltFireNapalm(int, DBloodPlayer* pPlayer)
{
missile->xspr.data4 = ClipHigh(pPlayer->ammoCount[4], 12);
UseAmmo(pPlayer, 4, missile->xspr.data4);
seqSpawn(22, missile);
seqSpawn(NAME_None, 22, missile);
actBurnSprite(pPlayer->GetActor(), missile, 600);
evPostActor(missile, 0, AF(fxFlameLick));
sfxPlay3DSound(missile, 480, 2, 0);

View file

@ -1,5 +1,6 @@
class BloodDudeBase : Bloodactor
{
meta Name seqStartName;
meta int seqStartID;
meta int starthealth;
meta int eyeHeight;
@ -23,6 +24,7 @@ class BloodDudeBase : Bloodactor
meta Sound explodeSound;
property prefix: none;
property seqStartName: seqStartName;
property seqStartID: seqStartID;
property health: startHealth;
property mass: mass;