From 07a57d0419ff1b588071abcfe844f36552c88370 Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 09:45:34 +0100 Subject: [PATCH 1/7] Add SF_CANBREAKWALLS, SF_CANBREAKFLOORS and SF_BUSTABLEBUSTER --- src/d_player.h | 3 +++ src/dehacked.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index 26086a331..03579be28 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -51,6 +51,9 @@ typedef enum SF_NONIGHTSSUPER = 1<<15, // Disable super colors for NiGHTS (if you have SF_SUPER) SF_NOSUPERSPRITES = 1<<16, // Don't use super sprites while super SF_NOSUPERJUMPBOOST = 1<<17, // Disable the jump boost given while super (i.e. Knuckles) + SF_CANBREAKWALLS = 1<<18, // Can naturally break walls on contact? (i.e. Knuckles) + SF_CANBREAKFLOORS = 1<<19, // Can naturally break floors on contact? + SF_BUSTABLEBUSTER = SF_CANBREAKWALLS|SF_CANBREAKFLOORS, // Convenience skinflag. // free up to and including 1<<31 } skinflags_t; diff --git a/src/dehacked.c b/src/dehacked.c index d02dc3d24..9cd181256 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9666,6 +9666,9 @@ struct { {"SF_NONIGHTSSUPER",SF_NONIGHTSSUPER}, {"SF_NOSUPERSPRITES",SF_NOSUPERSPRITES}, {"SF_NOSUPERJUMPBOOST",SF_NOSUPERJUMPBOOST}, + {"SF_CANBREAKWALLS",SF_CANBREAKWALLS}, + {"SF_CANBREAKFLOORS",SF_CANBREAKFLOORS}, + {"SF_BUSTABLEBUSTER",SF_BUSTABLEBUSTER}, // Dashmode constants {"DASHMODE_THRESHOLD",DASHMODE_THRESHOLD}, From d07422bda13d050794721d87312da2898111b699 Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 10:32:45 +0100 Subject: [PATCH 2/7] Change breaking walls requirement from CA_GLIDEANDCLIMB to SF_CANBREAKWALLS. --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 261e4b28c..8701f8a73 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2564,7 +2564,7 @@ static boolean P_PlayerCanBust(player_t *player, ffloor_t *rover) } // Strong abilities can break even FF_STRONGBUST. - if (player->charability == CA_GLIDEANDCLIMB) + if (player->charflags & SF_CANBREAKWALLS) return true; if (player->pflags & PF_BOUNCING) From 04b749f1f91f89f5adae2cf79102c4d3211979c4 Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 11:05:04 +0100 Subject: [PATCH 3/7] Remove SF_BUSTABLEBUSTER, change SF_CANBREAKFLOORS to a pflags; PF_CANBREAKFLOORS --- src/d_player.h | 3 +-- src/dehacked.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 03579be28..794dc5640 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -52,8 +52,6 @@ typedef enum SF_NOSUPERSPRITES = 1<<16, // Don't use super sprites while super SF_NOSUPERJUMPBOOST = 1<<17, // Disable the jump boost given while super (i.e. Knuckles) SF_CANBREAKWALLS = 1<<18, // Can naturally break walls on contact? (i.e. Knuckles) - SF_CANBREAKFLOORS = 1<<19, // Can naturally break floors on contact? - SF_BUSTABLEBUSTER = SF_CANBREAKWALLS|SF_CANBREAKFLOORS, // Convenience skinflag. // free up to and including 1<<31 } skinflags_t; @@ -158,6 +156,7 @@ typedef enum PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs PF_CANCARRY = 1<<29, // Can carry another player? PF_FINISHED = 1<<30, // The player finished the level. NOT the same as exiting + PF_CANBREAKFLOORS = 1<<31, // The player can break floors. // up to 1<<31 is free } pflags_t; diff --git a/src/dehacked.c b/src/dehacked.c index 9cd181256..77e7fed4a 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9089,6 +9089,7 @@ static const char *const PLAYERFLAG_LIST[] = { "FORCESTRAFE", // Translate turn inputs into strafe inputs "CANCARRY", // Can carry? "FINISHED", + "CANBREAKFLOORS", // Can break floors? NULL // stop loop here. }; @@ -9667,8 +9668,6 @@ struct { {"SF_NOSUPERSPRITES",SF_NOSUPERSPRITES}, {"SF_NOSUPERJUMPBOOST",SF_NOSUPERJUMPBOOST}, {"SF_CANBREAKWALLS",SF_CANBREAKWALLS}, - {"SF_CANBREAKFLOORS",SF_CANBREAKFLOORS}, - {"SF_BUSTABLEBUSTER",SF_BUSTABLEBUSTER}, // Dashmode constants {"DASHMODE_THRESHOLD",DASHMODE_THRESHOLD}, From 90fbb752fa6bf7f2a7de6dd8d04d273498dc66e5 Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 12:58:36 +0100 Subject: [PATCH 4/7] Add functionality to PF_CANBREAKFLOORS --- src/p_user.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 8701f8a73..ed9de48bf 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2611,10 +2611,51 @@ static void P_CheckBustableBlocks(player_t *player) if ((netgame || multiplayer) && player->spectator) return; + + // First iteration, check for floors we're touching directly (PF_CANBREAKFLOORS) + if (player->pflags & PF_CANBREAKFLOORS) + { + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + ffloor_t *rover; + fixed_t topheight, bottomheight; + if (!node->m_sector) + break; + + if (!node->m_sector->ffloors) + continue; + + for (rover = node->m_sector->ffloors; rover; rover = rover->next) + { + // Make sure it's a bustable. (And that it actually exists!) + if (!(rover->flags & FF_EXISTS)) + continue; + + if (!(rover->flags & FF_BUSTUP)) + continue; + + topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL) - player->mo->momz; + bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL) - player->mo->momz; + + if (player->mo->z > topheight) + continue; + + if (player->mo->z + player->mo->height < bottomheight) + continue; + + EV_CrumbleChain(NULL, rover); // node->m_sector + + // Run a linedef executor?? + if (rover->master->flags & ML_EFFECT5) + P_LinedefExecute((INT16)(P_AproxDistance(rover->master->dx, rover->master->dy)>>FRACBITS), player->mo, node->m_sector); + } + } + } + oldx = player->mo->x; oldy = player->mo->y; - + if (!(player->pflags & PF_BOUNCING)) // Bouncers only get to break downwards, not sideways { P_UnsetThingPosition(player->mo); @@ -2633,7 +2674,7 @@ static void P_CheckBustableBlocks(player_t *player) if (!node->m_sector->ffloors) continue; - + for (rover = node->m_sector->ffloors; rover; rover = rover->next) { if (!P_PlayerCanBust(player, rover)) From 75042d781f94923c7e540f7d005cd2c9ed682d15 Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 13:47:48 +0100 Subject: [PATCH 5/7] Fix characters without SF_CANBREAKWALLS not being able to climb bustable walls. --- src/p_map.c | 2 +- src/p_user.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index b7ad14808..4732ebeeb 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3341,7 +3341,7 @@ static void PTR_GlideClimbTraverse(line_t *li) { for (rover = checksector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP)) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (slidemo->player->charflags & SF_CANBREAKWALLS))) continue; topheight = P_GetFFloorTopZAt (rover, slidemo->x, slidemo->y); diff --git a/src/p_user.c b/src/p_user.c index ed9de48bf..c56c91d79 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3255,7 +3255,7 @@ static void P_DoClimbing(player_t *player) for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP)) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) continue; floorclimb = true; @@ -3296,7 +3296,7 @@ static void P_DoClimbing(player_t *player) // Is there a FOF directly below this one that we can move onto? for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next) { - if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP)) + if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) continue; if (roverbelow == rover) @@ -3341,7 +3341,7 @@ static void P_DoClimbing(player_t *player) // Is there a FOF directly below this one that we can move onto? for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next) { - if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP)) + if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) continue; if (roverbelow == rover) @@ -3398,7 +3398,7 @@ static void P_DoClimbing(player_t *player) ffloor_t *rover; for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP)) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) continue; bottomheight = P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y); @@ -3438,7 +3438,7 @@ static void P_DoClimbing(player_t *player) ffloor_t *rover; for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP)) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) continue; topheight = P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y); From cd4f755e534ade05a2080e5ddb76ece6d0af0dfa Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 13:52:35 +0100 Subject: [PATCH 6/7] Replace all instances of SF_CANBREAKWALLS and PF_CANBREAKFLOORS with SF_CANBUSTWALLS and PF_CANBUSTFLOORS, respectively. --- src/d_player.h | 4 ++-- src/dehacked.c | 4 ++-- src/p_map.c | 2 +- src/p_user.c | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 794dc5640..ae269cb53 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -51,7 +51,7 @@ typedef enum SF_NONIGHTSSUPER = 1<<15, // Disable super colors for NiGHTS (if you have SF_SUPER) SF_NOSUPERSPRITES = 1<<16, // Don't use super sprites while super SF_NOSUPERJUMPBOOST = 1<<17, // Disable the jump boost given while super (i.e. Knuckles) - SF_CANBREAKWALLS = 1<<18, // Can naturally break walls on contact? (i.e. Knuckles) + SF_CANBUSTWALLS = 1<<18, // Can naturally bust walls on contact? (i.e. Knuckles) // free up to and including 1<<31 } skinflags_t; @@ -156,7 +156,7 @@ typedef enum PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs PF_CANCARRY = 1<<29, // Can carry another player? PF_FINISHED = 1<<30, // The player finished the level. NOT the same as exiting - PF_CANBREAKFLOORS = 1<<31, // The player can break floors. + PF_CANBUSTFLOORS = 1<<31, // The player can bust floors on contact. // up to 1<<31 is free } pflags_t; diff --git a/src/dehacked.c b/src/dehacked.c index 77e7fed4a..5e422f974 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9089,7 +9089,7 @@ static const char *const PLAYERFLAG_LIST[] = { "FORCESTRAFE", // Translate turn inputs into strafe inputs "CANCARRY", // Can carry? "FINISHED", - "CANBREAKFLOORS", // Can break floors? + "CANBUSTFLOORS", // Can bust floors? NULL // stop loop here. }; @@ -9667,7 +9667,7 @@ struct { {"SF_NONIGHTSSUPER",SF_NONIGHTSSUPER}, {"SF_NOSUPERSPRITES",SF_NOSUPERSPRITES}, {"SF_NOSUPERJUMPBOOST",SF_NOSUPERJUMPBOOST}, - {"SF_CANBREAKWALLS",SF_CANBREAKWALLS}, + {"SF_CANBUSTWALLS",SF_CANBUSTWALLS}, // Dashmode constants {"DASHMODE_THRESHOLD",DASHMODE_THRESHOLD}, diff --git a/src/p_map.c b/src/p_map.c index 4732ebeeb..a055eb252 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3341,7 +3341,7 @@ static void PTR_GlideClimbTraverse(line_t *li) { for (rover = checksector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (slidemo->player->charflags & SF_CANBREAKWALLS))) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (slidemo->player->charflags & SF_CANBUSTWALLS))) continue; topheight = P_GetFFloorTopZAt (rover, slidemo->x, slidemo->y); diff --git a/src/p_user.c b/src/p_user.c index c56c91d79..c3ff223e6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2564,7 +2564,7 @@ static boolean P_PlayerCanBust(player_t *player, ffloor_t *rover) } // Strong abilities can break even FF_STRONGBUST. - if (player->charflags & SF_CANBREAKWALLS) + if (player->charflags & SF_CANBUSTWALLS) return true; if (player->pflags & PF_BOUNCING) @@ -2612,8 +2612,8 @@ static void P_CheckBustableBlocks(player_t *player) if ((netgame || multiplayer) && player->spectator) return; - // First iteration, check for floors we're touching directly (PF_CANBREAKFLOORS) - if (player->pflags & PF_CANBREAKFLOORS) + // First iteration, check for floors we're touching directly (PF_CANBUSTFLOORS) + if (player->pflags & PF_CANBUSTFLOORS) { for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { @@ -3255,7 +3255,7 @@ static void P_DoClimbing(player_t *player) for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBUSTWALLS))) continue; floorclimb = true; @@ -3296,7 +3296,7 @@ static void P_DoClimbing(player_t *player) // Is there a FOF directly below this one that we can move onto? for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next) { - if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) + if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBUSTWALLS))) continue; if (roverbelow == rover) @@ -3341,7 +3341,7 @@ static void P_DoClimbing(player_t *player) // Is there a FOF directly below this one that we can move onto? for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next) { - if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) + if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBUSTWALLS))) continue; if (roverbelow == rover) @@ -3398,7 +3398,7 @@ static void P_DoClimbing(player_t *player) ffloor_t *rover; for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBUSTWALLS))) continue; bottomheight = P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y); @@ -3438,7 +3438,7 @@ static void P_DoClimbing(player_t *player) ffloor_t *rover; for (rover = glidesector->sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBREAKWALLS))) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || ((rover->flags & FF_BUSTUP) && (player->charflags & SF_CANBUSTWALLS))) continue; topheight = P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y); From afcadb323278e0f25115011a0b4d1b901861ec4a Mon Sep 17 00:00:00 2001 From: Snu Date: Tue, 29 Sep 2020 20:16:06 +0100 Subject: [PATCH 7/7] Remove all instances of PF_CANBUSTFLOORS --- src/d_player.h | 1 - src/dehacked.c | 1 - src/p_user.c | 41 ----------------------------------------- 3 files changed, 43 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index ae269cb53..581f59766 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -156,7 +156,6 @@ typedef enum PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs PF_CANCARRY = 1<<29, // Can carry another player? PF_FINISHED = 1<<30, // The player finished the level. NOT the same as exiting - PF_CANBUSTFLOORS = 1<<31, // The player can bust floors on contact. // up to 1<<31 is free } pflags_t; diff --git a/src/dehacked.c b/src/dehacked.c index 5e422f974..37a4d03cb 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9089,7 +9089,6 @@ static const char *const PLAYERFLAG_LIST[] = { "FORCESTRAFE", // Translate turn inputs into strafe inputs "CANCARRY", // Can carry? "FINISHED", - "CANBUSTFLOORS", // Can bust floors? NULL // stop loop here. }; diff --git a/src/p_user.c b/src/p_user.c index c3ff223e6..be1f990e0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2612,47 +2612,6 @@ static void P_CheckBustableBlocks(player_t *player) if ((netgame || multiplayer) && player->spectator) return; - // First iteration, check for floors we're touching directly (PF_CANBUSTFLOORS) - if (player->pflags & PF_CANBUSTFLOORS) - { - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - ffloor_t *rover; - fixed_t topheight, bottomheight; - - if (!node->m_sector) - break; - - if (!node->m_sector->ffloors) - continue; - - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - // Make sure it's a bustable. (And that it actually exists!) - if (!(rover->flags & FF_EXISTS)) - continue; - - if (!(rover->flags & FF_BUSTUP)) - continue; - - topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL) - player->mo->momz; - bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL) - player->mo->momz; - - if (player->mo->z > topheight) - continue; - - if (player->mo->z + player->mo->height < bottomheight) - continue; - - EV_CrumbleChain(NULL, rover); // node->m_sector - - // Run a linedef executor?? - if (rover->master->flags & ML_EFFECT5) - P_LinedefExecute((INT16)(P_AproxDistance(rover->master->dx, rover->master->dy)>>FRACBITS), player->mo, node->m_sector); - } - } - } - oldx = player->mo->x; oldy = player->mo->y;