mirror of
https://github.com/DrBeef/Raze.git
synced 2025-02-21 11:11:16 +00:00
- add a Collision member to USER.
This commit is contained in:
parent
d5f1ec9ad7
commit
c15da92544
4 changed files with 65 additions and 56 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue