- handled all parts of actor.cpp which are not "pSprite = &actor->s();"

This commit is contained in:
Christoph Oelckers 2021-12-22 16:33:03 +01:00
parent 88c77ec71a
commit 27e9894ece
2 changed files with 103 additions and 112 deletions

View file

@ -2982,14 +2982,13 @@ static bool actKillModernDude(DBloodActor* actor, DAMAGE_TYPE damageType)
else
{
seqKill(actor);
DBloodActor* pEffectA = gFX.fxSpawnActor((FX_ID)52, pSprite->sector(), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z, pSprite->ang);
if (pEffectA != nullptr)
DBloodActor* pEffect = gFX.fxSpawnActor((FX_ID)52, pSprite->sector(), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z, pSprite->ang);
if (pEffect != nullptr)
{
auto pEffect = &pEffectA->s();
pEffect->cstat = CSTAT_SPRITE_ALIGNMENT_FACING;
pEffect->pal = 6;
pEffect->xrepeat = pSprite->xrepeat;
pEffect->yrepeat = pSprite->yrepeat;
pEffect->spr.cstat = CSTAT_SPRITE_ALIGNMENT_FACING;
pEffect->spr.pal = 6;
pEffect->spr.xrepeat = pSprite->xrepeat;
pEffect->spr.yrepeat = pSprite->yrepeat;
}
GIBTYPE nGibType;
@ -3091,13 +3090,12 @@ static bool actKillDudeStage1(DBloodActor* actor, DAMAGE_TYPE damageType)
static void checkAddFrag(DBloodActor* killerActor, DBloodActor* actor)
{
auto pKillerSprite = &killerActor->s();
auto pSprite = &actor->s();
if (VanillaMode())
{
if (killerActor->IsPlayerActor())
{
PLAYER* pPlayer = &gPlayer[pKillerSprite->type - kDudePlayer1];
PLAYER* pPlayer = &gPlayer[killerActor->spr.type - kDudePlayer1];
if (gGameOptions.nGameType == 1)
pPlayer->fragCount++;
}
@ -3112,7 +3110,7 @@ static void checkAddFrag(DBloodActor* killerActor, DBloodActor* actor)
case kDudeBurningInnocent:
break;
default:
PLAYER* pKillerPlayer = &gPlayer[pKillerSprite->type - kDudePlayer1];
PLAYER* pKillerPlayer = &gPlayer[killerActor->spr.type - kDudePlayer1];
pKillerPlayer->fragCount++;
break;
}
@ -3855,7 +3853,6 @@ void actHitcodeToData(int a1, HitInfo* pHitInfo, DBloodActor** pActor, walltype*
static void actImpactMissile(DBloodActor* missileActor, int hitCode)
{
auto pMissile = &missileActor->s();
XSPRITE* pXMissile = &missileActor->x();
auto missileOwner = missileActor->GetOwner();
@ -3881,7 +3878,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
break;
}
}
switch (pMissile->type)
switch (missileActor->spr.type)
{
case kMissileLifeLeechRegular:
if (hitCode == 3 && pSpriteHit && (pThingInfo || pDudeInfo))
@ -3904,8 +3901,8 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (missileActor->hasX())
{
actPostSprite(missileActor, kStatDecoration);
if (pMissile->ang == 1024) sfxPlay3DSound(missileActor, 307, -1, 0);
pMissile->type = kSpriteDecoration;
if (missileActor->spr.ang == 1024) sfxPlay3DSound(missileActor, 307, -1, 0);
missileActor->spr.type = kSpriteDecoration;
seqSpawn(9, missileActor, -1);
}
else
@ -3922,7 +3919,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case 4:
if (pWallHit)
{
auto pFX = gFX.fxSpawnActor(FX_52, pMissile->sector(), pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, 0);
auto pFX = gFX.fxSpawnActor(FX_52, missileActor->spr.sector(), missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, 0);
if (pFX) pFX->spr.ang = (GetWallAngle(pWallHit) + 512) & 2047;
}
break;
@ -3943,7 +3940,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileArcGargoyle:
sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, 306, pMissile->sector());
sfxPlay3DSound(missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, 306, missileActor->spr.sector());
GibSprite(missileActor, GIBTYPE_6, NULL, NULL);
if (hitCode == 3 && pSpriteHit && (pThingInfo || pDudeInfo))
@ -3957,11 +3954,11 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileLifeLeechAltNormal:
case kMissileLifeLeechAltSmall:
sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, 306, pMissile->sector());
sfxPlay3DSound(missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, 306, missileActor->spr.sector());
if (hitCode == 3 && pSpriteHit && (pThingInfo || pDudeInfo))
{
int nDmgMul = (pMissile->type == kMissileLifeLeechAltSmall) ? 6 : 3;
int nDmgMul = (missileActor->spr.type == kMissileLifeLeechAltSmall) ? 6 : 3;
int nDamage = (nDmgMul + Random(nDmgMul)) << 4;
actDamageSprite(missileOwner, actorHit, kDamageSpirit, nDamage);
}
@ -3996,7 +3993,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
evPostActor(actorHit, 0, kCallbackFXFlameLick);
actBurnSprite(missileOwner, actorHit, 480);
actRadiusDamage(missileOwner, pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, pMissile->sector(), 16, 20, 10, kDamageBullet, 6, 480);
actRadiusDamage(missileOwner, missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, missileActor->spr.sector(), 16, 20, 10, kDamageBullet, 6, 480);
// by NoOne: allow additional bullet damage for Flare Gun
if (gGameOptions.weaponsV10x && !VanillaMode())
@ -4013,13 +4010,13 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (surfType[pSpriteHit->picnum] == kSurfFlesh)
{
pMissile->picnum = 2123;
missileActor->spr.picnum = 2123;
missileActor->SetTarget(actorHit);
pXMissile->targetZ = pMissile->pos.Z - pSpriteHit->pos.Z;
pXMissile->goalAng = getangle(pMissile->pos.X - pSpriteHit->pos.X, pMissile->pos.Y - pSpriteHit->pos.Y) - pSpriteHit->ang;
pXMissile->targetZ = missileActor->spr.pos.Z - pSpriteHit->pos.Z;
pXMissile->goalAng = getangle(missileActor->spr.pos.X - pSpriteHit->pos.X, missileActor->spr.pos.Y - pSpriteHit->pos.Y) - pSpriteHit->ang;
pXMissile->state = 1;
actPostSprite(missileActor, kStatFlare);
pMissile->cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
missileActor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
break;
}
}
@ -4071,7 +4068,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileEctoSkull:
sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, 522, pMissile->sector());
sfxPlay3DSound(missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, 522, missileActor->spr.sector());
actPostSprite(missileActor, kStatDebris);
seqSpawn(20, missileActor, -1);
if (hitCode == 3 && actorHit && actorHit->hasX())
@ -4086,8 +4083,8 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileButcherKnife:
actPostSprite(missileActor, kStatDebris);
pMissile->cstat &= ~CSTAT_SPRITE_ALIGNMENT_WALL;
pMissile->type = kSpriteDecoration;
missileActor->spr.cstat &= ~CSTAT_SPRITE_ALIGNMENT_WALL;
missileActor->spr.type = kSpriteDecoration;
seqSpawn(20, missileActor, -1);
if (hitCode == 3 && actorHit && actorHit->hasX())
{
@ -4104,7 +4101,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileTeslaRegular:
sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->pos.X, pMissile->pos.Y, pMissile->pos.Z, 518, pMissile->sector());
sfxPlay3DSound(missileActor->spr.pos.X, missileActor->spr.pos.Y, missileActor->spr.pos.Z, 518, missileActor->spr.sector());
GibSprite(missileActor, (hitCode == 2) ? GIBTYPE_23 : GIBTYPE_22, NULL, NULL);
evKillActor(missileActor);
seqKill(missileActor);
@ -4131,7 +4128,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (gModernMap && pXSpriteHit && pXSpriteHit->state != pXSpriteHit->restState && pXSpriteHit->Impact)
trTriggerSprite(actorHit, kCmdSpriteImpact);
#endif
pMissile->cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
missileActor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
}
//---------------------------------------------------------------------------
@ -4765,11 +4762,10 @@ static Collision MoveThing(DBloodActor* actor)
if (coll.type == kHitSprite)
{
auto hitActor = coll.actor();
auto hitSpr = &hitActor->s();
if ((hitSpr->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == CSTAT_SPRITE_ALIGNMENT_FACING)
if ((hitActor->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == CSTAT_SPRITE_ALIGNMENT_FACING)
{
actor->xvel += MulScale(4, pSprite->pos.X - hitSpr->pos.X, 2);
actor->yvel += MulScale(4, pSprite->pos.Y - hitSpr->pos.Y, 2);
actor->xvel += MulScale(4, pSprite->pos.X - hitActor->spr.pos.X, 2);
actor->yvel += MulScale(4, pSprite->pos.Y - hitActor->spr.pos.Y, 2);
lhit = actor->hit.hit;
}
}
@ -4851,12 +4847,12 @@ void MoveDude(DBloodActor* actor)
{
case kHitSprite:
{
spritetype* pHitSprite = &coll.actor()->s();
auto hitActor = coll.actor();
XSPRITE* pHitXSprite = coll.actor()->hasX() ? &coll.actor()->x() : nullptr;;
auto Owner = coll.actor()->GetOwner();
if (pHitSprite->statnum == kStatProjectile && !(pHitSprite->flags & 32) && actor != Owner)
if (hitActor->spr.statnum == kStatProjectile && !(hitActor->spr.flags & 32) && actor != Owner)
{
auto hitInfo = gHitInfo;
gHitInfo.hitActor = actor;
@ -5206,10 +5202,9 @@ void MoveDude(DBloodActor* actor)
auto pFX = gFX.fxSpawnActor(FX_10, pSprite->sector(), pSprite->pos.X, pSprite->pos.Y, floorZ, 0);
if (pFX)
{
auto pFXs = &pFX->s();
for (int i = 0; i < 7; i++)
{
auto pFX2 = gFX.fxSpawnActor(FX_14, pFXs->sector(), pFXs->pos.X, pFXs->pos.Y, pFXs->pos.Z, 0);
auto pFX2 = gFX.fxSpawnActor(FX_14, pFX->spr.sector(), pFX->spr.pos.X, pFX->spr.pos.Y, pFX->spr.pos.Z, 0);
if (pFX2)
{
pFX2->xvel = Random2(0x6aaaa);
@ -5286,12 +5281,10 @@ int MoveMissile(DBloodActor* actor)
auto Owner = actor->GetOwner();
int cliptype = -1;
ESpriteFlags bakCstat = 0;
spritetype* pOwner = nullptr;
if (Owner && Owner->IsDudeActor())
{
pOwner = &Owner->s();
bakCstat = pOwner->cstat;
pOwner->cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
bakCstat = Owner->spr.cstat;
Owner->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
}
gHitInfo.clearObj();
if (pSprite->type == kMissileFlameSpray) actAirDrag(actor, 0x1000);
@ -5299,21 +5292,20 @@ int MoveMissile(DBloodActor* actor)
if (actor->GetTarget() != nullptr && (actor->xvel || actor->yvel || actor->zvel))
{
auto target = actor->GetTarget();
spritetype* pTarget = &target->s();
XSPRITE* pXTarget = target->hasX() ? &target->x() : nullptr;
if (pTarget->statnum == kStatDude && pXTarget && pXTarget->health > 0)
if (target->spr.statnum == kStatDude && pXTarget && pXTarget->health > 0)
{
int nTargetAngle = getangle(-(pTarget->pos.Y - pSprite->pos.Y), pTarget->pos.X - pSprite->pos.X);
int nTargetAngle = getangle(-(target->spr.pos.Y - pSprite->pos.Y), target->spr.pos.X - pSprite->pos.X);
int vx = missileInfo[pSprite->type - kMissileBase].velocity;
int vy = 0;
RotatePoint(&vx, &vy, (nTargetAngle + 1536) & 2047, 0, 0);
actor->xvel = vx;
actor->yvel = vy;
int dz = pTarget->pos.Z - pSprite->pos.Z;
int dz = target->spr.pos.Z - pSprite->pos.Z;
int deltaz = dz / 10;
if (pTarget->pos.Z < pSprite->pos.Z) deltaz = -deltaz;
if (target->spr.pos.Z < pSprite->pos.Z) deltaz = -deltaz;
actor->zvel += deltaz;
}
}
@ -5330,7 +5322,7 @@ int MoveMissile(DBloodActor* actor)
vec3_t pos = pSprite->pos;
auto pSector2 = pSprite->sector();
const auto bakSpriteCstat = pSprite->cstat;
if (pOwner && !isFlameSprite && !cl_bloodvanillaexplosions && !VanillaMode())
if (Owner && !isFlameSprite && !cl_bloodvanillaexplosions && !VanillaMode())
{
enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy
pSprite->cstat &= ~CSTAT_SPRITE_BLOCK_ALL; // remove self collisions for accurate clipmove
@ -5425,7 +5417,7 @@ int MoveMissile(DBloodActor* actor)
gHitInfo.hitpos.Z = pSprite->pos.Z;
break;
}
if (pOwner) pOwner->cstat = bakCstat;
if (Owner) Owner->spr.cstat = bakCstat;
return cliptype;
}
@ -5518,8 +5510,8 @@ void actExplodeSprite(DBloodActor* actor)
nType = kExplosionLarge;
seqSpawn(4, spawned, -1);
actor = spawned;
pSprite = &spawned->s();
pXSprite = &spawned->x();
pSprite = &actor->s();
pXSprite = &actor->x();
sfxPlay3DSound(actor, 305, -1, 0);
GibSprite(actor, GIBTYPE_14, nullptr, nullptr);
@ -5679,8 +5671,7 @@ static void actCheckProximity()
auto Owner = actor->GetOwner();
if (!Owner->IsPlayerActor()) continue;
spritetype* pOwner = &Owner->s();
PLAYER* pPlayer = &gPlayer[pOwner->type - kDudePlayer1];
PLAYER* pPlayer = &gPlayer[Owner->spr.type - kDudePlayer1];
PLAYER* pPlayer2 = dudeactor->IsPlayerActor() ? &gPlayer[dudeactor->spr.type - kDudePlayer1] : nullptr;
if (dudeactor == Owner || dudeactor->spr.type == kDudeZombieAxeBuried || dudeactor->spr.type == kDudeRat || dudeactor->spr.type == kDudeBat) continue;
@ -5905,9 +5896,7 @@ static void actCheckExplosion()
BloodStatIterator it1(kStatDude);
while (auto dudeactor = it1.Next())
{
spritetype* pDude = &dudeactor->s();
if (pDude->flags & 32) continue;
if (dudeactor->spr.flags & 32) continue;
if (CheckSector(sectorMap, dudeactor))
{
@ -5934,9 +5923,7 @@ static void actCheckExplosion()
it1.Reset(kStatThing);
while (auto thingactor = it1.Next())
{
spritetype* pThing = &thingactor->s();
if (pThing->flags & 32) continue;
if (thingactor->spr.flags & 32) continue;
if (CheckSector(sectorMap, thingactor))
{
@ -5949,7 +5936,7 @@ static void actCheckExplosion()
if (pExplodeInfo->burnTime)
{
if (pThing->type == kThingTNTBarrel && !pXThing->burnTime)
if (thingactor->spr.type == kThingTNTBarrel && !pXThing->burnTime)
evPostActor(thingactor, 0, kCallbackFXFlameLick);
actBurnSprite(Owner, thingactor, pExplodeInfo->burnTime << 2);
}
@ -5979,8 +5966,7 @@ static void actCheckExplosion()
{
if (gPhysSpritesList[i] == nullptr) continue;
DBloodActor* physactor = gPhysSpritesList[i];
spritetype* pDebris = &physactor->s();
if (!pDebris->insector() || (pDebris->flags & kHitagFree) != 0) continue;
if (!physactor->spr.insector() || (physactor->spr.flags & kHitagFree) != 0) continue;
if (!CheckSector(sectorMap, physactor) || !CheckProximity(physactor, x, y, z, pSector, radius)) continue;
else debrisConcuss(Owner, i, x, y, z, pExplodeInfo->dmgType);
@ -6250,18 +6236,17 @@ void actCheckFlares()
if (!target) continue;
viewBackupSpriteLoc(actor);
spritetype* pTarget = &target->s();
auto pXTarget = target->hasX() ? &target->x() : nullptr;
if (pTarget->statnum == kMaxStatus)
if (target->spr.statnum == kMaxStatus)
{
GibSprite(actor, GIBTYPE_17, NULL, NULL);
actPostSprite(actor, kStatFree);
}
if (pXTarget && pXTarget->health > 0)
{
int x = pTarget->pos.X + mulscale30r(Cos(pXSprite->goalAng + pTarget->ang), pTarget->clipdist * 2);
int y = pTarget->pos.Y + mulscale30r(Sin(pXSprite->goalAng + pTarget->ang), pTarget->clipdist * 2);
int z = pTarget->pos.Z + pXSprite->targetZ;
int x = target->spr.pos.X + mulscale30r(Cos(pXSprite->goalAng + target->spr.ang), target->spr.clipdist * 2);
int y = target->spr.pos.Y + mulscale30r(Sin(pXSprite->goalAng + target->spr.ang), target->spr.clipdist * 2);
int z = target->spr.pos.Z + pXSprite->targetZ;
vec3_t pos = { x, y, z };
SetActor(actor, &pos);
actor->xvel = target->xvel;
@ -6331,13 +6316,12 @@ DBloodActor* actSpawnSprite(sectortype* pSector, int x, int y, int z, int nStat,
DBloodActor* actSpawnSprite(DBloodActor* source, int nStat)
{
auto pSource = &source->s();
DBloodActor* actor = InsertSprite(pSource->sector(), nStat);
DBloodActor* actor = InsertSprite(source->spr.sector(), nStat);
spritetype* pSprite = &actor->s();
pSprite->pos.X = pSource->pos.X;
pSprite->pos.Y = pSource->pos.Y;
pSprite->pos.Z = pSource->pos.Z;
pSprite->pos.X = source->spr.pos.X;
pSprite->pos.Y = source->spr.pos.Y;
pSprite->pos.Z = source->spr.pos.Z;
actor->xvel = source->xvel;
actor->yvel = source->yvel;
actor->zvel = source->zvel;
@ -6357,24 +6341,23 @@ DBloodActor* actSpawnSprite(DBloodActor* source, int nStat)
DBloodActor* actSpawnDude(DBloodActor* source, int nType, int a3, int a4)
{
auto pSource = &source->s();
XSPRITE* pXSource = &source->x();
auto spawned = actSpawnSprite(source, kStatDude);
if (!spawned) return NULL;
if (!spawned) return nullptr;
XSPRITE* pXSprite2 = &spawned->x();
int angle = pSource->ang;
int angle = source->spr.ang;
int nDude = nType - kDudeBase;
int x, y, z;
z = a4 + pSource->pos.Z;
z = a4 + source->spr.pos.Z;
if (a3 < 0)
{
x = pSource->pos.X;
y = pSource->pos.Y;
x = source->spr.pos.X;
y = source->spr.pos.Y;
}
else
{
x = pSource->pos.X + mulscale30r(Cos(angle), a3);
y = pSource->pos.Y + mulscale30r(Sin(angle), a3);
x = source->spr.pos.X + mulscale30r(Cos(angle), a3);
y = source->spr.pos.Y + mulscale30r(Sin(angle), a3);
}
spawned->spr.type = nType;
spawned->spr.ang = angle;
@ -6390,14 +6373,14 @@ DBloodActor* actSpawnDude(DBloodActor* source, int nType, int a3, int a4)
#ifdef NOONE_EXTENSIONS
// add a way to inherit some values of spawner type 18 by dude.
// This way designer can count enemies via switches and do many other interesting things.
if (gModernMap && pSource->flags & kModernTypeFlag1)
if (gModernMap && source->spr.flags & kModernTypeFlag1)
{
// allow inheriting only for selected source types
switch (pSource->type)
switch (source->spr.type)
{
case kMarkerDudeSpawn:
//inherit pal?
if (spawned->spr.pal <= 0) spawned->spr.pal = pSource->pal;
if (spawned->spr.pal <= 0) spawned->spr.pal = source->spr.pal;
// inherit spawn sprite trigger settings, so designer can count monsters.
pXSprite2->txID = pXSource->txID;
@ -6538,11 +6521,10 @@ DBloodActor* actFireThing(DBloodActor* actor, int a2, int a3, int a4, int thingT
y = gHitInfo.hitpos.Y - MulScale(pSprite->clipdist << 1, Sin(pSprite->ang), 28);
}
auto fired = actSpawnThing(pSprite->sector(), x, y, z, thingType);
spritetype* pThing = &fired->s();
fired->SetOwner(actor);
pThing->ang = pSprite->ang;
fired->xvel = MulScale(a6, Cos(pThing->ang), 30);
fired->yvel = MulScale(a6, Sin(pThing->ang), 30);
fired->spr.ang = pSprite->ang;
fired->xvel = MulScale(a6, Cos(fired->spr.ang), 30);
fired->yvel = MulScale(a6, Sin(fired->spr.ang), 30);
fired->zvel = MulScale(a6, a4, 14);
fired->xvel += actor->xvel / 2;
fired->yvel += actor->yvel / 2;
@ -6558,8 +6540,7 @@ DBloodActor* actFireThing(DBloodActor* actor, int a2, int a3, int a4, int thingT
void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
{
auto pMissile = &spawned->s();
switch (pMissile->type)
switch (spawned->spr.type)
{
case kMissileLifeLeechRegular:
evPostActor(spawned, 0, kCallbackFXFlameLick);
@ -6571,7 +6552,7 @@ void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
seqSpawn(29, spawned, -1);
break;
case kMissileButcherKnife:
pMissile->cstat |= CSTAT_SPRITE_ALIGNMENT_WALL;
spawned->spr.cstat |= CSTAT_SPRITE_ALIGNMENT_WALL;
break;
case kMissileTeslaRegular:
sfxPlay3DSound(spawned, 251, 0, 0);
@ -6664,22 +6645,22 @@ DBloodActor* actFireMissile(DBloodActor* actor, int a2, int a3, int a4, int a5,
}
}
auto spawned = actSpawnSprite(pSprite->sector(), x, y, z, 5, 1);
spritetype* pMissile = &spawned->s();
pMissile->cstat2 |= CSTAT2_SPRITE_MAPPED;
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->spr.cstat2 |= CSTAT2_SPRITE_MAPPED;
spawned->spr.type = nType;
spawned->spr.shade = pMissileInfo->shade;
spawned->spr.pal = 0;
spawned->spr.clipdist = pMissileInfo->clipDist;
spawned->spr.flags = 1;
spawned->spr.xrepeat = pMissileInfo->xrepeat;
spawned->spr.yrepeat = pMissileInfo->yrepeat;
spawned->spr.picnum = pMissileInfo->picnum;
spawned->spr.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);
spawned->SetOwner(actor);
pMissile->cstat |= CSTAT_SPRITE_BLOCK;
spawned->spr.cstat |= CSTAT_SPRITE_BLOCK;
spawned->SetTarget(nullptr);
evPostActor(spawned, 600, kCallbackRemove);
@ -6819,7 +6800,6 @@ bool actCanSplatWall(walltype* pWall)
void actFireVector(DBloodActor* shooter, int a2, int a3, int a4, int a5, int a6, VECTOR_TYPE vectorType)
{
auto pShooter = &shooter->s();
assert(vectorType >= 0 && vectorType < kVectorMax);
const VECTORDATA* pVectorData = &gVectorData[vectorType];
int nRange = pVectorData->maxDist;
@ -6828,17 +6808,14 @@ void actFireVector(DBloodActor* shooter, int a2, int a3, int a4, int a5, int a6,
{
auto hitactor = gHitInfo.actor();
assert(hitactor != nullptr);
spritetype* pSprite = &hitactor->s();
if (!gGameOptions.bFriendlyFire && IsTargetTeammate(pShooter, pSprite)) return;
if (IsPlayerSprite(pSprite))
if (!gGameOptions.bFriendlyFire && IsTargetTeammate(shooter, hitactor)) return;
if (hitactor->IsPlayerActor())
{
PLAYER* pPlayer = &gPlayer[pSprite->type - kDudePlayer1];
PLAYER* pPlayer = &gPlayer[hitactor->spr.type - kDudePlayer1];
if (powerupCheck(pPlayer, kPwUpReflectShots))
{
gHitInfo.hitActor = shooter;
gHitInfo.hitpos.X = pShooter->pos.X;
gHitInfo.hitpos.Y = pShooter->pos.Y;
gHitInfo.hitpos.Z = pShooter->pos.Z;
gHitInfo.hitpos = shooter->spr.pos;
}
}
}
@ -6847,7 +6824,7 @@ void actFireVector(DBloodActor* shooter, int a2, int a3, int a4, int a5, int a6,
int z = gHitInfo.hitpos.Z - MulScale(a6, 256, 14);
auto pSector = gHitInfo.hitSector;
uint8_t nSurf = kSurfNone;
if (nRange == 0 || approxDist(gHitInfo.hitpos.X - pShooter->pos.X, gHitInfo.hitpos.Y - pShooter->pos.Y) < nRange)
if (nRange == 0 || approxDist(gHitInfo.hitpos.X - shooter->spr.pos.X, gHitInfo.hitpos.Y - shooter->spr.pos.Y) < nRange)
{
switch (hit)
{
@ -7185,8 +7162,8 @@ void DudeToGibCallback2(int, DBloodActor* actor)
void actPostSprite(DBloodActor* actor, int nStatus)
{
assert(nStatus >= 0 && nStatus <= kStatFree);
auto sp = &actor->s();
if (sp->flags & 32)
auto pSprite = &actor->s();
if (pSprite->flags & 32)
{
for (auto& post : gPost)
if (post.sprite == actor)
@ -7197,7 +7174,7 @@ void actPostSprite(DBloodActor* actor, int nStatus)
}
else
{
sp->flags |= 32;
pSprite->flags |= 32;
gPost.Push({ actor, nStatus });
}
}

View file

@ -184,4 +184,18 @@ inline bool CheckSector(const BitArray& bits, DBloodActor* act)
return bits[act->spr.sectno()];
}
inline bool IsTargetTeammate(PLAYER* pSourcePlayer, DBloodActor* pTarget)
{
return IsTargetTeammate(pSourcePlayer, &pTarget->spr);
}
inline bool IsTargetTeammate(DBloodActor* pSource, DBloodActor* pTarget)
{
if (!pSource->IsPlayerActor())
return false;
PLAYER* pSourcePlayer = &gPlayer[pSource->spr.type - kDudePlayer1];
return IsTargetTeammate(pSourcePlayer, pTarget);
}
END_BLD_NS