- add a Collision member to USER.

This commit is contained in:
Christoph Oelckers 2021-10-31 10:54:34 +01:00
parent d5f1ec9ad7
commit c15da92544
4 changed files with 65 additions and 56 deletions

View file

@ -293,7 +293,6 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
void DoDebrisCurrent(DSWActor* actor)
{
int nx, ny;
int ret=0;
USERp u = actor->u();
auto sp = &actor->s();
SECT_USERp sectu = SectUser[sp->sectnum].Data();
@ -303,10 +302,10 @@ void DoDebrisCurrent(DSWActor* actor)
nx = MulScale(DIV4(sectu->speed), bcos(sectu->ang), 14);
ny = MulScale(DIV4(sectu->speed), bsin(sectu->ang), 14);
ret = move_sprite(actor->GetSpriteIndex(), nx, ny, 0, u->ceiling_dist, u->floor_dist, 0, ACTORMOVETICS);
Collision ret(move_sprite(actor->GetSpriteIndex(), nx, ny, 0, u->ceiling_dist, u->floor_dist, 0, ACTORMOVETICS));
// attempt to move away from wall
if (ret)
if (ret.type != kHitNone)
{
short rang = RANDOM_P2(2048);
@ -393,7 +392,7 @@ bool move_debris(DSWActor* actor, int xchange, int ychange, int zchange)
SetCollision(u, move_sprite(actor->GetSpriteIndex(), xchange, ychange, zchange,
u->ceiling_dist, u->floor_dist, 0, ACTORMOVETICS));
return !u->ret;
return u->coll.type == kHitNone;
}
// !AIC - Supposed to allow floating of DEBRIS (dead bodies, flotsam, jetsam). Or if water has

View file

@ -57,6 +57,25 @@ EXTERN_CVAR(Bool, sw_bunnyrockets)
BEGIN_SW_NS
// Wrapper around the insane collision info mess from Build.
class DSWActor;
struct Collision
{
int type;
int index;
int legacyVal; // should be removed later, but needed for converting back for unadjusted code.
DSWActor* actor;
Collision() = default;
Collision(int legacyval) { setFromEngine(legacyval); }
int setNone();
int setSector(int num);
int setWall(int num);
int setSprite(DSWActor* num);
int setFromEngine(int value);
};
typedef struct
{
// Net Options from Menus
@ -1215,6 +1234,7 @@ struct USER
uint8_t spal; // save off default palette number
int ret; //holder for move_sprite return value
Collision coll; // same thing broken up into useful components.
// Need to get rid of these flags
int Flag1;
@ -2280,6 +2300,7 @@ inline int Facing(DSWActor* actor1, DSWActor* actor2)
inline void SetCollision(USER* u, int coll)
{
u->ret = coll;
u->coll.setFromEngine(coll);
}
END_SW_NS

View file

@ -934,6 +934,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, USER& w, USER* def
if (arc.isReading())
{
w.oangdiff = 0;
SetCollision(&w, w.ret);
}
}
return arc;

View file

@ -133,61 +133,49 @@ enum EHitBitsSW
};
// Wrapper around the insane collision info mess from Build.
struct Collision
inline int Collision::setNone()
{
int type;
int index;
int legacyVal; // should be removed later, but needed for converting back for unadjusted code.
DSWActor* actor;
type = kHitNone;
index = -1;
legacyVal = 0;
actor = nullptr;
return kHitNone;
}
Collision() = default;
Collision(int legacyval) { setFromEngine(legacyval); }
inline int Collision::setSector(int num)
{
type = kHitSector;
index = num;
legacyVal = type | index;
actor = nullptr;
return kHitSector;
}
inline int Collision::setWall(int num)
{
type = kHitWall;
index = num;
legacyVal = type | index;
actor = nullptr;
return kHitWall;
}
inline int Collision::setSprite(DSWActor* num)
{
type = kHitSprite;
index = -1;
legacyVal = type | int(num - swActors);
actor = num;
return kHitSprite;
}
int setNone()
{
type = kHitNone;
index = -1;
legacyVal = 0;
actor = nullptr;
return kHitNone;
}
int setSector(int num)
{
type = kHitSector;
index = num;
legacyVal = type | index;
actor = nullptr;
return kHitSector;
}
int setWall(int num)
{
type = kHitWall;
index = num;
legacyVal = type | index;
actor = nullptr;
return kHitWall;
}
int setSprite(DSWActor* num)
{
type = kHitSprite;
index = -1;
legacyVal = type | int(num - swActors);
actor = num;
return kHitSprite;
}
int setFromEngine(int value)
{
legacyVal = value;
type = value & kHitTypeMaskSW;
if (type == 0) { index = -1; actor = nullptr; }
else if (type != kHitSprite) { index = value & kHitIndexMask; actor = nullptr; }
else { index = -1; actor = &swActors[value & kHitIndexMask]; }
return type;
}
};
inline int Collision::setFromEngine(int value)
{
legacyVal = value;
type = value & kHitTypeMaskSW;
if (type == 0) { index = -1; actor = nullptr; }
else if (type != kHitSprite) { index = value & kHitIndexMask; actor = nullptr; }
else { index = -1; actor = &swActors[value & kHitIndexMask]; }
return type;
}
inline FSerializer& Serialize(FSerializer& arc, const char* keyname, DSWActor*& w, DSWActor** def)