WIP for event callback refactor

This commit is contained in:
Christoph Oelckers 2023-10-05 16:50:46 +02:00
parent d86e99a2e1
commit 47f09c61fc
19 changed files with 400 additions and 526 deletions

View file

@ -2190,7 +2190,7 @@ static void zombieAxeNormalDeath(DBloodActor* actor, int nSeq)
else if (nSeq == 1 && Chance(0x4000)) else if (nSeq == 1 && Chance(0x4000))
{ {
seqSpawn(pDudeInfo->seqStartID + 7, actor, nDudeToGibClient1); seqSpawn(pDudeInfo->seqStartID + 7, actor, nDudeToGibClient1);
evPostActor(actor, 0, kCallbackFXZombieSpurt); evPostActor(actor, 0, AF(fxZombieBloodSpurt));
sfxPlay3DSound(actor, 362, -1, 0); sfxPlay3DSound(actor, 362, -1, 0);
actor->xspr.data1 = 35; actor->xspr.data1 = 35;
actor->xspr.data2 = 5; actor->xspr.data2 = 5;
@ -2823,7 +2823,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (hitCode == 3 && actorHit && (pThingInfo || pDudeInfo)) if (hitCode == 3 && actorHit && (pThingInfo || pDudeInfo))
{ {
if (pThingInfo && actorHit->GetType() == kThingTNTBarrel && actorHit->xspr.burnTime == 0) if (pThingInfo && actorHit->GetType() == kThingTNTBarrel && actorHit->xspr.burnTime == 0)
evPostActor(actorHit, 0, kCallbackFXFlameLick); evPostActor(actorHit, 0, AF(fxFlameLick));
int nDamage = (50 + Random(50)) << 4; int nDamage = (50 + Random(50)) << 4;
actDamageSprite(missileOwner, actorHit, kDamageBullet, nDamage); actDamageSprite(missileOwner, actorHit, kDamageBullet, nDamage);
@ -2843,7 +2843,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if ((pThingInfo && pThingInfo->dmgControl[kDamageBurn] != 0) || (pDudeInfo && pDudeInfo->damageVal[kDamageBurn] != 0)) if ((pThingInfo && pThingInfo->dmgControl[kDamageBurn] != 0) || (pDudeInfo && pDudeInfo->damageVal[kDamageBurn] != 0))
{ {
if (pThingInfo && actorHit->GetType() == kThingTNTBarrel && actorHit->xspr.burnTime == 0) if (pThingInfo && actorHit->GetType() == kThingTNTBarrel && actorHit->xspr.burnTime == 0)
evPostActor(actorHit, 0, kCallbackFXFlameLick); evPostActor(actorHit, 0, AF(fxFlameLick));
actBurnSprite(missileOwner, actorHit, 480); actBurnSprite(missileOwner, actorHit, 480);
actRadiusDamage(missileOwner, missileActor->spr.pos, missileActor->sector(), 16, 20, 10, kDamageBullet, 6, 480); actRadiusDamage(missileOwner, missileActor->spr.pos, missileActor->sector(), 16, 20, 10, kDamageBullet, 6, 480);
@ -2882,7 +2882,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (hitCode == 3 && actorHit && actorHit->hasX()) if (hitCode == 3 && actorHit && actorHit->hasX())
{ {
if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0) if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0)
evPostActor(actorHit, 0, kCallbackFXFlameLick); evPostActor(actorHit, 0, AF(fxFlameLick));
actBurnSprite(missileOwner, actorHit, (4 + gGameOptions.nDifficulty) << 2); actBurnSprite(missileOwner, actorHit, (4 + gGameOptions.nDifficulty) << 2);
actDamageSprite(missileOwner, actorHit, kDamageBurn, 8); actDamageSprite(missileOwner, actorHit, kDamageBurn, 8);
@ -2894,7 +2894,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (hitCode == 3 && actorHit && actorHit->hasX()) if (hitCode == 3 && actorHit && actorHit->hasX())
{ {
if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0) if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0)
evPostActor(actorHit, 0, kCallbackFXFlameLick); evPostActor(actorHit, 0, AF(fxFlameLick));
actBurnSprite(missileOwner, actorHit, (4 + gGameOptions.nDifficulty) << 2); actBurnSprite(missileOwner, actorHit, (4 + gGameOptions.nDifficulty) << 2);
actDamageSprite(missileOwner, actorHit, kDamageBurn, 8); actDamageSprite(missileOwner, actorHit, kDamageBurn, 8);
@ -2909,7 +2909,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (hitCode == 3 && actorHit && actorHit->hasX()) if (hitCode == 3 && actorHit && actorHit->hasX())
{ {
if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0) if ((actorHit->spr.statnum == kStatThing || actorHit->spr.statnum == kStatDude) && actorHit->xspr.burnTime == 0)
evPostActor(actorHit, 0, kCallbackFXFlameLick); evPostActor(actorHit, 0, AF(fxFlameLick));
actBurnSprite(missileOwner, actorHit, 32); actBurnSprite(missileOwner, actorHit, 32);
actDamageSprite(missileOwner, actorHit, kDamageSpirit, 12); actDamageSprite(missileOwner, actorHit, kDamageSpirit, 12);
@ -3871,7 +3871,7 @@ void MoveDude(DBloodActor* actor)
pPlayer->posture = 1; pPlayer->posture = 1;
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
pPlayer->bubbleTime = int(abs(actor->vel.Z * 16)); pPlayer->bubbleTime = int(abs(actor->vel.Z * 16));
evPostActor(actor, 0, kCallbackPlayerBubble); evPostActor(actor, 0, AF(PlayerBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
} }
else else
@ -3881,7 +3881,7 @@ void MoveDude(DBloodActor* actor)
case kDudeCultistTommy: case kDudeCultistTommy:
case kDudeCultistShotgun: case kDudeCultistShotgun:
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
aiNewState(actor, &cultistSwimGoto); aiNewState(actor, &cultistSwimGoto);
break; break;
@ -3895,26 +3895,26 @@ void MoveDude(DBloodActor* actor)
if (fixRandomCultist) // fix burning cultists randomly switching types underwater if (fixRandomCultist) // fix burning cultists randomly switching types underwater
actor->ChangeType(actor->spr.inittype); // restore back to spawned cultist type actor->ChangeType(actor->spr.inittype); // restore back to spawned cultist type
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
aiNewState(actor, &cultistSwimGoto); aiNewState(actor, &cultistSwimGoto);
break; break;
} }
case kDudeZombieAxeNormal: case kDudeZombieAxeNormal:
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
aiNewState(actor, &zombieAGoto); aiNewState(actor, &zombieAGoto);
break; break;
case kDudeZombieButcher: case kDudeZombieButcher:
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
aiNewState(actor, &zombieFGoto); aiNewState(actor, &zombieFGoto);
break; break;
case kDudeGillBeast: case kDudeGillBeast:
actor->xspr.burnTime = 0; actor->xspr.burnTime = 0;
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
sfxPlay3DSound(actor, 720, -1, 0); sfxPlay3DSound(actor, 720, -1, 0);
aiNewState(actor, &gillBeastSwimGoto); aiNewState(actor, &gillBeastSwimGoto);
@ -3937,7 +3937,7 @@ void MoveDude(DBloodActor* actor)
if (actor->GetType() == kDudeModernCustom) { if (actor->GetType() == kDudeModernCustom) {
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
if (!canSwim(actor)) actKillDude(actor, actor, kDamageFall, 1000 << 4); if (!canSwim(actor)) actKillDude(actor, actor, kDamageFall, 1000 << 4);
break; break;
} }
@ -4587,12 +4587,12 @@ static void actCheckThings()
if (hit.type == kHitSector) if (hit.type == kHitSector)
{ {
actRadiusDamage(actor->GetOwner(), actor->spr.pos, actor->sector(), 200, 1, 20, kDamageExplode, 6, 0); actRadiusDamage(actor->GetOwner(), actor->spr.pos, actor->sector(), 200, 1, 20, kDamageExplode, 6, 0);
evPostActor(actor, 0, kCallbackFXPodBloodSplat); evPostActor(actor, 0, AF(fxPodBloodSplat));
} }
else if (hit.type == kHitSprite) else if (hit.type == kHitSprite)
{ {
actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12); actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12);
evPostActor(actor, 0, kCallbackFXPodBloodSplat); evPostActor(actor, 0, AF(fxPodBloodSplat));
} }
break; break;
@ -4687,7 +4687,7 @@ static void actCheckExplosion()
if (pExplodeInfo->burnTime && dudeactor->hasX()) if (pExplodeInfo->burnTime && dudeactor->hasX())
{ {
if (!dudeactor->xspr.burnTime) evPostActor(dudeactor, 0, kCallbackFXFlameLick); if (!dudeactor->xspr.burnTime) evPostActor(dudeactor, 0, AF(fxFlameLick));
actBurnSprite(Owner, dudeactor, pExplodeInfo->burnTime << 2); actBurnSprite(Owner, dudeactor, pExplodeInfo->burnTime << 2);
} }
} }
@ -4710,7 +4710,7 @@ static void actCheckExplosion()
if (pExplodeInfo->burnTime) if (pExplodeInfo->burnTime)
{ {
if (thingactor->GetType() == kThingTNTBarrel && !thingactor->xspr.burnTime) if (thingactor->GetType() == kThingTNTBarrel && !thingactor->xspr.burnTime)
evPostActor(thingactor, 0, kCallbackFXFlameLick); evPostActor(thingactor, 0, AF(fxFlameLick));
actBurnSprite(Owner, thingactor, pExplodeInfo->burnTime << 2); actBurnSprite(Owner, thingactor, pExplodeInfo->burnTime << 2);
} }
} }
@ -5230,17 +5230,17 @@ DBloodActor* actSpawnThing(sectortype* pSector, const DVector3& pos, int nThingT
break; break;
case kThingArmedTNTStick: case kThingArmedTNTStick:
evPostActor(actor, 0, kCallbackFXDynPuff); evPostActor(actor, 0, AF(fxDynPuff));
sfxPlay3DSound(actor, 450, 0, 0); sfxPlay3DSound(actor, 450, 0, 0);
break; break;
case kThingArmedTNTBundle: case kThingArmedTNTBundle:
sfxPlay3DSound(actor, 450, 0, 0); sfxPlay3DSound(actor, 450, 0, 0);
evPostActor(actor, 0, kCallbackFXDynPuff); evPostActor(actor, 0, AF(fxDynPuff));
break; break;
case kThingArmedSpray: case kThingArmedSpray:
evPostActor(actor, 0, kCallbackFXDynPuff); evPostActor(actor, 0, AF(fxDynPuff));
break; break;
} }
return actor; return actor;
@ -5300,7 +5300,7 @@ bool actCheckRespawn(DBloodActor* actor)
actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
actor->spr.pos = actor->basePoint; actor->spr.pos = actor->basePoint;
} }
evPostActor(actor, nRespawnTime, kCallbackRespawn); evPostActor(actor, nRespawnTime, AF(Respawn));
} }
return 1; return 1;
} }
@ -5435,7 +5435,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
} }
if (pVectorData->burnTime) if (pVectorData->burnTime)
{ {
if (!actor->xspr.burnTime) evPostActor(actor, 0, kCallbackFXFlameLick); if (!actor->xspr.burnTime) evPostActor(actor, 0, AF(fxFlameLick));
actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime); actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime);
} }
} }
@ -5463,7 +5463,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
} }
if (pVectorData->burnTime) if (pVectorData->burnTime)
{ {
if (!actor->xspr.burnTime) evPostActor(actor, 0, kCallbackFXFlameLick); if (!actor->xspr.burnTime) evPostActor(actor, 0, AF(fxFlameLick));
actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime); actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime);
} }
if (Chance(pVectorData->fxChance)) if (Chance(pVectorData->fxChance))
@ -5518,7 +5518,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
actor->vel += dv * thrust; actor->vel += dv * thrust;
if (pVectorData->burnTime != 0) { if (pVectorData->burnTime != 0) {
if (!actor->xspr.burnTime) evPostActor(actor, 0, kCallbackFXFlameLick); if (!actor->xspr.burnTime) evPostActor(actor, 0, AF(fxFlameLick));
actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime); actBurnSprite(shooter->GetOwner(), actor, pVectorData->burnTime);
} }

