This commit is contained in:
Christoph Oelckers 2013-08-31 21:53:11 +02:00
commit bab56106c1
12 changed files with 96 additions and 18 deletions

View file

@ -541,7 +541,7 @@ CCMD (mapchecksum)
} }
for (int i = 1; i < argv.argc(); ++i) for (int i = 1; i < argv.argc(); ++i)
{ {
map = P_OpenMapData(argv[i]); map = P_OpenMapData(argv[i], true);
if (map == NULL) if (map == NULL)
{ {
Printf("Cannot load %s as a map\n", argv[i]); Printf("Cannot load %s as a map\n", argv[i]);

View file

@ -1923,7 +1923,7 @@ 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); MapData *map = P_OpenMapData(info->mapname, true);
if (map != NULL) if (map != NULL)
{ {

View file

@ -35,6 +35,7 @@
#include <string.h> #include <string.h>
#include "m_argv.h" #include "m_argv.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "i_system.h"
IMPLEMENT_CLASS (DArgs) IMPLEMENT_CLASS (DArgs)
@ -391,6 +392,14 @@ void DArgs::CollectFiles(const char *param, const char *extension)
} }
} }
// Optional: Replace short path names with long path names
#ifdef _WIN32
for (i = 0; i < work.Size(); ++i)
{
work[i] = I_GetLongPathName(work[i]);
}
#endif
// Step 3: Add work back to Argv, as long as it's non-empty. // Step 3: Add work back to Argv, as long as it's non-empty.
if (work.Size() > 0) if (work.Size() > 0)
{ {

View file

@ -575,11 +575,7 @@ int ACSStringPool::InsertString(FString &str, unsigned int h, unsigned int bucke
} }
else else
{ // Scan for the next free entry { // Scan for the next free entry
unsigned int i; FindFirstFreeEntry(FirstFreeEntry + 1);
for (i = FirstFreeEntry + 1; i < Pool.Size() && Pool[i].Next != FREE_ENTRY; ++i)
{
}
FirstFreeEntry = i;
} }
PoolEntry *entry = &Pool[index]; PoolEntry *entry = &Pool[index];
entry->Str = str; entry->Str = str;
@ -590,6 +586,23 @@ int ACSStringPool::InsertString(FString &str, unsigned int h, unsigned int bucke
return index | STRPOOL_LIBRARYID_OR; return index | STRPOOL_LIBRARYID_OR;
} }
//============================================================================
//
// ACSStringPool :: FindFirstFreeEntry
//
// Finds the first free entry, starting at base.
//
//============================================================================
void ACSStringPool::FindFirstFreeEntry(unsigned base)
{
while (base < Pool.Size() && Pool[base].Next != FREE_ENTRY)
{
base++;
}
FirstFreeEntry = base;
}
//============================================================================ //============================================================================
// //
// ACSStringPool :: ReadStrings // ACSStringPool :: ReadStrings
@ -638,6 +651,7 @@ void ACSStringPool::ReadStrings(PNGHandle *png, DWORD id)
{ {
delete[] str; delete[] str;
} }
FindFirstFreeEntry(0);
} }
} }
@ -690,6 +704,7 @@ void ACSStringPool::Dump() const
Printf("%4u. (%2d) \"%s\"\n", i, Pool[i].LockCount, Pool[i].Str.GetChars()); Printf("%4u. (%2d) \"%s\"\n", i, Pool[i].LockCount, Pool[i].Str.GetChars());
} }
} }
Printf("First free %u\n", FirstFreeEntry);
} }
//============================================================================ //============================================================================
@ -8405,7 +8420,7 @@ scriptwait:
{ {
int playernum = STACK(1); int playernum = STACK(1);
if (playernum < 0 || playernum >= MAXPLAYERS || !playeringame[playernum] || players[playernum].camera == NULL) if (playernum < 0 || playernum >= MAXPLAYERS || !playeringame[playernum] || players[playernum].camera == NULL || players[playernum].camera->player != NULL)
{ {
STACK(1) = -1; STACK(1) = -1;
} }

View file

@ -100,6 +100,7 @@ public:
private: private:
int FindString(const char *str, size_t len, unsigned int h, unsigned int bucketnum); int FindString(const char *str, size_t len, unsigned int h, unsigned int bucketnum);
int InsertString(FString &str, unsigned int h, unsigned int bucketnum, const SDWORD *stack, int stackdepth); int InsertString(FString &str, unsigned int h, unsigned int bucketnum, const SDWORD *stack, int stackdepth);
void FindFirstFreeEntry(unsigned int base);
enum { NUM_BUCKETS = 251 }; enum { NUM_BUCKETS = 251 };
enum { FREE_ENTRY = 0xFFFFFFFE }; // Stored in PoolEntry's Next field enum { FREE_ENTRY = 0xFFFFFFFE }; // Stored in PoolEntry's Next field

View file

@ -250,7 +250,7 @@ static int GetMapIndex(const char *mapname, int lastindex, const char *lumpname,
// //
//=========================================================================== //===========================================================================
MapData *P_OpenMapData(const char * mapname) MapData *P_OpenMapData(const char * mapname, bool justcheck)
{ {
MapData * map = new MapData; MapData * map = new MapData;
FileReader * wadReader = NULL; FileReader * wadReader = NULL;
@ -331,13 +331,18 @@ MapData *P_OpenMapData(const char * mapname)
const char * lumpname = Wads.GetLumpFullName(lump_name + i); const char * lumpname = Wads.GetLumpFullName(lump_name + i);
try try
{ {
index = GetMapIndex(mapname, index, lumpname, true); index = GetMapIndex(mapname, index, lumpname, !justcheck);
} }
catch(...) catch(...)
{ {
delete map; delete map;
throw; throw;
} }
if (index == -2)
{
delete map;
return NULL;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore
@ -471,13 +476,18 @@ MapData *P_OpenMapData(const char * mapname)
{ {
try try
{ {
index = GetMapIndex(maplabel, index, lumpname, true); index = GetMapIndex(maplabel, index, lumpname, !justcheck);
} }
catch(...) catch(...)
{ {
delete map; delete map;
throw; throw;
} }
if (index == -2)
{
delete map;
return NULL;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore
@ -508,7 +518,7 @@ MapData *P_OpenMapData(const char * mapname)
bool P_CheckMapData(const char *mapname) bool P_CheckMapData(const char *mapname)
{ {
MapData *mapd = P_OpenMapData(mapname); MapData *mapd = P_OpenMapData(mapname, true);
if (mapd == NULL) return false; if (mapd == NULL) return false;
delete mapd; delete mapd;
return true; return true;
@ -3610,7 +3620,7 @@ void P_SetupLevel (char *lumpname, int position)
P_FreeLevelData (); P_FreeLevelData ();
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
MapData *map = P_OpenMapData(lumpname); MapData *map = P_OpenMapData(lumpname, true);
if (map == NULL) if (map == NULL)
{ {
I_Error("Unable to open map '%s'\n", lumpname); I_Error("Unable to open map '%s'\n", lumpname);

View file

@ -94,7 +94,7 @@ struct MapData
void GetChecksum(BYTE cksum[16]); void GetChecksum(BYTE cksum[16]);
}; };
MapData * P_OpenMapData(const char * mapname); MapData * P_OpenMapData(const char * mapname, bool justcheck);
bool P_CheckMapData(const char * mapname); bool P_CheckMapData(const char * mapname);

View file

@ -463,7 +463,7 @@ void STAT_ChangeLevel(const char *newl)
{ {
// we reached the end of this episode // we reached the end of this episode
int wad = 0; int wad = 0;
MapData * map = P_OpenMapData(StartEpisode->mEpisodeMap); MapData * map = P_OpenMapData(StartEpisode->mEpisodeMap, false);
if (map != NULL) if (map != NULL)
{ {
wad = Wads.GetLumpFile(map->lumpnum); wad = Wads.GetLumpFile(map->lumpnum);

View file

@ -233,13 +233,13 @@ FMultiPatchTexture::FMultiPatchTexture (const void *texdef, FPatchLookup *patchl
NumParts = SAFESHORT(mtexture.d->patchcount); NumParts = SAFESHORT(mtexture.d->patchcount);
} }
if (NumParts <= 0) if (NumParts < 0)
{ {
I_FatalError ("Bad texture directory"); I_FatalError ("Bad texture directory");
} }
UseType = FTexture::TEX_Wall; UseType = FTexture::TEX_Wall;
Parts = new TexPart[NumParts]; Parts = NumParts > 0 ? new TexPart[NumParts] : NULL;
Width = SAFESHORT(mtexture.d->width); Width = SAFESHORT(mtexture.d->width);
Height = SAFESHORT(mtexture.d->height); Height = SAFESHORT(mtexture.d->height);
strncpy (Name, (const char *)mtexture.d->name, 8); strncpy (Name, (const char *)mtexture.d->name, 8);
@ -906,7 +906,7 @@ void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int d
// There is bizzarely a Doom editing tool that writes to the // There is bizzarely a Doom editing tool that writes to the
// first two elements of columndirectory, so I can't check those. // first two elements of columndirectory, so I can't check those.
if (SAFESHORT(tex->patchcount) <= 0 || if (SAFESHORT(tex->patchcount) < 0 ||
tex->columndirectory[2] != 0 || tex->columndirectory[2] != 0 ||
tex->columndirectory[3] != 0) tex->columndirectory[3] != 0)
{ {

View file

@ -4913,6 +4913,18 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetTics)
ACTION_PARAM_START(1); ACTION_PARAM_START(1);
ACTION_PARAM_INT(tics_to_set, 0); ACTION_PARAM_INT(tics_to_set, 0);
if (stateowner != self && self->player != NULL && stateowner->IsKindOf(RUNTIME_CLASS(AWeapon)))
{ // Is this a weapon? Need to check psp states for a match, then. Blah.
for (int i = 0; i < NUMPSPRITES; ++i)
{
if (self->player->psprites[i].state == CallingState)
{
self->player->psprites[i].tics = tics_to_set;
return;
}
}
}
// Just set tics for self.
self->tics = tics_to_set; self->tics = tics_to_set;
} }

View file

@ -1569,3 +1569,31 @@ unsigned int I_MakeRNGSeed()
CryptReleaseContext(prov, 0); CryptReleaseContext(prov, 0);
return seed; return seed;
} }
//==========================================================================
//
// I_GetLongPathName
//
// Returns the long version of the path, or the original if there isn't
// anything worth changing.
//
//==========================================================================
FString I_GetLongPathName(FString shortpath)
{
DWORD buffsize = GetLongPathName(shortpath.GetChars(), NULL, 0);
if (buffsize == 0)
{ // nothing to change (it doesn't exist, maybe?)
return shortpath;
}
TCHAR *buff = new TCHAR[buffsize];
DWORD buffsize2 = GetLongPathName(shortpath.GetChars(), buff, buffsize);
if (buffsize2 >= buffsize)
{ // Failure! Just return the short path
delete[] buff;
return shortpath;
}
FString longpath(buff, buffsize2);
delete[] buff;
return longpath;
}

View file

@ -155,6 +155,9 @@ typedef _W64 long WLONG_PTR;
typedef long WLONG_PTR; typedef long WLONG_PTR;
#endif #endif
// Wrapper for GetLongPathName
FString I_GetLongPathName(FString shortpath);
// Directory searching routines // Directory searching routines
// Mirror WIN32_FIND_DATAA in <winbase.h> // Mirror WIN32_FIND_DATAA in <winbase.h>