From 580094a7924ea586bc0c789e55d51aa3dc3f2287 Mon Sep 17 00:00:00 2001 From: Gaerzi Date: Thu, 10 Apr 2014 12:32:23 +0200 Subject: [PATCH 1/4] More editing flags PSX-inspired flags to change the render styles of monsters (and other things). --- src/doomdata.h | 12 +++++++++++- src/namedef.h | 5 +++++ src/p_mobj.cpp | 22 ++++++++++++++++++++++ src/p_udmf.cpp | 35 +++++++++++++++++++++++++++++++++++ src/p_xlat.cpp | 3 +++ wadsrc/static/xlat/defines.i | 3 ++- wadsrc/static/xlat/strife.txt | 1 + 7 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/doomdata.h b/src/doomdata.h index 55903170a7..8ba831082c 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -192,9 +192,10 @@ enum EMapLineFlags // These are flags that use different values internally ML_RESERVED_ETERNITY = 0x0800, // [RH] Extra flags for Strife - ML_TRANSLUCENT_STRIFE = 0x1000, ML_RAILING_STRIFE = 0x0200, ML_BLOCK_FLOATERS_STRIFE = 0x0400, + ML_TRANSPARENT_STRIFE = 0x0800, + ML_TRANSLUCENT_STRIFE = 0x1000, }; @@ -385,6 +386,15 @@ enum EMapThingFlags MTF_SECRET = 0x080000, // Secret pickup MTF_NOINFIGHTING = 0x100000, + + // PSX Doom and Doom 64 effects + + MTF_TRANS = 0x200000, // 50% alpha + MTF_ADD = 0x400000, // 100% additive + MTF_SUBTRACT = 0x800000, // 100% subtractive + MTF_SPECTRE = 0x1000000, // 25% additive + MTF_DOUBLEHEALTH = 0x2000000, // Double hit points + // BOOM and DOOM compatible versions of some of the above BTF_NOTSINGLE = 0x0010, // (TF_COOPERATIVE|TF_DEATHMATCH) diff --git a/src/namedef.h b/src/namedef.h index 644d0deb4b..50853f7cea 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -373,6 +373,11 @@ xx(Friend) xx(Strifeally) xx(Standing) xx(Countsecret) +//xx(Transparent) defined below for linedefs +//xx(Additive) already defined for invisibility types +xx(Subtractive) +xx(Spectre) +xx(Doublehealth) xx(Blocking) xx(Blockmonsters) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index eb214279d8..2bf242cd2e 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4022,6 +4022,24 @@ void AActor::HandleSpawnFlags () RenderStyle = STYLE_Translucent; alpha = TRANSLUC25; } + else if (SpawnFlags & MTF_TRANS) + { + RenderStyle = STYLE_Translucent; + alpha = TRANSLUC50; + } + else if (SpawnFlags & MTF_ADD) + { + RenderStyle = STYLE_Add; + } + else if (SpawnFlags & MTF_SUBTRACT) + { + RenderStyle = STYLE_Subtract; + } + else if (SpawnFlags & MTF_SPECTRE) + { + RenderStyle = STYLE_Add; + alpha = TRANSLUC25; + } else if (SpawnFlags & MTF_ALTSHADOW) { RenderStyle = STYLE_None; @@ -4035,6 +4053,10 @@ void AActor::HandleSpawnFlags () level.total_secrets++; } } + if (SpawnFlags & MTF_DOUBLEHEALTH) + { + health *= 2; + } } void AActor::BeginPlay () diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index fc5964737d..bc58aaef79 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -632,6 +632,31 @@ public: Flag(th->flags, MTF_SECRET, key); break; + case NAME_Transparent: + CHECK_N(Zd | Zdt) + Flag(th->flags, MTF_TRANS, key); + break; + + case NAME_Additive: + CHECK_N(Zd | Zdt) + Flag(th->flags, MTF_ADD, key); + break; + + case NAME_Subtractive: + CHECK_N(Zd | Zdt) + Flag(th->flags, MTF_SUBTRACT, key); + break; + + case NAME_Spectre: + CHECK_N(Zd | Zdt) + Flag(th->flags, MTF_SPECTRE, key); + break; + + case NAME_Doublehealth: + CHECK_N(Zd | Zdt) + Flag(th->flags, MTF_DOUBLEHEALTH, key); + break; + default: if (0 == strnicmp("user_", key.GetChars(), 5)) { // Custom user key - Sets an actor's user variable directly @@ -686,6 +711,7 @@ public: { bool passuse = false; bool strifetrans = false; + bool strifetrans2 = false; FString arg0str, arg1str; memset(ld, 0, sizeof(*ld)); @@ -803,6 +829,11 @@ public: strifetrans = CheckBool(key); continue; + case NAME_Transparent: + CHECK_N(St | Zd | Zdt | Va) + strifetrans2 = CheckBool(key); + continue; + case NAME_Passuse: CHECK_N(Dm | Zd | Zdt | Va) passuse = CheckBool(key); @@ -965,6 +996,10 @@ public: { ld->Alpha = FRACUNIT * 3/4; } + if (strifetrans2 && ld->Alpha == FRACUNIT) + { + ld->Alpha = FRACUNIT * 1/4; + } if (ld->sidedef[0] == NULL) { ld->sidedef[0] = (side_t*)(intptr_t)(1); diff --git a/src/p_xlat.cpp b/src/p_xlat.cpp index 7ece27ae84..be2d154c38 100644 --- a/src/p_xlat.cpp +++ b/src/p_xlat.cpp @@ -89,6 +89,9 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld) case -2: ld->Alpha = FRACUNIT*3/4; break; + case -3: + ld->Alpha = FRACUNIT / 4; + break; default: newflags |= LineFlagTranslations[i].newvalue; break; diff --git a/wadsrc/static/xlat/defines.i b/wadsrc/static/xlat/defines.i index 60d582f708..0acc2465e5 100644 --- a/wadsrc/static/xlat/defines.i +++ b/wadsrc/static/xlat/defines.i @@ -239,5 +239,6 @@ enum // ML_PASSTHROUGH = -1, - ML_TRANSLUCENT = -2 + ML_TRANSLUCENT = -2, + ML_TRANSPARENT = -3, } \ No newline at end of file diff --git a/wadsrc/static/xlat/strife.txt b/wadsrc/static/xlat/strife.txt index 710fa1fad9..159933c801 100644 --- a/wadsrc/static/xlat/strife.txt +++ b/wadsrc/static/xlat/strife.txt @@ -363,5 +363,6 @@ lineflag 7 = ML_DONTDRAW; lineflag 8 = ML_MAPPED; lineflag 9 = ML_RAILING; lineflag 10 = ML_BLOCK_FLOATERS; +lineflag 11 = ML_TRANSPARENT; lineflag 12 = ML_TRANSLUCENT; From 4cac599b8899abd3385eeef4bece05c619d8aedc Mon Sep 17 00:00:00 2001 From: Gaerzi Date: Fri, 11 Apr 2014 00:58:59 +0200 Subject: [PATCH 2/4] Less flags, more generic properties --- src/actor.h | 1 + src/doomdata.h | 17 ++++----- src/namedef.h | 22 +++++++++--- src/p_enemy.cpp | 2 +- src/p_mobj.cpp | 70 ++++++++++++++++++++++--------------- src/p_udmf.cpp | 91 +++++++++++++++++++++++++++++++++++++++++-------- src/version.h | 2 +- 7 files changed, 147 insertions(+), 58 deletions(-) diff --git a/src/actor.h b/src/actor.h index f8b583101c..d3cba00411 100644 --- a/src/actor.h +++ b/src/actor.h @@ -873,6 +873,7 @@ public: TObjPtr LastLookActor; // Actor last looked for (if TIDtoHate != 0) fixed_t SpawnPoint[3]; // For nightmare respawn WORD SpawnAngle; + int StartHealth; BYTE WeaveIndexXY; // Separated from special2 because it's used by globally accessible functions. BYTE WeaveIndexZ; int skillrespawncount; diff --git a/src/doomdata.h b/src/doomdata.h index 8ba831082c..9cedf8cdc4 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -345,6 +345,15 @@ struct FMapThing int args[5]; int Conversation; fixed_t gravity; + fixed_t alpha; + DWORD fillcolor; + fixed_t scaleX; + fixed_t scaleY; + int health; + int score; + short pitch; + short roll; + DWORD RenderStyle; void Serialize (FArchive &); }; @@ -387,14 +396,6 @@ enum EMapThingFlags MTF_SECRET = 0x080000, // Secret pickup MTF_NOINFIGHTING = 0x100000, - // PSX Doom and Doom 64 effects - - MTF_TRANS = 0x200000, // 50% alpha - MTF_ADD = 0x400000, // 100% additive - MTF_SUBTRACT = 0x800000, // 100% subtractive - MTF_SPECTRE = 0x1000000, // 25% additive - MTF_DOUBLEHEALTH = 0x2000000, // Double hit points - // BOOM and DOOM compatible versions of some of the above BTF_NOTSINGLE = 0x0010, // (TF_COOPERATIVE|TF_DEATHMATCH) diff --git a/src/namedef.h b/src/namedef.h index 50853f7cea..017f299325 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -31,6 +31,18 @@ xx(Fuzzy) xx(Opaque) xx(Stencil) +// Render styles +xx(Normal) +xx(SoulTrans) +xx(OptFuzzy) +xx(Add) +xx(Shaded) +xx(TranslucentStencil) +xx(Shadow) +xx(Subtract) +xx(Subtractive) +xx(FillColor) + // Healingradius types xx(Mana) xx(Armor) @@ -373,11 +385,11 @@ xx(Friend) xx(Strifeally) xx(Standing) xx(Countsecret) -//xx(Transparent) defined below for linedefs -//xx(Additive) already defined for invisibility types -xx(Subtractive) -xx(Spectre) -xx(Doublehealth) +xx(Score) +xx(Roll) +xx(Scale) +xx(ScaleX) +xx(ScaleY) xx(Blocking) xx(Blockmonsters) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index df16988377..39cd0813cf 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -2648,7 +2648,7 @@ static bool P_CheckForResurrection(AActor *self, bool usevilestates) corpsehit->flags5 = info->flags5; corpsehit->flags6 = info->flags6; corpsehit->flags7 = info->flags7; - corpsehit->health = info->health; + corpsehit->health = corpsehit->SpawnHealth(); corpsehit->target = NULL; corpsehit->lastenemy = NULL; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 2bf242cd2e..291f51a946 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -219,8 +219,12 @@ void AActor::Serialize (FArchive &arc) << threshold << player << SpawnPoint[0] << SpawnPoint[1] << SpawnPoint[2] - << SpawnAngle - << skillrespawncount + << SpawnAngle; + if (SaveVersion >= 4506) + { + arc << StartHealth; + } + arc << skillrespawncount << tracer << floorclip << tid @@ -4022,24 +4026,6 @@ void AActor::HandleSpawnFlags () RenderStyle = STYLE_Translucent; alpha = TRANSLUC25; } - else if (SpawnFlags & MTF_TRANS) - { - RenderStyle = STYLE_Translucent; - alpha = TRANSLUC50; - } - else if (SpawnFlags & MTF_ADD) - { - RenderStyle = STYLE_Add; - } - else if (SpawnFlags & MTF_SUBTRACT) - { - RenderStyle = STYLE_Subtract; - } - else if (SpawnFlags & MTF_SPECTRE) - { - RenderStyle = STYLE_Add; - alpha = TRANSLUC25; - } else if (SpawnFlags & MTF_ALTSHADOW) { RenderStyle = STYLE_None; @@ -4053,10 +4039,6 @@ void AActor::HandleSpawnFlags () level.total_secrets++; } } - if (SpawnFlags & MTF_DOUBLEHEALTH) - { - health *= 2; - } } void AActor::BeginPlay () @@ -4811,11 +4793,42 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) } } + // Set various UDMF options + if (mthing->alpha != -1) + { + DPrintf("Setting alpha to %f", FIXED2FLOAT(mthing->alpha)); + mobj->alpha = mthing->alpha; + } + if (mthing->RenderStyle != STYLE_Count) + mobj->RenderStyle = (ERenderStyle)mthing->RenderStyle; + if (mthing->scaleX) + mobj->scaleX = FixedMul(mthing->scaleX, mobj->scaleX); + if (mthing->scaleY) + mobj->scaleY = FixedMul(mthing->scaleY, mobj->scaleY); + if (mthing->pitch) + mobj->pitch = ANGLE_1 * mthing->pitch; + if (mthing->roll) + mobj->roll = ANGLE_1 * mthing->roll; + if (mthing->score) + mobj->Score = mthing->score; + if (mthing->fillcolor) + mobj->fillcolor = mthing->fillcolor; + mobj->BeginPlay (); if (!(mobj->ObjectFlags & OF_EuthanizeMe)) { mobj->LevelSpawned (); } + + if (mthing->health > 0) + mobj->health *= mthing->health; + else + mobj->health = -mthing->health; + if (mthing->health == 0) + mobj->Die(NULL, NULL); + else if (mthing->health != 1) + mobj->StartHealth = mobj->health; + return mobj; } @@ -6038,18 +6051,19 @@ void AActor::SetIdle() int AActor::SpawnHealth() { - if (!(flags3 & MF3_ISMONSTER) || GetDefault()->health == 0) + int defhealth = StartHealth ? StartHealth : GetDefault()->health; + if (!(flags3 & MF3_ISMONSTER) || defhealth == 0) { - return GetDefault()->health; + return defhealth; } else if (flags & MF_FRIENDLY) { - int adj = FixedMul(GetDefault()->health, G_SkillProperty(SKILLP_FriendlyHealth)); + int adj = FixedMul(defhealth, G_SkillProperty(SKILLP_FriendlyHealth)); return (adj <= 0) ? 1 : adj; } else { - int adj = FixedMul(GetDefault()->health, G_SkillProperty(SKILLP_MonsterHealth)); + int adj = FixedMul(defhealth, G_SkillProperty(SKILLP_MonsterHealth)); return (adj <= 0) ? 1 : adj; } } diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index bc58aaef79..ae3f94f871 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -476,6 +476,9 @@ public: memset(th, 0, sizeof(*th)); th->gravity = FRACUNIT; + th->RenderStyle = STYLE_Count; + th->alpha = -1; + th->health = 1; sc.MustGetToken('{'); while (!sc.CheckToken('}')) { @@ -632,29 +635,87 @@ public: Flag(th->flags, MTF_SECRET, key); break; - case NAME_Transparent: - CHECK_N(Zd | Zdt) - Flag(th->flags, MTF_TRANS, key); + case NAME_Renderstyle: + { + FName style = CheckString(key); + switch (style) + { + case NAME_None: + th->RenderStyle = STYLE_None; + break; + default: + case NAME_Normal: + th->RenderStyle = STYLE_Normal; + break; + case NAME_Fuzzy: + th->RenderStyle = STYLE_Fuzzy; + break; + case NAME_SoulTrans: + th->RenderStyle = STYLE_SoulTrans; + break; + case NAME_OptFuzzy: + th->RenderStyle = STYLE_OptFuzzy; + break; + case NAME_Stencil: + th->RenderStyle = STYLE_Stencil; + break; + case NAME_Translucent: + th->RenderStyle = STYLE_Translucent; + break; + case NAME_Add: + case NAME_Additive: + th->RenderStyle = STYLE_Add; + break; + case NAME_Shaded: + th->RenderStyle = STYLE_Shaded; + break; + case NAME_TranslucentStencil: + th->RenderStyle = STYLE_TranslucentStencil; + break; + case NAME_Shadow: + th->RenderStyle = STYLE_Shadow; + break; + case NAME_Subtract: + case NAME_Subtractive: + th->RenderStyle = STYLE_Subtract; + break; + } + } break; - case NAME_Additive: - CHECK_N(Zd | Zdt) - Flag(th->flags, MTF_ADD, key); + case NAME_Alpha: + th->alpha = CheckFixed(key); break; - case NAME_Subtractive: - CHECK_N(Zd | Zdt) - Flag(th->flags, MTF_SUBTRACT, key); + case NAME_FillColor: + th->fillcolor = CheckInt(key); + + case NAME_Health: + th->health = CheckInt(key); break; - case NAME_Spectre: - CHECK_N(Zd | Zdt) - Flag(th->flags, MTF_SPECTRE, key); + case NAME_Score: + th->score = CheckInt(key); break; - case NAME_Doublehealth: - CHECK_N(Zd | Zdt) - Flag(th->flags, MTF_DOUBLEHEALTH, key); + case NAME_Pitch: + th->pitch = (short)CheckInt(key); + break; + + case NAME_Roll: + th->roll = (short)CheckInt(key); + break; + + case NAME_ScaleX: + th->scaleX = CheckFixed(key); + break; + + case NAME_ScaleY: + th->scaleY = CheckFixed(key); + break; + + case NAME_Scale: + th->scaleX = th->scaleY = CheckFixed(key); break; default: diff --git a/src/version.h b/src/version.h index 1e328b312f..27bfe10216 100644 --- a/src/version.h +++ b/src/version.h @@ -76,7 +76,7 @@ const char *GetVersionString(); // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4505 +#define SAVEVER 4506 #define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) From 101107b1e5ea3f498747f31291d10694d7dbe09f Mon Sep 17 00:00:00 2001 From: Gaerzi Date: Sat, 12 Apr 2014 10:55:10 +0200 Subject: [PATCH 3/4] Updated documentation --- specs/udmf_zdoom.txt | 20 ++++++++++++++++++++ src/p_udmf.cpp | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 3241bf4c84..d7face6720 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -117,6 +117,8 @@ Note: All fields default to false unless mentioned otherwise. locknumber = ; // Line special is locked arg0str = ; // Alternate string-based version of arg0 + transparent = ; // true = line is a Strife transparent line (alpha 0.25) + * Note about arg0str For lines with ACS specials (80-86 and 226), if arg0str is present and non-null, it @@ -207,6 +209,21 @@ Note: All fields default to false unless mentioned otherwise. arg0str = ; // Alternate string-based version of arg0 gravity = ; // Set per-actor gravity. Positive values are multiplied with the class's property, // negative values are used as their absolute. Default = 1.0. + + health = ; // Set per-actor health. Positive values are multiplied with the class's property, + // negative values are used as their absolute. Default = 1. + + renderstyle = ; // Set per-actor render style, overriding the class default. Possible values can be "normal", + // "none", "add" or "additive", "subtract" or "subtractive", "stencil", "translucentstencil", + // "translucent", "fuzzy", "optfuzzy", "soultrans". Default is an empty string for no change. + fillcolor = ; // Fill color used by the "stencil" and "translucentstencil" rendestyles, as RRGGBB value, default = 0x000000. + alpha = ; // Translucency of this actor (if applicable to renderstyle), default is 1.0. + score = ; // Score value of this actor, overriding the class default if not null. Default = 0. + pitch = ; // Pitch of thing in degrees. Default = 0 (horizontal). + roll = ; // Pitch of thing in degrees. Default = 0 (horizontal). + scalex = ; // Vertical scaling on thing. Default = 0 (ignored). + scaley = ; // Horizontal scaling on thing. Default = 0 (ignored). + scale = ; // Vertical and horizontal scaling on thing. Default = 0 (ignored). * Note about arg0str @@ -335,6 +352,9 @@ Added arg0str thing property. 1.21 09.08.2013 Added waterzone sector property. +1.22 12.04.2014 +Added transparent line property (to be folded back to core UDMF standard), and health, score, renderstyle, fillcolor, alpha, scale, scalex, scaley, pitch and roll thing properties. + =============================================================================== EOF =============================================================================== diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index ae3f94f871..6af777b360 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -643,7 +643,6 @@ public: case NAME_None: th->RenderStyle = STYLE_None; break; - default: case NAME_Normal: th->RenderStyle = STYLE_Normal; break; @@ -679,6 +678,8 @@ public: case NAME_Subtractive: th->RenderStyle = STYLE_Subtract; break; + default: + break; } } break; From 42708386138aea39d712df72b80a410e92243b4a Mon Sep 17 00:00:00 2001 From: Edward Richardson Date: Sat, 12 Apr 2014 22:02:19 +1200 Subject: [PATCH 4/4] CANRAISE state definition CANRAISE state for allowing a monster to be resurrected without an infinite frame --- src/info.h | 5 +++++ src/p_enemy.cpp | 5 +++-- src/thingdef/thingdef_states.cpp | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/info.h b/src/info.h index 24bbb5feaf..9a316c78de 100644 --- a/src/info.h +++ b/src/info.h @@ -76,6 +76,7 @@ struct FState BYTE SameFrame:1; // Ignore Frame (except when spawning actor) BYTE Fast:1; BYTE NoDelay:1; // Spawn states executes its action normally + BYTE CanRaise:1; // Allows a monster to be resurrected without waiting for an infinate frame int ParameterIndex; inline int GetFrame() const @@ -114,6 +115,10 @@ struct FState { return NoDelay; } + inline bool GetCanRaise() const + { + return CanRaise; + } inline void SetFrame(BYTE frame) { Frame = frame - 'A'; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index df16988377..8b1dd951bd 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -2527,8 +2527,9 @@ static bool P_CheckForResurrection(AActor *self, bool usevilestates) if (!(corpsehit->flags & MF_CORPSE) ) continue; // not a monster - if (corpsehit->tics != -1) - continue; // not lying still yet + if (corpsehit->tics != -1 && // not lying still yet + !corpsehit->state->GetCanRaise()) // or not ready to be raised yet + continue; raisestate = corpsehit->FindState(NAME_Raise); if (raisestate == NULL) diff --git a/src/thingdef/thingdef_states.cpp b/src/thingdef/thingdef_states.cpp index 1d643e33cd..5cc2de1c03 100644 --- a/src/thingdef/thingdef_states.cpp +++ b/src/thingdef/thingdef_states.cpp @@ -313,6 +313,11 @@ do_stop: sc.MustGetStringName(")"); continue; } + if (sc.Compare("CANRAISE")) + { + state.CanRaise = true; + continue; + } // Make the action name lowercase strlwr (sc.String);