- added per-level exit texts independent of the current cluster.

This is mainly to support UMAPINFO which does not have clusters but has been extended to define separate exit texts for each target map that can be reached from a given map.
Special names 'normal' and 'secret' can be used to define texts specific to the default exits.

New MAPINFO properties:

* exittext = mapname, "text"...
* textmusic = mapname, "musicname", order
* textflat = mapname, flatname
* textpic = mapname, picname

textflat and textpic are like 'flat' and 'pic' for clusters, one defines a tiled background, the other a fullscreen image.
Setting an empty exittext will disable a cluster-based text screen that may apply to the given map.
This commit is contained in:
Christoph Oelckers 2017-07-30 22:49:50 +02:00
parent c07a4461a0
commit 49b77f3a17
3 changed files with 193 additions and 16 deletions

View file

@ -694,11 +694,13 @@ const char *G_GetSecretExitMap()
void G_ExitLevel (int position, bool keepFacing) void G_ExitLevel (int position, bool keepFacing)
{ {
level.flags3 |= LEVEL3_EXITNORMALUSED;
G_ChangeLevel(G_GetExitMap(), position, keepFacing ? CHANGELEVEL_KEEPFACING : 0); G_ChangeLevel(G_GetExitMap(), position, keepFacing ? CHANGELEVEL_KEEPFACING : 0);
} }
void G_SecretExitLevel (int position) void G_SecretExitLevel (int position)
{ {
level.flags3 |= LEVEL3_EXITSECRETUSED;
G_ChangeLevel(G_GetSecretExitMap(), position, 0); G_ChangeLevel(G_GetSecretExitMap(), position, 0);
} }
@ -1110,16 +1112,55 @@ void G_WorldDone (void)
} }
} }
F_StartFinale (thiscluster->MessageMusic, thiscluster->musicorder, auto ext = level.info->ExitMapTexts.CheckKey(level.flags3 & LEVEL3_EXITSECRETUSED ? NAME_Secret : NAME_Normal);
thiscluster->cdtrack, thiscluster->cdid, if (ext != nullptr && (ext->mDefined & FExitText::DEF_TEXT))
thiscluster->FinaleFlat, thiscluster->ExitText, {
thiscluster->flags & CLUSTER_EXITTEXTINLUMP, F_StartFinale(ext->mDefined & FExitText::DEF_MUSIC ? ext->mMusic : gameinfo.finaleMusic,
thiscluster->flags & CLUSTER_FINALEPIC, ext->mDefined & FExitText::DEF_MUSIC ? ext->mOrder : gameinfo.finaleOrder,
thiscluster->flags & CLUSTER_LOOKUPEXITTEXT, -1, 0,
true, endsequence); ext->mDefined & FExitText::DEF_BACKDROP ? ext->mBackdrop : gameinfo.FinaleFlat,
ext->mText,
false,
ext->mDefined & FExitText::DEF_PIC,
ext->mDefined & FExitText::DEF_LOOKUP,
true, endsequence);
}
else
{
F_StartFinale(thiscluster->MessageMusic, thiscluster->musicorder,
thiscluster->cdtrack, thiscluster->cdid,
thiscluster->FinaleFlat, thiscluster->ExitText,
thiscluster->flags & CLUSTER_EXITTEXTINLUMP,
thiscluster->flags & CLUSTER_FINALEPIC,
thiscluster->flags & CLUSTER_LOOKUPEXITTEXT,
true, endsequence);
}
} }
else else
{ {
FExitText *ext = nullptr;
if (level.flags3 & LEVEL3_EXITSECRETUSED) ext = level.info->ExitMapTexts.CheckKey(NAME_Secret);
else if (level.flags3 & LEVEL3_EXITNORMALUSED) ext = level.info->ExitMapTexts.CheckKey(NAME_Normal);
if (ext == nullptr) ext = level.info->ExitMapTexts.CheckKey(nextlevel);
if (ext != nullptr)
{
if ((ext->mDefined & FExitText::DEF_TEXT))
{
F_StartFinale(ext->mDefined & FExitText::DEF_MUSIC ? ext->mMusic : gameinfo.finaleMusic,
ext->mDefined & FExitText::DEF_MUSIC ? ext->mOrder : gameinfo.finaleOrder,
-1, 0,
ext->mDefined & FExitText::DEF_BACKDROP ? ext->mBackdrop : gameinfo.FinaleFlat,
ext->mText,
false,
ext->mDefined & FExitText::DEF_PIC,
ext->mDefined & FExitText::DEF_LOOKUP,
false);
}
return;
}
nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster); nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster);
if (nextcluster->cluster != level.cluster && !deathmatch) if (nextcluster->cluster != level.cluster && !deathmatch)

View file

