Skip to content

Commit

Permalink
- actFireMissile.
Browse files Browse the repository at this point in the history
  • Loading branch information
coelckers committed Oct 10, 2021
1 parent 7eac8b7 commit 351dabd
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 126 deletions.
182 changes: 97 additions & 85 deletions source/games/blood/src/actor.cpp
Expand Up @@ -6654,78 +6654,20 @@ DBloodActor* actFireThing(DBloodActor* actor, int a2, int a3, int a4, int thingT
//
//---------------------------------------------------------------------------

spritetype* actFireMissile(spritetype* pSprite, int a2, int a3, int a4, int a5, int a6, int nType)
void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
{

assert(nType >= kMissileBase && nType < kMissileMax);
char v4 = 0;
int nSprite = pSprite->index;
const MissileType* pMissileInfo = &missileInfo[nType - kMissileBase];
int x = pSprite->x + MulScale(a2, Cos(pSprite->ang + 512), 30);
int y = pSprite->y + MulScale(a2, Sin(pSprite->ang + 512), 30);
int z = pSprite->z + a3;
int clipdist = pMissileInfo->clipDist + pSprite->clipdist;
x += MulScale(clipdist, Cos(pSprite->ang), 28);
y += MulScale(clipdist, Sin(pSprite->ang), 28);
int hit = HitScan(pSprite, z, x - pSprite->x, y - pSprite->y, 0, CLIPMASK0, clipdist);
if (hit != -1)
{
if (hit == 3 || hit == 0)
{
v4 = 1;
x = gHitInfo.hitx - MulScale(Cos(pSprite->ang), 16, 30);
y = gHitInfo.hity - MulScale(Sin(pSprite->ang), 16, 30);
}
else
{
x = gHitInfo.hitx - MulScale(pMissileInfo->clipDist << 1, Cos(pSprite->ang), 28);
y = gHitInfo.hity - MulScale(pMissileInfo->clipDist << 1, Sin(pSprite->ang), 28);
}
}
auto actor = actSpawnSprite(pSprite->sectnum, x, y, z, 5, 1);
spritetype* pMissile = &actor->s();
auto pMissile = &spawned->s();
int nMissile = pMissile->index;
show2dsprite.Set(nMissile);
pMissile->type = nType;
pMissile->shade = pMissileInfo->shade;
pMissile->pal = 0;
pMissile->clipdist = pMissileInfo->clipDist;
pMissile->flags = 1;
pMissile->xrepeat = pMissileInfo->xrepeat;
pMissile->yrepeat = pMissileInfo->yrepeat;
pMissile->picnum = pMissileInfo->picnum;
pMissile->ang = (pSprite->ang + pMissileInfo->angleOfs) & 2047;
xvel[nMissile] = MulScale(pMissileInfo->velocity, a4, 14);
yvel[nMissile] = MulScale(pMissileInfo->velocity, a5, 14);
zvel[nMissile] = MulScale(pMissileInfo->velocity, a6, 14);
pMissile->owner = pSprite->index;
pMissile->cstat |= 1;
int nXSprite = pMissile->extra;
assert(nXSprite > 0 && nXSprite < kMaxXSprites);
xsprite[nXSprite].target_i = -1;
evPost(nMissile, 3, 600, kCallbackRemove);

actBuildMissile(pMissile, nXSprite, nSprite);

if (v4)
switch (pMissile->type)
{
actImpactMissile(&bloodActors[pMissile->index], hit);
pMissile = NULL;
}
return pMissile;
}

void actBuildMissile(spritetype* pMissile, int nXSprite, int nSprite) {
int nMissile = pMissile->index;
switch (pMissile->type) {
case kMissileLifeLeechRegular:
evPost(nMissile, 3, 0, kCallbackFXFlameLick);
break;
case kMissileTeslaAlt:
evPost(nMissile, 3, 0, kCallbackFXTeslaAlt);
break;
case kMissilePukeGreen:
seqSpawn(29, 3, nXSprite, -1);
seqSpawn(29, spawned, -1);
break;
case kMissileButcherKnife:
pMissile->cstat |= 16;
Expand All @@ -6734,60 +6676,130 @@ void actBuildMissile(spritetype* pMissile, int nXSprite, int nSprite) {
sfxPlay3DSound(pMissile, 251, 0, 0);
break;
case kMissileEctoSkull:
seqSpawn(2, 3, nXSprite, -1);
seqSpawn(2, spawned, -1);
sfxPlay3DSound(pMissile, 493, 0, 0);
break;
case kMissileFireballNapalm:
seqSpawn(61, 3, nXSprite, nNapalmClient);
seqSpawn(61, spawned, nNapalmClient);
sfxPlay3DSound(pMissile, 441, 0, 0);
break;
case kMissileFireball:
seqSpawn(22, 3, nXSprite, nFireballClient);
seqSpawn(22, spawned, nFireballClient);
sfxPlay3DSound(pMissile, 441, 0, 0);
break;
case kMissileFlameHound:
seqSpawn(27, 3, nXSprite, -1);
xvel[nMissile] += xvel[nSprite] / 2 + Random2(0x11111);
yvel[nMissile] += yvel[nSprite] / 2 + Random2(0x11111);
zvel[nMissile] += zvel[nSprite] / 2 + Random2(0x11111);
seqSpawn(27, spawned, -1);
spawned->xvel() += actor->xvel() / 2 + Random2(0x11111);
spawned->yvel() += actor->yvel() / 2 + Random2(0x11111);
spawned->zvel() += actor->zvel() / 2 + Random2(0x11111);
break;
case kMissileFireballCerberus:
seqSpawn(61, 3, nXSprite, dword_2192E0);
seqSpawn(61, spawned, dword_2192E0);
sfxPlay3DSound(pMissile, 441, 0, 0);
break;
case kMissileFireballTchernobog:
seqSpawn(23, 3, nXSprite, dword_2192D8);
xvel[nMissile] += xvel[nSprite] / 2 + Random2(0x11111);
yvel[nMissile] += yvel[nSprite] / 2 + Random2(0x11111);
zvel[nMissile] += zvel[nSprite] / 2 + Random2(0x11111);
seqSpawn(23, spawned, dword_2192D8);
spawned->xvel() += actor->xvel() / 2 + Random2(0x11111);
spawned->yvel() += actor->yvel() / 2 + Random2(0x11111);
spawned->zvel() += actor->zvel() / 2 + Random2(0x11111);
break;
case kMissileFlameSpray:
if (Chance(0x8000))
seqSpawn(0, 3, nXSprite, -1);
else
seqSpawn(1, 3, nXSprite, -1);
xvel[nMissile] += xvel[nSprite] + Random2(0x11111);
yvel[nMissile] += yvel[nSprite] + Random2(0x11111);
zvel[nMissile] += zvel[nSprite] + Random2(0x11111);
if (Chance(0x8000)) seqSpawn(0, spawned, -1);
else seqSpawn(1, spawned, -1);
spawned->xvel() += actor->xvel() / 2 + Random2(0x11111);
spawned->yvel() += actor->yvel() / 2 + Random2(0x11111);
spawned->zvel() += actor->zvel() / 2 + Random2(0x11111);
break;
case kMissileFlareAlt:
evPost(nMissile, 3, 30, kCallbackFXFlareBurst);
evPost(nMissile, 3, 0, kCallbackFXFlareSpark);
evPost(spawned, 30, kCallbackFXFlareBurst);
evPost(spawned, 0, kCallbackFXFlareSpark);
sfxPlay3DSound(pMissile, 422, 0, 0);
break;
case kMissileFlareRegular:
evPost(nMissile, 3, 0, kCallbackFXFlareSpark);
evPost(spawned, 0, kCallbackFXFlareSpark);
sfxPlay3DSound(pMissile, 422, 0, 0);
break;
case kMissileLifeLeechAltSmall:
evPost(nMissile, 3, 0, kCallbackFXArcSpark);
evPost(spawned, 0, kCallbackFXArcSpark);
break;
case kMissileArcGargoyle:
sfxPlay3DSound(pMissile, 252, 0, 0);
break;
}
}

//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------

DBloodActor* actFireMissile(DBloodActor* actor, int a2, int a3, int a4, int a5, int a6, int nType)
{

assert(nType >= kMissileBase && nType < kMissileMax);
char v4 = 0;
auto pSprite = &actor->s();
int nSprite = pSprite->index;
const MissileType* pMissileInfo = &missileInfo[nType - kMissileBase];
int x = pSprite->x + MulScale(a2, Cos(pSprite->ang + 512), 30);
int y = pSprite->y + MulScale(a2, Sin(pSprite->ang + 512), 30);
int z = pSprite->z + a3;
int clipdist = pMissileInfo->clipDist + pSprite->clipdist;
x += MulScale(clipdist, Cos(pSprite->ang), 28);
y += MulScale(clipdist, Sin(pSprite->ang), 28);
int hit = HitScan(pSprite, z, x - pSprite->x, y - pSprite->y, 0, CLIPMASK0, clipdist);
if (hit != -1)
{
if (hit == 3 || hit == 0)
{
v4 = 1;
x = gHitInfo.hitx - MulScale(Cos(pSprite->ang), 16, 30);
y = gHitInfo.hity - MulScale(Sin(pSprite->ang), 16, 30);
}
else
{
x = gHitInfo.hitx - MulScale(pMissileInfo->clipDist << 1, Cos(pSprite->ang), 28);
y = gHitInfo.hity - MulScale(pMissileInfo->clipDist << 1, Sin(pSprite->ang), 28);
}
}
auto spawned = actSpawnSprite(pSprite->sectnum, x, y, z, 5, 1);
spritetype* pMissile = &spawned->s();
int nMissile = pMissile->index;
show2dsprite.Set(nMissile);
pMissile->type = nType;
pMissile->shade = pMissileInfo->shade;
pMissile->pal = 0;
pMissile->clipdist = pMissileInfo->clipDist;
pMissile->flags = 1;
pMissile->xrepeat = pMissileInfo->xrepeat;
pMissile->yrepeat = pMissileInfo->yrepeat;
pMissile->picnum = pMissileInfo->picnum;
pMissile->ang = (pSprite->ang + pMissileInfo->angleOfs) & 2047;
spawned->xvel() = MulScale(pMissileInfo->velocity, a4, 14);
spawned->yvel() = MulScale(pMissileInfo->velocity, a5, 14);
spawned->zvel() = MulScale(pMissileInfo->velocity, a6, 14);
pMissile->owner = pSprite->index;
pMissile->cstat |= 1;
spawned->SetTarget(nullptr);
evPost(spawned, 600, kCallbackRemove);

actBuildMissile(spawned, actor);

if (v4)
{
actImpactMissile(spawned, hit);
return nullptr;
}
return spawned;
}

//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------

int actGetRespawnTime(DBloodActor* actor)
{
spritetype* pSprite = &actor->s();
Expand Down
4 changes: 2 additions & 2 deletions source/games/blood/src/actor.h
Expand Up @@ -233,8 +233,8 @@ DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool a6
DBloodActor* actSpawnDude(DBloodActor* pSource, short nType, int a3, int a4);
DBloodActor * actSpawnSprite(DBloodActor *pSource, int nStat);
DBloodActor * actSpawnThing(int nSector, int x, int y, int z, int nThingType);
spritetype * actFireThing_(spritetype *pSprite, int a2, int a3, int a4, int thingType, int a6);
DBloodActor* actFireThing(DBloodActor* pSprite, int a2, int a3, int a4, int thingType, int a6);
DBloodActor* actFireMissile(DBloodActor *pSprite, int a2, int a3, int a4, int a5, int a6, int nType);

int actGetRespawnTime(DBloodActor *pSprite);
bool actCheckRespawn(DBloodActor *pSprite);
Expand All @@ -244,7 +244,7 @@ void actPostSprite(int nSprite, int nStatus);
void actPostSprite(DBloodActor* actor, int status);
void actPostProcess(void);
void MakeSplash(DBloodActor *actor);
void actBuildMissile(spritetype* pMissile, int nXSprite, int nSprite);
void actBuildMissile(DBloodActor* spawned, DBloodActor* actor);

extern const int DudeDifficulty[];

Expand Down
12 changes: 6 additions & 6 deletions source/games/blood/src/aicerber.cpp
Expand Up @@ -144,11 +144,11 @@ void cerberusBurnSeqCallback(int, DBloodActor* actor)
}
switch (pSprite->type) {
case kDudeCerberusTwoHead:
actFireMissile(pSprite, -350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
actFireMissile(pSprite, 350, -100, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
actFireMissile(actor, -350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
actFireMissile(actor, 350, -100, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
break;
case kDudeCerberusOneHead:
actFireMissile(pSprite, 350, -100, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
actFireMissile(actor, 350, -100, aim.dx, aim.dy, aim.dz, kMissileFireballCerberus);
break;
}
}
Expand Down Expand Up @@ -226,11 +226,11 @@ void cerberusBurnSeqCallback2(int, DBloodActor* actor)
}
switch (pSprite->type) {
case kDudeCerberusTwoHead:
actFireMissile(pSprite, 350, -100, aim.dx, aim.dy, -aim.dz, kMissileFlameHound);
actFireMissile(pSprite, -350, 0, ax, ay, az, kMissileFlameHound);
actFireMissile(actor, 350, -100, aim.dx, aim.dy, -aim.dz, kMissileFlameHound);
actFireMissile(actor, -350, 0, ax, ay, az, kMissileFlameHound);
break;
case kDudeCerberusOneHead:
actFireMissile(pSprite, 350, -100, aim.dx, aim.dy, -aim.dz, kMissileFlameHound);
actFireMissile(actor, 350, -100, aim.dx, aim.dy, -aim.dz, kMissileFlameHound);
break;
}
}
Expand Down
2 changes: 1 addition & 1 deletion source/games/blood/src/aicult.cpp
Expand Up @@ -99,7 +99,7 @@ void TeslaSeqCallback(int, DBloodActor* actor)
dx += Random3((5 - gGameOptions.nDifficulty) * 1000);
dy += Random3((5 - gGameOptions.nDifficulty) * 1000);
dz += Random3((5 - gGameOptions.nDifficulty) * 500);
actFireMissile(pSprite, 0, 0, dx, dy, dz, kMissileTeslaRegular);
actFireMissile(actor, 0, 0, dx, dy, dz, kMissileTeslaRegular);
sfxPlay3DSound(actor, 470, -1, 0);
}
}
Expand Down
8 changes: 4 additions & 4 deletions source/games/blood/src/aigarg.cpp
Expand Up @@ -188,13 +188,13 @@ void BlastSSeqCallback(int, DBloodActor* actor)
#ifdef NOONE_EXTENSIONS
// allow to fire missile in non-player targets
if (IsPlayerSprite(pTarget) || gModernMap) {
actFireMissile(pSprite, -120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(pSprite, 120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(actor, -120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(actor, 120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
}
#else
if (IsPlayerSprite(pTarget)) {
actFireMissile(pSprite, -120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(pSprite, 120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(actor, -120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
actFireMissile(actor, 120, 0, aim.dx, aim.dy, aim.dz, kMissileArcGargoyle);
}
#endif

Expand Down
4 changes: 2 additions & 2 deletions source/games/blood/src/aighost.cpp
Expand Up @@ -172,12 +172,12 @@ void ghostBlastSeqCallback(int, DBloodActor* actor)
// allow fire missile in non-player targets if not a demo
if (IsPlayerSprite(pTarget) || gModernMap) {
sfxPlay3DSound(actor, 489, 0, 0);
actFireMissile(pSprite, 0, 0, aim.dx, aim.dy, aim.dz, kMissileEctoSkull);
actFireMissile(actor, 0, 0, aim.dx, aim.dy, aim.dz, kMissileEctoSkull);
}
#else
if (IsPlayerSprite(pTarget)) {
sfxPlay3DSound(actor, 489, 0, 0);
actFireMissile(pSprite, 0, 0, aim.dx, aim.dy, aim.dz, kMissileEctoSkull);
actFireMissile(actor, 0, 0, aim.dx, aim.dy, aim.dz, kMissileEctoSkull);
}
#endif
}
Expand Down
2 changes: 1 addition & 1 deletion source/games/blood/src/aihound.cpp
Expand Up @@ -69,7 +69,7 @@ void houndBiteSeqCallback(int, DBloodActor* actor)
void houndBurnSeqCallback(int, DBloodActor* actor)
{
spritetype* pSprite = &actor->s();
actFireMissile(pSprite, 0, 0, CosScale16(pSprite->ang), SinScale16(pSprite->ang), 0, kMissileFlameHound);
actFireMissile(actor, 0, 0, CosScale16(pSprite->ang), SinScale16(pSprite->ang), 0, kMissileFlameHound);
}

static void houndThinkSearch(DBloodActor* actor)
Expand Down
8 changes: 4 additions & 4 deletions source/games/blood/src/aitchern.cpp
Expand Up @@ -128,8 +128,8 @@ void sub_71BD4(int, DBloodActor* actor)
}
}
}
actFireMissile(pSprite, -350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballTchernobog);
actFireMissile(pSprite, 350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballTchernobog);
actFireMissile(actor, -350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballTchernobog);
actFireMissile(actor, 350, 0, aim.dx, aim.dy, aim.dz, kMissileFireballTchernobog);
}

void sub_720AC(int, DBloodActor* actor)
Expand Down Expand Up @@ -203,8 +203,8 @@ void sub_720AC(int, DBloodActor* actor)
}
}
}
actFireMissile(pSprite, 350, 0, aim.dx, aim.dy, -aim.dz, kMissileFireballTchernobog);
actFireMissile(pSprite, -350, 0, ax, ay, az, kMissileFireballTchernobog);
actFireMissile(actor, 350, 0, aim.dx, aim.dy, -aim.dz, kMissileFireballTchernobog);
actFireMissile(actor, -350, 0, ax, ay, az, kMissileFireballTchernobog);
}

