Compare commits

..

2 commits

Author SHA1 Message Date
940fe3feee SaveTool: implement weapon copying. 2022-01-30 14:04:22 +01:00
d74a7bc219 Mass: make Weapon copyable.
This is necessary to add weapon copying.
2022-01-30 14:02:30 +01:00
2 changed files with 89 additions and 43 deletions

View file

@ -101,6 +101,42 @@ struct WeaponPart {
}; };
struct Weapon { struct Weapon {
Weapon() = default;
Weapon(const Weapon& other) {
name = other.name;
type = other.type;
parts = Containers::Array<WeaponPart>{other.parts.size()};
for(UnsignedInt i = 0; i < parts.size(); i++) {
parts[i] = other.parts[i];
}
customStyles = other.customStyles;
attached = other.attached;
damageType = other.damageType;
dualWield = other.dualWield;
effectColourMode = other.effectColourMode;
effectColour = other.effectColour;
}
Weapon& operator=(const Weapon& other) {
name = other.name;
type = other.type;
parts = Containers::Array<WeaponPart>{other.parts.size()};
for(UnsignedInt i = 0; i < parts.size(); i++) {
parts[i] = other.parts[i];
}
customStyles = other.customStyles;
attached = other.attached;
damageType = other.damageType;
dualWield = other.dualWield;
effectColourMode = other.effectColourMode;
effectColour = other.effectColour;
return *this;
}
Weapon(Weapon&& other) = default;
Weapon& operator=(Weapon&& other) = default;
std::string name; std::string name;
std::string type; std::string type;
Containers::Array<WeaponPart> parts; Containers::Array<WeaponPart> parts;

View file

@ -635,49 +635,59 @@ void SaveTool::drawWeapons() {
int id = 0; int id = 0;
#define weapcat(header, array, dirty, payload_type, payload_tooltip) \ #define weapcat(header, array, dirty, payload_type, payload_tooltip) \
ImGui::TableNextRow(ImGuiTableRowFlags_Headers); \ ImGui::TableNextRow(ImGuiTableRowFlags_Headers); \
ImGui::TableNextColumn(); \ ImGui::TableNextColumn(); \
ImGui::TextUnformatted(header); \ ImGui::TextUnformatted(header); \
\ \
for(UnsignedInt i = 0; i < _currentMass->array().size(); i++) { \ for(UnsignedInt i = 0; i < _currentMass->array().size(); i++) { \
auto& weapon = _currentMass->array()[i]; \ auto& weapon = _currentMass->array()[i]; \
\ \
ImGui::TableNextRow(); \ ImGui::TableNextRow(); \
ImGui::TableNextColumn(); \ ImGui::TableNextColumn(); \
ImGui::PushID(id); \ ImGui::PushID(id); \
if(ImGui::Selectable(weapon.name.c_str(), current_weapon == &weapon)) { \ if(ImGui::Selectable(weapon.name.c_str(), current_weapon == &weapon)) { \
current_weapon = &weapon; \ current_weapon = &weapon; \
} \ } \
if(ImGui::BeginDragDropSource()) { \ if(ImGui::BeginDragDropSource()) { \
ImGui::SetDragDropPayload(payload_type, &i, sizeof(UnsignedInt)); \ ImGui::SetDragDropPayload(payload_type, &i, sizeof(UnsignedInt)); \
ImGui::Text(payload_tooltip " %i - %s", i + 1, weapon.name.c_str()); \ if(ImGui::GetIO().KeyCtrl) { \
ImGui::EndDragDropSource(); \ ImGui::Text(payload_tooltip " %i - %s (copy)", i + 1, weapon.name.c_str()); \
} \ } \
if(ImGui::BeginDragDropTarget()) { \ else { \
if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(payload_type)) { \ ImGui::Text(payload_tooltip " %i - %s", i + 1, weapon.name.c_str()); \
int index = *static_cast<int*>(payload->Data); \ } \
\ ImGui::EndDragDropSource(); \
if(current_weapon == &_currentMass->array()[index]) { \ } \
current_weapon = &_currentMass->array()[i]; \ if(ImGui::BeginDragDropTarget()) { \
} \ if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(payload_type)) { \
else if (current_weapon == &_currentMass->array()[i]) { \ int index = *static_cast<int*>(payload->Data); \
current_weapon = &_currentMass->array()[index]; \ \
} \ if(!ImGui::GetIO().KeyCtrl) { \
\ if(current_weapon == &_currentMass->array()[index]) { \
std::swap(_currentMass->array()[index], _currentMass->array()[i]); \ current_weapon = &_currentMass->array()[i]; \
(dirty) = true; \ } \
} \ else if (current_weapon == &_currentMass->array()[i]) { \
\ current_weapon = &_currentMass->array()[index]; \
ImGui::EndDragDropTarget(); \ } \
} \ \
\ std::swap(_currentMass->array()[index], _currentMass->array()[i]); \
ImGui::PopID(); \ } \
id++; \ else { \
\ _currentMass->array()[i] = _currentMass->array()[index]; \
if(weapon.attached == true) { \ } \
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, 0x1F008CFFu); \ (dirty) = true; \
} \ } \
\
ImGui::EndDragDropTarget(); \
} \
\
ImGui::PopID(); \
id++; \
\
if(weapon.attached == true) { \
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, 0x1F008CFFu); \
} \
} }
weapcat("Melee weapons", meleeWeapons, _meleeDirty, "MeleeWeapon", "Melee weapon") weapcat("Melee weapons", meleeWeapons, _meleeDirty, "MeleeWeapon", "Melee weapon")