diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index b06b7bad7f43e43fe4cbb6549e289f4912561f9c..0b35ec17c54e2001af2bd8b1c62b9726087a8b2c 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 bc3368e06706ed19fa7f512af6773b01cd1bdf5d..52718cc8b851c41d7d04748c44cc7a66cb46e37d 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 c3271c10e02e2bc337b68a7f91e07059c913fc51..72775e5e6638d1ab4782fa256b64e09abcc11313 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 57ff8d4f1414ddc204cce9e52dd68be1a80c0302..753d298a4573c6a48ee7467c1f219826ffba031d 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 6fac64568bf56c7d10b283d75949948263cce677..b7afe6fb460b26036b75ef8d0216fa2f28b943b8 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 973c6ee3ce8e7180454b770616d1f8ed5d9d74ed..e6b1e4ec5ad163f31b77ed54f9f160e4d5be1002 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 7360d2ef91724594c3e50afdef94df4937f63f6b..254bcc65ef51910ebe482d0f0452e86bd976a75b 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 cd632aecabf285adc856273c8ee2c47b048baddc..c56abdbfdf79d7a34e33708267b4adea36781d5b 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