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:
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
but deprecated for portability reasons.)
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.
rotationfloor = <float>; // Rotation of floor 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.
lightceiling = <integer>; // The ceiling's light level. Default is 0.
lightfloorabsolute = <bool>; // true = 'lightfloor' is an absolute value. Default is
@ -355,6 +363,10 @@ Added waterzone sector property.
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.
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
===============================================================================

View File

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

View File

@ -303,7 +303,7 @@ void C_InitConback()
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);
conline = true;
}

View File

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

View File

@ -2573,7 +2573,7 @@ static void RunScript(BYTE **stream, APlayerPawn *pawn, int snum, int argn, int
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)

View File

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

View File

@ -1621,7 +1621,7 @@ void G_DoReborn (int playernum, bool freshbot)
{ // Reload the level from scratch
bool indemo = demoplayback;
BackupSaveName = "";
G_InitNew (level.mapname, false);
G_InitNew (level.MapName, false);
demoplayback = indemo;
// gameaction = ga_loadlevel;
}
@ -2027,7 +2027,7 @@ static void PutSaveComment (FILE *file)
// Get 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);
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, "ZDoom Save Version", SAVESIG);
M_AppendPNGText (stdfile, "Title", description);
M_AppendPNGText (stdfile, "Current Map", level.mapname);
M_AppendPNGText (stdfile, "Current Map", level.MapName);
PutSaveWads (stdfile);
PutSaveComment (stdfile);
@ -2289,7 +2289,7 @@ void G_BeginRecording (const char *startmap)
if (startmap == NULL)
{
startmap = level.mapname;
startmap = level.MapName;
}
demo_p = demobuffer;

View File

@ -88,7 +88,7 @@ void AHeresiarch::Die (AActor *source, AActor *inflictor, int dmgflags)
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 ();
}
if (mapname != level.mapname)
{
strcpy (level.mapname, mapname);
}
level.MapName = mapname;
if (bTitleLevel)
{
gamestate = GS_TITLELEVEL;
@ -491,9 +488,9 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
{
// end the game
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
{
@ -509,12 +506,14 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
if (nextredir != NULL)
{
nextinfo = nextredir;
levelname = nextinfo->mapname;
}
}
nextlevel = nextinfo->MapName;
}
else
{
nextlevel = levelname;
}
if (levelname != NULL) nextlevel = levelname;
if (nextSkill != -1)
NextSkill = nextSkill;
@ -596,18 +595,18 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill
const char *G_GetExitMap()
{
return level.nextmap;
return level.NextMap;
}
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;
@ -641,7 +640,7 @@ void G_DoCompleted (void)
if (gamestate == GS_TITLELEVEL)
{
strncpy (level.mapname, nextlevel, 255);
level.MapName = nextlevel;
G_DoLoadLevel (startpos, false);
startpos = 0;
viewactive = true;
@ -650,20 +649,20 @@ void G_DoCompleted (void)
// [RH] Mark this level as having been visited
if (!(level.flags & LEVEL_CHANGEMAPCHEAT))
FindLevelInfo (level.mapname)->flags |= LEVEL_VISITED;
FindLevelInfo (level.MapName)->flags |= LEVEL_VISITED;
if (automapactive)
AM_Stop ();
wminfo.finished_ep = level.cluster - 1;
wminfo.LName0 = TexMan[TexMan.CheckForTexture(level.info->pname, FTexture::TEX_MiscPatch)];
wminfo.current = level.mapname;
wminfo.LName0 = TexMan[TexMan.CheckForTexture(level.info->PName, FTexture::TEX_MiscPatch)];
wminfo.current = level.MapName;
if (deathmatch &&
(dmflags & DF_SAME_LEVEL) &&
!(level.flags & LEVEL_CHANGEMAPCHEAT))
{
wminfo.next = level.mapname;
wminfo.next = level.MapName;
wminfo.LName1 = wminfo.LName0;
}
else
@ -676,8 +675,8 @@ void G_DoCompleted (void)
}
else
{
wminfo.next = nextinfo->mapname;
wminfo.LName1 = TexMan[TexMan.CheckForTexture(nextinfo->pname, FTexture::TEX_MiscPatch)];
wminfo.next = nextinfo->MapName;
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"
"\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"
TEXTCOLOR_BOLD "%s - %s\n\n",
level.mapname, level.LevelName.GetChars());
level.MapName.GetChars(), level.LevelName.GetChars());
if (wipegamestate == GS_LEVEL)
wipegamestate = GS_FORCEWIPE;
@ -899,7 +898,7 @@ void G_DoLoadLevel (int position, bool autosave)
}
level.maptime = 0;
P_SetupLevel (level.mapname, position);
P_SetupLevel (level.MapName, position);
AM_LevelInit();
@ -1056,7 +1055,7 @@ void G_DoWorldDone (void)
}
else
{
strncpy (level.mapname, nextlevel, 255);
level.MapName = nextlevel;
}
G_StartTravel ();
G_DoLoadLevel (startpos, true);
@ -1217,7 +1216,7 @@ void G_InitLevelLocals ()
level.flags = 0;
level.flags2 = 0;
info = FindLevelInfo (level.mapname);
info = FindLevelInfo (level.MapName);
level.info = info;
level.skyspeed1 = info->skyspeed1;
@ -1274,10 +1273,8 @@ void G_InitLevelLocals ()
level.musicorder = info->musicorder;
level.LevelName = level.info->LookupLevelName();
strncpy (level.nextmap, info->nextmap, 10);
level.nextmap[10] = 0;
strncpy (level.secretmap, info->secretmap, 10);
level.secretmap[10] = 0;
level.NextMap = info->NextMap;
level.NextSecretMap = info->NextSecretMap;
compatflags.Callback();
compatflags2.Callback();
@ -1621,7 +1618,7 @@ static void writeMapName (FArchive &arc, const char *name)
static void writeSnapShot (FArchive &arc, level_info_t *i)
{
arc << i->snapshotVer;
writeMapName (arc, i->mapname);
writeMapName (arc, i->MapName);
i->snapshot->Serialize (arc);
}
@ -1659,7 +1656,7 @@ void G_WriteSnapshots (FILE *file)
{
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;
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)
{
writeMapName (arc, i->mapname);
writeMapName (arc, i->MapName);
arc << i->defered;
}
@ -1922,11 +1919,11 @@ CCMD(listmaps)
for(unsigned i = 0; i < wadlevelinfos.Size(); i++)
{
level_info_t *info = &wadlevelinfos[i];
MapData *map = P_OpenMapData(info->mapname, true);
MapData *map = P_OpenMapData(info->MapName, true);
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)));
delete map;
}

