diff --git a/src/Mass/Mass_Armour.cpp b/src/Mass/Mass_Armour.cpp index 29b6472..f7b4ad2 100644 --- a/src/Mass/Mass_Armour.cpp +++ b/src/Mass/Mass_Armour.cpp @@ -237,7 +237,95 @@ void Mass::getBulletLauncherAttachments() { } auto Mass::writeBulletLauncherAttachments() -> bool { - return false; + auto unit_data = _mass->at("UnitData"_s); + if(!unit_data) { + _state = State::Invalid; + _lastError = "No unit data in " + _filename; + return false; + } + + auto attach_style_prop = unit_data->at("WeaponBLAttachmentStyle_65_5943FCE8406F18D2C3F69285EB23A699"_s); + auto attach_array = unit_data->at("WeaponBLAttachment_61_442D08F547510A4CEE1501BBAF297BA0"_s); + + if(!attach_style_prop && !attach_array) { + _armour.blAttachmentStyle = BulletLauncherAttachmentStyle::NotFound; + _lastError = "No attachment properties to write to in " + _filename; + return false; + } + + if(attach_style_prop && !attach_array) { + _armour.blAttachmentStyle = BulletLauncherAttachmentStyle::NotFound; + _state = State::Invalid; + _lastError = "Couldn't find the attachments in " + _filename; + return false; + } + + if(attach_array->items.size() == _weapons.bulletLaunchers.size() && + attach_array->items.size() == _armour.blAttachment.size()) + { + for(UnsignedInt i = 0; i < attach_array->items.size(); i++) { + auto attachment_prop = attach_array->at(i); + auto& attachment = _armour.blAttachment[i]; + + auto& socket = attachment_prop->at("Socket_9_B9DBF30D4A1F0032A2BE2F8B342B35A9"_s)->value; + switch(attachment.socket) { + #define c(enumerator, strenum, name) case BulletLauncherSocket::enumerator: socket = strenum; break; + #include "../Maps/BulletLauncherSockets.hpp" + #undef c + default: + _lastError = "Invalid socket type."_s; + return false; + } + + auto rel_loc_prop = attachment_prop->at("RelativeLocation_10_2F6E75DF4C40622658340E9A22D38B02"_s); + rel_loc_prop->x = attachment.relativeLocation.x(); + rel_loc_prop->y = attachment.relativeLocation.y(); + rel_loc_prop->z = attachment.relativeLocation.z(); + auto off_loc_prop = attachment_prop->at("OffsetLocation_11_F42B3DA3436948FF85752DB33722382F"_s); + off_loc_prop->x = attachment.offsetLocation.x(); + off_loc_prop->y = attachment.offsetLocation.y(); + off_loc_prop->z = attachment.offsetLocation.z(); + auto rel_rot_prop = attachment_prop->at("RelativeRotation_12_578140464621245132CFF2A2AD85E735"_s); + rel_rot_prop->x = attachment.relativeRotation.x(); + rel_rot_prop->y = attachment.relativeRotation.y(); + rel_rot_prop->z = attachment.relativeRotation.z(); + auto off_rot_prop = attachment_prop->at("OffsetRotation_13_B5980BCD47905D842D1490A1A520B064"_s); + off_rot_prop->x = attachment.offsetRotation.x(); + off_rot_prop->y = attachment.offsetRotation.y(); + off_rot_prop->z = attachment.offsetRotation.z(); + auto rel_scale_prop = attachment_prop->at("RelativeScale_16_37BC80EF42699F79533F7AA7B3094E38"_s); + rel_scale_prop->x = attachment.relativeScale.x(); + rel_scale_prop->y = attachment.relativeScale.y(); + rel_scale_prop->z = attachment.relativeScale.z(); + } + } + + if(!attach_style_prop) { + attach_style_prop = new ByteProperty; + attach_style_prop->name.emplace("WeaponBLAttachmentStyle_65_5943FCE8406F18D2C3F69285EB23A699"_s); + attach_style_prop->enumType = "enuBLAttachmentStyle"_s; + ByteProperty::ptr prop{attach_style_prop}; + arrayAppend(unit_data->properties, std::move(prop)); + } + + auto& attach_style = attach_style_prop->enumValue; + switch(_armour.blAttachmentStyle) { + #define c(enumerator, strenum) case BulletLauncherAttachmentStyle::enumerator: \ + attach_style = strenum; \ + break; + #include "../Maps/BulletLauncherAttachmentStyles.hpp" + #undef c + default: + _lastError = "Unknown BL attachment style."; + return false; + } + + if(!_mass->saveToFile()) { + _lastError = _mass->lastError(); + return false; + } + + return true; } auto Mass::armourCustomStyles() -> Containers::ArrayView {