This commit is contained in:
Christoph Oelckers 2014-05-15 09:46:47 +02:00
commit 4e64ad847b
52 changed files with 493 additions and 324 deletions

View File

@ -37,7 +37,7 @@ In addition to the base specification ZDoom recognizes the following lumps
between the TEXTMAP and ENDMAP lumps: between the TEXTMAP and ENDMAP lumps:
BEHAVIOR = contains compiled ACS code BEHAVIOR = contains compiled ACS code
DIALOGUE = contains compiled Strife conversation scripts. DIALOGUE = contains compiled Strife or USDF conversation scripts.
ZNODES = Nodes (must be stored as extended GL nodes. Compression is allowed ZNODES = Nodes (must be stored as extended GL nodes. Compression is allowed
but deprecated for portability reasons.) but deprecated for portability reasons.)
BLOCKMAP = blockmap. It is recommended not to include this lump in UDMF maps. BLOCKMAP = blockmap. It is recommended not to include this lump in UDMF maps.
@ -166,6 +166,14 @@ Note: All <bool> fields default to false unless mentioned otherwise.
yscaleceiling = <float>; // Y texture scale of ceiling texture, Default = 1.0. yscaleceiling = <float>; // Y texture scale of ceiling texture, Default = 1.0.
rotationfloor = <float>; // Rotation of floor texture in degrees, Default = 0.0. rotationfloor = <float>; // Rotation of floor texture in degrees, Default = 0.0.
rotationceiling = <float>; // Rotation of ceiling texture in degrees, Default = 0.0. rotationceiling = <float>; // Rotation of ceiling texture in degrees, Default = 0.0.
ceilingplane_a = <float>; // Define the plane equation for the sector's ceiling. Default is a horizontal plane at 'heightceiling'.
ceilingplane_b = <float>; // 'heightceiling' will still be used to calculate texture alignment.
ceilingplane_c = <float>; // The plane equation will only be used if all 4 values are given.
ceilingplane_d = <float>;
floorplane_a = <float>; // Define the plane equation for the sector's floor. Default is a horizontal plane at 'heightfloor'.
floorplane_b = <float>; // 'heightfloor' will still be used to calculate texture alignment.
floorplane_c = <float>; // The plane equation will only be used if all 4 values are given.
floorplane_d = <float>;
lightfloor = <integer>; // The floor's light level. Default is 0. lightfloor = <integer>; // The floor's light level. Default is 0.
lightceiling = <integer>; // The ceiling's light level. Default is 0. lightceiling = <integer>; // The ceiling's light level. Default is 0.
lightfloorabsolute = <bool>; // true = 'lightfloor' is an absolute value. Default is lightfloorabsolute = <bool>; // true = 'lightfloor' is an absolute value. Default is
@ -355,6 +363,10 @@ Added waterzone sector property.
1.22 12.04.2014 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. 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.
1.24 14.05.2014
Added plane equations for sector slopes. (Please read carefully to ensure proper use!)
Changed language describing the DIALOGUE lump to mention USDF as an option.
=============================================================================== ===============================================================================
EOF EOF
=============================================================================== ===============================================================================

View File

@ -986,14 +986,10 @@ CCMD(nextmap)
TEXTCOLOR_NORMAL " is for single-player only.\n"); TEXTCOLOR_NORMAL " is for single-player only.\n");
return; return;
} }
char *next = NULL;
if (*level.nextmap) if (level.NextMap.Len() > 0 && level.NextMap.Compare("enDSeQ", 6))
next = level.nextmap;
if (next != NULL && strncmp(next, "enDSeQ", 6))
{ {
G_DeferedInitNew(next); G_DeferedInitNew(level.NextMap);
} }
else else
{ {
@ -1016,12 +1012,9 @@ CCMD(nextsecret)
} }
char *next = NULL; char *next = NULL;
if (*level.secretmap) if (level.NextSecretMap.Len() > 0 && level.NextSecretMap.Compare("enDSeQ", 6))
next = level.secretmap;
if (next != NULL && strncmp(next, "enDSeQ", 6))
{ {
G_DeferedInitNew(next); G_DeferedInitNew(level.NextSecretMap);
} }
else else
{ {
@ -1107,8 +1100,8 @@ static void PrintSecretString(const char *string, bool thislevel)
CCMD(secret) CCMD(secret)
{ {
const char *mapname = argv.argc() < 2? level.mapname : argv[1]; const char *mapname = argv.argc() < 2? level.MapName.GetChars() : argv[1];
bool thislevel = !stricmp(mapname, level.mapname); bool thislevel = !stricmp(mapname, level.MapName);
bool foundsome = false; bool foundsome = false;
int lumpno=Wads.CheckNumForName("SECRETS"); int lumpno=Wads.CheckNumForName("SECRETS");

View File

@ -303,7 +303,7 @@ void C_InitConback()
if (!conback.isValid()) if (!conback.isValid())
{ {
conback = TexMan.GetTexture (gameinfo.titlePage, FTexture::TEX_MiscPatch); conback = TexMan.GetTexture (gameinfo.TitlePage, FTexture::TEX_MiscPatch);
conshade = MAKEARGB(175,0,0,0); conshade = MAKEARGB(175,0,0,0);
conline = true; conline = true;
} }

View File

@ -1234,7 +1234,7 @@ void D_DoAdvanceDemo (void)
static char demoname[8] = "DEMO1"; static char demoname[8] = "DEMO1";
static int democount = 0; static int democount = 0;
static int pagecount; static int pagecount;
const char *pagename = NULL; FString pagename;
advancedemo = false; advancedemo = false;
@ -1299,7 +1299,7 @@ void D_DoAdvanceDemo (void)
default: default:
case 0: case 0:
gamestate = GS_DEMOSCREEN; gamestate = GS_DEMOSCREEN;
pagename = gameinfo.titlePage; pagename = gameinfo.TitlePage;
pagetic = (int)(gameinfo.titleTime * TICRATE); pagetic = (int)(gameinfo.titleTime * TICRATE);
S_ChangeMusic (gameinfo.titleMusic, gameinfo.titleOrder, false); S_ChangeMusic (gameinfo.titleMusic, gameinfo.titleOrder, false);
demosequence = 3; demosequence = 3;

View File

@ -2573,7 +2573,7 @@ static void RunScript(BYTE **stream, APlayerPawn *pawn, int snum, int argn, int
arg[i] = argval; arg[i] = argval;
} }
} }
P_StartScript(pawn, NULL, snum, level.mapname, arg, MIN<int>(countof(arg), argn), ACS_NET | always); P_StartScript(pawn, NULL, snum, level.MapName, arg, MIN<int>(countof(arg), argn), ACS_NET | always);
} }
void Net_SkipCommand (int type, BYTE **stream) void Net_SkipCommand (int type, BYTE **stream)

View File

@ -202,15 +202,13 @@ void FScriptLoader::ParseInfoCmd(char *line, FString &scriptsrc)
{ {
sc.MustGetStringName("="); sc.MustGetStringName("=");
sc.MustGetString(); sc.MustGetString();
strncpy(level.nextmap, sc.String, 8); level.NextMap = sc.String;
level.nextmap[8]=0;
} }
else if (sc.Compare("nextsecret")) else if (sc.Compare("nextsecret"))
{ {
sc.MustGetStringName("="); sc.MustGetStringName("=");
sc.MustGetString(); sc.MustGetString();
strncpy(level.secretmap, sc.String, 8); level.NextSecretMap = sc.String;
level.secretmap[8]=0;
} }
else if (sc.Compare("drown")) else if (sc.Compare("drown"))
{ {

View File

@ -1621,7 +1621,7 @@ void G_DoReborn (int playernum, bool freshbot)
{ // Reload the level from scratch { // Reload the level from scratch
bool indemo = demoplayback; bool indemo = demoplayback;
BackupSaveName = ""; BackupSaveName = "";
G_InitNew (level.mapname, false); G_InitNew (level.MapName, false);
demoplayback = indemo; demoplayback = indemo;
// gameaction = ga_loadlevel; // gameaction = ga_loadlevel;
} }
@ -2027,7 +2027,7 @@ static void PutSaveComment (FILE *file)
// Get level name // Get level name
//strcpy (comment, level.level_name); //strcpy (comment, level.level_name);
mysnprintf(comment, countof(comment), "%s - %s", level.mapname, level.LevelName.GetChars()); mysnprintf(comment, countof(comment), "%s - %s", level.MapName.GetChars(), level.LevelName.GetChars());
len = (WORD)strlen (comment); len = (WORD)strlen (comment);
comment[len] = '\n'; comment[len] = '\n';
@ -2088,7 +2088,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
M_AppendPNGText (stdfile, "Engine", GAMESIG); M_AppendPNGText (stdfile, "Engine", GAMESIG);
M_AppendPNGText (stdfile, "ZDoom Save Version", SAVESIG); M_AppendPNGText (stdfile, "ZDoom Save Version", SAVESIG);
M_AppendPNGText (stdfile, "Title", description); M_AppendPNGText (stdfile, "Title", description);
M_AppendPNGText (stdfile, "Current Map", level.mapname); M_AppendPNGText (stdfile, "Current Map", level.MapName);
PutSaveWads (stdfile); PutSaveWads (stdfile);
PutSaveComment (stdfile); PutSaveComment (stdfile);
@ -2289,7 +2289,7 @@ void G_BeginRecording (const char *startmap)
if (startmap == NULL) if (startmap == NULL)
{ {
startmap = level.mapname; startmap = level.MapName;
} }
demo_p = demobuffer; demo_p = demobuffer;

View File

@ -88,7 +88,7 @@ void AHeresiarch::Die (AActor *source, AActor *inflictor, int dmgflags)
if (script != 0) if (script != 0)
{ {
P_StartScript (this, NULL, script, level.mapname, NULL, 0, 0); P_StartScript (this, NULL, script, level.MapName, NULL, 0, 0);
} }
} }

View File

