# By Christoph Oelckers (2) and Edward Richardson (1)
# Via Christoph Oelckers
* 'master' of https://github.com/rheit/zdoom:
  - fixed: The map setup code was still truncating texture names in several places.
  Fix nettic run-out at end of demo playback
  - fixed: ACS's check...Texture functions must use the same search flags as the texture initialization code in p_setup.cpp and p_udmf.cpp. It also should not create textures that don't exist yet. We are only doing a comparison so it's not relevant if the texture exists or not.
This commit is contained in:
Shawn Walker 2014-05-16 20:27:57 -07:00
commit ae8995e65b
7 changed files with 52 additions and 42 deletions

View file

@ -1054,7 +1054,7 @@ void NetUpdate (void)
if (demoplayback) if (demoplayback)
{ {
nettics[0] = (maketic / ticdup); resendto[0] = nettics[0] = (maketic / ticdup);
return; // Don't touch netcmd data while playing a demo, as it'll already exist. return; // Don't touch netcmd data while playing a demo, as it'll already exist.
} }

View file

@ -85,6 +85,14 @@ struct mapsidedef_t
short sector; // Front sector, towards viewer. short sector; // Front sector, towards viewer.
}; };
struct intmapsidedef_t
{
FString toptexture;
FString bottomtexture;
FString midtexture;
};
// A LineDef, as used for editing, and as input to the BSP builder. // A LineDef, as used for editing, and as input to the BSP builder.
struct maplinedef_t struct maplinedef_t
{ {

View file

@ -3944,7 +3944,9 @@ bool DLevelScript::DoCheckActorTexture(int tid, AActor *activator, int string, b
{ {
return 0; return 0;
} }
FTexture *tex = TexMan.FindTexture(FBehavior::StaticLookupString(string)); FTexture *tex = TexMan.FindTexture(FBehavior::StaticLookupString(string), FTexture::TEX_Flat,
FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny|FTextureManager::TEXMAN_DontCreate);
if (tex == NULL) if (tex == NULL)
{ // If the texture we want to check against doesn't exist, then { // If the texture we want to check against doesn't exist, then
// they're obviously not the same. // they're obviously not the same.

View file

@ -577,13 +577,11 @@ void MapData::GetChecksum(BYTE cksum[16])
// //
//=========================================================================== //===========================================================================
static void SetTexture (side_t *side, int position, const char *name8, FMissingTextureTracker &track) static void SetTexture (side_t *side, int position, const char *name, FMissingTextureTracker &track)
{ {
static const char *positionnames[] = { "top", "middle", "bottom" }; static const char *positionnames[] = { "top", "middle", "bottom" };
static const char *sidenames[] = { "first", "second" }; static const char *sidenames[] = { "first", "second" };
char name[9];
strncpy (name, name8, 8);
name[8] = 0;
FTextureID texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, FTextureID texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall,
FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny); FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny);
@ -619,12 +617,17 @@ static void SetTexture (side_t *side, int position, const char *name8, FMissingT
// //
//=========================================================================== //===========================================================================
void SetTexture (sector_t *sector, int index, int position, const char *name8, FMissingTextureTracker &track) void SetTexture (sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &track, bool truncate)
{ {
static const char *positionnames[] = { "floor", "ceiling" }; static const char *positionnames[] = { "floor", "ceiling" };
char name[9]; char name8[9];
strncpy (name, name8, 8); if (truncate)
name[8] = 0; {
strncpy(name8, name, 8);
name8[8] = 0;
name = name8;
}
FTextureID texture = TexMan.CheckForTexture (name, FTexture::TEX_Flat, FTextureID texture = TexMan.CheckForTexture (name, FTexture::TEX_Flat,
FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny); FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny);
@ -674,11 +677,8 @@ static void SummarizeMissingTextures(const FMissingTextureTracker &missing)
// //
//=========================================================================== //===========================================================================
static void SetTexture (side_t *side, int position, DWORD *blend, char *name8) static void SetTexture (side_t *side, int position, DWORD *blend, const char *name)
{ {
char name[9];
strncpy (name, name8, 8);
name[8] = 0;
FTextureID texture; FTextureID texture;
if ((*blend = R_ColormapNumForName (name)) == 0) if ((*blend = R_ColormapNumForName (name)) == 0)
{ {
@ -705,12 +705,9 @@ static void SetTexture (side_t *side, int position, DWORD *blend, char *name8)
side->SetTexture(position, texture); side->SetTexture(position, texture);
} }
static void SetTextureNoErr (side_t *side, int position, DWORD *color, char *name8, bool *validcolor, bool isFog) static void SetTextureNoErr (side_t *side, int position, DWORD *color, const char *name, bool *validcolor, bool isFog)
{ {
char name[9];
FTextureID texture; FTextureID texture;
strncpy (name, name8, 8);
name[8] = 0;
*validcolor = false; *validcolor = false;
texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall, texture = TexMan.CheckForTexture (name, FTexture::TEX_Wall,
FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny); FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny);
@ -1515,8 +1512,8 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
ss->ceilingplane.d = ss->GetPlaneTexZ(sector_t::ceiling); ss->ceilingplane.d = ss->GetPlaneTexZ(sector_t::ceiling);
ss->ceilingplane.c = -FRACUNIT; ss->ceilingplane.c = -FRACUNIT;
ss->ceilingplane.ic = -FRACUNIT; ss->ceilingplane.ic = -FRACUNIT;
SetTexture(ss, i, sector_t::floor, ms->floorpic, missingtex); SetTexture(ss, i, sector_t::floor, ms->floorpic, missingtex, true);
SetTexture(ss, i, sector_t::ceiling, ms->ceilingpic, missingtex); SetTexture(ss, i, sector_t::ceiling, ms->ceilingpic, missingtex, true);
ss->lightlevel = LittleShort(ms->lightlevel); ss->lightlevel = LittleShort(ms->lightlevel);
if (map->HasBehavior) if (map->HasBehavior)
ss->special = LittleShort(ms->special); ss->special = LittleShort(ms->special);
@ -2473,11 +2470,8 @@ int P_DetermineTranslucency (int lumpnum)
return newcolor.r; return newcolor.r;
} }
void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, mapsidedef_t *msd, int special, int tag, short *alpha, FMissingTextureTracker &missingtex) void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmapsidedef_t *msd, int special, int tag, short *alpha, FMissingTextureTracker &missingtex)
{ {
char name[9];
name[8] = 0;
switch (special) switch (special)
{ {
case Transfer_Heights: // variable colormap via 242 linedef case Transfer_Heights: // variable colormap via 242 linedef
@ -2503,7 +2497,6 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, mapside
SetTextureNoErr (sd, side_t::bottom, &fog, msd->bottomtexture, &foggood, true); SetTextureNoErr (sd, side_t::bottom, &fog, msd->bottomtexture, &foggood, true);
SetTextureNoErr (sd, side_t::top, &color, msd->toptexture, &colorgood, false); SetTextureNoErr (sd, side_t::top, &color, msd->toptexture, &colorgood, false);
strncpy (name, msd->midtexture, 8);
SetTexture(sd, side_t::mid, msd->midtexture, missingtex); SetTexture(sd, side_t::mid, msd->midtexture, missingtex);
if (colorgood | foggood) if (colorgood | foggood)
@ -2534,8 +2527,7 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, mapside
case Sector_Set3DFloor: case Sector_Set3DFloor:
if (msd->toptexture[0]=='#') if (msd->toptexture[0]=='#')
{ {
strncpy (name, msd->toptexture, 8); sd->SetTexture(side_t::top, FNullTextureID() +(-strtol(&msd->toptexture[1], NULL, 10))); // store the alpha as a negative texture index
sd->SetTexture(side_t::top, FNullTextureID() +(-strtol(name+1, NULL, 10))); // store the alpha as a negative texture index
// This will be sorted out by the 3D-floor code later. // This will be sorted out by the 3D-floor code later.
} }
else else
@ -2629,7 +2621,13 @@ void P_LoadSideDefs2 (MapData *map, FMissingTextureTracker &missingtex)
{ {
sd->sector = sec = &sectors[LittleShort(msd->sector)]; sd->sector = sec = &sectors[LittleShort(msd->sector)];
} }
P_ProcessSideTextures(!map->HasBehavior, sd, sec, msd,
intmapsidedef_t imsd;
imsd.toptexture.CopyCStrPart(msd->toptexture, 8);
imsd.midtexture.CopyCStrPart(msd->midtexture, 8);
imsd.bottomtexture.CopyCStrPart(msd->bottomtexture, 8);
P_ProcessSideTextures(!map->HasBehavior, sd, sec, &imsd,
sidetemp[i].a.special, sidetemp[i].a.tag, &sidetemp[i].a.alpha, missingtex); sidetemp[i].a.special, sidetemp[i].a.tag, &sidetemp[i].a.alpha, missingtex);
} }
delete[] msdf; delete[] msdf;

View file

@ -118,8 +118,8 @@ enum
// namespace for each game // namespace for each game
}; };
void SetTexture (sector_t *sector, int index, int position, const char *name8, FMissingTextureTracker &); void SetTexture (sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &, bool truncate);
void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, mapsidedef_t *msd, int special, int tag, short *alpha, FMissingTextureTracker &); void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmapsidedef_t *msd, int special, int tag, short *alpha, FMissingTextureTracker &);
void P_AdjustLine (line_t *ld); void P_AdjustLine (line_t *ld);
void P_FinishLoadingLineDef(line_t *ld, int alpha); void P_FinishLoadingLineDef(line_t *ld, int alpha);
void SpawnMapThing(int index, FMapThing *mt, int position); void SpawnMapThing(int index, FMapThing *mt, int position);
@ -394,7 +394,7 @@ class UDMFParser : public UDMFParserBase
TArray<line_t> ParsedLines; TArray<line_t> ParsedLines;
TArray<side_t> ParsedSides; TArray<side_t> ParsedSides;
TArray<mapsidedef_t> ParsedSideTextures; TArray<intmapsidedef_t> ParsedSideTextures;
TArray<sector_t> ParsedSectors; TArray<sector_t> ParsedSectors;
TArray<vertex_t> ParsedVertices; TArray<vertex_t> ParsedVertices;
TArray<vertexdata_t> ParsedVertexDatas; TArray<vertexdata_t> ParsedVertexDatas;
@ -1089,14 +1089,14 @@ public:
// //
//=========================================================================== //===========================================================================
void ParseSidedef(side_t *sd, mapsidedef_t *sdt, int index) void ParseSidedef(side_t *sd, intmapsidedef_t *sdt, int index)
{ {
fixed_t texofs[2]={0,0}; fixed_t texofs[2]={0,0};
memset(sd, 0, sizeof(*sd)); memset(sd, 0, sizeof(*sd));
strncpy(sdt->bottomtexture, "-", 8); sdt->bottomtexture = "-";
strncpy(sdt->toptexture, "-", 8); sdt->toptexture = "-";
strncpy(sdt->midtexture, "-", 8); sdt->midtexture = "-";
sd->SetTextureXScale(FRACUNIT); sd->SetTextureXScale(FRACUNIT);
sd->SetTextureYScale(FRACUNIT); sd->SetTextureYScale(FRACUNIT);
@ -1115,15 +1115,15 @@ public:
continue; continue;
case NAME_Texturetop: case NAME_Texturetop:
strncpy(sdt->toptexture, CheckString(key), 8); sdt->toptexture = CheckString(key);
continue; continue;
case NAME_Texturebottom: case NAME_Texturebottom:
strncpy(sdt->bottomtexture, CheckString(key), 8); sdt->bottomtexture = CheckString(key);
continue; continue;
case NAME_Texturemiddle: case NAME_Texturemiddle:
strncpy(sdt->midtexture, CheckString(key), 8); sdt->midtexture = CheckString(key);
continue; continue;
case NAME_Sector: case NAME_Sector:
@ -1287,11 +1287,11 @@ public:
continue; continue;
case NAME_Texturefloor: case NAME_Texturefloor:
SetTexture(sec, index, sector_t::floor, CheckString(key), missingTex); SetTexture(sec, index, sector_t::floor, CheckString(key), missingTex, false);
continue; continue;
case NAME_Textureceiling: case NAME_Textureceiling:
SetTexture(sec, index, sector_t::ceiling, CheckString(key), missingTex); SetTexture(sec, index, sector_t::ceiling, CheckString(key), missingTex, false);
continue; continue;
case NAME_Lightlevel: case NAME_Lightlevel:
@ -1799,7 +1799,7 @@ public:
else if (sc.Compare("sidedef")) else if (sc.Compare("sidedef"))
{ {
side_t si; side_t si;
mapsidedef_t st; intmapsidedef_t st;
ParseSidedef(&si, &st, ParsedSides.Size()); ParseSidedef(&si, &st, ParsedSides.Size());
ParsedSides.Push(si); ParsedSides.Push(si);
ParsedSideTextures.Push(st); ParsedSideTextures.Push(st);

View file

@ -238,6 +238,7 @@ FTextureID FTextureManager::CheckForTexture (const char *name, int usetype, BITF
FTexture *tex = Wads.GetLinkedTexture(lump); FTexture *tex = Wads.GetLinkedTexture(lump);
if (tex == NO_TEXTURE) return FTextureID(-1); if (tex == NO_TEXTURE) return FTextureID(-1);
if (tex != NULL) return tex->id; if (tex != NULL) return tex->id;
if (flags & TEXMAN_DontCreate) return FTextureID(-1); // we only want to check, there's no need to create a texture if we don't have one yet.
tex = FTexture::CreateTexture("", lump, FTexture::TEX_Override); tex = FTexture::CreateTexture("", lump, FTexture::TEX_Override);
if (tex != NULL) if (tex != NULL)
{ {

View file

@ -363,7 +363,8 @@ public:
TEXMAN_Overridable = 2, TEXMAN_Overridable = 2,
TEXMAN_ReturnFirst = 4, TEXMAN_ReturnFirst = 4,
TEXMAN_AllowSkins = 8, TEXMAN_AllowSkins = 8,
TEXMAN_ShortNameOnly = 16 TEXMAN_ShortNameOnly = 16,
TEXMAN_DontCreate = 32
}; };
FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny);