Merge branch 'zmaster'

This commit is contained in:
Christoph Oelckers 2016-01-05 16:49:00 +01:00
commit ea6c498470
12 changed files with 134 additions and 33 deletions

View File

@ -203,7 +203,11 @@ Note: All <bool> fields default to false unless mentioned otherwise.
// sound sequence thing in the sector will override this property.
hidden = <bool>; // if true this sector will not be drawn on the textured automap.
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
@ -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
===============================================================================

View File

@ -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;

View File

@ -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)

View File

@ -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!)

View File

@ -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 = &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:
break;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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 = &sectors[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;

View File

@ -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.

View File

@ -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);
}

View File

@ -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

View File

@ -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)