@ -445,10 +445,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
bglobal.Init (); bglobal.Init ();
} }
if (mapname != level.mapname) level.MapName = mapname;
{
strcpy (level.mapname, mapname);
}
if (bTitleLevel) if (bTitleLevel)
{ {
gamestate = GS_TITLELEVEL; gamestate = GS_TITLELEVEL;
@ -491,9 +488,9 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
{ {
// end the game // end the game
levelname = NULL; levelname = NULL;
if (!strncmp(level.nextmap, "enDSeQ",6)) if (!level.NextMap.Compare("enDSeQ",6))
{ {
levelname = level.nextmap; // If there is already an end sequence please leave it alone! nextlevel = level.NextMap; // If there is already an end sequence please leave it alone!
} }
else else
{ {
@ -509,12 +506,14 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
if (nextredir != NULL) if (nextredir != NULL)
{ {
nextinfo = nextredir; nextinfo = nextredir;
levelname = nextinfo->mapname;
} }
} }
nextlevel = nextinfo->MapName;
}
else
{
nextlevel = levelname;
} }
if (levelname != NULL) nextlevel = levelname;
if (nextSkill != -1) if (nextSkill != -1)
NextSkill = nextSkill; NextSkill = nextSkill;
@ -596,18 +595,18 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
const char *G_GetExitMap() const char *G_GetExitMap()
{ {
return level.nextmap; return level.NextMap;
} }
const char *G_GetSecretExitMap() const char *G_GetSecretExitMap()
{ {
const char *nextmap = level.nextmap; const char *nextmap = level.NextMap;
if (level.secretmap[0] != 0) if (level.NextSecretMap.Len() > 0)
{ {
if (P_CheckMapData(level.secretmap)) if (P_CheckMapData(level.NextSecretMap))
{ {
nextmap = level.secretmap; nextmap = level.NextSecretMap;
} }
} }
return nextmap; return nextmap;
@ -641,7 +640,7 @@ void G_DoCompleted (void)
if (gamestate == GS_TITLELEVEL) if (gamestate == GS_TITLELEVEL)
{ {
strncpy (level.mapname, nextlevel, 255); level.MapName = nextlevel;
G_DoLoadLevel (startpos, false); G_DoLoadLevel (startpos, false);
startpos = 0; startpos = 0;
viewactive = true; viewactive = true;
@ -650,20 +649,20 @@ void G_DoCompleted (void)
// [RH] Mark this level as having been visited // [RH] Mark this level as having been visited
if (!(level.flags & LEVEL_CHANGEMAPCHEAT)) if (!(level.flags & LEVEL_CHANGEMAPCHEAT))
FindLevelInfo (level.mapname)->flags |= LEVEL_VISITED; FindLevelInfo (level.MapName)->flags |= LEVEL_VISITED;
if (automapactive) if (automapactive)
AM_Stop (); AM_Stop ();
wminfo.finished_ep = level.cluster - 1; wminfo.finished_ep = level.cluster - 1;
wminfo.LName0 = TexMan[TexMan.CheckForTexture(level.info->pname, FTexture::TEX_MiscPatch)]; wminfo.LName0 = TexMan[TexMan.CheckForTexture(level.info->PName, FTexture::TEX_MiscPatch)];
wminfo.current = level.mapname; wminfo.current = level.MapName;
if (deathmatch && if (deathmatch &&
(dmflags & DF_SAME_LEVEL) && (dmflags & DF_SAME_LEVEL) &&
!(level.flags & LEVEL_CHANGEMAPCHEAT)) !(level.flags & LEVEL_CHANGEMAPCHEAT))
{ {
wminfo.next = level.mapname; wminfo.next = level.MapName;
wminfo.LName1 = wminfo.LName0; wminfo.LName1 = wminfo.LName0;
} }
else else
@ -676,8 +675,8 @@ void G_DoCompleted (void)
} }
else else
{ {
wminfo.next = nextinfo->mapname; wminfo.next = nextinfo->MapName;
wminfo.LName1 = TexMan[TexMan.CheckForTexture(nextinfo->pname, FTexture::TEX_MiscPatch)]; wminfo.LName1 = TexMan[TexMan.CheckForTexture(nextinfo->PName, FTexture::TEX_MiscPatch)];
} }
} }
@ -850,7 +849,7 @@ void G_DoLoadLevel (int position, bool autosave)
"\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36" "\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36"
"\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n" "\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"
TEXTCOLOR_BOLD "%s - %s\n\n", TEXTCOLOR_BOLD "%s - %s\n\n",
level.mapname, level.LevelName.GetChars()); level.MapName.GetChars(), level.LevelName.GetChars());
if (wipegamestate == GS_LEVEL) if (wipegamestate == GS_LEVEL)
wipegamestate = GS_FORCEWIPE; wipegamestate = GS_FORCEWIPE;
@ -899,7 +898,7 @@ void G_DoLoadLevel (int position, bool autosave)
} }
level.maptime = 0; level.maptime = 0;
P_SetupLevel (level.mapname, position); P_SetupLevel (level.MapName, position);
AM_LevelInit(); AM_LevelInit();
@ -1056,7 +1055,7 @@ void G_DoWorldDone (void)
} }
else else
{ {
strncpy (level.mapname, nextlevel, 255); level.MapName = nextlevel;
} }
G_StartTravel (); G_StartTravel ();
G_DoLoadLevel (startpos, true); G_DoLoadLevel (startpos, true);
@ -1217,7 +1216,7 @@ void G_InitLevelLocals ()
level.flags = 0; level.flags = 0;
level.flags2 = 0; level.flags2 = 0;
info = FindLevelInfo (level.mapname); info = FindLevelInfo (level.MapName);
level.info = info; level.info = info;
level.skyspeed1 = info->skyspeed1; level.skyspeed1 = info->skyspeed1;
@ -1274,10 +1273,8 @@ void G_InitLevelLocals ()
level.musicorder = info->musicorder; level.musicorder = info->musicorder;
level.LevelName = level.info->LookupLevelName(); level.LevelName = level.info->LookupLevelName();
strncpy (level.nextmap, info->nextmap, 10); level.NextMap = info->NextMap;
level.nextmap[10] = 0; level.NextSecretMap = info->NextSecretMap;
strncpy (level.secretmap, info->secretmap, 10);
level.secretmap[10] = 0;
compatflags.Callback(); compatflags.Callback();
compatflags2.Callback(); compatflags2.Callback();
@ -1621,7 +1618,7 @@ static void writeMapName (FArchive &arc, const char *name)
static void writeSnapShot (FArchive &arc, level_info_t *i) static void writeSnapShot (FArchive &arc, level_info_t *i)
{ {
arc << i->snapshotVer; arc << i->snapshotVer;
writeMapName (arc, i->mapname); writeMapName (arc, i->MapName);
i->snapshot->Serialize (arc); i->snapshot->Serialize (arc);
} }
@ -1659,7 +1656,7 @@ void G_WriteSnapshots (FILE *file)
{ {
arc = new FPNGChunkArchive (file, VIST_ID); arc = new FPNGChunkArchive (file, VIST_ID);
} }
writeMapName (*arc, wadlevelinfos[i].mapname); writeMapName (*arc, wadlevelinfos[i].MapName);
} }
} }
@ -1798,7 +1795,7 @@ CCMD(listsnapshots)
{ {
unsigned int comp, uncomp; unsigned int comp, uncomp;
snapshot->GetSizes(comp, uncomp); snapshot->GetSizes(comp, uncomp);
Printf("%s (%u -> %u bytes)\n", wadlevelinfos[i].mapname, comp, uncomp); Printf("%s (%u -> %u bytes)\n", wadlevelinfos[i].MapName.GetChars(), comp, uncomp);
} }
} }
} }
@ -1810,7 +1807,7 @@ CCMD(listsnapshots)
static void writeDefereds (FArchive &arc, level_info_t *i) static void writeDefereds (FArchive &arc, level_info_t *i)
{ {
writeMapName (arc, i->mapname); writeMapName (arc, i->MapName);
arc << i->defered; arc << i->defered;
} }
@ -1922,11 +1919,11 @@ CCMD(listmaps)
for(unsigned i = 0; i < wadlevelinfos.Size(); i++) for(unsigned i = 0; i < wadlevelinfos.Size(); i++)
{ {
level_info_t *info = &wadlevelinfos[i]; level_info_t *info = &wadlevelinfos[i];
MapData *map = P_OpenMapData(info->mapname, true); MapData *map = P_OpenMapData(info->MapName, true);
if (map != NULL) if (map != NULL)
{ {
Printf("%s: '%s' (%s)\n", info->mapname, info->LookupLevelName().GetChars(), Printf("%s: '%s' (%s)\n", info->MapName.GetChars(), info->LookupLevelName().GetChars(),
Wads.GetWadName(Wads.GetLumpFile(map->lumpnum))); Wads.GetWadName(Wads.GetLumpFile(map->lumpnum)));
delete map; delete map;
} }

View File

@ -83,7 +83,7 @@ struct FMapInfoParser
void ParseLumpOrTextureName(FString &name); void ParseLumpOrTextureName(FString &name);
void ParseCluster(); void ParseCluster();
void ParseNextMap(char *mapname); void ParseNextMap(FString &mapname);
level_info_t *ParseMapHeader(level_info_t &defaultinfo); level_info_t *ParseMapHeader(level_info_t &defaultinfo);
void ParseMapDefinition(level_info_t &leveldef); void ParseMapDefinition(level_info_t &leveldef);
void ParseGameInfo(); void ParseGameInfo();
@ -269,10 +269,10 @@ struct level_info_t
{ {
int levelnum; int levelnum;
char mapname[9]; FString MapName;
char pname[9]; FString NextMap;
char nextmap[11]; FString NextSecretMap;
char secretmap[11]; FString PName;
FString SkyPic1; FString SkyPic1;
FString SkyPic2; FString SkyPic2;
FString FadeTable; FString FadeTable;
@ -313,7 +313,7 @@ struct level_info_t
// Redirection: If any player is carrying the specified item, then // Redirection: If any player is carrying the specified item, then
// you go to the RedirectMap instead of this one. // you go to the RedirectMap instead of this one.
FName RedirectType; FName RedirectType;
char RedirectMap[9]; FString RedirectMapName;
FString EnterPic; FString EnterPic;
FString ExitPic; FString ExitPic;
@ -391,9 +391,9 @@ struct FLevelLocals
int levelnum; int levelnum;
int lumpnum; int lumpnum;
FString LevelName; FString LevelName;
char mapname[256]; // the lump name (E1M1, MAP01, etc) FString MapName; // the lump name (E1M1, MAP01, etc)
char nextmap[11]; // go here when using the regular exit FString NextMap; // go here when using the regular exit
char secretmap[11]; // map to go to when used secret exit FString NextSecretMap; // map to go to when used secret exit
EMapType maptype; EMapType maptype;
DWORD flags; DWORD flags;

View File

@ -71,9 +71,10 @@ extern TMap<int, FString> HexenMusic;
static int FindWadLevelInfo (const char *name) static int FindWadLevelInfo (const char *name)
{ {
for (unsigned int i = 0; i < wadlevelinfos.Size(); i++) for (unsigned int i = 0; i < wadlevelinfos.Size(); i++)
if (!strnicmp (name, wadlevelinfos[i].mapname, 8)) {
if (!wadlevelinfos[i].MapName.CompareNoCase(name))
return i; return i;
}
return -1; return -1;
} }
@ -144,7 +145,7 @@ bool CheckWarpTransMap (FString &mapname, bool substitute)
level_info_t *lev = FindLevelByWarpTrans (atoi (&mapname[4])); level_info_t *lev = FindLevelByWarpTrans (atoi (&mapname[4]));
if (lev != NULL) if (lev != NULL)
{ {
mapname = lev->mapname; mapname = lev->MapName;
return true; return true;
} }
else if (substitute) else if (substitute)
@ -224,12 +225,12 @@ void P_RemoveDefereds (void)
void level_info_t::Reset() void level_info_t::Reset()
{ {
mapname[0] = 0; MapName = "";
MapBackground = ""; MapBackground = "";
levelnum = 0; levelnum = 0;
pname[0] = 0; PName = "";
nextmap[0] = 0; NextMap = "";
secretmap[0] = 0; NextSecretMap = "";
SkyPic1 = SkyPic2 = "-NOFLAT-"; SkyPic1 = SkyPic2 = "-NOFLAT-";
cluster = 0; cluster = 0;
partime = 0; partime = 0;
@ -262,7 +263,7 @@ void level_info_t::Reset()
compatmask = compatmask2 = 0; compatmask = compatmask2 = 0;
Translator = ""; Translator = "";
RedirectType = 0; RedirectType = 0;
RedirectMap[0] = 0; RedirectMapName = "";
EnterPic = ""; EnterPic = "";
ExitPic = ""; ExitPic = "";
InterMusic = ""; InterMusic = "";
@ -299,17 +300,17 @@ FString level_info_t::LookupLevelName()
char checkstring[32]; char checkstring[32];
// Strip out the header from the localized string // Strip out the header from the localized string
if (mapname[0] == 'E' && mapname[2] == 'M') if (MapName.Len() > 3 && MapName[0] == 'E' && MapName[2] == 'M')
{ {
mysnprintf (checkstring, countof(checkstring), "%s: ", mapname); mysnprintf (checkstring, countof(checkstring), "%s: ", MapName.GetChars());
} }
else if (mapname[0] == 'M' && mapname[1] == 'A' && mapname[2] == 'P') else if (MapName.Len() > 3 && MapName[0] == 'M' && MapName[1] == 'A' && MapName[2] == 'P')
{ {
mysnprintf (checkstring, countof(checkstring), "%d: ", atoi(mapname + 3)); mysnprintf (checkstring, countof(checkstring), "%d: ", atoi(&MapName[3]));
} }
else if (mapname[0] == 'L' && mapname[1] == 'E' && mapname[2] == 'V' && mapname[3] == 'E' && mapname[4] == 'L') else if (MapName.Len() > 5 && MapName[0] == 'L' && MapName[1] == 'E' && MapName[2] == 'V' && MapName[3] == 'E' && MapName[4] == 'L')
{ {
mysnprintf (checkstring, countof(checkstring), "%d: ", atoi(mapname + 5)); mysnprintf (checkstring, countof(checkstring), "%d: ", atoi(&MapName[5]));
} }
thename = strstr (lookedup, checkstring); thename = strstr (lookedup, checkstring);
if (thename == NULL) if (thename == NULL)
@ -372,9 +373,9 @@ level_info_t *level_info_t::CheckLevelRedirect ()
if (playeringame[i] && players[i].mo->FindInventory (type)) if (playeringame[i] && players[i].mo->FindInventory (type))
{ {
// check for actual presence of the map. // check for actual presence of the map.
if (P_CheckMapData(RedirectMap)) if (P_CheckMapData(RedirectMapName))
{ {
return FindLevelInfo(RedirectMap); return FindLevelInfo(RedirectMapName);
} }
break; break;
} }
@ -391,7 +392,7 @@ level_info_t *level_info_t::CheckLevelRedirect ()
bool level_info_t::isValid() bool level_info_t::isValid()
{ {
return mapname[0] != 0 || this == &TheDefaultLevelInfo; return MapName.Len() != 0 || this == &TheDefaultLevelInfo;
} }
//========================================================================== //==========================================================================
@ -764,29 +765,27 @@ void FMapInfoParser::ParseCluster()
// //
//========================================================================== //==========================================================================
void FMapInfoParser::ParseNextMap(char *mapname) void FMapInfoParser::ParseNextMap(FString &mapname)
{ {
if (sc.CheckNumber()) if (sc.CheckNumber())
{ {
if (HexenHack) if (HexenHack)
{ {
mysnprintf (mapname, 9, "&wt@%02d", sc.Number); mapname.Format("&wt@%02d", sc.Number);
} }
else else
{ {
mysnprintf (mapname, 9, "MAP%02d", sc.Number); mapname.Format("MAP%02d", sc.Number);
} }
} }
else else
{ {
*mapname = 0;
sc.MustGetString(); sc.MustGetString();
strncpy (mapname, sc.String, 8); mapname = sc.String;
mapname[8] = 0;
FName seq = CheckEndSequence(); FName seq = CheckEndSequence();
if (seq != NAME_None) if (seq != NAME_None)
{ {
mysnprintf(mapname, 11, "enDSeQ%04x", int(seq)); mapname.Format("enDSeQ%04x", int(seq));
} }
} }
} }
@ -807,19 +806,19 @@ DEFINE_MAP_OPTION(levelnum, true)
DEFINE_MAP_OPTION(next, true) DEFINE_MAP_OPTION(next, true)
{ {
parse.ParseAssign(); parse.ParseAssign();
parse.ParseNextMap(info->nextmap); parse.ParseNextMap(info->NextMap);
} }
DEFINE_MAP_OPTION(secretnext, true) DEFINE_MAP_OPTION(secretnext, true)
{ {
parse.ParseAssign(); parse.ParseAssign();
parse.ParseNextMap(info->secretmap); parse.ParseNextMap(info->NextSecretMap);
} }
DEFINE_MAP_OPTION(secret, true) // Just an alias for secretnext, for Vavoom compatibility DEFINE_MAP_OPTION(secret, true) // Just an alias for secretnext, for Vavoom compatibility
{ {
parse.ParseAssign(); parse.ParseAssign();
parse.ParseNextMap(info->secretmap); parse.ParseNextMap(info->NextSecretMap);
} }
DEFINE_MAP_OPTION(cluster, true) DEFINE_MAP_OPTION(cluster, true)
@ -898,7 +897,7 @@ DEFINE_MAP_OPTION(outsidefog, true)
DEFINE_MAP_OPTION(titlepatch, true) DEFINE_MAP_OPTION(titlepatch, true)
{ {
parse.ParseAssign(); parse.ParseAssign();
parse.ParseLumpOrTextureName(info->pname); parse.ParseLumpOrTextureName(info->PName);
} }
DEFINE_MAP_OPTION(partime, true) DEFINE_MAP_OPTION(partime, true)
@ -1072,7 +1071,7 @@ DEFINE_MAP_OPTION(redirect, true)
parse.sc.MustGetString(); parse.sc.MustGetString();
info->RedirectType = parse.sc.String; info->RedirectType = parse.sc.String;
parse.ParseComma(); parse.ParseComma();
parse.ParseLumpOrTextureName(info->RedirectMap); parse.ParseNextMap(info->RedirectMapName);
} }
DEFINE_MAP_OPTION(sndseq, true) DEFINE_MAP_OPTION(sndseq, true)
@ -1522,8 +1521,8 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo)
} }
uppercopy (levelinfo->mapname, mapname); levelinfo->MapName = mapname;
levelinfo->mapname[8] = 0; levelinfo->MapName.ToUpper();
sc.MustGetString (); sc.MustGetString ();
if (sc.String[0] == '$') if (sc.String[0] == '$')
{ {
@ -1543,7 +1542,7 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo)
// Set up levelnum now so that you can use Teleport_NewMap specials // Set up levelnum now so that you can use Teleport_NewMap specials
// to teleport to maps with standard names without needing a levelnum. // to teleport to maps with standard names without needing a levelnum.
levelinfo->levelnum = GetDefaultLevelNum(levelinfo->mapname); levelinfo->levelnum = GetDefaultLevelNum(levelinfo->MapName);
// Does this map have a song defined via SNDINFO's $map command? // Does this map have a song defined via SNDINFO's $map command?
// Set that as this map's default music if it does. // Set that as this map's default music if it does.

View File

@ -42,9 +42,9 @@ void ABasicArmor::Tick ()
AbsorbCount = 0; AbsorbCount = 0;
if (!Icon.isValid()) if (!Icon.isValid())
{ {
const char *icon = gameinfo.ArmorIcon1; FString icon = gameinfo.ArmorIcon1;
if (SavePercent >= gameinfo.Armor2Percent && gameinfo.ArmorIcon2[0] != 0) if (SavePercent >= gameinfo.Armor2Percent && gameinfo.ArmorIcon2.Len() != 0)
icon = gameinfo.ArmorIcon2; icon = gameinfo.ArmorIcon2;
if (icon[0] != 0) if (icon[0] != 0)

View File

@ -605,7 +605,13 @@ void APowerInvisibility::DoEffect ()
case (NAME_Stencil): case (NAME_Stencil):
Owner->RenderStyle = STYLE_Stencil; Owner->RenderStyle = STYLE_Stencil;
break; break;
case (NAME_None): case (NAME_AddStencil) :
Owner->RenderStyle = STYLE_AddStencil;
break;
case (NAME_TranslucentStencil) :
Owner->RenderStyle = STYLE_TranslucentStencil;
break;
case (NAME_None) :
case (NAME_Cumulative): case (NAME_Cumulative):
case (NAME_Translucent): case (NAME_Translucent):
Owner->RenderStyle = STYLE_Translucent; Owner->RenderStyle = STYLE_Translucent;
@ -685,7 +691,13 @@ int APowerInvisibility::AlterWeaponSprite (visstyle_t *vis)
case (NAME_Stencil): case (NAME_Stencil):
vis->RenderStyle = STYLE_Stencil; vis->RenderStyle = STYLE_Stencil;
break; break;
case (NAME_None): case (NAME_TranslucentStencil) :
vis->RenderStyle = STYLE_TranslucentStencil;
break;
case (NAME_AddStencil) :
vis->RenderStyle = STYLE_AddStencil;
break;
case (NAME_None) :
case (NAME_Cumulative): case (NAME_Cumulative):
case (NAME_Translucent): case (NAME_Translucent):
default: default:

View File

@ -82,10 +82,22 @@ void ASectorAction::Deactivate (AActor *source)
flags2 |= MF2_DORMANT; // Projectiles can trigger flags2 |= MF2_DORMANT; // Projectiles can trigger
} }
bool ASectorAction::TriggerAction (AActor *triggerer, int activationType) bool ASectorAction::TriggerAction(AActor *triggerer, int activationType)
{
if (DoTriggerAction(triggerer, activationType))
{
if (flags4 & MF4_STANDSTILL)
{
Destroy();
}
}
return false;
}
bool ASectorAction::DoTriggerAction (AActor *triggerer, int activationType)
{ {
if (tracer != NULL) if (tracer != NULL)
return barrier_cast<ASectorAction *>(tracer)->TriggerAction (triggerer, activationType); return barrier_cast<ASectorAction *>(tracer)->DoTriggerAction (triggerer, activationType);
else else
return false; return false;
} }
@ -93,7 +105,7 @@ bool ASectorAction::TriggerAction (AActor *triggerer, int activationType)
bool ASectorAction::CheckTrigger (AActor *triggerer) const bool ASectorAction::CheckTrigger (AActor *triggerer) const
{ {
if (special && if (special &&
(triggerer->player || ((triggerer->player && !(flags & MF_FRIENDLY)) ||
((flags & MF_AMBUSH) && (triggerer->flags2 & MF2_MCROSS)) || ((flags & MF_AMBUSH) && (triggerer->flags2 & MF2_MCROSS)) ||
((flags2 & MF2_DORMANT) && (triggerer->flags2 & MF2_PCROSS)))) ((flags2 & MF2_DORMANT) && (triggerer->flags2 & MF2_PCROSS))))
{ {
@ -110,16 +122,16 @@ class ASecActEnter : public ASectorAction
{ {
DECLARE_CLASS (ASecActEnter, ASectorAction) DECLARE_CLASS (ASecActEnter, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActEnter) IMPLEMENT_CLASS (ASecActEnter)
bool ASecActEnter::TriggerAction (AActor *triggerer, int activationType) bool ASecActEnter::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_Enter) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_Enter) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when leaving sector -------------------------------------------- // Triggered when leaving sector --------------------------------------------
@ -128,16 +140,16 @@ class ASecActExit : public ASectorAction
{ {
DECLARE_CLASS (ASecActExit, ASectorAction) DECLARE_CLASS (ASecActExit, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActExit) IMPLEMENT_CLASS (ASecActExit)
bool ASecActExit::TriggerAction (AActor *triggerer, int activationType) bool ASecActExit::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_Exit) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_Exit) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when hitting sector's floor ------------------------------------ // Triggered when hitting sector's floor ------------------------------------
@ -146,7 +158,7 @@ class ASecActHitFloor : public ASectorAction
{ {
DECLARE_CLASS (ASecActHitFloor, ASectorAction) DECLARE_CLASS (ASecActHitFloor, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
// Skull Tag uses 9999 for a special that is triggered whenever // Skull Tag uses 9999 for a special that is triggered whenever
@ -154,10 +166,10 @@ public:
IMPLEMENT_CLASS (ASecActHitFloor) IMPLEMENT_CLASS (ASecActHitFloor)
bool ASecActHitFloor::TriggerAction (AActor *triggerer, int activationType) bool ASecActHitFloor::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_HitFloor) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_HitFloor) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when hitting sector's ceiling ---------------------------------- // Triggered when hitting sector's ceiling ----------------------------------
@ -166,16 +178,16 @@ class ASecActHitCeil : public ASectorAction
{ {
DECLARE_CLASS (ASecActHitCeil, ASectorAction) DECLARE_CLASS (ASecActHitCeil, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActHitCeil) IMPLEMENT_CLASS (ASecActHitCeil)
bool ASecActHitCeil::TriggerAction (AActor *triggerer, int activationType) bool ASecActHitCeil::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_HitCeiling) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_HitCeiling) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when using inside sector --------------------------------------- // Triggered when using inside sector ---------------------------------------
@ -184,16 +196,16 @@ class ASecActUse : public ASectorAction
{ {
DECLARE_CLASS (ASecActUse, ASectorAction) DECLARE_CLASS (ASecActUse, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActUse) IMPLEMENT_CLASS (ASecActUse)
bool ASecActUse::TriggerAction (AActor *triggerer, int activationType) bool ASecActUse::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_Use) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_Use) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when using a sector's wall ------------------------------------- // Triggered when using a sector's wall -------------------------------------
@ -202,16 +214,16 @@ class ASecActUseWall : public ASectorAction
{ {
DECLARE_CLASS (ASecActUseWall, ASectorAction) DECLARE_CLASS (ASecActUseWall, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActUseWall) IMPLEMENT_CLASS (ASecActUseWall)
bool ASecActUseWall::TriggerAction (AActor *triggerer, int activationType) bool ASecActUseWall::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_UseWall) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_UseWall) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when eyes go below fake floor ---------------------------------- // Triggered when eyes go below fake floor ----------------------------------
@ -220,16 +232,16 @@ class ASecActEyesDive : public ASectorAction
{ {
DECLARE_CLASS (ASecActEyesDive, ASectorAction) DECLARE_CLASS (ASecActEyesDive, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActEyesDive) IMPLEMENT_CLASS (ASecActEyesDive)
bool ASecActEyesDive::TriggerAction (AActor *triggerer, int activationType) bool ASecActEyesDive::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_EyesDive) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_EyesDive) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when eyes go above fake floor ---------------------------------- // Triggered when eyes go above fake floor ----------------------------------
@ -238,16 +250,16 @@ class ASecActEyesSurface : public ASectorAction
{ {
DECLARE_CLASS (ASecActEyesSurface, ASectorAction) DECLARE_CLASS (ASecActEyesSurface, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActEyesSurface) IMPLEMENT_CLASS (ASecActEyesSurface)
bool ASecActEyesSurface::TriggerAction (AActor *triggerer, int activationType) bool ASecActEyesSurface::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_EyesSurface) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_EyesSurface) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when eyes go below fake floor ---------------------------------- // Triggered when eyes go below fake floor ----------------------------------
@ -256,16 +268,16 @@ class ASecActEyesBelowC : public ASectorAction
{ {
DECLARE_CLASS (ASecActEyesBelowC, ASectorAction) DECLARE_CLASS (ASecActEyesBelowC, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActEyesBelowC) IMPLEMENT_CLASS (ASecActEyesBelowC)
bool ASecActEyesBelowC::TriggerAction (AActor *triggerer, int activationType) bool ASecActEyesBelowC::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_EyesBelowC) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_EyesBelowC) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when eyes go above fake floor ---------------------------------- // Triggered when eyes go above fake floor ----------------------------------
@ -274,16 +286,16 @@ class ASecActEyesAboveC : public ASectorAction
{ {
DECLARE_CLASS (ASecActEyesAboveC, ASectorAction) DECLARE_CLASS (ASecActEyesAboveC, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActEyesAboveC) IMPLEMENT_CLASS (ASecActEyesAboveC)
bool ASecActEyesAboveC::TriggerAction (AActor *triggerer, int activationType) bool ASecActEyesAboveC::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_EyesAboveC) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_EyesAboveC) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }
// Triggered when eyes go below fake floor ---------------------------------- // Triggered when eyes go below fake floor ----------------------------------
@ -292,14 +304,14 @@ class ASecActHitFakeFloor : public ASectorAction
{ {
DECLARE_CLASS (ASecActHitFakeFloor, ASectorAction) DECLARE_CLASS (ASecActHitFakeFloor, ASectorAction)
public: public:
bool TriggerAction (AActor *triggerer, int activationType); bool DoTriggerAction (AActor *triggerer, int activationType);
}; };
IMPLEMENT_CLASS (ASecActHitFakeFloor) IMPLEMENT_CLASS (ASecActHitFakeFloor)
bool ASecActHitFakeFloor::TriggerAction (AActor *triggerer, int activationType) bool ASecActHitFakeFloor::DoTriggerAction (AActor *triggerer, int activationType)
{ {
bool didit = (activationType & SECSPAC_HitFakeFloor) ? CheckTrigger (triggerer) : false; bool didit = (activationType & SECSPAC_HitFakeFloor) ? CheckTrigger (triggerer) : false;
return didit | Super::TriggerAction (triggerer, activationType); return didit | Super::DoTriggerAction (triggerer, activationType);
} }

View File

@ -300,7 +300,7 @@ class CommandDrawImage : public SBarInfoCommandFlowControl
if (flags & DI_ALTERNATEONFAIL) if (flags & DI_ALTERNATEONFAIL)
{ {
SetTruth(texture == NULL || !(texture->GetID().isValid()), block, statusBar); SetTruth(texture == NULL || texture->UseType == FTexture::TEX_Null, block, statusBar);
} }
} }
protected: protected:
@ -830,7 +830,7 @@ class CommandDrawString : public SBarInfoCommand
if(level.lumpnum != cache) if(level.lumpnum != cache)
{ {
cache = level.lumpnum; cache = level.lumpnum;
str = level.mapname; str = level.MapName;
str.ToUpper(); str.ToUpper();
RealignString(); RealignString();
} }

View File

@ -131,7 +131,7 @@ void ST_FormatMapName(FString &mapname, const char *mapnamecolor)
if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub)) if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub))
{ {
mapname << level.mapname << ": "; mapname << level.MapName << ": ";
} }
mapname << mapnamecolor << level.LevelName; mapname << mapnamecolor << level.LevelName;
} }
@ -1090,12 +1090,12 @@ void DBaseStatusBar::RefreshBackground () const
if (setblocks >= 10) if (setblocks >= 10)
{ {
const gameborder_t *border = gameinfo.border; FTexture *p = TexMan[gameinfo.Border.b];
FTexture *p; if (p != NULL)
{
p = TexMan[border->b]; screen->FlatFill(0, y, x, y + p->GetHeight(), p, true);
screen->FlatFill(0, y, x, y + p->GetHeight(), p, true); screen->FlatFill(x2, y, SCREENWIDTH, y + p->GetHeight(), p, true);
screen->FlatFill(x2, y, SCREENWIDTH, y + p->GetHeight(), p, true); }
} }
} }
} }

