diff --git a/src/g_level.h b/src/g_level.h index 8c4a108976..5ca7157c6f 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -99,8 +99,9 @@ struct FMapInfoParser void SkipToNext(); void CheckEndOfFile(const char *block); - FName CheckEndSequence(FScanner &sc); - FName ParseEndGame(FScanner &sc); + void ParseIntermission(); + FName CheckEndSequence(); + FName ParseEndGame(); }; #define DEFINE_MAP_OPTION(name, old) \ diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index bc43b1a57e..2d55084bf1 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -771,7 +771,7 @@ void FMapInfoParser::ParseNextMap(char *mapname) sc.MustGetString(); strncpy (mapname, sc.String, 8); mapname[8] = 0; - CheckEndSequence(sc); + CheckEndSequence(); } } @@ -1749,6 +1749,18 @@ void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults, level_i sc.ScriptError("gameinfo definitions not supported with old MAPINFO syntax"); } } + else if (sc.Compare("intermission")) + { + if (format_type != FMT_Old) + { + format_type = FMT_New; + ParseIntermission(); + } + else + { + sc.ScriptError("intermission definitions not supported with old MAPINFO syntax"); + } + } else { sc.ScriptError("%s: Unknown top level keyword", sc.String); diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 791d2414de..d50ab28bad 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -37,6 +37,100 @@ #include "w_wad.h" #include "intermission/intermission.h" +IMPLEMENT_CLASS(DIntermissionScreen) +IMPLEMENT_CLASS(DIntermissionScreenFader) +IMPLEMENT_CLASS(DIntermissionScreenText) +IMPLEMENT_CLASS(DIntermissionScreenCast) +IMPLEMENT_CLASS(DIntermissionController) + +void DIntermissionScreen::Init(FIntermissionDescriptor *desc) +{ +} + +bool DIntermissionScreen::Responder (event_t *ev) +{ + return false; +} + +void DIntermissionScreen::Ticker () +{ +} + +void DIntermissionScreen::Drawer () +{ +} + +void DIntermissionScreenFader::Init(FIntermissionDescriptor *desc) +{ +} + +bool DIntermissionScreenFader::Responder (event_t *ev) +{ + return false; +} + +void DIntermissionScreenFader::Ticker () +{ +} + +void DIntermissionScreenFader::Drawer () +{ +} + +void DIntermissionScreenText::Init(FIntermissionDescriptor *desc) +{ +} + +bool DIntermissionScreenText::Responder (event_t *ev) +{ + return false; +} + +void DIntermissionScreenText::Ticker () +{ +} + +void DIntermissionScreenText::Drawer () +{ +} + +void DIntermissionScreenCast::Init(FIntermissionDescriptor *desc) +{ +} + +bool DIntermissionScreenCast::Responder (event_t *ev) +{ + return false; +} + +void DIntermissionScreenCast::Ticker () +{ +} + +void DIntermissionScreenCast::Drawer () +{ +} + +void DIntermissionScreenScroller::Init(FIntermissionDescriptor *desc) +{ +} + +bool DIntermissionScreenScroller::Responder (event_t *ev) +{ + return false; +} + +void DIntermissionScreenScroller::Ticker () +{ +} + +void DIntermissionScreenScroller::Drawer () +{ +} + + + + static FIntermissionDescriptor DefaultIntermission; diff --git a/src/intermission/intermission.h b/src/intermission/intermission.h index dead86eca6..1b0a3d0b88 100644 --- a/src/intermission/intermission.h +++ b/src/intermission/intermission.h @@ -8,6 +8,11 @@ struct event_t; +#define DECLARE_SUPER_CLASS(cls,parent) \ +private: \ + typedef parent Super; \ + typedef cls ThisClass; + struct FIntermissionPatch { FString mName; @@ -36,7 +41,7 @@ struct FICastSound //========================================================================== -struct FIntermissionDescriptor +struct FIntermissionAction { int mSize; const PClass *mClass; @@ -49,37 +54,61 @@ struct FIntermissionDescriptor FString mSound; bool mFlatfill; TArray mOverlays; - FIntermissionDescriptor *mLink; + FName mLink; + + FIntermissionAction(); + virtual bool ParseKey(FScanner &sc); }; -struct FIntermissionDescriptorFader : public FIntermissionDescriptor +struct FIntermissionActionFader : public FIntermissionAction { + typedef FIntermissionAction Super; + int FadeTime; int FadeType; + + virtual bool ParseKey(FScanner &sc); }; -struct FIntermissionDescriptorTextscreen : public FIntermissionDescriptor +struct FIntermissionActionTextscreen : public FIntermissionAction { + typedef FIntermissionAction Super; + FString mText; int mTextSpeed; int mTextX, mTextY; + + virtual bool ParseKey(FScanner &sc); }; -struct FIntermissionDescriptorCast : public FIntermissionDescriptor +struct FIntermissionActionCast : public FIntermissionAction { + typedef FIntermissionAction Super; + FString mWalking; FString mAttacking1; FString mAttacking2; FString mDying; TArray mCastSounds; + + virtual bool ParseKey(FScanner &sc); }; -struct FIntermissionDescriptorScroller : public FIntermissionDescriptor +struct FIntermissionActionScroller : public FIntermissionAction { + typedef FIntermissionAction Super; + FString mSecondPic; int mScrollDelay; int mScrollTime; int mScrollDir; + + virtual bool ParseKey(FScanner &sc); +}; + +struct FIntermissionDescriptor +{ + TArray mActions; }; typedef TMap FIntermissionDescriptorList; @@ -165,6 +194,23 @@ public: virtual void Drawer (); }; +class DIntermissionScreenScroller : public DIntermissionScreen +{ + DECLARE_CLASS (DIntermissionScreenScroller, DIntermissionScreen) + + FTextureID mSecondPic; + int mScrollDelay; + int mScrollTime; + int mScrollDir; + +public: + + DIntermissionScreenScroller() {} + virtual void Init(FIntermissionDescriptor *desc); + virtual bool Responder (event_t *ev); + virtual void Ticker (); + virtual void Drawer (); +}; class DIntermissionController : public DObject diff --git a/src/intermission/intermission_parse.cpp b/src/intermission/intermission_parse.cpp index f5492e1aea..5bba78867a 100644 --- a/src/intermission/intermission_parse.cpp +++ b/src/intermission/intermission_parse.cpp @@ -37,6 +37,151 @@ #include "intermission/intermission.h" #include "g_level.h" +//========================================================================== +// +// FIntermissionAction +// +//========================================================================== + +FIntermissionAction::FIntermissionAction() +{ + mSize = sizeof(FIntermissionAction); + mClass = RUNTIME_CLASS(DIntermissionScreen); + mMusicOrder = + mCdId = + mCdTrack = + mDuration = 0; + mFlatfill = false; +} + +bool FIntermissionAction::ParseKey(FScanner &sc) +{ + if (sc.Compare("music")) + { + sc.MustGetToken('='); + sc.MustGetToken(TK_StringConst); + mMusic = sc.String; + mMusicOrder = 0; + if (sc.CheckToken(',')) + { + sc.MustGetToken(TK_IntConst); + mMusicOrder = sc.Number; + } + return true; + } + else if (sc.Compare("cdmusic")) + { + sc.MustGetToken('='); + sc.MustGetToken(TK_IntConst); + mCdTrack = sc.Number; + mCdId = 0; + if (sc.CheckToken(',')) + { + sc.MustGetToken(TK_IntConst); + mCdId = sc.Number; + } + return true; + } + else if (sc.Compare("Time")) + { + sc.MustGetToken('='); + if (!sc.CheckToken('-')) + { + sc.MustGetToken(TK_FloatConst); + mDuration = xs_RoundToInt(sc.Float*TICRATE); + } + else + { + sc.MustGetToken(TK_IntConst); + mDuration = sc.Number; + } + return true; + } + else if (sc.Compare("Background")) + { + sc.MustGetToken('='); + sc.MustGetToken(TK_StringConst); + mBackground = sc.String; + mFlatfill = 0; + if (sc.CheckToken(',')) + { + sc.MustGetToken(TK_IntConst); + mFlatfill = !!sc.Number; + } + return true; + } + else if (sc.Compare("Sound")) + { + sc.MustGetToken('='); + sc.MustGetToken(TK_StringConst); + mSound = sc.String; + return true; + } + else if (sc.Compare("Draw")) + { + FIntermissionPatch *pat = &mOverlays[mOverlays.Reserve(1)]; + sc.MustGetToken('='); + sc.MustGetToken(TK_StringConst); + pat->mName = sc.String; + sc.MustGetToken(','); + sc.MustGetToken(TK_IntConst); + pat->x = sc.Number; + sc.MustGetToken(','); + sc.MustGetToken(TK_IntConst); + pat->y = sc.Number; + return true; + } + else if (sc.Compare("Limk")) + { + sc.MustGetToken('='); + sc.MustGetToken(TK_Identifier); + mLink = sc.String; + return true; + } + else return false; +} + + +void FMapInfoParser::ParseIntermission() +{ + FIntermissionDescriptor *desc; + + while (!sc.CheckString("}")) + { + sc.MustGetString(); + if (sc.Compare("image")) + { + } + else if (sc.Compare("scroller")) + { + } + else if (sc.Compare("cast")) + { + } + else if (sc.Compare("Fader")) + { + } + else if (sc.Compare("Crossfader")) + { + } + else if (sc.Compare("Wiper")) + { + } + else if (sc.Compare("TextScreen")) + { + } + else if (sc.Compare("GotoTitle")) + { + } + else + { + sc.ScriptMessage("Unknown intermission type '%s'", sc.String); + } + } + +} + + struct EndSequence { SBYTE EndType; @@ -55,8 +200,7 @@ enum EndTypes END_Demon }; - -FName FMapInfoParser::ParseEndGame(FScanner &sc) +FName FMapInfoParser::ParseEndGame() { EndSequence newSeq; static int generated = 0; @@ -138,7 +282,7 @@ FName FMapInfoParser::ParseEndGame(FScanner &sc) return FName(seq); } -FName FMapInfoParser::CheckEndSequence(FScanner &sc) +FName FMapInfoParser::CheckEndSequence() { const char *seqname = NULL; @@ -150,7 +294,7 @@ FName FMapInfoParser::CheckEndSequence(FScanner &sc) sc.UnGet(); goto standard_endgame; } - return ParseEndGame(sc); + return ParseEndGame(); } else if (strnicmp (sc.String, "EndGame", 7) == 0) {