#pragma once // MassBuilderSaveTool // Copyright (C) 2021-2022 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 #include "Joints.h" #include "BulletLauncherAttachment.h" #include "CustomStyle.h" #include "Decal.h" #include "Accessory.h" #include "ArmourPart.h" #include "WeaponPart.h" #include "Weapon.h" #include "../UESaveFile/UESaveFile.h" using namespace Corrade; using namespace Magnum; struct ArrayProperty; class Mass { public: explicit Mass(Containers::StringView path); Mass(const Mass&) = delete; Mass& operator=(const Mass&) = delete; Mass(Mass&&) = default; Mass& operator=(Mass&&) = default; Containers::StringView lastError(); static Containers::Optional getNameFromFile(Containers::StringView path); void refreshValues(); Containers::StringView filename(); Containers::StringView name(); bool setName(Containers::StringView new_name); enum class State : UnsignedByte { Empty, Invalid, Valid }; State state(); bool dirty() const; void setDirty(bool dirty = true); Joints& jointSliders(); void getJointSliders(); bool writeJointSliders(); Containers::ArrayView frameStyles(); void getFrameStyles(); bool writeFrameStyles(); Color4& eyeFlareColour(); void getEyeFlareColour(); bool writeEyeFlareColour(); Containers::ArrayView frameCustomStyles(); void getFrameCustomStyles(); bool writeFrameCustomStyle(UnsignedLong index); Containers::ArrayView armourParts(); void getArmourParts(); bool writeArmourPart(ArmourSlot slot); BulletLauncherAttachmentStyle& bulletLauncherAttachmentStyle(); Containers::ArrayView bulletLauncherAttachments(); void getBulletLauncherAttachments(); bool writeBulletLauncherAttachments(); Containers::ArrayView armourCustomStyles(); void getArmourCustomStyles(); bool writeArmourCustomStyle(UnsignedLong index); Containers::ArrayView meleeWeapons(); void getMeleeWeapons(); bool writeMeleeWeapons(); Containers::ArrayView shields(); void getShields(); bool writeShields(); Containers::ArrayView bulletShooters(); void getBulletShooters(); bool writeBulletShooters(); Containers::ArrayView energyShooters(); void getEnergyShooters(); bool writeEnergyShooters(); Containers::ArrayView bulletLaunchers(); void getBulletLaunchers(); bool writeBulletLaunchers(); Containers::ArrayView energyLaunchers(); void getEnergyLaunchers(); bool writeEnergyLaunchers(); Containers::ArrayView globalStyles(); void getGlobalStyles(); bool writeGlobalStyle(UnsignedLong index); void getTuning(); Int& engine(); Containers::ArrayView gears(); Int& os(); Containers::ArrayView modules(); Int& architecture(); Containers::ArrayView techs(); Containers::StringView account(); bool updateAccount(Containers::StringView new_account); private: void getCustomStyles(Containers::ArrayView styles, ArrayProperty* style_array); bool writeCustomStyle(const CustomStyle& style, UnsignedLong index, ArrayProperty* style_array); void getDecals(Containers::ArrayView decals, ArrayProperty* decal_array); void writeDecals(Containers::ArrayView decals, ArrayProperty* decal_array); void getAccessories(Containers::ArrayView accessories, ArrayProperty* accessory_array); void writeAccessories(Containers::ArrayView accessories, ArrayProperty* accs_array); void getWeaponType(Containers::StringView prop_name, Containers::ArrayView weapon_array); bool writeWeaponType(Containers::StringView prop_name, Containers::ArrayView weapon_array); void getTuningCategory(Containers::StringView big_node_prop_name, Int& big_node_id, Containers::StringView small_nodes_prop_name, Containers::ArrayView small_nodes_ids); Containers::Optional _mass; Containers::String _lastError; Containers::String _folder; Containers::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; BulletLauncherAttachmentStyle blAttachmentStyle = BulletLauncherAttachmentStyle::NotFound; Containers::StaticArray<4, BulletLauncherAttachment> blAttachment; } _armour; struct { Containers::StaticArray<8, Weapon> melee; 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::Array _globalStyles; struct { Int engineId; Containers::StaticArray<7, Int> gearIds; Int osId; Containers::StaticArray<7, Int> moduleIds; Int archId; Containers::StaticArray<7, Int> techIds; } _tuning; Containers::String _account; };