mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-28 06:53:40 +00:00
- Fixed: P_CheckSwitchRange accessed invalid memory when testing a one-sided
line. - Fixed: P_SpawnPuff assumed that all melee attacks have the same range (MELEERANGE) and didn't set the puff to its melee state if the range was different. Even worse, it checked a global variable for this so the behavior was undefined when P_SpawnPuff was called from anywhere else but P_LineAttack. To reduce the amount of parameters I combined this information with the hitthing and temporary parameters into one flags parameter. Also changed P_LineAttack so that it gets passed an additional parameter that specifies whether the attack is a melee attack or not and set this to true in all calls that are to be considered melee attacks. I couldn't use the damage type because A_CustomPunch and A_CustomMeleeAttack allow passing any damage type they want. - Added a sprite option as an alternative of particles for FX_ROCKET and FX_GRENADE. SVN r879 (trunk)
This commit is contained in:
parent
de485ec662
commit
cb1bd7739e
29 changed files with 194 additions and 83 deletions
|
@ -1,3 +1,20 @@
|
||||||
|
April 4, 2008 (Changes by Graf Zahl)
|
||||||
|
- Fixed: P_CheckSwitchRange accessed invalid memory when testing a one-sided
|
||||||
|
line.
|
||||||
|
- Fixed: P_SpawnPuff assumed that all melee attacks have the same range
|
||||||
|
(MELEERANGE) and didn't set the puff to its melee state if the range
|
||||||
|
was different. Even worse, it checked a global variable for this so
|
||||||
|
the behavior was undefined when P_SpawnPuff was called from anywhere
|
||||||
|
else but P_LineAttack. To reduce the amount of parameters I combined
|
||||||
|
this information with the hitthing and temporary parameters into one
|
||||||
|
flags parameter. Also changed P_LineAttack so that it gets passed
|
||||||
|
an additional parameter that specifies whether the attack is a melee
|
||||||
|
attack or not and set this to true in all calls that are to be considered
|
||||||
|
melee attacks. I couldn't use the damage type because A_CustomPunch
|
||||||
|
and A_CustomMeleeAttack allow passing any damage type they want.
|
||||||
|
- Added a sprite option as an alternative of particles for FX_ROCKET
|
||||||
|
and FX_GRENADE.
|
||||||
|
|
||||||
April 3, 2008
|
April 3, 2008
|
||||||
- Changed the Makefiles that are used by both Linux and MinGW so that msys
|
- Changed the Makefiles that are used by both Linux and MinGW so that msys
|
||||||
detection occurs only if $OS is Windows_NT. Otherwise, spurious nul files
|
detection occurs only if $OS is Windows_NT. Otherwise, spurious nul files
|
||||||
|
|
|
@ -701,6 +701,7 @@ public:
|
||||||
//Added by MC:
|
//Added by MC:
|
||||||
SDWORD id; // Player ID (for items, # in list.)
|
SDWORD id; // Player ID (for items, # in list.)
|
||||||
|
|
||||||
|
BYTE smokecounter;
|
||||||
BYTE FloatBobPhase;
|
BYTE FloatBobPhase;
|
||||||
BYTE FriendPlayer; // [RH] Player # + 1 this friendly monster works for (so 0 is no player, 1 is player 0, etc)
|
BYTE FriendPlayer; // [RH] Player # + 1 this friendly monster works for (so 0 is no player, 1 is player 0, etc)
|
||||||
DWORD Translation;
|
DWORD Translation;
|
||||||
|
|
|
@ -123,7 +123,6 @@ CVAR (Bool, am_showitems, false, CVAR_ARCHIVE);
|
||||||
CVAR (Bool, am_showtime, true, CVAR_ARCHIVE);
|
CVAR (Bool, am_showtime, true, CVAR_ARCHIVE);
|
||||||
CVAR (Bool, am_showtotaltime, false, CVAR_ARCHIVE);
|
CVAR (Bool, am_showtotaltime, false, CVAR_ARCHIVE);
|
||||||
CVAR (Bool, am_usecustomcolors, true, CVAR_ARCHIVE);
|
CVAR (Bool, am_usecustomcolors, true, CVAR_ARCHIVE);
|
||||||
CVAR (Float, am_ovtrans, 1.f, CVAR_ARCHIVE);
|
|
||||||
CVAR (Color, am_backcolor, 0x6c5440, CVAR_ARCHIVE);
|
CVAR (Color, am_backcolor, 0x6c5440, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_yourcolor, 0xfce8d8, CVAR_ARCHIVE);
|
CVAR (Color, am_yourcolor, 0xfce8d8, CVAR_ARCHIVE);
|
||||||
CVAR (Color, am_wallcolor, 0x2c1808, CVAR_ARCHIVE);
|
CVAR (Color, am_wallcolor, 0x2c1808, CVAR_ARCHIVE);
|
||||||
|
|
|
@ -48,7 +48,7 @@ void A_Punch (AActor *actor)
|
||||||
|
|
||||||
angle += pr_punch.Random2() << 18;
|
angle += pr_punch.Random2() << 18;
|
||||||
pitch = P_AimLineAttack (actor, angle, MELEERANGE);
|
pitch = P_AimLineAttack (actor, angle, MELEERANGE);
|
||||||
P_LineAttack (actor, angle, MELEERANGE, pitch, damage, NAME_None, NAME_BulletPuff);
|
P_LineAttack (actor, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, true);
|
||||||
|
|
||||||
// turn to face target
|
// turn to face target
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
|
|
|
@ -456,7 +456,7 @@ void A_M_Punch (AActor *self)
|
||||||
A_FaceTarget (self);
|
A_FaceTarget (self);
|
||||||
angle = self->angle + (pr_m_punch.Random2() << 18);
|
angle = self->angle + (pr_m_punch.Random2() << 18);
|
||||||
pitch = P_AimLineAttack (self, angle, MELEERANGE);
|
pitch = P_AimLineAttack (self, angle, MELEERANGE);
|
||||||
P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff);
|
P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, true);
|
||||||
|
|
||||||
// turn to face target
|
// turn to face target
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
|
@ -486,7 +486,7 @@ void A_M_BerserkPunch (AActor *self)
|
||||||
A_FaceTarget (self);
|
A_FaceTarget (self);
|
||||||
angle = self->angle + (pr_m_punch.Random2() << 18);
|
angle = self->angle + (pr_m_punch.Random2() << 18);
|
||||||
pitch = P_AimLineAttack (self, angle, MELEERANGE);
|
pitch = P_AimLineAttack (self, angle, MELEERANGE);
|
||||||
P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff);
|
P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, true);
|
||||||
|
|
||||||
// turn to face target
|
// turn to face target
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
|
|
|
@ -412,7 +412,7 @@ void A_BeakAttackPL1 (AActor *actor)
|
||||||
damage = 1 + (pr_beakatkpl1()&3);
|
damage = 1 + (pr_beakatkpl1()&3);
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff));
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff), true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
||||||
|
@ -444,7 +444,7 @@ void A_BeakAttackPL2 (AActor *actor)
|
||||||
damage = pr_beakatkpl2.HitDice (4);
|
damage = pr_beakatkpl2.HitDice (4);
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff));
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff), true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
||||||
|
|
|
@ -217,7 +217,7 @@ void A_StaffAttackPL1 (AActor *actor)
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
angle += pr_sap.Random2() << 18;
|
angle += pr_sap.Random2() << 18;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AStaffPuff));
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AStaffPuff), true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
//S_StartSound(player->mo, sfx_stfhit);
|
//S_StartSound(player->mo, sfx_stfhit);
|
||||||
|
@ -256,7 +256,7 @@ void A_StaffAttackPL2 (AActor *actor)
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
angle += pr_sap2.Random2() << 18;
|
angle += pr_sap2.Random2() << 18;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AStaffPuff2));
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AStaffPuff2), true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
//S_StartSound(player->mo, sfx_stfpow);
|
//S_StartSound(player->mo, sfx_stfpow);
|
||||||
|
|
|
@ -94,7 +94,7 @@ void A_CMaceAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff), true);
|
||||||
AdjustPlayerAngle (player->mo);
|
AdjustPlayerAngle (player->mo);
|
||||||
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
||||||
// player->mo->y, linetarget->x, linetarget->y);
|
// player->mo->y, linetarget->x, linetarget->y);
|
||||||
|
@ -104,7 +104,7 @@ void A_CMaceAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff), true);
|
||||||
AdjustPlayerAngle (player->mo);
|
AdjustPlayerAngle (player->mo);
|
||||||
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
||||||
// player->mo->y, linetarget->x, linetarget->y);
|
// player->mo->y, linetarget->x, linetarget->y);
|
||||||
|
|
|
@ -352,7 +352,7 @@ void A_FAxeAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack (pmo, angle, AXERANGE);
|
slope = P_AimLineAttack (pmo, angle, AXERANGE);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
||||||
{
|
{
|
||||||
P_ThrustMobj (linetarget, angle, power);
|
P_ThrustMobj (linetarget, angle, power);
|
||||||
|
@ -365,7 +365,7 @@ void A_FAxeAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack (pmo, angle, AXERANGE);
|
slope = P_AimLineAttack (pmo, angle, AXERANGE);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER)
|
if (linetarget->flags3&MF3_ISMONSTER)
|
||||||
{
|
{
|
||||||
P_ThrustMobj (linetarget, angle, power);
|
P_ThrustMobj (linetarget, angle, power);
|
||||||
|
@ -380,7 +380,7 @@ void A_FAxeAttack (AActor *actor)
|
||||||
|
|
||||||
angle = pmo->angle;
|
angle = pmo->angle;
|
||||||
slope = P_AimLineAttack (pmo, angle, MELEERANGE);
|
slope = P_AimLineAttack (pmo, angle, MELEERANGE);
|
||||||
P_LineAttack (pmo, angle, MELEERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, MELEERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
|
|
||||||
axedone:
|
axedone:
|
||||||
if (useMana == 2)
|
if (useMana == 2)
|
||||||
|
|
|
@ -194,7 +194,7 @@ void A_FHammerAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE);
|
slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff), true);
|
||||||
AdjustPlayerAngle(pmo);
|
AdjustPlayerAngle(pmo);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
||||||
{
|
{
|
||||||
|
@ -207,7 +207,7 @@ void A_FHammerAttack (AActor *actor)
|
||||||
slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE);
|
slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE);
|
||||||
if(linetarget)
|
if(linetarget)
|
||||||
{
|
{
|
||||||
P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff), true);
|
||||||
AdjustPlayerAngle(pmo);
|
AdjustPlayerAngle(pmo);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
||||||
{
|
{
|
||||||
|
@ -220,7 +220,7 @@ void A_FHammerAttack (AActor *actor)
|
||||||
// didn't find any targets in meleerange, so set to throw out a hammer
|
// didn't find any targets in meleerange, so set to throw out a hammer
|
||||||
angle = pmo->angle;
|
angle = pmo->angle;
|
||||||
slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE);
|
slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE);
|
||||||
if (P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff)) != NULL)
|
if (P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff), true) != NULL)
|
||||||
{
|
{
|
||||||
pmo->special1 = false;
|
pmo->special1 = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,7 +258,7 @@ void A_FPunchAttack (AActor *actor)
|
||||||
power = 6*FRACUNIT;
|
power = 6*FRACUNIT;
|
||||||
pufftype = RUNTIME_CLASS(AHammerPuff);
|
pufftype = RUNTIME_CLASS(AHammerPuff);
|
||||||
}
|
}
|
||||||
P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
||||||
{
|
{
|
||||||
P_ThrustMobj (linetarget, angle, power);
|
P_ThrustMobj (linetarget, angle, power);
|
||||||
|
@ -277,7 +277,7 @@ void A_FPunchAttack (AActor *actor)
|
||||||
power = 6*FRACUNIT;
|
power = 6*FRACUNIT;
|
||||||
pufftype = RUNTIME_CLASS(AHammerPuff);
|
pufftype = RUNTIME_CLASS(AHammerPuff);
|
||||||
}
|
}
|
||||||
P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
if (linetarget->flags3&MF3_ISMONSTER || linetarget->player)
|
||||||
{
|
{
|
||||||
P_ThrustMobj (linetarget, angle, power);
|
P_ThrustMobj (linetarget, angle, power);
|
||||||
|
@ -291,7 +291,7 @@ void A_FPunchAttack (AActor *actor)
|
||||||
|
|
||||||
angle = pmo->angle;
|
angle = pmo->angle;
|
||||||
slope = P_AimLineAttack (pmo, angle, MELEERANGE);
|
slope = P_AimLineAttack (pmo, angle, MELEERANGE);
|
||||||
P_LineAttack (pmo, angle, MELEERANGE, slope, damage, NAME_Melee, pufftype);
|
P_LineAttack (pmo, angle, MELEERANGE, slope, damage, NAME_Melee, pufftype, true);
|
||||||
|
|
||||||
punchdone:
|
punchdone:
|
||||||
if (pmo->special1 == 3)
|
if (pmo->special1 == 3)
|
||||||
|
|
|
@ -269,7 +269,7 @@ void A_SnoutAttack (AActor *actor)
|
||||||
damage = 3+(pr_snoutattack()&3);
|
damage = 3+(pr_snoutattack()&3);
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
slope = P_AimLineAttack(player->mo, angle, MELEERANGE);
|
slope = P_AimLineAttack(player->mo, angle, MELEERANGE);
|
||||||
puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ASnoutPuff));
|
puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ASnoutPuff), true);
|
||||||
S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM);
|
S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM);
|
||||||
if(linetarget)
|
if(linetarget)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2304,9 +2304,7 @@ void G_FinishTravel ()
|
||||||
|
|
||||||
// The player being spawned here is a short lived dummy and
|
// The player being spawned here is a short lived dummy and
|
||||||
// must not start any ENTER script or big problems will happen.
|
// must not start any ENTER script or big problems will happen.
|
||||||
P_SpawnPlayer (&playerstarts[pawn->player - players], true);
|
pawndup = P_SpawnPlayer (&playerstarts[pawn->player - players], true);
|
||||||
|
|
||||||
pawndup = pawn->player->mo;
|
|
||||||
if (!startkeepfacing)
|
if (!startkeepfacing)
|
||||||
{
|
{
|
||||||
pawn->angle = pawndup->angle;
|
pawn->angle = pawndup->angle;
|
||||||
|
|
|
@ -210,7 +210,7 @@ void A_JabDagger (AActor *actor)
|
||||||
|
|
||||||
angle = actor->angle + (pr_jabdagger.Random2() << 18);
|
angle = actor->angle + (pr_jabdagger.Random2() << 18);
|
||||||
pitch = P_AimLineAttack (actor, angle, 80*FRACUNIT);
|
pitch = P_AimLineAttack (actor, angle, 80*FRACUNIT);
|
||||||
P_LineAttack (actor, angle, 80*FRACUNIT, pitch, damage, NAME_Melee, RUNTIME_CLASS(AStrifeSpark));
|
P_LineAttack (actor, angle, 80*FRACUNIT, pitch, damage, NAME_Melee, RUNTIME_CLASS(AStrifeSpark), true);
|
||||||
|
|
||||||
// turn to face target
|
// turn to face target
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
|
@ -934,7 +934,7 @@ void A_RocketInFlight (AActor *self)
|
||||||
AActor *trail;
|
AActor *trail;
|
||||||
|
|
||||||
S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM);
|
S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM);
|
||||||
P_SpawnPuff (RUNTIME_CLASS(AMiniMissilePuff), self->x, self->y, self->z, self->angle - ANGLE_180, 2, true);
|
P_SpawnPuff (RUNTIME_CLASS(AMiniMissilePuff), self->x, self->y, self->z, self->angle - ANGLE_180, 2, PF_HITTHING);
|
||||||
trail = Spawn<ARocketTrail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
trail = Spawn<ARocketTrail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
||||||
if (trail != NULL)
|
if (trail != NULL)
|
||||||
{
|
{
|
||||||
|
|
|
@ -477,6 +477,13 @@ static value_t ColumnMethods[] = {
|
||||||
{ 1.0, "Optimized" }
|
{ 1.0, "Optimized" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static value_t RocketTrailTypes[] = {
|
||||||
|
{ 0.0, "Off" },
|
||||||
|
{ 1.0, "Particles" },
|
||||||
|
{ 2.0, "Sprites" },
|
||||||
|
{ 3.0, "Sprites & Particles" }
|
||||||
|
};
|
||||||
|
|
||||||
static value_t BloodTypes[] = {
|
static value_t BloodTypes[] = {
|
||||||
{ 0.0, "Sprites" },
|
{ 0.0, "Sprites" },
|
||||||
{ 1.0, "Sprites & Particles" },
|
{ 1.0, "Sprites & Particles" },
|
||||||
|
@ -522,7 +529,7 @@ static menuitem_t VideoItems[] = {
|
||||||
#endif
|
#endif
|
||||||
{ redtext, " ", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
{ redtext, " ", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
||||||
{ discrete, "Use fuzz effect", {&r_drawfuzz}, {2.0}, {0.0}, {0.0}, {YesNo} },
|
{ discrete, "Use fuzz effect", {&r_drawfuzz}, {2.0}, {0.0}, {0.0}, {YesNo} },
|
||||||
{ discrete, "Rocket Trails", {&cl_rockettrails}, {2.0}, {0.0}, {0.0}, {OnOff} },
|
{ discrete, "Rocket Trails", {&cl_rockettrails}, {4.0}, {0.0}, {0.0}, {RocketTrailTypes} },
|
||||||
{ discrete, "Blood Type", {&cl_bloodtype}, {3.0}, {0.0}, {0.0}, {BloodTypes} },
|
{ discrete, "Blood Type", {&cl_bloodtype}, {3.0}, {0.0}, {0.0}, {BloodTypes} },
|
||||||
{ discrete, "Bullet Puff Type", {&cl_pufftype}, {2.0}, {0.0}, {0.0}, {PuffTypes} },
|
{ discrete, "Bullet Puff Type", {&cl_pufftype}, {2.0}, {0.0}, {0.0}, {PuffTypes} },
|
||||||
};
|
};
|
||||||
|
|
|
@ -228,7 +228,7 @@ void P_RunEffect (AActor *actor, int effects)
|
||||||
particle_t *particle;
|
particle_t *particle;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ((effects & FX_ROCKET) && cl_rockettrails)
|
if ((effects & FX_ROCKET) && (cl_rockettrails & 1))
|
||||||
{
|
{
|
||||||
// Rocket trail
|
// Rocket trail
|
||||||
|
|
||||||
|
@ -274,7 +274,7 @@ void P_RunEffect (AActor *actor, int effects)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((effects & FX_GRENADE) && (cl_rockettrails))
|
if ((effects & FX_GRENADE) && (cl_rockettrails & 1))
|
||||||
{
|
{
|
||||||
// Grenade trail
|
// Grenade trail
|
||||||
|
|
||||||
|
|
|
@ -90,13 +90,20 @@ void P_UnPredictPlayer ();
|
||||||
extern fixed_t FloatBobOffsets[64];
|
extern fixed_t FloatBobOffsets[64];
|
||||||
extern AActor *MissileActor;
|
extern AActor *MissileActor;
|
||||||
|
|
||||||
void P_SpawnPlayer (mapthing2_t* mthing, bool tempplayer=false);
|
APlayerPawn *P_SpawnPlayer (mapthing2_t* mthing, bool tempplayer=false);
|
||||||
|
|
||||||
void P_ThrustMobj (AActor *mo, angle_t angle, fixed_t move);
|
void P_ThrustMobj (AActor *mo, angle_t angle, fixed_t move);
|
||||||
int P_FaceMobj (AActor *source, AActor *target, angle_t *delta);
|
int P_FaceMobj (AActor *source, AActor *target, angle_t *delta);
|
||||||
bool P_SeekerMissile (AActor *actor, angle_t thresh, angle_t turnMax);
|
bool P_SeekerMissile (AActor *actor, angle_t thresh, angle_t turnMax);
|
||||||
|
|
||||||
AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, angle_t dir, int updown, bool hit=false, bool temporary=false);
|
enum EPuffFlags
|
||||||
|
{
|
||||||
|
PF_HITTHING = 1,
|
||||||
|
PF_MELEERANGE = 2,
|
||||||
|
PF_TEMPORARY = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, angle_t dir, int updown, int flags = 0);
|
||||||
void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AActor *originator);
|
void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AActor *originator);
|
||||||
void P_BloodSplatter (fixed_t x, fixed_t y, fixed_t z, AActor *originator);
|
void P_BloodSplatter (fixed_t x, fixed_t y, fixed_t z, AActor *originator);
|
||||||
void P_BloodSplatter2 (fixed_t x, fixed_t y, fixed_t z, AActor *originator);
|
void P_BloodSplatter2 (fixed_t x, fixed_t y, fixed_t z, AActor *originator);
|
||||||
|
@ -307,8 +314,8 @@ bool P_ChangeSector (sector_t* sector, int crunch, int amt, int floorOrCeil, boo
|
||||||
extern AActor* linetarget; // who got hit (or NULL)
|
extern AActor* linetarget; // who got hit (or NULL)
|
||||||
|
|
||||||
fixed_t P_AimLineAttack (AActor *t1, angle_t angle, fixed_t distance, fixed_t vrange=0, bool forcenosmart=false);
|
fixed_t P_AimLineAttack (AActor *t1, angle_t angle, fixed_t distance, fixed_t vrange=0, bool forcenosmart=false);
|
||||||
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, const PClass *pufftype);
|
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, const PClass *pufftype, bool ismelee = false);
|
||||||
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, FName pufftype);
|
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, FName pufftype, bool ismelee = false);
|
||||||
void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *target, angle_t angle, int pitch);
|
void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *target, angle_t angle, int pitch);
|
||||||
void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch);
|
void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch);
|
||||||
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version
|
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version
|
||||||
|
|
|
@ -2809,7 +2809,7 @@ static bool CheckForSpectral (FTraceResults &res)
|
||||||
}
|
}
|
||||||
|
|
||||||
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
int pitch, int damage, FName damageType, const PClass *pufftype)
|
int pitch, int damage, FName damageType, const PClass *pufftype, bool ismeleeattack)
|
||||||
{
|
{
|
||||||
fixed_t vx, vy, vz, shootz;
|
fixed_t vx, vy, vz, shootz;
|
||||||
FTraceResults trace;
|
FTraceResults trace;
|
||||||
|
@ -2818,6 +2818,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
bool hitGhosts;
|
bool hitGhosts;
|
||||||
bool killPuff = false;
|
bool killPuff = false;
|
||||||
AActor *puff = NULL;
|
AActor *puff = NULL;
|
||||||
|
int flags = ismeleeattack? PF_MELEERANGE : 0;
|
||||||
|
|
||||||
angle >>= ANGLETOFINESHIFT;
|
angle >>= ANGLETOFINESHIFT;
|
||||||
pitch = (angle_t)(pitch) >> ANGLETOFINESHIFT;
|
pitch = (angle_t)(pitch) >> ANGLETOFINESHIFT;
|
||||||
|
@ -2853,7 +2854,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
}
|
}
|
||||||
if (puffDefaults->flags3 & MF3_ALWAYSPUFF)
|
if (puffDefaults->flags3 & MF3_ALWAYSPUFF)
|
||||||
{ // Spawn the puff anyway
|
{ // Spawn the puff anyway
|
||||||
puff = P_SpawnPuff (pufftype, trace.X, trace.Y, trace.Z, angle - ANG180, 2);
|
puff = P_SpawnPuff (pufftype, trace.X, trace.Y, trace.Z, angle - ANG180, 2, flags);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2872,7 +2873,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
fixed_t closer = trace.Distance - 4*FRACUNIT;
|
fixed_t closer = trace.Distance - 4*FRACUNIT;
|
||||||
puff = P_SpawnPuff (pufftype, t1->x + FixedMul (vx, closer),
|
puff = P_SpawnPuff (pufftype, t1->x + FixedMul (vx, closer),
|
||||||
t1->y + FixedMul (vy, closer),
|
t1->y + FixedMul (vy, closer),
|
||||||
shootz + FixedMul (vz, closer), angle - ANG90, 0);
|
shootz + FixedMul (vz, closer), angle - ANG90, 0, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] Spawn a decal
|
// [RH] Spawn a decal
|
||||||
|
@ -2925,7 +2926,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
(trace.Actor->flags & MF_NOBLOOD) ||
|
(trace.Actor->flags & MF_NOBLOOD) ||
|
||||||
(trace.Actor->flags2 & (MF2_INVULNERABLE|MF2_DORMANT)))
|
(trace.Actor->flags2 & (MF2_INVULNERABLE|MF2_DORMANT)))
|
||||||
{
|
{
|
||||||
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, true);
|
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING);
|
||||||
}
|
}
|
||||||
if (!(GetDefaultByType(pufftype)->flags3&MF3_BLOODLESSIMPACT))
|
if (!(GetDefaultByType(pufftype)->flags3&MF3_BLOODLESSIMPACT))
|
||||||
{
|
{
|
||||||
|
@ -2972,7 +2973,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
{
|
{
|
||||||
// Since the puff is the damage inflictor we need it here
|
// Since the puff is the damage inflictor we need it here
|
||||||
// regardless of whether it is displayed or not.
|
// regardless of whether it is displayed or not.
|
||||||
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, true, true);
|
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING|PF_TEMPORARY);
|
||||||
killPuff = true;
|
killPuff = true;
|
||||||
}
|
}
|
||||||
P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, flags);
|
P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, flags);
|
||||||
|
@ -2983,7 +2984,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
|
|
||||||
if (puff == NULL)
|
if (puff == NULL)
|
||||||
{ // Spawn puff just to get a mass for the splash
|
{ // Spawn puff just to get a mass for the splash
|
||||||
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, true, true);
|
puff = P_SpawnPuff (pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING|PF_TEMPORARY);
|
||||||
killPuff = true;
|
killPuff = true;
|
||||||
}
|
}
|
||||||
SpawnDeepSplash (t1, trace, puff, vx, vy, vz);
|
SpawnDeepSplash (t1, trace, puff, vx, vy, vz);
|
||||||
|
@ -2998,7 +2999,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
}
|
}
|
||||||
|
|
||||||
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
int pitch, int damage, FName damageType, FName pufftype)
|
int pitch, int damage, FName damageType, FName pufftype, bool ismeleeattack)
|
||||||
{
|
{
|
||||||
const PClass * type = PClass::FindClass(pufftype);
|
const PClass * type = PClass::FindClass(pufftype);
|
||||||
if (type == NULL)
|
if (type == NULL)
|
||||||
|
@ -3007,7 +3008,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return P_LineAttack(t1, angle, distance, pitch, damage, damageType, type);
|
return P_LineAttack(t1, angle, distance, pitch, damage, damageType, type, ismeleeattack);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3273,7 +3274,7 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
||||||
if ((RailHits[i].HitActor->flags & MF_NOBLOOD) ||
|
if ((RailHits[i].HitActor->flags & MF_NOBLOOD) ||
|
||||||
(RailHits[i].HitActor->flags2 & (MF2_DORMANT|MF2_INVULNERABLE)))
|
(RailHits[i].HitActor->flags2 & (MF2_DORMANT|MF2_INVULNERABLE)))
|
||||||
{
|
{
|
||||||
if (puffclass != NULL) P_SpawnPuff (puffclass, x, y, z, source->angle - ANG180, 1, true);
|
if (puffclass != NULL) P_SpawnPuff (puffclass, x, y, z, source->angle - ANG180, 1, PF_HITTHING);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
115
src/p_mobj.cpp
115
src/p_mobj.cpp
|
@ -77,9 +77,8 @@ static void PlayerLandedOnThing (AActor *mo, AActor *onmobj);
|
||||||
extern cycle_t BotSupportCycles;
|
extern cycle_t BotSupportCycles;
|
||||||
extern cycle_t BotWTG;
|
extern cycle_t BotWTG;
|
||||||
extern fixed_t attackrange;
|
extern fixed_t attackrange;
|
||||||
extern int tmfloorpic;
|
|
||||||
extern sector_t *tmfloorsector;
|
|
||||||
EXTERN_CVAR (Bool, r_drawfuzz);
|
EXTERN_CVAR (Bool, r_drawfuzz);
|
||||||
|
EXTERN_CVAR (Int, cl_rockettrails)
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
|
||||||
|
@ -102,6 +101,7 @@ static FRandom pr_spawnmissile ("SpawnMissile");
|
||||||
static FRandom pr_missiledamage ("MissileDamage");
|
static FRandom pr_missiledamage ("MissileDamage");
|
||||||
FRandom pr_slam ("SkullSlam");
|
FRandom pr_slam ("SkullSlam");
|
||||||
static FRandom pr_multiclasschoice ("MultiClassChoice");
|
static FRandom pr_multiclasschoice ("MultiClassChoice");
|
||||||
|
static FRandom pr_rockettrail("RocketTrail");
|
||||||
|
|
||||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
|
|
||||||
|
@ -321,7 +321,8 @@ void AActor::Serialize (FArchive &arc)
|
||||||
<< DamageType
|
<< DamageType
|
||||||
<< gravity
|
<< gravity
|
||||||
<< FastChaseStrafeCount
|
<< FastChaseStrafeCount
|
||||||
<< master;
|
<< master
|
||||||
|
<< smokecounter;
|
||||||
|
|
||||||
if (arc.IsStoring ())
|
if (arc.IsStoring ())
|
||||||
{
|
{
|
||||||
|
@ -2584,12 +2585,46 @@ void AActor::Tick ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cl_rockettrails & 2)
|
||||||
|
{
|
||||||
|
if (effects & FX_ROCKET)
|
||||||
|
{
|
||||||
|
if (++smokecounter==4)
|
||||||
|
{
|
||||||
|
// add some smoke behind the rocket
|
||||||
|
smokecounter = 0;
|
||||||
|
AActor * th = Spawn("RocketSmokeTrail", x-momx, y-momy, z-momz, ALLOW_REPLACE);
|
||||||
|
if (th)
|
||||||
|
{
|
||||||
|
th->tics -= pr_rockettrail()&3;
|
||||||
|
if (th->tics < 1) th->tics = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (effects & FX_GRENADE)
|
||||||
|
{
|
||||||
|
if (++smokecounter==8)
|
||||||
|
{
|
||||||
|
smokecounter = 0;
|
||||||
|
angle_t moveangle = R_PointToAngle2(0,0,momx,momy);
|
||||||
|
AActor * th = Spawn("GrenadeSmokeTrail",
|
||||||
|
x - FixedMul (finecosine[(moveangle)>>ANGLETOFINESHIFT], radius*2) + (pr_rockettrail()<<10),
|
||||||
|
y - FixedMul (finesine[(moveangle)>>ANGLETOFINESHIFT], radius*2) + (pr_rockettrail()<<10),
|
||||||
|
z - (height>>3) * (momz>>16) + (2*height)/3, ALLOW_REPLACE);
|
||||||
|
if (th)
|
||||||
|
{
|
||||||
|
th->tics -= pr_rockettrail()&3;
|
||||||
|
if (th->tics < 1) th->tics = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fixed_t oldz = z;
|
fixed_t oldz = z;
|
||||||
|
|
||||||
// [RH] Give the pain elemental vertical friction
|
// [RH] Give the pain elemental vertical friction
|
||||||
// This used to be in APainElemental::Tick but in order to use
|
// This used to be in APainElemental::Tick but in order to use
|
||||||
// A_PainAttack with other monsters it has to be here!
|
// A_PainAttack with other monsters it has to be here
|
||||||
if (flags4 & MF4_VFRICTION)
|
if (flags4 & MF4_VFRICTION)
|
||||||
{
|
{
|
||||||
if (health >0)
|
if (health >0)
|
||||||
|
@ -3481,7 +3516,7 @@ EXTERN_CVAR (Bool, chasedemo)
|
||||||
|
|
||||||
extern bool demonew;
|
extern bool demonew;
|
||||||
|
|
||||||
void P_SpawnPlayer (mapthing2_t *mthing, bool tempplayer)
|
APlayerPawn *P_SpawnPlayer (mapthing2_t *mthing, bool tempplayer)
|
||||||
{
|
{
|
||||||
int playernum;
|
int playernum;
|
||||||
player_t *p;
|
player_t *p;
|
||||||
|
@ -3508,7 +3543,7 @@ void P_SpawnPlayer (mapthing2_t *mthing, bool tempplayer)
|
||||||
|
|
||||||
// not playing?
|
// not playing?
|
||||||
if (playernum >= MAXPLAYERS || !playeringame[playernum])
|
if (playernum >= MAXPLAYERS || !playeringame[playernum])
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
p = &players[playernum];
|
p = &players[playernum];
|
||||||
|
|
||||||
|
@ -3705,6 +3740,7 @@ void P_SpawnPlayer (mapthing2_t *mthing, bool tempplayer)
|
||||||
FBehavior::StaticStartTypedScripts (SCRIPT_Respawn, p->mo, true);
|
FBehavior::StaticStartTypedScripts (SCRIPT_Respawn, p->mo, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return mobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3714,7 +3750,7 @@ void P_SpawnPlayer (mapthing2_t *mthing, bool tempplayer)
|
||||||
// already be in host byte order.
|
// already be in host byte order.
|
||||||
//
|
//
|
||||||
// [RH] position is used to weed out unwanted start spots
|
// [RH] position is used to weed out unwanted start spots
|
||||||
void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
AActor *P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
{
|
{
|
||||||
const PClass *i;
|
const PClass *i;
|
||||||
int mask;
|
int mask;
|
||||||
|
@ -3722,13 +3758,13 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
fixed_t x, y, z;
|
fixed_t x, y, z;
|
||||||
|
|
||||||
if (mthing->type == 0 || mthing->type == -1)
|
if (mthing->type == 0 || mthing->type == -1)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
// count deathmatch start positions
|
// count deathmatch start positions
|
||||||
if (mthing->type == 11)
|
if (mthing->type == 11)
|
||||||
{
|
{
|
||||||
deathmatchstarts.Push (*mthing);
|
deathmatchstarts.Push (*mthing);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert Strife starts to Hexen-style starts
|
// Convert Strife starts to Hexen-style starts
|
||||||
|
@ -3769,7 +3805,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
polyspawns = polyspawn;
|
polyspawns = polyspawn;
|
||||||
if (mthing->type != PO_ANCHOR_TYPE)
|
if (mthing->type != PO_ANCHOR_TYPE)
|
||||||
po_NumPolyobjs++;
|
po_NumPolyobjs++;
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for players specially
|
// check for players specially
|
||||||
|
@ -3807,13 +3843,13 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
}
|
}
|
||||||
if (!(mthing->flags & mask))
|
if (!(mthing->flags & mask))
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = G_SkillProperty(SKILLP_SpawnFilter);
|
mask = G_SkillProperty(SKILLP_SpawnFilter);
|
||||||
if (!(mthing->flags & mask))
|
if (!(mthing->flags & mask))
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check class spawn masks. Now with player classes available
|
// Check class spawn masks. Now with player classes available
|
||||||
|
@ -3823,7 +3859,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
int spawnmask = players[consoleplayer].GetSpawnClass();
|
int spawnmask = players[consoleplayer].GetSpawnClass();
|
||||||
if (spawnmask != 0 && (mthing->flags & spawnmask) == 0)
|
if (spawnmask != 0 && (mthing->flags & spawnmask) == 0)
|
||||||
{ // Not for current class
|
{ // Not for current class
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!deathmatch)
|
else if (!deathmatch)
|
||||||
|
@ -3842,7 +3878,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
}
|
}
|
||||||
if (mask != -1 && (mthing->flags & mask) == 0)
|
if (mask != -1 && (mthing->flags & mask) == 0)
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3851,14 +3887,14 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
{
|
{
|
||||||
// [RH] Only spawn spots that match position.
|
// [RH] Only spawn spots that match position.
|
||||||
if (mthing->args[0] != position)
|
if (mthing->args[0] != position)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
// save spots for respawning in network games
|
// save spots for respawning in network games
|
||||||
playerstarts[pnum] = *mthing;
|
playerstarts[pnum] = *mthing;
|
||||||
if (!deathmatch)
|
if (!deathmatch)
|
||||||
P_SpawnPlayer (mthing);
|
return P_SpawnPlayer (mthing);
|
||||||
|
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] sound sequence overriders
|
// [RH] sound sequence overriders
|
||||||
|
@ -3866,7 +3902,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
{
|
{
|
||||||
P_PointInSector (mthing->x<<FRACBITS,
|
P_PointInSector (mthing->x<<FRACBITS,
|
||||||
mthing->y<<FRACBITS)->seqType = mthing->type - 1400;
|
mthing->y<<FRACBITS)->seqType = mthing->type - 1400;
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (mthing->type == 1411)
|
else if (mthing->type == 1411)
|
||||||
{
|
{
|
||||||
|
@ -3886,7 +3922,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
P_PointInSector (mthing->x << FRACBITS,
|
P_PointInSector (mthing->x << FRACBITS,
|
||||||
mthing->y << FRACBITS)->seqType = type;
|
mthing->y << FRACBITS)->seqType = type;
|
||||||
}
|
}
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] Determine if it is an old ambient thing, and if so,
|
// [RH] Determine if it is an old ambient thing, and if so,
|
||||||
|
@ -3933,7 +3969,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
|
|
||||||
// don't spawn keycards and players in deathmatch
|
// don't spawn keycards and players in deathmatch
|
||||||
if (deathmatch && info->flags & MF_NOTDMATCH)
|
if (deathmatch && info->flags & MF_NOTDMATCH)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
// [RH] don't spawn extra weapons in coop if so desired
|
// [RH] don't spawn extra weapons in coop if so desired
|
||||||
if (multiplayer && !deathmatch && (dmflags & DF_NO_COOP_WEAPON_SPAWN))
|
if (multiplayer && !deathmatch && (dmflags & DF_NO_COOP_WEAPON_SPAWN))
|
||||||
|
@ -3941,14 +3977,14 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
if (i->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
|
if (i->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
|
||||||
{
|
{
|
||||||
if ((mthing->flags & (MTF_DEATHMATCH|MTF_SINGLE)) == MTF_DEATHMATCH)
|
if ((mthing->flags & (MTF_DEATHMATCH|MTF_SINGLE)) == MTF_DEATHMATCH)
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't spawn any monsters if -nomonsters
|
// don't spawn any monsters if -nomonsters
|
||||||
if (((level.flags & LEVEL_NOMONSTERS) || (dmflags & DF_NO_MONSTERS)) && info->flags3 & MF3_ISMONSTER )
|
if (((level.flags & LEVEL_NOMONSTERS) || (dmflags & DF_NO_MONSTERS)) && info->flags3 & MF3_ISMONSTER )
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] Other things that shouldn't be spawned depending on dmflags
|
// [RH] Other things that shouldn't be spawned depending on dmflags
|
||||||
|
@ -3957,13 +3993,11 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
if (dmflags & DF_NO_HEALTH)
|
if (dmflags & DF_NO_HEALTH)
|
||||||
{
|
{
|
||||||
if (i->IsDescendantOf (RUNTIME_CLASS(AHealth)))
|
if (i->IsDescendantOf (RUNTIME_CLASS(AHealth)))
|
||||||
return;
|
return NULL;
|
||||||
if (i->TypeName == NAME_Berserk)
|
if (i->TypeName == NAME_Berserk)
|
||||||
return;
|
return NULL;
|
||||||
if (i->TypeName == NAME_Soulsphere)
|
|
||||||
return;
|
|
||||||
if (i->TypeName == NAME_Megasphere)
|
if (i->TypeName == NAME_Megasphere)
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (dmflags & DF_NO_ITEMS)
|
if (dmflags & DF_NO_ITEMS)
|
||||||
{
|
{
|
||||||
|
@ -3973,9 +4007,9 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
if (dmflags & DF_NO_ARMOR)
|
if (dmflags & DF_NO_ARMOR)
|
||||||
{
|
{
|
||||||
if (i->IsDescendantOf (RUNTIME_CLASS(AArmor)))
|
if (i->IsDescendantOf (RUNTIME_CLASS(AArmor)))
|
||||||
return;
|
return NULL;
|
||||||
if (i->TypeName == NAME_Megasphere)
|
if (i->TypeName == NAME_Megasphere)
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4020,9 +4054,10 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
mobj->BeginPlay ();
|
mobj->BeginPlay ();
|
||||||
if (mobj->ObjectFlags & OF_EuthanizeMe)
|
if (mobj->ObjectFlags & OF_EuthanizeMe)
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
mobj->LevelSpawned ();
|
mobj->LevelSpawned ();
|
||||||
|
return mobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4036,7 +4071,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
// P_SpawnPuff
|
// P_SpawnPuff
|
||||||
//
|
//
|
||||||
|
|
||||||
AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, angle_t dir, int updown, bool hitthing, bool temporary)
|
AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, angle_t dir, int updown, int flags)
|
||||||
{
|
{
|
||||||
AActor *puff;
|
AActor *puff;
|
||||||
|
|
||||||
|
@ -4048,26 +4083,26 @@ AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, an
|
||||||
// it will enter the crash state. This is used by the StrifeSpark
|
// it will enter the crash state. This is used by the StrifeSpark
|
||||||
// and BlasterPuff.
|
// and BlasterPuff.
|
||||||
FState *crashstate;
|
FState *crashstate;
|
||||||
if (hitthing == false && (crashstate = puff->FindState(NAME_Crash)) != NULL)
|
if (!(flags & PF_HITTHING) && (crashstate = puff->FindState(NAME_Crash)) != NULL)
|
||||||
{
|
{
|
||||||
puff->SetState (crashstate);
|
puff->SetState (crashstate);
|
||||||
}
|
}
|
||||||
else if (attackrange == MELEERANGE && puff->MeleeState != NULL)
|
else if ((flags & PF_MELEERANGE) && puff->MeleeState != NULL)
|
||||||
{
|
{
|
||||||
// handle the hard coded state jump of Doom's bullet puff
|
// handle the hard coded state jump of Doom's bullet puff
|
||||||
// in a more flexible manner.
|
// in a more flexible manner.
|
||||||
puff->SetState (puff->MeleeState);
|
puff->SetState (puff->MeleeState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl_pufftype && updown != 3 && !temporary && (puff->flags4 & MF4_ALLOWPARTICLES))
|
if (!(flags & PF_TEMPORARY))
|
||||||
{
|
{
|
||||||
P_DrawSplash2 (32, x, y, z, dir, updown, 1);
|
if (cl_pufftype && updown != 3 && (puff->flags4 & MF4_ALLOWPARTICLES))
|
||||||
puff->renderflags |= RF_INVISIBLE;
|
{
|
||||||
}
|
P_DrawSplash2 (32, x, y, z, dir, updown, 1);
|
||||||
|
puff->renderflags |= RF_INVISIBLE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!temporary)
|
if ((flags & PF_HITTHING) && puff->SeeSound)
|
||||||
{
|
|
||||||
if (hitthing && puff->SeeSound)
|
|
||||||
{ // Hit thing sound
|
{ // Hit thing sound
|
||||||
S_SoundID (puff, CHAN_BODY, puff->SeeSound, 1, ATTN_NORM);
|
S_SoundID (puff, CHAN_BODY, puff->SeeSound, 1, ATTN_NORM);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
#include "r_translate.h"
|
#include "r_translate.h"
|
||||||
|
|
||||||
extern void P_SpawnMapThing (mapthing2_t *mthing, int position);
|
extern AActor *P_SpawnMapThing (mapthing2_t *mthing, int position);
|
||||||
extern bool P_LoadBuildMap (BYTE *mapdata, size_t len, mapthing2_t **things, int *numthings);
|
extern bool P_LoadBuildMap (BYTE *mapdata, size_t len, mapthing2_t **things, int *numthings);
|
||||||
|
|
||||||
extern void P_LoadTranslator(const char *lump);
|
extern void P_LoadTranslator(const char *lump);
|
||||||
|
|
|
@ -475,6 +475,9 @@ static int TryFindSwitch (side_t *side, int Where)
|
||||||
//
|
//
|
||||||
bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno)
|
bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno)
|
||||||
{
|
{
|
||||||
|
// if this line is one sided this function must always return success.
|
||||||
|
if (line->sidenum[0] == NO_SIDE || line->sidenum[1] == NO_SIDE) return true;
|
||||||
|
|
||||||
fixed_t checktop;
|
fixed_t checktop;
|
||||||
fixed_t checkbot;
|
fixed_t checkbot;
|
||||||
side_t *side = &sides[line->sidenum[sideno]];
|
side_t *side = &sides[line->sidenum[sideno]];
|
||||||
|
|
|
@ -1145,7 +1145,7 @@ void A_CustomPunch (AActor *self)
|
||||||
PuffType = PClass::FindClass(PuffTypeName);
|
PuffType = PClass::FindClass(PuffTypeName);
|
||||||
if (!PuffType) PuffType = PClass::FindClass(NAME_BulletPuff);
|
if (!PuffType) PuffType = PClass::FindClass(NAME_BulletPuff);
|
||||||
|
|
||||||
P_LineAttack (self, angle, Range, pitch, Damage, GetDefaultByType(PuffType)->DamageType, PuffType);
|
P_LineAttack (self, angle, Range, pitch, Damage, GetDefaultByType(PuffType)->DamageType, PuffType, true);
|
||||||
|
|
||||||
// turn to face target
|
// turn to face target
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
|
|
|
@ -197,3 +197,41 @@ ACTOR SlimeSplash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Smoke trail for rocket -----------------------------------
|
||||||
|
|
||||||
|
ACTOR RocketSmokeTrail
|
||||||
|
{
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
VSpeed 1
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOCLIP
|
||||||
|
+NOGRAVITY
|
||||||
|
+DONTSPLASH
|
||||||
|
+NOTELEPORT
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
RSMK ABCDE 5
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ACTOR GrenadeSmokeTrail
|
||||||
|
{
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOCLIP
|
||||||
|
+DONTSPLASH
|
||||||
|
+NOTELEPORT
|
||||||
|
Gravity 0.1
|
||||||
|
VSpeed 0.5
|
||||||
|
Scale 0.6
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
RSMK ABCDE 4
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
wadsrc/rsmka0.png
Normal file
BIN
wadsrc/rsmka0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 410 B |
BIN
wadsrc/rsmkb0.png
Normal file
BIN
wadsrc/rsmkb0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 412 B |
BIN
wadsrc/rsmkc0.png
Normal file
BIN
wadsrc/rsmkc0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 589 B |
BIN
wadsrc/rsmkd0.png
Normal file
BIN
wadsrc/rsmkd0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 409 B |
BIN
wadsrc/rsmke0.png
Normal file
BIN
wadsrc/rsmke0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 261 B |
|
@ -149,6 +149,11 @@ sprites/icecc0.png icecc0.png
|
||||||
sprites/icecd0.png icecd0.png
|
sprites/icecd0.png icecd0.png
|
||||||
sprites/amrka0.png amrka0.png
|
sprites/amrka0.png amrka0.png
|
||||||
sprites/pista0.png pista0.png
|
sprites/pista0.png pista0.png
|
||||||
|
sprites/rsmka0.png rsmka0.png
|
||||||
|
sprites/rsmkb0.png rsmkb0.png
|
||||||
|
sprites/rsmkc0.png rsmkc0.png
|
||||||
|
sprites/rsmkd0.png rsmkd0.png
|
||||||
|
sprites/rsmke0.png rsmke0.png
|
||||||
|
|
||||||
# crouching DoomPlayer
|
# crouching DoomPlayer
|
||||||
sprites/plyca1.lmp crouch/plyca1.lmp
|
sprites/plyca1.lmp crouch/plyca1.lmp
|
||||||
|
|
Loading…
Reference in a new issue