mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-05-30 00:41:19 +00:00
* Updated to ZDoom 4012:
- Fixed: The resurrect cheat also needs to restore the player's radius. - Changed P_CheckPlayerSprites() so that it does not alter any actor data. It is now called by R_ProjectSprite() to modify the appropriate data right before it is needed for rendering.- Never set the player actor's scale to the skin's directly. Only do it indirectly through P_CheckPlayerSprite(). - Fixed: When P_Add3DFloor() adds the "inside" plane, it needs to copy the translucency flags from the original plane. - Added JLOSF_NOAUTOAIM flag for when you want to use A_JumpIfTargetInLOS in conjunction with something that never autoaims, such as a railgun. - Fixed: A_JumpIfTargetInLOS should use P_AimLineAttack() instead of P_BulletSlope(), because the latter intentionally checks to the sides of the aimed line. - Do not wake Oracle spectres that are dead. - Do not "wake" Oracle spectres that killed an Oracle. (Because if they killed it, they're obviously already awake. Also, we don't want them to end up targeting themselves.) - Fixed: Don't use the player skin in the cast call if the class being shown has been removed from the PlayerClasses array (and therefore does not have a valid default skin). - Do not double-scale player classes that use non-1.0 default scales. - P_DamageMobj() now returns the amount of damage actually done so that the bleed functions can perform based on the amount of damage actually taken after all modifications are done to it. However, if the damage is canceled away, blood will still spawn for the original damage amount rather than the modified amount. * Fixed decals not being lit correctly in the older lighting mode. * Fixed: 3D middle textures with a valid backsector need to be rendered as two-sided even if they lack the two-sided flag. (It works in ZDoom.) git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@1500 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
parent
a56d4da199
commit
8e2b798b8d
42 changed files with 241 additions and 235 deletions
|
@ -775,7 +775,6 @@ void D_Display ()
|
|||
}
|
||||
screen->SetBlendingRect(viewwindowx, viewwindowy,
|
||||
viewwindowx + viewwidth, viewwindowy + viewheight);
|
||||
P_CheckPlayerSprites();
|
||||
P_PredictPlayer(&players[consoleplayer]);
|
||||
Renderer->RenderView(&players[consoleplayer]);
|
||||
P_UnPredictPlayer();
|
||||
|
|
|
@ -770,8 +770,6 @@ void D_ReadUserInfoStrings (int i, BYTE **stream, bool update)
|
|||
GetDefaultByType (players[i].cls)->SpawnState->sprite)
|
||||
{ // Only change the sprite if the player is using a standard one
|
||||
players[i].mo->sprite = skins[info->skin].sprite;
|
||||
players[i].mo->scaleX = skins[info->skin].ScaleX;
|
||||
players[i].mo->scaleY = skins[info->skin].ScaleY;
|
||||
}
|
||||
}
|
||||
// Rebuild translation in case the new skin uses a different range
|
||||
|
|
|
@ -427,7 +427,7 @@ extern player_t players[MAXPLAYERS];
|
|||
|
||||
FArchive &operator<< (FArchive &arc, player_t *&p);
|
||||
|
||||
void P_CheckPlayerSprites();
|
||||
void P_CheckPlayerSprite(AActor *mo, unsigned &spritenum, fixed_t &scalex, fixed_t &scaley);
|
||||
|
||||
inline void AActor::SetFriendPlayer(player_t *player)
|
||||
{
|
||||
|
|
|
@ -123,8 +123,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
|
|||
return;
|
||||
|
||||
S_Sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM);
|
||||
P_TraceBleed (dmg, target);
|
||||
P_DamageMobj (target, self, self, dmg, NAME_None);
|
||||
int newdam = P_DamageMobj (target, self, self, dmg, NAME_None);
|
||||
P_TraceBleed (newdam > 0 ? newdam : dmg, target);
|
||||
|
||||
an = self->angle >> ANGLETOFINESHIFT;
|
||||
fire = self->tracer;
|
||||
|
|
|
@ -10,8 +10,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_BruisAttack)
|
|||
{
|
||||
int damage = (pr_bruisattack()%8+1)*10;
|
||||
S_Sound (self, CHAN_WEAPON, "baron/melee", 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_HeadAttack)
|
|||
{
|
||||
int damage = (pr_headattack()%6+1)*10;
|
||||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SargAttack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
int damage = ((pr_sargattack()%10)+1)*4;
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,8 +25,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_TroopAttack)
|
|||
{
|
||||
int damage = (pr_troopattack()%8+1)*3;
|
||||
S_Sound (self, CHAN_WEAPON, "imp/melee", 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -584,8 +584,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BFGSpray)
|
|||
damage += (pr_bfgspray() & 7) + 1;
|
||||
|
||||
thingToHit = linetarget;
|
||||
P_DamageMobj (thingToHit, self->target, self->target, damage, spray != NULL? FName(spray->DamageType) : FName(NAME_BFGSplash));
|
||||
P_TraceBleed (damage, thingToHit, self->target);
|
||||
int newdam = P_DamageMobj (thingToHit, self->target, self->target, damage, spray != NULL? FName(spray->DamageType) : FName(NAME_BFGSplash));
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thingToHit, self->target);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -146,7 +146,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SkelFist)
|
|||
{
|
||||
int damage = ((pr_skelfist()%10)+1)*6;
|
||||
S_Sound (self, CHAN_WEAPON, "skeleton/melee", 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2049,7 +2049,6 @@ static void PutSavePic (FILE *file, int width, int height)
|
|||
}
|
||||
else
|
||||
{
|
||||
P_CheckPlayerSprites();
|
||||
Renderer->WriteSavePic(&players[consoleplayer], file, width, height);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,8 +73,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChicAttack)
|
|||
if (self->CheckMeleeRange())
|
||||
{
|
||||
int damage = 1 + (pr_chicattack() & 1);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -70,8 +70,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr1Attack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
int damage = pr_scrc1atk.HitDice (8);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -203,8 +203,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr2Attack)
|
|||
if (self->CheckMeleeRange())
|
||||
{
|
||||
int damage = pr_s2a.HitDice (20);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
chance = self->health < self->SpawnHealth()/2 ? 96 : 48;
|
||||
|
|
|
@ -83,8 +83,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_LichAttack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
int damage = pr_atk.HitDice (6);
|
||||
P_DamageMobj (target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, target, self);
|
||||
int newdam = P_DamageMobj (target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, target, self);
|
||||
return;
|
||||
}
|
||||
dist = P_AproxDistance (self->x-target->x, self->y-target->y)
|
||||
|
|
|
@ -47,8 +47,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_KnightAttack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
int damage = pr_knightatk.HitDice (3);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
S_Sound (self, CHAN_BODY, "hknight/melee", 1, ATTN_NORM);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -69,8 +69,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_WizAtk3)
|
|||
if (self->CheckMeleeRange())
|
||||
{
|
||||
int damage = pr_wizatk3.HitDice (4);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
const PClass *fx = PClass::FindClass("WizardFX1");
|
||||
|
|
|
@ -32,8 +32,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_BishopAttack)
|
|||
if (self->CheckMeleeRange())
|
||||
{
|
||||
int damage = pr_atk.HitDice (4);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
self->special1 = (pr_atk() & 3) + 5;
|
||||
|
|
|
@ -87,8 +87,8 @@ static void DragonSeek (AActor *actor, angle_t thresh, angle_t turnMax)
|
|||
if (actor->CheckMeleeRange ())
|
||||
{
|
||||
int damage = pr_dragonseek.HitDice (10);
|
||||
P_DamageMobj (actor->target, actor, actor, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, actor->target, actor);
|
||||
int newdam = P_DamageMobj (actor->target, actor, actor, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, actor->target, actor);
|
||||
S_Sound (actor, CHAN_WEAPON, actor->AttackSound, 1, ATTN_NORM);
|
||||
}
|
||||
else if (pr_dragonseek() < 128 && P_CheckMissileRange(actor))
|
||||
|
@ -201,8 +201,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_DragonFlight)
|
|||
if (abs(self->angle-angle) < ANGLE_45/2 && self->CheckMeleeRange())
|
||||
{
|
||||
int damage = pr_dragonflight.HitDice (8);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
||||
}
|
||||
else if (abs(self->angle-angle) <= ANGLE_1*20)
|
||||
|
|
|
@ -174,8 +174,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_SerpentMeleeAttack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
int damage = pr_serpentmeattack.HitDice (5);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
S_Sound (self, CHAN_BODY, "SerpentMeleeHit", 1, ATTN_NORM);
|
||||
}
|
||||
if (pr_serpentmeattack() < 96)
|
||||
|
|
|
@ -154,8 +154,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_ThrustImpale)
|
|||
if (thing == self)
|
||||
continue; // don't clip against self
|
||||
|
||||
P_DamageMobj (thing, self, self, 10001, NAME_Crush);
|
||||
P_TraceBleed (10001, thing);
|
||||
int newdam = P_DamageMobj (thing, self, self, 10001, NAME_Crush);
|
||||
P_TraceBleed (newdam > 0 ? newdam : 10001, thing);
|
||||
self->args[1] = 1; // Mark thrust thing as bloody
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,8 +149,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk1)
|
|||
if (self->CheckMeleeRange())
|
||||
{
|
||||
int damage = pr_minotauratk1.HitDice (4);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
if ((player = self->target->player) != NULL &&
|
||||
player->mo == self->target)
|
||||
{ // Squish the player
|
||||
|
@ -281,8 +281,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk2)
|
|||
{
|
||||
int damage;
|
||||
damage = pr_atk.HitDice (friendly ? 3 : 5);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
return;
|
||||
}
|
||||
z = self->z + 40*FRACUNIT;
|
||||
|
@ -327,8 +327,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk3)
|
|||
int damage;
|
||||
|
||||
damage = pr_minotauratk3.HitDice (friendly ? 3 : 5);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
if ((player = self->target->player) != NULL &&
|
||||
player->mo == self->target)
|
||||
{ // Squish the player
|
||||
|
@ -396,8 +396,8 @@ void P_MinotaurSlam (AActor *source, AActor *target)
|
|||
target->velx += FixedMul (thrust, finecosine[angle]);
|
||||
target->vely += FixedMul (thrust, finesine[angle]);
|
||||
damage = pr_minotaurslam.HitDice (static_cast<AMinotaur *>(source) ? 4 : 6);
|
||||
P_DamageMobj (target, NULL, NULL, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, target, angle, 0);
|
||||
int newdam = P_DamageMobj (target, NULL, NULL, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, target, angle, 0);
|
||||
if (target->player)
|
||||
{
|
||||
target->reactiontime = 14+(pr_minotaurslam()&7);
|
||||
|
|
|
@ -1503,7 +1503,7 @@ void APowerDamage::EndEffect( )
|
|||
|
||||
//===========================================================================
|
||||
//
|
||||
// APowerDamage :: AbsorbDamage
|
||||
// APowerDamage :: ModifyDamage
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_WakeOracleSpectre)
|
|||
TThinkerIterator<AActor> it(NAME_AlienSpectre3);
|
||||
AActor *spectre = it.Next();
|
||||
|
||||
if (spectre != NULL)
|
||||
if (spectre != NULL && spectre->health > 0 && self->target != spectre)
|
||||
{
|
||||
spectre->Sector->SoundTarget = spectre->LastHeard = self->LastHeard;
|
||||
spectre->target = self->target;
|
||||
|
|
|
@ -87,8 +87,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_ProgrammerMelee)
|
|||
S_Sound (self, CHAN_WEAPON, "programmer/clank", 1, ATTN_NORM);
|
||||
|
||||
damage = ((pr_prog() % 10) + 1) * 6;
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -59,8 +59,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_StalkerAttack)
|
|||
{
|
||||
int damage = (pr_stalker() & 7) * 2 + 2;
|
||||
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -375,7 +375,14 @@ void GLWall::DrawDecal(DBaseDecal *decal)
|
|||
}
|
||||
else
|
||||
{
|
||||
gl_SetColor(light, rel, &p, a, extralight); // Korshun.
|
||||
if (glset.lightmode == 8)
|
||||
{
|
||||
gl_SetColor(light, rel, &p, a, extralight); // Korshun.
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_SetColor(light, rel, &p, a);
|
||||
}
|
||||
}
|
||||
|
||||
PalEntry fc = gl_RenderState.GetFogColor();
|
||||
|
|
|
@ -1577,7 +1577,8 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
|
|||
}
|
||||
|
||||
//return;
|
||||
if (!backsector || !(seg->linedef->flags&ML_TWOSIDED)) // one sided
|
||||
// [GZ] 3D middle textures are necessarily two-sided, even if they lack the explicit two-sided flag
|
||||
if (!backsector || !(seg->linedef->flags&(ML_TWOSIDED|ML_3DMIDTEX))) // one sided
|
||||
{
|
||||
// sector's sky
|
||||
SkyNormal(frontsector,v1,v2);
|
||||
|
|
|
@ -589,18 +589,22 @@ void DIntermissionScreenCast::Drawer ()
|
|||
// draw the current frame in the middle of the screen
|
||||
if (caststate != NULL)
|
||||
{
|
||||
int castsprite;
|
||||
int castsprite = caststate->sprite;
|
||||
|
||||
if (!(mDefaults->flags4 & MF4_NOSKIN) &&
|
||||
mDefaults->SpawnState != NULL && caststate->sprite == mDefaults->SpawnState->sprite &&
|
||||
mClass->IsDescendantOf(RUNTIME_CLASS(APlayerPawn)) &&
|
||||
skins != NULL)
|
||||
{
|
||||
castsprite = skins[players[consoleplayer].userinfo.skin].sprite;
|
||||
}
|
||||
else
|
||||
{
|
||||
castsprite = caststate->sprite;
|
||||
// Only use the skin sprite if this class has not been removed from the
|
||||
// PlayerClasses list.
|
||||
for (unsigned i = 0; i < PlayerClasses.Size(); ++i)
|
||||
{
|
||||
if (PlayerClasses[i].Type == mClass)
|
||||
{
|
||||
castsprite = skins[players[consoleplayer].userinfo.skin].sprite;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sprframe = &SpriteFrames[sprites[castsprite].spriteframes + caststate->GetFrame()];
|
||||
|
|
|
@ -313,6 +313,7 @@ void cht_DoCheat (player_t *player, int cheat)
|
|||
player->mo->flags6 = player->mo->GetDefault()->flags6;
|
||||
player->mo->renderflags &= ~RF_INVISIBLE;
|
||||
player->mo->height = player->mo->GetDefault()->height;
|
||||
player->mo->radius = player->mo->GetDefault()->radius;
|
||||
player->mo->special1 = 0; // required for the Hexen fighter's fist attack.
|
||||
// This gets set by AActor::Die as flag for the wimpy death and must be reset here.
|
||||
player->mo->SetState (player->mo->SpawnState);
|
||||
|
|
|
@ -109,7 +109,7 @@ void F3DFloor::UpdateColormap(FDynamicColormap *&map)
|
|||
// Add one 3D floor to the sector
|
||||
//
|
||||
//==========================================================================
|
||||
static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags,int transluc)
|
||||
static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int alpha)
|
||||
{
|
||||
F3DFloor* ffloor;
|
||||
unsigned i;
|
||||
|
@ -180,7 +180,7 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag
|
|||
|
||||
ffloor->flags = flags;
|
||||
ffloor->master = master;
|
||||
ffloor->alpha = transluc;
|
||||
ffloor->alpha = alpha;
|
||||
ffloor->top.vindex = ffloor->bottom.vindex = -1;
|
||||
|
||||
// The engine cannot handle sloped translucent floors. Sorry
|
||||
|
@ -201,7 +201,11 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag
|
|||
|
||||
// kg3D - software renderer only hack
|
||||
// this is really required because of ceilingclip and floorclip
|
||||
if(vid_renderer == 0 && flags & FF_BOTHPLANES) P_Add3DFloor(sec, sec2, master, FF_EXISTS | FF_THISINSIDE | FF_RENDERPLANES | FF_NOSHADE | FF_SEETHROUGH | FF_SHOOTTHROUGH | (flags & FF_INVERTSECTOR), transluc);
|
||||
if((vid_renderer == 0) && (flags & FF_BOTHPLANES))
|
||||
{
|
||||
P_Add3DFloor(sec, sec2, master, FF_EXISTS | FF_THISINSIDE | FF_RENDERPLANES | FF_NOSHADE | FF_SEETHROUGH | FF_SHOOTTHROUGH |
|
||||
(flags & (FF_INVERTSECTOR | FF_TRANSLUCENT | FF_ADDITIVETRANS)), alpha);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -209,7 +213,7 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag
|
|||
// Creates all 3D floors defined by one linedef
|
||||
//
|
||||
//==========================================================================
|
||||
static int P_Set3DFloor(line_t * line, int param,int param2, int alpha)
|
||||
static int P_Set3DFloor(line_t * line, int param, int param2, int alpha)
|
||||
{
|
||||
int s,i;
|
||||
int flags;
|
||||
|
|
|
@ -36,7 +36,7 @@ typedef enum
|
|||
FF_FADEWALLS = 0x8000000, // Applies real fog to walls and doesn't blend the view
|
||||
FF_ADDITIVETRANS = 0x10000000, // Render this floor with additive translucency
|
||||
FF_FLOOD = 0x20000000, // extends towards the next lowest flooding or solid 3D floor or the bottom of the sector
|
||||
FF_THISINSIDE = 0x40000000, // hack for software 3D with FF_BOTHPLANES
|
||||
FF_THISINSIDE = 0x40000000, // hack for software 3D with FF_BOTHPLANES
|
||||
} ffloortype_e;
|
||||
|
||||
// This is for the purpose of Sector_SetContents:
|
||||
|
|
|
@ -888,7 +888,9 @@ static inline bool MustForcePain(AActor *target, AActor *inflictor)
|
|||
}
|
||||
|
||||
|
||||
void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, FName mod, int flags)
|
||||
// Returns the amount of damage actually inflicted upon the target, or -1 if
|
||||
// the damage was cancelled.
|
||||
int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, FName mod, int flags)
|
||||
{
|
||||
unsigned ang;
|
||||
player_t *player = NULL;
|
||||
|
@ -901,7 +903,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
|
||||
if (target == NULL || !((target->flags & MF_SHOOTABLE) || (target->flags6 & MF6_VULNERABLE)))
|
||||
{ // Shouldn't happen
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Spectral targets only take damage from spectral projectiles.
|
||||
|
@ -909,14 +911,14 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{
|
||||
if (inflictor == NULL || !(inflictor->flags4 & MF4_SPECTRAL))
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (target->health <= 0)
|
||||
{
|
||||
if (inflictor && mod == NAME_Ice)
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
else if (target->flags & MF_ICECORPSE) // frozen
|
||||
{
|
||||
|
@ -924,7 +926,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
target->flags6 |= MF6_SHATTERING;
|
||||
target->velx = target->vely = target->velz = 0;
|
||||
}
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
if ((target->flags2 & MF2_INVULNERABLE) && damage < TELEFRAG_DAMAGE && !(flags & DMG_FORCED))
|
||||
{ // actor is invulnerable
|
||||
|
@ -932,7 +934,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{
|
||||
if (inflictor == NULL || !(inflictor->flags3 & MF3_FOILINVUL))
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -940,7 +942,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
// Players are optionally excluded from getting thrust by damage.
|
||||
if (static_cast<APlayerPawn *>(target)->PlayerFlags & PPF_NOTHRUSTWHENINVUL)
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -968,7 +970,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
if (target->flags2 & MF2_DORMANT)
|
||||
{
|
||||
// Invulnerable, and won't wake up
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
player = target->player;
|
||||
if (player && damage > 1 && damage < TELEFRAG_DAMAGE)
|
||||
|
@ -984,19 +986,19 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
if (player != NULL)
|
||||
{
|
||||
if (!deathmatch && inflictor->FriendPlayer > 0)
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
else if (target->flags4 & MF4_SPECTRAL)
|
||||
{
|
||||
if (inflictor->FriendPlayer == 0 && !target->IsHostile(inflictor))
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
damage = inflictor->DoSpecialDamage (target, damage, mod);
|
||||
if (damage == -1)
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
// Handle active damage modifiers (e.g. PowerDamage)
|
||||
|
@ -1010,7 +1012,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{
|
||||
goto dopain;
|
||||
}
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
// Handle passive damage modifiers (e.g. PowerProtection)
|
||||
|
@ -1024,7 +1026,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{
|
||||
goto dopain;
|
||||
}
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1041,7 +1043,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{
|
||||
goto dopain;
|
||||
}
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1049,7 +1051,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
}
|
||||
if (damage == -1)
|
||||
{
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
// Push the target unless the source's weapon's kickback is 0.
|
||||
// (i.e. Gauntlets/Chainsaw)
|
||||
|
@ -1133,7 +1135,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
{ // Still allow telefragging :-(
|
||||
damage = (int)((float)damage * level.teamdamage);
|
||||
if (damage <= 0)
|
||||
return;
|
||||
return damage;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1162,7 +1164,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
if (damage < TELEFRAG_DAMAGE && ((player->mo->flags2 & MF2_INVULNERABLE) ||
|
||||
(player->cheats & CF_GODMODE)))
|
||||
{ // player is invulnerable, so don't hurt him
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(flags & DMG_NO_ARMOR) && player->mo->Inventory != NULL)
|
||||
|
@ -1173,12 +1175,12 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
if (damage <= 0)
|
||||
{
|
||||
// If MF6_FORCEPAIN is set, make the player enter the pain state.
|
||||
if (!(target->flags5 & MF5_NOPAIN) && inflictor != NULL &&
|
||||
(inflictor->flags6 & MF6_FORCEPAIN) && !(inflictor->flags5 & MF5_PAINLESS))
|
||||
{
|
||||
goto dopain;
|
||||
}
|
||||
return;
|
||||
if (!(target->flags5 & MF5_NOPAIN) && inflictor != NULL &&
|
||||
(inflictor->flags6 & MF6_FORCEPAIN) && !(inflictor->flags5 & MF5_PAINLESS))
|
||||
{
|
||||
goto dopain;
|
||||
}
|
||||
return damage;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1237,7 +1239,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
damage = newdam;
|
||||
if (damage <= 0)
|
||||
{
|
||||
return;
|
||||
return damage;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1296,7 +1298,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
}
|
||||
}
|
||||
target->Die (source, inflictor, flags);
|
||||
return;
|
||||
return damage;
|
||||
}
|
||||
|
||||
woundstate = target->FindState(NAME_Wound, mod);
|
||||
|
@ -1307,7 +1309,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
|||
if (target->health <= woundhealth)
|
||||
{
|
||||
target->SetState (woundstate);
|
||||
return;
|
||||
return damage;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1401,6 +1403,8 @@ dopain:
|
|||
// killough 11/98: Don't attack a friend, unless hit by that friend.
|
||||
if (justhit && (target->target == source || !target->target || !target->IsFriend(target->target)))
|
||||
target->flags |= MF_JUSTHIT; // fight back!
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
void P_PoisonMobj (AActor *target, AActor *inflictor, AActor *source, int damage, int duration, int period, FName type)
|
||||
|
|
|
@ -530,7 +530,7 @@ extern FBlockNode** blocklinks; // for thing chains
|
|||
// P_INTER
|
||||
//
|
||||
void P_TouchSpecialThing (AActor *special, AActor *toucher);
|
||||
void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, FName mod, int flags=0);
|
||||
int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, FName mod, int flags=0);
|
||||
void P_PoisonMobj (AActor *target, AActor *inflictor, AActor *source, int damage, int duration, int period, FName type);
|
||||
bool P_GiveBody (AActor *actor, int num, int max=0);
|
||||
bool P_PoisonPlayer (player_t *player, AActor *poisoner, AActor *source, int poison);
|
||||
|
|
102
src/p_map.cpp
102
src/p_map.cpp
|
@ -966,12 +966,13 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
|||
thing->vely += tm.thing->vely;
|
||||
if ((thing->velx + thing->vely) > 3*FRACUNIT)
|
||||
{
|
||||
int newdam;
|
||||
damage = (tm.thing->Mass / 100) + 1;
|
||||
P_DamageMobj (thing, tm.thing, tm.thing, damage, tm.thing->DamageType);
|
||||
P_TraceBleed (damage, thing, tm.thing);
|
||||
newdam = P_DamageMobj (thing, tm.thing, tm.thing, damage, tm.thing->DamageType);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thing, tm.thing);
|
||||
damage = (thing->Mass / 100) + 1;
|
||||
P_DamageMobj (tm.thing, thing, thing, damage >> 2, tm.thing->DamageType);
|
||||
P_TraceBleed (damage, tm.thing, thing);
|
||||
newdam = P_DamageMobj (tm.thing, thing, thing, damage >> 2, tm.thing->DamageType);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, tm.thing, thing);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1149,10 +1150,10 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
|||
}
|
||||
|
||||
damage = tm.thing->GetMissileDamage (3, 2);
|
||||
P_DamageMobj (thing, tm.thing, tm.thing->target, damage, tm.thing->DamageType);
|
||||
int newdam = P_DamageMobj (thing, tm.thing, tm.thing->target, damage, tm.thing->DamageType);
|
||||
if (!(tm.thing->flags3 & MF3_BLOODLESSIMPACT))
|
||||
{
|
||||
P_TraceBleed (damage, thing, tm.thing);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thing, tm.thing);
|
||||
}
|
||||
if (thing->flags2 & MF2_PUSHABLE
|
||||
&& !(tm.thing->flags2 & MF2_CANNOTPUSH))
|
||||
|
@ -1180,7 +1181,7 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
|||
damage = tm.thing->GetMissileDamage ((tm.thing->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1);
|
||||
if ((damage > 0) || (tm.thing->flags6 & MF6_FORCEPAIN))
|
||||
{
|
||||
P_DamageMobj (thing, tm.thing, tm.thing->target, damage, tm.thing->DamageType);
|
||||
int newdam = P_DamageMobj (thing, tm.thing, tm.thing->target, damage, tm.thing->DamageType);
|
||||
if (damage > 0)
|
||||
{
|
||||
if ((tm.thing->flags5 & MF5_BLOODSPLATTER) &&
|
||||
|
@ -1194,7 +1195,7 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
|||
}
|
||||
if (!(tm.thing->flags3 & MF3_BLOODLESSIMPACT))
|
||||
{
|
||||
P_TraceBleed (damage, thing, tm.thing);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thing, tm.thing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3612,13 +3613,42 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
|||
// We must pass the unreplaced puff type here
|
||||
puff = P_SpawnPuff (t1, pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING);
|
||||
}
|
||||
|
||||
// Allow puffs to inflict poison damage, so that hitscans can poison, too.
|
||||
if (puffDefaults->PoisonDamage > 0 && puffDefaults->PoisonDuration != INT_MIN)
|
||||
{
|
||||
P_PoisonMobj(trace.Actor, puff ? puff : t1, t1, puffDefaults->PoisonDamage, puffDefaults->PoisonDuration, puffDefaults->PoisonPeriod, puffDefaults->PoisonDamageType);
|
||||
}
|
||||
|
||||
// [GZ] If MF6_FORCEPAIN is set, we need to call P_DamageMobj even if damage is 0!
|
||||
// Note: The puff may not yet be spawned here so we must check the class defaults, not the actor.
|
||||
int newdam = damage;
|
||||
if (damage || (puffDefaults->flags6 & MF6_FORCEPAIN))
|
||||
{
|
||||
int dmgflags = DMG_INFLICTOR_IS_PUFF | pflag;
|
||||
// Allow MF5_PIERCEARMOR on a weapon as well.
|
||||
if (t1->player != NULL && (dmgflags & DMG_PLAYERATTACK) && t1->player->ReadyWeapon != NULL &&
|
||||
t1->player->ReadyWeapon->flags5 & MF5_PIERCEARMOR)
|
||||
{
|
||||
dmgflags |= DMG_NO_ARMOR;
|
||||
}
|
||||
|
||||
if (puff == NULL)
|
||||
{
|
||||
// Since the puff is the damage inflictor we need it here
|
||||
// regardless of whether it is displayed or not.
|
||||
puff = P_SpawnPuff (t1, pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING|PF_TEMPORARY);
|
||||
killPuff = true;
|
||||
}
|
||||
newdam = P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, dmgflags);
|
||||
}
|
||||
if (!(puffDefaults->flags3&MF3_BLOODLESSIMPACT))
|
||||
{
|
||||
if (!bloodsplatter && !axeBlood &&
|
||||
!(trace.Actor->flags & MF_NOBLOOD) &&
|
||||
!(trace.Actor->flags2 & (MF2_INVULNERABLE|MF2_DORMANT)))
|
||||
{
|
||||
P_SpawnBlood (hitx, hity, hitz, angle - ANG180, damage, trace.Actor);
|
||||
P_SpawnBlood (hitx, hity, hitz, angle - ANG180, newdam > 0 ? newdam : damage, trace.Actor);
|
||||
}
|
||||
|
||||
if (damage)
|
||||
|
@ -3639,38 +3669,10 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
|||
}
|
||||
}
|
||||
// [RH] Stick blood to walls
|
||||
P_TraceBleed (damage, trace.X, trace.Y, trace.Z,
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, trace.X, trace.Y, trace.Z,
|
||||
trace.Actor, srcangle, srcpitch);
|
||||
}
|
||||
}
|
||||
|
||||
// Allow puffs to inflict poison damage, so that hitscans can poison, too.
|
||||
if (puffDefaults->PoisonDamage > 0 && puffDefaults->PoisonDuration != INT_MIN)
|
||||
{
|
||||
P_PoisonMobj(trace.Actor, puff ? puff : t1, t1, puffDefaults->PoisonDamage, puffDefaults->PoisonDuration, puffDefaults->PoisonPeriod, puffDefaults->PoisonDamageType);
|
||||
}
|
||||
|
||||
// [GZ] If MF6_FORCEPAIN is set, we need to call P_DamageMobj even if damage is 0!
|
||||
// Note: The puff may not yet be spawned here so we must check the class defaults, not the actor.
|
||||
if (damage || (puffDefaults->flags6 & MF6_FORCEPAIN))
|
||||
{
|
||||
int dmgflags = DMG_INFLICTOR_IS_PUFF | pflag;
|
||||
// Allow MF5_PIERCEARMOR on a weapon as well.
|
||||
if (t1->player != NULL && (dmgflags & DMG_PLAYERATTACK) && t1->player->ReadyWeapon != NULL &&
|
||||
t1->player->ReadyWeapon->flags5 & MF5_PIERCEARMOR)
|
||||
{
|
||||
dmgflags |= DMG_NO_ARMOR;
|
||||
}
|
||||
|
||||
if (puff == NULL)
|
||||
{
|
||||
// Since the puff is the damage inflictor we need it here
|
||||
// regardless of whether it is displayed or not.
|
||||
puff = P_SpawnPuff (t1, pufftype, hitx, hity, hitz, angle - ANG180, 2, flags|PF_HITTHING|PF_TEMPORARY);
|
||||
killPuff = true;
|
||||
}
|
||||
P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, dmgflags);
|
||||
}
|
||||
if (victim != NULL)
|
||||
{
|
||||
*victim = trace.Actor;
|
||||
|
@ -3995,6 +3997,7 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
|||
{
|
||||
fixed_t x, y, z;
|
||||
bool spawnpuff;
|
||||
bool bleed = false;
|
||||
int puffflags = PF_HITTHING;
|
||||
|
||||
x = x1 + FixedMul (RailHits[i].Distance, vx);
|
||||
|
@ -4012,8 +4015,7 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
|||
puffflags |= PF_HITTHINGBLEED; // [XA] Allow for puffs to jump to XDeath state.
|
||||
if(!(puffDefaults->flags3 & MF3_BLOODLESSIMPACT))
|
||||
{
|
||||
P_SpawnBlood (x, y, z, (source->angle + angleoffset) - ANG180, damage, RailHits[i].HitActor);
|
||||
P_TraceBleed (damage, x, y, z, RailHits[i].HitActor, source->angle, pitch);
|
||||
bleed = true;
|
||||
}
|
||||
}
|
||||
if (spawnpuff)
|
||||
|
@ -4021,7 +4023,12 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
|||
if (puffDefaults && puffDefaults->PoisonDamage > 0 && puffDefaults->PoisonDuration != INT_MIN)
|
||||
P_PoisonMobj(RailHits[i].HitActor, thepuff ? thepuff : source, source, puffDefaults->PoisonDamage, puffDefaults->PoisonDuration, puffDefaults->PoisonPeriod, puffDefaults->PoisonDamageType);
|
||||
|
||||
P_DamageMobj (RailHits[i].HitActor, thepuff? thepuff:source, source, damage, damagetype, DMG_INFLICTOR_IS_PUFF);
|
||||
int newdam = P_DamageMobj (RailHits[i].HitActor, thepuff? thepuff:source, source, damage, damagetype, DMG_INFLICTOR_IS_PUFF);
|
||||
if (bleed)
|
||||
{
|
||||
P_SpawnBlood (x, y, z, (source->angle + angleoffset) - ANG180, newdam > 0 ? newdam : damage, RailHits[i].HitActor);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, x, y, z, RailHits[i].HitActor, source->angle, pitch);
|
||||
}
|
||||
}
|
||||
|
||||
// Spawn a decal or puff at the point where the trace ended.
|
||||
|
@ -4551,16 +4558,17 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b
|
|||
double velz;
|
||||
double thrust;
|
||||
int damage = (int)points;
|
||||
int newdam = damage;
|
||||
|
||||
if (!(flags & RADF_NODAMAGE))
|
||||
P_DamageMobj (thing, bombspot, bombsource, damage, bombmod);
|
||||
newdam = P_DamageMobj (thing, bombspot, bombsource, damage, bombmod);
|
||||
else if (thing->player == NULL && !(flags & RADF_NOIMPACTDAMAGE))
|
||||
thing->flags2 |= MF2_BLASTED;
|
||||
|
||||
if (!(thing->flags & MF_ICECORPSE))
|
||||
{
|
||||
if (!(flags & RADF_NODAMAGE) && !(bombspot->flags3 & MF3_BLOODLESSIMPACT))
|
||||
P_TraceBleed (damage, thing, bombspot);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thing, bombspot);
|
||||
|
||||
if (!(flags & RADF_NODAMAGE) || !(bombspot->flags2 & MF2_NODMGTHRUST))
|
||||
{
|
||||
|
@ -4616,8 +4624,8 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b
|
|||
damage = Scale(damage, thing->GetClass()->Meta.GetMetaFixed(AMETA_RDFactor, FRACUNIT), FRACUNIT);
|
||||
if (damage > 0)
|
||||
{
|
||||
P_DamageMobj (thing, bombspot, bombsource, damage, bombmod);
|
||||
P_TraceBleed (damage, thing, bombspot);
|
||||
int newdam = P_DamageMobj (thing, bombspot, bombsource, damage, bombmod);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, thing, bombspot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4819,7 +4827,7 @@ void P_DoCrunch (AActor *thing, FChangePosition *cpos)
|
|||
|
||||
if ((cpos->crushchange > 0) && !(level.maptime & 3))
|
||||
{
|
||||
P_DamageMobj (thing, NULL, NULL, cpos->crushchange, NAME_Crush);
|
||||
int newdam = P_DamageMobj (thing, NULL, NULL, cpos->crushchange, NAME_Crush);
|
||||
|
||||
// spray blood in a random direction
|
||||
if (!(thing->flags2&(MF2_INVULNERABLE|MF2_DORMANT)))
|
||||
|
@ -4829,7 +4837,7 @@ void P_DoCrunch (AActor *thing, FChangePosition *cpos)
|
|||
PalEntry bloodcolor = thing->GetBloodColor();
|
||||
const PClass *bloodcls = thing->GetBloodType();
|
||||
|
||||
P_TraceBleed (cpos->crushchange, thing);
|
||||
P_TraceBleed (newdam > 0 ? newdam : cpos->crushchange, thing);
|
||||
if (cl_bloodtype <= 1 && bloodcls != NULL)
|
||||
{
|
||||
AActor *mo;
|
||||
|
|
|
@ -328,8 +328,6 @@ void AActor::Serialize (FArchive &arc)
|
|||
state->sprite == GetDefaultByType (player->cls)->SpawnState->sprite)
|
||||
{ // Give player back the skin
|
||||
sprite = skins[player->userinfo.skin].sprite;
|
||||
scaleX = skins[player->userinfo.skin].ScaleX;
|
||||
scaleY = skins[player->userinfo.skin].ScaleY;
|
||||
}
|
||||
if (Speed == 0)
|
||||
{
|
||||
|
@ -2808,8 +2806,8 @@ bool AActor::Slam (AActor *thing)
|
|||
if (!(flags2 & MF2_DORMANT))
|
||||
{
|
||||
int dam = GetMissileDamage (7, 1);
|
||||
P_DamageMobj (thing, this, this, dam, NAME_Melee);
|
||||
P_TraceBleed (dam, thing, this);
|
||||
int newdam = P_DamageMobj (thing, this, this, dam, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : dam, thing, this);
|
||||
// The charging monster may have died by the target's actions here.
|
||||
if (health > 0)
|
||||
{
|
||||
|
@ -4272,8 +4270,6 @@ APlayerPawn *P_SpawnPlayer (FPlayerStart *mthing, int playernum, bool tempplayer
|
|||
if (!(mobj->flags4 & MF4_NOSKIN))
|
||||
{
|
||||
mobj->sprite = skins[p->userinfo.skin].sprite;
|
||||
mobj->scaleX = skins[p->userinfo.skin].ScaleX;
|
||||
mobj->scaleY = skins[p->userinfo.skin].ScaleY;
|
||||
}
|
||||
|
||||
p->DesiredFOV = p->FOV = 90.f;
|
||||
|
|
|
@ -1483,75 +1483,50 @@ DEFINE_ACTION_FUNCTION(AActor, A_CheckPlayerDone)
|
|||
//
|
||||
// P_CheckPlayerSprites
|
||||
//
|
||||
// Here's the place where crouching sprites are handled
|
||||
// This must be called each frame before rendering
|
||||
// Here's the place where crouching sprites are handled.
|
||||
// R_ProjectSprite() calls this for any players.
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
void P_CheckPlayerSprites()
|
||||
void P_CheckPlayerSprite(AActor *actor, unsigned &spritenum, fixed_t &scalex, fixed_t &scaley)
|
||||
{
|
||||
for(int i=0; i<MAXPLAYERS; i++)
|
||||
player_t *player = actor->player;
|
||||
int crouchspriteno;
|
||||
|
||||
if (player->userinfo.skin != 0 && !(actor->flags4 & MF4_NOSKIN))
|
||||
{
|
||||
player_t * player = &players[i];
|
||||
APlayerPawn * mo = player->mo;
|
||||
// Convert from default scale to skin scale.
|
||||
fixed_t defscaleY = actor->GetDefault()->scaleY;
|
||||
fixed_t defscaleX = actor->GetDefault()->scaleX;
|
||||
scaley = Scale(scaley, skins[player->userinfo.skin].ScaleY, defscaleY);
|
||||
scalex = Scale(scalex, skins[player->userinfo.skin].ScaleX, defscaleX);
|
||||
}
|
||||
|
||||
if (playeringame[i] && mo != NULL)
|
||||
// Set the crouch sprite?
|
||||
if (player->crouchfactor < FRACUNIT*3/4)
|
||||
{
|
||||
if (spritenum == actor->SpawnState->sprite || spritenum == player->mo->crouchsprite)
|
||||
{
|
||||
int crouchspriteno;
|
||||
fixed_t defscaleY = mo->GetDefault()->scaleY;
|
||||
fixed_t defscaleX = mo->GetDefault()->scaleX;
|
||||
|
||||
if (player->userinfo.skin != 0 && !(player->mo->flags4 & MF4_NOSKIN))
|
||||
{
|
||||
defscaleY = skins[player->userinfo.skin].ScaleY;
|
||||
defscaleX = skins[player->userinfo.skin].ScaleX;
|
||||
}
|
||||
|
||||
// Set the crouch sprite
|
||||
if (player->crouchfactor < FRACUNIT*3/4)
|
||||
{
|
||||
if (mo->sprite == mo->SpawnState->sprite || mo->sprite == mo->crouchsprite)
|
||||
{
|
||||
crouchspriteno = mo->crouchsprite;
|
||||
}
|
||||
else if (!(player->mo->flags4 & MF4_NOSKIN) &&
|
||||
(mo->sprite == skins[player->userinfo.skin].sprite ||
|
||||
mo->sprite == skins[player->userinfo.skin].crouchsprite))
|
||||
{
|
||||
crouchspriteno = skins[player->userinfo.skin].crouchsprite;
|
||||
}
|
||||
else
|
||||
{
|
||||
// no sprite -> squash the existing one
|
||||
crouchspriteno = -1;
|
||||
}
|
||||
crouchspriteno = player->mo->crouchsprite;
|
||||
}
|
||||
else if (!(actor->flags4 & MF4_NOSKIN) &&
|
||||
(spritenum == skins[player->userinfo.skin].sprite ||
|
||||
spritenum == skins[player->userinfo.skin].crouchsprite))
|
||||
{
|
||||
crouchspriteno = skins[player->userinfo.skin].crouchsprite;
|
||||
}
|
||||
else
|
||||
{ // no sprite -> squash the existing one
|
||||
crouchspriteno = -1;
|
||||
}
|
||||
|
||||
if (crouchspriteno > 0)
|
||||
{
|
||||
mo->sprite = crouchspriteno;
|
||||
mo->scaleY = defscaleY;
|
||||
}
|
||||
else if (player->playerstate != PST_DEAD)
|
||||
{
|
||||
mo->scaleY = player->crouchfactor < FRACUNIT*3/4 ? defscaleY/2 : defscaleY;
|
||||
}
|
||||
}
|
||||
else // Set the normal sprite
|
||||
{
|
||||
if (mo->sprite != 0)
|
||||
{
|
||||
if (mo->sprite == mo->crouchsprite)
|
||||
{
|
||||
mo->sprite = mo->SpawnState->sprite;
|
||||
}
|
||||
else if (mo->sprite != 0 && mo->sprite == skins[player->userinfo.skin].crouchsprite)
|
||||
{
|
||||
mo->sprite = skins[player->userinfo.skin].sprite;
|
||||
}
|
||||
}
|
||||
mo->scaleY = defscaleY;
|
||||
}
|
||||
mo->scaleX = defscaleX;
|
||||
if (crouchspriteno > 0)
|
||||
{
|
||||
spritenum = crouchspriteno;
|
||||
}
|
||||
else if (player->playerstate != PST_DEAD && player->crouchfactor < FRACUNIT*3/4)
|
||||
{
|
||||
scaley /= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -907,8 +907,8 @@ void FPolyObj::ThrustMobj (AActor *actor, side_t *side)
|
|||
{
|
||||
if (bHurtOnTouch || !P_CheckMove (actor, actor->x + thrustX, actor->y + thrustY))
|
||||
{
|
||||
P_DamageMobj (actor, NULL, NULL, crush, NAME_Crush);
|
||||
P_TraceBleed (crush, actor);
|
||||
int newdam = P_DamageMobj (actor, NULL, NULL, crush, NAME_Crush);
|
||||
P_TraceBleed (newdam > 0 ? newdam : crush, actor);
|
||||
}
|
||||
}
|
||||
if (level.flags2 & LEVEL2_POLYGRIND) actor->Grind(false); // crush corpses that get caught in a polyobject's way
|
||||
|
|
|
@ -523,6 +523,14 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
|||
tex = NULL;
|
||||
voxel = NULL;
|
||||
|
||||
unsigned spritenum = thing->sprite;
|
||||
fixed_t spritescaleX = thing->scaleX;
|
||||
fixed_t spritescaleY = thing->scaleY;
|
||||
if (thing->player != NULL)
|
||||
{
|
||||
P_CheckPlayerSprite(thing, spritenum, spritescaleX, spritescaleY);
|
||||
}
|
||||
|
||||
if (thing->picnum.isValid())
|
||||
{
|
||||
picnum = thing->picnum;
|
||||
|
@ -557,13 +565,13 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
|||
{
|
||||
// decide which texture to use for the sprite
|
||||
#ifdef RANGECHECK
|
||||
if ((unsigned)thing->sprite >= (unsigned)sprites.Size ())
|
||||
if (spritenum >= (unsigned)sprites.Size ())
|
||||
{
|
||||
DPrintf ("R_ProjectSprite: invalid sprite number %i\n", thing->sprite);
|
||||
DPrintf ("R_ProjectSprite: invalid sprite number %u\n", spritenum);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
spritedef_t *sprdef = &sprites[thing->sprite];
|
||||
spritedef_t *sprdef = &sprites[spritenum];
|
||||
if (thing->frame >= sprdef->numframes)
|
||||
{
|
||||
// If there are no frames at all for this sprite, don't draw it.
|
||||
|
@ -624,13 +632,13 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
|||
// [RH] Added scaling
|
||||
int scaled_to = tex->GetScaledTopOffset();
|
||||
int scaled_bo = scaled_to - tex->GetScaledHeight();
|
||||
gzt = fz + thing->scaleY * scaled_to;
|
||||
gzb = fz + thing->scaleY * scaled_bo;
|
||||
gzt = fz + spritescaleY * scaled_to;
|
||||
gzb = fz + spritescaleY * scaled_bo;
|
||||
}
|
||||
else
|
||||
{
|
||||
xscale = FixedMul(thing->scaleX, voxel->Scale);
|
||||
yscale = FixedMul(thing->scaleY, voxel->Scale);
|
||||
xscale = FixedMul(spritescaleX, voxel->Scale);
|
||||
yscale = FixedMul(spritescaleY, voxel->Scale);
|
||||
gzt = fz + MulScale8(yscale, voxel->Voxel->Mips[0].PivotZ) - thing->floorclip;
|
||||
gzb = fz + MulScale8(yscale, voxel->Voxel->Mips[0].PivotZ - (voxel->Voxel->Mips[0].SizeZ << 8));
|
||||
if (gzt <= gzb)
|
||||
|
@ -682,7 +690,7 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
|||
}
|
||||
|
||||
// calculate edges of the shape
|
||||
const fixed_t thingxscalemul = DivScale16(thing->scaleX, tex->xScale);
|
||||
const fixed_t thingxscalemul = DivScale16(spritescaleX, tex->xScale);
|
||||
|
||||
tx -= (flip ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul;
|
||||
x1 = centerx + MulScale32 (tx, xscale);
|
||||
|
@ -698,11 +706,11 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
|||
if ((x2 < WindowLeft || x2 <= x1))
|
||||
return;
|
||||
|
||||
xscale = FixedDiv(FixedMul(thing->scaleX, xscale), tex->xScale);
|
||||
xscale = FixedDiv(FixedMul(spritescaleX, xscale), tex->xScale);
|
||||
iscale = (tex->GetWidth() << FRACBITS) / (x2 - x1);
|
||||
x2--;
|
||||
|
||||
fixed_t yscale = SafeDivScale16(thing->scaleY, tex->yScale);
|
||||
fixed_t yscale = SafeDivScale16(spritescaleY, tex->yScale);
|
||||
|
||||
// store information in a vissprite
|
||||
vis = R_NewVisSprite();
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
// This file was automatically generated by the
|
||||
// updaterevision tool. Do not edit by hand.
|
||||
|
||||
#define ZD_SVN_REVISION_STRING "4002"
|
||||
#define ZD_SVN_REVISION_NUMBER 4002
|
||||
#define ZD_SVN_REVISION_STRING "4012"
|
||||
#define ZD_SVN_REVISION_NUMBER 4012
|
||||
|
|
|
@ -315,8 +315,8 @@ static void DoAttack (AActor *self, bool domelee, bool domissile,
|
|||
{
|
||||
int damage = pr_camelee.HitDice(MeleeDamage);
|
||||
if (MeleeSound) S_Sound (self, CHAN_WEAPON, MeleeSound, 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
||||
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
else if (domissile && MissileType != NULL)
|
||||
{
|
||||
|
@ -1119,8 +1119,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomMeleeAttack)
|
|||
if (self->CheckMeleeRange ())
|
||||
{
|
||||
if (MeleeSound) S_Sound (self, CHAN_WEAPON, MeleeSound, 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, DamageType);
|
||||
if (bleed) P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, DamageType);
|
||||
if (bleed) P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1151,8 +1151,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomComboAttack)
|
|||
{
|
||||
if (DamageType==NAME_None) DamageType = NAME_Melee; // Melee is the default type
|
||||
if (MeleeSound) S_Sound (self, CHAN_WEAPON, MeleeSound, 1, ATTN_NORM);
|
||||
P_DamageMobj (self->target, self, self, damage, DamageType);
|
||||
if (bleed) P_TraceBleed (damage, self->target, self);
|
||||
int newdam = P_DamageMobj (self->target, self, self, damage, DamageType);
|
||||
if (bleed) P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
||||
}
|
||||
else if (ti)
|
||||
{
|
||||
|
@ -2866,7 +2866,8 @@ enum JLOS_flags
|
|||
JLOSF_TARGETLOS=128,
|
||||
JLOSF_FLIPFOV=256,
|
||||
JLOSF_ALLYNOJUMP=512,
|
||||
JLOSF_COMBATANTONLY=1024
|
||||
JLOSF_COMBATANTONLY=1024,
|
||||
JLOSF_NOAUTOAIM=2048,
|
||||
};
|
||||
|
||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfTargetInLOS)
|
||||
|
@ -2912,7 +2913,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfTargetInLOS)
|
|||
else
|
||||
{
|
||||
// Does the player aim at something that can be shot?
|
||||
P_BulletSlope(self, &target);
|
||||
P_AimLineAttack(self, self->angle, MISSILERANGE, &target, (flags & JLOSF_NOAUTOAIM) ? ANGLE_1/2 : 0);
|
||||
|
||||
if (!target) return;
|
||||
|
||||
|
@ -4052,11 +4053,11 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_WolfAttack)
|
|||
damage >>= 2;
|
||||
if (damage)
|
||||
{
|
||||
P_DamageMobj(self->target, self, self, damage, mod, DMG_THRUSTLESS);
|
||||
int newdam = P_DamageMobj(self->target, self, self, damage, mod, DMG_THRUSTLESS);
|
||||
if (spawnblood)
|
||||
{
|
||||
P_SpawnBlood(dx, dy, dz, angle, damage, self->target);
|
||||
P_TraceBleed(damage, self->target, R_PointToAngle2(self->x, self->y, dx, dy), 0);
|
||||
P_SpawnBlood(dx, dy, dz, angle, newdam > 0 ? newdam : damage, self->target);
|
||||
P_TraceBleed(newdam > 0 ? newdam : damage, self->target, R_PointToAngle2(self->x, self->y, dx, dy), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -84,6 +84,7 @@ const int JLOSF_TARGETLOS = 128;
|
|||
const int JLOSF_FLIPFOV = 256;
|
||||
const int JLOSF_ALLYNOJUMP = 512;
|
||||
const int JLOSF_COMBATANTONLY = 1024;
|
||||
const int JLOSF_NOAUTOAIM = 2048;
|
||||
|
||||
// Flags for A_ChangeVelocity
|
||||
const int CVF_RELATIVE = 1;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
// Changing this constant gives resuluts very similar to changing r_visibility.
|
||||
// Changing this constant gives results very similar to changing r_visibility.
|
||||
// Default is 232, it seems to give exactly the same light bands as software renderer.
|
||||
#define DOOMLIGHTFACTOR 232.0
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue