diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 4139fa967a3fa59ec5cb9dcebaa3e8a18a55f67a..36518be9f52b3eb9b0673885f86a605ed700586f 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -79,6 +79,7 @@ sectorflags triggerspecial_touch = "Trigger on Edge Touch"; triggerspecial_headbump = "Trigger on Headbump"; invertprecip = "Invert Precipitation"; + gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; } diff --git a/src/deh_lua.c b/src/deh_lua.c index 28030052a86eacdda0a1c89a78b8cb9eade97a48..e360febaf2269c36f8cd736e3f86e5a347faf5db 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L) } else if (fastncmp("MSF_", word, 3)) { p = word + 4; - for (i = 0; i < 5; i++) + for (i = 0; i < 6; i++) if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) { lua_pushinteger(L, ((lua_Integer)1 << i)); return 1; diff --git a/src/deh_tables.c b/src/deh_tables.c index b6a9e02254ff422c5b457dd5f372e2cb34cb3279..095aae0f266104de92bc2bbe5bd2ff1381ba30f0 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4472,11 +4472,12 @@ const char *const ML_LIST[16] = { }; // Sector flags -const char *const MSF_LIST[5] = { +const char *const MSF_LIST[6] = { "FLIPSPECIAL_FLOOR", "FLIPSPECIAL_CEILING", "TRIGGERSPECIAL_TOUCH", "TRIGGERSPECIAL_HEADBUMP", + "GRAVITYFLIP", "HEATWAVE", }; diff --git a/src/deh_tables.h b/src/deh_tables.h index 982c6ff4a3dccb4985b0bef5ba80714aab73c34b..2e514a5b15c624f224d01ab8cf3a3c172cb20ecf 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4]; extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags -extern const char* const MSF_LIST[5]; // Sector flags +extern const char* const MSF_LIST[6]; // Sector flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 0a147acbb3560816adfbf7e97192dc8e871c270a..74f45535f8b0730eee8208329894ce15a6c264ca 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -753,6 +753,7 @@ static int sector_set(lua_State *L) return LUA_ErrSetDirectly(L, "sector_t", "taglist"); case sector_flags: sector->flags = luaL_checkinteger(L, 3); + CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); break; case sector_gravity: sector->gravity = luaL_checkfixed(L, 3); diff --git a/src/p_mobj.c b/src/p_mobj.c index aea7964beffb3c4751d475bc84d7caf9842ea874..bdfee2616a1d1024a50297bfe010a661ec3d7a57 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1463,7 +1463,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) gravityadd = -FixedMul(gravity, gravfactor); - if (rover->master->frontsector->verticalflip && gravityadd > 0) + if ((rover->master->frontsector->flags & MSF_GRAVITYFLIP) && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; no3dfloorgrav = false; @@ -1475,7 +1475,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) { gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(mo->subsector->sector)); - if (mo->subsector->sector->verticalflip && gravityadd > 0) + if ((mo->subsector->sector->flags & MSF_GRAVITYFLIP) && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; } diff --git a/src/p_saveg.c b/src/p_saveg.c index 66df83603b3646ca6976d8f3088b1ef6ba936ff5..d7a9750b774623719493c2a5dcd8ba4ee8505bbc 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1213,7 +1213,10 @@ static void UnArchiveSectors(void) sectors[i].ceilinglightabsolute = READUINT8(save_p); } if (diff3 & SD_FLAG) + { sectors[i].flags = READUINT32(save_p); + CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP); + } if (diff3 & SD_GRAVITY) sectors[i].gravity = READFIXED(save_p); diff --git a/src/p_setup.c b/src/p_setup.c index 2bcde2b92f921c5e9fc3320474c5df69e67823d5..70c6276d0afb1f654f71eee77c1fff80ac39fe24 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1000,7 +1000,6 @@ static void P_InitializeSector(sector_t *ss) ss->extra_colormap = NULL; ss->gravityptr = NULL; - ss->verticalflip = false; ss->cullheight = NULL; @@ -1674,6 +1673,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; else if (fastcmp(param, "invertprecip") && fastcmp("true", val)) sectors[i].flags |= MSF_INVERTPRECIP; + else if (fastcmp(param, "gravityflip") && fastcmp("true", val)) + sectors[i].flags |= MSF_GRAVITYFLIP; else if (fastcmp(param, "heatwave") && fastcmp("true", val)) sectors[i].flags |= MSF_HEATWAVE; else if (fastcmp(param, "friction")) diff --git a/src/p_spec.c b/src/p_spec.c index 846ce937690003dea80f3f0dfcd1bc8c57dc48dd..6049214455a7d6612ab41f41d17c2afe8abe5c02 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5994,6 +5994,8 @@ void P_SpawnSpecials(boolean fromnetsave) sector = sectors; for (i = 0; i < numsectors; i++, sector++) { + CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); + if (!sector->special) continue; @@ -6116,11 +6118,11 @@ void P_SpawnSpecials(boolean fromnetsave) sectors[s].gravityptr = §ors[sec].floorheight; // This allows it to change in realtime! if (lines[i].flags & ML_NOCLIMB) - sectors[s].verticalflip = true; + sectors[s].flags |= MSF_GRAVITYFLIP; else - sectors[s].verticalflip = false; + sectors[s].flags &= ~MSF_GRAVITYFLIP; - CheckForReverseGravity = sectors[s].verticalflip; + CheckForReverseGravity |= (sectors[s].flags & MSF_GRAVITYFLIP); } break; diff --git a/src/r_defs.h b/src/r_defs.h index 0fd13b70773aa5d653a6a2f3969813f9aab456bd..c565473dd0fee089809c34e1715ea95358c81b1a 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -284,7 +284,8 @@ typedef enum MSF_TRIGGERSPECIAL_HEADBUMP = 1<<3, // invertprecip - inverts presence of precipitation MSF_INVERTPRECIP = 1<<4, - MSF_HEATWAVE = 1<<5, // heat wave effect + MSF_GRAVITYFLIP = 1<<5, + MSF_HEATWAVE = 1<<6, } sectorflags_t; @@ -368,7 +369,6 @@ typedef struct sector_s fixed_t gravity; // per-sector gravity factor fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector - boolean verticalflip; // If gravity < 0, then allow flipped physics sectorflags_t flags; INT32 friction;