mirror of
https://github.com/DrBeef/Raze.git
synced 2025-02-20 18:52:43 +00:00
- rewrote actFloorBounceVector to avoid reference parameters
This commit is contained in:
parent
e361abb96d
commit
9f235b56f3
4 changed files with 29 additions and 10 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue