mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-03 17:32:54 +00:00
- started work on parser
- implemented empty class methods. SVN r2871 (finale)
This commit is contained in:
parent
9ef5c47e18
commit
cf099f99e0
5 changed files with 310 additions and 13 deletions
|
@ -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) \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
@ -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<FIntermissionPatch> 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<FCastSound> 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<FIntermissionAction *> mActions;
|
||||
};
|
||||
|
||||
typedef TMap<FName, FIntermissionDescriptor*> 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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue