diff --git a/src/Mass/Mass.cpp b/src/Mass/Mass.cpp index dad48cc..49abb7e 100644 --- a/src/Mass/Mass.cpp +++ b/src/Mass/Mass.cpp @@ -99,308 +99,57 @@ void Mass::refreshValues() { } auto unit_data = _mass->at("UnitData"); - if(!unit_data) { _state = State::Invalid; return; } - // region MassName - { - auto name_prop = unit_data->at("Name_45_A037C5D54E53456407BDF091344529BB"); + auto name_prop = unit_data->at("Name_45_A037C5D54E53456407BDF091344529BB"); - if(!name_prop) { - _name = Containers::NullOpt; - _state = State::Invalid; - return; - } - - _name = name_prop->value; + if(!name_prop) { + _name = Containers::NullOpt; + _state = State::Invalid; + return; } - // endregion - // region FrameData - { - auto frame_prop = unit_data->at("Frame_3_F92B0F6A44A15088AF7F41B9FF290653"); + _name = name_prop->value; - if(!frame_prop) { - _state = State::Invalid; - return; - } - - auto length = frame_prop->at("NeckLength_6_ED6AF79849C27CD1A9D523A09E2BFE58"); - _frame.joints.neck = (length ? length->value : 0.0f); - length = frame_prop->at("BodyLength_7_C16287754CBA96C93BAE36A5C154996A"); - _frame.joints.body = (length ? length->value : 0.0f); - length = frame_prop->at("ShoulderLength_8_220EDF304F1C1226F0D8D39117FB3883"); - _frame.joints.shoulders = (length ? length->value : 0.0f); - length = frame_prop->at("HipLength_14_02AEEEAC4376087B9C51F0AA7CC92818"); - _frame.joints.hips = (length ? length->value : 0.0f); - length = frame_prop->at("ArmUpperLength_10_249FDA3E4F3B399E7B9E5C9B7C765EAE"); - _frame.joints.upperArms = (length ? length->value : 0.0f); - length = frame_prop->at("ArmLowerLength_12_ACD0F02745C28882619376926292FB36"); - _frame.joints.lowerArms = (length ? length->value : 0.0f); - length = frame_prop->at("LegUpperLength_16_A7C4C71249A3776F7A543D96819C0C61"); - _frame.joints.upperLegs = (length ? length->value : 0.0f); - length = frame_prop->at("LegLowerLength_18_D2DF39964EA0F2A2129D0491B08A032F"); - _frame.joints.lowerLegs = (length ? length->value : 0.0f); - - auto frame_styles = frame_prop->at("Styles_32_00A3B3284B37F1E7819458844A20EB48"); - - if(!frame_styles) { - _state = State::Invalid; - return; - } - - if(frame_styles->items.size() != 4) { - _state = State::Invalid; - return; - } - - for(UnsignedInt i = 0; i < 4; i++) { - _frame.styles[i] = frame_styles->at(i)->value; - } - - auto eye_flare_prop = frame_prop->at("EyeFlareColor_36_AF79999C40FCA0E88A2F9A84488A38CA"); - if(!eye_flare_prop) { - _state = State::Invalid; - return; - } - - _frame.eyeFlare = Color4{eye_flare_prop->r, eye_flare_prop->g, eye_flare_prop->b, eye_flare_prop->a}; + getJointSliders(); + if(_state == State::Invalid) { + return; } - // endregion - // region FrameStyles - { - auto frame_styles = unit_data->at("FrameStyle_44_04A44C9440363CCEC5443D98BFAF22AA"); - if(!frame_styles) { - _state = State::Invalid; - return; - } - - if(frame_styles->items.size() != 16) { - _state = State::Invalid; - return; - } - - for(UnsignedInt i = 0; i < frame_styles->items.size(); i++) { - auto style_prop = frame_styles->at(i); - - CustomStyle style; - - style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; - auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); - style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; - style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; - style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; - style.glow = colour_prop->a == 0.0f ? false : true; - - style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; - style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; - style.offset = Vector2{ - style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, - style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value - }; - style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; - style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; - - _frame.customStyles[i] = std::move(style); - } + getFrameStyles(); + if(_state == State::Invalid) { + return; } - // endregion - // region ArmourParts - { - auto armour_array = unit_data->at("Armor_10_12E266C44116DDAF57E99ABB575A4B3C"); - if(!armour_array) { - _state = State::Invalid; - return; - } - - if(armour_array->items.size() != 38) { - _state = State::Invalid; - return; - } - - for(UnsignedInt i = 0; i < armour_array->items.size(); i++) { - auto part_prop = armour_array->at(i); - - ArmourPart part; - - part.slot = part_prop->at("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue; - part.id = part_prop->at("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value; - - auto part_styles = part_prop->at("Styles_47_3E31870441DFD7DB8BEE5C85C26B365B"); - if(!part_styles) { - _state = State::Invalid; - return; - } - - if(part_styles->items.size() != 4) { - _state = State::Invalid; - return; - } - - for(UnsignedInt j = 0; j < part_styles->items.size(); j++) { - part.styles[j] = part_styles->at(j)->value; - } - - auto decals_array = part_prop->at("Decals_42_F358794A4F18497970F56BA9627D3603"); - if(!decals_array) { - _state = State::Invalid; - return; - } - - if(decals_array->items.size() != 8) { - _state = State::Invalid; - return; - } - - for(UnsignedInt j = 0; j < decals_array->items.size(); j++) { - auto decal_prop = decals_array->at(j); - - Decal decal; - - decal.id = decal_prop->at("ID_3_694C0B35404D8A3168AEC89026BC8CF9")->value; - auto colour_prop = decal_prop->at("Color_8_1B0B9D2B43DA6AAB9FA549B374D3E606"); - decal.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; - auto pos_prop = decal_prop->at("Position_41_022C8FE84E1AAFE587261E88F2C72250"); - decal.position = Vector3{pos_prop->x, pos_prop->y, pos_prop->z}; - auto u_prop = decal_prop->at("UAxis_37_EBEB715F45491AECACCC07A1AE4646D1"); - decal.uAxis = Vector3{u_prop->x, u_prop->y, u_prop->z}; - auto v_prop = decal_prop->at("VAxis_39_C31EB2664EE202CAECFBBB84100B5E35"); - decal.vAxis = Vector3{v_prop->x, v_prop->y, v_prop->z}; - auto offset_prop = decal_prop->at("Offset_29_B02BBBB74FC60F5EDBEBAB8020738020"); - decal.offset = Vector2{offset_prop->x, offset_prop->y}; - decal.scale = decal_prop->at("Scale_32_959D1C2747AFD8D62808468235CBBA40")->value; - decal.rotation = decal_prop->at("Rotation_27_12D7C314493D203D5C2326A03C5F910F")->value; - decal.flip = decal_prop->at("Flip_35_CECCFB184CCD9412BD93FE9A8B656BE1")->value; - decal.wrap = decal_prop->at("Wrap_43_A7C68CDF4A92AF2ECDA53F953EE7CA62")->value; - - part.decals[j] = decal; - } - - auto accs_array = part_prop->at("Accessories_52_D902DD4241FA0050C2529596255153F3"); - if(!accs_array) { - _state = State::Invalid; - return; - } - - if(accs_array->items.size() != 8) { - _state = State::Invalid; - return; - } - - for(UnsignedInt j = 0; j < accs_array->items.size(); j++) { - auto acc_prop = accs_array->at(j); - - Accessory accessory; - - accessory.attachIndex = acc_prop->at("AttachIndex_2_4AFCF6024E4BA7426C6B9F80B8179D20")->value; - accessory.id = acc_prop->at("ID_4_5757B32647BAE263266259B8A7DFFFC1")->value; - auto acc_styles = acc_prop->at("Styles_7_91DEB0F24E24D13FC9472882C11D0DFD"); - for(UnsignedInt k = 0; k < acc_styles->items.size(); k++) { - accessory.styles[k] = acc_styles->at(k)->value; - } - auto rel_pos_prop = acc_prop->at("RelativePosition_14_BE8FB2A94074F34B3EDA6683B227D3A1"); - accessory.relativePosition = Vector3{rel_pos_prop->x, rel_pos_prop->y, rel_pos_prop->z}; - auto rel_pos_offset_prop = acc_prop->at("RelativePositionOffset_15_98FD0CE74E44BBAFC2D46FB4CA4E0ED6"); - accessory.relativePositionOffset = Vector3{rel_pos_offset_prop->x, rel_pos_offset_prop->y, rel_pos_offset_prop->z}; - auto rel_rot_prop = acc_prop->at("RelativeRotation_20_C78C73274E6E78E7878F8C98ECA342C0"); - accessory.relativeRotation = Vector3{rel_rot_prop->x, rel_rot_prop->y, rel_rot_prop->z}; - auto rel_rot_offset_prop = acc_prop->at("RelativeRotationOffset_21_E07FA0EC46728B7BA763C6861249ABAA"); - accessory.relativeRotationOffset = Vector3{rel_rot_offset_prop->x, rel_rot_offset_prop->y, rel_rot_offset_prop->z}; - auto local_scale_prop = acc_prop->at("LocalScale_24_DC2D93A742A41A46E7E61D988F15ED53"); - accessory.localScale = Vector3{local_scale_prop->x, local_scale_prop->y, local_scale_prop->z}; - - part.accessories[j] = std::move(accessory); - } - - _armour.parts[i] = std::move(part); - } + getEyeFlareColour(); + if(_state == State::Invalid) { + return; } - // endregion - // region ArmourStyles - { - auto armour_styles = unit_data->at("ArmorStyle_42_E2F6AC3647788CB366BD469B3B7E899E"); - if(!armour_styles) { - _state = State::Invalid; - return; - } - - if(armour_styles->items.size() != 16) { - _state = State::Invalid; - return; - } - - for(UnsignedInt i = 0; i < armour_styles->items.size(); i++) { - auto style_prop = armour_styles->at(i); - - CustomStyle style; - - style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; - auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); - style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; - style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; - style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; - style.glow = colour_prop->a == 0.0f ? false : true; - - style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; - style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; - style.offset = Vector2{ - style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, - style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value - }; - style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; - style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; - - _armour.customStyles[i] = std::move(style); - } + getFrameCustomStyles(); + if(_state == State::Invalid) { + return; + } + + getArmourParts(); + if(_state == State::Invalid) { + return; + } + + getArmourCustomStyles(); + if(_state == State::Invalid) { + return; } - // endregion // TODO: weapons - // region GlobalStyles + if(!_demo) { - auto global_styles = unit_data->at("GlobalStyles_57_6A681C114035241F7BDAAE9B43A8BF1B"); - if(!global_styles) { - _state = State::Invalid; - return; - } - - if(global_styles->items.size() != 16) { - _state = State::Invalid; - return; - } - - for(UnsignedInt i = 0; i < global_styles->items.size(); i++) { - auto style_prop = global_styles->at(i); - - CustomStyle style; - - style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; - auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); - style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; - style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; - style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; - style.glow = colour_prop->a == 0.0f ? false : true; - - style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; - style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; - style.offset = Vector2{ - style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, - style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value - }; - style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; - style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; - - _globalStyles[i] = std::move(style); - } + getGlobalStyles(); } - // endregion // TODO: tuning @@ -449,6 +198,10 @@ auto Mass::state() -> State { return _state; } +auto Mass::demo() const -> bool { + return _demo; +} + auto Mass::dirty() const -> bool { return _dirty; } @@ -457,17 +210,47 @@ void Mass::setDirty(bool dirty) { _dirty = dirty; } -auto Mass::jointSliders() const -> Joints const& { +auto Mass::jointSliders() -> Joints& { return _frame.joints; } -auto Mass::setSliders(Joints joints) -> bool { - _frame.joints = joints; +void Mass::getJointSliders() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + auto frame_prop = unit_data->at("Frame_3_F92B0F6A44A15088AF7F41B9FF290653"); + if(!frame_prop) { + _state = State::Invalid; + return; + } + + auto length = frame_prop->at("NeckLength_6_ED6AF79849C27CD1A9D523A09E2BFE58"); + _frame.joints.neck = (length ? length->value : 0.0f); + length = frame_prop->at("BodyLength_7_C16287754CBA96C93BAE36A5C154996A"); + _frame.joints.body = (length ? length->value : 0.0f); + length = frame_prop->at("ShoulderLength_8_220EDF304F1C1226F0D8D39117FB3883"); + _frame.joints.shoulders = (length ? length->value : 0.0f); + length = frame_prop->at("HipLength_14_02AEEEAC4376087B9C51F0AA7CC92818"); + _frame.joints.hips = (length ? length->value : 0.0f); + length = frame_prop->at("ArmUpperLength_10_249FDA3E4F3B399E7B9E5C9B7C765EAE"); + _frame.joints.upperArms = (length ? length->value : 0.0f); + length = frame_prop->at("ArmLowerLength_12_ACD0F02745C28882619376926292FB36"); + _frame.joints.lowerArms = (length ? length->value : 0.0f); + length = frame_prop->at("LegUpperLength_16_A7C4C71249A3776F7A543D96819C0C61"); + _frame.joints.upperLegs = (length ? length->value : 0.0f); + length = frame_prop->at("LegLowerLength_18_D2DF39964EA0F2A2129D0491B08A032F"); + _frame.joints.lowerLegs = (length ? length->value : 0.0f); +} + +auto Mass::writeJointSliders() -> bool { auto unit_data = _mass->at("UnitData"); if(!unit_data) { _state = State::Invalid; + _lastError = "No unit data in " + _filename; return false; } @@ -475,6 +258,7 @@ auto Mass::setSliders(Joints joints) -> bool { if(!frame_prop) { _state = State::Invalid; + _lastError = "No frame data in " + _filename; return false; } @@ -566,46 +350,108 @@ auto Mass::setSliders(Joints joints) -> bool { length->value = _frame.joints.lowerLegs; } - return _mass->saveToFile(); + if(!_mass->saveToFile()) { + _lastError = "Couldn't write data to " + _filename; + return false; + } + + return true; } auto Mass::frameStyles() -> Containers::StaticArrayView<4, Int> { return _frame.styles; } -auto Mass::setFrameStyle(Int index, Int style_id) -> bool { - _frame.styles[index] = style_id; - +void Mass::getFrameStyles() { auto unit_data = _mass->at("UnitData"); if(!unit_data) { _state = State::Invalid; + return; + } + + auto frame_prop = unit_data->at("Frame_3_F92B0F6A44A15088AF7F41B9FF290653"); + if(!frame_prop) { + _state = State::Invalid; + return; + } + + auto frame_styles = frame_prop->at("Styles_32_00A3B3284B37F1E7819458844A20EB48"); + if(!frame_styles) { + _state = State::Invalid; + return; + } + + if(frame_styles->items.size() != 4) { + _state = State::Invalid; + return; + } + + for(UnsignedInt i = 0; i < 4; i++) { + _frame.styles[i] = frame_styles->at(i)->value; + } +} + +auto Mass::writeFrameStyles() -> bool { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + _lastError = "No unit data in " + _filename; return false; } auto frame = unit_data->at("Frame_3_F92B0F6A44A15088AF7F41B9FF290653"); if(!frame) { _state = State::Invalid; + _lastError = "No frame data in " + _filename; return false; } auto frame_styles = frame->at("Styles_32_00A3B3284B37F1E7819458844A20EB48"); if(!frame_styles) { _state = State::Invalid; + _lastError = "No frame styles in " + _filename; return false; } - frame_styles->at(index)->value = style_id; + for(UnsignedInt i = 0; i < frame_styles->items.size(); i++) { + frame_styles->at(i)->value = _frame.styles[i]; + } - return _mass->saveToFile(); + if(!_mass->saveToFile()) { + _lastError = "Couldn't write data to " + _filename; + return false; + } + + return true; } -auto Mass::eyeFlareColour() const -> const Color4& { +auto Mass::eyeFlareColour() -> Color4& { return _frame.eyeFlare; } -auto Mass::setEyeFlareColour(Color4 new_colour) -> bool { - _frame.eyeFlare = new_colour; +void Mass::getEyeFlareColour() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + auto frame_prop = unit_data->at("Frame_3_F92B0F6A44A15088AF7F41B9FF290653"); + if(!frame_prop) { + _state = State::Invalid; + return; + } + + auto eye_flare_prop = frame_prop->at("EyeFlareColor_36_AF79999C40FCA0E88A2F9A84488A38CA"); + if(!eye_flare_prop) { + _state = State::Invalid; + return; + } + + _frame.eyeFlare = Color4{eye_flare_prop->r, eye_flare_prop->g, eye_flare_prop->b, eye_flare_prop->a}; +} + +auto Mass::writeEyeFlareColour() -> bool { auto unit_data = _mass->at("UnitData"); if(!unit_data) { _state = State::Invalid; @@ -624,10 +470,10 @@ auto Mass::setEyeFlareColour(Color4 new_colour) -> bool { return false; } - eye_flare_prop->r = new_colour.r(); - eye_flare_prop->g = new_colour.g(); - eye_flare_prop->b = new_colour.b(); - eye_flare_prop->a = new_colour.a(); + eye_flare_prop->r = _frame.eyeFlare.r(); + eye_flare_prop->g = _frame.eyeFlare.g(); + eye_flare_prop->b = _frame.eyeFlare.b(); + eye_flare_prop->a = _frame.eyeFlare.a(); return _mass->saveToFile(); } @@ -636,13 +482,54 @@ auto Mass::frameCustomStyles() -> Containers::StaticArrayView<16, CustomStyle> { return _frame.customStyles; } -auto Mass::setFrameCustomStyle(CustomStyle style, UnsignedLong index) -> bool { +void Mass::getFrameCustomStyles() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + + auto frame_styles = unit_data->at("FrameStyle_44_04A44C9440363CCEC5443D98BFAF22AA"); + if(!frame_styles) { + _state = State::Invalid; + return; + } + + if(frame_styles->items.size() != 16) { + _state = State::Invalid; + return; + } + + for(UnsignedInt i = 0; i < frame_styles->items.size(); i++) { + auto style_prop = frame_styles->at(i); + + CustomStyle style; + + style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; + auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); + style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; + style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; + style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; + style.glow = colour_prop->a == 0.0f ? false : true; + + style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; + style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; + style.offset = Vector2{ + style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, + style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value + }; + style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; + style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; + + _frame.customStyles[i] = std::move(style); + } +} + +auto Mass::writeFrameCustomStyle(UnsignedLong index) -> bool { if(index > _frame.customStyles.size()) { return false; } - _frame.customStyles[index] = std::move(style); - return setCustomStyle(_frame.customStyles[index], index, "FrameStyle_44_04A44C9440363CCEC5443D98BFAF22AA"); } @@ -650,17 +537,175 @@ auto Mass::armourParts() -> Containers::StaticArrayView<38, ArmourPart> { return _armour.parts; } +void Mass::getArmourParts() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + + auto armour_array = unit_data->at("Armor_10_12E266C44116DDAF57E99ABB575A4B3C"); + if(!armour_array) { + _state = State::Invalid; + return; + } + + if(armour_array->items.size() != 38) { + _state = State::Invalid; + return; + } + + for(UnsignedInt i = 0; i < armour_array->items.size(); i++) { + auto part_prop = armour_array->at(i); + + ArmourPart part; + + part.slot = part_prop->at("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue; + part.id = part_prop->at("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value; + + auto part_styles = part_prop->at("Styles_47_3E31870441DFD7DB8BEE5C85C26B365B"); + if(!part_styles) { + _state = State::Invalid; + return; + } + + if(part_styles->items.size() != 4) { + _state = State::Invalid; + return; + } + + for(UnsignedInt j = 0; j < part_styles->items.size(); j++) { + part.styles[j] = part_styles->at(j)->value; + } + + auto decals_array = part_prop->at("Decals_42_F358794A4F18497970F56BA9627D3603"); + if(!decals_array) { + _state = State::Invalid; + return; + } + + if(decals_array->items.size() != 8) { + _state = State::Invalid; + return; + } + + for(UnsignedInt j = 0; j < decals_array->items.size(); j++) { + auto decal_prop = decals_array->at(j); + + Decal decal; + + decal.id = decal_prop->at("ID_3_694C0B35404D8A3168AEC89026BC8CF9")->value; + auto colour_prop = decal_prop->at("Color_8_1B0B9D2B43DA6AAB9FA549B374D3E606"); + decal.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; + auto pos_prop = decal_prop->at("Position_41_022C8FE84E1AAFE587261E88F2C72250"); + decal.position = Vector3{pos_prop->x, pos_prop->y, pos_prop->z}; + auto u_prop = decal_prop->at("UAxis_37_EBEB715F45491AECACCC07A1AE4646D1"); + decal.uAxis = Vector3{u_prop->x, u_prop->y, u_prop->z}; + auto v_prop = decal_prop->at("VAxis_39_C31EB2664EE202CAECFBBB84100B5E35"); + decal.vAxis = Vector3{v_prop->x, v_prop->y, v_prop->z}; + auto offset_prop = decal_prop->at("Offset_29_B02BBBB74FC60F5EDBEBAB8020738020"); + decal.offset = Vector2{offset_prop->x, offset_prop->y}; + decal.scale = decal_prop->at("Scale_32_959D1C2747AFD8D62808468235CBBA40")->value; + decal.rotation = decal_prop->at("Rotation_27_12D7C314493D203D5C2326A03C5F910F")->value; + decal.flip = decal_prop->at("Flip_35_CECCFB184CCD9412BD93FE9A8B656BE1")->value; + decal.wrap = decal_prop->at("Wrap_43_A7C68CDF4A92AF2ECDA53F953EE7CA62")->value; + + part.decals[j] = decal; + } + + if(!_demo) { + auto accs_array = part_prop->at("Accessories_52_D902DD4241FA0050C2529596255153F3"); + if(!accs_array) { + _demo = true; + } + + if(accs_array->items.size() != 8) { + _state = State::Invalid; + return; + } + + for(UnsignedInt j = 0; j < accs_array->items.size(); j++) { + auto acc_prop = accs_array->at(j); + + Accessory accessory; + + accessory.attachIndex = acc_prop->at("AttachIndex_2_4AFCF6024E4BA7426C6B9F80B8179D20")->value; + accessory.id = acc_prop->at("ID_4_5757B32647BAE263266259B8A7DFFFC1")->value; + auto acc_styles = acc_prop->at("Styles_7_91DEB0F24E24D13FC9472882C11D0DFD"); + for(UnsignedInt k = 0; k < acc_styles->items.size(); k++) { + accessory.styles[k] = acc_styles->at(k)->value; + } + auto rel_pos_prop = acc_prop->at("RelativePosition_14_BE8FB2A94074F34B3EDA6683B227D3A1"); + accessory.relativePosition = Vector3{rel_pos_prop->x, rel_pos_prop->y, rel_pos_prop->z}; + auto rel_pos_offset_prop = acc_prop->at("RelativePositionOffset_15_98FD0CE74E44BBAFC2D46FB4CA4E0ED6"); + accessory.relativePositionOffset = Vector3{rel_pos_offset_prop->x, rel_pos_offset_prop->y, rel_pos_offset_prop->z}; + auto rel_rot_prop = acc_prop->at("RelativeRotation_20_C78C73274E6E78E7878F8C98ECA342C0"); + accessory.relativeRotation = Vector3{rel_rot_prop->x, rel_rot_prop->y, rel_rot_prop->z}; + auto rel_rot_offset_prop = acc_prop->at("RelativeRotationOffset_21_E07FA0EC46728B7BA763C6861249ABAA"); + accessory.relativeRotationOffset = Vector3{rel_rot_offset_prop->x, rel_rot_offset_prop->y, rel_rot_offset_prop->z}; + auto local_scale_prop = acc_prop->at("LocalScale_24_DC2D93A742A41A46E7E61D988F15ED53"); + accessory.localScale = Vector3{local_scale_prop->x, local_scale_prop->y, local_scale_prop->z}; + + part.accessories[j] = std::move(accessory); + } + } + + _armour.parts[i] = std::move(part); + } +} + auto Mass::armourCustomStyles() -> Containers::StaticArrayView<16, CustomStyle> { return _armour.customStyles; } -auto Mass::setArmourCustomStyle(CustomStyle style, UnsignedLong index) -> bool { +void Mass::getArmourCustomStyles() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + + auto armour_styles = unit_data->at("ArmorStyle_42_E2F6AC3647788CB366BD469B3B7E899E"); + if(!armour_styles) { + _state = State::Invalid; + return; + } + + if(armour_styles->items.size() != 16) { + _state = State::Invalid; + return; + } + + for(UnsignedInt i = 0; i < armour_styles->items.size(); i++) { + auto style_prop = armour_styles->at(i); + + CustomStyle style; + + style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; + auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); + style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; + style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; + style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; + style.glow = colour_prop->a == 0.0f ? false : true; + + style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; + style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; + style.offset = Vector2{ + style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, + style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value + }; + style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; + style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; + + _armour.customStyles[i] = std::move(style); + } +} + +auto Mass::writeArmourCustomStyle(UnsignedLong index) -> bool { if(index > _armour.customStyles.size()) { return false; } - _armour.customStyles[index] = std::move(style); - return setCustomStyle(_armour.customStyles[index], index, "ArmorStyle_42_E2F6AC3647788CB366BD469B3B7E899E"); } @@ -668,13 +713,54 @@ auto Mass::globalStyles() -> Containers::StaticArrayView<16, CustomStyle> { return _globalStyles; } -auto Mass::setGlobalStyle(CustomStyle style, UnsignedLong index) -> bool { +void Mass::getGlobalStyles() { + auto unit_data = _mass->at("UnitData"); + if(!unit_data) { + _state = State::Invalid; + return; + } + + auto global_styles = unit_data->at("GlobalStyles_57_6A681C114035241F7BDAAE9B43A8BF1B"); + if(!global_styles) { + _state = State::Invalid; + return; + } + + if(global_styles->items.size() != 16) { + _state = State::Invalid; + return; + } + + for(UnsignedInt i = 0; i < global_styles->items.size(); i++) { + auto style_prop = global_styles->at(i); + + CustomStyle style; + + style.name = style_prop->at("Name_27_1532115A46EF2B2FA283908DF561A86B")->value; + auto colour_prop = style_prop->at("Color_5_F0D383DF40474C9464AE48A0984A212E"); + style.colour = Color4{colour_prop->r, colour_prop->g, colour_prop->b, colour_prop->a}; + style.metallic = style_prop->at("Metallic_10_0A4CD1E4482CBF41CA61D0A856DE90B9")->value; + style.gloss = style_prop->at("Gloss_11_9769599842CC275A401C4282A236E240")->value; + style.glow = colour_prop->a == 0.0f ? false : true; + + style.patternId = style_prop->at("PatternID_14_516DB85641DAF8ECFD2920BE2BDF1311")->value; + style.opacity = style_prop->at("Opacity_30_53BD060B4DFCA1C92302D6A0F7831131")->value; + style.offset = Vector2{ + style_prop->at("OffsetX_23_70FC2E814C64BBB82452748D2AF9CD48")->value, + style_prop->at("OffsetY_24_5E1F866C4C054D9B2EE337ADC180C17F")->value + }; + style.rotation = style_prop->at("Rotation_25_EC2DFAD84AD0A6BD3FA841ACD52EDD6D")->value; + style.scale = style_prop->at("Scale_26_19DF0708409262183E1247B317137671")->value; + + _globalStyles[i] = std::move(style); + } +} + +auto Mass::writeGlobalStyle(UnsignedLong index) -> bool { if(index > _globalStyles.size()) { return false; } - _globalStyles[index] = std::move(style); - return setCustomStyle(_globalStyles[index], index, "GlobalStyles_57_6A681C114035241F7BDAAE9B43A8BF1B"); } diff --git a/src/Mass/Mass.h b/src/Mass/Mass.h index 89e2ed0..b49029e 100644 --- a/src/Mass/Mass.h +++ b/src/Mass/Mass.h @@ -135,29 +135,38 @@ class Mass { auto state() -> State; + auto demo() const -> bool; + auto dirty() const -> bool; void setDirty(bool dirty = true); - auto jointSliders() const -> Joints const&; - auto setSliders(Joints joints) -> bool; + auto jointSliders() -> Joints&; + void getJointSliders(); + auto writeJointSliders() -> bool; auto frameStyles() -> Containers::StaticArrayView<4, Int>; - auto setFrameStyle(Int index, Int style_id) -> bool; + void getFrameStyles(); + auto writeFrameStyles() -> bool; - auto eyeFlareColour() const -> Color4 const&; - auto setEyeFlareColour(Color4 new_colour) -> bool; + auto eyeFlareColour() -> Color4&; + void getEyeFlareColour(); + auto writeEyeFlareColour() -> bool; auto frameCustomStyles() -> Containers::StaticArrayView<16, CustomStyle>; - auto setFrameCustomStyle(CustomStyle style, UnsignedLong index) -> bool; + void getFrameCustomStyles(); + auto writeFrameCustomStyle(UnsignedLong index) -> bool; auto armourParts() -> Containers::StaticArrayView<38, ArmourPart>; - auto setArmourPart(ArmourPart& part, UnsignedLong index) -> bool; + void getArmourParts(); + auto setArmourPart(UnsignedLong index) -> bool; auto armourCustomStyles() -> Containers::StaticArrayView<16, CustomStyle>; - auto setArmourCustomStyle(CustomStyle style, UnsignedLong index) -> bool; + void getArmourCustomStyles(); + auto writeArmourCustomStyle(UnsignedLong index) -> bool; auto globalStyles() -> Containers::StaticArrayView<16, CustomStyle>; - auto setGlobalStyle(CustomStyle style, UnsignedLong index) -> bool; + void getGlobalStyles(); + auto writeGlobalStyle(UnsignedLong index) -> bool; auto updateSteamId(const std::string& steam_id) -> bool; @@ -171,6 +180,7 @@ class Mass { std::string _folder; std::string _filename; State _state = State::Empty; + bool _demo = false; bool _dirty = false;