diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index ec283f4f1..37adeb2c7 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -115,6 +115,7 @@ inline int RANDOM(void) return randomseed; } int RANDOM_P2(int pwr_of_2) { return (RANDOM() & (pwr_of_2 - 1)); } +double RANDOM_P2F(int pwr_of_2) { return (RANDOM() & (pwr_of_2 - 1)) * maptoworld; } // // Map directions/degrees @@ -2068,11 +2069,16 @@ inline int ActorUpperZ(DSWActor* actor) return (ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2)); } -inline int ActorLowerZ(DSWActor* actor) +inline int int_ActorLowerZ(DSWActor* actor) { return (ActorZOfBottom(actor) - (ActorSizeZ(actor) >> 2)); } +inline double ActorLowerZ(DSWActor* actor) +{ + return (ActorZOfBottom(actor) - (ActorSizeZ(actor) * 0.25)) * zinttoworld; +} + // Z size of top (TOS) and bottom (BOS) part of sprite inline int ActorSizeToTop(DSWActor* a) { diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp index df54b002f..1fdd57367 100644 --- a/source/games/sw/src/sector.cpp +++ b/source/games/sw/src/sector.cpp @@ -841,15 +841,13 @@ int AnimateSwitch(DSWActor* actor, int tgt_value) } -void SectorExp(DSWActor* actor, sectortype* sectp, short orig_ang, int zh) +void SectorExp(DSWActor* actor, sectortype* sectp, double zh) { - int x,y,z; - actor->spr.cstat &= ~(CSTAT_SPRITE_ALIGNMENT_WALL|CSTAT_SPRITE_ALIGNMENT_FLOOR); - SectorMidPoint(sectp, &x, &y, &z); + auto mid = SectorMidPoint(sectp); // randomize the explosions - actor->set_int_ang(orig_ang + RANDOM_P2(256) - 128); - actor->set_int_pos({ x + RANDOM_P2(256) - 128, y + RANDOM_P2(1024) - 512, zh }); + actor->spr.angle = DAngle::fromBuild(RANDOM_P2(256) - 128); + actor->spr.pos = { mid.X + RANDOM_P2F(256) - 16, mid.Y + RANDOM_P2F(1024) - 64, zh }; // setup vars needed by SectorExp ChangeActorSect(actor, sectp); @@ -868,13 +866,8 @@ void SectorExp(DSWActor* actor, sectortype* sectp, short orig_ang, int zh) void DoExplodeSector(short match) { - short orig_ang; - int zh; - sectortype* sectp; - orig_ang = 0; - SWStatIterator it(STAT_EXPLODING_CEIL_FLOOR); while (auto actor = it.Next()) { @@ -898,9 +891,9 @@ void DoExplodeSector(short match) sectp->setceilingslope(SP_TAG6(actor)); } - for (zh = sectp->int_ceilingz(); zh < sectp->int_floorz(); zh += Z(60)) + for (double zh = sectp->ceilingz; zh < sectp->floorz; zh += 60) { - SectorExp(actor, actor->sector(), orig_ang, zh + Z(RANDOM_P2(64)) - Z(32)); + SectorExp(actor, actor->sector(), zh + RANDOM_P2(64) - 32); } // don't need it any more diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp index 282634b06..c37a4ef40 100644 --- a/source/games/sw/src/sprite.cpp +++ b/source/games/sw/src/sprite.cpp @@ -3728,7 +3728,8 @@ int ActorCoughItem(DSWActor* actor) actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS); actorNew->spr.cstat = 0; actorNew->spr.extra = 0; - actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorLowerZ(actor) + Z(10) }); + actorNew->spr.pos.XY() = actor->spr.pos.XY(); + actorNew->spr.pos.Z = ActorLowerZ(actor) + 10; actorNew->spr.angle = actor->spr.angle; // vel