View file

@ -190,7 +190,7 @@ extern const int16_t DudeDifficulty[];
bool IsUnderwaterSector(sectortype* pSector); bool IsUnderwaterSector(sectortype* pSector);
// route state callbacks through the scripting interface. // route state, seq and event callbacks through the scripting interface.
// this needs to work with incomplete data, so avoid the asserting macros. // this needs to work with incomplete data, so avoid the asserting macros.
#define DEF_ANIMATOR(func) \ #define DEF_ANIMATOR(func) \
void func(DBloodActor*); \ void func(DBloodActor*); \

View file

@ -1047,7 +1047,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
aiGenDudeNewState(actor, &genDudeBurnGoto); aiGenDudeNewState(actor, &genDudeBurnGoto);
actHealDude(actor, dudeInfo[55].startHealth, dudeInfo[55].startHealth); actHealDude(actor, dudeInfo[55].startHealth, dudeInfo[55].startHealth);
actor->dudeExtra.time = PlayClock + 360; actor->dudeExtra.time = PlayClock + 360;
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
} }
@ -1121,7 +1121,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
aiPlay3DSound(actor, 1031 + Random(2), AI_SFX_PRIORITY_2, -1); aiPlay3DSound(actor, 1031 + Random(2), AI_SFX_PRIORITY_2, -1);
actor->dudeExtra.time = PlayClock + 360; actor->dudeExtra.time = PlayClock + 360;
actHealDude(actor, dudeInfo[40].startHealth, dudeInfo[40].startHealth); actHealDude(actor, dudeInfo[40].startHealth, dudeInfo[40].startHealth);
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
break; break;
case kDudeInnocent: case kDudeInnocent:
@ -1132,7 +1132,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
aiPlay3DSound(actor, 361, AI_SFX_PRIORITY_0, -1); aiPlay3DSound(actor, 361, AI_SFX_PRIORITY_0, -1);
actor->dudeExtra.time = PlayClock + 360; actor->dudeExtra.time = PlayClock + 360;
actHealDude(actor, dudeInfo[39].startHealth, dudeInfo[39].startHealth); actHealDude(actor, dudeInfo[39].startHealth, dudeInfo[39].startHealth);
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
break; break;
case kDudeBurningCultist: case kDudeBurningCultist:
@ -1168,7 +1168,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
actor->ChangeType(kDudeBurningZombieButcher); actor->ChangeType(kDudeBurningZombieButcher);
aiNewState(actor, &zombieFBurnGoto); aiNewState(actor, &zombieFBurnGoto);
actHealDude(actor, dudeInfo[42].startHealth, dudeInfo[42].startHealth); actHealDude(actor, dudeInfo[42].startHealth, dudeInfo[42].startHealth);
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
break; break;
case kDudeTinyCaleb: case kDudeTinyCaleb:
@ -1187,7 +1187,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
aiPlay3DSound(actor, 361, AI_SFX_PRIORITY_0, -1); aiPlay3DSound(actor, 361, AI_SFX_PRIORITY_0, -1);
actor->dudeExtra.time = PlayClock + 360; actor->dudeExtra.time = PlayClock + 360;
actHealDude(actor, dudeInfo[39].startHealth, dudeInfo[39].startHealth); actHealDude(actor, dudeInfo[39].startHealth, dudeInfo[39].startHealth);
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
break; break;
case kDudeCultistBeast: case kDudeCultistBeast:
@ -1208,7 +1208,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
actor->ChangeType(kDudeBurningZombieAxe); actor->ChangeType(kDudeBurningZombieAxe);
aiNewState(actor, &zombieABurnGoto); aiNewState(actor, &zombieABurnGoto);
actHealDude(actor, dudeInfo[41].startHealth, dudeInfo[41].startHealth); actHealDude(actor, dudeInfo[41].startHealth, dudeInfo[41].startHealth);
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
} }
break; break;
} }

View file

@ -52,7 +52,7 @@ void tchernobogFire(DBloodActor* actor)
if (!actor->ValidateTarget(__FUNCTION__)) return; if (!actor->ValidateTarget(__FUNCTION__)) return;
auto target = actor->GetTarget(); auto target = actor->GetTarget();
if (target->xspr.burnTime == 0) if (target->xspr.burnTime == 0)
evPostActor(target, 0, kCallbackFXFlameLick); evPostActor(target, 0, AF(fxFlameLick));
actBurnSprite(actor->GetOwner(), target, 40); actBurnSprite(actor->GetOwner(), target, 40);
if (Chance(0x6000)) if (Chance(0x6000))
aiNewState(actor, &tcherno13A9D4); aiNewState(actor, &tcherno13A9D4);

View file

@ -376,7 +376,7 @@ static void ThrowThing(DBloodActor* actor, bool impact)
spawned->xspr.stateTimer = 1; spawned->xspr.stateTimer = 1;
actor->genDudeExtra.pLifeLeech = spawned; actor->genDudeExtra.pLifeLeech = spawned;
evPostActor(spawned, 80, kCallbackLeechStateTimer); evPostActor(spawned, 80, AF(LeechStateTimer));
return; return;
} }
@ -1791,7 +1791,7 @@ void dudeLeechOperate(DBloodActor* actor, const EVENT& event)
{ {
missile->SetOwner(actor); missile->SetOwner(actor);
actor->xspr.stateTimer = 1; actor->xspr.stateTimer = 1;
evPostActor(actor, t2, kCallbackLeechStateTimer); evPostActor(actor, t2, AF(LeechStateTimer));
actor->xspr.data3 = ClipLow(actor->xspr.data3 - 1, 0); actor->xspr.data3 = ClipLow(actor->xspr.data3 - 1, 0);
} }
actor->spr.Angles.Yaw = angBak; actor->spr.Angles.Yaw = angBak;

View file