View File

@ -51,7 +51,7 @@ const char *GameNames[17] =
}; };
static gameborder_t DoomBorder = static staticgameborder_t DoomBorder =
{ {
8, 8, 8, 8,
"brdr_tl", "brdr_t", "brdr_tr", "brdr_tl", "brdr_t", "brdr_tr",
@ -59,7 +59,7 @@ static gameborder_t DoomBorder =
"brdr_bl", "brdr_b", "brdr_br" "brdr_bl", "brdr_b", "brdr_br"
}; };
static gameborder_t HereticBorder = static staticgameborder_t HereticBorder =
{ {
4, 16, 4, 16,
"bordtl", "bordt", "bordtr", "bordtl", "bordt", "bordtr",
@ -67,7 +67,7 @@ static gameborder_t HereticBorder =
"bordbl", "bordb", "bordbr" "bordbl", "bordb", "bordbr"
}; };
static gameborder_t StrifeBorder = static staticgameborder_t StrifeBorder =
{ {
8, 8, 8, 8,
"brdr_tl", "brdr_t", "brdr_tr", "brdr_tl", "brdr_t", "brdr_tr",
@ -231,56 +231,51 @@ void FMapInfoParser::ParseGameInfo()
} }
else if(nextKey.CompareNoCase("border") == 0) else if(nextKey.CompareNoCase("border") == 0)
{ {
if(sc.CheckToken(TK_Identifier)) staticgameborder_t *b;
if (sc.CheckToken(TK_Identifier))
{ {
switch(sc.MustMatchString(GameInfoBorders)) switch(sc.MustMatchString(GameInfoBorders))
{ {
default: default:
gameinfo.border = &DoomBorder; b = &DoomBorder;
break; break;
case 1: case 1:
gameinfo.border = &HereticBorder; b = &HereticBorder;
break; break;
case 2: case 2:
gameinfo.border = &StrifeBorder; b = &StrifeBorder;
break; break;
} }
gameinfo.Border = *b;
} }
else else
{ {
// border = {size, offset, tr, t, tl, r, l ,br, b, bl}; // border = {size, offset, tr, t, tl, r, l ,br, b, bl};
char *graphics[8] = {DoomBorder.tr, DoomBorder.t, DoomBorder.tl, DoomBorder.r, DoomBorder.l, DoomBorder.br, DoomBorder.b, DoomBorder.bl}; FString *graphics[8] = { &gameinfo.Border.tr, &gameinfo.Border.t, &gameinfo.Border.tl, &gameinfo.Border.r, &gameinfo.Border.l, &gameinfo.Border.br, &gameinfo.Border.b, &gameinfo.Border.bl };
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
DoomBorder.offset = sc.Number; gameinfo.Border.offset = sc.Number;
sc.MustGetToken(','); sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
DoomBorder.size = sc.Number; gameinfo.Border.size = sc.Number;
for(int i = 0;i < 8;i++) for(int i = 0;i < 8;i++)
{ {
sc.MustGetToken(','); sc.MustGetToken(',');
sc.MustGetToken(TK_StringConst); sc.MustGetToken(TK_StringConst);
int len = int(strlen(sc.String)); (*graphics[i]) = sc.String;
if(len > 8)
sc.ScriptError("Border graphic can not be more than 8 characters long.\n");
memcpy(graphics[i], sc.String, len);
if(len < 8) // end with a null byte if the string is less than 8 chars.
graphics[i][len] = 0;
} }
} }
} }
else if(nextKey.CompareNoCase("armoricons") == 0) else if(nextKey.CompareNoCase("armoricons") == 0)
{ {
sc.MustGetToken(TK_StringConst); sc.MustGetToken(TK_StringConst);
strncpy(gameinfo.ArmorIcon1, sc.String, 8); gameinfo.ArmorIcon1 = sc.String;
gameinfo.ArmorIcon1[8] = 0;
if (sc.CheckToken(',')) if (sc.CheckToken(','))
{ {
sc.MustGetToken(TK_FloatConst); sc.MustGetToken(TK_FloatConst);
gameinfo.Armor2Percent = FLOAT2FIXED(sc.Float); gameinfo.Armor2Percent = FLOAT2FIXED(sc.Float);
sc.MustGetToken(','); sc.MustGetToken(',');
sc.MustGetToken(TK_StringConst); sc.MustGetToken(TK_StringConst);
strncpy(gameinfo.ArmorIcon2, sc.String, 8); gameinfo.ArmorIcon2 = sc.String;
gameinfo.ArmorIcon2[8] = 0;
} }
} }
else if(nextKey.CompareNoCase("maparrow") == 0) else if(nextKey.CompareNoCase("maparrow") == 0)
@ -295,7 +290,7 @@ void FMapInfoParser::ParseGameInfo()
else gameinfo.mCheatMapArrow = ""; else gameinfo.mCheatMapArrow = "";
} }
// Insert valid keys here. // Insert valid keys here.
GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8) GAMEINFOKEY_STRING(TitlePage, "titlePage")
GAMEINFOKEY_STRINGARRAY(creditPages, "addcreditPage", 8, false) GAMEINFOKEY_STRINGARRAY(creditPages, "addcreditPage", 8, false)
GAMEINFOKEY_STRINGARRAY(creditPages, "CreditPage", 8, true) GAMEINFOKEY_STRINGARRAY(creditPages, "CreditPage", 8, true)
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "addplayerclasses", 0, false) GAMEINFOKEY_STRINGARRAY(PlayerClasses, "addplayerclasses", 0, false)
@ -306,17 +301,17 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_FLOAT(pageTime, "pageTime") GAMEINFOKEY_FLOAT(pageTime, "pageTime")
GAMEINFOKEY_STRING(chatSound, "chatSound") GAMEINFOKEY_STRING(chatSound, "chatSound")
GAMEINFOKEY_MUSIC(finaleMusic, finaleOrder, "finaleMusic") GAMEINFOKEY_MUSIC(finaleMusic, finaleOrder, "finaleMusic")
GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8) GAMEINFOKEY_STRING(FinaleFlat, "finaleFlat")
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true) GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true)
GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false) GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false)
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true) GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true)
GAMEINFOKEY_CSTRING(PauseSign, "pausesign", 8) GAMEINFOKEY_STRING(PauseSign, "pausesign")
GAMEINFOKEY_STRING(quitSound, "quitSound") GAMEINFOKEY_STRING(quitSound, "quitSound")
GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8) GAMEINFOKEY_STRING(BorderFlat, "borderFlat")
GAMEINFOKEY_FIXED(telefogheight, "telefogheight") GAMEINFOKEY_FIXED(telefogheight, "telefogheight")
GAMEINFOKEY_FIXED(gibfactor, "gibfactor") GAMEINFOKEY_FIXED(gibfactor, "gibfactor")
GAMEINFOKEY_INT(defKickback, "defKickback") GAMEINFOKEY_INT(defKickback, "defKickback")
GAMEINFOKEY_CSTRING(SkyFlatName, "SkyFlatName", 8) GAMEINFOKEY_STRING(SkyFlatName, "SkyFlatName")
GAMEINFOKEY_STRING(translator, "translator") GAMEINFOKEY_STRING(translator, "translator")
GAMEINFOKEY_COLOR(pickupcolor, "pickupcolor") GAMEINFOKEY_COLOR(pickupcolor, "pickupcolor")
GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor") GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor")
@ -328,6 +323,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic") GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic")
GAMEINFOKEY_BOOL(drawreadthis, "drawreadthis") GAMEINFOKEY_BOOL(drawreadthis, "drawreadthis")
GAMEINFOKEY_BOOL(swapmenu, "swapmenu") GAMEINFOKEY_BOOL(swapmenu, "swapmenu")
GAMEINFOKEY_BOOL(dontcrunchcorpses, "dontcrunchcorpses")
GAMEINFOKEY_BOOL(intermissioncounter, "intermissioncounter") GAMEINFOKEY_BOOL(intermissioncounter, "intermissioncounter")
GAMEINFOKEY_BOOL(nightmarefast, "nightmarefast") GAMEINFOKEY_BOOL(nightmarefast, "nightmarefast")
GAMEINFOKEY_COLOR(dimcolor, "dimcolor") GAMEINFOKEY_COLOR(dimcolor, "dimcolor")
@ -336,7 +332,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime") GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime") GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle") GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle")
GAMEINFOKEY_CSTRING(Endoom, "endoom", 8) GAMEINFOKEY_STRING(Endoom, "endoom")
GAMEINFOKEY_INT(player5start, "player5start") GAMEINFOKEY_INT(player5start, "player5start")
GAMEINFOKEY_STRINGARRAY(quitmessages, "addquitmessages", 0, false) GAMEINFOKEY_STRINGARRAY(quitmessages, "addquitmessages", 0, false)
GAMEINFOKEY_STRINGARRAY(quitmessages, "quitmessages", 0, true) GAMEINFOKEY_STRINGARRAY(quitmessages, "quitmessages", 0, true)
@ -347,7 +343,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_STRING(mFontColorHeader, "menufontcolor_header") GAMEINFOKEY_STRING(mFontColorHeader, "menufontcolor_header")
GAMEINFOKEY_STRING(mFontColorHighlight, "menufontcolor_highlight") GAMEINFOKEY_STRING(mFontColorHighlight, "menufontcolor_highlight")
GAMEINFOKEY_STRING(mFontColorSelection, "menufontcolor_selection") GAMEINFOKEY_STRING(mFontColorSelection, "menufontcolor_selection")
GAMEINFOKEY_CSTRING(mBackButton, "menubackbutton", 8) GAMEINFOKEY_STRING(mBackButton, "menubackbutton")
GAMEINFOKEY_INT(TextScreenX, "textscreenx") GAMEINFOKEY_INT(TextScreenX, "textscreenx")
GAMEINFOKEY_INT(TextScreenY, "textscreeny") GAMEINFOKEY_INT(TextScreenY, "textscreeny")
GAMEINFOKEY_STRING(DefaultEndSequence, "defaultendsequence") GAMEINFOKEY_STRING(DefaultEndSequence, "defaultendsequence")