static void sub_72580(DBloodActor* actor)
Expand Down
9 changes: 5 additions & 4 deletions source/games/blood/src/aiunicult.cpp
Expand Up @@ -288,7 +288,7 @@ void genDudeAttack1(int, DBloodActor* actor)
// dispersal modifiers here
dx += Random3(dispersion); dy += Random3(dispersion); dz += Random3(dispersion >> 1);

actFireMissile(pSprite, 0, 0, dx, dy, dz, pExtra->curWeapon);
actFireMissile(actor, 0, 0, dx, dy, dz, pExtra->curWeapon);
if (!playGenDudeSound(pSprite, kGenDudeSndAttackNormal))
sfxPlayMissileSound(pSprite, pExtra->curWeapon);
}
Expand Down Expand Up @@ -1648,6 +1648,7 @@ void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT event)
actPostSprite(pSprite->index, kStatFree);
return;
}
auto actor = &bloodActors[pSprite->index];

int nTarget = pXSprite->target_i;
if (spriRangeIsFine(nTarget) && nTarget != pSprite->owner) {
Expand Down Expand Up @@ -1682,10 +1683,10 @@ void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT event)
if (!pXSprite->data3) t2 = 120 / 10;
else t2 = (3 * 120) / 10;

spritetype * pMissile = actFireMissile(pSprite, 0, z1, dx, dy, dz, nMissileType);
if (pMissile)
auto missile = actFireMissile(actor, 0, z1, dx, dy, dz, nMissileType);
if (missile)
{
pMissile->owner = pSprite->owner;
missile->SetOwner(actor);
pXSprite->stateTimer = 1;
evPost(pSprite->index, 3, t2, kCallbackLeechStateTimer);
pXSprite->data3 = ClipLow(pXSprite->data3 - 1, 0);
Expand Down

0 comments on commit 351dabd

Please sign in to comment.