@ -23,6 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#pragma once #pragma once
#include "build.h" #include "build.h"
#include "vm.h"
#include "gamestruct.h" #include "gamestruct.h"
#include "mapinfo.h" #include "mapinfo.h"
#include "d_net.h" #include "d_net.h"
@ -59,6 +60,217 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
// ai callbacks
DEF_ANIMATOR(aiGenDudeMoveForward)
DEF_ANIMATOR(aiMoveDodge)
DEF_ANIMATOR(aiMoveForward)
DEF_ANIMATOR(aiMoveTurn)
DEF_ANIMATOR(aiPodChase)
DEF_ANIMATOR(aiPodMove)
DEF_ANIMATOR(aiPodSearch)
DEF_ANIMATOR(aiThinkTarget)
DEF_ANIMATOR(batMoveDodgeDown)
DEF_ANIMATOR(batMoveDodgeUp)
DEF_ANIMATOR(batMoveFly)
DEF_ANIMATOR(batMoveForward)
DEF_ANIMATOR(batMoveSwoop)
DEF_ANIMATOR(batMoveToCeil)
DEF_ANIMATOR(batThinkChase)
DEF_ANIMATOR(batThinkGoto)
DEF_ANIMATOR(batThinkPonder)
DEF_ANIMATOR(batThinkSearch)
DEF_ANIMATOR(batThinkTarget)
DEF_ANIMATOR(beastMoveForward)
DEF_ANIMATOR(beastThinkChase)
DEF_ANIMATOR(beastThinkGoto)
DEF_ANIMATOR(beastThinkSearch)
DEF_ANIMATOR(beastThinkSwimChase)
DEF_ANIMATOR(beastThinkSwimGoto)
DEF_ANIMATOR(burnThinkChase)
DEF_ANIMATOR(burnThinkGoto)
DEF_ANIMATOR(burnThinkSearch)
DEF_ANIMATOR(calebThinkChase)
DEF_ANIMATOR(calebThinkGoto)
DEF_ANIMATOR(calebThinkSearch)
DEF_ANIMATOR(calebThinkSwimChase)
DEF_ANIMATOR(calebThinkSwimGoto)
DEF_ANIMATOR(cerberusThinkChase)
DEF_ANIMATOR(cerberusThinkGoto)
DEF_ANIMATOR(cerberusThinkSearch)
DEF_ANIMATOR(cerberusThinkTarget)
DEF_ANIMATOR(cultThinkChase)
DEF_ANIMATOR(cultThinkGoto)
DEF_ANIMATOR(cultThinkSearch)
DEF_ANIMATOR(eelMoveAscend)
DEF_ANIMATOR(eelMoveDodgeDown)
DEF_ANIMATOR(eelMoveDodgeUp)
DEF_ANIMATOR(eelMoveForward)
DEF_ANIMATOR(eelMoveSwoop)
DEF_ANIMATOR(eelMoveToCeil)
DEF_ANIMATOR(eelThinkChase)
DEF_ANIMATOR(eelThinkGoto)
DEF_ANIMATOR(eelThinkPonder)
DEF_ANIMATOR(eelThinkSearch)
DEF_ANIMATOR(eelThinkTarget)
DEF_ANIMATOR(entryAIdle)
DEF_ANIMATOR(entryEStand)
DEF_ANIMATOR(entryEZombie)
DEF_ANIMATOR(entryFStatue)
DEF_ANIMATOR(entrySStatue)
DEF_ANIMATOR(forcePunch)
DEF_ANIMATOR(gargMoveDodgeDown)
DEF_ANIMATOR(gargMoveDodgeUp)
DEF_ANIMATOR(gargMoveFly)
DEF_ANIMATOR(gargMoveForward)
DEF_ANIMATOR(gargMoveSlow)
DEF_ANIMATOR(gargMoveSwoop)
DEF_ANIMATOR(gargThinkChase)
DEF_ANIMATOR(gargThinkGoto)
DEF_ANIMATOR(gargThinkSearch)
DEF_ANIMATOR(gargThinkTarget)
DEF_ANIMATOR(ghostMoveDodgeDown)
DEF_ANIMATOR(ghostMoveDodgeUp)
DEF_ANIMATOR(ghostMoveFly)
DEF_ANIMATOR(ghostMoveForward)
DEF_ANIMATOR(ghostMoveSlow)
DEF_ANIMATOR(ghostMoveSwoop)
DEF_ANIMATOR(ghostThinkChase)
DEF_ANIMATOR(ghostThinkGoto)
DEF_ANIMATOR(ghostThinkSearch)
DEF_ANIMATOR(ghostThinkTarget)
DEF_ANIMATOR(gillThinkChase)
DEF_ANIMATOR(gillThinkGoto)
DEF_ANIMATOR(gillThinkSearch)
DEF_ANIMATOR(gillThinkSwimChase)
DEF_ANIMATOR(gillThinkSwimGoto)
DEF_ANIMATOR(handThinkChase)
DEF_ANIMATOR(handThinkGoto)
DEF_ANIMATOR(handThinkSearch)
DEF_ANIMATOR(houndThinkChase)
DEF_ANIMATOR(houndThinkGoto)
DEF_ANIMATOR(houndThinkSearch)
DEF_ANIMATOR(innocThinkChase)
DEF_ANIMATOR(innocThinkGoto)
DEF_ANIMATOR(innocThinkSearch)
DEF_ANIMATOR(MorphToBeast)
DEF_ANIMATOR(myThinkSearch)
DEF_ANIMATOR(myThinkTarget)
DEF_ANIMATOR(playStatueBreakSnd)
DEF_ANIMATOR(ratThinkChase)
DEF_ANIMATOR(ratThinkGoto)
DEF_ANIMATOR(ratThinkSearch)
DEF_ANIMATOR(spidThinkChase)
DEF_ANIMATOR(spidThinkGoto)
DEF_ANIMATOR(spidThinkSearch)
DEF_ANIMATOR(sub_628A0)
DEF_ANIMATOR(sub_62AE0)
DEF_ANIMATOR(sub_62D7C)
DEF_ANIMATOR(sub_65D04)
DEF_ANIMATOR(sub_65F44)
DEF_ANIMATOR(sub_661E0)
DEF_ANIMATOR(sub_6CB00)
DEF_ANIMATOR(sub_6CD74)
DEF_ANIMATOR(sub_6D03C)
DEF_ANIMATOR(sub_72580)
DEF_ANIMATOR(sub_725A4)
DEF_ANIMATOR(sub_72850)
DEF_ANIMATOR(tchernobogThinkChase)
DEF_ANIMATOR(unicultThinkChase)
DEF_ANIMATOR(unicultThinkGoto)
DEF_ANIMATOR(unicultThinkSearch)
DEF_ANIMATOR(zombaThinkChase)
DEF_ANIMATOR(zombaThinkGoto)
DEF_ANIMATOR(zombaThinkPonder)
DEF_ANIMATOR(zombaThinkSearch)
DEF_ANIMATOR(zombfThinkChase)
DEF_ANIMATOR(zombfThinkGoto)
DEF_ANIMATOR(zombfThinkSearch)
// seq callbacks
DEF_ANIMATOR(FireballSeqCallback)
DEF_ANIMATOR(Fx33Callback)
DEF_ANIMATOR(NapalmSeqCallback)
DEF_ANIMATOR(Fx32Callback)
DEF_ANIMATOR(TreeToGibCallback)
DEF_ANIMATOR(DudeToGibCallback1)
DEF_ANIMATOR(DudeToGibCallback2)
DEF_ANIMATOR(batBiteSeqCallback)
DEF_ANIMATOR(SlashSeqCallback)
DEF_ANIMATOR(StompSeqCallback)
DEF_ANIMATOR(eelBiteSeqCallback)
DEF_ANIMATOR(BurnSeqCallback)
DEF_ANIMATOR(SeqAttackCallback)
DEF_ANIMATOR(cerberusBiteSeqCallback)
DEF_ANIMATOR(cerberusBurnSeqCallback)
DEF_ANIMATOR(cerberusBurnSeqCallback2)
DEF_ANIMATOR(TommySeqCallback)
DEF_ANIMATOR(TeslaSeqCallback)
DEF_ANIMATOR(ShotSeqCallback)
DEF_ANIMATOR(cultThrowSeqCallback)
DEF_ANIMATOR(cultThrowSeqCallback2)
DEF_ANIMATOR(cultThrowSeqCallback3)
DEF_ANIMATOR(SlashFSeqCallback)
DEF_ANIMATOR(ThrowFSeqCallback)
DEF_ANIMATOR(BlastSSeqCallback)
DEF_ANIMATOR(ThrowSSeqCallback)
DEF_ANIMATOR(ghostSlashSeqCallback)
DEF_ANIMATOR(ghostThrowSeqCallback)
DEF_ANIMATOR(ghostBlastSeqCallback)
DEF_ANIMATOR(GillBiteSeqCallback)
DEF_ANIMATOR(HandJumpSeqCallback)
DEF_ANIMATOR(houndBiteSeqCallback)
DEF_ANIMATOR(houndBurnSeqCallback)
DEF_ANIMATOR(podPlaySound1)
DEF_ANIMATOR(podPlaySound2)
DEF_ANIMATOR(podAttack)
DEF_ANIMATOR(podExplode)
DEF_ANIMATOR(ratBiteSeqCallback)
DEF_ANIMATOR(SpidBiteSeqCallback)
DEF_ANIMATOR(SpidJumpSeqCallback)
DEF_ANIMATOR(SpidBirthSeqCallback)
DEF_ANIMATOR(tchernobogFire)
DEF_ANIMATOR(tchernobogBurnSeqCallback)
DEF_ANIMATOR(tchernobogBurnSeqCallback2)
DEF_ANIMATOR(genDudeAttack1)
DEF_ANIMATOR(punchCallback)
DEF_ANIMATOR(ThrowCallback1)
DEF_ANIMATOR(ThrowCallback2)
DEF_ANIMATOR(HackSeqCallback)
DEF_ANIMATOR(StandSeqCallback)
DEF_ANIMATOR(zombfHackSeqCallback)
DEF_ANIMATOR(PukeSeqCallback)
DEF_ANIMATOR(ThrowSeqCallback)
DEF_ANIMATOR(PlayerSurvive)
DEF_ANIMATOR(PlayerKneelsOver)
DEF_ANIMATOR(FireballTrapSeqCallback)
DEF_ANIMATOR(MGunFireSeqCallback)
DEF_ANIMATOR(MGunOpenSeqCallback)
// event callbacks
DEF_ANIMATOR(fxFlameLick) // 0
DEF_ANIMATOR(Remove) // 1
DEF_ANIMATOR(FlareBurst) // 2
DEF_ANIMATOR(fxFlareSpark) // 3
DEF_ANIMATOR(fxFlareSparkLite) // 4
DEF_ANIMATOR(fxZombieBloodSpurt) // 5
DEF_ANIMATOR(fxBloodSpurt) // 6
DEF_ANIMATOR(fxArcSpark) // 7
DEF_ANIMATOR(fxDynPuff) // 8
DEF_ANIMATOR(Respawn) // 9
DEF_ANIMATOR(PlayerBubble) // 10
DEF_ANIMATOR(EnemyBubble) // 11
DEF_ANIMATOR(FinishHim) // 13
DEF_ANIMATOR(fxBloodBits) // 14
DEF_ANIMATOR(fxTeslaAlt) // 15
DEF_ANIMATOR(fxBouncingSleeve) // 16
DEF_ANIMATOR(returnFlagToBase) // 17
DEF_ANIMATOR(fxPodBloodSpray) // 18
DEF_ANIMATOR(fxPodBloodSplat) // 19
DEF_ANIMATOR(LeechStateTimer) // 20
DEF_ANIMATOR(DropVoodooCb) // unused
DEF_ANIMATOR(callbackMakeMissileBlocking)
DEF_ANIMATOR(GenDudeUpdate)
DEF_ANIMATOR(callbackUniMissileBurst)
enum EFeatureFlags enum EFeatureFlags
{ {
kFeatureCustomAmmoCount = 1, kFeatureCustomAmmoCount = 1,

View file

@ -59,7 +59,7 @@ void fxFlameLick(DBloodActor* actor) // 0
} }
} }
if (actor->xspr.burnTime > 0) if (actor->xspr.burnTime > 0)
evPostActor(actor, 5, kCallbackFXFlameLick); evPostActor(actor, 5, AF(fxFlameLick));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -71,7 +71,7 @@ void fxFlameLick(DBloodActor* actor) // 0
void Remove(DBloodActor* actor) // 1 void Remove(DBloodActor* actor) // 1
{ {
if (!actor) return; if (!actor) return;
evKillActor(actor, kCallbackFXFlareSpark); evKillActor(actor, AF(fxFlareSpark));
if (actor->hasX()) if (actor->hasX())
seqKill(actor); seqKill(actor);
sfxKill3DSound(actor, 0, -1); sfxKill3DSound(actor, 0, -1);
@ -101,9 +101,9 @@ void FlareBurst(DBloodActor* actor) // 2
auto spAngVec = DAngle::fromBam(i << 29).ToVector().Rotated90CW() * nRadius; auto spAngVec = DAngle::fromBam(i << 29).ToVector().Rotated90CW() * nRadius;
if (i & 1) spAngVec *= 0.5; if (i & 1) spAngVec *= 0.5;
spawnedactor->vel += DVector3(DVector2(0, spAngVec.X).Rotated(nAngVec.X, nAngVec.Y), spAngVec.Y); spawnedactor->vel += DVector3(DVector2(0, spAngVec.X).Rotated(nAngVec.X, nAngVec.Y), spAngVec.Y);
evPostActor(spawnedactor, 960, kCallbackRemove); evPostActor(spawnedactor, 960, AF(Remove));
} }
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -122,7 +122,7 @@ void fxFlareSpark(DBloodActor* actor) // 3
pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa); pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa);
pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa);
} }
evPostActor(actor, 4, kCallbackFXFlareSpark); evPostActor(actor, 4, AF(fxFlareSpark));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -141,7 +141,7 @@ void fxFlareSparkLite(DBloodActor* actor) // 4
pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa); pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa);
pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa);
} }
evPostActor(actor, 12, kCallbackFXFlareSparkLite); evPostActor(actor, 12, AF(fxFlareSparkLite));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -165,12 +165,12 @@ void fxZombieBloodSpurt(DBloodActor* actor) // 5
} }
if (actor->xspr.data1 > 0) if (actor->xspr.data1 > 0)
{ {
evPostActor(actor, 4, kCallbackFXZombieSpurt); evPostActor(actor, 4, AF(fxZombieBloodSpurt));
actor->xspr.data1 -= 4; actor->xspr.data1 -= 4;
} }
else if (actor->xspr.data2 > 0) else if (actor->xspr.data2 > 0)
{ {
evPostActor(actor, 60, kCallbackFXZombieSpurt); evPostActor(actor, 60, AF(fxZombieBloodSpurt));
actor->xspr.data1 = 40; actor->xspr.data1 = 40;
actor->xspr.data2--; actor->xspr.data2--;
} }
@ -191,7 +191,7 @@ void fxBloodSpurt(DBloodActor* actor) // 6
pFX->spr.Angles.Yaw = nullAngle; pFX->spr.Angles.Yaw = nullAngle;
pFX->vel = actor->vel * (1./256); pFX->vel = actor->vel * (1./256);
} }
evPostActor(actor, 6, kCallbackFXBloodSpurt); evPostActor(actor, 6, AF(fxBloodSpurt));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -210,7 +210,7 @@ void fxArcSpark(DBloodActor* actor) // 7
pFX->vel.Y = actor->vel.Y + Random2F(0x10000); pFX->vel.Y = actor->vel.Y + Random2F(0x10000);
pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa);
} }
evPostActor(actor, 3, kCallbackFXArcSpark); evPostActor(actor, 3, AF(fxArcSpark));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -233,7 +233,7 @@ void fxDynPuff(DBloodActor* actor) // 8
pFX->vel = actor->vel; pFX->vel = actor->vel;
} }
} }
evPostActor(actor, 12, kCallbackFXDynPuff); evPostActor(actor, 12, AF(fxDynPuff));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -260,13 +260,13 @@ void Respawn(DBloodActor* actor) // 9
case 1: { case 1: {
int nTime = MulScale(actGetRespawnTime(actor), 0x4000, 16); int nTime = MulScale(actGetRespawnTime(actor), 0x4000, 16);
actor->xspr.respawnPending = 2; actor->xspr.respawnPending = 2;
evPostActor(actor, nTime, kCallbackRespawn); evPostActor(actor, nTime, AF(Respawn));
break; break;
} }
case 2: { case 2: {
int nTime = MulScale(actGetRespawnTime(actor), 0x2000, 16); int nTime = MulScale(actGetRespawnTime(actor), 0x2000, 16);
actor->xspr.respawnPending = 3; actor->xspr.respawnPending = 3;
evPostActor(actor, nTime, kCallbackRespawn); evPostActor(actor, nTime, AF(Respawn));
break; break;
} }
case 3: { case 3: {
@ -358,7 +358,7 @@ void PlayerBubble(DBloodActor* actor) // 10
pFX->vel.Z = actor->vel.Z + Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z + Random2F(0x1aaaa);
} }
} }
evPostActor(actor, 4, kCallbackPlayerBubble); evPostActor(actor, 4, AF(PlayerBubble));
} }
} }
@ -389,7 +389,7 @@ void EnemyBubble(DBloodActor* actor) // 11
pFX->vel.Z = actor->vel.Z + Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z + Random2F(0x1aaaa);
} }
} }
evPostActor(actor, 4, kCallbackEnemeyBubble); evPostActor(actor, 4, AF(EnemyBubble));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -416,7 +416,7 @@ void CounterCheck(sectortype* pSector) // 12
} }
if (nCount < nReq) { if (nCount < nReq) {
evPostSector(pSector, 5, kCallbackCounterCheck); evPostSector(pSector, 5, kCmdCallback, nullptr);
return; return;
} }
else { else {
@ -484,7 +484,7 @@ void fxTeslaAlt(DBloodActor* actor) // 15
pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa); pFX->vel.Y = actor->vel.Y + Random2F(0x1aaaa);
pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa); pFX->vel.Z = actor->vel.Z - Random2F(0x1aaaa);
} }
evPostActor(actor, 3, kCallbackFXTeslaAlt); evPostActor(actor, 3, AF(fxTeslaAlt));
} }
@ -598,7 +598,7 @@ void returnFlagToBase(DBloodActor* actor) // 17
break; break;
} }
} }
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -620,7 +620,7 @@ void fxPodBloodSpray(DBloodActor* actor) // 18
pFX->spr.Angles.Yaw = nullAngle; pFX->spr.Angles.Yaw = nullAngle;
pFX->vel = actor->vel * (1./256); pFX->vel = actor->vel * (1./256);
} }
evPostActor(actor, 6, kCallbackFXPodBloodSpray); evPostActor(actor, 6, AF(fxPodBloodSpray));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -723,7 +723,7 @@ void DropVoodooCb(DBloodActor* actor) // unused
auto Owner = actor->GetOwner(); auto Owner = actor->GetOwner();
if (Owner == nullptr) if (Owner == nullptr)
{ {
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
return; return;
} }
DBloodPlayer* pPlayer; DBloodPlayer* pPlayer;
@ -733,7 +733,7 @@ void DropVoodooCb(DBloodActor* actor) // unused
pPlayer = nullptr; pPlayer = nullptr;
if (!pPlayer) if (!pPlayer)
{ {
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
return; return;
} }
actor->spr.Angles.Yaw = (Owner->spr.pos - actor->spr.pos).Angle(); actor->spr.Angles.Yaw = (Owner->spr.pos - actor->spr.pos).Angle();
@ -741,7 +741,7 @@ void DropVoodooCb(DBloodActor* actor) // unused
{ {
if (actor->xspr.data1 == 0) if (actor->xspr.data1 == 0)
{ {
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
return; return;
} }
@ -775,7 +775,7 @@ void DropVoodooCb(DBloodActor* actor) // unused
int nDmg = actDamageSprite(actor, actor2, kDamageSpirit, actor->xspr.data1 << 4); int nDmg = actDamageSprite(actor, actor2, kDamageSpirit, actor->xspr.data1 << 4);
actor->xspr.data1 = ClipLow(actor->xspr.data1 - nDmg, 0); actor->xspr.data1 = ClipLow(actor->xspr.data1 - nDmg, 0);
sub_76A08(actor2, actor, pPlayer2); sub_76A08(actor2, actor, pPlayer2);
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
return; return;
} }
} }
@ -816,7 +816,7 @@ void DropVoodooCb(DBloodActor* actor) // unused
if (vd && (Chance(vd) || nextactor == nullptr)) if (vd && (Chance(vd) || nextactor == nullptr))
{ {
sub_76A08(actor2, actor, NULL); sub_76A08(actor2, actor, NULL);
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
return; return;
} }
} }
@ -824,70 +824,8 @@ void DropVoodooCb(DBloodActor* actor) // unused
} }
} }
actor->xspr.data1 = ClipLow(actor->xspr.data1 - 1, 0); actor->xspr.data1 = ClipLow(actor->xspr.data1 - 1, 0);
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
} }
} }
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void callbackCondition(DBloodActor* actor)
{
if (actor->xspr.isTriggered) return;
TRCONDITION const* pCond = &gConditions[actor->xspr.sysData1];
for (auto& obj : pCond->objects)
{
EVENT evn;
evn.target = obj.obj;
evn.cmd = obj.cmd;
evn.funcID = kCallbackCondition;
useCondition(actor, evn);
}
evPostActor(actor, actor->xspr.busyTime, kCallbackCondition);
return;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void(*gCallback[kCallbackMax])(DBloodActor*) =
{
fxFlameLick,
Remove,
FlareBurst,
fxFlareSpark,
fxFlareSparkLite,
fxZombieBloodSpurt,
fxBloodSpurt,
fxArcSpark,
fxDynPuff,
Respawn,
PlayerBubble,
EnemyBubble,
nullptr,
FinishHim,
fxBloodBits,
fxTeslaAlt,
fxBouncingSleeve,
returnFlagToBase,
fxPodBloodSpray,
fxPodBloodSplat,
LeechStateTimer,
DropVoodooCb, // unused
#ifdef NOONE_EXTENSIONS
callbackUniMissileBurst, // the code is in nnexts.cpp
callbackMakeMissileBlocking, // the code is in nnexts.cpp
callbackGenDudeUpdate, // the code is in nnexts.cpp
callbackCondition,
#endif
};
END_BLD_NS END_BLD_NS

View file

@ -25,39 +25,4 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
void sleeveStopBouncing(DBloodActor* pSprite); void sleeveStopBouncing(DBloodActor* pSprite);
enum CALLBACK_ID {
kCallbackNone = -1,
kCallbackFXFlameLick = 0,
kCallbackRemove = 1,
kCallbackFXFlareBurst = 2,
kCallbackFXFlareSpark = 3,
kCallbackFXFlareSparkLite = 4,
kCallbackFXZombieSpurt = 5,
kCallbackFXBloodSpurt = 6,
kCallbackFXArcSpark = 7,
kCallbackFXDynPuff = 8,
kCallbackRespawn = 9,
kCallbackPlayerBubble = 10,
kCallbackEnemeyBubble = 11,
kCallbackCounterCheck = 12,
kCallbackFinishHim = 13,
kCallbackFXBloodBits = 14,
kCallbackFXTeslaAlt = 15,
kCallbackFXBouncingSleeve = 16,
kCallbackReturnFlag = 17,
kCallbackFXPodBloodSpray = 18,
kCallbackFXPodBloodSplat = 19,
kCallbackLeechStateTimer = 20,
kCallbackDropVoodoo = 21, // unused
#ifdef NOONE_EXTENSIONS
kCallbackMissileBurst = 22,
kCallbackMissileSpriteBlock = 23,
kCallbackGenDudeUpdate = 24,
kCallbackCondition = 25,
#endif
kCallbackMax,
};
extern void(*gCallback[kCallbackMax])(DBloodActor*);
END_BLD_NS END_BLD_NS

View file

@ -400,9 +400,9 @@ void evPost_(EventObject& eob, unsigned int nDelta, COMMAND_ID command, DBloodAc
queue.insert(evn); queue.insert(evn);
} }
void evPost_(const EventObject& eob, unsigned int nDelta, CALLBACK_ID callback) void evPost_(const EventObject& eob, unsigned int nDelta, VMFunction* callback)
{ {
EVENT evn = { eob, kCmdCallback, (int16_t)callback, PlayClock + (int)nDelta }; EVENT evn = { eob, kCmdCallback, callback, PlayClock + (int)nDelta };
queue.insert(evn); queue.insert(evn);
} }
@ -413,7 +413,7 @@ void evPostActor(DBloodActor* actor, unsigned int nDelta, COMMAND_ID command, DB
evPost_(ev, nDelta, command, initiator); evPost_(ev, nDelta, command, initiator);
} }
void evPostActor(DBloodActor* actor, unsigned int nDelta, CALLBACK_ID callback) void evPostActor(DBloodActor* actor, unsigned int nDelta, VMFunction* callback)
{ {
evPost_(EventObject(actor), nDelta, callback); evPost_(EventObject(actor), nDelta, callback);
} }
@ -424,11 +424,6 @@ void evPostSector(sectortype* sect, unsigned int nDelta, COMMAND_ID command, DBl
evPost_(ev, nDelta, command, initiator); evPost_(ev, nDelta, command, initiator);
} }
void evPostSector(sectortype* sect, unsigned int nDelta, CALLBACK_ID callback)
{
evPost_(EventObject(sect), nDelta, callback);
}
void evPostWall(walltype* wal, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator) void evPostWall(walltype* wal, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator)
{ {
auto ev = EventObject(wal); auto ev = EventObject(wal);
@ -460,7 +455,7 @@ void evKill_(const EventObject& eob, DBloodActor* initiator)
} }
} }
void evKill_(const EventObject& eob, CALLBACK_ID cb) void evKill_(const EventObject& eob, VMFunction* cb)
{ {
for (auto ev = queue.begin(); ev != queue.end();) for (auto ev = queue.begin(); ev != queue.end();)
{ {
@ -482,7 +477,7 @@ void evKillActor(DBloodActor* actor, DBloodActor* initiator)
evKill_(EventObject(actor), initiator); evKill_(EventObject(actor), initiator);
} }
void evKillActor(DBloodActor* actor, CALLBACK_ID cb) void evKillActor(DBloodActor* actor, VMFunction* cb)
{ {
evKill_(EventObject(actor)); evKill_(EventObject(actor));
} }
@ -553,9 +548,12 @@ void evProcess(unsigned int time)
if (event.cmd == kCmdCallback) if (event.cmd == kCmdCallback)
{ {
// Except for CounterCheck all other callbacks are for actors only. // Except for CounterCheck all other callbacks are for actors only.
assert(event.funcID < kCallbackMax); if (event.target.isActor())
if (event.target.isActor()) gCallback[event.funcID](event.target.actor()); {
else if (event.target.isSector() && event.funcID == kCallbackCounterCheck) CounterCheck(event.target.sector()); callActorFunction(event.funcID, event.target.actor());
}
// this is the only one, so no further checks for now.
else if (event.target.isSector()) CounterCheck(event.target.sector());
// no case for walls defined here. // no case for walls defined here.
} }
else else

View file

@ -192,7 +192,7 @@ struct EVENT
{ {
EventObject target; EventObject target;
int8_t cmd; int8_t cmd;
int16_t funcID; VMFunction* funcID;
int priority; int priority;
TObjPtr<DBloodActor*> initiator; TObjPtr<DBloodActor*> initiator;
@ -242,16 +242,16 @@ struct EVENT
void evInit(TArray<DBloodActor*>& actors); void evInit(TArray<DBloodActor*>& actors);
void evPostActor(DBloodActor*, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator); void evPostActor(DBloodActor*, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator);
void evPostActor(DBloodActor*, unsigned int nDelta, CALLBACK_ID callback); void evPostActor(DBloodActor*, unsigned int nDelta, VMFunction* callback);
void evPostSector(sectortype* index, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator); void evPostSector(sectortype* index, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator);
void evPostSector(sectortype* index, unsigned int nDelta, CALLBACK_ID callback); void evPostSector(sectortype* index, unsigned int nDelta, VMFunction* callback);
void evPostWall(walltype* index, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator); void evPostWall(walltype* index, unsigned int nDelta, COMMAND_ID command, DBloodActor* initiator);
void evProcess(unsigned int nTime); void evProcess(unsigned int nTime);
void evKillActor(DBloodActor*); void evKillActor(DBloodActor*);
void evKillActor(DBloodActor*, DBloodActor* initiator); void evKillActor(DBloodActor*, DBloodActor* initiator);
void evKillActor(DBloodActor*, CALLBACK_ID a3); void evKillActor(DBloodActor*, VMFunction* a3);
END_BLD_NS END_BLD_NS

View file

@ -32,7 +32,7 @@ BEGIN_BLD_NS
CFX gFX; CFX gFX;
struct FXDATA { struct FXDATA {
CALLBACK_ID funcID; VMNativeFunction** funcID;
uint8_t detail; uint8_t detail;
int16_t seq; int16_t seq;
int16_t flags; int16_t flags;
@ -49,63 +49,63 @@ struct FXDATA {
}; };
FXDATA gFXData[] = { FXDATA gFXData[] = {
{ kCallbackNone, 0, 49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 52, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 52, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 0, 46, 1, -128, 8192, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 46, 1, -128, 8192, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 2, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 2, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 48, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 48, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 60, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 60, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBloodBits, 2, 0, 1, 46603, 2048, 480, 2154, 40, 40, 0, -12, 0 }, { &AF(fxBloodBits), 2, 0, 1, 46603, 2048, 480, 2154, 40, 40, 0, -12, 0 },
{ kCallbackNone, 2, 0, 3, 46603, 5120, 480, 2269, 24, 24, 0, -128, 0 }, { nullptr, 2, 0, 3, 46603, 5120, 480, 2269, 24, 24, 0, -128, 0 },
{ kCallbackNone, 2, 0, 3, 46603, 5120, 480, 1720, 24, 24, 0, -128, 0 }, { nullptr, 2, 0, 3, 46603, 5120, 480, 1720, 24, 24, 0, -128, 0 },
{ kCallbackNone, 1, 0, 1, 58254, 3072, 480, 2280, 48, 48, 0, -128, 0 }, { nullptr, 1, 0, 1, 58254, 3072, 480, 2280, 48, 48, 0, -128, 0 },
{ kCallbackNone, 1, 0, 1, 58254, 3072, 480, 3135, 48, 48, 0, -128, 0 }, { nullptr, 1, 0, 1, 58254, 3072, 480, 3135, 48, 48, 0, -128, 0 },
{ kCallbackNone, 0, 0, 3, 58254, 1024, 480, 3261, 32, 32, 0, 0, 0 }, { nullptr, 0, 0, 3, 58254, 1024, 480, 3261, 32, 32, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 58254, 1024, 480, 3265, 32, 32, 0, 0, 0 }, { nullptr, 1, 0, 3, 58254, 1024, 480, 3265, 32, 32, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 58254, 1024, 480, 3269, 32, 32, 0, 0, 0 }, { nullptr, 1, 0, 3, 58254, 1024, 480, 3269, 32, 32, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 58254, 1024, 480, 3273, 32, 32, 0, 0, 0 }, { nullptr, 1, 0, 3, 58254, 1024, 480, 3273, 32, 32, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 58254, 1024, 480, 3277, 32, 32, 0, 0, 0 }, { nullptr, 1, 0, 3, 58254, 1024, 480, 3277, 32, 32, 0, 0, 0 },
{ kCallbackNone, 2, 0, 1, -27962, 8192, 600, 1128, 16, 16, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 1 { nullptr, 2, 0, 1, -27962, 8192, 600, 1128, 16, 16, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 1
{ kCallbackNone, 2, 0, 1, -18641, 8192, 600, 1128, 12, 12, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 2 { nullptr, 2, 0, 1, -18641, 8192, 600, 1128, 12, 12, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 2
{ kCallbackNone, 2, 0, 1, -9320, 8192, 600, 1128, 8, 8, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 3 { nullptr, 2, 0, 1, -9320, 8192, 600, 1128, 8, 8, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, // bubble 3
{ kCallbackNone, 2, 0, 1, -18641, 8192, 600, 1131, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 }, { nullptr, 2, 0, 1, -18641, 8192, 600, 1131, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP, -16, 0 },
{ kCallbackFXBloodBits, 2, 0, 3, 27962, 4096, 480, 733, 32, 32, 0, -16, 0 }, { &AF(fxBloodBits), 2, 0, 3, 27962, 4096, 480, 733, 32, 32, 0, -16, 0 },
{ kCallbackNone, 1, 0, 3, 18641, 4096, 120, 2261, 12, 12, 0, -128, 0 }, { nullptr, 1, 0, 3, 18641, 4096, 120, 2261, 12, 12, 0, -128, 0 },
{ kCallbackNone, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 58254, 3328, 480, 2185, 48, 48, 0, 0, 0 }, { nullptr, 1, 0, 3, 58254, 3328, 480, 2185, 48, 48, 0, 0, 0 },
{ kCallbackNone, 0, 0, 3, 58254, 1024, 480, 2620, 48, 48, 0, 0, 0 }, { nullptr, 0, 0, 3, 58254, 1024, 480, 2620, 48, 48, 0, 0, 0 },
{ kCallbackNone, 1, 55, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 55, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 56, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 56, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 57, 1, 0, 2048, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 57, 1, 0, 2048, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 58, 1, 0, 2048, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 58, 1, 0, 2048, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 0, 0, 0, 0, 960, 956, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR, 0, 0 }, { nullptr, 2, 0, 0, 0, 0, 960, 956, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 62, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 62, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 63, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 63, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 64, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 64, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 65, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 65, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 66, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 66, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackFXBouncingSleeve, 2, 67, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 }, { &AF(fxBouncingSleeve), 2, 67, 0, 46603, 1024, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 0, 0, 0, 838, 16, 16, CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_WALL, -8, 0 }, { nullptr, 1, 0, 3, 0, 0, 0, 838, 16, 16, CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_WALL, -8, 0 },
{ kCallbackNone, 0, 0, 3, 34952, 8192, 0, 2078, 64, 64, 0, -8, 0 }, { nullptr, 0, 0, 3, 34952, 8192, 0, 2078, 64, 64, 0, -8, 0 },
{ kCallbackNone, 0, 0, 3, 34952, 8192, 0, 1106, 64, 64, 0, -8, 0 }, { nullptr, 0, 0, 3, 34952, 8192, 0, 1106, 64, 64, 0, -8, 0 },
{ kCallbackNone, 0, 0, 3, 58254, 3328, 480, 2406, 48, 48, 0, 0, 0 }, { nullptr, 0, 0, 3, 58254, 3328, 480, 2406, 48, 48, 0, 0, 0 },
{ kCallbackNone, 1, 0, 3, 46603, 4096, 480, 3511, 64, 64, 0, -128, 0 }, { nullptr, 1, 0, 3, 46603, 4096, 480, 3511, 64, 64, 0, -128, 0 },
{ kCallbackNone, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 11, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 2, 11, 3, -256, 8192, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 2, 11, 3, 0, 8192, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 2, 11, 3, 0, 8192, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ kCallbackNone, 1, 30, 3, 0, 0, 0, 0, 40, 40, CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_WALL, -8, 0 }, { nullptr, 1, 30, 3, 0, 0, 0, 0, 40, 40, CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_WALL, -8, 0 },
{ kCallbackFXPodBloodSplat, 2, 0, 3, 27962, 4096, 480, 4023, 32, 32, 0, -16, 0 }, { &AF(fxPodBloodSplat), 2, 0, 3, 27962, 4096, 480, 4023, 32, 32, 0, -16, 0 },
{ kCallbackFXPodBloodSplat, 2, 0, 3, 27962, 4096, 480, 4028, 32, 32, 0, -16, 0 }, { &AF(fxPodBloodSplat), 2, 0, 3, 27962, 4096, 480, 4028, 32, 32, 0, -16, 0 },
{ kCallbackNone, 2, 0, 0, 0, 0, 480, 926, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR, -12, 0 }, { nullptr, 2, 0, 0, 0, 0, 480, 926, 32, 32, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR, -12, 0 },
{ kCallbackNone, 1, 70, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 } { nullptr, 1, 70, 1, -13981, 5120, 0, 0, 0, 0, 0, 0, 0 }
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -189,7 +189,7 @@ DBloodActor* CFX::fxSpawnActor(FX_ID nFx, sectortype* pSector, const DVector3& p
if (angle == nullAngle) if (angle == nullAngle)
angle = mapangle(pFX->defangle); angle = mapangle(pFX->defangle);
if (angle != nullAngle) if (angle != nullAngle)
evPostActor(actor, angle.Buildang() + Random2(angle.Buildang() >> 1), kCallbackRemove); evPostActor(actor, angle.Buildang() + Random2(angle.Buildang() >> 1), AF(Remove));
return actor; return actor;
} }
@ -222,12 +222,12 @@ void CFX::fxProcess(void)
} }
if (getflorzofslopeptr(actor->sector(), actor->spr.pos) <= actor->spr.pos.Z) if (getflorzofslopeptr(actor->sector(), actor->spr.pos) <= actor->spr.pos.Z)
{ {
if (pFXData->funcID < 0 || pFXData->funcID >= kCallbackMax) if (pFXData->funcID == nullptr)
{ {
remove(actor); remove(actor);
continue; continue;
} }
gCallback[pFXData->funcID](actor); callActorFunction(*pFXData->funcID, actor);
continue; continue;
} }
if (pSector != actor->sector()) if (pSector != actor->sector())
@ -247,12 +247,12 @@ void CFX::fxProcess(void)
} }
if (floorZ < actor->spr.pos.Z) if (floorZ < actor->spr.pos.Z)
{ {
if (pFXData->funcID < 0 || pFXData->funcID >= kCallbackMax) if (pFXData->funcID == nullptr)
{ {
remove(actor); remove(actor);
continue; continue;
} }
gCallback[pFXData->funcID](actor); callActorFunction(*pFXData->funcID, actor);
continue; continue;
} }
} }
@ -282,7 +282,7 @@ void fxSpawnBlood(DBloodActor* actor, int)
bloodactor->vel.X = Random2F(0x6aaaa); bloodactor->vel.X = Random2F(0x6aaaa);
bloodactor->vel.Y = Random2F(0x6aaaa); bloodactor->vel.Y = Random2F(0x6aaaa);
bloodactor->vel.Z = -Random2F(0x10aaaa) - FixedToFloat(100); bloodactor->vel.Z = -Random2F(0x10aaaa) - FixedToFloat(100);
evPostActor(bloodactor, 8, kCallbackFXBloodSpurt); evPostActor(bloodactor, 8, AF(fxBloodSpurt));
} }
} }
@ -312,7 +312,7 @@ void fxSpawnPodStuff(DBloodActor* actor, int)
spawnactor->vel.X = Random2F(0x6aaaa); spawnactor->vel.X = Random2F(0x6aaaa);
spawnactor->vel.Y = Random2F(0x6aaaa); spawnactor->vel.Y = Random2F(0x6aaaa);
spawnactor->vel.Z = -Random2F(0x10aaaa) - FixedToFloat(100); spawnactor->vel.Z = -Random2F(0x10aaaa) - FixedToFloat(100);
evPostActor(spawnactor, 8, kCallbackFXPodBloodSpray); evPostActor(spawnactor, 8, AF(fxPodBloodSpray));
} }
} }

