From 8e2b798b8dc43de719bd389b79c16f932be46e0a Mon Sep 17 00:00:00 2001 From: gez Date: Thu, 3 Jan 2013 00:03:11 +0000 Subject: [PATCH] * 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 --- src/d_main.cpp | 1 - src/d_netinfo.cpp | 2 - src/d_player.h | 2 +- src/g_doom/a_archvile.cpp | 4 +- src/g_doom/a_bruiser.cpp | 4 +- src/g_doom/a_cacodemon.cpp | 4 +- src/g_doom/a_demon.cpp | 4 +- src/g_doom/a_doomimp.cpp | 4 +- src/g_doom/a_doomweaps.cpp | 4 +- src/g_doom/a_revenant.cpp | 4 +- src/g_game.cpp | 1 - src/g_heretic/a_chicken.cpp | 4 +- src/g_heretic/a_dsparil.cpp | 8 +-- src/g_heretic/a_ironlich.cpp | 4 +- src/g_heretic/a_knight.cpp | 4 +- src/g_heretic/a_wizard.cpp | 4 +- src/g_hexen/a_bishop.cpp | 4 +- src/g_hexen/a_dragon.cpp | 8 +-- src/g_hexen/a_serpent.cpp | 4 +- src/g_hexen/a_spike.cpp | 4 +- src/g_raven/a_minotaur.cpp | 16 ++--- src/g_shared/a_artifacts.cpp | 2 +- src/g_strife/a_oracle.cpp | 2 +- src/g_strife/a_programmer.cpp | 4 +- src/g_strife/a_stalker.cpp | 4 +- src/gl/scene/gl_decal.cpp | 9 ++- src/gl/scene/gl_walls.cpp | 3 +- src/intermission/intermission.cpp | 16 +++-- src/m_cheat.cpp | 1 + src/p_3dfloors.cpp | 12 ++-- src/p_3dfloors.h | 2 +- src/p_interaction.cpp | 56 ++++++++-------- src/p_local.h | 2 +- src/p_map.cpp | 102 ++++++++++++++++------------- src/p_mobj.cpp | 8 +-- src/p_user.cpp | 97 ++++++++++----------------- src/po_man.cpp | 4 +- src/r_things.cpp | 28 +++++--- src/svnrevision.h | 4 +- src/thingdef/thingdef_codeptr.cpp | 23 +++---- wadsrc/static/actors/constants.txt | 1 + wadsrc/static/shaders/glsl/main.fp | 2 +- 42 files changed, 241 insertions(+), 235 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index ae28f15d..afda957a 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -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(); diff --git a/src/d_netinfo.cpp b/src/d_netinfo.cpp index 9d0d63f8..ed6a4f7f 100644 --- a/src/d_netinfo.cpp +++ b/src/d_netinfo.cpp @@ -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 diff --git a/src/d_player.h b/src/d_player.h index fa14c49a..bb6e87e7 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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) { diff --git a/src/g_doom/a_archvile.cpp b/src/g_doom/a_archvile.cpp index 2bd65b7a..e2fb689c 100644 --- a/src/g_doom/a_archvile.cpp +++ b/src/g_doom/a_archvile.cpp @@ -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; diff --git a/src/g_doom/a_bruiser.cpp b/src/g_doom/a_bruiser.cpp index 24c6c48e..ba1d92bc 100644 --- a/src/g_doom/a_bruiser.cpp +++ b/src/g_doom/a_bruiser.cpp @@ -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; } diff --git a/src/g_doom/a_cacodemon.cpp b/src/g_doom/a_cacodemon.cpp index 0eb92389..856360a1 100644 --- a/src/g_doom/a_cacodemon.cpp +++ b/src/g_doom/a_cacodemon.cpp @@ -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; } diff --git a/src/g_doom/a_demon.cpp b/src/g_doom/a_demon.cpp index c890c32b..f4a9f461 100644 --- a/src/g_doom/a_demon.cpp +++ b/src/g_doom/a_demon.cpp @@ -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); } } diff --git a/src/g_doom/a_doomimp.cpp b/src/g_doom/a_doomimp.cpp index 401fa457..4c607f6e 100644 --- a/src/g_doom/a_doomimp.cpp +++ b/src/g_doom/a_doomimp.cpp @@ -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; } diff --git a/src/g_doom/a_doomweaps.cpp b/src/g_doom/a_doomweaps.cpp index 8cb3739f..642c319e 100644 --- a/src/g_doom/a_doomweaps.cpp +++ b/src/g_doom/a_doomweaps.cpp @@ -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); } } diff --git a/src/g_doom/a_revenant.cpp b/src/g_doom/a_revenant.cpp index 92a3dc13..0600a59e 100644 --- a/src/g_doom/a_revenant.cpp +++ b/src/g_doom/a_revenant.cpp @@ -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); } } diff --git a/src/g_game.cpp b/src/g_game.cpp index d96e37fc..6163ee0d 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -2049,7 +2049,6 @@ static void PutSavePic (FILE *file, int width, int height) } else { - P_CheckPlayerSprites(); Renderer->WriteSavePic(&players[consoleplayer], file, width, height); } } diff --git a/src/g_heretic/a_chicken.cpp b/src/g_heretic/a_chicken.cpp index a8b8c98d..082774a3 100644 --- a/src/g_heretic/a_chicken.cpp +++ b/src/g_heretic/a_chicken.cpp @@ -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); } } diff --git a/src/g_heretic/a_dsparil.cpp b/src/g_heretic/a_dsparil.cpp index 080deb8d..e4d86c83 100644 --- a/src/g_heretic/a_dsparil.cpp +++ b/src/g_heretic/a_dsparil.cpp @@ -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; diff --git a/src/g_heretic/a_ironlich.cpp b/src/g_heretic/a_ironlich.cpp index 8efa0827..8efaa8d8 100644 --- a/src/g_heretic/a_ironlich.cpp +++ b/src/g_heretic/a_ironlich.cpp @@ -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) diff --git a/src/g_heretic/a_knight.cpp b/src/g_heretic/a_knight.cpp index 2fb8a0ef..18280326 100644 --- a/src/g_heretic/a_knight.cpp +++ b/src/g_heretic/a_knight.cpp @@ -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; } diff --git a/src/g_heretic/a_wizard.cpp b/src/g_heretic/a_wizard.cpp index 119a1b1e..ea5e6559 100644 --- a/src/g_heretic/a_wizard.cpp +++ b/src/g_heretic/a_wizard.cpp @@ -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"); diff --git a/src/g_hexen/a_bishop.cpp b/src/g_hexen/a_bishop.cpp index f80b91cb..08faee95 100644 --- a/src/g_hexen/a_bishop.cpp +++ b/src/g_hexen/a_bishop.cpp @@ -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; diff --git a/src/g_hexen/a_dragon.cpp b/src/g_hexen/a_dragon.cpp index 0c5ea81b..22c92b4d 100644 --- a/src/g_hexen/a_dragon.cpp +++ b/src/g_hexen/a_dragon.cpp @@ -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) diff --git a/src/g_hexen/a_serpent.cpp b/src/g_hexen/a_serpent.cpp index b44a6175..cf552897 100644 --- a/src/g_hexen/a_serpent.cpp +++ b/src/g_hexen/a_serpent.cpp @@ -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) diff --git a/src/g_hexen/a_spike.cpp b/src/g_hexen/a_spike.cpp index f7269c40..9c9f9ab2 100644 --- a/src/g_hexen/a_spike.cpp +++ b/src/g_hexen/a_spike.cpp @@ -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 } } diff --git a/src/g_raven/a_minotaur.cpp b/src/g_raven/a_minotaur.cpp index 36a5537b..949e38d0 100644 --- a/src/g_raven/a_minotaur.cpp +++ b/src/g_raven/a_minotaur.cpp @@ -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(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); diff --git a/src/g_shared/a_artifacts.cpp b/src/g_shared/a_artifacts.cpp index 114c4832..4f44cfc2 100644 --- a/src/g_shared/a_artifacts.cpp +++ b/src/g_shared/a_artifacts.cpp @@ -1503,7 +1503,7 @@ void APowerDamage::EndEffect( ) //=========================================================================== // -// APowerDamage :: AbsorbDamage +// APowerDamage :: ModifyDamage // //=========================================================================== diff --git a/src/g_strife/a_oracle.cpp b/src/g_strife/a_oracle.cpp index 0eb3f1ac..bdfc52df 100644 --- a/src/g_strife/a_oracle.cpp +++ b/src/g_strife/a_oracle.cpp @@ -13,7 +13,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_WakeOracleSpectre) TThinkerIterator 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; diff --git a/src/g_strife/a_programmer.cpp b/src/g_strife/a_programmer.cpp index 0f843c55..78689468 100644 --- a/src/g_strife/a_programmer.cpp +++ b/src/g_strife/a_programmer.cpp @@ -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); } //============================================================================ diff --git a/src/g_strife/a_stalker.cpp b/src/g_strife/a_stalker.cpp index 67cbd328..258cbef3 100644 --- a/src/g_strife/a_stalker.cpp +++ b/src/g_strife/a_stalker.cpp @@ -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); } } } diff --git a/src/gl/scene/gl_decal.cpp b/src/gl/scene/gl_decal.cpp index e689f4d8..a3d13217 100644 --- a/src/gl/scene/gl_decal.cpp +++ b/src/gl/scene/gl_decal.cpp @@ -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(); diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index 0c42f71b..ef0db34a 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -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); diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 5d4ca5c0..4ac79f36 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -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()]; diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index a867c77d..b6bd24ae 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -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); diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index ca0fb7ae..7012248f 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -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; diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index 217b470f..474c29b9 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -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: diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 3ad2770e..b98c1d3c 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -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(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) diff --git a/src/p_local.h b/src/p_local.h index a045f897..eb669072 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -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); diff --git a/src/p_map.cpp b/src/p_map.cpp index 830c7b9d..289f146b 100644 --- a/src/p_map.cpp +++ b/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; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 4198069b..cfb909a0 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -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; diff --git a/src/p_user.cpp b/src/p_user.cpp index 8339262b..d718b084 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -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; iplayer; + 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; } } } diff --git a/src/po_man.cpp b/src/po_man.cpp index 6e301377..3355b6ca 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -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 diff --git a/src/r_things.cpp b/src/r_things.cpp index 386ef813..82edfed7 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -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(); diff --git a/src/svnrevision.h b/src/svnrevision.h index 1f9f2714..84df62bd 100644 --- a/src/svnrevision.h +++ b/src/svnrevision.h @@ -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 diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 597ba48d..efba0cb4 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -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); } } } diff --git a/wadsrc/static/actors/constants.txt b/wadsrc/static/actors/constants.txt index 76166430..a8bcf26b 100644 --- a/wadsrc/static/actors/constants.txt +++ b/wadsrc/static/actors/constants.txt @@ -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; diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 3c017a3f..7d7e1b3e 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -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