- parameter cleanup of BuildBullet.

This commit is contained in:
Christoph Oelckers 2021-10-20 00:26:26 +02:00
parent eece69fbbd
commit c1598185f7
5 changed files with 45 additions and 53 deletions

View file

@ -77,15 +77,8 @@ int GrabBullet();
void DestroyBullet(short nRun);
int MoveBullet(short nBullet);
void SetBulletEnemy(short nBullet, DExhumedActor* nEnemy);
int BuildBullet(short nSprite, int nType, int val1, int nAngle, int val2, int val3);
inline DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3)
{
int v = BuildBullet(pActor->GetSpriteIndex(), nType, val1, nAngle, pTarget->GetSpriteIndex() + 10000, val3);
if (v < 0) return nullptr;
auto a = &exhumedActors[v & 0xffff];
a->nPhase = (v >> 16);
return a;
}
DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3);
void IgniteSprite(int nSprite);
void FuncBullet(int, int, int, int);
void BackUpBullet(int *x, int *y, short nAngle);

View file

@ -42,7 +42,7 @@ struct Bullet
short field_6;
short field_8;
short nType;
short field_C;
short nPitch;
short field_E;
uint16_t field_10;
uint8_t field_12;
@ -77,7 +77,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Bullet& w, Bullet*
("z", w.z, def->z)
("at6", w.field_6, def->field_6)
("at8", w.field_8, def->field_8)
("atc", w.field_C, def->field_C)
("atc", w.nPitch, def->nPitch)
("ate", w.field_E, def->field_E)
("at10", w.field_10, def->field_10)
("at12", w.field_12, def->field_12)
@ -450,9 +450,9 @@ MOVEEND:
hitdata_t hitData;
int dz;
if (bVanilla)
dz = -bsin(pBullet->field_C, 3);
dz = -bsin(pBullet->nPitch, 3);
else
dz = -pBullet->field_C * 512;
dz = -pBullet->nPitch * 512;
hitscan(&startPos, pSprite->sectnum, bcos(pSprite->ang), bsin(pSprite->ang), dz, &hitData, CLIPMASK1);
x2 = hitData.pos.x;
y2 = hitData.pos.y;
@ -576,20 +576,18 @@ void SetBulletEnemy(short nBullet, DExhumedActor* pEnemy)
}
}
int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, int nDoubleDamage)
DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int nZOffset, int nAngle, DExhumedActor* pTarget, int nDoubleDamage)
{
auto pSprite = &sprite[nSprite];
auto pSprite = &pActor->s();
Bullet sBullet;
bulletInfo *pBulletInfo = &BulletInfo[nType];
int nPitch = 0;
if (pBulletInfo->field_4 > 30000)
{
if (nTarget >= 10000)
if (pTarget)
{
nTarget -= 10000;
short nTargetSprite = nTarget;
spritetype *pTargetSprite = &sprite[nTargetSprite];
spritetype *pTargetSprite = &pTarget->s();
// assert(pTargetSprite->sectnum <= kMaxSectors);
@ -601,31 +599,31 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
sBullet.pActor = insertActor(pSprite->sectnum, 200);
sBullet.pActor->s().ang = nAngle;
int nHeight = GetSpriteHeight(nTargetSprite);
int nHeight = GetActorHeight(pTarget);
assert(pTargetSprite->sectnum >= 0 && pTargetSprite->sectnum < kMaxSectors);
BulletHitsSprite(&sBullet, nSprite, nTargetSprite, pTargetSprite->x, pTargetSprite->y, pTargetSprite->z - (nHeight >> 1), pTargetSprite->sectnum);
BulletHitsSprite(&sBullet, pActor->GetSpriteIndex(), pTarget->GetSpriteIndex(), pTargetSprite->x, pTargetSprite->y, pTargetSprite->z - (nHeight >> 1), pTargetSprite->sectnum);
DeleteActor(sBullet.pActor);
return -1;
return nullptr;
}
else
{
nTarget = 0;
nPitch = 0;
}
}
}
int nBullet = GrabBullet();
if (nBullet < 0) {
return -1;
return nullptr;
}
short nSector;
if (pSprite->statnum == 100)
{
nSector = nPlayerViewSect[GetPlayerFromSprite(nSprite)];
nSector = nPlayerViewSect[GetPlayerFromActor(pActor)];
}
else
{
@ -634,7 +632,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
auto pBulletActor = insertActor(nSector, 200);
auto pBulletSprite = &pBulletActor->s();
int nHeight = GetSpriteHeight(nSprite);
int nHeight = GetActorHeight(pActor);
nHeight = nHeight - (nHeight >> 2);
if (nZOffset == -1) {
@ -674,10 +672,11 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
pBulletSprite->xvel = 0;
pBulletSprite->yvel = 0;
pBulletSprite->zvel = 0;
pBulletSprite->owner = nSprite;
pBulletSprite->owner = pActor->GetSpriteIndex();
pBulletSprite->lotag = runlist_HeadRun() + 1;
pBulletSprite->extra = -1;
pBulletSprite->hitag = 0;
pBulletActor->nPhase = nBullet;
// GrabTimeSlot(3);
@ -706,7 +705,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
pBulletSprite->cstat |= 0x8000;
}
pBullet->field_C = nTarget;
pBullet->nPitch = nPitch;
pBullet->nType = nType;
pBullet->pActor = pBulletActor;
pBullet->field_6 = runlist_AddRunRec(pBulletSprite->lotag - 1, nBullet, 0xB0000);
@ -731,24 +730,21 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
ChangeActorSect(pBulletActor, nSector);
}
if (nTarget < 10000)
if (pTarget == nullptr)
{
var_18 = (-bsin(nTarget) * pBulletInfo->field_4) >> 11;
var_18 = (-bsin(nPitch) * pBulletInfo->field_4) >> 11;
}
else
{
nTarget -= 10000;
short nTargetSprite = nTarget;
auto pTargetSprite = &sprite[nTargetSprite];
auto pTargetSprite = &pTarget->s();
if ((unsigned int)pBulletInfo->field_4 > 30000)
{
BulletList[nBullet].pEnemy = &exhumedActors[nTargetSprite];
BulletList[nBullet].pEnemy = pTarget;
}
else
{
nHeight = GetSpriteHeight(nTargetSprite);
nHeight = GetActorHeight(pTarget);
if (pTargetSprite->statnum == 100)
{
@ -763,7 +759,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
int x, y;
if (nSprite != -1 && pSprite->statnum != 100)
if (pActor != nullptr && pSprite->statnum != 100)
{
x = pTargetSprite->x;
y = pTargetSprite->y;
@ -775,7 +771,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
}
else
{
int nPlayer = GetPlayerFromSprite(nTargetSprite);
int nPlayer = GetPlayerFromActor(pTarget);
if (nPlayer > -1)
{
x += nPlayerDX[nPlayer] * 15;
@ -813,7 +809,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
pBullet->y = (pSprite->clipdist << 2) * bsin(nAngle);
BulletList[nBullet].pEnemy = nullptr;
int pb = pBulletActor->GetSpriteIndex();
if (MoveBullet(nBullet))
{
pBulletActor = nullptr;
@ -826,7 +822,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget,
pBullet->z = var_18 >> 3;
}
return pb | (nBullet << 16);
return pBulletActor;
}
void AIBullet::Tick(RunListEvent* ev)

View file

@ -337,6 +337,7 @@ void MoveWeapons(short nPlayer)
if (!PlayerList[nPlayer].bIsFiring || (nSectFlag & kSectUnderwater))
nTemperature[nPlayer] = 0;
auto pPlayerActor = PlayerList[nPlayer].Actor();
short nPlayerSprite = PlayerList[nPlayer].nSprite;
auto pPlayerSprite = &sprite[nPlayerSprite];
short nWeapon = PlayerList[nPlayer].nCurrentWeapon;
@ -823,6 +824,7 @@ loc_flag:
nHeight -= h;
int target = 0;
bool gottarg = false;
if (sPlayerInput[nPlayer].nTarget >= 0 && Autoaim(nPlayer))
{
assert(sprite[sPlayerInput[nPlayer].nTarget].sectnum < kMaxSectors);
@ -833,11 +835,15 @@ loc_flag:
auto pTargetSprite = &sprite[t];
int angletotarget = bvectangbam(pTargetSprite->x - pPlayerSprite->x, pTargetSprite->y - pPlayerSprite->y).asbuild();
int anglediff = (pPlayerSprite->ang - angletotarget) & 2047;
if (anglediff < 512 || anglediff > 1536) target = t + 10000;
if (anglediff < 512 || anglediff > 1536)
{
target = t;
gottarg = true;
}
}
}
BuildBullet(nPlayerSprite, nAmmoType, nHeight, nAngle, target, var_1C);
BuildBullet(pPlayerActor, nAmmoType, nHeight, nAngle,gottarg? &exhumedActors[target] : nullptr, var_1C);
break;
}

View file

@ -1427,20 +1427,17 @@ void AITrap::Tick(RunListEvent* ev)
return;
}
int nBullet = BuildBullet(nSprite, nType, 0, pSprite->ang, 0, 1);
if (nBullet > -1)
auto pBullet = BuildBullet(&exhumedActors[nSprite], nType, 0, pSprite->ang, nullptr, 1);
if (pBullet)
{
int nBulletSprite = nBullet & 0xFFFF; // isolate the sprite index (disregard top 16 bits)
assert(nBulletSprite >= 0);
if (nType == 15)
{
sprite[nBulletSprite].ang = (sprite[nBulletSprite].ang - 512) & kAngleMask;
D3PlayFX(StaticSound[kSound32], nSprite);
pBullet->s().ang = (pBullet->s().ang - 512) & kAngleMask;
D3PlayFX(StaticSound[kSound32], pBullet);
}
else
{
sprite[nBulletSprite].clipdist = 50;
pBullet->s().clipdist = 50;
short nWall = sTrap[nTrap].field_6;
if (nWall > -1)
@ -1454,7 +1451,7 @@ void AITrap::Tick(RunListEvent* ev)
wall[nWall].picnum = sTrap[nTrap].field_C + 1;
}
D3PlayFX(StaticSound[kSound36], nSprite);
D3PlayFX(StaticSound[kSound36], pBullet);
}
}
}

View file

@ -1403,7 +1403,7 @@ void AIQueen::Tick(RunListEvent* ev)
if (!si)
{
BuildBullet(nSprite, 12, -1, pSprite->ang, nTarget + 10000, 1);
BuildBullet(&exhumedActors[nSprite], 12, -1, pSprite->ang, &exhumedActors[nTarget], 1);
}
else
{