Skip to content

Commit

Permalink
fix FGD base class data overriding child classes (fixes #101)
Browse files Browse the repository at this point in the history
  • Loading branch information
wootguy committed Apr 23, 2024
1 parent 89542e8 commit e11e70d
Showing 1 changed file with 23 additions and 22 deletions.
45 changes: 23 additions & 22 deletions src/editor/Fgd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,26 @@ void Fgd::processClassInheritance() {
vector<KeyvalueChoice> newSpawnflags;
set<string> addedKeys;
set<string> addedSpawnflags;
//logf << classes[i]->name << " INHERITS FROM: ";

bool verbose = false;
if (verbose) logf("%s INHERITS FROM:\n", classes[i]->name.c_str());

// add in fields from the child class
for (int c = 0; c < classes[i]->keyvalues.size(); c++) {
if (!addedKeys.count(classes[i]->keyvalues[c].name)) {
newKeyvalues.push_back(classes[i]->keyvalues[c]);
addedKeys.insert(classes[i]->keyvalues[c].name);
}
if (classes[i]->keyvalues[c].iType == FGD_KEY_FLAGS) {
for (int f = 0; f < classes[i]->keyvalues[c].choices.size(); f++) {
KeyvalueChoice& spawnflagOption = classes[i]->keyvalues[c].choices[f];
newSpawnflags.push_back(spawnflagOption);
addedSpawnflags.insert(spawnflagOption.svalue);
}
}
}

// add fields from base classes if they don't override child class keys
for (int k = allBaseClasses.size()-1; k >= 0; k--) {
if (!classes[i]->colorSet && allBaseClasses[k]->colorSet) {
classes[i]->color = allBaseClasses[k]->color;
Expand All @@ -371,37 +390,21 @@ void Fgd::processClassInheritance() {
classes[i]->maxs = allBaseClasses[k]->maxs;
}
for (int c = 0; c < allBaseClasses[k]->keyvalues.size(); c++) {
if (addedKeys.find(allBaseClasses[k]->keyvalues[c].name) == addedKeys.end()) {
if (!addedKeys.count(allBaseClasses[k]->keyvalues[c].name)) {
newKeyvalues.push_back(allBaseClasses[k]->keyvalues[c]);
addedKeys.insert(allBaseClasses[k]->keyvalues[c].name);
}
if (allBaseClasses[k]->keyvalues[c].iType == FGD_KEY_FLAGS) {
for (int f = 0; f < allBaseClasses[k]->keyvalues[c].choices.size(); f++) {
KeyvalueChoice& spawnflagOption = allBaseClasses[k]->keyvalues[c].choices[f];
if (addedSpawnflags.find(spawnflagOption.svalue) == addedSpawnflags.end()) {
if (!addedSpawnflags.count(spawnflagOption.svalue)) {
newSpawnflags.push_back(spawnflagOption);
addedSpawnflags.insert(spawnflagOption.svalue);
}
}
}
}
//logf << allBaseClasses[k]->name << " ";
}

for (int c = 0; c < classes[i]->keyvalues.size(); c++) {
if (addedKeys.find(classes[i]->keyvalues[c].name) == addedKeys.end()) {
newKeyvalues.push_back(classes[i]->keyvalues[c]);
addedKeys.insert(classes[i]->keyvalues[c].name);
}
if (classes[i]->keyvalues[c].iType == FGD_KEY_FLAGS) {
for (int f = 0; f < classes[i]->keyvalues[c].choices.size(); f++) {
KeyvalueChoice& spawnflagOption = classes[i]->keyvalues[c].choices[f];
if (addedSpawnflags.find(spawnflagOption.svalue) == addedSpawnflags.end()) {
newSpawnflags.push_back(spawnflagOption);
addedSpawnflags.insert(spawnflagOption.svalue);
}
}
}
if (verbose) logf(" %s\n", allBaseClasses[k]->name.c_str());
}

classes[i]->keyvalues = newKeyvalues;
Expand All @@ -411,8 +414,6 @@ void Fgd::processClassInheritance() {
classes[i]->keyvalues[c].choices = newSpawnflags;
}
}

//logf << endl;
}

}
Expand Down

0 comments on commit e11e70d

Please sign in to comment.