View file

@ -328,7 +328,7 @@ const char* GameInterface::GenericCheat(int player, int cheat)
case kCheatMcGee: case kCheatMcGee:
{ {
if (!pPlayer->GetActor()->xspr.burnTime) if (!pPlayer->GetActor()->xspr.burnTime)
evPostActor(pPlayer->GetActor(), 0, kCallbackFXFlameLick); evPostActor(pPlayer->GetActor(), 0, AF(fxFlameLick));
actBurnSprite(pPlayer->GetActor(), pPlayer->GetActor(), 2400); actBurnSprite(pPlayer->GetActor(), pPlayer->GetActor(), 2400);
return GStrings("TXTB_FIRED"); return GStrings("TXTB_FIRED");
} }
@ -341,7 +341,7 @@ const char* GameInterface::GenericCheat(int player, int cheat)
actHealDude(pPlayer->GetActor(), 200, 200); actHealDude(pPlayer->GetActor(), 200, 200);
pPlayer->armor[1] = VanillaMode() ? 200 : 3200; pPlayer->armor[1] = VanillaMode() ? 200 : 3200;
if (!pPlayer->GetActor()->xspr.burnTime) if (!pPlayer->GetActor()->xspr.burnTime)
evPostActor(pPlayer->GetActor(), 0, kCallbackFXFlameLick); evPostActor(pPlayer->GetActor(), 0, AF(fxFlameLick));
actBurnSprite(pPlayer->GetActor(), pPlayer->GetActor(), 2400); actBurnSprite(pPlayer->GetActor(), pPlayer->GetActor(), 2400);
return GStrings("TXTB_RETARD"); return GStrings("TXTB_RETARD");
} }

