This commit is contained in:
Christoph Oelckers 2014-04-15 09:26:05 +02:00
commit dbefac81d8
13 changed files with 210 additions and 12 deletions

View file

@ -117,6 +117,8 @@ Note: All <bool> fields default to false unless mentioned otherwise.
locknumber = <int>; // Line special is locked locknumber = <int>; // Line special is locked
arg0str = <string>; // Alternate string-based version of arg0 arg0str = <string>; // Alternate string-based version of arg0
transparent = <bool>; // true = line is a Strife transparent line (alpha 0.25)
* Note about arg0str * Note about arg0str
For lines with ACS specials (80-86 and 226), if arg0str is present and non-null, it For lines with ACS specials (80-86 and 226), if arg0str is present and non-null, it
@ -208,6 +210,21 @@ Note: All <bool> fields default to false unless mentioned otherwise.
gravity = <float>; // Set per-actor gravity. Positive values are multiplied with the class's property, gravity = <float>; // Set per-actor gravity. Positive values are multiplied with the class's property,
// negative values are used as their absolute. Default = 1.0. // negative values are used as their absolute. Default = 1.0.
health = <int>; // Set per-actor health. Positive values are multiplied with the class's property,
// negative values are used as their absolute. Default = 1.
renderstyle = <string>; // 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 = <integer>; // Fill color used by the "stencil" and "translucentstencil" rendestyles, as RRGGBB value, default = 0x000000.
alpha = <float>; // Translucency of this actor (if applicable to renderstyle), default is 1.0.
score = <int>; // Score value of this actor, overriding the class default if not null. Default = 0.
pitch = <integer>; // Pitch of thing in degrees. Default = 0 (horizontal).
roll = <integer>; // Pitch of thing in degrees. Default = 0 (horizontal).
scalex = <float>; // Vertical scaling on thing. Default = 0 (ignored).
scaley = <float>; // Horizontal scaling on thing. Default = 0 (ignored).
scale = <float>; // Vertical and horizontal scaling on thing. Default = 0 (ignored).
* Note about arg0str * Note about arg0str
For things with ACS specials (80-86 and 226), if arg0str is present and non-null, it For things with ACS specials (80-86 and 226), if arg0str is present and non-null, it
@ -335,6 +352,9 @@ Added arg0str thing property.
1.21 09.08.2013 1.21 09.08.2013
Added waterzone sector property. 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 EOF
=============================================================================== ===============================================================================

View file

@ -873,6 +873,7 @@ public:
TObjPtr<AActor> LastLookActor; // Actor last looked for (if TIDtoHate != 0) TObjPtr<AActor> LastLookActor; // Actor last looked for (if TIDtoHate != 0)
fixed_t SpawnPoint[3]; // For nightmare respawn fixed_t SpawnPoint[3]; // For nightmare respawn
WORD SpawnAngle; WORD SpawnAngle;
int StartHealth;
BYTE WeaveIndexXY; // Separated from special2 because it's used by globally accessible functions. BYTE WeaveIndexXY; // Separated from special2 because it's used by globally accessible functions.
BYTE WeaveIndexZ; BYTE WeaveIndexZ;
int skillrespawncount; int skillrespawncount;

View file

@ -192,9 +192,10 @@ enum EMapLineFlags // These are flags that use different values internally
ML_RESERVED_ETERNITY = 0x0800, ML_RESERVED_ETERNITY = 0x0800,
// [RH] Extra flags for Strife // [RH] Extra flags for Strife
ML_TRANSLUCENT_STRIFE = 0x1000,
ML_RAILING_STRIFE = 0x0200, ML_RAILING_STRIFE = 0x0200,
ML_BLOCK_FLOATERS_STRIFE = 0x0400, ML_BLOCK_FLOATERS_STRIFE = 0x0400,
ML_TRANSPARENT_STRIFE = 0x0800,
ML_TRANSLUCENT_STRIFE = 0x1000,
}; };
@ -344,6 +345,15 @@ struct FMapThing
int args[5]; int args[5];
int Conversation; int Conversation;
fixed_t gravity; 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 &); void Serialize (FArchive &);
}; };
@ -385,6 +395,7 @@ enum EMapThingFlags
MTF_SECRET = 0x080000, // Secret pickup MTF_SECRET = 0x080000, // Secret pickup
MTF_NOINFIGHTING = 0x100000, MTF_NOINFIGHTING = 0x100000,
// BOOM and DOOM compatible versions of some of the above // BOOM and DOOM compatible versions of some of the above
BTF_NOTSINGLE = 0x0010, // (TF_COOPERATIVE|TF_DEATHMATCH) BTF_NOTSINGLE = 0x0010, // (TF_COOPERATIVE|TF_DEATHMATCH)

