#pragma once // MassBuilderSaveTool // Copyright (C) 2021 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 . #include #include #include #include #include #include #include #include #include "../UESaveFile/UESaveFile.h" using namespace Corrade; using namespace Magnum; struct Joints { Float neck = 0.0f; Float body = 0.0f; Float shoulders = 0.0f; Float hips = 0.0f; Float upperArms = 0.0f; Float lowerArms = 0.0f; Float upperLegs = 0.0f; Float lowerLegs = 0.0f; }; struct CustomStyle { std::string name; Color4 colour{0.0f}; Float metallic = 0.0f; Float gloss = 0.0f; bool glow = false; Int patternId = 0; Float opacity = 0.5f; Vector2 offset{0.0f}; Float rotation = 0.0f; Float scale = 1.0f; }; struct Decal { Int id = -1; Color4 colour{0.0f}; Vector3 position{0.0f}; Vector3 uAxis{0.0f}; Vector3 vAxis{0.0f}; Vector2 offset{0.5f}; Float scale = 0.5f; Float rotation = 0.0f; bool flip = false; bool wrap = false; }; struct Accessory { Int attachIndex = -1; Int id = -1; Containers::StaticArray<2, Int> styles{ValueInit}; Vector3 relativePosition{0.0f}; Vector3 relativePositionOffset{0.0f}; Vector3 relativeRotation{0.0f}; Vector3 relativeRotationOffset{0.0f}; Vector3 localScale{1.0f}; }; struct ArmourPart { std::string slot; Int id = 0; Containers::StaticArray<4, Int> styles{ValueInit}; Containers::StaticArray<8, Decal> decals{ValueInit}; Containers::StaticArray<8, Accessory> accessories{ValueInit}; }; struct WeaponPart { Int id = 0; Containers::StaticArray<4, Int> styles{ValueInit}; Containers::StaticArray<8, Decal> decals{ValueInit}; Containers::StaticArray<8, Accessory> accessories{ValueInit}; }; struct Weapon { std::string name; std::string type; Containers::Array parts; Containers::StaticArray<16, CustomStyle> customStyles{ValueInit}; bool attached = false; std::string damageType; bool dualWield = false; std::string effectColourMode; Color4 effectColour{0.0f}; }; class Mass { public: enum class State : UnsignedByte { Empty, Invalid, Valid }; explicit Mass(const std::string& path); Mass(const Mass&) = delete; Mass& operator=(const Mass&) = delete; Mass(Mass&&) = default; Mass& operator=(Mass&&) = default; static auto lastError() -> std::string const&; static auto getNameFromFile(const std::string& path) -> Containers::Optional; void refreshValues(); auto filename() -> std::string const&; auto name() -> Containers::Optional const&; auto setName(std::string new_name) -> bool; auto state() -> State; auto dirty() const -> bool; void setDirty(bool dirty = true); auto jointSliders() const -> Joints const&; auto setSliders(Joints joints) -> bool; auto frameStyles() -> Containers::StaticArrayView<4, Int>; auto setFrameStyle(Int index, Int style_id) -> bool; auto eyeFlareColour() const -> Color4 const&; auto setEyeFlareColour(Color4 new_colour) -> bool; auto frameCustomStyles() -> Containers::StaticArrayView<16, CustomStyle>; auto setFrameCustomStyle(CustomStyle style, UnsignedLong index) -> bool; auto armourCustomStyles() -> Containers::StaticArrayView<16, CustomStyle>; auto setArmourCustomStyle(CustomStyle style, UnsignedLong index) -> bool; auto globalStyles() -> Containers::StaticArrayView<16, CustomStyle>; auto setGlobalStyle(CustomStyle style, UnsignedLong index) -> bool; auto updateSteamId(const std::string& steam_id) -> bool; private: auto setCustomStyle(const CustomStyle& style, UnsignedLong index, const char* prop_name) -> bool; Containers::Optional _mass; static std::string _lastError; std::string _folder; std::string _filename; State _state = State::Empty; bool _dirty = false; Containers::Optional _name = Containers::NullOpt; struct { Joints joints{}; Containers::StaticArray<4, Int> styles{ValueInit}; Color4 eyeFlare{0.0f}; Containers::StaticArray<16, CustomStyle> customStyles; } _frame; struct { Containers::StaticArray<38, ArmourPart> parts; Containers::StaticArray<16, CustomStyle> customStyles; } _armour; struct { Containers::StaticArray<8, Weapon> meleeWeapons; Containers::StaticArray<1, Weapon> shields; Containers::StaticArray<4, Weapon> bulletShooters; Containers::StaticArray<4, Weapon> energyShooters; Containers::StaticArray<4, Weapon> bulletLaunchers; Containers::StaticArray<4, Weapon> energyLaunchers; } _weapons; Containers::StaticArray<16, CustomStyle> _globalStyles; struct { Int engineId; Containers::StaticArray<7, Int> gearIds; Int osId; Containers::StaticArray<7, Int> moduleIds; Int archId; Containers::StaticArray<7, Int> techIds; } _tuning; std::string _steamId; };