- SW: almost the last wraps.

This commit is contained in:
Christoph Oelckers 2022-02-02 00:00:54 +01:00
parent b49aed6620
commit b74355fcee
2 changed files with 32 additions and 15 deletions

View file

@ -6243,7 +6243,8 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
((xchange * numtics) << 11), ((ychange * numtics) << 11), ((xchange * numtics) << 11), ((ychange * numtics) << 11),
(((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1);
actor->spr.pos.vec2 = clippos.vec2;
actor->set_int_xy(clippos.X, clippos.Y);
if (dasect == nullptr) if (dasect == nullptr)
{ {
@ -6297,21 +6298,25 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
// extra processing for Stacks and warping // extra processing for Stacks and warping
if (FAF_ConnectArea(actor->sector())) if (FAF_ConnectArea(actor->sector()))
SetActorZ(actor, &actor->spr.pos); SetActorZ(actor, actor->spr.pos);
if ((actor->sector()->extra & SECTFX_WARP_SECTOR)) if ((actor->sector()->extra & SECTFX_WARP_SECTOR))
{ {
DSWActor* sp_warp; DSWActor* sp_warp;
if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) pos = actor->spr.pos;
if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
ActorWarpUpdatePos(actor, dasect); ActorWarpUpdatePos(actor, dasect);
ActorWarpType(actor, sp_warp); ActorWarpType(actor, sp_warp);
} }
if (actor->sector() != lastsect) if (actor->sector() != lastsect)
{ {
if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) pos = actor->spr.pos;
if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
ActorWarpUpdatePos(actor, dasect); ActorWarpUpdatePos(actor, dasect);
ActorWarpType(actor, sp_warp); ActorWarpType(actor, sp_warp);
} }
@ -6430,7 +6435,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
clipmove(clippos, &dasect, clipmove(clippos, &dasect,
((xchange * numtics) << 11), ((ychange * numtics) << 11), ((xchange * numtics) << 11), ((ychange * numtics) << 11),
(((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1);
actor->spr.pos.vec2 = clippos.vec2; actor->set_int_xy(clippos.X, clippos.Y);
if (dasect == nullptr) if (dasect == nullptr)
{ {
@ -6483,22 +6488,26 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
} }
if (FAF_ConnectArea(actor->sector())) if (FAF_ConnectArea(actor->sector()))
SetActorZ(actor, &actor->spr.pos); SetActorZ(actor, actor->spr.pos);
if ((actor->sector()->extra & SECTFX_WARP_SECTOR)) if ((actor->sector()->extra & SECTFX_WARP_SECTOR))
{ {
DSWActor* sp_warp; DSWActor* sp_warp;
if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) auto pos = actor->spr.pos;
if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
MissileWarpUpdatePos(actor, dasect); MissileWarpUpdatePos(actor, dasect);
MissileWarpType(actor, sp_warp); MissileWarpType(actor, sp_warp);
} }
if (actor->sector() != lastsect) if (actor->sector() != lastsect)
{ {
if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) pos = actor->spr.pos;
if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
MissileWarpUpdatePos(actor, dasect); MissileWarpUpdatePos(actor, dasect);
MissileWarpType(actor, sp_warp); MissileWarpType(actor, sp_warp);
} }
@ -6575,7 +6584,7 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
clipmove(opos, &dasect, clipmove(opos, &dasect,
((xchange * numtics) << 11), ((ychange * numtics) << 11), ((xchange * numtics) << 11), ((ychange * numtics) << 11),
(((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1);
actor->spr.pos.vec2 = opos.vec2; actor->set_int_xy(opos.X, opos.Y);
} }
if (dasect == nullptr) if (dasect == nullptr)
@ -6619,16 +6628,20 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
{ {
DSWActor* sp_warp; DSWActor* sp_warp;
if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) auto pos = actor->spr.pos;
if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
MissileWarpUpdatePos(actor, dasect); MissileWarpUpdatePos(actor, dasect);
MissileWarpType(actor, sp_warp); MissileWarpType(actor, sp_warp);
} }
if (actor->sector() != lastsect) if (actor->sector() != lastsect)
{ {
if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) pos = actor->spr.pos;
if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
{ {
actor->set_int_pos(pos);
MissileWarpUpdatePos(actor, dasect); MissileWarpUpdatePos(actor, dasect);
MissileWarpType(actor, sp_warp); MissileWarpType(actor, sp_warp);
} }

View file

@ -1729,16 +1729,18 @@ PlayerPart:
if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_DONT_SPIN)) if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_DONT_SPIN))
continue; continue;
auto pos = actor->spr.pos;
if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_REVERSE_SPIN)) if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_REVERSE_SPIN))
{ {
rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, -delta_ang, &actor->spr.pos.vec2); rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, -delta_ang, &pos.vec2);
actor->spr.ang = NORM_ANGLE(actor->spr.ang - delta_ang); actor->spr.ang = NORM_ANGLE(actor->spr.ang - delta_ang);
} }
else else
{ {
rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &actor->spr.pos.vec2); rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &pos.vec2);
actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang); actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang);
} }
actor->set_int_pos(pos);
} }
else else
@ -1746,14 +1748,16 @@ PlayerPart:
if (!(sop->flags & SOBJ_DONT_ROTATE)) if (!(sop->flags & SOBJ_DONT_ROTATE))
{ {
// NOT part of a sector - independant of any sector // NOT part of a sector - independant of any sector
rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &actor->spr.pos.vec2); auto pos = actor->spr.pos;
rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &pos.vec2);
actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang); actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang);
actor->set_int_pos(pos);
} }
// Does not necessarily move with the sector so must accout for // Does not necessarily move with the sector so must accout for
// moving across sectors // moving across sectors
if (sop->pmid.X < MAXSO) // special case for operating SO's if (sop->pmid.X < MAXSO) // special case for operating SO's
SetActorZ(sop->so_actors[i], &actor->spr.pos); SetActorZ(sop->so_actors[i], actor->spr.pos);
} }
actor->user.oangdiff += getincangle(oldang, actor->spr.ang); actor->user.oangdiff += getincangle(oldang, actor->spr.ang);