- floatified movespritez

This commit is contained in:
Christoph Oelckers 2022-09-09 21:52:43 +02:00
parent a62dcac514
commit 8137718133
3 changed files with 27 additions and 27 deletions

View file

@ -319,7 +319,7 @@ struct sectortype
sectortype* pSoundSect; sectortype* pSoundSect;
sectortype* pAbove; sectortype* pAbove;
sectortype* pBelow; sectortype* pBelow;
int Depth; double Depth;
short Sound; short Sound;
short Flag; short Flag;
short Damage; short Damage;

View file

@ -607,7 +607,7 @@ void ProcessSpriteTag(DExhumedActor* pActor, int nLotag, int nHitag)
case 94: // water case 94: // water
{ {
auto pSector = pActor->sector(); auto pSector = pActor->sector();
pSector->Depth = nHitag << 8; pSector->Depth = nHitag;
DeleteActor(pActor); DeleteActor(pActor);
return; return;

View file

@ -48,7 +48,6 @@ BlockInfo sBlockInfo[kMaxPushBlocks];
TObjPtr<DExhumedActor*> nBodyGunSprite[50]; TObjPtr<DExhumedActor*> nBodyGunSprite[50];
int nCurBodyGunNum; int nCurBodyGunNum;
int sprceiling, sprfloor;
Collision loHit, hiHit; Collision loHit, hiHit;
// think this belongs in init.c? // think this belongs in init.c?
@ -215,7 +214,7 @@ int BelowNear(DExhumedActor* pActor, double walldist)
} }
} }
Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdist) Collision movespritez(DExhumedActor* pActor, double z, double height, int clipdist)
{ {
auto pSector = pActor->sector(); auto pSector = pActor->sector();
assert(pSector); assert(pSector);
@ -234,28 +233,28 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
int nSectFlags = pSector->Flag; int nSectFlags = pSector->Flag;
if (nSectFlags & kSectUnderwater) { if (nSectFlags & kSectUnderwater) {
z >>= 1; z *= 0.5;
} }
int spriteZ = pActor->int_pos().Z; double spriteZ = pActor->spr.pos.Z;
int floorZ = pSector->int_floorz(); double floorZ = pSector->floorz;
int ebp = spriteZ + z; double destZ = spriteZ + z;
int eax = pSector->int_ceilingz() + (height >> 1); double highestZ = pSector->ceilingz + (height * 0.5);
if ((nSectFlags & kSectUnderwater) && ebp < eax) { if ((nSectFlags & kSectUnderwater) && destZ < highestZ) {
ebp = eax; destZ = highestZ;
} }
// loc_151E7: // loc_151E7:
while (ebp > pActor->sector()->int_floorz() && pActor->sector()->pBelow != nullptr) while (destZ > pActor->sector()->floorz && pActor->sector()->pBelow != nullptr)
{ {
ChangeActorSect(pActor, pActor->sector()->pBelow); ChangeActorSect(pActor, pActor->sector()->pBelow);
} }
if (pSect2 != pSector) if (pSect2 != pSector)
{ {
pActor->set_int_z(ebp); pActor->spr.pos.Z = destZ;
if (pSect2->Flag & kSectUnderwater) if (pSect2->Flag & kSectUnderwater)
{ {
@ -270,7 +269,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
else else
{ {
while ((ebp < pActor->sector()->int_ceilingz()) && (pActor->sector()->pAbove != nullptr)) while ((destZ < pActor->sector()->ceilingz) && (pActor->sector()->pAbove != nullptr))
{ {
ChangeActorSect(pActor, pActor->sector()->pAbove); ChangeActorSect(pActor, pActor->sector()->pAbove);
} }
@ -278,17 +277,18 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
// This function will keep the player from falling off cliffs when you're too close to the edge. // This function will keep the player from falling off cliffs when you're too close to the edge.
// This function finds the highest and lowest z coordinates that your clipping BOX can get to. // This function finds the highest and lowest z coordinates that your clipping BOX can get to.
vec3_t pos = pActor->int_pos(); double sprceiling, sprfloor;
pos.Z -= 256;
auto pos = pActor->spr.pos.plusZ(-1);
getzrange(pos, pActor->sector(), &sprceiling, hiHit, &sprfloor, loHit, 128, CLIPMASK0); getzrange(pos, pActor->sector(), &sprceiling, hiHit, &sprfloor, loHit, 128, CLIPMASK0);
int mySprfloor = sprfloor; double mySprfloor = sprfloor;
if (loHit.type != kHitSprite) { if (loHit.type != kHitSprite) {
mySprfloor += pActor->sector()->Depth; mySprfloor += pActor->sector()->Depth;
} }
if (ebp > mySprfloor) if (destZ > mySprfloor)
{ {
if (z > 0) if (z > 0)
{ {
@ -301,13 +301,13 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
if (pActor->spr.statnum == 100 && pFloorActor->spr.statnum != 0 && pFloorActor->spr.statnum < 100) if (pActor->spr.statnum == 100 && pFloorActor->spr.statnum != 0 && pFloorActor->spr.statnum < 100)
{ {
int nDamage = (z >> 9); int nDamage = int(z * 0.5);
if (nDamage) if (nDamage)
{ {
runlist_DamageEnemy(loHit.actor(), pActor, nDamage << 1); runlist_DamageEnemy(loHit.actor(), pActor, nDamage << 1);
} }
pActor->set_int_zvel(-z); pActor->vel.Z = -z;
} }
else else
{ {
@ -352,19 +352,19 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
// loc_1543B: // loc_1543B:
ebp = mySprfloor; destZ = mySprfloor;
pActor->set_int_z(mySprfloor); pActor->spr.pos.Z = mySprfloor;
} }
else else
{ {
if ((ebp - height) < sprceiling && (hiHit.type == kHitSprite || pActor->sector()->pAbove == nullptr)) if ((destZ - height) < sprceiling && (hiHit.type == kHitSprite || pActor->sector()->pAbove == nullptr))
{ {
ebp = sprceiling + height; destZ = sprceiling + height;
nRet.exbits |= kHitAux1; nRet.exbits |= kHitAux1;
} }
} }
if (spriteZ <= floorZ && ebp > floorZ) if (spriteZ <= floorZ && destZ > floorZ)
{ {
if ((pSector->Depth != 0) || (pSect2 != pSector && (pSect2->Flag & kSectUnderwater))) if ((pSector->Depth != 0) || (pSect2 != pSector && (pSect2->Flag & kSectUnderwater)))
{ {
@ -373,7 +373,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
pActor->spr.cstat = cstat; // restore cstat pActor->spr.cstat = cstat; // restore cstat
pActor->set_int_z(ebp); pActor->spr.pos.Z = destZ;
if (pActor->spr.statnum == 100) if (pActor->spr.statnum == 100)
{ {
@ -415,7 +415,7 @@ Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist
dy >>= 1; dy >>= 1;
} }
Collision nRet = movespritez(pActor, dz, nSpriteHeight, flordist, nClipDist); Collision nRet = movespritez(pActor, dz * zinttoworld, nSpriteHeight * zinttoworld, nClipDist);
pSector = pActor->sector(); // modified in movespritez so re-grab this variable pSector = pActor->sector(); // modified in movespritez so re-grab this variable