View File

@ -52,7 +52,7 @@
extern const char *GameNames[17]; extern const char *GameNames[17];
struct gameborder_t struct staticgameborder_t
{ {
BYTE offset; BYTE offset;
BYTE size; BYTE size;
@ -66,6 +66,35 @@ struct gameborder_t
char br[8]; char br[8];
}; };
struct gameborder_t
{
BYTE offset;
BYTE size;
FString tl;
FString t;
FString tr;
FString l;
FString r;
FString bl;
FString b;
FString br;
gameborder_t &operator=(staticgameborder_t &other)
{
offset = other.offset;
size = other.size;
tl = other.tl;
t = other.t;
tr = other.tr;
l = other.l;
r = other.r;
bl = other.bl;
b = other.b;
br = other.br;
return *this;
}
};
struct FGIFont struct FGIFont
{ {
FName fontname; FName fontname;
@ -78,12 +107,13 @@ struct gameinfo_t
EGameType gametype; EGameType gametype;
FString ConfigName; FString ConfigName;
char titlePage[9]; FString TitlePage;
bool drawreadthis; bool drawreadthis;
bool noloopfinalemusic; bool noloopfinalemusic;
bool intermissioncounter; bool intermissioncounter;
bool nightmarefast; bool nightmarefast;
bool swapmenu; bool swapmenu;
bool dontcrunchcorpses;
TArray<FName> creditPages; TArray<FName> creditPages;
TArray<FName> finalePages; TArray<FName> finalePages;
TArray<FName> infoPages; TArray<FName> infoPages;
@ -98,16 +128,16 @@ struct gameinfo_t
FString chatSound; FString chatSound;
FString finaleMusic; FString finaleMusic;
int finaleOrder; int finaleOrder;
char finaleFlat[9]; FString FinaleFlat;
char borderFlat[9]; FString BorderFlat;
char SkyFlatName[9]; FString SkyFlatName;
char ArmorIcon1[9]; FString ArmorIcon1;
char ArmorIcon2[9]; FString ArmorIcon2;
char PauseSign[9]; FString PauseSign;
char Endoom[9]; FString Endoom;
fixed_t Armor2Percent; fixed_t Armor2Percent;
FString quitSound; FString quitSound;
gameborder_t *border; gameborder_t Border;
int telefogheight; int telefogheight;
int defKickback; int defKickback;
FString translator; FString translator;
@ -133,7 +163,7 @@ struct gameinfo_t
FName mFontColorHeader; FName mFontColorHeader;
FName mFontColorHighlight; FName mFontColorHighlight;
FName mFontColorSelection; FName mFontColorSelection;
char mBackButton[9]; FString mBackButton;
fixed_t gibfactor; fixed_t gibfactor;
int TextScreenX; int TextScreenX;
int TextScreenY; int TextScreenY;

View File

@ -104,7 +104,7 @@ void DIntermissionScreen::Init(FIntermissionAction *desc, bool first)
} }
else else
{ {
texname = gameinfo.titlePage; texname = gameinfo.TitlePage.GetChars();
} }
} }
else if (*texname == '$') else if (*texname == '$')

