From 5af1e6f734b631bca677559324477bf319c1cd1c Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 2 Jul 2013 14:15:08 -0500 Subject: [PATCH 1/3] - Added a compatibility option to fix Super Sonic Doom's first bonus stage leaving you frozen when you finished it. --- src/compatibility.cpp | 1 + src/doomdef.h | 1 + src/p_lnspec.cpp | 5 +++++ wadsrc/static/compatibility.txt | 8 ++++++++ 4 files changed, 15 insertions(+) diff --git a/src/compatibility.cpp b/src/compatibility.cpp index 4a4f19d6b..7bbff7322 100644 --- a/src/compatibility.cpp +++ b/src/compatibility.cpp @@ -105,6 +105,7 @@ static FCompatOption Options[] = { "vileghosts", BCOMPATF_VILEGHOSTS, SLOT_BCOMPAT }, { "ignoreteleporttags", BCOMPATF_BADTELEPORTERS, SLOT_BCOMPAT }, { "rebuildnodes", BCOMPATF_REBUILDNODES, SLOT_BCOMPAT }, + { "linkfrozenprops", BCOMPATF_LINKFROZENPROPS, SLOT_BCOMPAT }, // list copied from g_mapinfo.cpp { "shorttex", COMPATF_SHORTTEX, SLOT_COMPAT }, diff --git a/src/doomdef.h b/src/doomdef.h index 3a3c31e6a..675923b4a 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -349,6 +349,7 @@ enum BCOMPATF_BADTELEPORTERS = 1 << 3, // Ignore tags on Teleport specials BCOMPATF_BADPORTALS = 1 << 4, // Restores the old unstable portal behavior BCOMPATF_REBUILDNODES = 1 << 5, // Force node rebuild + BCOMPATF_LINKFROZENPROPS = 1 << 6, // Clearing PROP_TOTALLYFROZEN or PROP_FROZEN also clears the other }; // phares 3/20/98: diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 67df3def1..a0164ab82 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2813,6 +2813,11 @@ FUNC(LS_SetPlayerProperty) { int i; + if ((ib_compatflags & BCOMPATF_LINKFROZENPROPS) && (mask & (CF_FROZEN | CF_TOTALLYFROZEN))) + { // Clearing one of these properties clears both of them (if the compat flag is set.) + mask = CF_FROZEN | CF_TOTALLYFROZEN; + } + for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i]) diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index a84ba218b..795b9348a 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -353,3 +353,11 @@ F481922F4881F74760F3C0437FD5EDD0 // map03 // make the blue key spawn above the 3D floor setthingz 918 296 } + +64B6CE3CB7349B6F6B1A885C449ACB96 // Super Sonic Doom, map31 +{ + // During the end-of-level tally, both PROP_FROZEN and PROP_TOTALLYFROZEN + // are set, but only PROP_TOTALLYFROZEN is cleared, so PROP_FROZEN is + // still set when returning to the origin map. + linkfrozenprops +} From e845b292c2c148e161785f6938d4470b67cacdf4 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 2 Jul 2013 14:48:03 -0500 Subject: [PATCH 2/3] - Always clear bEvilGrin after checking it in FMugShot::UpdateState(). If it's not an appropriate time to show the grin when the flag is set, it shouldn't be saved until later. --- src/g_shared/sbar_mugshot.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/g_shared/sbar_mugshot.cpp b/src/g_shared/sbar_mugshot.cpp index fcadb0d1b..0849fd354 100644 --- a/src/g_shared/sbar_mugshot.cpp +++ b/src/g_shared/sbar_mugshot.cpp @@ -352,11 +352,8 @@ int FMugShot::UpdateState(player_t *player, StateFlags stateflags) SetState("grin", false); return 0; } - else if (CurrentState == NULL) - { - bEvilGrin = false; - } } + bEvilGrin = false; bool ouch = (!st_oldouch && FaceHealth - player->health > ST_MUCHPAIN) || (st_oldouch && player->health - FaceHealth > ST_MUCHPAIN); if (player->damagecount && From f1dff6c9d3c6c32c3d6721d010b6f1957b121c4e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 2 Jul 2013 22:01:54 +0200 Subject: [PATCH 3/3] - fixed: The new XDeath code forgot to move the assignment of the flags4 variable. Also renamed the variable to avoid conflicts. --- src/p_interaction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index cc4c9aece..43499d353 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -658,7 +658,8 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) FState *diestate = NULL; int gibhealth = GibHealth(); - bool extremelydead = ((health < gibhealth || flags4 & MF4_EXTREMEDEATH) && !(flags4 & MF4_NOEXTREMEDEATH)); + int iflags4 = inflictor == NULL ? 0 : inflictor->flags4; + bool extremelydead = ((health < gibhealth || iflags4 & MF4_EXTREMEDEATH) && !(iflags4 & MF4_NOEXTREMEDEATH)); // Special check for 'extreme' damage type to ensure that it gets recorded properly as an extreme death for subsequent checks. if (DamageType == NAME_Extreme) @@ -703,7 +704,6 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) } if (diestate == NULL) { - int flags4 = inflictor == NULL ? 0 : inflictor->flags4; // Don't pass on a damage type this actor cannot handle. // (most importantly, prevent barrels from passing on ice damage.)