|
@@ -26,6 +26,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
|
#define override_cast static_cast<override_t>
|
|
|
|
|
|
+static const std::map<std::string, OverrideTarget> override_LUT = {
|
|
|
+ { "top", OverrideTarget::TOP },
|
|
|
+ { "bottom", OverrideTarget::BOTTOM },
|
|
|
+ { "left", OverrideTarget::LEFT },
|
|
|
+ { "right", OverrideTarget::RIGHT },
|
|
|
+ { "front", OverrideTarget::FRONT },
|
|
|
+ { "back", OverrideTarget::BACK },
|
|
|
+ { "inventory", OverrideTarget::INVENTORY },
|
|
|
+ { "wield", OverrideTarget::WIELD },
|
|
|
+ { "special1", OverrideTarget::SPECIAL_1 },
|
|
|
+ { "special2", OverrideTarget::SPECIAL_2 },
|
|
|
+ { "special3", OverrideTarget::SPECIAL_3 },
|
|
|
+ { "special4", OverrideTarget::SPECIAL_4 },
|
|
|
+ { "special5", OverrideTarget::SPECIAL_5 },
|
|
|
+ { "special6", OverrideTarget::SPECIAL_6 },
|
|
|
+ { "sides", OverrideTarget::SIDES },
|
|
|
+ { "all", OverrideTarget::ALL_FACES },
|
|
|
+ { "*", OverrideTarget::ALL_FACES }
|
|
|
+};
|
|
|
+
|
|
|
TextureOverrideSource::TextureOverrideSource(std::string filepath)
|
|
|
{
|
|
|
std::ifstream infile(filepath.c_str());
|
|
@@ -41,8 +61,9 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath)
|
|
|
if (line.empty() || line[0] == '#')
|
|
|
continue;
|
|
|
|
|
|
+ // Format: mod_name:item_name target1[,...] texture_name.png
|
|
|
std::vector<std::string> splitted = str_split(line, ' ');
|
|
|
- if (splitted.size() != 3) {
|
|
|
+ if (splitted.size() < 3) {
|
|
|
warningstream << filepath << ":" << line_index
|
|
|
<< " Syntax error in texture override \"" << line
|
|
|
<< "\": Expected 3 arguments, got " << splitted.size()
|
|
@@ -57,45 +78,31 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath)
|
|
|
// Parse the target mask
|
|
|
std::vector<std::string> targets = str_split(splitted[1], ',');
|
|
|
for (const std::string &target : targets) {
|
|
|
- if (target == "top")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::TOP);
|
|
|
- else if (target == "bottom")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::BOTTOM);
|
|
|
- else if (target == "left")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::LEFT);
|
|
|
- else if (target == "right")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::RIGHT);
|
|
|
- else if (target == "front")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::FRONT);
|
|
|
- else if (target == "back")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::BACK);
|
|
|
- else if (target == "inventory")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::INVENTORY);
|
|
|
- else if (target == "wield")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::WIELD);
|
|
|
- else if (target == "special1")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_1);
|
|
|
- else if (target == "special2")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_2);
|
|
|
- else if (target == "special3")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_3);
|
|
|
- else if (target == "special4")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_4);
|
|
|
- else if (target == "special5")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_5);
|
|
|
- else if (target == "special6")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SPECIAL_6);
|
|
|
- else if (target == "sides")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::SIDES);
|
|
|
- else if (target == "all" || target == "*")
|
|
|
- texture_override.target |= override_cast(OverrideTarget::ALL_FACES);
|
|
|
- else {
|
|
|
- // Report invalid target
|
|
|
- warningstream << filepath << ":" << line_index
|
|
|
- << " Syntax error in texture override \"" << line
|
|
|
- << "\": Unknown target \"" << target << "\""
|
|
|
- << std::endl;
|
|
|
+ std::vector<std::string> kvpair = str_split(target, '=');
|
|
|
+ if (kvpair.size() == 2) {
|
|
|
+ // Key-value pairs
|
|
|
+ if (kvpair[0] == "align_world") {
|
|
|
+ // Global textures
|
|
|
+ texture_override.world_scale = stoi(kvpair[1], 0, U8_MAX);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (kvpair.size() == 1) {
|
|
|
+ // Regular override flags
|
|
|
+ auto pair = override_LUT.find(target);
|
|
|
+
|
|
|
+ if (pair != override_LUT.end()) {
|
|
|
+ texture_override.target |= override_cast(pair->second);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ // Report invalid target
|
|
|
+ warningstream << filepath << ":" << line_index
|
|
|
+ << " Syntax error in texture override \"" << line
|
|
|
+ << "\": Unknown target \"" << target << "\""
|
|
|
+ << std::endl;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// If there are no valid targets, skip adding this override
|