View File

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

View File

@ -71,9 +71,10 @@ extern TMap<int, FString> HexenMusic;
static int FindWadLevelInfo (const char *name)
{
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 -1;
}
@ -144,7 +145,7 @@ bool CheckWarpTransMap (FString &mapname, bool substitute)
level_info_t *lev = FindLevelByWarpTrans (atoi (&mapname[4]));
if (lev != NULL)
{
mapname = lev->mapname;
mapname = lev->MapName;
return true;
}
else if (substitute)
@ -224,12 +225,12 @@ void P_RemoveDefereds (void)
void level_info_t::Reset()
{
mapname[0] = 0;
MapName = "";
MapBackground = "";
levelnum = 0;
pname[0] = 0;
nextmap[0] = 0;
secretmap[0] = 0;
PName = "";
NextMap = "";
NextSecretMap = "";
SkyPic1 = SkyPic2 = "-NOFLAT-";
cluster = 0;
partime = 0;
@ -262,7 +263,7 @@ void level_info_t::Reset()
compatmask = compatmask2 = 0;
Translator = "";
RedirectType = 0;
RedirectMap[0] = 0;
RedirectMapName = "";
EnterPic = "";
ExitPic = "";
InterMusic = "";
@ -299,17 +300,17 @@ FString level_info_t::LookupLevelName()
char checkstring[32];
// 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);
if (thename == NULL)
@ -372,9 +373,9 @@ level_info_t *level_info_t::CheckLevelRedirect ()
if (playeringame[i] && players[i].mo->FindInventory (type))
{
// check for actual presence of the map.
if (P_CheckMapData(RedirectMap))
if (P_CheckMapData(RedirectMapName))
{
return FindLevelInfo(RedirectMap);
return FindLevelInfo(RedirectMapName);
}
break;
}
@ -391,7 +392,7 @@ level_info_t *level_info_t::CheckLevelRedirect ()
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 (HexenHack)
{
mysnprintf (mapname, 9, "&wt@%02d", sc.Number);
mapname.Format("&wt@%02d", sc.Number);
}
else
{
mysnprintf (mapname, 9, "MAP%02d", sc.Number);
mapname.Format("MAP%02d", sc.Number);
}
}
else
{
*mapname = 0;
sc.MustGetString();
strncpy (mapname, sc.String, 8);
mapname[8] = 0;
mapname = sc.String;
FName seq = CheckEndSequence();
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)
{
parse.ParseAssign();
parse.ParseNextMap(info->nextmap);
parse.ParseNextMap(info->NextMap);
}
DEFINE_MAP_OPTION(secretnext, true)
{
parse.ParseAssign();
parse.ParseNextMap(info->secretmap);
parse.ParseNextMap(info->NextSecretMap);
}
DEFINE_MAP_OPTION(secret, true) // Just an alias for secretnext, for Vavoom compatibility
{
parse.ParseAssign();
parse.ParseNextMap(info->secretmap);
parse.ParseNextMap(info->NextSecretMap);
}
DEFINE_MAP_OPTION(cluster, true)
@ -898,7 +897,7 @@ DEFINE_MAP_OPTION(outsidefog, true)
DEFINE_MAP_OPTION(titlepatch, true)
{
parse.ParseAssign();
parse.ParseLumpOrTextureName(info->pname);
parse.ParseLumpOrTextureName(info->PName);
}
DEFINE_MAP_OPTION(partime, true)
@ -1072,7 +1071,7 @@ DEFINE_MAP_OPTION(redirect, true)
parse.sc.MustGetString();
info->RedirectType = parse.sc.String;
parse.ParseComma();
parse.ParseLumpOrTextureName(info->RedirectMap);
parse.ParseNextMap(info->RedirectMapName);
}
DEFINE_MAP_OPTION(sndseq, true)
@ -1522,8 +1521,8 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo)
}
uppercopy (levelinfo->mapname, mapname);
levelinfo->mapname[8] = 0;
levelinfo->MapName = mapname;
levelinfo->MapName.ToUpper();
sc.MustGetString ();
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
// 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?
// Set that as this map's default music if it does.