View file

@ -76,6 +76,7 @@ struct FState
BYTE SameFrame:1; // Ignore Frame (except when spawning actor) BYTE SameFrame:1; // Ignore Frame (except when spawning actor)
BYTE Fast:1; BYTE Fast:1;
BYTE NoDelay:1; // Spawn states executes its action normally 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; int ParameterIndex;
inline int GetFrame() const inline int GetFrame() const
@ -114,6 +115,10 @@ struct FState
{ {
return NoDelay; return NoDelay;
} }
inline bool GetCanRaise() const
{
return CanRaise;
}
inline void SetFrame(BYTE frame) inline void SetFrame(BYTE frame)
{ {
Frame = frame - 'A'; Frame = frame - 'A';

View file

@ -31,6 +31,18 @@ xx(Fuzzy)
xx(Opaque) xx(Opaque)
xx(Stencil) 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 // Healingradius types
xx(Mana) xx(Mana)
xx(Armor) xx(Armor)
@ -373,6 +385,11 @@ xx(Friend)
xx(Strifeally) xx(Strifeally)
xx(Standing) xx(Standing)
xx(Countsecret) xx(Countsecret)
xx(Score)
xx(Roll)
xx(Scale)
xx(ScaleX)
xx(ScaleY)
xx(Blocking) xx(Blocking)
xx(Blockmonsters) xx(Blockmonsters)

View file

@ -2527,8 +2527,9 @@ static bool P_CheckForResurrection(AActor *self, bool usevilestates)
if (!(corpsehit->flags & MF_CORPSE) ) if (!(corpsehit->flags & MF_CORPSE) )
continue; // not a monster continue; // not a monster
if (corpsehit->tics != -1) if (corpsehit->tics != -1 && // not lying still yet
continue; // not lying still yet !corpsehit->state->GetCanRaise()) // or not ready to be raised yet
continue;
raisestate = corpsehit->FindState(NAME_Raise); raisestate = corpsehit->FindState(NAME_Raise);
if (raisestate == NULL) if (raisestate == NULL)
@ -2648,7 +2649,7 @@ static bool P_CheckForResurrection(AActor *self, bool usevilestates)
corpsehit->flags5 = info->flags5; corpsehit->flags5 = info->flags5;
corpsehit->flags6 = info->flags6; corpsehit->flags6 = info->flags6;
corpsehit->flags7 = info->flags7; corpsehit->flags7 = info->flags7;
corpsehit->health = info->health; corpsehit->health = corpsehit->SpawnHealth();
corpsehit->target = NULL; corpsehit->target = NULL;
corpsehit->lastenemy = NULL; corpsehit->lastenemy = NULL;

View file

@ -219,8 +219,12 @@ void AActor::Serialize (FArchive &arc)
<< threshold << threshold
<< player << player
<< SpawnPoint[0] << SpawnPoint[1] << SpawnPoint[2] << SpawnPoint[0] << SpawnPoint[1] << SpawnPoint[2]
<< SpawnAngle << SpawnAngle;
<< skillrespawncount if (SaveVersion >= 4506)
{
arc << StartHealth;
}
arc << skillrespawncount
<< tracer << tracer
<< floorclip << floorclip
<< tid << tid
@ -4789,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 (); mobj->BeginPlay ();
if (!(mobj->ObjectFlags & OF_EuthanizeMe)) if (!(mobj->ObjectFlags & OF_EuthanizeMe))
{ {
mobj->LevelSpawned (); 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; return mobj;
} }
@ -6016,18 +6051,19 @@ void AActor::SetIdle()
int AActor::SpawnHealth() 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) 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; return (adj <= 0) ? 1 : adj;
} }
else else
{ {
int adj = FixedMul(GetDefault()->health, G_SkillProperty(SKILLP_MonsterHealth)); int adj = FixedMul(defhealth, G_SkillProperty(SKILLP_MonsterHealth));
return (adj <= 0) ? 1 : adj; return (adj <= 0) ? 1 : adj;
} }
} }

View file

@ -476,6 +476,9 @@ public:
memset(th, 0, sizeof(*th)); memset(th, 0, sizeof(*th));
th->gravity = FRACUNIT; th->gravity = FRACUNIT;
th->RenderStyle = STYLE_Count;
th->alpha = -1;
th->health = 1;
sc.MustGetToken('{'); sc.MustGetToken('{');
while (!sc.CheckToken('}')) while (!sc.CheckToken('}'))
{ {
@ -632,6 +635,90 @@ public:
Flag(th->flags, MTF_SECRET, key); Flag(th->flags, MTF_SECRET, key);
break; break;
case NAME_Renderstyle:
{
FName style = CheckString(key);
switch (style)
{
case NAME_None:
th->RenderStyle = STYLE_None;
break;
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;
default:
break;
}
}
break;
case NAME_Alpha:
th->alpha = CheckFixed(key);
break;
case NAME_FillColor:
th->fillcolor = CheckInt(key);
case NAME_Health:
th->health = CheckInt(key);
break;
case NAME_Score:
th->score = CheckInt(key);
break;
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: default:
if (0 == strnicmp("user_", key.GetChars(), 5)) if (0 == strnicmp("user_", key.GetChars(), 5))
{ // Custom user key - Sets an actor's user variable directly { // Custom user key - Sets an actor's user variable directly
@ -686,6 +773,7 @@ public:
{ {
bool passuse = false; bool passuse = false;
bool strifetrans = false; bool strifetrans = false;
bool strifetrans2 = false;
FString arg0str, arg1str; FString arg0str, arg1str;
memset(ld, 0, sizeof(*ld)); memset(ld, 0, sizeof(*ld));
@ -803,6 +891,11 @@ public:
strifetrans = CheckBool(key); strifetrans = CheckBool(key);
continue; continue;
case NAME_Transparent:
CHECK_N(St | Zd | Zdt | Va)
strifetrans2 = CheckBool(key);
continue;
case NAME_Passuse: case NAME_Passuse:
CHECK_N(Dm | Zd | Zdt | Va) CHECK_N(Dm | Zd | Zdt | Va)
passuse = CheckBool(key); passuse = CheckBool(key);
@ -965,6 +1058,10 @@ public:
{ {
ld->Alpha = FRACUNIT * 3/4; ld->Alpha = FRACUNIT * 3/4;
} }
if (strifetrans2 && ld->Alpha == FRACUNIT)
{
ld->Alpha = FRACUNIT * 1/4;
}
if (ld->sidedef[0] == NULL) if (ld->sidedef[0] == NULL)
{ {
ld->sidedef[0] = (side_t*)(intptr_t)(1); ld->sidedef[0] = (side_t*)(intptr_t)(1);

View file

@ -89,6 +89,9 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld)
case -2: case -2:
ld->Alpha = FRACUNIT*3/4; ld->Alpha = FRACUNIT*3/4;
break; break;
case -3:
ld->Alpha = FRACUNIT / 4;
break;
default: default:
newflags |= LineFlagTranslations[i].newvalue; newflags |= LineFlagTranslations[i].newvalue;
break; break;

View file

@ -313,6 +313,11 @@ do_stop:
sc.MustGetStringName(")"); sc.MustGetStringName(")");
continue; continue;
} }
if (sc.Compare("CANRAISE"))
{
state.CanRaise = true;
continue;
}
// Make the action name lowercase // Make the action name lowercase
strlwr (sc.String); strlwr (sc.String);

View file

@ -76,7 +76,7 @@ const char *GetVersionString();
// Use 4500 as the base git save version, since it's higher than the // Use 4500 as the base git save version, since it's higher than the
// SVN revision ever got. // SVN revision ever got.
#define SAVEVER 4505 #define SAVEVER 4506
#define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY2(x) #x
#define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)

View file

@ -239,5 +239,6 @@ enum
// //
ML_PASSTHROUGH = -1, ML_PASSTHROUGH = -1,
ML_TRANSLUCENT = -2 ML_TRANSLUCENT = -2,
ML_TRANSPARENT = -3,
} }

View file

@ -363,5 +363,6 @@ lineflag 7 = ML_DONTDRAW;
lineflag 8 = ML_MAPPED; lineflag 8 = ML_MAPPED;
lineflag 9 = ML_RAILING; lineflag 9 = ML_RAILING;
lineflag 10 = ML_BLOCK_FLOATERS; lineflag 10 = ML_BLOCK_FLOATERS;
lineflag 11 = ML_TRANSPARENT;
lineflag 12 = ML_TRANSLUCENT; lineflag 12 = ML_TRANSLUCENT;