diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index e79ae196be..f20525d13c 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -203,7 +203,11 @@ Note: All fields default to false unless mentioned otherwise. // sound sequence thing in the sector will override this property. hidden = ; // if true this sector will not be drawn on the textured automap. waterzone = ; // Sector is under water and swimmable - moreids = ; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505") + moreids = ; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505") + damageamount = ; // Amount of damage inflicted by this sector, default = 0 + damagetype = ; // Damage type for sector damage, Default = "None". (generic damage) + damageinterval = ; // Interval in tics between damage application, default = 32. + leakiness = ; // Probability of leaking through radiation suit (0 = never, 256 = always), default = 0. * Note about dropactors @@ -377,6 +381,10 @@ Changed language describing the DIALOGUE lump to mention USDF as an option. 1.25 19.04.2015 Added 'moreids' for linedefs and sectors. +1.26 05.01.2016 +added clarification about character encoding +added sector damage properties. + =============================================================================== EOF =============================================================================== diff --git a/src/b_move.cpp b/src/b_move.cpp index fd04054577..2a76f19259 100644 --- a/src/b_move.cpp +++ b/src/b_move.cpp @@ -357,7 +357,7 @@ bool FCajunMaster::IsDangerous (sector_t *sec) int special; return - sec->damage + sec->damageamount || sec->special & DAMAGE_MASK || (special = sec->special & 0xff, special == dLight_Strobe_Hurt) || special == dDamage_Hellslime @@ -367,6 +367,7 @@ bool FCajunMaster::IsDangerous (sector_t *sec) || special == dDamage_LavaWimpy || special == dDamage_LavaHefty || special == dScroll_EastLavaDamage + || special == hDamage_Sludge || special == sLight_Strobe_Hurt || special == Damage_InstantDeath || special == sDamage_SuperHellslime; diff --git a/src/namedef.h b/src/namedef.h index f9d436f287..cad58bfa38 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -506,6 +506,10 @@ xx(floorplane_a) xx(floorplane_b) xx(floorplane_c) xx(floorplane_d) +xx(damageamount) +xx(damagetype) +xx(damageinterval) +xx(leakiness) // USDF keywords xx(Amount) diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index d5ef77709e..0835b83d04 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -345,7 +345,7 @@ void P_PlayerOnSpecial3DFloor(player_t* player) } // Apply sector specials - if (rover->model->special || rover->model->damage) + if (rover->model->special || rover->model->damageamount) P_PlayerInSpecialSector(player, rover->model); // Apply flat specials (using the ceiling!) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 663d316dcb..aacd5cc4a5 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4458,6 +4458,7 @@ enum EACSFunctions ACSF_QuakeEx, ACSF_Warp, // 92 ACSF_GetMaxInventory, + ACSF_SetSectorDamage, /* Zandronum's - these must be skipped when we reach 99! -100:ResetMap(0), @@ -5950,6 +5951,23 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } break; + case ACSF_SetSectorDamage: + if (argCount >= 2) + { + FSectorTagIterator it(args[0]); + int s; + while ((s = it.Next()) >= 0) + { + sector_t *sec = §ors[s]; + + sec->damageamount = args[1]; + sec->damagetype = argCount >= 3 ? FName(FBehavior::StaticLookupString(args[2])) : FName(NAME_None); + sec->damageinterval = argCount >= 4 ? clamp(args[3], 1, INT_MAX) : 32; + sec->leakydamage = argCount >= 5 ? args[4] : 0; + } + } + break; + default: break; } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 9b38e149b7..8fa8691b2e 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2246,7 +2246,7 @@ FUNC(LS_PointPush_SetForce) } FUNC(LS_Sector_SetDamage) -// Sector_SetDamage (tag, amount, mod) +// Sector_SetDamage (tag, amount, mod, interval, leaky) { // The sector still stores the mod in its old format because // adding an FName to the sector_t structure might cause @@ -2257,8 +2257,28 @@ FUNC(LS_Sector_SetDamage) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].damage = arg1; - sectors[secnum].mod = arg2; + if (arg3 <= 0) // emulate old and hacky method to handle leakiness. + { + if (arg1 < 20) + { + arg4 = 0; + arg3 = 32; + } + else if (arg1 < 50) + { + arg4 = 5; + arg3 = 32; + } + else + { + arg4 = 256; + arg3 = 1; + } + } + sectors[secnum].damageamount = (short)arg1; + sectors[secnum].damagetype = MODtoDamageType(arg2); + sectors[secnum].damageinterval = (short)arg3; + sectors[secnum].leakydamage = (short)arg4; } return true; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 3203c84bcc..cce594ead5 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -354,7 +354,7 @@ void P_SerializeWorld (FArchive &arc) short tag; arc << tag; } - arc << sec->soundtraversed + arc << sec->soundtraversed << sec->seqType << sec->friction << sec->movefactor @@ -369,9 +369,36 @@ void P_SerializeWorld (FArchive &arc) << sec->heightsec << sec->bottommap << sec->midmap << sec->topmap << sec->gravity - << sec->damage - << sec->mod - << sec->SoundTarget + << sec->damageamount; + if (SaveVersion >= 4528) + { + arc << sec->damageinterval + << sec->leakydamage + << sec->damagetype; + } + else + { + short damagemod; + arc << damagemod; + sec->damagetype = MODtoDamageType(damagemod); + if (sec->damageamount < 20) + { + sec->leakydamage = 0; + sec->damageinterval = 32; + } + else if (sec->damageamount < 50) + { + sec->leakydamage = 5; + sec->damageinterval = 32; + } + else + { + sec->leakydamage = 256; + sec->damageinterval = 1; + } + } + + arc << sec->SoundTarget << sec->SecActTarget << sec->sky << sec->MoreFlags diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 95995bdab0..c439ac50ea 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -566,24 +566,11 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) } // [RH] Apply any customizable damage - if (sector->damage) + if (sector->damageamount != 0) { - if (sector->damage < 20) + if (level.time % sector->damageinterval == 0 && (ironfeet == NULL || pr_playerinspecialsector() < sector->leakydamage)) { - if (ironfeet == NULL && !(level.time&0x1f)) - P_DamageMobj (player->mo, NULL, NULL, sector->damage, MODtoDamageType (sector->mod)); - } - else if (sector->damage < 50) - { - if ((ironfeet == NULL || (pr_playerinspecialsector()<5)) - && !(level.time&0x1f)) - { - P_DamageMobj (player->mo, NULL, NULL, sector->damage, MODtoDamageType (sector->mod)); - } - } - else - { - P_DamageMobj (player->mo, NULL, NULL, sector->damage, MODtoDamageType (sector->mod)); + P_DamageMobj (player->mo, NULL, NULL, sector->damageamount, sector->damagetype); } } @@ -1450,8 +1437,24 @@ void P_SpawnSpecials (void) FSectorTagIterator itr(lines[i].args[0]); while ((s = itr.Next()) >= 0) { - sectors[s].damage = damage; - sectors[s].mod = 0;//MOD_UNKNOWN; + sector_t *sec = §ors[s]; + sec->damageamount = damage; + sec->damagetype = NAME_None; + if (sec->damageamount < 20) + { + sec->leakydamage = 0; + sec->damageinterval = 32; + } + else if (sec->damageamount < 50) + { + sec->leakydamage = 5; + sec->damageinterval = 32; + } + else + { + sec->leakydamage = 256; + sec->damageinterval = 1; + } } } break; diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index db0c952cf3..2169da49fa 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -1299,6 +1299,7 @@ public: sec->prevsec = -1; // stair retriggering until build completes sec->heightsec = NULL; // sector used to get floor and ceiling height sec->sectornum = index; + sec->damageinterval = 32; if (floordrop) sec->Flags = SECF_FLOORDROP; // killough 3/7/98: end changes @@ -1524,6 +1525,23 @@ public: cp[3] = CheckFloat(key); break; + case NAME_damageamount: + sec->damageamount = CheckInt(key); + break; + + case NAME_damagetype: + sec->damagetype = CheckString(key); + break; + + case NAME_damageinterval: + sec->damageinterval = CheckInt(key); + if (sec->damageinterval < 1) sec->damageinterval = 1; + break; + + case NAME_leakiness: + sec->leakydamage = CheckInt(key); + break; + case NAME_MoreIds: // delay parsing of the tag string until parsing of the sector is complete // This ensures that the ID is always the first tag in the list. diff --git a/src/p_user.cpp b/src/p_user.cpp index 1eb8381763..8f8a93fdb2 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -2538,7 +2538,7 @@ void P_PlayerThink (player_t *player) if (!(player->cheats & CF_PREDICTING)) { P_PlayerOnSpecial3DFloor (player); - if (player->mo->Sector->special || player->mo->Sector->damage) + if (player->mo->Sector->special || player->mo->Sector->damageamount != 0) { P_PlayerInSpecialSector (player); } diff --git a/src/r_defs.h b/src/r_defs.h index cce88a28b7..385cb34786 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -762,9 +762,11 @@ struct sector_t // thinglist is a subset of touching_thinglist struct msecnode_t *touching_thinglist; // phares 3/14/98 - float gravity; // [RH] Sector gravity (1.0 is normal) - short damage; // [RH] Damage to do while standing on floor - short mod; // [RH] Means-of-death for applied damage + float gravity; // [RH] Sector gravity (1.0 is normal) + FNameNoInit damagetype; // [RH] Means-of-death for applied damage + short damageamount; // [RH] Damage to do while standing on floor + short damageinterval; // Interval for damage application + short leakydamage; // chance of leaking through radiation suit WORD ZoneNumber; // [RH] Zone this sector belongs to WORD MoreFlags; // [RH] Internal sector flags diff --git a/src/version.h b/src/version.h index 31452b55d3..638c3a5654 100644 --- a/src/version.h +++ b/src/version.h @@ -76,7 +76,7 @@ const char *GetVersionString(); // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4527 +#define SAVEVER 4528 #define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)