@ -95,6 +95,9 @@ struct FMapInfoParser
void ParseMusic(FString &name, int &order); void ParseMusic(FString &name, int &order);
//void ParseLumpOrTextureName(char *name); //void ParseLumpOrTextureName(char *name);
void ParseLumpOrTextureName(FString &name); void ParseLumpOrTextureName(FString &name);
void ParseExitText(FName formap, level_info_t *info);
void ParseExitMusic(FName formap, level_info_t *info);
void ParseExitBackdrop(FName formap, level_info_t *info, bool ispic);
void ParseCluster(); void ParseCluster();
void ParseNextMap(FString &mapname); void ParseNextMap(FString &mapname);
@ -241,6 +244,8 @@ enum ELevelFlags : unsigned int
LEVEL3_ATTENUATE = 0x00000004, // attenuate lights? LEVEL3_ATTENUATE = 0x00000004, // attenuate lights?
LEVEL3_NOLIGHTFADE = 0x00000008, // no light fading to black. LEVEL3_NOLIGHTFADE = 0x00000008, // no light fading to black.
LEVEL3_NOCOLOREDSPRITELIGHTING = 0x00000010, // draw sprites only with color-less light LEVEL3_NOCOLOREDSPRITELIGHTING = 0x00000010, // draw sprites only with color-less light
LEVEL3_EXITNORMALUSED = 0x00000020,
LEVEL3_EXITSECRETUSED = 0x00000040,
}; };
@ -287,6 +292,23 @@ enum EMapType : int
MAPTYPE_UDMF // This does not distinguish between namespaces. MAPTYPE_UDMF // This does not distinguish between namespaces.
}; };
struct FExitText
{
enum EDefined
{
DEF_TEXT = 1,
DEF_MUSIC = 2,
DEF_BACKDROP = 4,
DEF_LOOKUP = 8,
DEF_PIC = 16
};
int16_t mDefined = 0;
int16_t mOrder = -1;
FString mText;
FString mMusic;
FString mBackdrop;
};
struct level_info_t struct level_info_t
{ {
int levelnum; int levelnum;
@ -302,6 +324,8 @@ struct level_info_t
FString BorderTexture; FString BorderTexture;
FString MapBackground; FString MapBackground;
TMap<FName, FExitText> ExitMapTexts;
int cluster; int cluster;
int partime; int partime;
int sucktime; int sucktime;

View file

@ -607,15 +607,6 @@ bool FMapInfoParser::ParseLookupName(FString &dest)
// //
//========================================================================== //==========================================================================
/*
void FMapInfoParser::ParseLumpOrTextureName(char *name)
{
sc.MustGetString();
uppercopy(name, sc.String);
name[8]=0;
}
*/
void FMapInfoParser::ParseLumpOrTextureName(FString &name) void FMapInfoParser::ParseLumpOrTextureName(FString &name)
{ {
sc.MustGetString(); sc.MustGetString();
@ -623,6 +614,91 @@ void FMapInfoParser::ParseLumpOrTextureName(FString &name)
} }
//==========================================================================
//
//
//==========================================================================
void FMapInfoParser::ParseExitText(FName formap, level_info_t *info)
{
FString nexttext;
bool nextlookup = ParseLookupName(nexttext);
auto def = info->ExitMapTexts.CheckKey(formap);
if (def != nullptr)
{
def->mText = nexttext;
if (nextlookup) def->mDefined |= FExitText::DEF_LOOKUP;
else def->mDefined &= ~FExitText::DEF_LOOKUP;
def->mDefined |= FExitText::DEF_TEXT;
}
else
{
FExitText def;
def.mText = nexttext;
if (nextlookup) def.mDefined |= FExitText::DEF_LOOKUP;
def.mDefined |= FExitText::DEF_TEXT;
info->ExitMapTexts.Insert(formap, def);
}
}
//==========================================================================
//
//
//==========================================================================
void FMapInfoParser::ParseExitMusic(FName formap, level_info_t *info)
{
FString music;
int order;
ParseMusic(music, order);
auto def = info->ExitMapTexts.CheckKey(formap);
if (def != nullptr)
{
def->mMusic = music;
def->mOrder = order;
def->mDefined |= FExitText::DEF_MUSIC;
}
else
{
FExitText def;
def.mMusic = music;
def.mOrder = order;
def.mDefined |= FExitText::DEF_MUSIC;
info->ExitMapTexts.Insert(formap, def);
}
}
//==========================================================================
//
//
//==========================================================================
void FMapInfoParser::ParseExitBackdrop(FName formap, level_info_t *info, bool ispic)
{
FString drop;
ParseLumpOrTextureName(drop);
auto def = info->ExitMapTexts.CheckKey(formap);
if (def != nullptr)
{
def->mBackdrop = drop;
def->mDefined |= FExitText::DEF_BACKDROP;
if (ispic) def->mDefined |= FExitText::DEF_PIC;
else def->mDefined &= ~FExitText::DEF_PIC;
}
else
{
FExitText def;
def.mBackdrop = drop;
def.mDefined |= FExitText::DEF_BACKDROP;
def.mDefined |= FExitText::DEF_MUSIC;
if (ispic) def.mDefined |= FExitText::DEF_PIC;
info->ExitMapTexts.Insert(formap, def);
}
}
//========================================================================== //==========================================================================
// //
// //
@ -1177,6 +1253,42 @@ DEFINE_MAP_OPTION(mapbackground, true)
parse.ParseLumpOrTextureName(info->MapBackground); parse.ParseLumpOrTextureName(info->MapBackground);
} }
DEFINE_MAP_OPTION(exittext, false)
{
parse.ParseAssign();
parse.sc.MustGetString();
FName nextmap = parse.sc.String;
parse.ParseComma();
parse.ParseExitText(nextmap, info);
}
DEFINE_MAP_OPTION(textmusic, false)
{
parse.ParseAssign();
parse.sc.MustGetString();
FName nextmap = parse.sc.String;
parse.ParseComma();
parse.ParseExitMusic(nextmap, info);
}
DEFINE_MAP_OPTION(textflat, false)
{
parse.ParseAssign();
parse.sc.MustGetString();
FName nextmap = parse.sc.String;
parse.ParseComma();
parse.ParseExitBackdrop(nextmap, info, false);
}
DEFINE_MAP_OPTION(textpic, false)
{
parse.ParseAssign();
parse.sc.MustGetString();
FName nextmap = parse.sc.String;
parse.ParseComma();
parse.ParseExitBackdrop(nextmap, info, true);
}
DEFINE_MAP_OPTION(defaultenvironment, false) DEFINE_MAP_OPTION(defaultenvironment, false)
{ {
int id; int id;