View File

@ -30,6 +30,7 @@ xx(Cumulative)
xx(Fuzzy) xx(Fuzzy)
xx(Opaque) xx(Opaque)
xx(Stencil) xx(Stencil)
xx(AddStencil)
// Render styles // Render styles
xx(Normal) xx(Normal)
@ -37,6 +38,7 @@ xx(SoulTrans)
xx(OptFuzzy) xx(OptFuzzy)
xx(Add) xx(Add)
xx(Shaded) xx(Shaded)
xx(AddShaded)
xx(TranslucentStencil) xx(TranslucentStencil)
xx(Shadow) xx(Shadow)
xx(Subtract) xx(Subtract)
@ -486,6 +488,15 @@ xx(blockhitscan)
xx(Renderstyle) xx(Renderstyle)
xx(ceilingplane_a)
xx(ceilingplane_b)
xx(ceilingplane_c)
xx(ceilingplane_d)
xx(floorplane_a)
xx(floorplane_b)
xx(floorplane_c)
xx(floorplane_d)
// USDF keywords // USDF keywords
xx(Amount) xx(Amount)
xx(Text) xx(Text)

View File

@ -347,7 +347,7 @@ inline int FNodeBuilder::ClassifyLine (node_t &node, const FPrivVert *v1, const
#ifdef DISABLE_SSE #ifdef DISABLE_SSE
return ClassifyLine2 (node, v1, v2, sidev); return ClassifyLine2 (node, v1, v2, sidev);
#else #else
#if defined(__SSE2__) || defined(_M_IX64) #if defined(__SSE2__) || defined(_M_X64)
// If compiling with SSE2 support everywhere, just use the SSE2 version. // If compiling with SSE2 support everywhere, just use the SSE2 version.
return ClassifyLineSSE2 (node, v1, v2, sidev); return ClassifyLineSSE2 (node, v1, v2, sidev);
#elif defined(_MSC_VER) && _MSC_VER < 1300 #elif defined(_MSC_VER) && _MSC_VER < 1300

View File

@ -3542,6 +3542,8 @@ static const int LegacyRenderStyleIndices[] =
3, // STYLE_SoulTrans, 3, // STYLE_SoulTrans,
4, // STYLE_OptFuzzy, 4, // STYLE_OptFuzzy,
5, // STYLE_Stencil, 5, // STYLE_Stencil,
6, // STYLE_AddStencil
7, // STYLE_AddShaded
64, // STYLE_Translucent 64, // STYLE_Translucent
65, // STYLE_Add, 65, // STYLE_Add,
66, // STYLE_Shaded, 66, // STYLE_Shaded,
@ -6979,7 +6981,7 @@ scriptwait:
break; break;
case PRINTNAME_LEVEL: case PRINTNAME_LEVEL:
work += level.mapname; work += level.MapName;
break; break;
case PRINTNAME_SKILL: case PRINTNAME_SKILL:
@ -8940,7 +8942,7 @@ static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, c
def->playernum = -1; def->playernum = -1;
} }
i->defered = def; i->defered = def;
DPrintf ("%s on map %s deferred\n", ScriptPresentation(script).GetChars(), i->mapname); DPrintf ("%s on map %s deferred\n", ScriptPresentation(script).GetChars(), i->MapName.GetChars());
} }
} }
@ -8948,7 +8950,7 @@ EXTERN_CVAR (Bool, sv_cheats)
int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags) int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags)
{ {
if (map == NULL || 0 == strnicmp (level.mapname, map, 8)) if (map == NULL || 0 == strnicmp (level.MapName, map, 8))
{ {
FBehavior *module = NULL; FBehavior *module = NULL;
const ScriptPtr *scriptdata; const ScriptPtr *scriptdata;
@ -9001,17 +9003,17 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons
return false; return false;
} }
void P_SuspendScript (int script, char *map) void P_SuspendScript (int script, const char *map)
{ {
if (strnicmp (level.mapname, map, 8)) if (strnicmp (level.MapName, map, 8))
addDefered (FindLevelInfo (map), acsdefered_t::defsuspend, script, NULL, 0, NULL); addDefered (FindLevelInfo (map), acsdefered_t::defsuspend, script, NULL, 0, NULL);
else else
SetScriptState (script, DLevelScript::SCRIPT_Suspended); SetScriptState (script, DLevelScript::SCRIPT_Suspended);
} }
void P_TerminateScript (int script, char *map) void P_TerminateScript (int script, const char *map)
{ {
if (strnicmp (level.mapname, map, 8)) if (strnicmp (level.MapName, map, 8))
addDefered (FindLevelInfo (map), acsdefered_t::defterminate, script, NULL, 0, NULL); addDefered (FindLevelInfo (map), acsdefered_t::defterminate, script, NULL, 0, NULL);
else else
SetScriptState (script, DLevelScript::SCRIPT_PleaseRemove); SetScriptState (script, DLevelScript::SCRIPT_PleaseRemove);

View File

@ -863,7 +863,7 @@ FUNC(LS_Teleport_NewMap)
if (info && CheckIfExitIsGood (it, info)) if (info && CheckIfExitIsGood (it, info))
{ {
G_ChangeLevel(info->mapname, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0); G_ChangeLevel(info->MapName, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0);
return true; return true;
} }
} }
@ -1644,11 +1644,11 @@ FUNC(LS_ACS_Execute)
if (arg1 == 0) if (arg1 == 0)
{ {
mapname = level.mapname; mapname = level.MapName;
} }
else if ((info = FindLevelByNum(arg1)) != NULL) else if ((info = FindLevelByNum(arg1)) != NULL)
{ {
mapname = info->mapname; mapname = info->MapName;
} }
else else
{ {
@ -1667,11 +1667,11 @@ FUNC(LS_ACS_ExecuteAlways)
if (arg1 == 0) if (arg1 == 0)
{ {
mapname = level.mapname; mapname = level.MapName;
} }
else if ((info = FindLevelByNum(arg1)) != NULL) else if ((info = FindLevelByNum(arg1)) != NULL)
{ {
mapname = info->mapname; mapname = info->MapName;
} }
else else
{ {
@ -1707,7 +1707,7 @@ FUNC(LS_ACS_ExecuteWithResult)
int args[4] = { arg1, arg2, arg3, arg4 }; int args[4] = { arg1, arg2, arg3, arg4 };
int flags = (backSide ? ACS_BACKSIDE : 0) | ACS_ALWAYS | ACS_WANTRESULT; int flags = (backSide ? ACS_BACKSIDE : 0) | ACS_ALWAYS | ACS_WANTRESULT;
return P_StartScript (it, ln, arg0, level.mapname, args, 4, flags); return P_StartScript (it, ln, arg0, level.MapName, args, 4, flags);
} }
FUNC(LS_ACS_Suspend) FUNC(LS_ACS_Suspend)
@ -1716,9 +1716,9 @@ FUNC(LS_ACS_Suspend)
level_info_t *info; level_info_t *info;
if (arg1 == 0) if (arg1 == 0)
P_SuspendScript (arg0, level.mapname); P_SuspendScript (arg0, level.MapName);
else if ((info = FindLevelByNum (arg1)) ) else if ((info = FindLevelByNum (arg1)) )
P_SuspendScript (arg0, info->mapname); P_SuspendScript (arg0, info->MapName);
return true; return true;
} }
@ -1729,9 +1729,9 @@ FUNC(LS_ACS_Terminate)
level_info_t *info; level_info_t *info;
if (arg1 == 0) if (arg1 == 0)
P_TerminateScript (arg0, level.mapname); P_TerminateScript (arg0, level.MapName);
else if ((info = FindLevelByNum (arg1)) ) else if ((info = FindLevelByNum (arg1)) )
P_TerminateScript (arg0, info->mapname); P_TerminateScript (arg0, info->MapName);
return true; return true;
} }

