mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-27 13:50:49 +00:00
named sequences WIP.
This commit is contained in:
parent
e0195ecab5
commit
142ca04d80
15 changed files with 189 additions and 146 deletions
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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++)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue