- intermission parser complete. The current definitions get parsed without error messages.

SVN r2877 (finale)
This commit is contained in:
Christoph Oelckers 2010-10-02 10:32:16 +00:00
parent 854e236c86
commit a9632c2694
10 changed files with 404 additions and 137 deletions

View file

@ -54,6 +54,7 @@ class FScanner;
#define GCC_YSEG __attribute__((section(SECTION_YREG))) #define GCC_YSEG __attribute__((section(SECTION_YREG)))
#endif #endif
struct FIntermissionAction;
struct FMapInfoParser struct FMapInfoParser
{ {
@ -99,6 +100,7 @@ struct FMapInfoParser
void SkipToNext(); void SkipToNext();
void CheckEndOfFile(const char *block); void CheckEndOfFile(const char *block);
FIntermissionAction *ParseIntermissionAction();
void ParseIntermission(); void ParseIntermission();
FName CheckEndSequence(); FName CheckEndSequence();
FName ParseEndGame(); FName ParseEndGame();

View file

@ -37,10 +37,13 @@
#include "w_wad.h" #include "w_wad.h"
#include "intermission/intermission.h" #include "intermission/intermission.h"
FIntermissionDescriptorList IntermissionDescriptors;
IMPLEMENT_CLASS(DIntermissionScreen) IMPLEMENT_CLASS(DIntermissionScreen)
IMPLEMENT_CLASS(DIntermissionScreenFader) IMPLEMENT_CLASS(DIntermissionScreenFader)
IMPLEMENT_CLASS(DIntermissionScreenText) IMPLEMENT_CLASS(DIntermissionScreenText)
IMPLEMENT_CLASS(DIntermissionScreenCast) IMPLEMENT_CLASS(DIntermissionScreenCast)
IMPLEMENT_CLASS(DIntermissionScreenScroller)
IMPLEMENT_CLASS(DIntermissionController) IMPLEMENT_CLASS(DIntermissionController)
void DIntermissionScreen::Init(FIntermissionDescriptor *desc) void DIntermissionScreen::Init(FIntermissionDescriptor *desc)

View file

@ -39,6 +39,32 @@ struct FICastSound
FSoundID mSound; FSoundID mSound;
}; };
enum EFadeType
{
FADE_In,
FADE_Out,
};
enum EWipeType
{
WIPE_Default,
WIPE_Cross,
WIPE_Melt,
WIPE_Burn
};
enum EScrollDir
{
SCROLL_Left,
SCROLL_Right,
SCROLL_Up,
SCROLL_Down,
};
// actions that don't create objects
#define WIPER_ID ((const PClass*)intptr_t(-1))
#define TITLE_ID ((const PClass*)intptr_t(-2))
//========================================================================== //==========================================================================
struct FIntermissionAction struct FIntermissionAction
@ -51,6 +77,7 @@ struct FIntermissionAction
int mCdId; int mCdId;
int mDuration; int mDuration;
FString mBackground; FString mBackground;
FString mPalette;
FString mSound; FString mSound;
bool mFlatfill; bool mFlatfill;
TArray<FIntermissionPatch> mOverlays; TArray<FIntermissionPatch> mOverlays;
@ -62,16 +89,6 @@ struct FIntermissionAction
struct FIntermissionActionFader : public FIntermissionAction struct FIntermissionActionFader : public FIntermissionAction
{ {
enum EFadeType
{
FADE_In,
FADE_Out,
FADE_Cross,
FADE_Melt,
FADE_Burn,
FADE_Wipe
};
typedef FIntermissionAction Super; typedef FIntermissionAction Super;
EFadeType mFadeType; EFadeType mFadeType;
@ -80,6 +97,16 @@ struct FIntermissionActionFader : public FIntermissionAction
virtual bool ParseKey(FScanner &sc); virtual bool ParseKey(FScanner &sc);
}; };
struct FIntermissionActionWiper : public FIntermissionAction
{
typedef FIntermissionAction Super;
EWipeType mWipeType;
FIntermissionActionWiper();
virtual bool ParseKey(FScanner &sc);
};
struct FIntermissionActionTextscreen : public FIntermissionAction struct FIntermissionActionTextscreen : public FIntermissionAction
{ {
typedef FIntermissionAction Super; typedef FIntermissionAction Super;
@ -96,10 +123,8 @@ struct FIntermissionActionCast : public FIntermissionAction
{ {
typedef FIntermissionAction Super; typedef FIntermissionAction Super;
FString mWalking; FString mName;
FString mAttacking1; FName mCastClass;
FString mAttacking2;
FString mDying;
TArray<FCastSound> mCastSounds; TArray<FCastSound> mCastSounds;
FIntermissionActionCast(); FIntermissionActionCast();
@ -158,7 +183,7 @@ class DIntermissionScreenFader : public DIntermissionScreen
int mTotalTime; int mTotalTime;
int mCounter; int mCounter;
int mType; EFadeType mType;
public: public:
@ -192,10 +217,7 @@ class DIntermissionScreenCast : public DIntermissionScreen
{ {
DECLARE_CLASS (DIntermissionScreenCast, DIntermissionScreen) DECLARE_CLASS (DIntermissionScreenCast, DIntermissionScreen)
FState *mWalking; FString mName;
FState *mAttacking1;
FState *mAttacking2;
FState *mDying;
TArray<FICastSound> mCastSounds; TArray<FICastSound> mCastSounds;
public: public:

View file

@ -89,7 +89,7 @@ bool FIntermissionAction::ParseKey(FScanner &sc)
sc.MustGetToken('='); sc.MustGetToken('=');
if (!sc.CheckToken('-')) if (!sc.CheckToken('-'))
{ {
sc.MustGetToken(TK_FloatConst); sc.MustGetFloat();
mDuration = xs_RoundToInt(sc.Float*TICRATE); mDuration = xs_RoundToInt(sc.Float*TICRATE);
} }
else else
@ -109,6 +109,11 @@ bool FIntermissionAction::ParseKey(FScanner &sc)
{ {
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
mFlatfill = !!sc.Number; mFlatfill = !!sc.Number;
if (sc.CheckToken(','))
{
sc.MustGetToken(TK_StringConst);
mPalette = sc.String;
}
} }
return true; return true;
} }
@ -151,7 +156,9 @@ bool FIntermissionAction::ParseKey(FScanner &sc)
FIntermissionActionFader::FIntermissionActionFader() FIntermissionActionFader::FIntermissionActionFader()
{ {
mFadeType = FADE_Cross; mSize = sizeof(FIntermissionActionFader);
mClass = RUNTIME_CLASS(DIntermissionScreenFader);
mFadeType = FADE_In;
} }
bool FIntermissionActionFader::ParseKey(FScanner &sc) bool FIntermissionActionFader::ParseKey(FScanner &sc)
@ -164,10 +171,6 @@ bool FIntermissionActionFader::ParseKey(FScanner &sc)
const FT[] = { const FT[] = {
{ "FadeIn", FADE_In }, { "FadeIn", FADE_In },
{ "FadeOut", FADE_Out }, { "FadeOut", FADE_Out },
{ "Crossfade", FADE_Cross },
{ "Melt", FADE_Melt },
{ "Burn", FADE_Burn },
{ "Wipe", FADE_Wipe },
{ NULL, FADE_In } { NULL, FADE_In }
}; };
@ -175,13 +178,52 @@ bool FIntermissionActionFader::ParseKey(FScanner &sc)
{ {
sc.MustGetToken('='); sc.MustGetToken('=');
sc.MustGetToken(TK_Identifier); sc.MustGetToken(TK_Identifier);
int v = sc.MustMatchString(&FT[0].Name, sizeof(FT[0])); int v = sc.MatchString(&FT[0].Name, sizeof(FT[0]));
if (v != -1) mFadeType = FT[v].Type; if (v != -1) mFadeType = FT[v].Type;
return true; return true;
} }
else return Super::ParseKey(sc); else return Super::ParseKey(sc);
} }
//==========================================================================
//
// FIntermissionActionWiper
//
//==========================================================================
FIntermissionActionWiper::FIntermissionActionWiper()
{
mSize = sizeof(FIntermissionActionWiper);
mClass = WIPER_ID;
mWipeType = WIPE_Default;
}
bool FIntermissionActionWiper::ParseKey(FScanner &sc)
{
struct WipeType
{
const char *Name;
EWipeType Type;
}
const FT[] = {
{ "Crossfade", WIPE_Cross },
{ "Melt", WIPE_Melt },
{ "Burn", WIPE_Burn },
{ "Default", WIPE_Default },
{ NULL, WIPE_Default }
};
if (sc.Compare("WipeType"))
{
sc.MustGetToken('=');
sc.MustGetToken(TK_Identifier);
int v = sc.MatchString(&FT[0].Name, sizeof(FT[0]));
if (v != -1) mWipeType = FT[v].Type;
return true;
}
else return Super::ParseKey(sc);
}
//========================================================================== //==========================================================================
// //
// FIntermissionActionFader // FIntermissionActionFader
@ -190,6 +232,8 @@ bool FIntermissionActionFader::ParseKey(FScanner &sc)
FIntermissionActionTextscreen::FIntermissionActionTextscreen() FIntermissionActionTextscreen::FIntermissionActionTextscreen()
{ {
mSize = sizeof(FIntermissionActionTextscreen);
mClass = RUNTIME_CLASS(DIntermissionScreenText);
mTextSpeed = 2; mTextSpeed = 2;
mTextX = -1; // use gameinfo defaults mTextX = -1; // use gameinfo defaults
mTextY = -1; mTextY = -1;
@ -218,8 +262,10 @@ bool FIntermissionActionTextscreen::ParseKey(FScanner &sc)
} }
else else
{ {
sc.ScriptMessage("Unknown text lump '%s'", sc.String); // only print an error if coming from a PWAD
mText = "(no message)"; if (Wads.GetLumpFile(sc.LumpNum) > 1)
sc.ScriptMessage("Unknown text lump '%s'", sc.String);
mText.Format("Unknown text lump '%s'", sc.String);
} }
return true; return true;
} }
@ -244,44 +290,226 @@ bool FIntermissionActionTextscreen::ParseKey(FScanner &sc)
else return Super::ParseKey(sc); else return Super::ParseKey(sc);
} }
//==========================================================================
//
// FIntermissionAction
//
//==========================================================================
FIntermissionActionCast::FIntermissionActionCast()
void FMapInfoParser::ParseIntermission()
{ {
FIntermissionAction *desc; mSize = sizeof(FIntermissionActionCast);
mClass = RUNTIME_CLASS(DIntermissionScreenCast);
}
while (!sc.CheckString("}")) bool FIntermissionActionCast::ParseKey(FScanner &sc)
{
if (sc.Compare("CastName"))
{ {
sc.MustGetString(); sc.MustGetToken('=');
if (sc.Compare("image")) sc.MustGetToken(TK_StringConst);
{ mName = sc.String;
desc = new FIntermissionAction; return true;
} }
else if (sc.Compare("scroller")) else if (sc.Compare("CastClass"))
{ {
} sc.MustGetToken('=');
else if (sc.Compare("cast")) sc.MustGetToken(TK_StringConst);
{ mCastClass = sc.String;
} return true;
else if (sc.Compare("Fader")) }
{ else if (sc.Compare("AttackSound"))
desc = new FIntermissionActionFader; {
} static const char *const seqs[] = {"Missile", "Melee", NULL};
else if (sc.Compare("TextScreen")) FCastSound *cs = &mCastSounds[mCastSounds.Reserve(1)];
{ sc.MustGetToken('=');
desc = new FIntermissionActionTextscreen; sc.MustGetToken(TK_StringConst);
} cs->mSequence = (BYTE)sc.MatchString(seqs);
else if (sc.Compare("GotoTitle")) sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst);
cs->mIndex = (BYTE)sc.Number;
sc.MustGetToken(',');
sc.MustGetToken(TK_StringConst);
cs->mSound = sc.String;
return true;
}
else return Super::ParseKey(sc);
}
//==========================================================================
//
// FIntermissionActionScroller
//
//==========================================================================
FIntermissionActionScroller::FIntermissionActionScroller()
{
mSize = sizeof(FIntermissionActionScroller);
mClass = RUNTIME_CLASS(DIntermissionScreenScroller);
mScrollDelay = 0;
mScrollTime = 640;
mScrollDir = SCROLL_Right;
}
bool FIntermissionActionScroller::ParseKey(FScanner &sc)
{
struct ScrollType
{
const char *Name;
EScrollDir Type;
}
const ST[] = {
{ "Left", SCROLL_Left },
{ "Right", SCROLL_Right },
{ "Up", SCROLL_Up },
{ "Down", SCROLL_Down },
{ NULL, SCROLL_Left }
};
if (sc.Compare("ScrollDirection"))
{
sc.MustGetToken('=');
sc.MustGetToken(TK_Identifier);
int v = sc.MatchString(&ST[0].Name, sizeof(ST[0]));
if (v != -1) mScrollDir = ST[v].Type;
return true;
}
else if (sc.Compare("InitialDelay"))
{
sc.MustGetToken('=');
if (!sc.CheckToken('-'))
{ {
sc.MustGetFloat();
mScrollDelay = xs_RoundToInt(sc.Float*TICRATE);
} }
else else
{ {
sc.ScriptMessage("Unknown intermission type '%s'", sc.String); sc.MustGetToken(TK_IntConst);
mScrollDelay = sc.Number;
} }
return true;
} }
else if (sc.Compare("ScrollTime"))
{
sc.MustGetToken('=');
if (!sc.CheckToken('-'))
{
sc.MustGetFloat();
mScrollTime = xs_RoundToInt(sc.Float*TICRATE);
}
else
{
sc.MustGetToken(TK_IntConst);
mScrollTime = sc.Number;
}
return true;
}
else if (sc.Compare("Background2"))
{
sc.MustGetToken('=');
sc.MustGetToken(TK_StringConst);
mSecondPic = sc.String;
return true;
}
else return Super::ParseKey(sc);
} }
//==========================================================================
//
// ParseIntermission
//
//==========================================================================
FIntermissionAction *FMapInfoParser::ParseIntermissionAction()
{
FIntermissionAction *desc = NULL;
sc.MustGetToken(TK_Identifier);
if (sc.Compare("image"))
{
desc = new FIntermissionAction;
}
else if (sc.Compare("scroller"))
{
desc = new FIntermissionActionScroller;
}
else if (sc.Compare("cast"))
{
desc = new FIntermissionActionCast;
}
else if (sc.Compare("Fader"))
{
desc = new FIntermissionActionFader;
}
else if (sc.Compare("Wiper"))
{
desc = new FIntermissionActionWiper;
}
else if (sc.Compare("TextScreen"))
{
desc = new FIntermissionActionTextscreen;
}
else if (sc.Compare("GotoTitle"))
{
desc = new FIntermissionAction;
desc->mClass = TITLE_ID;
}
else
{
sc.ScriptMessage("Unknown intermission type '%s'", sc.String);
}
sc.MustGetToken('{');
while (!sc.CheckToken('}'))
{
bool success = false;
if (!sc.CheckToken(TK_Sound))
{
sc.MustGetToken(TK_Identifier);
}
if (desc != NULL)
{
success = desc->ParseKey(sc);
if (!success)
{
sc.ScriptMessage("Unknown key name '%s'\n", sc.String);
}
}
if (!success) SkipToNext();
}
return desc;
}
//==========================================================================
//
// ParseIntermission
//
//==========================================================================
void FMapInfoParser::ParseIntermission()
{
sc.MustGetString();
FName intname = sc.String;
FIntermissionDescriptor ** pDesc = IntermissionDescriptors.CheckKey(intname);
if (pDesc != NULL && *pDesc != NULL) delete *pDesc;
FIntermissionDescriptor *desc = new FIntermissionDescriptor();
IntermissionDescriptors[intname] = desc;
sc.MustGetToken('{');
while (!sc.CheckToken('}'))
{
FIntermissionAction *ac = ParseIntermissionAction();
if (ac != NULL) desc->mActions.Push(ac);
}
}
//==========================================================================
//
// Parse old style endsequence
//
//==========================================================================
struct EndSequence struct EndSequence
{ {
@ -383,6 +611,12 @@ FName FMapInfoParser::ParseEndGame()
return FName(seq); return FName(seq);
} }
//==========================================================================
//
// Checks map name for end sequence
//
//==========================================================================
FName FMapInfoParser::CheckEndSequence() FName FMapInfoParser::CheckEndSequence()
{ {
const char *seqname = NULL; const char *seqname = NULL;

View file

@ -1,5 +1,5 @@
// MAPINFO for Chex Quest // MAPINFO for Chex Quest
#include "mapinfo/common.txt" include "mapinfo/common.txt"
gameinfo gameinfo
{ {

View file

@ -27,7 +27,7 @@ Intermission Inter_Bunny
{ {
Scroller Scroller
{ {
FadeType = Right ScrollDirection = Right
Background = "PFUB1" Background = "PFUB1"
Background2 = "PFUB2" Background2 = "PFUB2"
Music = "$MUSIC_BUNNY" Music = "$MUSIC_BUNNY"
@ -94,8 +94,7 @@ Intermission Inter_Underwater
{ {
Image Image
{ {
Background = "E2END" Background = "E2END", 0, "E2PAL"
Palette = "E2PAL"
Time = 10000000 // advance only manually Time = 10000000 // advance only manually
} }
GotoTitle GotoTitle
@ -107,7 +106,7 @@ Intermission Inter_Demonscroll
{ {
Scroller Scroller
{ {
FadeType = Up ScrollDirection = Up
Background = "FINAL1" Background = "FINAL1"
Background2 = "FINAL2" Background2 = "FINAL2"
InitialDelay = 2 InitialDelay = 2
@ -119,7 +118,7 @@ Intermission Inter_BuyStrife
{ {
Scroller Scroller
{ {
FadeType = Right ScrollDirection = Right
Background = "CREDIT" Background = "CREDIT"
Background2 = "VELLOGO" Background2 = "VELLOGO"
InitialDelay = -230 InitialDelay = -230
@ -131,125 +130,126 @@ Intermission Inter_Cast
{ {
Image Image
{ {
// This is only here to initialize the background // This is only here to initialize the background and the music
Background = "$bgcastcall" Background = "$bgcastcall"
Time = -1 Time = -1
Music = "$MUSIC_EVIL" Music = "$MUSIC_EVIL"
Link = Doom2Cast Link = Doom2Cast
} }
}
Intermission Doom2Cast Intermission Doom2Cast
{ {
Cast Cast
{ {
Class = "Zombieman" CastClass = "Zombieman"
Name = "$CC_ZOMBIE" CastName = "$CC_ZOMBIE"
Sound = "Missile", 1, "grunt/attack" AttackSound = "Missile", 1, "grunt/attack"
} }
Cast Cast
{ {
Class = "ShotgunGuy" CastClass = "ShotgunGuy"
Name = "$CC_SHOTGUN" CastName = "$CC_SHOTGUN"
Sound = "Missile", 1, "shotguy/attack" AttackSound = "Missile", 1, "shotguy/attack"
} }
Cast Cast
{ {
Class = "ChaingunGuy" CastClass = "ChaingunGuy"
Name = "$CC_HEAVY" CastName = "$CC_HEAVY"
Sound = "Missile", 1, "chainguy/attack" AttackSound = "Missile", 1, "chainguy/attack"
Sound = "Missile", 2, "chainguy/attack" AttackSound = "Missile", 2, "chainguy/attack"
Sound = "Missile", 3, "chainguy/attack" AttackSound = "Missile", 3, "chainguy/attack"
} }
Cast Cast
{ {
Class = "DoomImp" CastClass = "DoomImp"
Name = "$CC_IMP" CastName = "$CC_IMP"
Sound = "Missile", 2, "imp/attack" AttackSound = "Missile", 2, "imp/attack"
} }
Cast Cast
{ {
Class = "Demon" CastClass = "Demon"
Name = "$CC_DEMON" CastName = "$CC_DEMON"
Sound = "Melee", 1, "demon/melee" AttackSound = "Melee", 1, "demon/melee"
} }
Cast Cast
{ {
Class = "LostSoul" CastClass = "LostSoul"
Name = "$CC_LOST" CastName = "$CC_LOST"
Sound = "Missile", 1, "grunt/attack" AttackSound = "Missile", 1, "grunt/attack"
} }
Cast Cast
{ {
Class = "Cacodemon" CastClass = "Cacodemon"
Name = "$CC_CACO" CastName = "$CC_CACO"
Sound = "Missile", 1, "caco/attack" AttackSound = "Missile", 1, "caco/attack"
} }
Cast Cast
{ {
Class = "HellKnight" CastClass = "HellKnight"
Name = "$CC_HELL" CastName = "$CC_HELL"
Sound = "Missile", 1, "baron/attack" AttackSound = "Missile", 1, "baron/attack"
} }
Cast Cast
{ {
Class = "BaronOfHell" CastClass = "BaronOfHell"
Name = "$CC_BARON" CastName = "$CC_BARON"
Sound = "Missile", 1, "baron/attack" AttackSound = "Missile", 1, "baron/attack"
} }
Cast Cast
{ {
Class = "Arachnotron" CastClass = "Arachnotron"
Name = "$CC_ARACH" CastName = "$CC_ARACH"
Sound = "Missile", 1, "baby/attack" AttackSound = "Missile", 1, "baby/attack"
} }
Cast Cast
{ {
Class = "PainElemental" CastClass = "PainElemental"
Name = "$CC_PAIN" CastName = "$CC_PAIN"
Sound = "Missile", 2, "skull/melee" AttackSound = "Missile", 2, "skull/melee"
} }
Cast Cast
{ {
Class = "Revenant" CastClass = "Revenant"
Name = "$CC_REVEN" CastName = "$CC_REVEN"
Sound = "Missile", 1, "skeleton/attack" AttackSound = "Missile", 1, "skeleton/attack"
Sound = "Melee", 1, "skeleton/swing" AttackSound = "Melee", 1, "skeleton/swing"
Sound = "Melee", 3, "skeleton/melee" AttackSound = "Melee", 3, "skeleton/melee"
} }
Cast Cast
{ {
Class = "Fatso" CastClass = "Fatso"
Name = "$CC_FATSO" CastName = "$CC_FATSO"
Sound = "Missile", 1, "fatso/attack" AttackSound = "Missile", 1, "fatso/attack"
Sound = "Missile", 4, "fatso/attack" AttackSound = "Missile", 4, "fatso/attack"
Sound = "Missile", 7, "fatso/attack" AttackSound = "Missile", 7, "fatso/attack"
} }
Cast Cast
{ {
Class = "Archvile" CastClass = "Archvile"
Name = "$CC_ARCH" CastName = "$CC_ARCH"
Sound = "Missile", 1, "vile/start" AttackSound = "Missile", 1, "vile/start"
} }
Cast Cast
{ {
Class = "SpiderMastermind" CastClass = "SpiderMastermind"
Name = "$CC_SPIDER" CastName = "$CC_SPIDER"
Sound = "Missile", 1, "spider/attack" AttackSound = "Missile", 1, "spider/attack"
Sound = "Missile", 2, "spider/attack" AttackSound = "Missile", 2, "spider/attack"
} }
Cast Cast
{ {
Class = "Cyberdemon" CastClass = "Cyberdemon"
Name = "$CC_CYBER" CastName = "$CC_CYBER"
Sound = "Missile", 1, "weapons/rocklf" AttackSound = "Missile", 1, "weapons/rocklf"
Sound = "Missile", 3, "weapons/rocklf" AttackSound = "Missile", 3, "weapons/rocklf"
Sound = "Missile", 5, "weapons/rocklf" AttackSound = "Missile", 5, "weapons/rocklf"
} }
Cast Cast
{ {
Class = "DoomPlayer" CastClass = "DoomPlayer"
Name = "$CC_HERO" CastName = "$CC_HERO"
Sound = "Missile", 0, "weapons/sshotf" AttackSound = "Missile", 0, "weapons/sshotf"
Link = Doom2Cast // restart cast call Link = Doom2Cast // restart cast call
} }
} }
@ -338,12 +338,14 @@ Intermission Inter_Strife_Good
Background = "SS4F4" Background = "SS4F4"
Time = 28 Time = 28
} }
Fader Wiper
{
WipeType = Crossfade
}
Image
{ {
Background = "CREDIT"
Music = "D_FAST" Music = "D_FAST"
Time = 2 Background = "CREDIT"
FadeType = Crossfade
} }
} }
@ -369,12 +371,14 @@ Intermission Inter_Strife_Sad
Sound = "svox/ss603a" Sound = "svox/ss603a"
Time = 9 Time = 9
} }
Fader Wiper
{
WipeType = Crossfade
}
Image
{ {
Background = "CREDIT"
Music = "D_FAST" Music = "D_FAST"
Time = 2 Background = "CREDIT"
FadeType = Crossfade
} }
} }
@ -399,12 +403,14 @@ Intermission Inter_Strife_Lose
Sound = "svox/ss503b" Sound = "svox/ss503b"
Time = 11 Time = 11
} }
Fader Wiper
{
WipeType = Crossfade
}
Image
{ {
Background = "CREDIT"
Music = "D_FAST" Music = "D_FAST"
Time = 2 Background = "CREDIT"
FadeType = Crossfade
} }
} }

View file

@ -1,4 +1,4 @@
#include "mapinfo/common.txt" include "mapinfo/common.txt"
gameinfo gameinfo
{ {

View file

@ -1,5 +1,5 @@
// MAPINFO for Heretic (Shareware and Retail) // MAPINFO for Heretic (Shareware and Retail)
#include "mapinfo/common.txt" include "mapinfo/common.txt"
gameinfo gameinfo
{ {

View file

@ -1,5 +1,5 @@
// A bare-bones MAPINFO for Hexen. // A bare-bones MAPINFO for Hexen.
#include "mapinfo/common.txt" include "mapinfo/common.txt"
// Most of the MAPINFO is still in hexen.wad. // Most of the MAPINFO is still in hexen.wad.

View file

@ -1,5 +1,5 @@
// MAPINFO for Strife (full version and teaser) // MAPINFO for Strife (full version and teaser)
#include "mapinfo/common.txt" include "mapinfo/common.txt"
gameinfo gameinfo
{ {