View file

@ -44,15 +44,15 @@ CVARD(Bool, nnext_showconditionsprites, false, 0, "makes kModernCondition sprite
short gEffectGenCallbacks[] = { VMNativeFunction** gEffectGenCallbacks[] = {
kCallbackFXFlameLick, &AF(fxFlameLick),
kCallbackFXFlareSpark, &AF(fxFlareSpark),
kCallbackFXFlareSparkLite, &AF(fxFlareSparkLite),
kCallbackFXZombieSpurt, &AF(fxZombieBloodSpurt),
kCallbackFXBloodSpurt, &AF(fxBloodSpurt),
kCallbackFXArcSpark, &AF(fxArcSpark),
kCallbackFXTeslaAlt, &AF(fxTeslaAlt),
}; };
@ -1078,7 +1078,7 @@ void nnExtProcessSuperSprites()
EVENT evn; EVENT evn;
evn.target = pCond->objects[k].obj; evn.target = pCond->objects[k].obj;
evn.cmd = pCond->objects[k].cmd; evn.cmd = pCond->objects[k].cmd;
evn.funcID = kCallbackMax; evn.funcID = nullptr;
evn.initiator = nullptr; evn.initiator = nullptr;
useCondition(pCond->actor, evn); useCondition(pCond->actor, evn);
} }
@ -1088,7 +1088,7 @@ void nnExtProcessSuperSprites()
EVENT evn; EVENT evn;
evn.target = EventObject(pCond->actor); evn.target = EventObject(pCond->actor);
evn.cmd = (int8_t)aCond->xspr.command; evn.cmd = (int8_t)aCond->xspr.command;
evn.funcID = kCallbackMax; evn.funcID = nullptr;
evn.initiator = nullptr; evn.initiator = nullptr;
useCondition(pCond->actor, evn); useCondition(pCond->actor, evn);
} }
@ -1330,7 +1330,7 @@ void nnExtProcessSuperSprites()
debrisactor->norm_ang(); debrisactor->norm_ang();
DAngle ang = debrisactor->spr.Angles.Yaw; DAngle ang = debrisactor->spr.Angles.Yaw;
if ((uwater = spriteIsUnderwater(debrisactor)) == false) evKillActor(debrisactor, kCallbackEnemeyBubble); if ((uwater = spriteIsUnderwater(debrisactor)) == false) evKillActor(debrisactor, AF(EnemyBubble));
else if (Chance(0x1000 - mass)) else if (Chance(0x1000 - mass))
{ {
if (debrisactor->vel.Z > 0x100) debrisBubble(debrisactor); if (debrisactor->vel.Z > 0x100) debrisBubble(debrisactor);
@ -1611,7 +1611,7 @@ void debrisBubble(DBloodActor* actor)
} }
if (Chance(0x2000)) if (Chance(0x2000))
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1742,15 +1742,15 @@ void debrisMove(int listIndex)
sfxPlay3DSoundVolume(actor, 720, -1, 0, pitch, 75 - Random(40)); sfxPlay3DSoundVolume(actor, 720, -1, 0, pitch, 75 - Random(40));
if (!spriteIsUnderwater(actor)) if (!spriteIsUnderwater(actor))
{ {
evKillActor(actor, kCallbackEnemeyBubble); evKillActor(actor, AF(EnemyBubble));
} }
else else
{ {
evPostActor(actor, 0, kCallbackEnemeyBubble); evPostActor(actor, 0, AF(EnemyBubble));
for (int ii = 2; ii <= 5; ii++) for (int ii = 2; ii <= 5; ii++)
{ {
if (Chance(0x5000 * ii)) if (Chance(0x5000 * ii))
evPostActor(actor, Random(5), kCallbackEnemeyBubble); evPostActor(actor, Random(5), AF(EnemyBubble));
} }
} }
break; break;
@ -2462,7 +2462,7 @@ void useObjResizer(DBloodActor* sourceactor, int targType, sectortype* targSect,
targetactor->genDudeExtra.updReq[kGenDudePropertyAttack] = true; targetactor->genDudeExtra.updReq[kGenDudePropertyAttack] = true;
targetactor->genDudeExtra.updReq[kGenDudePropertyMass] = true; targetactor->genDudeExtra.updReq[kGenDudePropertyMass] = true;
targetactor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true; targetactor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true;
evPostActor(targetactor, kGenDudeUpdTimeRate, kCallbackGenDudeUpdate); evPostActor(targetactor, kGenDudeUpdTimeRate, AF(GenDudeUpdate));
} }
@ -3300,9 +3300,9 @@ void useEffectGen(DBloodActor* sourceactor, DBloodActor* actor)
int length = sizeof(gEffectGenCallbacks) / sizeof(gEffectGenCallbacks[0]); int length = sizeof(gEffectGenCallbacks) / sizeof(gEffectGenCallbacks[0]);
if (fxId < kEffectGenCallbackBase + length) if (fxId < kEffectGenCallbackBase + length)
{ {
fxId = gEffectGenCallbacks[fxId - kEffectGenCallbackBase]; auto fxfunc = gEffectGenCallbacks[fxId - kEffectGenCallbackBase];
evKillActor(actor, (CALLBACK_ID)fxId); evKillActor(actor, *fxfunc);
evPostActor(actor, 0, (CALLBACK_ID)fxId); evPostActor(actor, 0, *fxfunc);
} }
} }
@ -3628,14 +3628,14 @@ void damageSprites(DBloodActor* sourceactor, DBloodActor* actor)
case kDmgBurn: case kDmgBurn:
if (actor->xspr.burnTime > 0) break; if (actor->xspr.burnTime > 0) break;
actBurnSprite(sourceactor, actor, ClipLow(dmg >> 1, 128)); actBurnSprite(sourceactor, actor, ClipLow(dmg >> 1, 128));
evKillActor(actor, kCallbackFXFlameLick); evKillActor(actor, AF(fxFlameLick));
evPostActor(actor, 0, kCallbackFXFlameLick); // show flames evPostActor(actor, 0, AF(fxFlameLick)); // show flames
break; break;
case kDmgElectric: case kDmgElectric:
forceRecoil = true; // show tesla recoil animation forceRecoil = true; // show tesla recoil animation
break; break;
case kDmgBullet: case kDmgBullet:
evKillActor(actor, kCallbackFXBloodSpurt); evKillActor(actor, AF(fxBloodSpurt));
for (int i = 1; i < 6; i++) for (int i = 1; i < 6; i++)
{ {
if (Chance(0x16000 >> i)) if (Chance(0x16000 >> i))
@ -3804,7 +3804,7 @@ void useSeqSpawnerGen(DBloodActor* sourceactor, int objType, sectortype* pSector
} }
// should be: the more is seqs, the shorter is timer // should be: the more is seqs, the shorter is timer
evPostActor(spawned, 1000, kCallbackRemove); evPostActor(spawned, 1000, AF(Remove));
} }
} }
else else
@ -5529,7 +5529,7 @@ bool modernTypeOperateSector(sectortype* pSector, const EVENT& event)
case kSectorCounter: case kSectorCounter:
if (pXSector->locked != 1) break; if (pXSector->locked != 1) break;
SetSectorState(pSector, 0, event.initiator.Get()); SetSectorState(pSector, 0, event.initiator.Get());
evPostSector(pSector, 0, kCallbackCounterCheck); evPostSector(pSector, 0, kCmdCallback, nullptr);
break; break;
} }
return true; return true;
@ -6350,7 +6350,7 @@ int useCondition(DBloodActor* sourceactor, EVENT& event)
srcIsCondition = (pActor->GetType() == kModernCondition || pActor->GetType() == kModernConditionFalse); srcIsCondition = (pActor->GetType() == kModernCondition || pActor->GetType() == kModernConditionFalse);
// if it's a tracking condition, it must ignore all the commands sent from objects // if it's a tracking condition, it must ignore all the commands sent from objects
if (sourceactor->xspr.busyTime > 0 && event.funcID != kCallbackMax) return -1; if (sourceactor->xspr.busyTime > 0 && event.funcID != nullptr) return -1;
else if (!srcIsCondition) // save object serials in the stack and make copy of initial object else if (!srcIsCondition) // save object serials in the stack and make copy of initial object
{ {
condPush(sourceactor, event.target); condPush(sourceactor, event.target);
@ -6553,7 +6553,7 @@ void useUniMissileGen(DBloodActor* sourceactor, DBloodActor* actor)
// add bursting for missiles // add bursting for missiles
if (missileactor->GetType() != kMissileFlareAlt && sourceactor->xspr.data4 > 0) if (missileactor->GetType() != kMissileFlareAlt && sourceactor->xspr.data4 > 0)
evPostActor(missileactor, ClipHigh(sourceactor->xspr.data4, 500), kCallbackMissileBurst); evPostActor(missileactor, ClipHigh(sourceactor->xspr.data4, 500), AF(callbackUniMissileBurst));
} }
} }
@ -7614,7 +7614,7 @@ bool setDataValueOfObject(int objType, sectortype* sect, walltype* wal, DBloodAc
case kDudeModernCustomBurning: case kDudeModernCustomBurning:
objActor->genDudeExtra.updReq[kGenDudePropertyWeapon] = true; objActor->genDudeExtra.updReq[kGenDudePropertyWeapon] = true;
objActor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true; objActor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true;
evPostActor(objActor, kGenDudeUpdTimeRate, kCallbackGenDudeUpdate); evPostActor(objActor, kGenDudeUpdTimeRate, AF(GenDudeUpdate));
break; break;
} }
return true; return true;
@ -7629,7 +7629,7 @@ bool setDataValueOfObject(int objType, sectortype* sect, walltype* wal, DBloodAc
objActor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true; objActor->genDudeExtra.updReq[kGenDudePropertyDmgScale] = true;
objActor->genDudeExtra.updReq[kGenDudePropertyStates] = true; objActor->genDudeExtra.updReq[kGenDudePropertyStates] = true;
objActor->genDudeExtra.updReq[kGenDudePropertyAttack] = true; objActor->genDudeExtra.updReq[kGenDudePropertyAttack] = true;
evPostActor(objActor, kGenDudeUpdTimeRate, kCallbackGenDudeUpdate); evPostActor(objActor, kGenDudeUpdTimeRate, AF(GenDudeUpdate));
break; break;
} }
return true; return true;
@ -9190,7 +9190,7 @@ void callbackUniMissileBurst(DBloodActor* actor) // 22
if ((burstactor->spr.cstat & CSTAT_SPRITE_BLOCK)) if ((burstactor->spr.cstat & CSTAT_SPRITE_BLOCK))
{ {
burstactor->spr.cstat &= ~CSTAT_SPRITE_BLOCK; // we don't want missiles impact each other burstactor->spr.cstat &= ~CSTAT_SPRITE_BLOCK; // we don't want missiles impact each other
evPostActor(burstactor, 100, kCallbackMissileSpriteBlock); // so set blocking flag a bit later evPostActor(burstactor, 100, AF(callbackMakeMissileBlocking)); // so set blocking flag a bit later
} }
burstactor->spr.pal = actor->spr.pal; burstactor->spr.pal = actor->spr.pal;
@ -9211,9 +9211,9 @@ void callbackUniMissileBurst(DBloodActor* actor) // 22
auto spAngVec = DAngle::fromBam(i << 29).ToVector().Rotated90CW() * nRadius; auto spAngVec = DAngle::fromBam(i << 29).ToVector().Rotated90CW() * nRadius;
if (i & 1) spAngVec *= 0.5; if (i & 1) spAngVec *= 0.5;
burstactor->vel += DVector3(DVector2(0, spAngVec.X).Rotated(nAngVec.X, nAngVec.Y), spAngVec.Y); burstactor->vel += DVector3(DVector2(0, spAngVec.X).Rotated(nAngVec.X, nAngVec.Y), spAngVec.Y);
evPostActor(burstactor, 960, kCallbackRemove); evPostActor(burstactor, 960, AF(Remove));
} }
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, AF(Remove));
} }
@ -9317,7 +9317,7 @@ static void dokillEffectGenCallbacks(DBloodActor* actor)
{ {
int l = sizeof(gEffectGenCallbacks) / sizeof(gEffectGenCallbacks[0]); int l = sizeof(gEffectGenCallbacks) / sizeof(gEffectGenCallbacks[0]);
while (--l >= 0) while (--l >= 0)
evKillActor(actor, (CALLBACK_ID)gEffectGenCallbacks[l]); evKillActor(actor, *gEffectGenCallbacks[l]);
} }
void killEffectGenCallbacks(DBloodActor* actor) void killEffectGenCallbacks(DBloodActor* actor)

