From c14fb9e93fe58ea0439fc89d4d8a82ea48da4509 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 3 Nov 2021 21:40:56 +0100 Subject: [PATCH] - QueueLoWangs --- source/games/sw/src/game.h | 2 +- source/games/sw/src/player.cpp | 2 +- source/games/sw/src/sprite.cpp | 3 +-- source/games/sw/src/weapon.cpp | 38 +++++++++++++++------------------- source/games/sw/src/weapon.h | 2 +- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index fd4aca888..40158f981 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -579,7 +579,7 @@ extern FOOT_TYPE FootMode; ANIMATOR QueueFloorBlood; // Weapon.c int QueueFootPrint(short hit_sprite); // Weapon.c int QueueGeneric(short SpriteNum, short pic); // Weapon.c -int QueueLoWangs(short SpriteNum); // Weapon.c +void QueueLoWangs(DSWActor*); // Weapon.c int SpawnShell(DSWActor* actor, int ShellNum); // JWeapon.c void UnlockKeyLock(short key_num, DSWActor* actor); // JSector.c diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index e31dbf13d..93df9222a 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -5859,7 +5859,7 @@ void DoPlayerDeathCheckKeys(PLAYERp pp) if (PlayerFloorHit(pp, pp->loz - PLAYER_HEIGHT)) { if (pp->DeathType == PLAYER_DEATH_FLIP || pp->DeathType == PLAYER_DEATH_RIPPER) - QueueLoWangs(pp->PlayerSprite); + QueueLoWangs(pp->Actor()); } else { diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp index 8e40dfff0..a9e7316e5 100644 --- a/source/games/sw/src/sprite.cpp +++ b/source/games/sw/src/sprite.cpp @@ -4600,8 +4600,7 @@ int NewStateGroup(DSWActor* actor, STATEp StateGroup[]) } -bool -SpriteOverlap(int16_t spritenum_a, int16_t spritenum_b) +bool SpriteOverlap(int16_t spritenum_a, int16_t spritenum_b) { SPRITEp spa = &sprite[spritenum_a], spb = &sprite[spritenum_b]; diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp index 94e917dbd..a3ebf1750 100644 --- a/source/games/sw/src/weapon.cpp +++ b/source/games/sw/src/weapon.cpp @@ -84,7 +84,7 @@ short FloorBloodQueue[MAX_FLOORBLOOD_QUEUE]; short GenericQueueHead=0; short GenericQueue[MAX_GENERIC_QUEUE]; short LoWangsQueueHead=0; -short LoWangsQueue[MAX_LOWANGS_QUEUE]; +DSWActor* LoWangsQueue[MAX_LOWANGS_QUEUE]; int SpawnBreakStaticFlames(short); bool GlobalSkipZrange = false; @@ -19970,8 +19970,8 @@ void SpriteQueueDelete(DSWActor* actor) GenericQueue[i] = -1; for (i = 0; i < MAX_LOWANGS_QUEUE; i++) - if (LoWangsQueue[i] == SpriteNum) - LoWangsQueue[i] = -1; + if (LoWangsQueue[i] == actor) + LoWangsQueue[i] = nullptr; } @@ -20002,7 +20002,7 @@ void QueueReset(void) GenericQueue[i] = -1; for (i = 0; i < MAX_LOWANGS_QUEUE; i++) - LoWangsQueue[i] = -1; + LoWangsQueue[i] = nullptr; } bool TestDontStick(short SpriteNum, short hit_wall) @@ -21102,62 +21102,58 @@ DoItemFly(int16_t SpriteNum) } // This is the FAST queue, it doesn't call any animator functions or states -int QueueLoWangs(short SpriteNum) +void QueueLoWangs(DSWActor* actor) { - auto actor = &swActors[SpriteNum]; SPRITEp sp = &actor->s(),ps; USERp u; - short NewSprite; + DSWActor* NewSprite; if (TEST(sector[sp->sectnum].extra, SECTFX_LIQUID_MASK) == SECTFX_LIQUID_WATER) { - return -1; + return; } if (TEST(sector[sp->sectnum].extra, SECTFX_LIQUID_MASK) == SECTFX_LIQUID_LAVA) { - return -1; + return; } if (TestDontStickSector(sp->sectnum)) { - return -1; + return; } - if (LoWangsQueue[LoWangsQueueHead] == -1) + if (LoWangsQueue[LoWangsQueueHead] == nullptr) { LoWangsQueue[LoWangsQueueHead] = NewSprite = - SpawnSprite(STAT_GENERIC_QUEUE, sp->picnum, s_DeadLoWang, sp->sectnum, + SpawnActor(STAT_GENERIC_QUEUE, sp->picnum, s_DeadLoWang, sp->sectnum, sp->x, sp->y, sp->z, sp->ang, 0); } else { // move old sprite to new sprite's place - setspritez(LoWangsQueue[LoWangsQueueHead], &sp->pos); + SetActorZ(LoWangsQueue[LoWangsQueueHead], &sp->pos); NewSprite = LoWangsQueue[LoWangsQueueHead]; - ASSERT(sprite[NewSprite].statnum != MAXSTATUS); + ASSERT(NewSprite->s().statnum != MAXSTATUS); } // Point passed in sprite to ps ps = sp; - sp = &sprite[NewSprite]; - u = User[NewSprite].Data(); - ASSERT(sp); - sp->owner = -1; + sp = &NewSprite->s(); + u = NewSprite->u(); + ClearOwner(NewSprite); sp->cstat = 0; sp->xrepeat = ps->xrepeat; sp->yrepeat = ps->yrepeat; sp->shade = ps->shade; u->spal = sp->pal = ps->pal; - change_actor_stat(&swActors[NewSprite],STAT_DEFAULT); // Breakable + change_actor_stat(NewSprite, STAT_DEFAULT); // Breakable SET(sp->cstat, CSTAT_SPRITE_BREAKABLE); SET(sp->extra, SPRX_BREAKABLE); SET(sp->cstat, CSTAT_SPRITE_BLOCK_HITSCAN); LoWangsQueueHead = (LoWangsQueueHead+1) & (MAX_LOWANGS_QUEUE-1); - - return SpriteNum; } diff --git a/source/games/sw/src/weapon.h b/source/games/sw/src/weapon.h index deaf57710..61313229e 100644 --- a/source/games/sw/src/weapon.h +++ b/source/games/sw/src/weapon.h @@ -69,7 +69,7 @@ extern short FloorBloodQueue[MAX_FLOORBLOOD_QUEUE]; extern short GenericQueueHead; extern short GenericQueue[MAX_GENERIC_QUEUE]; extern short LoWangsQueueHead; -extern short LoWangsQueue[MAX_LOWANGS_QUEUE]; +extern DSWActor* LoWangsQueue[MAX_LOWANGS_QUEUE]; void ChangeState(DSWActor* actor, STATEp statep); void DoPlayerBeginRecoil(PLAYERp pp, short pix_amt);