From 5dc42121b7fdd5c78e17edad3e4588111afbd5c7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Jul 2008 12:40:10 +0000 Subject: [PATCH] - Fixed: When Heretic's Mace was replaced by a non-child class A_SpawnMace still treated it as a mace and wrote into some undefined memory. - Fixed: A_BishopMissileWeave didn't initialize special2 for proper movement. - Added a speed parameter to A_SkullAttack. - Fixed: Black as first or only blood color didn't work. - Fixed: Sounds played in wi_stuff.cpp and f_finale.cpp need the CHAN_UI flag. - Fixed: Spawning a player could play the *gasp sound. - Fixed: SBARINFO's health display didn't scale to the proper maximum. - Added Skulltag's Teleport_NoStop action special. SVN r1074 (trunk) --- docs/rh-log.txt | 14 ++++++++ src/actionspecials.h | 1 + src/d_player.h | 2 +- src/f_finale.cpp | 45 +++++++++++++------------- src/g_doom/a_fatso.cpp | 2 +- src/g_doom/a_lostsoul.cpp | 16 ++++++++-- src/g_heretic/a_hereticweaps.cpp | 48 +++++++++++++++++----------- src/g_hexen/a_bishop.cpp | 2 ++ src/g_shared/sbarinfo_display.cpp | 4 +-- src/p_lnspec.cpp | 6 ++++ src/p_mobj.cpp | 2 +- src/p_spec.h | 4 +-- src/p_teleport.cpp | 15 +++++---- src/p_user.cpp | 4 +-- src/s_sound.cpp | 2 +- src/thingdef/thingdef_properties.cpp | 7 ++++ src/wi_stuff.cpp | 48 ++++++++++++++-------------- src/zstring.h | 3 ++ wadsrc/decorate/nativeclasses.txt | 2 +- 19 files changed, 143 insertions(+), 84 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 4f02a7fa1..ecc101c8a 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,17 @@ +July 19, 2008 (Changes by Graf Zahl) +- Fixed: When Heretic's Mace was replaced by a non-child class A_SpawnMace still + treated it as a mace and wrote into some undefined memory. +- Fixed: A_BishopMissileWeave didn't initialize special2 for proper movement. +- Added a speed parameter to A_SkullAttack. +- Fixed: Black as first or only blood color didn't work. +- Fixed: Sounds played in wi_stuff.cpp and f_finale.cpp need the CHAN_UI flag. +- Fixed: Spawning a player could play the *gasp sound. +- Fixed: SBARINFO's health display didn't scale to the proper maximum. + +July 18, 2008 (Changes by Graf Zahl) +- Added const char &operator[] (unsigned int index) to FString class. +- Added Skulltag's Teleport_NoStop action special. + July 15, 2008 (Changes by Graf Zahl) - Fixed: Strife's EntityBoss didn't copy friendliness information to the sub-entities. diff --git a/src/actionspecials.h b/src/actionspecials.h index 5f0e0ffd6..d38a3c862 100644 --- a/src/actionspecials.h +++ b/src/actionspecials.h @@ -131,6 +131,7 @@ DEFINE_SPECIAL(Floor_Waggle, 138, 5, 5) DEFINE_SPECIAL(Thing_SpawnFacing, 139, 2, 4) DEFINE_SPECIAL(Sector_ChangeSound, 140, 2, 2) +DEFINE_SPECIAL(Teleport_NoStop, 154, 2, 3) // GZDoom/Vavoom specials // Although ZDoom doesn't support them it's better to have them defined so that // WADs using them somewhere can at least be started without aborting due diff --git a/src/d_player.h b/src/d_player.h index effeea577..a29e7eeb6 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -126,7 +126,7 @@ public: float BlueDamageFade; bool UpdateWaterLevel (fixed_t oldz, bool splash); - bool ResetAirSupply (); + bool ResetAirSupply (bool playgasp = true); int GetMaxHealth() const; }; diff --git a/src/f_finale.cpp b/src/f_finale.cpp index d83c59385..0275dcd21 100644 --- a/src/f_finale.cpp +++ b/src/f_finale.cpp @@ -620,7 +620,7 @@ void F_CastTicker (void) castnum = 0; if (castorder[castnum].info->SeeSound) { - S_Sound (CHAN_VOICE, castorder[castnum].info->SeeSound, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, castorder[castnum].info->SeeSound, 1, ATTN_NONE); } caststate = castorder[castnum].info->SeeState; // [RH] Skip monsters that have been hacked to no longer have attack states @@ -655,7 +655,7 @@ void F_CastTicker (void) if (atkstates[i].match == caststate) { S_StopAllChannels (); - S_Sound (CHAN_WEAPON, atkstates[i].sound, 1, ATTN_NONE); + S_Sound (CHAN_WEAPON | CHAN_UI, atkstates[i].sound, 1, ATTN_NONE); break; } } @@ -732,11 +732,12 @@ bool F_CastResponder (event_t* ev) castattacking = false; if (castnum == 16) { - S_Sound (players[consoleplayer].mo, CHAN_VOICE, "*death", 1, ATTN_NONE); + int snd = S_FindSkinnedSound(players[consoleplayer].mo, "*death"); + if (snd != 0) S_Sound (CHAN_VOICE | CHAN_UI, snd, 1, ATTN_NONE); } else if (castorder[castnum].info->DeathSound) { - S_Sound (CHAN_VOICE, castorder[castnum].info->DeathSound, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, castorder[castnum].info->DeathSound, 1, ATTN_NONE); } } @@ -992,7 +993,7 @@ void F_BunnyScroll (void) stage = 6; if (stage > laststage) { - S_Sound (CHAN_WEAPON, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_WEAPON | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); laststage = stage; } @@ -1074,28 +1075,28 @@ void F_AdvanceSlideshow () // Macil's speech on map 3 about the Programmer. case 1: FinaleFlat = "SS2F1"; - S_Sound (CHAN_VOICE, "svox/mac10", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac10", 1, ATTN_NORM); FinalePart = 2; FinaleEndCount = 9 * TICRATE; break; case 2: FinaleFlat = "SS2F2"; - S_Sound (CHAN_VOICE, "svox/mac11", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac11", 1, ATTN_NORM); FinalePart = 3; FinaleEndCount = 10 * TICRATE; break; case 3: FinaleFlat = "SS2F3"; - S_Sound (CHAN_VOICE, "svox/mac12", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac12", 1, ATTN_NORM); FinalePart = 4; FinaleEndCount = 12 * TICRATE; break; case 4: FinaleFlat = "SS2F4"; - S_Sound (CHAN_VOICE, "svox/mac13", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac13", 1, ATTN_NORM); FinalePart = -99; FinaleEndCount = 17 * TICRATE; break; @@ -1103,28 +1104,28 @@ void F_AdvanceSlideshow () // Macil's speech on map 10 about the Sigil. case 5: FinaleFlat = "SS3F1"; - S_Sound (CHAN_VOICE, "svox/mac16", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac16", 1, ATTN_NORM); FinalePart = 6; FinaleEndCount = 10 * TICRATE; break; case 6: FinaleFlat = "SS3F2"; - S_Sound (CHAN_VOICE, "svox/mac17", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac17", 1, ATTN_NORM); FinalePart = 7; FinaleEndCount = 12 * TICRATE; break; case 7: FinaleFlat = "SS3F3"; - S_Sound (CHAN_VOICE, "svox/mac18", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac18", 1, ATTN_NORM); FinalePart = 8; FinaleEndCount = 12 * TICRATE; break; case 8: FinaleFlat = "SS3F4"; - S_Sound (CHAN_VOICE, "svox/mac19", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/mac19", 1, ATTN_NORM); FinaleEndCount = 11 * TICRATE; FinalePart = -99; break; @@ -1133,21 +1134,21 @@ void F_AdvanceSlideshow () case 10: FinaleFlat = "SS4F1"; S_StartMusic ("D_HAPPY"); - S_Sound (CHAN_VOICE, "svox/rie01", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/rie01", 1, ATTN_NORM); FinaleEndCount = 13 * TICRATE; FinalePart = 11; break; case 11: FinaleFlat = "SS4F2"; - S_Sound (CHAN_VOICE, "svox/bbx01", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/bbx01", 1, ATTN_NORM); FinaleEndCount = 11 * TICRATE; FinalePart = 12; break; case 12: FinaleFlat = "SS4F3"; - S_Sound (CHAN_VOICE, "svox/bbx02", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/bbx02", 1, ATTN_NORM); FinaleEndCount = 14 * TICRATE; FinalePart = 13; break; @@ -1162,21 +1163,21 @@ void F_AdvanceSlideshow () case 14: S_StartMusic ("D_SAD"); FinaleFlat = "SS5F1"; - S_Sound (CHAN_VOICE, "svox/ss501b", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss501b", 1, ATTN_NORM); FinalePart = 15; FinaleEndCount = 11 * TICRATE; break; case 15: FinaleFlat = "SS5F2"; - S_Sound (CHAN_VOICE, "svox/ss502b", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss502b", 1, ATTN_NORM); FinalePart = 16; FinaleEndCount = 10 * TICRATE; break; case 16: FinaleFlat = "SS5F3"; - S_Sound (CHAN_VOICE, "svox/ss503b", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss503b", 1, ATTN_NORM); FinalePart = -1; FinaleEndCount = 11 * TICRATE; break; @@ -1185,21 +1186,21 @@ void F_AdvanceSlideshow () case 17: S_StartMusic ("D_END"); FinaleFlat = "SS6F1"; - S_Sound (CHAN_VOICE, "svox/ss601a", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss601a", 1, ATTN_NORM); FinaleEndCount = 8 * TICRATE; FinalePart = 18; break; case 18: FinaleFlat = "SS6F2"; - S_Sound (CHAN_VOICE, "svox/ss602a", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss602a", 1, ATTN_NORM); FinalePart = 19; FinaleEndCount = 8 * TICRATE; break; case 19: FinaleFlat = "SS6F3"; - S_Sound (CHAN_VOICE, "svox/ss603a", 1, ATTN_NORM); + S_Sound (CHAN_VOICE | CHAN_UI, "svox/ss603a", 1, ATTN_NORM); FinalePart = -1; FinaleEndCount = 9 * TICRATE; break; diff --git a/src/g_doom/a_fatso.cpp b/src/g_doom/a_fatso.cpp index b5e686f46..b98d0eea4 100644 --- a/src/g_doom/a_fatso.cpp +++ b/src/g_doom/a_fatso.cpp @@ -121,7 +121,7 @@ void A_Mushroom (AActor *actor) int i, j, n = actor->GetMissileDamage (0, 1); const PClass *spawntype = NULL; - int index = CheckIndex (1, NULL); + int index = CheckIndex (2, NULL); if (index >= 0) { spawntype = PClass::FindClass((ENamedName)StateParameters[index]); diff --git a/src/g_doom/a_lostsoul.cpp b/src/g_doom/a_lostsoul.cpp index 3782a4347..2ccb882bb 100644 --- a/src/g_doom/a_lostsoul.cpp +++ b/src/g_doom/a_lostsoul.cpp @@ -9,6 +9,7 @@ #include "gi.h" #include "gstrings.h" #include "a_action.h" +#include "thingdef/thingdef.h" FRandom pr_lost ("LostMissileRange"); @@ -23,20 +24,29 @@ void A_SkullAttack (AActor *self) AActor *dest; angle_t an; int dist; + int n; if (!self->target) return; + int index = CheckIndex (1, NULL); + if (index >= 0) + { + n = FLOAT2FIXED(EvalExpressionF (StateParameters[index], self)); + if (n == 0) n = SKULLSPEED; + } + else n = SKULLSPEED; + dest = self->target; self->flags |= MF_SKULLFLY; S_Sound (self, CHAN_VOICE, self->AttackSound, 1, ATTN_NORM); A_FaceTarget (self); an = self->angle >> ANGLETOFINESHIFT; - self->momx = FixedMul (SKULLSPEED, finecosine[an]); - self->momy = FixedMul (SKULLSPEED, finesine[an]); + self->momx = FixedMul (n, finecosine[an]); + self->momy = FixedMul (n, finesine[an]); dist = P_AproxDistance (dest->x - self->x, dest->y - self->y); - dist = dist / SKULLSPEED; + dist = dist / n; if (dist < 1) dist = 1; diff --git a/src/g_heretic/a_hereticweaps.cpp b/src/g_heretic/a_hereticweaps.cpp index 15dedaa66..fd2ed7e82 100644 --- a/src/g_heretic/a_hereticweaps.cpp +++ b/src/g_heretic/a_hereticweaps.cpp @@ -1045,6 +1045,26 @@ IMPLEMENT_ACTOR (AMaceSpawner, Heretic, 2002, 0) PROP_SpawnState (0) END_DEFAULTS + +static bool RespawnMace (AActor *mace, AActor *FirstSpot, int NumMaceSpots) +{ + if (NumMaceSpots > 0) + { + int spotnum = pr_macerespawn () % NumMaceSpots; + AActor *spot = FirstSpot; + + while (spotnum > 0) + { + spot = spot->target; + spotnum--; + } + + mace->SetOrigin (spot->x, spot->y, spot->z); + mace->z = mace->floorz; + } + return true; +} + // Every mace spawn spot will execute this action. The first one // will build a list of all mace spots in the level and spawn a // mace. The rest of the spots will do nothing. @@ -1086,11 +1106,17 @@ void A_SpawnMace (AActor *self) return; } mace = Spawn (self->x, self->y, self->z, ALLOW_REPLACE); + if (mace) { - mace->FirstSpot = firstSpot; - mace->NumMaceSpots = numspots; - mace->DoRespawn (); + if (mace->IsKindOf(RUNTIME_CLASS(AMace))) + { + // remember the values for later + // (works only for the original mace!) + mace->FirstSpot = firstSpot; + mace->NumMaceSpots = numspots; + } + RespawnMace(mace, firstSpot, numspots); // We want this mace to respawn. mace->flags &= ~MF_DROPPED; } @@ -1101,21 +1127,7 @@ void A_SpawnMace (AActor *self) bool AMace::DoRespawn () { - if (NumMaceSpots > 0) - { - int spotnum = pr_macerespawn () % NumMaceSpots; - AActor *spot = FirstSpot; - - while (spotnum > 0) - { - spot = spot->target; - spotnum--; - } - - SetOrigin (spot->x, spot->y, spot->z); - z = floorz; - } - return true; + return RespawnMace(this, FirstSpot, NumMaceSpots); } //---------------------------------------------------------------------------- diff --git a/src/g_hexen/a_bishop.cpp b/src/g_hexen/a_bishop.cpp index 081cd1ef5..7cb0d37f3 100644 --- a/src/g_hexen/a_bishop.cpp +++ b/src/g_hexen/a_bishop.cpp @@ -285,6 +285,8 @@ void A_BishopMissileWeave (AActor *actor) int weaveXY, weaveZ; int angle; + if (actor->special2 == 0) actor->special2 = 16; + weaveXY = actor->special2 >> 16; weaveZ = actor->special2 & 0xFFFF; angle = (actor->angle + ANG90) >> ANGLETOFINESHIFT; diff --git a/src/g_shared/sbarinfo_display.cpp b/src/g_shared/sbarinfo_display.cpp index 8027ca1a3..1ed31187d 100644 --- a/src/g_shared/sbarinfo_display.cpp +++ b/src/g_shared/sbarinfo_display.cpp @@ -698,7 +698,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a } else //default to the class's health { - max = CPlayer->mo->GetDefault()->health; + max = CPlayer->mo->GetMaxHealth() + CPlayer->stamina; } } else if(cmd.flags == DRAWNUMBER_ARMOR) @@ -938,7 +938,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a case SBARINFO_DRAWGEM: { int value = (cmd.flags & DRAWGEM_ARMOR) ? armorAmount : health; - int max = 100; + int max = (cmd.flags & DRAWGEM_ARMOR) ? 100 : CPlayer->mo->GetMaxHealth() + CPlayer->stamina; bool wiggle = false; bool translate = !!(cmd.flags & DRAWGEM_TRANSLATABLE); if(max != 0 || value < 0) diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 67d42edd9..a1d1bfbe8 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -784,6 +784,12 @@ FUNC(LS_Teleport) return EV_Teleport (arg0, arg1, ln, backSide, it, true, !arg2, false); } +FUNC( LS_Teleport_NoStop ) +// Teleport_NoStop (tid, sectortag, bNoSourceFog) +{ + return EV_Teleport( arg0, arg1, ln, backSide, it, true, !arg2, false, false ); +} + FUNC(LS_Teleport_NoFog) // Teleport_NoFog (tid, useang, sectortag) { diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 1d81916d5..52ebae852 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3611,7 +3611,7 @@ APlayerPawn *P_SpawnPlayer (FMapThing *mthing, bool tempplayer) p->multicount = 0; p->lastkilltime = 0; p->BlendR = p->BlendG = p->BlendB = p->BlendA = 0.f; - p->mo->ResetAirSupply(); + p->mo->ResetAirSupply(false); p->Uncrouch(); p->momx = p->momy = 0; // killough 10/98: initialize bobbing to 0. diff --git a/src/p_spec.h b/src/p_spec.h index 751b8f79e..8b5910627 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -957,8 +957,8 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag); // // P_TELEPT // -bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, bool useFog, bool sourceFog, bool keepOrientation); -bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, bool fog, bool sourceFog, bool keepOrientation); +bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, bool useFog, bool sourceFog, bool keepOrientation, bool haltMomentum = true); +bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, bool fog, bool sourceFog, bool keepOrientation, bool haltMomentum = true); bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBOOL reverse); bool EV_TeleportOther (int other_tid, int dest_tid, bool fog); bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog); diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 666fc3f98..bc85782a8 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -207,7 +207,7 @@ void P_SpawnTeleportFog(fixed_t x, fixed_t y, fixed_t z, int spawnid) // bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, - bool useFog, bool sourceFog, bool keepOrientation) + bool useFog, bool sourceFog, bool keepOrientation, bool bHaltMomentum) { fixed_t oldx; fixed_t oldy; @@ -299,11 +299,13 @@ bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, if (thing->player) { // [RH] Zoom player's field of vision - if (telezoom && thing->player->mo == thing) + // [BC] && bHaltMomentum. + if (telezoom && thing->player->mo == thing && bHaltMomentum) thing->player->FOV = MIN (175.f, thing->player->DesiredFOV + 45.f); } } - if (thing->player && (useFog || !keepOrientation)) + // [BC] && bHaltMomentum. + if (thing->player && (useFog || !keepOrientation) && bHaltMomentum) { // Freeze player for about .5 sec if (thing->Inventory == NULL || thing->Inventory->GetSpeedFactor() <= FRACUNIT) @@ -315,7 +317,8 @@ bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, thing->momx = FixedMul (thing->Speed, finecosine[angle]); thing->momy = FixedMul (thing->Speed, finesine[angle]); } - else if (!keepOrientation) // no fog doesn't alter the player's momentum + // [BC] && bHaltMomentum. + else if (!keepOrientation && bHaltMomentum) // no fog doesn't alter the player's momentum { thing->momx = thing->momy = thing->momz = 0; // killough 10/98: kill all bobbing momentum too @@ -417,7 +420,7 @@ static AActor *SelectTeleDest (int tid, int tag) } bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, bool fog, - bool sourceFog, bool keepOrientation) + bool sourceFog, bool keepOrientation, bool haltMomentum) { AActor *searcher; fixed_t z; @@ -469,7 +472,7 @@ bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, bool { z = ONFLOORZ; } - if (P_Teleport (thing, searcher->x, searcher->y, z, searcher->angle, fog, sourceFog, keepOrientation)) + if (P_Teleport (thing, searcher->x, searcher->y, z, searcher->angle, fog, sourceFog, keepOrientation, haltMomentum)) { // [RH] Lee Killough's changes for silent teleporters from BOOM if (!fog && line && keepOrientation) diff --git a/src/p_user.cpp b/src/p_user.cpp index 2766d0741..52cbf2372 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -920,11 +920,11 @@ bool APlayerPawn::UpdateWaterLevel (fixed_t oldz, bool splash) // //=========================================================================== -bool APlayerPawn::ResetAirSupply () +bool APlayerPawn::ResetAirSupply (bool playgasp) { bool wasdrowning = (player->air_finished < level.time); - if (wasdrowning) + if (playgasp && wasdrowning) { S_Sound (this, CHAN_VOICE, "*gasp", 1, ATTN_NORM); } diff --git a/src/s_sound.cpp b/src/s_sound.cpp index e8f09b405..327e839fe 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -2035,7 +2035,7 @@ CCMD (playsound) { if (argv.argc() > 1) { - S_Sound (CHAN_AUTO, argv[1], 1.f, ATTN_NONE); + S_Sound (CHAN_AUTO | CHAN_UI, argv[1], 1.f, ATTN_NONE); } } diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index 65499ccfc..ff9b63db9 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1537,6 +1537,13 @@ static void ActorBloodColor (FScanner &sc, AActor *defaults, Baggage &bag) } PalEntry pe = MAKERGB(r,g,b); pe.a = CreateBloodTranslation(sc, pe); + if (DWORD(pe) == 0) + { + // If black is the first color being created it will create a value of 0 + // which stands for 'no translation' + // Using (1,1,1) instead of (0,0,0) won't be noticable. + pe = MAKERGB(1,1,1); + } bag.Info->Class->Meta.SetMetaInt (AMETA_BloodColor, pe); } diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index e710c4971..c0ffc559f 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -1202,7 +1202,7 @@ void WI_updateDeathmatchStats () } } - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); */ dm_state = 4; } @@ -1212,7 +1212,7 @@ void WI_updateDeathmatchStats () { /* if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); stillticking = false; @@ -1251,7 +1251,7 @@ void WI_updateDeathmatchStats () } if (!stillticking) { - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); dm_state++; } */ @@ -1261,7 +1261,7 @@ void WI_updateDeathmatchStats () { if (acceleratestage) { - S_Sound (CHAN_VOICE, "players/male/gibbed", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "players/male/gibbed", 1, ATTN_NONE); if (gamemode == commercial) WI_initNoState(); @@ -1423,14 +1423,14 @@ void WI_updateNetgameStats () if (dofrags) cnt_frags[i] = WI_fragSum (i); } - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); ng_state = 10; } if (ng_state == 2) { if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); stillticking = false; @@ -1449,14 +1449,14 @@ void WI_updateNetgameStats () if (!stillticking) { - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); ng_state++; } } else if (ng_state == 4) { if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); stillticking = false; @@ -1473,14 +1473,14 @@ void WI_updateNetgameStats () } if (!stillticking) { - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); ng_state++; } } else if (ng_state == 6) { if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); stillticking = false; @@ -1499,14 +1499,14 @@ void WI_updateNetgameStats () if (!stillticking) { - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); ng_state += 1 + 2*!dofrags; } } else if (ng_state == 8) { if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); stillticking = false; @@ -1525,7 +1525,7 @@ void WI_updateNetgameStats () if (!stillticking) { - S_Sound (CHAN_VOICE, "player/male/death1", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "player/male/death1", 1, ATTN_NONE); ng_state++; } } @@ -1533,7 +1533,7 @@ void WI_updateNetgameStats () { if (acceleratestage) { - S_Sound (CHAN_VOICE, PASTSTATS, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, PASTSTATS, 1, ATTN_NONE); WI_initShowNextLoc(); } } @@ -1682,7 +1682,7 @@ void WI_updateStats () { acceleratestage = 0; sp_state = 10; - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); } cnt_kills[0] = plrs[me].skills; cnt_items[0] = plrs[me].sitems; @@ -1699,12 +1699,12 @@ void WI_updateStats () cnt_kills[0] += 2; if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); } if (cnt_kills[0] >= plrs[me].skills) { cnt_kills[0] = plrs[me].skills; - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); sp_state++; } } @@ -1715,12 +1715,12 @@ void WI_updateStats () cnt_items[0] += 2; if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); } if (cnt_items[0] >= plrs[me].sitems) { cnt_items[0] = plrs[me].sitems; - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); sp_state++; } } @@ -1731,12 +1731,12 @@ void WI_updateStats () cnt_secret[0] += 2; if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); } if (cnt_secret[0] >= plrs[me].ssecret) { cnt_secret[0] = plrs[me].ssecret; - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); sp_state++; } } @@ -1745,7 +1745,7 @@ void WI_updateStats () if (gameinfo.gametype == GAME_Doom) { if (!(bcnt&3)) - S_Sound (CHAN_VOICE, "weapons/pistol", 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); cnt_time += 3; cnt_par += 3; @@ -1765,7 +1765,7 @@ void WI_updateStats () if (cnt_time >= plrs[me].stime / TICRATE) { cnt_total_time = wbs->totaltime / TICRATE; - S_Sound (CHAN_VOICE, NEXTSTAGE, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, NEXTSTAGE, 1, ATTN_NONE); sp_state++; } } @@ -1774,7 +1774,7 @@ void WI_updateStats () { if (acceleratestage) { - S_Sound (CHAN_VOICE, PASTSTATS, 1, ATTN_NONE); + S_Sound (CHAN_VOICE | CHAN_UI, PASTSTATS, 1, ATTN_NONE); WI_initShowNextLoc(); } } diff --git a/src/zstring.h b/src/zstring.h index cfef8c2cc..ebfb357bb 100644 --- a/src/zstring.h +++ b/src/zstring.h @@ -140,6 +140,9 @@ public: const char *GetChars() const { return Chars; } const char &operator[] (int index) const { return Chars[index]; } +#if SIZE_MAX != UINT_MAX + const char &operator[] (unsigned int index) const { return Chars[index]; } +#endif const char &operator[] (size_t index) const { return Chars[index]; } FString &operator = (const FString &other); diff --git a/wadsrc/decorate/nativeclasses.txt b/wadsrc/decorate/nativeclasses.txt index d44760b56..baab541e4 100644 --- a/wadsrc/decorate/nativeclasses.txt +++ b/wadsrc/decorate/nativeclasses.txt @@ -35,7 +35,7 @@ class Actor extends Thinker action native A_SargAttack(); action native A_HeadAttack(); action native A_BruisAttack(); - action native A_SkullAttack(); + action native A_SkullAttack(optional eval float speed); action native A_Metal(); action native A_SpidRefire(); action native A_BabyMetal();