- bullet.cpp, enemy pointer.

This commit is contained in:
Christoph Oelckers 2021-10-16 22:04:21 +02:00
parent 3d35ceecb0
commit fa657e23a3
4 changed files with 21 additions and 20 deletions

View file

@ -76,7 +76,7 @@ void InitBullets();
int GrabBullet(); int GrabBullet();
void DestroyBullet(short nRun); void DestroyBullet(short nRun);
int MoveBullet(short nBullet); int MoveBullet(short nBullet);
void SetBulletEnemy(short nBullet, short nEnemy); void SetBulletEnemy(short nBullet, DExhumedActor* nEnemy);
int BuildBullet(short nSprite, int nType, int ebx, int ecx, int val1, int nAngle, int val2, int val3); int BuildBullet(short nSprite, int nType, int ebx, int ecx, int val1, int nAngle, int val2, int val3);
inline DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3) inline DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3)
{ {

View file

@ -35,6 +35,7 @@ enum { kMaxBullets = 500 };
struct Bullet struct Bullet
{ {
DExhumedActor* pActor; DExhumedActor* pActor;
DExhumedActor* pEnemy;
short nSeq; short nSeq;
short nFrame; short nFrame;
@ -49,7 +50,6 @@ struct Bullet
int x; int x;
int y; int y;
int z; int z;
int enemy;
}; };
FreeListArray<Bullet, kMaxBullets> BulletList; FreeListArray<Bullet, kMaxBullets> BulletList;
@ -82,7 +82,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Bullet& w, Bullet*
("at10", w.field_10, def->field_10) ("at10", w.field_10, def->field_10)
("at12", w.field_12, def->field_12) ("at12", w.field_12, def->field_12)
("at13", w.field_13, def->field_13) ("at13", w.field_13, def->field_13)
("enemy", w.enemy, def->enemy) ("enemy", w.pEnemy, def->pEnemy)
.EndObject(); .EndObject();
} }
return arc; return arc;
@ -134,7 +134,7 @@ int GrabBullet()
{ {
int grabbed = BulletList.Get(); int grabbed = BulletList.Get();
if (grabbed < 0) return -1; if (grabbed < 0) return -1;
BulletList[grabbed].enemy = -1; BulletList[grabbed].pEnemy = nullptr;
return grabbed; return grabbed;
} }
@ -325,14 +325,14 @@ int MoveBullet(short nBullet)
if (pBullet->field_10 < 30000) if (pBullet->field_10 < 30000)
{ {
short nEnemySprite = BulletList[nBullet].enemy; auto pEnemyActor = BulletList[nBullet].pEnemy;
if (nEnemySprite > -1) if (pEnemyActor)
{ {
if (!(sprite[nEnemySprite].cstat & 0x101)) if (!(pEnemyActor->s().cstat & 0x101))
BulletList[nBullet].enemy = -1; BulletList[nBullet].pEnemy = nullptr;
else else
{ {
coll = AngleChase(pActor, &exhumedActors[nEnemySprite], pBullet->field_10, 0, 16); coll = AngleChase(pActor, pEnemyActor, pBullet->field_10, 0, 16);
goto MOVEEND; goto MOVEEND;
} }
} }
@ -435,9 +435,9 @@ MOVEEND:
{ {
nVal = 1; nVal = 1;
if (BulletList[nBullet].enemy > -1) if (BulletList[nBullet].pEnemy)
{ {
hitactor = &exhumedActors[BulletList[nBullet].enemy]; hitactor = BulletList[nBullet].pEnemy;
auto hitsprite = &hitactor->s(); auto hitsprite = &hitactor->s();
x2 = hitsprite->x; x2 = hitsprite->x;
y2 = hitsprite->y; y2 = hitsprite->y;
@ -457,7 +457,7 @@ MOVEEND:
x2 = hitData.pos.x; x2 = hitData.pos.x;
y2 = hitData.pos.y; y2 = hitData.pos.y;
z2 = hitData.pos.z; z2 = hitData.pos.z;
hitactor = &exhumedActors[hitData.sprite]; hitactor = GetActor(hitData);
hitsect = hitData.sect; hitsect = hitData.sect;
hitwall = hitData.wall; hitwall = hitData.wall;
} }
@ -569,10 +569,10 @@ HITWALL:
return nVal; return nVal;
} }
void SetBulletEnemy(short nBullet, short nEnemy) void SetBulletEnemy(short nBullet, DExhumedActor* pEnemy)
{ {
if (nBullet >= 0) { if (nBullet >= 0) {
BulletList[nBullet].enemy = nEnemy; BulletList[nBullet].pEnemy = pEnemy;
} }
} }
@ -647,7 +647,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va
Bullet *pBullet = &BulletList[nBullet]; Bullet *pBullet = &BulletList[nBullet];
pBullet->enemy = -1; pBullet->pEnemy = nullptr;
pBulletSprite->cstat = 0; pBulletSprite->cstat = 0;
pBulletSprite->shade = -64; pBulletSprite->shade = -64;
@ -744,7 +744,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va
if ((unsigned int)pBulletInfo->field_4 > 30000) if ((unsigned int)pBulletInfo->field_4 > 30000)
{ {
BulletList[nBullet].enemy = nTargetSprite; BulletList[nBullet].pEnemy = &exhumedActors[nTargetSprite];
} }
else else
{ {
@ -811,8 +811,9 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va
pBullet->z = 0; pBullet->z = 0;
pBullet->x = (pSprite->clipdist << 2) * bcos(nAngle); pBullet->x = (pSprite->clipdist << 2) * bcos(nAngle);
pBullet->y = (pSprite->clipdist << 2) * bsin(nAngle); pBullet->y = (pSprite->clipdist << 2) * bsin(nAngle);
BulletList[nBullet].enemy = -1; BulletList[nBullet].pEnemy = nullptr;
int pb = pBulletActor->GetSpriteIndex();
if (MoveBullet(nBullet)) if (MoveBullet(nBullet))
{ {
pBulletActor = nullptr; pBulletActor = nullptr;
@ -825,7 +826,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va
pBullet->z = var_18 >> 3; pBullet->z = var_18 >> 3;
} }
return pBulletActor->GetSpriteIndex() | (nBullet << 16); return pb | (nBullet << 16);
} }
void AIBullet::Tick(RunListEvent* ev) void AIBullet::Tick(RunListEvent* ev)

View file

@ -343,7 +343,7 @@ void AIMummy::Tick(RunListEvent* ev)
{ {
if (!RandomSize(3)) if (!RandomSize(3))
{ {
SetBulletEnemy(pBullet->nPhase, pTarget->GetSpriteIndex()); SetBulletEnemy(pBullet->nPhase, pTarget);
pBullet->s().pal = 5; pBullet->s().pal = 5;
} }
} }

View file

@ -520,7 +520,7 @@ void AISet::Tick(RunListEvent* ev)
{ {
auto pBullet = BuildBullet(pActor, 11, -1, pSprite->ang, pTarget, 1); auto pBullet = BuildBullet(pActor, 11, -1, pSprite->ang, pTarget, 1);
if (pBullet) if (pBullet)
SetBulletEnemy(pBullet->nPhase, pTarget->GetSpriteIndex()); SetBulletEnemy(pBullet->nPhase, pTarget);
pActor->nRun--; pActor->nRun--;
if (pActor->nRun <= 0 || !RandomBit()) if (pActor->nRun <= 0 || !RandomBit())