From 2b4d32b37274d7caf4bcc3235205bf582757436f Mon Sep 17 00:00:00 2001 From: MascaraSnake <jonassauer27@gmail.com> Date: Fri, 31 Dec 2021 12:15:01 +0100 Subject: [PATCH] Turn solid lava into a damagetype --- extras/conf/udb/Includes/SRB222_common.cfg | 2 +- src/deh_tables.c | 1 + src/p_map.c | 5 +---- src/p_mobj.c | 16 ++++++-------- src/p_setup.c | 25 +++++++++++++++++++++- src/p_spec.c | 1 + src/p_user.c | 5 ++++- src/r_defs.h | 13 +++++------ 8 files changed, 46 insertions(+), 22 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index b06b7bad7..0b35ec17c 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -246,7 +246,7 @@ mapformat_udmf include("SRB222_misc.cfg", "sectorbrightness"); } - damagetypes = "Generic Water Fire Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; + damagetypes = "Generic Water Fire Lava Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; // LINEDEF FLAGS linedefflags diff --git a/src/deh_tables.c b/src/deh_tables.c index bc3368e06..52718cc8b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4515,6 +4515,7 @@ const char *const SD_LIST[] = { "GENERIC", "WATER", "FIRE", + "LAVA", "ELECTRIC", "SPIKE", "DEATHPITTILT", diff --git a/src/p_map.c b/src/p_map.c index c3271c10e..72775e5e6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3594,10 +3594,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec) if (!(rover->flags & FF_SWIMMABLE)) continue; - if (rover->master->frontsector->damagetype != SD_FIRE) - continue; - - if (rover->master->flags & ML_BLOCKMONSTERS) + if (rover->master->frontsector->damagetype != SD_LAVA) continue; topheight = P_GetFFloorTopZAt(rover, mo->x, mo->y); diff --git a/src/p_mobj.c b/src/p_mobj.c index 57ff8d4f1..753d298a4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2334,11 +2334,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) boolean P_CheckSolidLava(ffloor_t *rover) { - if (rover->flags & FF_SWIMMABLE && rover->master->frontsector->damagetype == SD_FIRE - && !(rover->master->flags & ML_BLOCKMONSTERS)) - return true; - - return false; + return (rover->flags & FF_SWIMMABLE) && (rover->master->frontsector->damagetype == SD_LAVA); } // @@ -3305,7 +3301,7 @@ void P_MobjCheckWater(mobj_t *mobj) if (mobj->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER)) { - if (rover->master->frontsector->damagetype == SD_FIRE) + if (rover->master->frontsector->damagetype == SD_FIRE || rover->master->frontsector->damagetype == SD_LAVA) mobj->eflags |= MFE_TOUCHLAVA; if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY)) @@ -4096,9 +4092,11 @@ static void P_KillRingsInLava(mobj_t *mo) { if (!(rover->flags & FF_EXISTS)) continue; // fof must be real - if (!(rover->flags & FF_SWIMMABLE // fof must be water - && rover->master->frontsector->damagetype == SD_FIRE)) // fof must be lava water - continue; + if (!(rover->flags & FF_SWIMMABLE)) + continue; // fof must be water + + if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA) + continue; // fof must have fire or lava damage // find heights of FOF topheight = P_GetFOFTopZ(mo, node->m_sector, rover, mo->x, mo->y, NULL); diff --git a/src/p_setup.c b/src/p_setup.c index 6fac64568..b7afe6fb4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1735,6 +1735,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].damagetype = SD_WATER; if (fastcmp(val, "Fire")) sectors[i].damagetype = SD_FIRE; + if (fastcmp(val, "Lava")) + sectors[i].damagetype = SD_LAVA; if (fastcmp(val, "Electric")) sectors[i].damagetype = SD_ELECTRIC; if (fastcmp(val, "Spike")) @@ -5105,8 +5107,29 @@ static void P_ConvertBinaryMap(void) sectors[i].damagetype = SD_WATER; break; case 3: //Damage (Fire) - sectors[i].damagetype = SD_FIRE; + { + size_t j; + boolean isLava = false; + + for (j = 0; j < sectors[i].linecount; j++) + { + line_t *line = sectors[i].lines[j]; + + if (line->frontsector != §ors[i]) + continue; + + if (line->flags & ML_BLOCKMONSTERS) + continue; + + if (line->special == 120 || (line->special == 259 && (line->args[2] & FF_SWIMMABLE))) + { + isLava = true; + break; + } + } + sectors[i].damagetype = isLava ? SD_LAVA : SD_FIRE; break; + } case 4: //Damage (Electric) sectors[i].damagetype = SD_ELECTRIC; break; diff --git a/src/p_spec.c b/src/p_spec.c index 973c6ee3c..e6b1e4ec5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5010,6 +5010,7 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); break; case SD_FIRE: + case SD_LAVA: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); break; diff --git a/src/p_user.c b/src/p_user.c index 7360d2ef9..254bcc65e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -12230,7 +12230,10 @@ static boolean P_MobjAboveLava(mobj_t *mobj) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->master->frontsector->damagetype != SD_FIRE) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE)) + continue; + + if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA) continue; if (mobj->eflags & MFE_VERTICALFLIP) diff --git a/src/r_defs.h b/src/r_defs.h index cd632aeca..c56abdbfd 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -321,12 +321,13 @@ typedef enum SD_GENERIC = 1, SD_WATER = 2, SD_FIRE = 3, - SD_ELECTRIC = 4, - SD_SPIKE = 5, - SD_DEATHPITTILT = 6, - SD_DEATHPITNOTILT = 7, - SD_INSTAKILL = 8, - SD_SPECIALSTAGE = 9, + SD_LAVA = 4, + SD_ELECTRIC = 5, + SD_SPIKE = 6, + SD_DEATHPITTILT = 7, + SD_DEATHPITNOTILT = 8, + SD_INSTAKILL = 9, + SD_SPECIALSTAGE = 10, } sectordamage_t; typedef enum -- GitLab