View file

@ -2159,7 +2159,7 @@ int playerDamageSprite(DBloodActor* source, DBloodPlayer* pPlayer, DAMAGE_TYPE n
nKneelingPlayer = nPlayerKneelClient; nKneelingPlayer = nPlayerKneelClient;
powerupActivate(pPlayer, kPwUpDeliriumShroom); powerupActivate(pPlayer, kPwUpDeliriumShroom);
pActor->SetTarget(source); pActor->SetTarget(source);
evPostActor(pPlayer->GetActor(), 15, kCallbackFinishHim); evPostActor(pPlayer->GetActor(), 15, AF(FinishHim));
} }
else else
{ {
@ -2191,7 +2191,7 @@ int playerDamageSprite(DBloodActor* source, DBloodPlayer* pPlayer, DAMAGE_TYPE n
DBloodActor* pItem = nullptr; DBloodActor* pItem = nullptr;
if (pPlayer->GetActor()->xspr.dropMsg && (pItem = actDropObject(pActor, pPlayer->GetActor()->xspr.dropMsg)) != NULL) if (pPlayer->GetActor()->xspr.dropMsg && (pItem = actDropObject(pActor, pPlayer->GetActor()->xspr.dropMsg)) != NULL)
evPostActor(pItem, 500, kCallbackRemove); evPostActor(pItem, 500, AF(Remove));
if (pPlayer->GetActor()->xspr.key) { if (pPlayer->GetActor()->xspr.key) {
@ -2202,7 +2202,7 @@ int playerDamageSprite(DBloodActor* source, DBloodPlayer* pPlayer, DAMAGE_TYPE n
} }
if (i == 0 && (pItem = actDropObject(pActor, (pPlayer->GetActor()->xspr.key + kItemKeyBase) - 1)) != NULL) if (i == 0 && (pItem = actDropObject(pActor, (pPlayer->GetActor()->xspr.key + kItemKeyBase) - 1)) != NULL)
evPostActor(pItem, 500, kCallbackRemove); evPostActor(pItem, 500, AF(Remove));
} }

View file

@ -723,7 +723,7 @@ void seqProcess(int nTicks)
{ {
evKillActor(actor); evKillActor(actor);
if ((actor->spr.hitag & kAttrRespawn) != 0 && (actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax)) if ((actor->spr.hitag & kAttrRespawn) != 0 && (actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax))
evPostActor(actor, gGameOptions.nMonsterRespawnTime, kCallbackRespawn); evPostActor(actor, gGameOptions.nMonsterRespawnTime, AF(Respawn));
else DeleteSprite(actor); // safe to not use actPostSprite here else DeleteSprite(actor); // safe to not use actPostSprite here
} }
} }

