diff --git a/source/games/sw/src/actor.cpp b/source/games/sw/src/actor.cpp index aa577057d..7c7951b77 100644 --- a/source/games/sw/src/actor.cpp +++ b/source/games/sw/src/actor.cpp @@ -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 diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index ab6e4589f..26a011606 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -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 diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp index ae30f1a65..32cbeccaa 100644 --- a/source/games/sw/src/save.cpp +++ b/source/games/sw/src/save.cpp @@ -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; diff --git a/source/games/sw/src/swactor.h b/source/games/sw/src/swactor.h index c9088ea45..64968bbe7 100644 --- a/source/games/sw/src/swactor.h +++ b/source/games/sw/src/swactor.h @@ -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)