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

View file

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

View file

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

View file

@ -374,7 +374,7 @@ void fxPrecache()
{ {
tilePrecacheTile(gFXData[i].textureID(), 0, 0); tilePrecacheTile(gFXData[i].textureID(), 0, 0);
if (gFXData[i].seq) 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 #endif
} }
assert(getSequence(pActor->seqStartID() + nDeathSeqID) != NULL); //assert(getSequence(pActor->seqStartID() + nDeathSeqID) != NULL);
seqSpawn(pActor->seqStartID() + nDeathSeqID, pPlayer->GetActor(), nKneelingPlayer); seqSpawn(pActor->seqStartName(), pActor->seqStartID() + nDeathSeqID, pPlayer->GetActor(), nKneelingPlayer);
return nDamage; return nDamage;
} }

View file

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

View file

@ -52,9 +52,9 @@ void Seq::Precache(int palette)
tilePrecacheTile(seqGetTexture(&frames[i]), -1, 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); if (pSeq) pSeq->Precache(palette);
} }
@ -506,21 +506,36 @@ static void ByteSwapSEQ(Seq* pSeq)
} }
FMemArena seqcache; FMemArena seqcache;
static TMap<int, Seq*> sequences; static TMap<int64_t, Seq*> sequences;
Seq* getSequence(int res_id) 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); auto p = sequences.CheckKey(res_id);
if (p != nullptr) return *p; 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) if (index < 0)
{ {
return nullptr; return nullptr;
} }
auto fr = fileSystem.OpenFileReader(index); auto fr = fileSystem.OpenFileReader(index);
auto seqdata = (Seq*)seqcache.Alloc(fr.GetLength()); auto seqdata = (Seq*)seqcache.Alloc(fr.GetLength());
fr.Read(seqdata, fr.GetLength()); fr.Read(seqdata, fr.GetLength());
sequences.Insert(res_id, seqdata); sequences.Insert(key, seqdata);
ByteSwapSEQ(seqdata); ByteSwapSEQ(seqdata);
return 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; if (pSequence == nullptr) return;
@ -551,6 +566,7 @@ void seqSpawn_(int nSeqID, int type, const EventObject& eob, VMFunction* callbac
pInst->pSequence = pSequence; pInst->pSequence = pSequence;
pInst->nSeqID = nSeqID; pInst->nSeqID = nSeqID;
pInst->nName = name;
pInst->callback = callback; pInst->callback = callback;
pInst->timeCounter = (short)pSequence->ticksPerFrame; pInst->timeCounter = (short)pSequence->ticksPerFrame;
pInst->frameIndex = 0; 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) 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) void seqSpawn(int nSeqID, int type, sectortype* sect, VMFunction* callback)
{ {
assert(type == SS_FLOOR || type == SS_CEILING); 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) void seqSpawn(int nSeqID, int type, walltype* wal, VMFunction* callback)
{ {
assert(type == SS_WALL || type == SS_MASKED); 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) arc("type", w.type)
("callback", w.callback) ("callback", w.callback)
("seqid", w.nSeqID) ("seqid", w.nSeqID)
("name", w.nName)
("timecounter", w.timeCounter) ("timecounter", w.timeCounter)
("frameindex", w.frameIndex) ("frameindex", w.frameIndex)
("target", w.target); ("target", w.target);
@ -715,7 +749,7 @@ void SerializeSequences(FSerializer& arc)
arc("sequences", activeList.list); arc("sequences", activeList.list);
if (arc.isReading()) for (unsigned i = 0; i < activeList.list.Size(); i++) 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; EventObject target;
int type; int type;
int nSeqID; int nSeqID; // only one of these two may be set
FName nName;
VMFunction* callback; VMFunction* callback;
int16_t timeCounter; int16_t timeCounter;
uint8_t frameIndex; uint8_t frameIndex;
void Update(); void Update();
}; };
inline int seqGetTile(SEQFRAME* pFrame)
{
return pFrame->tile + (pFrame->tile2 << 12);
}
inline FTextureID seqGetTexture(SEQFRAME* pFrame) inline FTextureID seqGetTexture(SEQFRAME* pFrame)
{ {
return tileGetTextureID(pFrame->tile + (pFrame->tile2 << 12)); return tileGetTextureID(pFrame->tile + (pFrame->tile2 << 12));
} }
int seqRegisterClient(void(*pClient)(int, int)); void seqPrecacheId(FName name, int id, int palette);
void seqPrecacheId(int id, int palette);
inline void seqPrecacheId(int id, int palette)
{
seqPrecacheId(NAME_None, id, palette);
}
SEQINST* GetInstance(int a1, EventObject& a2); SEQINST* GetInstance(int a1, EventObject& a2);
SEQINST* GetInstance(DBloodActor* actor); 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, walltype* a2, VMFunction* a4 = nullptr);
void seqSpawn(int a1, int ty, sectortype* 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(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, walltype* a2);
void seqKill(int a1, sectortype* a2); void seqKill(int a1, sectortype* a2);
void seqKill(DBloodActor* actor); void seqKill(DBloodActor* actor);
@ -117,7 +122,7 @@ int seqGetID(int a1, sectortype* a2);
int seqGetID(DBloodActor*); int seqGetID(DBloodActor*);
void seqProcess(int a1); void seqProcess(int a1);
Seq* getSequence(int res_id); Seq* getSequence(FName res_name, int res_id);
END_BLD_NS END_BLD_NS

View file

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

View file

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

View file

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