View File

@ -1010,6 +1010,16 @@ bool AActor::Grind(bool items)
if ((flags & MF_CORPSE) && !(flags3 & MF3_DONTGIB) && (health <= 0)) if ((flags & MF_CORPSE) && !(flags3 & MF3_DONTGIB) && (health <= 0))
{ {
FState * state = FindState(NAME_Crush); FState * state = FindState(NAME_Crush);
// In Heretic and Chex Quest we don't change the actor's sprite, just its size.
if (state == NULL && gameinfo.dontcrunchcorpses)
{
flags &= ~MF_SOLID;
flags3 |= MF3_DONTGIB;
height = radius = 0;
return false;
}
bool isgeneric = false; bool isgeneric = false;
// ZDoom behavior differs from standard as crushed corpses cannot be raised. // ZDoom behavior differs from standard as crushed corpses cannot be raised.
// The reason for the change was originally because of a problem with players, // The reason for the change was originally because of a problem with players,

View File

@ -272,11 +272,12 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
FString fmt; FString fmt;
int lump_wad; int lump_wad;
int lump_map; int lump_map;
int lump_name; int lump_name = -1;
// Check for both *.wad and *.map in order to load Build maps // Check for both *.wad and *.map in order to load Build maps
// as well. The higher one will take precedence. // as well. The higher one will take precedence.
lump_name = Wads.CheckNumForName(mapname); // Names with more than 8 characters will only be checked as .wad and .map.
if (strlen(mapname) <= 8) lump_name = Wads.CheckNumForName(mapname);
fmt.Format("maps/%s.wad", mapname); fmt.Format("maps/%s.wad", mapname);
lump_wad = Wads.CheckNumForFullName(fmt); lump_wad = Wads.CheckNumForFullName(fmt);
fmt.Format("maps/%s.map", mapname); fmt.Format("maps/%s.map", mapname);
@ -3559,7 +3560,7 @@ void P_FreeExtraLevelData()
// //
// [RH] position indicates the start spot to spawn at // [RH] position indicates the start spot to spawn at
void P_SetupLevel (char *lumpname, int position) void P_SetupLevel (const char *lumpname, int position)
{ {
cycle_t times[20]; cycle_t times[20];
FMapThing *buildthings; FMapThing *buildthings;

View File

@ -103,7 +103,7 @@ bool P_CheckMapData(const char * mapname);
// [RH] The only parameter used is mapname, so I removed playermask and skill. // [RH] The only parameter used is mapname, so I removed playermask and skill.
// On September 1, 1998, I added the position to indicate which set // On September 1, 1998, I added the position to indicate which set
// of single-player start spots should be spawned in the level. // of single-player start spots should be spawned in the level.
void P_SetupLevel (char *mapname, int position); void P_SetupLevel (const char *mapname, int position);
void P_FreeLevelData(); void P_FreeLevelData();
void P_FreeExtraLevelData(); void P_FreeExtraLevelData();

View File

@ -902,8 +902,8 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro
#define ACS_NET 8 #define ACS_NET 8
int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags); int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags);
void P_SuspendScript (int script, char *map); void P_SuspendScript (int script, const char *map);
void P_TerminateScript (int script, char *map); void P_TerminateScript (int script, const char *map);
void P_DoDeferedScripts (void); void P_DoDeferedScripts (void);
// //

View File

@ -658,6 +658,9 @@ public:
case NAME_Stencil: case NAME_Stencil:
th->RenderStyle = STYLE_Stencil; th->RenderStyle = STYLE_Stencil;
break; break;
case NAME_AddStencil:
th->RenderStyle = STYLE_AddStencil;
break;
case NAME_Translucent: case NAME_Translucent:
th->RenderStyle = STYLE_Translucent; th->RenderStyle = STYLE_Translucent;
break; break;
@ -668,6 +671,9 @@ public:
case NAME_Shaded: case NAME_Shaded:
th->RenderStyle = STYLE_Shaded; th->RenderStyle = STYLE_Shaded;
break; break;
case NAME_AddShaded:
th->RenderStyle = STYLE_AddShaded;
break;
case NAME_TranslucentStencil: case NAME_TranslucentStencil:
th->RenderStyle = STYLE_TranslucentStencil; th->RenderStyle = STYLE_TranslucentStencil;
break; break;
@ -1239,6 +1245,7 @@ public:
int lightcolor = -1; int lightcolor = -1;
int fadecolor = -1; int fadecolor = -1;
int desaturation = -1; int desaturation = -1;
int fplaneflags = 0, cplaneflags = 0;
memset(sec, 0, sizeof(*sec)); memset(sec, 0, sizeof(*sec));
sec->lightlevel = 160; sec->lightlevel = 160;
@ -1440,6 +1447,48 @@ public:
Flag(sec->MoreFlags, SECF_UNDERWATER, key); Flag(sec->MoreFlags, SECF_UNDERWATER, key);
break; break;
case NAME_floorplane_a:
fplaneflags |= 1;
sec->floorplane.a = CheckFixed(key);
break;
case NAME_floorplane_b:
fplaneflags |= 2;
sec->floorplane.b = CheckFixed(key);
break;
case NAME_floorplane_c:
fplaneflags |= 4;
sec->floorplane.c = CheckFixed(key);
sec->floorplane.ic = FixedDiv(FRACUNIT, sec->floorplane.c);
break;
case NAME_floorplane_d:
fplaneflags |= 8;
sec->floorplane.d = CheckFixed(key);
break;
case NAME_ceilingplane_a:
cplaneflags |= 1;
sec->ceilingplane.a = CheckFixed(key);
break;
case NAME_ceilingplane_b:
cplaneflags |= 2;
sec->ceilingplane.b = CheckFixed(key);
break;
case NAME_ceilingplane_c:
cplaneflags |= 4;
sec->ceilingplane.c = CheckFixed(key);
sec->ceilingplane.ic = FixedDiv(FRACUNIT, sec->ceilingplane.c);
break;
case NAME_ceilingplane_d:
cplaneflags |= 8;
sec->ceilingplane.d = CheckFixed(key);
break;
default: default:
break; break;
} }
@ -1451,12 +1500,22 @@ public:
} }
sec->secretsector = !!(sec->special&SECRET_MASK); sec->secretsector = !!(sec->special&SECRET_MASK);
sec->floorplane.d = -sec->GetPlaneTexZ(sector_t::floor);
sec->floorplane.c = FRACUNIT; // Reset the planes to their defaults if not all of the plane equation's parameters were found.
sec->floorplane.ic = FRACUNIT; if (fplaneflags != 15)
sec->ceilingplane.d = sec->GetPlaneTexZ(sector_t::ceiling); {
sec->ceilingplane.c = -FRACUNIT; sec->floorplane.a = sec->floorplane.b = 0;
sec->ceilingplane.ic = -FRACUNIT; sec->floorplane.d = -sec->GetPlaneTexZ(sector_t::floor);
sec->floorplane.c = FRACUNIT;
sec->floorplane.ic = FRACUNIT;
}
if (cplaneflags != 15)
{
sec->ceilingplane.a = sec->ceilingplane.b = 0;
sec->ceilingplane.d = sec->GetPlaneTexZ(sector_t::ceiling);
sec->ceilingplane.c = -FRACUNIT;
sec->ceilingplane.ic = -FRACUNIT;
}
if (lightcolor == -1 && fadecolor == -1 && desaturation == -1) if (lightcolor == -1 && fadecolor == -1 && desaturation == -1)
{ {

View File

@ -47,18 +47,20 @@ CVAR (Int, r_drawfuzz, 1, CVAR_ARCHIVE)
#ifndef __APPLE__ #ifndef __APPLE__
FRenderStyle LegacyRenderStyles[STYLE_Count] = FRenderStyle LegacyRenderStyles[STYLE_Count] =
{ {
/* STYLE_None */ {{ STYLEOP_None, STYLEALPHA_Zero, STYLEALPHA_Zero, 0 }}, { { STYLEOP_None, STYLEALPHA_Zero, STYLEALPHA_Zero, 0 } }, /* STYLE_None */
/* STYLE_Normal */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_Alpha1 }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_Alpha1 } }, /* STYLE_Normal */
/* STYLE_Fuzzy */ {{ STYLEOP_Fuzz, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 }}, { { STYLEOP_Fuzz, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 } }, /* STYLE_Fuzzy */
/* STYLE_SoulTrans */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_TransSoulsAlpha }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_TransSoulsAlpha } }, /* STYLE_SoulTrans */
/* STYLE_OptFuzzy */ {{ STYLEOP_FuzzOrAdd, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 }}, { { STYLEOP_FuzzOrAdd, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 } }, /* STYLE_OptFuzzy */
/* STYLE_Stencil */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_Alpha1 | STYLEF_ColorIsFixed }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_Alpha1 | STYLEF_ColorIsFixed } }, /* STYLE_Stencil */
/* STYLE_Translucent */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, 0 } }, /* STYLE_Translucent */
/* STYLE_Add */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, 0 }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, 0 } }, /* STYLE_Add */
/* STYLE_Shaded */ {{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_RedIsAlpha | STYLEF_ColorIsFixed }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_RedIsAlpha | STYLEF_ColorIsFixed } }, /* STYLE_Shaded */
/* STYLE_TranslucentStencil */{{ STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_ColorIsFixed }}, { { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_ColorIsFixed } }, /* STYLE_TranslucentStencil */
/* STYLE_Shadow */ {{ STYLEOP_Shadow, 0, 0, 0 }}, { { STYLEOP_Shadow, 0, 0, 0 } }, /* STYLE_Shadow */
/* STYLE_Subtract*/ {{ STYLEOP_RevSub, STYLEALPHA_Src, STYLEALPHA_One, 0 }}, { { STYLEOP_RevSub, STYLEALPHA_Src, STYLEALPHA_One, 0 } }, /* STYLE_Subtract*/
{ { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, STYLEF_ColorIsFixed } }, /* STYLE_AddStencil */
{ { STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, STYLEF_RedIsAlpha | STYLEF_ColorIsFixed } }, /* STYLE_AddShaded */
}; };
#else #else
FRenderStyle LegacyRenderStyles[STYLE_Count]; FRenderStyle LegacyRenderStyles[STYLE_Count];
@ -77,6 +79,8 @@ static const BYTE Styles[STYLE_Count * 4] =
STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_ColorIsFixed, STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_InvSrc, STYLEF_ColorIsFixed,
STYLEOP_Shadow, 0, 0, 0, STYLEOP_Shadow, 0, 0, 0,
STYLEOP_RevSub, STYLEALPHA_Src, STYLEALPHA_One, 0, STYLEOP_RevSub, STYLEALPHA_Src, STYLEALPHA_One, 0,
STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, STYLEF_Alpha1 | STYLEF_ColorIsFixed,
STYLEOP_Add, STYLEALPHA_Src, STYLEALPHA_One, STYLEF_RedIsAlpha | STYLEF_ColorIsFixed,
}; };
static struct LegacyInit static struct LegacyInit

