- rewrote actFloorBounceVector to avoid reference parameters

This commit is contained in:
Christoph Oelckers 2022-09-02 23:56:03 +02:00
parent e361abb96d
commit 9f235b56f3
4 changed files with 29 additions and 10 deletions

View file

@ -2632,6 +2632,15 @@ int actFloorBounceVector(int* x, int* y, int* z, sectortype* pSector, int a5)
return mulscale16r(t8, t);
}
DVector4 actFloorBounceVector(DBloodActor* actor, double oldz, sectortype* pSector, double factor)
{
int ioldz = FloatToFixed(oldz);
auto vel = actor->int_vel();
int v4 = actFloorBounceVector(&vel.X, &vel.Y, &ioldz, pSector, FloatToFixed(factor));
return { FixedToFloat(vel.X), FixedToFloat(vel.Y), FixedToFloat(ioldz), FixedToFloat(v4) };
}
//---------------------------------------------------------------------------
//
//
@ -4612,11 +4621,15 @@ static Collision MoveThing(DBloodActor* actor)
{
actor->spr.flags |= 4;
int vax = actFloorBounceVector(&actor->__int_vel.X, &actor->__int_vel.Y, (int*)&v20, actor->sector(), pThingInfo->elastic);
auto vec4 = actFloorBounceVector(actor, FixedToFloat(v20), actor->sector(), FixedToFloat(pThingInfo->elastic));
actor->set_float_bvel_xy(vec4.XY());
int vax = FloatToFixed(vec4.W);
int nDamage = MulScale(vax, vax, 30) - pThingInfo->dmgResist;
if (nDamage > 0) actDamageSprite(actor, actor, kDamageFall, nDamage);
actor->set_int_bvel_z(v20);
actor->set_int_bvel_z(FloatToFixed(vec4.Z));
if (actor->sector()->velFloor == 0 && abs(actor->int_vel().Z) < 0x10000)
{
actor->set_int_bvel_z(0);
@ -5099,7 +5112,10 @@ void MoveDude(DBloodActor* actor)
int v30 = actor->int_vel().Z - actor->sector()->velFloor;
if (v30 > 0)
{
int vax = actFloorBounceVector((int*)&actor->__int_vel.X, (int*)&actor->__int_vel.Y, (int*)&v30, actor->sector(), 0);
auto vec4 = actFloorBounceVector(actor, FixedToFloat(v30), actor->sector(), 0);
actor->set_float_bvel_xy(vec4.XY());
int vax = FloatToFixed(vec4.W);
int nDamage = MulScale(vax, vax, 30);
if (pPlayer)
{
@ -5113,7 +5129,7 @@ void MoveDude(DBloodActor* actor)
nDamage -= 100 << 4;
if (nDamage > 0)
actDamageSprite(actor, actor, kDamageFall, nDamage);
actor->set_int_bvel_z(v30);
actor->set_int_bvel_z(FloatToFixed(vec4.Z));
if (abs(actor->int_vel().Z) < 0x10000)
{
actor->set_int_bvel_z(actor->sector()->velFloor);

View file

@ -211,7 +211,7 @@ void TreeToGibCallback(int, int);
bool IsUnderwaterSector(sectortype* pSector);
void actInit(TArray<DBloodActor*>& actors);
int actWallBounceVector(int *x, int *y, walltype* pWall, int a4);
int actFloorBounceVector(int *x, int *y, int *z, sectortype* pSector, int a5);
DVector4 actFloorBounceVector(DBloodActor* actor, double oldz, sectortype* pSector, double factor);
void actRadiusDamage(DBloodActor* source, const DVector3& pos, sectortype* pSector, int nDist, int a7, int a8, DAMAGE_TYPE a9, int a10, int a11);
DBloodActor *actDropObject(DBloodActor *pSprite, int nType);
bool actHealDude(DBloodActor* pXDude, int a2, int a3);

View file

@ -524,9 +524,11 @@ void fxBouncingSleeve(DBloodActor* actor, sectortype*) // 16
int zv = actor->int_vel().Z - actor->sector()->velFloor;
if (actor->int_vel().Z == 0) sleeveStopBouncing(actor);
else if (zv > 0) {
actFloorBounceVector((int*)&actor->__int_vel.X, (int*)&actor->__int_vel.Y, &zv, actor->sector(), 0x9000);
actor->set_int_bvel_z(zv);
else if (zv > 0)
{
auto vec4 = actFloorBounceVector(actor, FixedToFloat(zv), actor->sector(), FixedToFloat(0x9000));
actor->set_float_bvel(vec4.XYZ());
if (actor->sector()->velFloor == 0 && abs(actor->int_vel().Z) < 0x20000) {
sleeveStopBouncing(actor);
return;

View file

@ -1785,8 +1785,9 @@ void debrisMove(int listIndex)
if (v30 > 0)
{
actor->xspr.physAttr |= kPhysFalling;
actFloorBounceVector(&actor->__int_vel.X, &actor->__int_vel.Y, &v30, actor->sector(), tmpFraction);
actor->set_int_bvel_z(v30);
auto vec4 = actFloorBounceVector(actor, FixedToFloat(v30), actor->sector(), FixedToFloat(tmpFraction));
actor->set_float_bvel(vec4.XYZ());
v30 = actor->int_vel().Z;
if (abs(actor->int_vel().Z) < 0x10000)
{