This commit is contained in:
Christoph Oelckers 2016-01-05 17:06:24 +01:00
commit 46b5900a0d
12 changed files with 134 additions and 33 deletions

View file

@ -204,6 +204,10 @@ Note: All <bool> fields default to false unless mentioned otherwise.
hidden = <bool>; // if true this sector will not be drawn on the textured automap. hidden = <bool>; // if true this sector will not be drawn on the textured automap.
waterzone = <bool>; // Sector is under water and swimmable waterzone = <bool>; // Sector is under water and swimmable
moreids = <string>; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505") moreids = <string>; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
damageamount = <int>; // Amount of damage inflicted by this sector, default = 0
damagetype = <string>; // Damage type for sector damage, Default = "None". (generic damage)
damageinterval = <int>; // Interval in tics between damage application, default = 32.
leakiness = <int>; // Probability of leaking through radiation suit (0 = never, 256 = always), default = 0.
* Note about dropactors * Note about dropactors
@ -377,6 +381,10 @@ Changed language describing the DIALOGUE lump to mention USDF as an option.
1.25 19.04.2015 1.25 19.04.2015
Added 'moreids' for linedefs and sectors. Added 'moreids' for linedefs and sectors.
1.26 05.01.2016
added clarification about character encoding
added sector damage properties.
=============================================================================== ===============================================================================
EOF EOF
=============================================================================== ===============================================================================

View file

@ -357,7 +357,7 @@ bool FCajunMaster::IsDangerous (sector_t *sec)
int special; int special;
return return
sec->damage sec->damageamount
|| sec->special & DAMAGE_MASK || sec->special & DAMAGE_MASK
|| (special = sec->special & 0xff, special == dLight_Strobe_Hurt) || (special = sec->special & 0xff, special == dLight_Strobe_Hurt)
|| special == dDamage_Hellslime || special == dDamage_Hellslime
@ -367,6 +367,7 @@ bool FCajunMaster::IsDangerous (sector_t *sec)
|| special == dDamage_LavaWimpy || special == dDamage_LavaWimpy
|| special == dDamage_LavaHefty || special == dDamage_LavaHefty
|| special == dScroll_EastLavaDamage || special == dScroll_EastLavaDamage
|| special == hDamage_Sludge
|| special == sLight_Strobe_Hurt || special == sLight_Strobe_Hurt
|| special == Damage_InstantDeath || special == Damage_InstantDeath
|| special == sDamage_SuperHellslime; || special == sDamage_SuperHellslime;

View file

@ -506,6 +506,10 @@ xx(floorplane_a)
xx(floorplane_b) xx(floorplane_b)
xx(floorplane_c) xx(floorplane_c)
xx(floorplane_d) xx(floorplane_d)
xx(damageamount)
xx(damagetype)
xx(damageinterval)
xx(leakiness)
// USDF keywords // USDF keywords
xx(Amount) xx(Amount)

View file

@ -342,7 +342,7 @@ void P_PlayerOnSpecial3DFloor(player_t* player)
} }
// Apply sector specials // Apply sector specials
if (rover->model->special || rover->model->damage) if (rover->model->special || rover->model->damageamount)
P_PlayerInSpecialSector(player, rover->model); P_PlayerInSpecialSector(player, rover->model);
// Apply flat specials (using the ceiling!) // Apply flat specials (using the ceiling!)

View file