View File

@ -50,6 +50,8 @@ enum ERenderStyle
STYLE_TranslucentStencil, STYLE_TranslucentStencil,
STYLE_Shadow, STYLE_Shadow,
STYLE_Subtract, // Actually this is 'reverse subtract' but this is what normal people would expect by 'subtract'. STYLE_Subtract, // Actually this is 'reverse subtract' but this is what normal people would expect by 'subtract'.
STYLE_AddStencil, // Fill image interior with alphacolor
STYLE_AddShaded, // Treat patch data as alpha values for alphacolor
STYLE_Count STYLE_Count
}; };

View File

@ -229,9 +229,10 @@ public:
void BeginPlay (); void BeginPlay ();
void Activate (AActor *source); void Activate (AActor *source);
void Deactivate (AActor *source); void Deactivate (AActor *source);
virtual bool TriggerAction (AActor *triggerer, int activationType); bool TriggerAction(AActor *triggerer, int activationType);
protected: protected:
bool CheckTrigger (AActor *triggerer) const; virtual bool DoTriggerAction(AActor *triggerer, int activationType);
bool CheckTrigger(AActor *triggerer) const;
}; };
class ASkyViewpoint; class ASkyViewpoint;

View File

@ -6,6 +6,7 @@
#include "files.h" #include "files.h"
class FResourceFile; class FResourceFile;
class FTexture;
struct FResourceLump struct FResourceLump
{ {
@ -24,6 +25,7 @@ struct FResourceLump
SBYTE RefCount; SBYTE RefCount;
char * Cache; char * Cache;
FResourceFile * Owner; FResourceFile * Owner;
FTexture * LinkedTexture;
int Namespace; int Namespace;
FResourceLump() FResourceLump()
@ -35,6 +37,7 @@ struct FResourceLump
RefCount = 0; RefCount = 0;
Namespace = 0; // ns_global Namespace = 0; // ns_global
*Name = 0; *Name = 0;
LinkedTexture = NULL;
} }
virtual ~FResourceLump(); virtual ~FResourceLump();

View File

