From be04b7e29c57290c44f2712c27e83296b7bdc163 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 2 Jun 2009 12:56:38 +0000 Subject: [PATCH] (svn r16503) -Fix: base graphics names must be unique, so don't add duplicates (even if the versions differ). --- src/gfxinit.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 0554eee9b0..9ef2058951 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -444,7 +444,7 @@ public: bool OBGFileScanner::AddFile(const char *filename, size_t basepath_length) { bool ret = false; - DEBUG(grf, 1, "Found %s as base graphics set", filename); + DEBUG(grf, 1, "Checking %s for base graphics set", filename); GraphicsSet *graphics = new GraphicsSet();; IniFile *ini = new IniFile(); @@ -459,12 +459,28 @@ bool OBGFileScanner::AddFile(const char *filename, size_t basepath_length) } if (FillGraphicsSetDetails(graphics, ini, path)) { - bool duplicate = false; - for (const GraphicsSet *c = _available_graphics_sets; !duplicate && c != NULL; c = c->next) { - duplicate = (strcmp(c->name, graphics->name) == 0 || c->shortname == graphics->shortname) && c->version == graphics->version; + const GraphicsSet *duplicate = NULL; + for (const GraphicsSet *c = _available_graphics_sets; c != NULL; c = c->next) { + if (strcmp(c->name, graphics->name) == 0 || c->shortname == graphics->shortname) { + duplicate = c; + break; + } } - if (duplicate) { - delete graphics; + if (duplicate != NULL) { + if (duplicate->version >= graphics->version) { + DEBUG(grf, 1, "Not adding %s (%i) as base graphics set (duplicate)", graphics->name, graphics->version); + delete graphics; + } else { + GraphicsSet **prev = &_available_graphics_sets; + while (*prev != duplicate) prev = &(*prev)->next; + + *prev = graphics; + graphics->next = duplicate->next; + + DEBUG(grf, 1, "Removing %s (%i) as base graphics set (duplicate)", duplicate->name, duplicate->version); + delete duplicate; + ret = true; + } } else { GraphicsSet **last = &_available_graphics_sets; while (*last != NULL) last = &(*last)->next; @@ -472,6 +488,9 @@ bool OBGFileScanner::AddFile(const char *filename, size_t basepath_length) *last = graphics; ret = true; } + if (ret) { + DEBUG(grf, 1, "Adding %s (%i) as base graphics set", graphics->name, graphics->version); + } } else { delete graphics; }