View file

@ -71,7 +71,7 @@ bool SetSpriteState(DBloodActor* actor, int nState, DBloodActor* initiator)
if ((actor->spr.flags & kHitagRespawn) != 0 && actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax) if ((actor->spr.flags & kHitagRespawn) != 0 && actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax)
{ {
actor->xspr.respawnPending = 3; actor->xspr.respawnPending = 3;
evPostActor(actor, gGameOptions.nMonsterRespawnTime, kCallbackRespawn); evPostActor(actor, gGameOptions.nMonsterRespawnTime, AF(Respawn));
return 1; return 1;
} }
if (actor->xspr.restState != nState && actor->xspr.waitTime > 0) if (actor->xspr.restState != nState && actor->xspr.waitTime > 0)
@ -280,7 +280,7 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event)
{ {
missile->SetOwner(actor); missile->SetOwner(actor);
actor->xspr.stateTimer = 1; actor->xspr.stateTimer = 1;
evPostActor(actor, (!actor->xspr.data3 ? 120 : 3 * 120) / 10, kCallbackLeechStateTimer); evPostActor(actor, (!actor->xspr.data3 ? 120 : 3 * 120) / 10, AF(LeechStateTimer));
actor->xspr.data3 = ClipLow(actor->xspr.data3 - 1, 0); actor->xspr.data3 = ClipLow(actor->xspr.data3 - 1, 0);
if (!VanillaMode()) // disable collisions so lifeleech doesn't do that weird bobbing if (!VanillaMode()) // disable collisions so lifeleech doesn't do that weird bobbing
missile->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; missile->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
@ -2313,7 +2313,7 @@ void trInit(TArray<DBloodActor*>& actors)
else else
#endif #endif
pXSector->triggerOnce = 1; pXSector->triggerOnce = 1;
evPostSector(pSector, 0, kCallbackCounterCheck); evPostSector(pSector, 0, kCmdCallback, nullptr);
break; break;
case kSectorZMotion: case kSectorZMotion:
case kSectorZMotionSprite: case kSectorZMotionSprite:

View file

@ -24,214 +24,6 @@ See the GNU General Public License for more details.
#include "blood.h" #include "blood.h"
BEGIN_BLD_NS BEGIN_BLD_NS
// ai callbacks
DEF_ANIMATOR(aiGenDudeMoveForward)
DEF_ANIMATOR(aiMoveDodge)
DEF_ANIMATOR(aiMoveForward)
DEF_ANIMATOR(aiMoveTurn)
DEF_ANIMATOR(aiPodChase)
DEF_ANIMATOR(aiPodMove)
DEF_ANIMATOR(aiPodSearch)
DEF_ANIMATOR(aiThinkTarget)
DEF_ANIMATOR(batMoveDodgeDown)
DEF_ANIMATOR(batMoveDodgeUp)
DEF_ANIMATOR(batMoveFly)
DEF_ANIMATOR(batMoveForward)
DEF_ANIMATOR(batMoveSwoop)
DEF_ANIMATOR(batMoveToCeil)
DEF_ANIMATOR(batThinkChase)
DEF_ANIMATOR(batThinkGoto)
DEF_ANIMATOR(batThinkPonder)
DEF_ANIMATOR(batThinkSearch)
DEF_ANIMATOR(batThinkTarget)
DEF_ANIMATOR(beastMoveForward)
DEF_ANIMATOR(beastThinkChase)
DEF_ANIMATOR(beastThinkGoto)
DEF_ANIMATOR(beastThinkSearch)
DEF_ANIMATOR(beastThinkSwimChase)
DEF_ANIMATOR(beastThinkSwimGoto)
DEF_ANIMATOR(burnThinkChase)
DEF_ANIMATOR(burnThinkGoto)
DEF_ANIMATOR(burnThinkSearch)
DEF_ANIMATOR(calebThinkChase)
DEF_ANIMATOR(calebThinkGoto)
DEF_ANIMATOR(calebThinkSearch)
DEF_ANIMATOR(calebThinkSwimChase)
DEF_ANIMATOR(calebThinkSwimGoto)
DEF_ANIMATOR(cerberusThinkChase)
DEF_ANIMATOR(cerberusThinkGoto)
DEF_ANIMATOR(cerberusThinkSearch)
DEF_ANIMATOR(cerberusThinkTarget)
DEF_ANIMATOR(cultThinkChase)
DEF_ANIMATOR(cultThinkGoto)
DEF_ANIMATOR(cultThinkSearch)
DEF_ANIMATOR(eelMoveAscend)
DEF_ANIMATOR(eelMoveDodgeDown)
DEF_ANIMATOR(eelMoveDodgeUp)
DEF_ANIMATOR(eelMoveForward)
DEF_ANIMATOR(eelMoveSwoop)
DEF_ANIMATOR(eelMoveToCeil)
DEF_ANIMATOR(eelThinkChase)
DEF_ANIMATOR(eelThinkGoto)
DEF_ANIMATOR(eelThinkPonder)
DEF_ANIMATOR(eelThinkSearch)
DEF_ANIMATOR(eelThinkTarget)
DEF_ANIMATOR(entryAIdle)
DEF_ANIMATOR(entryEStand)
DEF_ANIMATOR(entryEZombie)
DEF_ANIMATOR(entryFStatue)
DEF_ANIMATOR(entrySStatue)
DEF_ANIMATOR(forcePunch)
DEF_ANIMATOR(gargMoveDodgeDown)
DEF_ANIMATOR(gargMoveDodgeUp)
DEF_ANIMATOR(gargMoveFly)
DEF_ANIMATOR(gargMoveForward)
DEF_ANIMATOR(gargMoveSlow)
DEF_ANIMATOR(gargMoveSwoop)
DEF_ANIMATOR(gargThinkChase)
DEF_ANIMATOR(gargThinkGoto)
DEF_ANIMATOR(gargThinkSearch)
DEF_ANIMATOR(gargThinkTarget)
DEF_ANIMATOR(ghostMoveDodgeDown)
DEF_ANIMATOR(ghostMoveDodgeUp)
DEF_ANIMATOR(ghostMoveFly)
DEF_ANIMATOR(ghostMoveForward)
DEF_ANIMATOR(ghostMoveSlow)
DEF_ANIMATOR(ghostMoveSwoop)
DEF_ANIMATOR(ghostThinkChase)
DEF_ANIMATOR(ghostThinkGoto)
DEF_ANIMATOR(ghostThinkSearch)
DEF_ANIMATOR(ghostThinkTarget)
DEF_ANIMATOR(gillThinkChase)
DEF_ANIMATOR(gillThinkGoto)
DEF_ANIMATOR(gillThinkSearch)
DEF_ANIMATOR(gillThinkSwimChase)
DEF_ANIMATOR(gillThinkSwimGoto)
DEF_ANIMATOR(handThinkChase)
DEF_ANIMATOR(handThinkGoto)
DEF_ANIMATOR(handThinkSearch)
DEF_ANIMATOR(houndThinkChase)
DEF_ANIMATOR(houndThinkGoto)
DEF_ANIMATOR(houndThinkSearch)
DEF_ANIMATOR(innocThinkChase)
DEF_ANIMATOR(innocThinkGoto)
DEF_ANIMATOR(innocThinkSearch)
DEF_ANIMATOR(MorphToBeast)
DEF_ANIMATOR(myThinkSearch)
DEF_ANIMATOR(myThinkTarget)
DEF_ANIMATOR(playStatueBreakSnd)
DEF_ANIMATOR(ratThinkChase)
DEF_ANIMATOR(ratThinkGoto)
DEF_ANIMATOR(ratThinkSearch)
DEF_ANIMATOR(spidThinkChase)
DEF_ANIMATOR(spidThinkGoto)
DEF_ANIMATOR(spidThinkSearch)
DEF_ANIMATOR(sub_628A0)
DEF_ANIMATOR(sub_62AE0)
DEF_ANIMATOR(sub_62D7C)
DEF_ANIMATOR(sub_65D04)
DEF_ANIMATOR(sub_65F44)
DEF_ANIMATOR(sub_661E0)
DEF_ANIMATOR(sub_6CB00)
DEF_ANIMATOR(sub_6CD74)
DEF_ANIMATOR(sub_6D03C)
DEF_ANIMATOR(sub_72580)
DEF_ANIMATOR(sub_725A4)
DEF_ANIMATOR(sub_72850)
DEF_ANIMATOR(tchernobogThinkChase)
DEF_ANIMATOR(unicultThinkChase)
DEF_ANIMATOR(unicultThinkGoto)
DEF_ANIMATOR(unicultThinkSearch)
DEF_ANIMATOR(zombaThinkChase)
DEF_ANIMATOR(zombaThinkGoto)
DEF_ANIMATOR(zombaThinkPonder)
DEF_ANIMATOR(zombaThinkSearch)
DEF_ANIMATOR(zombfThinkChase)
DEF_ANIMATOR(zombfThinkGoto)
DEF_ANIMATOR(zombfThinkSearch)
// seq callbacks
DEF_ANIMATOR(FireballSeqCallback)
DEF_ANIMATOR(Fx33Callback)
DEF_ANIMATOR(NapalmSeqCallback)
DEF_ANIMATOR(Fx32Callback)
DEF_ANIMATOR(TreeToGibCallback)
DEF_ANIMATOR(DudeToGibCallback1)
DEF_ANIMATOR(DudeToGibCallback2)
DEF_ANIMATOR(batBiteSeqCallback)
DEF_ANIMATOR(SlashSeqCallback)
DEF_ANIMATOR(StompSeqCallback)
DEF_ANIMATOR(eelBiteSeqCallback)
DEF_ANIMATOR(BurnSeqCallback)
DEF_ANIMATOR(SeqAttackCallback)
DEF_ANIMATOR(cerberusBiteSeqCallback)
DEF_ANIMATOR(cerberusBurnSeqCallback)
DEF_ANIMATOR(cerberusBurnSeqCallback2)
DEF_ANIMATOR(TommySeqCallback)
DEF_ANIMATOR(TeslaSeqCallback)
DEF_ANIMATOR(ShotSeqCallback)
DEF_ANIMATOR(cultThrowSeqCallback)
DEF_ANIMATOR(cultThrowSeqCallback2)
DEF_ANIMATOR(cultThrowSeqCallback3)
DEF_ANIMATOR(SlashFSeqCallback)
DEF_ANIMATOR(ThrowFSeqCallback)
DEF_ANIMATOR(BlastSSeqCallback)
DEF_ANIMATOR(ThrowSSeqCallback)
DEF_ANIMATOR(ghostSlashSeqCallback)
DEF_ANIMATOR(ghostThrowSeqCallback)
DEF_ANIMATOR(ghostBlastSeqCallback)
DEF_ANIMATOR(GillBiteSeqCallback)
DEF_ANIMATOR(HandJumpSeqCallback)
DEF_ANIMATOR(houndBiteSeqCallback)
DEF_ANIMATOR(houndBurnSeqCallback)
DEF_ANIMATOR(podPlaySound1)
DEF_ANIMATOR(podPlaySound2)
DEF_ANIMATOR(podAttack)
DEF_ANIMATOR(podExplode)
DEF_ANIMATOR(ratBiteSeqCallback)
DEF_ANIMATOR(SpidBiteSeqCallback)
DEF_ANIMATOR(SpidJumpSeqCallback)
DEF_ANIMATOR(SpidBirthSeqCallback)
DEF_ANIMATOR(tchernobogFire)
DEF_ANIMATOR(tchernobogBurnSeqCallback)
DEF_ANIMATOR(tchernobogBurnSeqCallback2)
DEF_ANIMATOR(genDudeAttack1)
DEF_ANIMATOR(punchCallback)
DEF_ANIMATOR(ThrowCallback1)
DEF_ANIMATOR(ThrowCallback2)
DEF_ANIMATOR(HackSeqCallback)
DEF_ANIMATOR(StandSeqCallback)
DEF_ANIMATOR(zombfHackSeqCallback)
DEF_ANIMATOR(PukeSeqCallback)
DEF_ANIMATOR(ThrowSeqCallback)
DEF_ANIMATOR(PlayerSurvive)
DEF_ANIMATOR(PlayerKneelsOver)
DEF_ANIMATOR(FireballTrapSeqCallback)
DEF_ANIMATOR(MGunFireSeqCallback)
DEF_ANIMATOR(MGunOpenSeqCallback)
// event callbacks
DEF_ANIMATOR(fxFlameLick) // 0
DEF_ANIMATOR(Remove) // 1
DEF_ANIMATOR(FlareBurst) // 2
DEF_ANIMATOR(fxFlareSpark) // 3
DEF_ANIMATOR(fxFlareSparkLite) // 4
DEF_ANIMATOR(fxZombieBloodSpurt) // 5
DEF_ANIMATOR(fxBloodSpurt) // 6
DEF_ANIMATOR(fxArcSpark) // 7
DEF_ANIMATOR(fxDynPuff) // 8
DEF_ANIMATOR(Respawn) // 9
DEF_ANIMATOR(PlayerBubble) // 10
DEF_ANIMATOR(EnemyBubble) // 11
DEF_ANIMATOR(FinishHim) // 13
DEF_ANIMATOR(fxBloodBits) // 14
DEF_ANIMATOR(fxTeslaAlt) // 15
DEF_ANIMATOR(fxBouncingSleeve) // 16
DEF_ANIMATOR(returnFlagToBase) // 17
DEF_ANIMATOR(fxPodBloodSpray) // 18
DEF_ANIMATOR(fxPodBloodSplat) // 19
DEF_ANIMATOR(LeechStateTimer) // 20
DEF_ANIMATOR(DropVoodooCb) // unused
DEFINE_FIELD_X(GAMEOPTIONS, GAMEOPTIONS, nGameType) DEFINE_FIELD_X(GAMEOPTIONS, GAMEOPTIONS, nGameType)
DEFINE_FIELD_X(GAMEOPTIONS, GAMEOPTIONS, nDifficulty) DEFINE_FIELD_X(GAMEOPTIONS, GAMEOPTIONS, nDifficulty)
@ -488,16 +280,16 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBloodActor, addX, bloodactor_addX)
return 0; return 0;
} }
static void bloodactor_evPostActorCallback(DBloodActor* act, int delta, int id) static void bloodactor_evPostActorCallback(DBloodActor* act, int delta, VMFunction* id)
{ {
evPostActor(act, delta, (CALLBACK_ID)id); evPostActor(act, delta, id);
} }
DEFINE_ACTION_FUNCTION_NATIVE(DBloodActor, evPostActorCallback, bloodactor_evPostActorCallback) DEFINE_ACTION_FUNCTION_NATIVE(DBloodActor, evPostActorCallback, bloodactor_evPostActorCallback)
{ {
PARAM_SELF_PROLOGUE(DBloodActor); PARAM_SELF_PROLOGUE(DBloodActor);
PARAM_INT(d); PARAM_INT(d);
PARAM_INT(id); PARAM_POINTER(id, VMFunction);
bloodactor_evPostActorCallback(self, d, id); bloodactor_evPostActorCallback(self, d, id);
return 0; return 0;
} }

