128 lines
4.4 KiB
C++
128 lines
4.4 KiB
C++
// MassBuilderSaveTool
|
|
// Copyright (C) 2021-2024 Guillaume Jacquemin
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
#include <Corrade/Utility/Format.h>
|
|
#include <Corrade/Utility/Path.h>
|
|
|
|
#include "../Logger/Logger.h"
|
|
#include "../BinaryIo/Writer.h"
|
|
#include "../Configuration/Configuration.h"
|
|
#include "../Utilities/Crc32.h"
|
|
|
|
#include "Keys.h"
|
|
|
|
#include "Export.h"
|
|
|
|
namespace mbst { namespace ImportExport {
|
|
|
|
static Containers::String last_export_error;
|
|
|
|
Containers::StringView
|
|
lastExportError() {
|
|
return last_export_error;
|
|
}
|
|
|
|
bool
|
|
exportStyle(Containers::StringView mass_name, mbst::GameObjects::CustomStyle& style) {
|
|
Containers::String style_type_str;
|
|
switch(style.type) {
|
|
case GameObjects::CustomStyle::Type::Unknown:
|
|
style_type_str = "Style";
|
|
break;
|
|
case GameObjects::CustomStyle::Type::Frame:
|
|
style_type_str = "FrameStyle";
|
|
break;
|
|
case GameObjects::CustomStyle::Type::Armour:
|
|
style_type_str = "ArmourStyle";
|
|
break;
|
|
case GameObjects::CustomStyle::Type::Weapon:
|
|
style_type_str = "WeaponStyle";
|
|
break;
|
|
case GameObjects::CustomStyle::Type::Global:
|
|
style_type_str = "GlobalStyle";
|
|
break;
|
|
}
|
|
|
|
auto filename = Utility::format("{}_{}_{}.style.mbst", mass_name, style_type_str, style.name);
|
|
for(auto& c : filename) {
|
|
if(c == ' ') {
|
|
c = '_';
|
|
}
|
|
}
|
|
|
|
auto path = Utility::Path::join(conf().directories().styles, filename);
|
|
BinaryIo::Writer writer{path};
|
|
|
|
if(!writer.open()) {
|
|
last_export_error = path + " couldn't be opened.";
|
|
return false;
|
|
}
|
|
|
|
if(!writer.writeString("MBSTSTYLE")) {
|
|
LOG_ERROR(last_export_error = "Couldn't write magic bytes into " + filename);
|
|
return false;
|
|
}
|
|
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::Name);
|
|
writer.writeUEStringToArray(style.name);
|
|
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::Colour);
|
|
writer.writeValueToArray<Color4>(style.colour);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::Metallic);
|
|
writer.writeValueToArray<float>(style.metallic);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::Gloss);
|
|
writer.writeValueToArray<float>(style.gloss);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::Glow);
|
|
writer.writeValueToArray<bool>(style.glow);
|
|
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::PatternId);
|
|
writer.writeValueToArray<std::int32_t>(style.patternId);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::PatternOpacity);
|
|
writer.writeValueToArray<float>(style.opacity);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::PatternOffset);
|
|
writer.writeValueToArray<Vector2>(style.offset);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::PatternRotation);
|
|
writer.writeValueToArray<float>(style.rotation);
|
|
writer.writeValueToArray<Keys::CustomStyle>(Keys::CustomStyle::PatternScale);
|
|
writer.writeValueToArray<float>(style.scale);
|
|
|
|
if(!writer.writeUint64(writer.array().size())) {
|
|
LOG_ERROR(last_export_error = "Couldn't write data size into " + filename);
|
|
writer.closeFile();
|
|
Utility::Path::remove(path);
|
|
return false;
|
|
}
|
|
|
|
auto crc = Utilities::crc32(0, writer.array());
|
|
if(!writer.writeUint32(crc)) {
|
|
LOG_ERROR(last_export_error = "Couldn't write CRC32 checksum into " + filename);
|
|
writer.closeFile();
|
|
Utility::Path::remove(path);
|
|
return false;
|
|
}
|
|
|
|
if(!writer.flushToFile()) {
|
|
LOG_ERROR(last_export_error = "Couldn't write data into " + filename);
|
|
writer.closeFile();
|
|
Utility::Path::remove(path);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}}
|