#pragma once // 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 . #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 "../Gvas/File.h" #include "../Gvas/Types/Types.h" using namespace Corrade; using namespace Magnum; namespace mbst { namespace GameObjects { class Mass { public: explicit Mass(Containers::StringView path); Mass(const Mass&) = delete; Mass& operator=(const Mass&) = delete; Mass(Mass&&) = default; Mass& operator=(Mass&&) = default; auto lastError() -> Containers::StringView; static auto getNameFromFile(Containers::StringView path) -> Containers::Optional; void refreshValues(); auto filename() -> Containers::StringView; auto name() -> Containers::StringView; bool setName(Containers::StringView new_name); enum class State: std::uint8_t { Empty, Invalid, Valid }; auto state() -> State; bool dirty() const; void setDirty(bool dirty = true); auto jointSliders() -> Joints&; void getJointSliders(); bool writeJointSliders(); auto frameStyles() -> Containers::ArrayView; void getFrameStyles(); bool writeFrameStyles(); auto eyeFlareColour() -> Color4&; void getEyeFlareColour(); bool writeEyeFlareColour(); auto frameCustomStyles() -> Containers::ArrayView; void getFrameCustomStyles(); bool writeFrameCustomStyle(std::size_t index); auto armourParts() -> Containers::ArrayView; void getArmourParts(); bool writeArmourPart(ArmourPart::Slot slot); auto bulletLauncherAttachmentStyle() -> BulletLauncherAttachmentStyle&; auto bulletLauncherAttachments() -> Containers::ArrayView; void getBulletLauncherAttachments(); bool writeBulletLauncherAttachments(); auto armourCustomStyles() -> Containers::ArrayView; void getArmourCustomStyles(); bool writeArmourCustomStyle(std::size_t index); auto meleeWeapons() -> Containers::ArrayView; void getMeleeWeapons(); bool writeMeleeWeapons(); auto shields() -> Containers::ArrayView; void getShields(); bool writeShields(); auto bulletShooters() -> Containers::ArrayView; void getBulletShooters(); bool writeBulletShooters(); auto energyShooters() -> Containers::ArrayView; void getEnergyShooters(); bool writeEnergyShooters(); auto bulletLaunchers() -> Containers::ArrayView; void getBulletLaunchers(); bool writeBulletLaunchers(); auto energyLaunchers() -> Containers::ArrayView; void getEnergyLaunchers(); bool writeEnergyLaunchers(); auto globalStyles() -> Containers::ArrayView; void getGlobalStyles(); bool writeGlobalStyle(std::size_t index); void getTuning(); auto engine() -> std::int32_t&; auto gears() -> Containers::ArrayView; auto os() -> std::int32_t&; auto modules() -> Containers::ArrayView; auto architecture() -> std::int32_t&; auto techs() -> Containers::ArrayView; auto account() -> Containers::StringView; bool updateAccount(Containers::StringView new_account); private: void getCustomStyles(Containers::ArrayView styles, Gvas::Types::ArrayProperty* style_array); bool writeCustomStyle(const CustomStyle& style, std::size_t index, Gvas::Types::ArrayProperty* style_array); void getDecals(Containers::ArrayView decals, Gvas::Types::ArrayProperty* decal_array); void writeDecals(Containers::ArrayView decals, Gvas::Types::ArrayProperty* decal_array); void getAccessories(Containers::ArrayView accessories, Gvas::Types::ArrayProperty* accessory_array); void writeAccessories(Containers::ArrayView accessories, Gvas::Types::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, std::int32_t& 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, std::int32_t> 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 { std::int32_t engineId; Containers::StaticArray<7, std::int32_t> gearIds; std::int32_t osId; Containers::StaticArray<7, std::int32_t> moduleIds; std::int32_t archId; Containers::StaticArray<7, std::int32_t> techIds; } _tuning; Containers::String _account; }; }}