View file

@ -1821,7 +1821,7 @@ void DropVoodoo(int, DBloodPlayer* pPlayer)
if (spawned) if (spawned)
{ {
spawned->xspr.data1 = pPlayer->ammoCount[9]; spawned->xspr.data1 = pPlayer->ammoCount[9];
evPostActor(spawned, 90, kCallbackDropVoodoo); evPostActor(spawned, 90, AF(DropVoodooCb));
UseAmmo(pPlayer, 6, 480/*gAmmoItemData[0].count*/); UseAmmo(pPlayer, 6, 480/*gAmmoItemData[0].count*/);
UseAmmo(pPlayer, 9, pPlayer->ammoCount[9]); UseAmmo(pPlayer, 9, pPlayer->ammoCount[9]);
pPlayer->hasWeapon[kWeapVoodooDoll] = 0; pPlayer->hasWeapon[kWeapVoodooDoll] = 0;
@ -1951,7 +1951,7 @@ void AltFireNapalm(int, DBloodPlayer* pPlayer)
UseAmmo(pPlayer, 4, missile->xspr.data4); UseAmmo(pPlayer, 4, missile->xspr.data4);
seqSpawn(22, missile, -1); seqSpawn(22, missile, -1);
actBurnSprite(pPlayer->GetActor(), missile, 600); actBurnSprite(pPlayer->GetActor(), missile, 600);
evPostActor(missile, 0, kCallbackFXFlameLick); evPostActor(missile, 0, AF(fxFlameLick));
sfxPlay3DSound(missile, 480, 2, 0); sfxPlay3DSound(missile, 480, 2, 0);
pPlayer->visibility = 30; pPlayer->visibility = 30;
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
@ -2003,7 +2003,7 @@ void AltFireLifeLeech(int, DBloodPlayer* pPlayer)
missile->xspr.Proximity = 1; missile->xspr.Proximity = 1;
missile->xspr.DudeLockout = 1; missile->xspr.DudeLockout = 1;
missile->xspr.stateTimer = 1; missile->xspr.stateTimer = 1;
evPostActor(missile, 120, kCallbackLeechStateTimer); evPostActor(missile, 120, AF(LeechStateTimer));
if (gGameOptions.nGameType <= 1) if (gGameOptions.nGameType <= 1)
{ {
int nAmmo = pPlayer->ammoCount[8]; int nAmmo = pPlayer->ammoCount[8];

View file

@ -117,37 +117,6 @@ class BloodActor : CoreActor native
kStatFree = 1024, kStatFree = 1024,
}; };
// the callback ids are only temporary. This should work with direct function references.
enum CALLBACK_ID {
kCallbackNone = -1,
kCallbackFXFlameLick = 0,
kCallbackRemove = 1,
kCallbackFXFlareBurst = 2,
kCallbackFXFlareSpark = 3,
kCallbackFXFlareSparkLite = 4,
kCallbackFXZombieSpurt = 5,
kCallbackFXBloodSpurt = 6,
kCallbackFXArcSpark = 7,
kCallbackFXDynPuff = 8,
kCallbackRespawn = 9,
kCallbackPlayerBubble = 10,
kCallbackEnemeyBubble = 11,
kCallbackCounterCheck = 12,
kCallbackFinishHim = 13,
kCallbackFXBloodBits = 14,
kCallbackFXTeslaAlt = 15,
kCallbackFXBouncingSleeve = 16,
kCallbackReturnFlag = 17,
kCallbackFXPodBloodSpray = 18,
kCallbackFXPodBloodSplat = 19,
kCallbackLeechStateTimer = 20,
kCallbackDropVoodoo = 21, // unused
kCallbackMissileBurst = 22,
kCallbackMissileSpriteBlock = 23,
kCallbackGenDudeUpdate = 24,
kCallbackCondition = 25,
}
enum SEQ_CALLBACK_ID enum SEQ_CALLBACK_ID
{ {
@ -503,7 +472,7 @@ native void DropVoodooCb(); // unused
} }
if (itemtype is 'BloodFlagBase' && gGameOptions.nGameType == Blood.kTeamplay) if (itemtype is 'BloodFlagBase' && gGameOptions.nGameType == Blood.kTeamplay)
{ {
spawned.evPostActorCallback(1800, kCallbackReturnFlag); spawned.evPostActorCallback(1800, AF(returnFlagToBase));
} }
double top, bottom; double top, bottom;
@ -558,7 +527,7 @@ native void DropVoodooCb(); // unused
spawned.cstat |= CSTAT_SPRITE_BLOCK; spawned.cstat |= CSTAT_SPRITE_BLOCK;
spawned.xspr.target = null; spawned.xspr.target = null;
spawned.evPostActorCallback(600, kCallbackRemove); spawned.evPostActorCallback(600, AF(Remove));
spawned.initMissile(self); // handle type specific init. spawned.initMissile(self); // handle type specific init.