- redid ConcussSprite.

This commit is contained in:
Christoph Oelckers 2020-12-02 20:55:08 +01:00
parent d466ec081a
commit 6110ec5cfd
2 changed files with 62 additions and 50 deletions

View file

@ -2350,7 +2350,7 @@ bool IsUnderwaterSector(int nSector)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void actInitTraps() static void actInitTraps()
{ {
BloodStatIterator it(kStatTraps); BloodStatIterator it(kStatTraps);
while (auto act = it.Next()) while (auto act = it.Next())
@ -2374,7 +2374,7 @@ void actInitTraps()
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void actInitThings() static void actInitThings()
{ {
BloodStatIterator it(kStatThing); BloodStatIterator it(kStatThing);
while (auto act = it.Next()) while (auto act = it.Next())
@ -2428,7 +2428,7 @@ void actInitThings()
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void actInitDudes() static void actInitDudes()
{ {
if (gGameOptions.nMonsterSettings == 0) if (gGameOptions.nMonsterSettings == 0)
{ {
@ -2552,54 +2552,58 @@ void actInit(bool bSaveLoad)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void ConcussSprite(int a1, spritetype *pSprite, int x, int y, int z, int a6) static void ConcussSprite(DBloodActor* source, DBloodActor* actor, int x, int y, int z, int damage)
{ {
assert(pSprite != NULL); auto pSprite = &actor->s();
int dx = pSprite->x-x; int dx = pSprite->x - x;
int dy = pSprite->y-y; int dy = pSprite->y - y;
int dz = (pSprite->z-z)>>4; int dz = (pSprite->z - z) >> 4;
int dist2 = 0x40000+dx*dx+dy*dy+dz*dz; int dist2 = 0x40000 + dx * dx + dy * dy + dz * dz;
assert(dist2 > 0); assert(dist2 > 0);
a6 = scale(0x40000, a6, dist2); damage = scale(0x40000, damage, dist2);
if (pSprite->flags & kPhysMove) { if (pSprite->flags & kPhysMove)
int mass = 0; {
if (IsDudeSprite(pSprite)) { int mass = 0;
if (actor->IsDudeActor())
{
mass = getDudeInfo(pSprite->type)->mass;
#ifdef NOONE_EXTENSIONS
if (pSprite->type == kDudeModernCustom || pSprite->type == kDudeModernCustomBurning)
{
mass = getSpriteMassBySize(pSprite);
}
#endif
}
else if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
{
mass = thingInfo[pSprite->type - kThingBase].mass;
}
else
{
Printf(PRINT_HIGH, "Unexpected type in ConcussSprite(): Sprite: %d Type: %d Stat: %d", (int)pSprite->index, (int)pSprite->type, (int)pSprite->statnum);
return;
}
mass = getDudeInfo(pSprite->type)->mass; if (mass > 0)
#ifdef NOONE_EXTENSIONS {
switch (pSprite->type) { int size = (tileWidth(pSprite->picnum) * pSprite->xrepeat * tileHeight(pSprite->picnum) * pSprite->yrepeat) >> 1;
case kDudeModernCustom: int t = scale(damage, size, mass);
case kDudeModernCustomBurning: int nSprite = pSprite->index;
mass = getSpriteMassBySize(pSprite); actor->xvel() += MulScale(t, dx, 16);
break; actor->yvel() += MulScale(t, dy, 16);
} actor->zvel() += MulScale(t, dz, 16);
#endif }
}
} else if (pSprite->type >= kThingBase && pSprite->type < kThingMax) { actDamageSprite(source, actor, DAMAGE_TYPE_3, damage);
mass = thingInfo[pSprite->type - kThingBase].mass;
} else {
Printf(PRINT_HIGH, "Unexpected type in ConcussSprite(): Sprite: %d Type: %d Stat: %d", (int)pSprite->index, (int)pSprite->type, (int)pSprite->statnum);
return;
}
int size = (tileWidth(pSprite->picnum)*pSprite->xrepeat*tileHeight(pSprite->picnum)*pSprite->yrepeat)>>1;
assert(mass > 0);
int t = scale(a6, size, mass);
dx = MulScale(t, dx, 16);
dy = MulScale(t, dy, 16);
dz = MulScale(t, dz, 16);
int nSprite = pSprite->index;
assert(nSprite >= 0 && nSprite < kMaxSprites);
xvel[nSprite] += dx;
yvel[nSprite] += dy;
zvel[nSprite] += dz;
}
actDamageSprite(a1, pSprite, DAMAGE_TYPE_3, a6);
} }
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
int actWallBounceVector(int *x, int *y, int nWall, int a4) int actWallBounceVector(int *x, int *y, int nWall, int a4)
{ {
int wx, wy; int wx, wy;
@ -3593,6 +3597,11 @@ int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, in
return damage >> 4; return damage >> 4;
} }
int actDamageSprite(DBloodActor* pSource, DBloodActor* pTarget, DAMAGE_TYPE damageType, int damage)
{
return actDamageSprite(pSource->s().index, &pTarget->s(), damageType, damage);
}
void actHitcodeToData(int a1, HITINFO *pHitInfo, int *a3, spritetype **a4, XSPRITE **a5, int *a6, walltype **a7, XWALL **a8, int *a9, sectortype **a10, XSECTOR **a11) void actHitcodeToData(int a1, HITINFO *pHitInfo, int *a3, spritetype **a4, XSPRITE **a5, int *a6, walltype **a7, XWALL **a8, int *a9, sectortype **a10, XSECTOR **a11)
{ {
assert(pHitInfo != NULL); assert(pHitInfo != NULL);
@ -5646,6 +5655,7 @@ void actProcessSprites(void)
if (pSprite->flags & 32) if (pSprite->flags & 32)
continue; continue;
int nOwner = pSprite->owner; int nOwner = pSprite->owner;
auto pOwner = nOwner == -1? nullptr : &bloodActors[pSprite->owner];
int nType = pSprite->type; int nType = pSprite->type;
assert(nType >= 0 && nType < kExplodeMax); assert(nType >= 0 && nType < kExplodeMax);
const EXPLOSION *pExplodeInfo = &explodeInfo[nType]; const EXPLOSION *pExplodeInfo = &explodeInfo[nType];
@ -5681,7 +5691,8 @@ void actProcessSprites(void)
StatIterator it1(kStatDude); StatIterator it1(kStatDude);
while ((nSprite2 = it1.NextIndex()) >= 0) while ((nSprite2 = it1.NextIndex()) >= 0)
{ {
spritetype *pDude = &sprite[nSprite2]; DBloodActor* act2 = &bloodActors[nSprite2];
spritetype *pDude = &act2->s();
if (pDude->flags & 32) if (pDude->flags & 32)
continue; continue;
@ -5695,7 +5706,7 @@ void actProcessSprites(void)
actDamageSprite(nOwner, pDude, DAMAGE_TYPE_0, (pExplodeInfo->dmg+Random(pExplodeInfo->dmgRng))<<4); actDamageSprite(nOwner, pDude, DAMAGE_TYPE_0, (pExplodeInfo->dmg+Random(pExplodeInfo->dmgRng))<<4);
} }
if (pExplodeInfo->dmgType) if (pExplodeInfo->dmgType)
ConcussSprite(nOwner, pDude, x, y, z, pExplodeInfo->dmgType); ConcussSprite(pOwner, act2, x, y, z, pExplodeInfo->dmgType);
if (pExplodeInfo->burnTime) if (pExplodeInfo->burnTime)
{ {
assert(pDude->extra > 0 && pDude->extra < kMaxXSprites); assert(pDude->extra > 0 && pDude->extra < kMaxXSprites);
@ -5711,6 +5722,7 @@ void actProcessSprites(void)
it1.Reset(kStatThing); it1.Reset(kStatThing);
while ((nSprite2 = it1.NextIndex()) >= 0) while ((nSprite2 = it1.NextIndex()) >= 0)
{ {
auto act2 = &bloodActors[nSprite2];
spritetype *pThing = &sprite[nSprite2]; spritetype *pThing = &sprite[nSprite2];
if (pThing->flags & 32) if (pThing->flags & 32)
@ -5723,7 +5735,7 @@ void actProcessSprites(void)
if (!pXSprite2->locked) if (!pXSprite2->locked)
{ {
if (pExplodeInfo->dmgType) if (pExplodeInfo->dmgType)
ConcussSprite(nOwner, pThing, x, y, z, pExplodeInfo->dmgType); ConcussSprite(pOwner, act2, x, y, z, pExplodeInfo->dmgType);
if (pExplodeInfo->burnTime) if (pExplodeInfo->burnTime)
{ {
assert(pThing->extra > 0 && pThing->extra < kMaxXSprites); assert(pThing->extra > 0 && pThing->extra < kMaxXSprites);

View file

@ -211,7 +211,6 @@ void actDoLight(int spriteNum);
bool IsUnderwaterSector(int nSector); bool IsUnderwaterSector(int nSector);
void actInit(bool bSaveLoad); void actInit(bool bSaveLoad);
void ConcussSprite(int a1, spritetype *pSprite, int x, int y, int z, int a6);
int actWallBounceVector(int *x, int *y, int nWall, int a4); int actWallBounceVector(int *x, int *y, int nWall, int a4);
int actFloorBounceVector(int *x, int *y, int *z, int nSector, int a5); int actFloorBounceVector(int *x, int *y, int *z, int nSector, int a5);
void sub_2A620(int nSprite, int x, int y, int z, int nSector, int nDist, int a7, int a8, DAMAGE_TYPE a9, int a10, int a11, int a12, int a13); void sub_2A620(int nSprite, int x, int y, int z, int nSector, int nDist, int a7, int a8, DAMAGE_TYPE a9, int a10, int a11, int a12, int a13);
@ -226,6 +225,7 @@ spritetype *actDropObject(spritetype *pSprite, int nType);
bool actHealDude(XSPRITE *pXDude, int a2, int a3); bool actHealDude(XSPRITE *pXDude, int a2, int a3);
void actKillDude(int a1, spritetype *pSprite, DAMAGE_TYPE a3, int a4); void actKillDude(int a1, spritetype *pSprite, DAMAGE_TYPE a3, int a4);
int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE a3, int a4); int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE a3, int a4);
int actDamageSprite(DBloodActor* pSource, DBloodActor* pTarget, DAMAGE_TYPE damageType, int damage);
void actHitcodeToData(int a1, HITINFO *pHitInfo, int *a3, spritetype **a4, XSPRITE **a5, int *a6, walltype **a7, XWALL **a8, int *a9, sectortype **a10, XSECTOR **a11); void actHitcodeToData(int a1, HITINFO *pHitInfo, int *a3, spritetype **a4, XSPRITE **a5, int *a6, walltype **a7, XWALL **a8, int *a9, sectortype **a10, XSECTOR **a11);
void actImpactMissile(spritetype *pMissile, int hitCode); void actImpactMissile(spritetype *pMissile, int hitCode);
void actKickObject(spritetype *pSprite1, spritetype *pSprite2); void actKickObject(spritetype *pSprite1, spritetype *pSprite2);