@ -172,11 +172,7 @@ static int DoomSpecificInfo (char *buffer, char *end)
} }
else else
{ {
char name[9]; p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", level.MapName.GetChars());
strncpy (name, level.mapname, 8);
name[8] = 0;
p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", name);
if (!viewactive) if (!viewactive)
{ {

View File

@ -484,7 +484,7 @@ static bool Cht_ChangeStartSpot (cheatseq_t *cheat)
{ {
char cmd[64]; char cmd[64];
mysnprintf (cmd, countof(cmd), "changemap %s %c", level.mapname, cheat->Args[0]); mysnprintf (cmd, countof(cmd), "changemap %s %c", level.MapName.GetChars(), cheat->Args[0]);
C_DoCommand (cmd); C_DoCommand (cmd);
return true; return true;
} }

View File

@ -408,12 +408,13 @@ static void StoreLevelStats()
{ {
for(i=0;i<LevelData.Size();i++) for(i=0;i<LevelData.Size();i++)
{ {
if (!stricmp(LevelData[i].levelname, level.mapname)) break; if (!stricmp(LevelData[i].levelname, level.MapName)) break;
} }
if (i==LevelData.Size()) if (i==LevelData.Size())
{ {
LevelData.Reserve(1); LevelData.Reserve(1);
strcpy(LevelData[i].levelname, level.mapname); strncpy(LevelData[i].levelname, level.MapName, 8);
LevelData[i].levelname[8] = 0;
} }
LevelData[i].totalkills = level.total_monsters; LevelData[i].totalkills = level.total_monsters;
LevelData[i].killcount = level.killed_monsters; LevelData[i].killcount = level.killed_monsters;

View File

@ -551,7 +551,7 @@ void FTextureManager::ParseTime (FScanner &sc, DWORD &min, DWORD &max)
void FTextureManager::ParseWarp(FScanner &sc) void FTextureManager::ParseWarp(FScanner &sc)
{ {
const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny; const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny | TEXMAN_ShortNameOnly;
bool isflat = false; bool isflat = false;
bool type2 = sc.Compare ("warp2"); // [GRB] bool type2 = sc.Compare ("warp2"); // [GRB]
sc.MustGetString (); sc.MustGetString ();
@ -616,7 +616,7 @@ void FTextureManager::ParseWarp(FScanner &sc)
void FTextureManager::ParseCameraTexture(FScanner &sc) void FTextureManager::ParseCameraTexture(FScanner &sc)
{ {
const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny; const BITFIELD texflags = TEXMAN_Overridable | TEXMAN_TryAny | TEXMAN_ShortNameOnly;
int width, height; int width, height;
int fitwidth, fitheight; int fitwidth, fitheight;
FString picname; FString picname;

View File

@ -1001,21 +1001,7 @@ void FMultiPatchTexture::ParsePatch(FScanner &sc, TexPart & part, bool silent, i
if (!texno.isValid()) if (!texno.isValid())
{ {
int lumpnum = Wads.CheckNumForFullName(sc.String); if (strlen(sc.String) <= 8 && !strpbrk(sc.String, "./"))
if (lumpnum >= 0)
{
texno = TexMan.FindTextureByLumpNum(lumpnum);
if (texno.isValid ())
{
part.Texture = TexMan[texno];
}
else
{
part.Texture = FTexture::CreateTexture("", lumpnum, usetype);
TexMan.AddTexture(part.Texture);
}
}
else if (strlen(sc.String) <= 8 && !strpbrk(sc.String, "./"))
{ {
int lumpnum = Wads.CheckNumForName(sc.String, usetype == TEX_MiscPatch? ns_graphics : ns_patches); int lumpnum = Wads.CheckNumForName(sc.String, usetype == TEX_MiscPatch? ns_graphics : ns_patches);
if (lumpnum >= 0) if (lumpnum >= 0)

View File

@ -167,6 +167,8 @@ FTexture::FTexture (const char *name, int lumpnum)
FTexture::~FTexture () FTexture::~FTexture ()
{ {
FTexture *link = Wads.GetLinkedTexture(SourceLump);
if (link == this) Wads.SetLinkedTexture(SourceLump, NULL);
KillNative(); KillNative();
} }

View File

@ -220,8 +220,37 @@ FTextureID FTextureManager::CheckForTexture (const char *name, int usetype, BITF
{ {
if (firsttype == FTexture::TEX_Null) return FTextureID(0); if (firsttype == FTexture::TEX_Null) return FTextureID(0);
if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return FTextureID(0); if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return FTextureID(0);
return FTextureID(firstfound);
}
}
if (!(flags & TEXMAN_ShortNameOnly))
{
// We intentionally only look for textures in subdirectories.
// Any graphic being placed in the zip's root directory can not be found by this.
if (strchr(name, '/'))
{
FTexture *const NO_TEXTURE = (FTexture*)-1;
int lump = Wads.CheckNumForFullName(name);
if (lump >= 0)
{
FTexture *tex = Wads.GetLinkedTexture(lump);
if (tex == NO_TEXTURE) return FTextureID(-1);
if (tex != NULL) return tex->id;
tex = FTexture::CreateTexture("", lump, FTexture::TEX_Override);
if (tex != NULL)
{
Wads.SetLinkedTexture(lump, tex);
return AddTexture(tex);
}
else
{
// mark this lump as having no valid texture so that we don't have to retry creating one later.
Wads.SetLinkedTexture(lump, NO_TEXTURE);
}
}
} }
return FTextureID(firstfound);
} }
return FTextureID(-1); return FTextureID(-1);
@ -273,30 +302,6 @@ int FTextureManager::ListTextures (const char *name, TArray<FTextureID> &list)
return list.Size(); return list.Size();
} }
//==========================================================================
//
// FTextureManager :: FindTextureByLumpNum
//
//==========================================================================
FTextureID FTextureManager::FindTextureByLumpNum (int lumpnum)
{
if (lumpnum < 0)
{
return FTextureID(-1);
}
// This can't use hashing because using ReplaceTexture would break the hash chains. :(
for(unsigned i = 0; i <Textures.Size(); i++)
{
if (Textures[i].Texture->SourceLump == lumpnum)
{
return FTextureID(i);
}
}
return FTextureID(-1);
}
//========================================================================== //==========================================================================
// //
// FTextureManager :: GetTextures // FTextureManager :: GetTextures
@ -1093,8 +1098,15 @@ void FTextureManager::WriteTexture (FArchive &arc, int picnum)
pic = Textures[picnum].Texture; pic = Textures[picnum].Texture;
} }
arc.WriteName (pic->Name); if (Wads.GetLinkedTexture(pic->SourceLump) == pic)
arc.WriteCount (pic->UseType); {
arc.WriteName(Wads.GetLumpFullName(pic->SourceLump));
}
else
{
arc.WriteName(pic->Name);
}
arc.WriteCount(pic->UseType);
} }
//========================================================================== //==========================================================================

View File

@ -240,7 +240,6 @@ public:
virtual int GetSourceLump() { return SourceLump; } virtual int GetSourceLump() { return SourceLump; }
virtual FTexture *GetRedirect(bool wantwarped); virtual FTexture *GetRedirect(bool wantwarped);
virtual FTexture *GetRawTexture(); // for FMultiPatchTexture to override virtual FTexture *GetRawTexture(); // for FMultiPatchTexture to override
FTextureID GetID() const { return id; }
virtual void Unload () = 0; virtual void Unload () = 0;
@ -433,12 +432,12 @@ public:
TEXMAN_TryAny = 1, TEXMAN_TryAny = 1,
TEXMAN_Overridable = 2, TEXMAN_Overridable = 2,
TEXMAN_ReturnFirst = 4, TEXMAN_ReturnFirst = 4,
TEXMAN_AllowSkins = 8 TEXMAN_AllowSkins = 8,
TEXMAN_ShortNameOnly = 16
}; };
FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny);
FTextureID GetTexture (const char *name, int usetype, BITFIELD flags=0); FTextureID GetTexture (const char *name, int usetype, BITFIELD flags=0);
FTextureID FindTextureByLumpNum (int lumpnum);
int ListTextures (const char *name, TArray<FTextureID> &list); int ListTextures (const char *name, TArray<FTextureID> &list);
void AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup=0, bool texture1=false); void AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup=0, bool texture1=false);

View File

@ -797,12 +797,12 @@ DEFINE_PROPERTY(renderstyle, S, Actor)
PROP_STRING_PARM(str, 0); PROP_STRING_PARM(str, 0);
static const char * renderstyles[]={ static const char * renderstyles[]={
"NONE", "NORMAL", "FUZZY", "SOULTRANS", "OPTFUZZY", "STENCIL", "NONE", "NORMAL", "FUZZY", "SOULTRANS", "OPTFUZZY", "STENCIL",
"TRANSLUCENT", "ADD", "SHADED", "SHADOW", "SUBTRACT", NULL }; "TRANSLUCENT", "ADD", "SHADED", "SHADOW", "SUBTRACT", "ADDSTENCIL", "ADDSHADED", NULL };
static const int renderstyle_values[]={ static const int renderstyle_values[]={
STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_OptFuzzy, STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_OptFuzzy,
STYLE_TranslucentStencil, STYLE_Translucent, STYLE_Add, STYLE_Shaded, STYLE_TranslucentStencil, STYLE_Translucent, STYLE_Add, STYLE_Shaded,
STYLE_Shadow, STYLE_Subtract}; STYLE_Shadow, STYLE_Subtract, STYLE_AddStencil, STYLE_AddShaded};
// make this work for old style decorations, too. // make this work for old style decorations, too.
if (!strnicmp(str, "style_", 6)) str+=6; if (!strnicmp(str, "style_", 6)) str+=6;

View File

@ -1407,7 +1407,7 @@ void V_SetBorderNeedRefresh()
void V_DrawFrame (int left, int top, int width, int height) void V_DrawFrame (int left, int top, int width, int height)
{ {
FTexture *p; FTexture *p;
const gameborder_t *border = gameinfo.border; const gameborder_t *border = &gameinfo.Border;
// Sanity check for incomplete gameinfo // Sanity check for incomplete gameinfo
if (border == NULL) if (border == NULL)
return; return;
@ -1450,7 +1450,7 @@ void V_DrawBorder (int x1, int y1, int x2, int y2)
} }
else else
{ {
picnum = TexMan.CheckForTexture (gameinfo.borderFlat, FTexture::TEX_Flat); picnum = TexMan.CheckForTexture (gameinfo.BorderFlat, FTexture::TEX_Flat);
} }
if (picnum.isValid()) if (picnum.isValid())
@ -1513,28 +1513,28 @@ static void V_DrawTopBorder ()
if (viewwidth == SCREENWIDTH) if (viewwidth == SCREENWIDTH)
return; return;
offset = gameinfo.border->offset; offset = gameinfo.Border.offset;
if (viewwindowy < 34) if (viewwindowy < 34)
{ {
V_DrawBorder (0, 0, viewwindowx, 34); V_DrawBorder (0, 0, viewwindowx, 34);
V_DrawBorder (viewwindowx, 0, viewwindowx + viewwidth, viewwindowy); V_DrawBorder (viewwindowx, 0, viewwindowx + viewwidth, viewwindowy);
V_DrawBorder (viewwindowx + viewwidth, 0, SCREENWIDTH, 34); V_DrawBorder (viewwindowx + viewwidth, 0, SCREENWIDTH, 34);
p = TexMan(gameinfo.border->t); p = TexMan(gameinfo.Border.t);
screen->FlatFill(viewwindowx, viewwindowy - p->GetHeight(), screen->FlatFill(viewwindowx, viewwindowy - p->GetHeight(),
viewwindowx + viewwidth, viewwindowy, p, true); viewwindowx + viewwidth, viewwindowy, p, true);
p = TexMan(gameinfo.border->l); p = TexMan(gameinfo.Border.l);
screen->FlatFill(viewwindowx - p->GetWidth(), viewwindowy, screen->FlatFill(viewwindowx - p->GetWidth(), viewwindowy,
viewwindowx, 35, p, true); viewwindowx, 35, p, true);
p = TexMan(gameinfo.border->r); p = TexMan(gameinfo.Border.r);
screen->FlatFill(viewwindowx + viewwidth, viewwindowy, screen->FlatFill(viewwindowx + viewwidth, viewwindowy,
viewwindowx + viewwidth + p->GetWidth(), 35, p, true); viewwindowx + viewwidth + p->GetWidth(), 35, p, true);
p = TexMan(gameinfo.border->tl); p = TexMan(gameinfo.Border.tl);
screen->DrawTexture (p, viewwindowx - offset, viewwindowy - offset, TAG_DONE); screen->DrawTexture (p, viewwindowx - offset, viewwindowy - offset, TAG_DONE);
p = TexMan(gameinfo.border->tr); p = TexMan(gameinfo.Border.tr);
screen->DrawTexture (p, viewwindowx + viewwidth, viewwindowy - offset, TAG_DONE); screen->DrawTexture (p, viewwindowx + viewwidth, viewwindowy - offset, TAG_DONE);
} }
else else

View File

@ -2193,19 +2193,6 @@ void V_InitCustomFonts()
FTexture **p = &lumplist[*(unsigned char*)sc.String]; FTexture **p = &lumplist[*(unsigned char*)sc.String];
sc.MustGetString(); sc.MustGetString();
FTextureID texid = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch); FTextureID texid = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch);
if (!texid.Exists())
{
int lumpno = Wads.CheckNumForFullName (sc.String);
if (lumpno >= 0)
{
texid = TexMan.FindTextureByLumpNum(lumpno);
if (!texid.Exists())
{
FTexture *tex = FTexture::CreateTexture("", lumpno, FTexture::TEX_MiscPatch);
texid = TexMan.AddTexture(tex);
}
}
}
if (texid.Exists()) if (texid.Exists())
{ {
*p = TexMan[texid]; *p = TexMan[texid];

View File

@ -548,6 +548,37 @@ int FWadCollection::GetNumForFullName (const char *name)
return i; return i;
} }
//==========================================================================
//
// link a texture with a given lump
//
//==========================================================================
void FWadCollection::SetLinkedTexture(int lump, FTexture *tex)
{
if ((size_t)lump < NumLumps)
{
FResourceLump *reslump = LumpInfo[lump].lump;
reslump->LinkedTexture = tex;
}
}
//==========================================================================
//
// retrieve linked texture
//
//==========================================================================
FTexture *FWadCollection::GetLinkedTexture(int lump)
{
if ((size_t)lump < NumLumps)
{
FResourceLump *reslump = LumpInfo[lump].lump;
return reslump->LinkedTexture;
}
return NULL;
}
//========================================================================== //==========================================================================
// //
// W_LumpLength // W_LumpLength

View File

@ -29,6 +29,7 @@
class FResourceFile; class FResourceFile;
struct FResourceLump; struct FResourceLump;
class FTexture;
struct wadinfo_t struct wadinfo_t
{ {
@ -171,6 +172,9 @@ public:
int CheckNumForFullName (const char *name, int wadfile); int CheckNumForFullName (const char *name, int wadfile);
int GetNumForFullName (const char *name); int GetNumForFullName (const char *name);
void SetLinkedTexture(int lump, FTexture *tex);
FTexture *GetLinkedTexture(int lump);
void ReadLump (int lump, void *dest); void ReadLump (int lump, void *dest);
FMemLump ReadLump (int lump); FMemLump ReadLump (int lump);

View File

@ -314,7 +314,7 @@ static bool IsExMy(const char * name)
void WI_LoadBackground(bool isenterpic) void WI_LoadBackground(bool isenterpic)
{ {
const char * lumpname = NULL; const char *lumpname = NULL;
char buffer[10]; char buffer[10];
in_anim_t an; in_anim_t an;
lnode_t pt; lnode_t pt;
@ -399,7 +399,7 @@ void WI_LoadBackground(bool isenterpic)
default: default:
// Strife doesn't have an intermission pic so choose something neutral. // Strife doesn't have an intermission pic so choose something neutral.
if (isenterpic) return; if (isenterpic) return;
lumpname = gameinfo.borderFlat; lumpname = gameinfo.BorderFlat;
break; break;
} }
} }

View File

@ -1061,11 +1061,7 @@ void DoomSpecificInfo (char *buffer, size_t bufflen)
} }
else else
{ {
char name[9]; buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", level.MapName.GetChars());
strncpy (name, level.mapname, 8);
name[8] = 0;
buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", name);
if (!viewactive) if (!viewactive)
{ {

View File

@ -1086,12 +1086,12 @@ void ST_Endoom()
{ {
if (showendoom == 0) exit(0); if (showendoom == 0) exit(0);
if (gameinfo.Endoom[0] == 0) if (gameinfo.Endoom.Len() == 0)
{ {
exit(0); exit(0);
} }
int endoom_lump = Wads.CheckNumForName (gameinfo.Endoom); int endoom_lump = Wads.CheckNumForFullName (gameinfo.Endoom, true);
BYTE endoom_screen[4000]; BYTE endoom_screen[4000];
BYTE *font; BYTE *font;

View File

@ -299,7 +299,7 @@ void DoBlending_SSE2(const PalEntry *from, PalEntry *to, int count, int r, int g
} }
#endif #endif
#if defined(__amd64__) || defined(_M_IX64) #if defined(__amd64__) || defined(_M_X64)
long long color; long long color;
blending256 = _mm_set_epi64x(0x10001000100ll, 0x10001000100ll); blending256 = _mm_set_epi64x(0x10001000100ll, 0x10001000100ll);

View File

@ -349,7 +349,14 @@ FString &FString::AppendCStrPart (const char *tail, size_t tailLen)
return *this; return *this;
} }
void FString::Truncate (long newlen) FString &FString::CopyCStrPart(const char *tail, size_t tailLen)
{
ReallocBuffer(tailLen);
StrCopy(Chars, tail, tailLen);
return *this;
}
void FString::Truncate(long newlen)
{ {
if (newlen >= 0 && newlen < (long)Len()) if (newlen >= 0 && newlen < (long)Len())
{ {

View File

@ -167,6 +167,7 @@ public:
FString &operator += (char tail); FString &operator += (char tail);
FString &operator += (const FName &name) { return *this += name.GetChars(); } FString &operator += (const FName &name) { return *this += name.GetChars(); }
FString &AppendCStrPart (const char *tail, size_t tailLen); FString &AppendCStrPart (const char *tail, size_t tailLen);
FString &CopyCStrPart(const char *tail, size_t tailLen);
FString &operator << (const FString &tail) { return *this += tail; } FString &operator << (const FString &tail) { return *this += tail; }
FString &operator << (const char *tail) { return *this += tail; } FString &operator << (const char *tail) { return *this += tail; }
@ -252,9 +253,13 @@ public:
int Compare (const FString &other) const { return strcmp (Chars, other.Chars); } int Compare (const FString &other) const { return strcmp (Chars, other.Chars); }
int Compare (const char *other) const { return strcmp (Chars, other); } int Compare (const char *other) const { return strcmp (Chars, other); }
int Compare(const FString &other, int len) const { return strncmp(Chars, other.Chars, len); }
int Compare(const char *other, int len) const { return strncmp(Chars, other, len); }
int CompareNoCase (const FString &other) const { return stricmp (Chars, other.Chars); } int CompareNoCase (const FString &other) const { return stricmp (Chars, other.Chars); }
int CompareNoCase (const char *other) const { return stricmp (Chars, other); } int CompareNoCase (const char *other) const { return stricmp (Chars, other); }
int CompareNoCase(const FString &other, int len) const { return strnicmp(Chars, other.Chars, len); }
int CompareNoCase(const char *other, int len) const { return strnicmp(Chars, other, len); }
protected: protected:
const FStringData *Data() const { return (FStringData *)Chars - 1; } const FStringData *Data() const { return (FStringData *)Chars - 1; }

View File

@ -40,6 +40,7 @@ gameinfo
definventorymaxamount = 25 definventorymaxamount = 25
defaultrespawntime = 12 defaultrespawntime = 12
defaultdropstyle = 1 defaultdropstyle = 1
dontcrunchcorpses = true
endoom = "ENDOOM" endoom = "ENDOOM"
player5start = 4001 player5start = 4001
drawreadthis = true drawreadthis = true