properly adjust texlists when deleting texture slots

check texlists during save (and print warning, if errors were corrected)

also add (undocumented) command to patch messed up texlists
This commit is contained in:
ac-stef
2016-08-20 14:45:41 +02:00
parent d48675911f
commit d5bd896189
5 changed files with 50 additions and 23 deletions
+23 -19
View File
@@ -525,6 +525,28 @@ VAR(advancemaprevision, 1, 1, 100);
VARP(mapbackupsonsave, 0, 1, 1);
void rebuildtexlists() // checks the texlists, if they still contain all possible textures
{
short h[256];
int mk[3], mt = 0;
vector<uchar> missing;
loopk(3)
{
missing.setsize(0);
uchar *p = hdr.texlists[k];
loopi(256) h[i] = 0;
loopi(256) h[p[i]]++;
loopi(256) if(h[i] == 0) missing.add(i);
mt += mk[k] = missing.length();
loopi(256) if(h[p[i]] > 1)
{
h[p[i]]--;
p[i] = missing.pop();
}
}
if(mt) conoutf("WARNING: rebuildtexlists() fixed %d|%d|%d missing entries", mk[0], mk[1], mk[2]);
}
void save_world(char *mname, bool skipoptimise, bool addcomfort)
{
if(!*mname) mname = getclientmap();
@@ -560,6 +582,7 @@ void save_world(char *mname, bool skipoptimise, bool addcomfort)
hdr.version = MAPVERSION;
hdr.headersize = sizeof(header);
hdr.timestamp = (int) time(NULL);
rebuildtexlists();
hdr.numents = 0;
loopv(ents) if(ents[i].type!=NOTUSED) hdr.numents++;
if(hdr.numents > MAXENTITIES)
@@ -687,25 +710,6 @@ extern char *mlayout;
extern int Mv, Ma, Hhits;
extern float Mh;
void rebuildtexlists() // checks the texlists, if they still contain all possible textures
{
short h[256];
vector<uchar> missing;
loopk(3)
{
missing.setsize(0);
uchar *p = hdr.texlists[k];
loopi(256) h[i] = 0;
loopi(256) h[p[i]]++;
loopi(256) if(h[i] == 0) missing.add(i);
loopi(256) if(h[p[i]] > 1)
{
h[p[i]]--;
p[i] = missing.pop();
}
}
}
static string lastloadedconfigfile;
bool load_world(char *mname) // still supports all map formats that have existed since the earliest cube betas!