View File

@ -42,9 +42,9 @@ void ABasicArmor::Tick ()
AbsorbCount = 0;
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;
if (icon[0] != 0)

View File

@ -605,7 +605,13 @@ void APowerInvisibility::DoEffect ()
case (NAME_Stencil):
Owner->RenderStyle = STYLE_Stencil;
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_Translucent):
Owner->RenderStyle = STYLE_Translucent;
@ -685,7 +691,13 @@ int APowerInvisibility::AlterWeaponSprite (visstyle_t *vis)
case (NAME_Stencil):
vis->RenderStyle = STYLE_Stencil;
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_Translucent):
default:

View File

@ -82,10 +82,22 @@ void ASectorAction::Deactivate (AActor *source)
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)
return barrier_cast<ASectorAction *>(tracer)->TriggerAction (triggerer, activationType);
return barrier_cast<ASectorAction *>(tracer)->DoTriggerAction (triggerer, activationType);
else
return false;
}
@ -93,7 +105,7 @@ bool ASectorAction::TriggerAction (AActor *triggerer, int activationType)
bool ASectorAction::CheckTrigger (AActor *triggerer) const
{
if (special &&
(triggerer->player ||
((triggerer->player && !(flags & MF_FRIENDLY)) ||
((flags & MF_AMBUSH) && (triggerer->flags2 & MF2_MCROSS)) ||
((flags2 & MF2_DORMANT) && (triggerer->flags2 & MF2_PCROSS))))
{
@ -110,16 +122,16 @@ class ASecActEnter : public ASectorAction
{
DECLARE_CLASS (ASecActEnter, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when leaving sector --------------------------------------------
@ -128,16 +140,16 @@ class ASecActExit : public ASectorAction
{
DECLARE_CLASS (ASecActExit, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when hitting sector's floor ------------------------------------
@ -146,7 +158,7 @@ class ASecActHitFloor : public ASectorAction
{
DECLARE_CLASS (ASecActHitFloor, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
// Skull Tag uses 9999 for a special that is triggered whenever
@ -154,10 +166,10 @@ public:
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when hitting sector's ceiling ----------------------------------
@ -166,16 +178,16 @@ class ASecActHitCeil : public ASectorAction
{
DECLARE_CLASS (ASecActHitCeil, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when using inside sector ---------------------------------------
@ -184,16 +196,16 @@ class ASecActUse : public ASectorAction
{
DECLARE_CLASS (ASecActUse, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when using a sector's wall -------------------------------------
@ -202,16 +214,16 @@ class ASecActUseWall : public ASectorAction
{
DECLARE_CLASS (ASecActUseWall, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when eyes go below fake floor ----------------------------------
@ -220,16 +232,16 @@ class ASecActEyesDive : public ASectorAction
{
DECLARE_CLASS (ASecActEyesDive, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when eyes go above fake floor ----------------------------------
@ -238,16 +250,16 @@ class ASecActEyesSurface : public ASectorAction
{
DECLARE_CLASS (ASecActEyesSurface, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when eyes go below fake floor ----------------------------------
@ -256,16 +268,16 @@ class ASecActEyesBelowC : public ASectorAction
{
DECLARE_CLASS (ASecActEyesBelowC, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when eyes go above fake floor ----------------------------------
@ -274,16 +286,16 @@ class ASecActEyesAboveC : public ASectorAction
{
DECLARE_CLASS (ASecActEyesAboveC, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
return didit | Super::TriggerAction (triggerer, activationType);
return didit | Super::DoTriggerAction (triggerer, activationType);
}
// Triggered when eyes go below fake floor ----------------------------------
@ -292,14 +304,14 @@ class ASecActHitFakeFloor : public ASectorAction
{
DECLARE_CLASS (ASecActHitFakeFloor, ASectorAction)
public:
bool TriggerAction (AActor *triggerer, int activationType);
bool DoTriggerAction (AActor *triggerer, int activationType);
};
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;
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)
{
SetTruth(texture == NULL || !(texture->GetID().isValid()), block, statusBar);
SetTruth(texture == NULL || texture->UseType == FTexture::TEX_Null, block, statusBar);
}
}
protected:
@ -830,7 +830,7 @@ class CommandDrawString : public SBarInfoCommand
if(level.lumpnum != cache)
{
cache = level.lumpnum;
str = level.mapname;
str = level.MapName;
str.ToUpper();
RealignString();
}

View File

@ -131,7 +131,7 @@ void ST_FormatMapName(FString &mapname, const char *mapnamecolor)
if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub))
{
mapname << level.mapname << ": ";
mapname << level.MapName << ": ";
}
mapname << mapnamecolor << level.LevelName;
}
@ -1090,12 +1090,12 @@ void DBaseStatusBar::RefreshBackground () const
if (setblocks >= 10)
{
const gameborder_t *border = gameinfo.border;
FTexture *p;
p = TexMan[border->b];
screen->FlatFill(0, y, x, y + p->GetHeight(), p, true);
screen->FlatFill(x2, y, SCREENWIDTH, y + p->GetHeight(), p, true);
FTexture *p = TexMan[gameinfo.Border.b];
if (p != NULL)
{
screen->FlatFill(0, y, x, 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,
"brdr_tl", "brdr_t", "brdr_tr",
@ -59,7 +59,7 @@ static gameborder_t DoomBorder =
"brdr_bl", "brdr_b", "brdr_br"
};
static gameborder_t HereticBorder =
static staticgameborder_t HereticBorder =
{
4, 16,
"bordtl", "bordt", "bordtr",
@ -67,7 +67,7 @@ static gameborder_t HereticBorder =
"bordbl", "bordb", "bordbr"
};
static gameborder_t StrifeBorder =
static staticgameborder_t StrifeBorder =
{
8, 8,
"brdr_tl", "brdr_t", "brdr_tr",
@ -231,56 +231,51 @@ void FMapInfoParser::ParseGameInfo()
}
else if(nextKey.CompareNoCase("border") == 0)
{
if(sc.CheckToken(TK_Identifier))
staticgameborder_t *b;
if (sc.CheckToken(TK_Identifier))
{
switch(sc.MustMatchString(GameInfoBorders))
{
default:
gameinfo.border = &DoomBorder;
b = &DoomBorder;
break;
case 1:
gameinfo.border = &HereticBorder;
b = &HereticBorder;
break;
case 2:
gameinfo.border = &StrifeBorder;
b = &StrifeBorder;
break;
}
gameinfo.Border = *b;
}
else
{
// 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);
DoomBorder.offset = sc.Number;
gameinfo.Border.offset = sc.Number;
sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst);
DoomBorder.size = sc.Number;
gameinfo.Border.size = sc.Number;
for(int i = 0;i < 8;i++)
{
sc.MustGetToken(',');
sc.MustGetToken(TK_StringConst);
int len = int(strlen(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;
(*graphics[i]) = sc.String;
}
}
}
else if(nextKey.CompareNoCase("armoricons") == 0)
{
sc.MustGetToken(TK_StringConst);
strncpy(gameinfo.ArmorIcon1, sc.String, 8);
gameinfo.ArmorIcon1[8] = 0;
gameinfo.ArmorIcon1 = sc.String;
if (sc.CheckToken(','))
{
sc.MustGetToken(TK_FloatConst);
gameinfo.Armor2Percent = FLOAT2FIXED(sc.Float);
sc.MustGetToken(',');
sc.MustGetToken(TK_StringConst);
strncpy(gameinfo.ArmorIcon2, sc.String, 8);
gameinfo.ArmorIcon2[8] = 0;
gameinfo.ArmorIcon2 = sc.String;
}
}
else if(nextKey.CompareNoCase("maparrow") == 0)
@ -295,7 +290,7 @@ void FMapInfoParser::ParseGameInfo()
else gameinfo.mCheatMapArrow = "";
}
// Insert valid keys here.
GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8)
GAMEINFOKEY_STRING(TitlePage, "titlePage")
GAMEINFOKEY_STRINGARRAY(creditPages, "addcreditPage", 8, false)
GAMEINFOKEY_STRINGARRAY(creditPages, "CreditPage", 8, true)
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "addplayerclasses", 0, false)
@ -306,17 +301,17 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_FLOAT(pageTime, "pageTime")
GAMEINFOKEY_STRING(chatSound, "chatSound")
GAMEINFOKEY_MUSIC(finaleMusic, finaleOrder, "finaleMusic")
GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8)
GAMEINFOKEY_STRING(FinaleFlat, "finaleFlat")
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true)
GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false)
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true)
GAMEINFOKEY_CSTRING(PauseSign, "pausesign", 8)
GAMEINFOKEY_STRING(PauseSign, "pausesign")
GAMEINFOKEY_STRING(quitSound, "quitSound")
GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8)
GAMEINFOKEY_STRING(BorderFlat, "borderFlat")
GAMEINFOKEY_FIXED(telefogheight, "telefogheight")
GAMEINFOKEY_FIXED(gibfactor, "gibfactor")
GAMEINFOKEY_INT(defKickback, "defKickback")
GAMEINFOKEY_CSTRING(SkyFlatName, "SkyFlatName", 8)
GAMEINFOKEY_STRING(SkyFlatName, "SkyFlatName")
GAMEINFOKEY_STRING(translator, "translator")
GAMEINFOKEY_COLOR(pickupcolor, "pickupcolor")
GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor")
@ -328,6 +323,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic")
GAMEINFOKEY_BOOL(drawreadthis, "drawreadthis")
GAMEINFOKEY_BOOL(swapmenu, "swapmenu")
GAMEINFOKEY_BOOL(dontcrunchcorpses, "dontcrunchcorpses")
GAMEINFOKEY_BOOL(intermissioncounter, "intermissioncounter")
GAMEINFOKEY_BOOL(nightmarefast, "nightmarefast")
GAMEINFOKEY_COLOR(dimcolor, "dimcolor")
@ -336,7 +332,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
GAMEINFOKEY_INT(defaultrespawntime, "defaultrespawntime")
GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle")
GAMEINFOKEY_CSTRING(Endoom, "endoom", 8)
GAMEINFOKEY_STRING(Endoom, "endoom")
GAMEINFOKEY_INT(player5start, "player5start")
GAMEINFOKEY_STRINGARRAY(quitmessages, "addquitmessages", 0, false)
GAMEINFOKEY_STRINGARRAY(quitmessages, "quitmessages", 0, true)
@ -347,7 +343,7 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_STRING(mFontColorHeader, "menufontcolor_header")
GAMEINFOKEY_STRING(mFontColorHighlight, "menufontcolor_highlight")
GAMEINFOKEY_STRING(mFontColorSelection, "menufontcolor_selection")
GAMEINFOKEY_CSTRING(mBackButton, "menubackbutton", 8)
GAMEINFOKEY_STRING(mBackButton, "menubackbutton")
GAMEINFOKEY_INT(TextScreenX, "textscreenx")
GAMEINFOKEY_INT(TextScreenY, "textscreeny")
GAMEINFOKEY_STRING(DefaultEndSequence, "defaultendsequence")

View File

@ -52,7 +52,7 @@
extern const char *GameNames[17];
struct gameborder_t
struct staticgameborder_t
{
BYTE offset;
BYTE size;
@ -66,6 +66,35 @@ struct gameborder_t
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
{
FName fontname;
@ -78,12 +107,13 @@ struct gameinfo_t
EGameType gametype;
FString ConfigName;
char titlePage[9];
FString TitlePage;
bool drawreadthis;
bool noloopfinalemusic;
bool intermissioncounter;
bool nightmarefast;
bool swapmenu;
bool dontcrunchcorpses;
TArray<FName> creditPages;
TArray<FName> finalePages;
TArray<FName> infoPages;
@ -98,16 +128,16 @@ struct gameinfo_t
FString chatSound;
FString finaleMusic;
int finaleOrder;
char finaleFlat[9];
char borderFlat[9];
char SkyFlatName[9];
char ArmorIcon1[9];
char ArmorIcon2[9];
char PauseSign[9];
char Endoom[9];
FString FinaleFlat;
FString BorderFlat;
FString SkyFlatName;
FString ArmorIcon1;
FString ArmorIcon2;
FString PauseSign;
FString Endoom;
fixed_t Armor2Percent;
FString quitSound;
gameborder_t *border;
gameborder_t Border;
int telefogheight;
int defKickback;
FString translator;
@ -133,7 +163,7 @@ struct gameinfo_t
FName mFontColorHeader;
FName mFontColorHighlight;
FName mFontColorSelection;
char mBackButton[9];
FString mBackButton;
fixed_t gibfactor;
int TextScreenX;
int TextScreenY;

View File

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

View File

@ -30,6 +30,7 @@ xx(Cumulative)
xx(Fuzzy)
xx(Opaque)
xx(Stencil)
xx(AddStencil)
// Render styles
xx(Normal)
@ -37,6 +38,7 @@ xx(SoulTrans)
xx(OptFuzzy)
xx(Add)
xx(Shaded)
xx(AddShaded)
xx(TranslucentStencil)
xx(Shadow)
xx(Subtract)
@ -486,6 +488,15 @@ xx(blockhitscan)
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
xx(Amount)
xx(Text)

View File

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

View File

@ -3542,6 +3542,8 @@ static const int LegacyRenderStyleIndices[] =
3, // STYLE_SoulTrans,
4, // STYLE_OptFuzzy,
5, // STYLE_Stencil,
6, // STYLE_AddStencil
7, // STYLE_AddShaded
64, // STYLE_Translucent
65, // STYLE_Add,
66, // STYLE_Shaded,
@ -6979,7 +6981,7 @@ scriptwait:
break;
case PRINTNAME_LEVEL:
work += level.mapname;
work += level.MapName;
break;
case PRINTNAME_SKILL:
@ -8940,7 +8942,7 @@ static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, c
def->playernum = -1;
}
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)
{
if (map == NULL || 0 == strnicmp (level.mapname, map, 8))
if (map == NULL || 0 == strnicmp (level.MapName, map, 8))
{
FBehavior *module = NULL;
const ScriptPtr *scriptdata;
@ -9001,17 +9003,17 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons
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);
else
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);
else
SetScriptState (script, DLevelScript::SCRIPT_PleaseRemove);

View File

@ -863,7 +863,7 @@ FUNC(LS_Teleport_NewMap)
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;
}
}
@ -1644,11 +1644,11 @@ FUNC(LS_ACS_Execute)
if (arg1 == 0)
{
mapname = level.mapname;
mapname = level.MapName;
}
else if ((info = FindLevelByNum(arg1)) != NULL)
{
mapname = info->mapname;
mapname = info->MapName;
}
else
{
@ -1667,11 +1667,11 @@ FUNC(LS_ACS_ExecuteAlways)
if (arg1 == 0)
{
mapname = level.mapname;
mapname = level.MapName;
}
else if ((info = FindLevelByNum(arg1)) != NULL)
{
mapname = info->mapname;
mapname = info->MapName;
}
else
{
@ -1707,7 +1707,7 @@ FUNC(LS_ACS_ExecuteWithResult)
int args[4] = { arg1, arg2, arg3, arg4 };
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)
@ -1716,9 +1716,9 @@ FUNC(LS_ACS_Suspend)
level_info_t *info;
if (arg1 == 0)
P_SuspendScript (arg0, level.mapname);
P_SuspendScript (arg0, level.MapName);
else if ((info = FindLevelByNum (arg1)) )
P_SuspendScript (arg0, info->mapname);
P_SuspendScript (arg0, info->MapName);
return true;
}
@ -1729,9 +1729,9 @@ FUNC(LS_ACS_Terminate)
level_info_t *info;
if (arg1 == 0)
P_TerminateScript (arg0, level.mapname);
P_TerminateScript (arg0, level.MapName);
else if ((info = FindLevelByNum (arg1)) )
P_TerminateScript (arg0, info->mapname);
P_TerminateScript (arg0, info->MapName);
return true;
}

View File

@ -1010,6 +1010,16 @@ bool AActor::Grind(bool items)
if ((flags & MF_CORPSE) && !(flags3 & MF3_DONTGIB) && (health <= 0))
{
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;
// ZDoom behavior differs from standard as crushed corpses cannot be raised.
// 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;
int lump_wad;
int lump_map;
int lump_name;
int lump_name = -1;
// Check for both *.wad and *.map in order to load Build maps
// 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);
lump_wad = Wads.CheckNumForFullName(fmt);
fmt.Format("maps/%s.map", mapname);
@ -3559,7 +3560,7 @@ void P_FreeExtraLevelData()
//
// [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];
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.
// On September 1, 1998, I added the position to indicate which set
// 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_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
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_TerminateScript (int script, char *map);
void P_SuspendScript (int script, const char *map);
void P_TerminateScript (int script, const char *map);
void P_DoDeferedScripts (void);
//

View File

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

View File

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

View File

@ -50,6 +50,8 @@ enum ERenderStyle
STYLE_TranslucentStencil,
STYLE_Shadow,
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
};

View File

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

View File

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

View File

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

View File

@ -484,7 +484,7 @@ static bool Cht_ChangeStartSpot (cheatseq_t *cheat)
{
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);
return true;
}

View File

@ -408,12 +408,13 @@ static void StoreLevelStats()
{
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())
{
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].killcount = level.killed_monsters;

View File

@ -551,7 +551,7 @@ void FTextureManager::ParseTime (FScanner &sc, DWORD &min, DWORD &max)
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 type2 = sc.Compare ("warp2"); // [GRB]
sc.MustGetString ();
@ -616,7 +616,7 @@ void FTextureManager::ParseWarp(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 fitwidth, fitheight;
FString picname;

View File

@ -1001,21 +1001,7 @@ void FMultiPatchTexture::ParsePatch(FScanner &sc, TexPart & part, bool silent, i
if (!texno.isValid())
{
int lumpnum = Wads.CheckNumForFullName(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, "./"))
if (strlen(sc.String) <= 8 && !strpbrk(sc.String, "./"))
{
int lumpnum = Wads.CheckNumForName(sc.String, usetype == TEX_MiscPatch? ns_graphics : ns_patches);
if (lumpnum >= 0)

View File

@ -167,6 +167,8 @@ FTexture::FTexture (const char *name, int lumpnum)
FTexture::~FTexture ()
{
FTexture *link = Wads.GetLinkedTexture(SourceLump);
if (link == this) Wads.SetLinkedTexture(SourceLump, NULL);
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_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);
@ -273,30 +302,6 @@ int FTextureManager::ListTextures (const char *name, TArray<FTextureID> &list)
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
@ -1093,8 +1098,15 @@ void FTextureManager::WriteTexture (FArchive &arc, int picnum)
pic = Textures[picnum].Texture;
}
arc.WriteName (pic->Name);
arc.WriteCount (pic->UseType);
if (Wads.GetLinkedTexture(pic->SourceLump) == pic)
{
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 FTexture *GetRedirect(bool wantwarped);
virtual FTexture *GetRawTexture(); // for FMultiPatchTexture to override
FTextureID GetID() const { return id; }
virtual void Unload () = 0;
@ -433,12 +432,12 @@ public:
TEXMAN_TryAny = 1,
TEXMAN_Overridable = 2,
TEXMAN_ReturnFirst = 4,
TEXMAN_AllowSkins = 8
TEXMAN_AllowSkins = 8,
TEXMAN_ShortNameOnly = 16
};
FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny);
FTextureID GetTexture (const char *name, int usetype, BITFIELD flags=0);
FTextureID FindTextureByLumpNum (int lumpnum);
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);

View File

@ -797,12 +797,12 @@ DEFINE_PROPERTY(renderstyle, S, Actor)
PROP_STRING_PARM(str, 0);
static const char * renderstyles[]={
"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[]={
STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_OptFuzzy,
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.
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)
{
FTexture *p;
const gameborder_t *border = gameinfo.border;
const gameborder_t *border = &gameinfo.Border;
// Sanity check for incomplete gameinfo
if (border == NULL)
return;
@ -1450,7 +1450,7 @@ void V_DrawBorder (int x1, int y1, int x2, int y2)
}
else
{
picnum = TexMan.CheckForTexture (gameinfo.borderFlat, FTexture::TEX_Flat);
picnum = TexMan.CheckForTexture (gameinfo.BorderFlat, FTexture::TEX_Flat);
}
if (picnum.isValid())
@ -1513,28 +1513,28 @@ static void V_DrawTopBorder ()
if (viewwidth == SCREENWIDTH)
return;
offset = gameinfo.border->offset;
offset = gameinfo.Border.offset;
if (viewwindowy < 34)
{
V_DrawBorder (0, 0, viewwindowx, 34);
V_DrawBorder (viewwindowx, 0, viewwindowx + viewwidth, viewwindowy);
V_DrawBorder (viewwindowx + viewwidth, 0, SCREENWIDTH, 34);
p = TexMan(gameinfo.border->t);
p = TexMan(gameinfo.Border.t);
screen->FlatFill(viewwindowx, viewwindowy - p->GetHeight(),
viewwindowx + viewwidth, viewwindowy, p, true);
p = TexMan(gameinfo.border->l);
p = TexMan(gameinfo.Border.l);
screen->FlatFill(viewwindowx - p->GetWidth(), viewwindowy,
viewwindowx, 35, p, true);
p = TexMan(gameinfo.border->r);
p = TexMan(gameinfo.Border.r);
screen->FlatFill(viewwindowx + viewwidth, viewwindowy,
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);
p = TexMan(gameinfo.border->tr);
p = TexMan(gameinfo.Border.tr);
screen->DrawTexture (p, viewwindowx + viewwidth, viewwindowy - offset, TAG_DONE);
}
else

View File

@ -2193,19 +2193,6 @@ void V_InitCustomFonts()
FTexture **p = &lumplist[*(unsigned char*)sc.String];
sc.MustGetString();
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())
{
*p = TexMan[texid];

View File

@ -548,6 +548,37 @@ int FWadCollection::GetNumForFullName (const char *name)
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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -349,7 +349,14 @@ FString &FString::AppendCStrPart (const char *tail, size_t tailLen)
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())
{

View File

@ -167,6 +167,7 @@ public:
FString &operator += (char tail);
FString &operator += (const FName &name) { return *this += name.GetChars(); }
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 char *tail) { return *this += tail; }
@ -252,9 +253,13 @@ public:
int Compare (const FString &other) const { return strcmp (Chars, other.Chars); }
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 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:
const FStringData *Data() const { return (FStringData *)Chars - 1; }

View File

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