- floatify SE18 handler.

To store floars in temp_data without relying on map format conventions, the FixedTo functions were extended to allow custom precision.
This commit is contained in:
Christoph Oelckers 2022-08-22 19:32:51 +02:00
parent 1131eeb443
commit 9275c14c9c
4 changed files with 32 additions and 23 deletions

View file

@ -15,24 +15,28 @@ __forceinline constexpr int64_t DivScaleL(int64_t a, int64_t b, int shift) { ret
#include "xs_Float.h" #include "xs_Float.h"
template<int b = 16>
inline fixed_t FloatToFixed(double f) inline fixed_t FloatToFixed(double f)
{ {
return xs_Fix<16>::ToFix(f); return xs_Fix<b>::ToFix(f);
} }
template<int b = 16>
inline constexpr fixed_t IntToFixed(int32_t f) inline constexpr fixed_t IntToFixed(int32_t f)
{ {
return f << FRACBITS; return f << b;
} }
template<int b = 16>
inline constexpr double FixedToFloat(fixed_t f) inline constexpr double FixedToFloat(fixed_t f)
{ {
return f * (1/65536.); return f * (1. / (1 << b));
} }
template<int b = 16>
inline constexpr int32_t FixedToInt(fixed_t f) inline constexpr int32_t FixedToInt(fixed_t f)
{ {
return (f + FRACUNIT/2) >> FRACBITS; return (f + (1 << (b-1))) >> b;
} }
inline unsigned FloatToAngle(double f) inline unsigned FloatToAngle(double f)

View file

@ -3927,41 +3927,44 @@ void handle_se18(DDukeActor *actor, bool morecheck)
{ {
auto sc = actor->sector(); auto sc = actor->sector();
double extra = sc->extra * zmaptoworld;
double goal = FixedToFloat<8>(actor->temp_data[1]);
if (actor->temp_data[0]) if (actor->temp_data[0])
{ {
double extra = sc->extra * zmaptoworld;
if (actor->spr.pal) if (actor->spr.pal)
{ {
if (actor->int_ang() == 512) if (actor->spr.intangle == 512)
{ {
sc->add_int_ceilingz(-sc->extra); sc->addceilingz(-extra);
if (sc->int_ceilingz() <= actor->temp_data[1]) if (sc->ceilingz <= goal)
{ {
sc->set_int_ceilingz(actor->temp_data[1]); sc->setceilingz(goal);
deletesprite(actor); deletesprite(actor);
return; return;
} }
} }
else else
{ {
sc->add_int_floorz(sc->extra); sc->addfloorz(extra);
if (morecheck) if (morecheck)
{ {
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
{ {
if (a2->isPlayer() && a2->GetOwner()) if (a2->isPlayer() && a2->GetOwner())
{
if (ps[a2->PlayerIndex()].on_ground == 1) ps[a2->PlayerIndex()].pos.Z += extra; if (ps[a2->PlayerIndex()].on_ground == 1) ps[a2->PlayerIndex()].pos.Z += extra;
}
if (a2->spr.zvel == 0 && a2->spr.statnum != STAT_EFFECTOR && a2->spr.statnum != STAT_PROJECTILE) if (a2->spr.zvel == 0 && a2->spr.statnum != STAT_EFFECTOR && a2->spr.statnum != STAT_PROJECTILE)
{ {
a2->add_int_z(sc->extra); a2->spr.pos.Z += extra;
a2->floorz = sc->floorz; a2->floorz = sc->floorz;
} }
} }
} }
if (sc->int_floorz() >= actor->temp_data[1]) if (sc->floorz >= goal)
{ {
sc->set_int_floorz(actor->temp_data[1]); sc->setfloorz(goal);
deletesprite(actor); deletesprite(actor);
return; return;
} }
@ -3969,10 +3972,10 @@ void handle_se18(DDukeActor *actor, bool morecheck)
} }
else else
{ {
if (actor->int_ang() == 512) if (actor->spr.intangle == 512)
{ {
sc->add_int_ceilingz(sc->extra); sc->addceilingz(extra);
if (sc->int_ceilingz() >= actor->int_pos().Z) if (sc->ceilingz >= actor->spr.pos.Z)
{ {
sc->setceilingz(actor->spr.pos.Z); sc->setceilingz(actor->spr.pos.Z);
deletesprite(actor); deletesprite(actor);
@ -3981,22 +3984,24 @@ void handle_se18(DDukeActor *actor, bool morecheck)
} }
else else
{ {
sc->add_int_floorz(-sc->extra); sc->addfloorz(-extra);
if (morecheck) if (morecheck)
{ {
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
{ {
if (a2->isPlayer() && a2->GetOwner()) if (a2->isPlayer() && a2->GetOwner())
{
if (ps[a2->PlayerIndex()].on_ground == 1) ps[a2->PlayerIndex()].pos.Z -= extra; if (ps[a2->PlayerIndex()].on_ground == 1) ps[a2->PlayerIndex()].pos.Z -= extra;
}
if (a2->spr.zvel == 0 && a2->spr.statnum != STAT_EFFECTOR && a2->spr.statnum != STAT_PROJECTILE) if (a2->spr.zvel == 0 && a2->spr.statnum != STAT_EFFECTOR && a2->spr.statnum != STAT_PROJECTILE)
{ {
a2->add_int_z(-sc->extra); a2->spr.pos.Z -= extra;
a2->floorz = sc->floorz; a2->floorz = sc->floorz;
} }
} }
} }
if (sc->int_floorz() <= actor->int_pos().Z) if (sc->floorz <= actor->spr.pos.Z)
{ {
sc->setfloorz(actor->spr.pos.Z); sc->setfloorz(actor->spr.pos.Z);
deletesprite(actor); deletesprite(actor);

View file

@ -523,7 +523,7 @@ bool activatewarpelevators(DDukeActor* actor, int d) //Parm = sectoreffectornum
if (act2->spr.hitag == actor->spr.hitag) if (act2->spr.hitag == actor->spr.hitag)
{ {
act2->temp_data[0] = d; act2->temp_data[0] = d;
act2->temp_data[1] = d; //Make all check warp if (act2->spr.lotag == SE_17_WARP_ELEVATOR) act2->temp_data[1] = d; //Make all check warp (only SE17, in SE18 this is a coordinate)
} }
} }
return 0; return 0;

View file

@ -638,15 +638,15 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
break; break;
case SE_18_INCREMENTAL_SECTOR_RISE_FALL: case SE_18_INCREMENTAL_SECTOR_RISE_FALL:
if (actor->int_ang() == 512) if (actor->spr.intangle == 512)
{ {
actor->temp_data[1] = sectp->int_ceilingz(); actor->temp_data[1] = FloatToFixed<8>(sectp->ceilingz);
if (actor->spr.pal) if (actor->spr.pal)
sectp->setceilingz(actor->spr.pos.Z); sectp->setceilingz(actor->spr.pos.Z);
} }
else else
{ {
actor->temp_data[1] = sectp->int_floorz(); actor->temp_data[1] = FloatToFixed<8>(sectp->floorz);
if (actor->spr.pal) if (actor->spr.pal)
sectp->setfloorz(actor->spr.pos.Z); sectp->setfloorz(actor->spr.pos.Z);
} }