@ -4458,6 +4458,7 @@ enum EACSFunctions
ACSF_QuakeEx, ACSF_QuakeEx,
ACSF_Warp, // 92 ACSF_Warp, // 92
ACSF_GetMaxInventory, ACSF_GetMaxInventory,
ACSF_SetSectorDamage,
/* Zandronum's - these must be skipped when we reach 99! /* Zandronum's - these must be skipped when we reach 99!
-100:ResetMap(0), -100:ResetMap(0),
@ -5950,6 +5951,23 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
} }
break; break;
case ACSF_SetSectorDamage:
if (argCount >= 2)
{
FSectorTagIterator it(args[0]);
int s;
while ((s = it.Next()) >= 0)
{
sector_t *sec = &sectors[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: default:
break; break;
} }

View file

@ -2246,7 +2246,7 @@ FUNC(LS_PointPush_SetForce)
} }
FUNC(LS_Sector_SetDamage) 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 // The sector still stores the mod in its old format because
// adding an FName to the sector_t structure might cause // adding an FName to the sector_t structure might cause
@ -2257,8 +2257,28 @@ FUNC(LS_Sector_SetDamage)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].damage = arg1; if (arg3 <= 0) // emulate old and hacky method to handle leakiness.
sectors[secnum].mod = arg2; {
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; return true;
} }

View file

@ -369,9 +369,36 @@ void P_SerializeWorld (FArchive &arc)
<< sec->heightsec << sec->heightsec
<< sec->bottommap << sec->midmap << sec->topmap << sec->bottommap << sec->midmap << sec->topmap
<< sec->gravity << sec->gravity
<< sec->damage << sec->damageamount;
<< sec->mod if (SaveVersion >= 4528)
<< sec->SoundTarget {
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->SecActTarget
<< sec->sky << sec->sky
<< sec->MoreFlags << sec->MoreFlags

View file

@ -566,24 +566,11 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector)
} }
// [RH] Apply any customizable damage // [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->damageamount, sector->damagetype);
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));
} }
} }
@ -1450,8 +1437,24 @@ void P_SpawnSpecials (void)
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(lines[i].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
sectors[s].damage = damage; sector_t *sec = &sectors[s];
sectors[s].mod = 0;//MOD_UNKNOWN; 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; break;

View file

@ -1299,6 +1299,7 @@ public:
sec->prevsec = -1; // stair retriggering until build completes sec->prevsec = -1; // stair retriggering until build completes
sec->heightsec = NULL; // sector used to get floor and ceiling height sec->heightsec = NULL; // sector used to get floor and ceiling height
sec->sectornum = index; sec->sectornum = index;
sec->damageinterval = 32;
if (floordrop) sec->Flags = SECF_FLOORDROP; if (floordrop) sec->Flags = SECF_FLOORDROP;
// killough 3/7/98: end changes // killough 3/7/98: end changes
@ -1524,6 +1525,23 @@ public:
cp[3] = CheckFloat(key); cp[3] = CheckFloat(key);
break; 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: case NAME_MoreIds:
// delay parsing of the tag string until parsing of the sector is complete // 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. // This ensures that the ID is always the first tag in the list.

View file

@ -2538,7 +2538,7 @@ void P_PlayerThink (player_t *player)
if (!(player->cheats & CF_PREDICTING)) if (!(player->cheats & CF_PREDICTING))
{ {
P_PlayerOnSpecial3DFloor (player); 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); P_PlayerInSpecialSector (player);
} }

View file

@ -710,8 +710,10 @@ struct sector_t
struct msecnode_t *touching_thinglist; // phares 3/14/98 struct msecnode_t *touching_thinglist; // phares 3/14/98
float gravity; // [RH] Sector gravity (1.0 is normal) float gravity; // [RH] Sector gravity (1.0 is normal)
short damage; // [RH] Damage to do while standing on floor FNameNoInit damagetype; // [RH] Means-of-death for applied damage
short mod; // [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 ZoneNumber; // [RH] Zone this sector belongs to
WORD MoreFlags; // [RH] Internal sector flags WORD MoreFlags; // [RH] Internal sector flags

View file

@ -76,7 +76,7 @@ const char *GetVersionString();
// Use 4500 as the base git save version, since it's higher than the // Use 4500 as the base git save version, since it's higher than the
// SVN revision ever got. // SVN revision ever got.
#define SAVEVER 4527 #define SAVEVER 4528
#define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY2(x) #x
#define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)