From c1ca05c6c5106fe1e240d654a6d93d9827ff2bf2 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 2 Jun 2025 15:10:16 -0400 Subject: [PATCH] Adjust some stuff to accout for how the map header toggle works --- src/am_map.c | 10 +++++----- src/blan/b_soc.h | 1 - src/blan/internal/b_soc.c | 18 ------------------ src/k_botsearch.cpp | 2 +- src/k_kart.c | 4 ++-- src/k_terrain.c | 29 ++++++++++++++++++++++++----- src/k_terrain.h | 18 ++++++++++++++++-- src/lua_baselib.c | 10 +++++++++- src/p_mobj.c | 8 ++++---- src/p_setup.c | 2 +- src/p_spec.c | 6 +++--- 11 files changed, 65 insertions(+), 43 deletions(-) diff --git a/src/am_map.c b/src/am_map.c index 24d2c42ea..484ec0ebf 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -962,8 +962,8 @@ static ffloor_t *AM_CompareFOFs(size_t i, ffloor_t *rover, ffloor_t *secondaryst terrain2 = K_GetTerrainForFlatNum(*secondaryrover->bottompic); } - if ((terrain1 && K_TerrainHasAffect(terrain1, false)) - || (terrain2 && K_TerrainHasAffect(terrain2, false))) + if ((terrain1 && K_TerrainHasAffect(terrain1, false, true)) + || (terrain2 && K_TerrainHasAffect(terrain2, false, true))) continue; break; @@ -1106,8 +1106,8 @@ static void AM_drawWalls(UINT8 pass) defercol = CDWALLCOLORS; // possible ceiling offroad boundary } - if ((terrain1 && K_TerrainHasAffect(terrain1, false)) - || (terrain2 && K_TerrainHasAffect(terrain2, false))) + if ((terrain1 && K_TerrainHasAffect(terrain1, false, true)) + || (terrain2 && K_TerrainHasAffect(terrain2, false, true))) { if (pass & PASS_INTANGIBLE) AM_drawMline(&l, defercol); // Yep, definitely a functionality boundary @@ -1290,7 +1290,7 @@ static inline void AM_drawSpecialThingsOnly(UINT8 colors) if (!terrain) terrain = K_GetTerrainForFlatNum(sectors[i].ceilingpic); - if (terrain && K_TerrainHasAffect(terrain, true)) + if (terrain && K_TerrainHasAffect(terrain, true, true)) continue; t = sectors[i].thinglist; diff --git a/src/blan/b_soc.h b/src/blan/b_soc.h index 03dc4f417..29857856c 100644 --- a/src/blan/b_soc.h +++ b/src/blan/b_soc.h @@ -18,7 +18,6 @@ extern "C" { #include "../deh_soc.h" boolean B_UseWallTransfer(void); -boolean B_UseTerrainDef(void); INT32 B_TrackComplexity(void); fixed_t K_TrackModifierMax(void); diff --git a/src/blan/internal/b_soc.c b/src/blan/internal/b_soc.c index 7adc65450..c1a813e52 100644 --- a/src/blan/internal/b_soc.c +++ b/src/blan/internal/b_soc.c @@ -30,24 +30,6 @@ boolean B_UseWallTransfer(void) return value; } -// Map header toggle for TerrainDefs. -boolean B_UseTerrainDef(void) -{ - const mapheader_t *mapheader = mapheaderinfo[gamemap - 1]; - boolean value = false; - - if (mapnamespace == MNS_RINGRACERS) - return true; - - if (mapheader->use_terrain == true) - value = true; - - if (mapheader->use_terrain == false) - value = false; - - return value; -} - // Give each map a custom track complexity INT32 B_TrackComplexity(void) { diff --git a/src/k_botsearch.cpp b/src/k_botsearch.cpp index 21233698d..211ef5110 100644 --- a/src/k_botsearch.cpp +++ b/src/k_botsearch.cpp @@ -141,7 +141,7 @@ static boolean K_BotHatesThisSectorsSpecial(player_t *player, sector_t *sec, con { terrain_t *terrain = K_GetTerrainForFlatNum(flip ? sec->ceilingpic : sec->floorpic); - if (terrain != NULL && B_UseTerrainDef()) + if (terrain != NULL && K_AffectingTerrainActive()) { if (terrain->damageType != SD_NONE) { diff --git a/src/k_kart.c b/src/k_kart.c index 03758d0e1..085e46373 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2169,7 +2169,7 @@ static void K_UpdateOffroad(player_t *player) fixed_t offroadstrength = 0; // TODO: Make this use actual special touch code. - if (terrain != NULL && terrain->offroad > 0 && B_UseTerrainDef()) + if (terrain != NULL && terrain->offroad > 0 && K_AffectingTerrainActive()) { offroadstrength = (terrain->offroad << FRACBITS); } @@ -3898,7 +3898,7 @@ fixed_t K_GetNewSpeed(player_t *player) fixed_t minspeed = 24*hscale; fixed_t maxspeed = 28*hscale; - if (player->mo->terrain && B_UseTerrainDef()) + if (player->mo->terrain && K_AffectingTerrainActive()) { minspeed = player->mo->terrain->pogoSpringMin*hscale; maxspeed = player->mo->terrain->pogoSpringMax*hscale; diff --git a/src/k_terrain.c b/src/k_terrain.c index 8e5542ad4..91837a81b 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -2,7 +2,8 @@ //----------------------------------------------------------------------------- // Copyright (C) 1998-2021 by ZDoom + GZDoom teams, and contributors // Copyright (C) 2021 by Sally "TehRealSalt" Cochenour -// Copyright (C) 2021 by Kart Krew +// Copyright (C) 2021-2024 by Kart Krew +// Copyright (C) 2025 Blankart Team // // This program is free software distributed under the // terms of the GNU General Public License, version 2. @@ -569,7 +570,7 @@ void K_ProcessTerrainEffect(mobj_t *mo) return; } - if (!B_UseTerrainDef()) + if (!K_AffectingTerrainActive()) { // Terrain has been disabled for this map. return; @@ -1650,14 +1651,14 @@ static void K_TerrainDefaults(terrain_t *terrain) } /*-------------------------------------------------- - boolean K_TerrainHasAffect(terrain_t *terrain) + boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly, boolean followmaprules) See header file for description. --------------------------------------------------*/ -boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly) +boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly, boolean followmaprules) { - if (!B_UseTerrainDef()) + if (followmaprules && !K_AffectingTerrainActive()) return false; if (terrain->friction > 0 @@ -2333,3 +2334,21 @@ void K_InitTerrain(void) K_InitTerrainPwad(wadNum); } } + +// Map header toggle for Affecting Terrain Defs. +boolean K_AffectingTerrainActive(void) +{ + const mapheader_t *mapheader = mapheaderinfo[gamemap - 1]; + boolean value = false; + + if (mapnamespace == MNS_RINGRACERS) + return true; + + if (mapheader->use_terrain == true) + value = true; + + if (mapheader->use_terrain == false) + value = false; + + return value; +} diff --git a/src/k_terrain.h b/src/k_terrain.h index 3292c5dfa..5e83ad0ca 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -595,19 +595,33 @@ boolean K_InitTerrainPwad(UINT16 wadNum); void K_InitTerrain(void); /*-------------------------------------------------- - boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly) + boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly, boolean followmaprules) Checks if Terrain block has a gameplay-affecting property. Input Arguments:- terrain - Terrain structure to compare with default. badonly - Only checks for negative properties if true + followmaprules - Checks for if map allows affecting terrain if true Return:- false if functionally default, otherwise true. --------------------------------------------------*/ -boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly); +boolean K_TerrainHasAffect(terrain_t *terrain, boolean badonly, boolean followmaprules); + +/*-------------------------------------------------- + boolean K_AffectingTerrainActive(void) + + Checks if the map allows gameplay-affecting terrain + + Input Arguments:- none + + Return:- + true if enabled by map, otherwise false. +--------------------------------------------------*/ + +boolean K_AffectingTerrainActive(void); #ifdef __cplusplus } // extern "C" diff --git a/src/lua_baselib.c b/src/lua_baselib.c index ce1dd219a..08df07cad 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4243,6 +4243,12 @@ static int lib_iGetPreciseTime(lua_State *L) return 1; } +static int lib_kAffectingTerrainActive(lua_State *L) +{ + lua_pushboolean(L, K_AffectingTerrainActive()); + return 1; +} + static int lib_kGetDefaultTerrain(lua_State *L) { LUA_PushUserdata(L, K_GetDefaultTerrain(), META_TERRAIN); @@ -4324,6 +4330,7 @@ static int lib_kTerrainHasAffect(lua_State *L) { terrain_t *terrain = *((terrain_t **)luaL_checkudata(L, 1, META_TERRAIN)); boolean badonly = lua_optboolean(L, 2); + boolean followmaprules = lua_optboolean(L, 3); NOHUD INLEVEL @@ -4331,7 +4338,7 @@ static int lib_kTerrainHasAffect(lua_State *L) if (!terrain) return LUA_ErrInvalid(L, "terrain_t"); - lua_pushboolean(L, K_TerrainHasAffect(terrain, badonly)); + lua_pushboolean(L, K_TerrainHasAffect(terrain, badonly, followmaprules)); return 1; } @@ -4653,6 +4660,7 @@ static luaL_Reg lib[] = { {"I_GetPreciseTime",lib_iGetPreciseTime}, // k_terrain + {"K_AffectingTerrainActive", lib_kAffectingTerrainActive}, {"K_GetDefaultTerrain", lib_kGetDefaultTerrain}, {"K_GetTerrainForTextureName", lib_kGetTerrainForTextureName}, {"K_GetTerrainForTextureNum", lib_kGetTerrainForTextureNum}, diff --git a/src/p_mobj.c b/src/p_mobj.c index a7e540177..f074e7dad 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3179,7 +3179,7 @@ void P_MobjCheckWater(mobj_t *mobj) } } - if (mobj->terrain != NULL && B_UseTerrainDef()) + if (mobj->terrain != NULL && K_AffectingTerrainActive()) { if (mobj->terrain->flags & TRF_LIQUID) { @@ -8345,7 +8345,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } sec2 = P_ThingOnSpecial3DFloor(mobj); - if ((B_UseTerrainDef() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) + if ((K_AffectingTerrainActive() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && (mobj->subsector->sector->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING)))) K_DoPogoSpring(mobj, 0, 1); @@ -8417,7 +8417,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } sec2 = P_ThingOnSpecial3DFloor(mobj); - if ((B_UseTerrainDef() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) + if ((K_AffectingTerrainActive() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && (mobj->subsector->sector->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING)))) K_DoPogoSpring(mobj, 0, 1); @@ -8449,7 +8449,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (grounded) { sector_t *sec2 = P_ThingOnSpecial3DFloor(mobj); - if ((B_UseTerrainDef() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) + if ((K_AffectingTerrainActive() && mobj->terrain && mobj->terrain->pogoSpring > 0) || (sec2 && (sec2->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING))) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && (mobj->subsector->sector->specialflags & (SSF_YELLOWPOGOSPRING|SSF_REDPOGOSPRING)))) K_DoPogoSpring(mobj, 0, 1); diff --git a/src/p_setup.c b/src/p_setup.c index 5fbf05c6d..2d9995a94 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3529,7 +3529,7 @@ static boolean P_CheckLineSideTripWire(line_t *ld, int p) sda = &sides[n]; terrain = K_GetTerrainForTextureNum(sda->midtexture); - terraintripwire = (B_UseTerrainDef() && terrain && (terrain->flags & TRF_TRIPWIRE)); + terraintripwire = (K_AffectingTerrainActive() && terrain && (terrain->flags & TRF_TRIPWIRE)); tripwire = terraintripwire ? terraintripwire : ld->tripwire; if (terraintripwire) diff --git a/src/p_spec.c b/src/p_spec.c index 17ef13105..10c83bb20 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5085,7 +5085,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove fixed_t sfxnum; size_t i; - if (player->mo->terrain && player->mo->terrain->speedPad > 0 && B_UseTerrainDef()) + if (player->mo->terrain && player->mo->terrain->speedPad > 0 && K_AffectingTerrainActive()) { // Don't double process Speed Pads. return; @@ -5182,7 +5182,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove static void P_ProcessPogoSpring(player_t *player, boolean isTouching, int type) { - if (player->mo->terrain && player->mo->terrain->pogoSpring > 0 && B_UseTerrainDef()) + if (player->mo->terrain && player->mo->terrain->pogoSpring > 0 && K_AffectingTerrainActive()) { // Don't double process Pogo Springs. return; @@ -5212,7 +5212,7 @@ static void P_ProcessPogoSpring(player_t *player, boolean isTouching, int type) static void P_ProcessBoostPanel(player_t *player, boolean isTouching, int type) { - if (player->mo->terrain && B_UseTerrainDef()) + if (player->mo->terrain && K_AffectingTerrainActive()) { if (player->mo->terrain->flags & TRF_SNEAKERPANEL) {