mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 07:12:02 +00:00
- changed Sector_SetDamage so that it can explicitly set the damage interval and the leakiness probability, instead of hardcoding it to fixed damage ranges.
- fixed: FCajunMaster::IsDangerous did not check for Heretic's sludge type.
This commit is contained in:
parent
111479063f
commit
d432df55e9
8 changed files with 82 additions and 32 deletions
|
@ -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;
|
||||
|
|
|
@ -342,7 +342,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!)
|
||||
|
|
|
@ -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].damagemod = (short)arg2;
|
||||
sectors[secnum].damageinterval = (short)arg3;
|
||||
sectors[secnum].leakydamage = (short)arg4;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -369,9 +369,33 @@ void P_SerializeWorld (FArchive &arc)
|
|||
<< sec->heightsec
|
||||
<< sec->bottommap << sec->midmap << sec->topmap
|
||||
<< sec->gravity
|
||||
<< sec->damage
|
||||
<< sec->mod
|
||||
<< sec->SoundTarget
|
||||
<< sec->damageamount
|
||||
<< sec->damagemod;
|
||||
if (SaveVersion >= 4528)
|
||||
{
|
||||
arc << sec->damageinterval
|
||||
<< sec->leakydamage;
|
||||
}
|
||||
else
|
||||
{
|
||||
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
|
||||
|
|
|
@ -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, MODtoDamageType (sector->damagemod));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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->damagemod = 0;//MOD_UNKNOWN;
|
||||
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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -710,8 +710,10 @@ struct sector_t
|
|||
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
|
||||
short damageamount; // [RH] Damage to do while standing on floor
|
||||
short damagemod; // [RH] Means-of-death for applied damage
|
||||
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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue