Build viewer/editor #13
6 changed files with 128 additions and 71 deletions
|
@ -136,7 +136,7 @@ add_executable(MassBuilderSaveTool WIN32
|
||||||
Mass/WeaponPart.h
|
Mass/WeaponPart.h
|
||||||
Maps/Accessories.h
|
Maps/Accessories.h
|
||||||
Maps/ArmourSets.h
|
Maps/ArmourSets.h
|
||||||
Maps/ArmourSlots.h
|
Maps/ArmourSlots.hpp
|
||||||
Maps/DamageTypes.hpp
|
Maps/DamageTypes.hpp
|
||||||
Maps/LastMissionId.h
|
Maps/LastMissionId.h
|
||||||
Maps/StoryProgress.h
|
Maps/StoryProgress.h
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
#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 <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
static const std::unordered_map<std::string, const char*> armour_slots {
|
|
||||||
{"enuArmorSlots::NewEnumerator0", "Face"},
|
|
||||||
{"enuArmorSlots::NewEnumerator1", "Upper head"},
|
|
||||||
{"enuArmorSlots::NewEnumerator2", "Lower head"},
|
|
||||||
{"enuArmorSlots::NewEnumerator3", "Neck"},
|
|
||||||
{"enuArmorSlots::NewEnumerator4", "Upper body"},
|
|
||||||
{"enuArmorSlots::NewEnumerator5", "Middle body"},
|
|
||||||
{"enuArmorSlots::NewEnumerator23", "Backpack"},
|
|
||||||
{"enuArmorSlots::NewEnumerator6", "Lower body"},
|
|
||||||
{"enuArmorSlots::NewEnumerator7", "Front waist"},
|
|
||||||
{"enuArmorSlots::NewEnumerator8", "Left front skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator9", "Right front skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator10", "Left side skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator11", "Right side skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator12", "Left back skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator13", "Right side skirt"},
|
|
||||||
{"enuArmorSlots::NewEnumerator14", "Back waist"},
|
|
||||||
{"enuArmorSlots::NewEnumerator15", "Left shoulder"},
|
|
||||||
{"enuArmorSlots::NewEnumerator16", "Right shoulder"},
|
|
||||||
{"enuArmorSlots::NewEnumerator17", "Left upper arm"},
|
|
||||||
{"enuArmorSlots::NewEnumerator18", "Right upper arm"},
|
|
||||||
{"enuArmorSlots::NewEnumerator19", "Left elbow"},
|
|
||||||
{"enuArmorSlots::NewEnumerator20", "Right elbow"},
|
|
||||||
{"enuArmorSlots::NewEnumerator21", "Left lower arm"},
|
|
||||||
{"enuArmorSlots::NewEnumerator22", "Right lower arm"},
|
|
||||||
{"enuArmorSlots::NewEnumerator24", "Left hand"},
|
|
||||||
{"enuArmorSlots::NewEnumerator25", "Right hand"},
|
|
||||||
{"enuArmorSlots::NewEnumerator26", "Left upper leg"},
|
|
||||||
{"enuArmorSlots::NewEnumerator27", "Right upper leg"},
|
|
||||||
{"enuArmorSlots::NewEnumerator28", "Left knee"},
|
|
||||||
{"enuArmorSlots::NewEnumerator29", "Right knee"},
|
|
||||||
{"enuArmorSlots::NewEnumerator30", "Left lower leg"},
|
|
||||||
{"enuArmorSlots::NewEnumerator31", "Right lower leg"},
|
|
||||||
{"enuArmorSlots::NewEnumerator32", "Left ankle"},
|
|
||||||
{"enuArmorSlots::NewEnumerator33", "Right ankle"},
|
|
||||||
{"enuArmorSlots::NewEnumerator34", "Left heel"},
|
|
||||||
{"enuArmorSlots::NewEnumerator35", "Right heel"},
|
|
||||||
{"enuArmorSlots::NewEnumerator36", "Left foot"},
|
|
||||||
{"enuArmorSlots::NewEnumerator37", "Right foot"},
|
|
||||||
};
|
|
56
src/Maps/ArmourSlots.hpp
Normal file
56
src/Maps/ArmourSlots.hpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// 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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifdef c
|
||||||
|
c(Face, "enuArmorSlots::NewEnumerator0", "Face")
|
||||||
|
c(UpperHead, "enuArmorSlots::NewEnumerator1", "Upper head")
|
||||||
|
c(LowerHead, "enuArmorSlots::NewEnumerator2", "Lower head")
|
||||||
|
c(Neck, "enuArmorSlots::NewEnumerator3", "Neck")
|
||||||
|
c(UpperBody, "enuArmorSlots::NewEnumerator4", "Upper body")
|
||||||
|
c(MiddleBody, "enuArmorSlots::NewEnumerator5", "Middle body")
|
||||||
|
c(LowerBody, "enuArmorSlots::NewEnumerator6", "Lower body")
|
||||||
|
c(FrontWaist, "enuArmorSlots::NewEnumerator7", "Front waist")
|
||||||
|
c(LeftFrontSkirt, "enuArmorSlots::NewEnumerator8", "Left front skirt")
|
||||||
|
c(RightFrontSkirt, "enuArmorSlots::NewEnumerator9", "Right front skirt")
|
||||||
|
c(LeftSideSkirt, "enuArmorSlots::NewEnumerator10", "Left side skirt")
|
||||||
|
c(RightSideSkirt, "enuArmorSlots::NewEnumerator11", "Right side skirt")
|
||||||
|
c(LeftBackSkirt, "enuArmorSlots::NewEnumerator12", "Left back skirt")
|
||||||
|
c(RightBackSkirt, "enuArmorSlots::NewEnumerator13", "Right back skirt")
|
||||||
|
c(BackWaist, "enuArmorSlots::NewEnumerator14", "Back waist")
|
||||||
|
c(LeftShoulder, "enuArmorSlots::NewEnumerator15", "Left shoulder")
|
||||||
|
c(RightShoulder, "enuArmorSlots::NewEnumerator16", "Right shoulder")
|
||||||
|
c(LeftUpperArm, "enuArmorSlots::NewEnumerator17", "Left upper arm")
|
||||||
|
c(RightUpperArm, "enuArmorSlots::NewEnumerator18", "Right upper arm")
|
||||||
|
c(LeftElbow, "enuArmorSlots::NewEnumerator19", "Left elbow")
|
||||||
|
c(RightElbow, "enuArmorSlots::NewEnumerator20", "Right elbow")
|
||||||
|
c(LeftLowerArm, "enuArmorSlots::NewEnumerator21", "Left lower arm")
|
||||||
|
c(RightLowerArm, "enuArmorSlots::NewEnumerator22", "Right lower arm")
|
||||||
|
c(Backpack, "enuArmorSlots::NewEnumerator23", "Backpack")
|
||||||
|
c(LeftHand, "enuArmorSlots::NewEnumerator24", "Left hand")
|
||||||
|
c(RightHand, "enuArmorSlots::NewEnumerator25", "Right hand")
|
||||||
|
c(LeftUpperLeg, "enuArmorSlots::NewEnumerator26", "Left upper leg")
|
||||||
|
c(RightUpperLeg, "enuArmorSlots::NewEnumerator27", "Right upper leg")
|
||||||
|
c(LeftKnee, "enuArmorSlots::NewEnumerator28", "Left knee")
|
||||||
|
c(RightKnee, "enuArmorSlots::NewEnumerator29", "Right knee")
|
||||||
|
c(LeftLowerLeg, "enuArmorSlots::NewEnumerator30", "Left lower leg")
|
||||||
|
c(RightLowerLeg, "enuArmorSlots::NewEnumerator31", "Right lower leg")
|
||||||
|
c(LeftAnkle, "enuArmorSlots::NewEnumerator32", "Left ankle")
|
||||||
|
c(RightAnkle, "enuArmorSlots::NewEnumerator33", "Right ankle")
|
||||||
|
c(LeftHeel, "enuArmorSlots::NewEnumerator34", "Left heel")
|
||||||
|
c(RightHeel, "enuArmorSlots::NewEnumerator35", "Right heel")
|
||||||
|
c(LeftFoot, "enuArmorSlots::NewEnumerator36", "Left foot")
|
||||||
|
c(RightFoot, "enuArmorSlots::NewEnumerator37", "Right foot")
|
||||||
|
#endif
|
|
@ -28,8 +28,49 @@
|
||||||
using namespace Corrade;
|
using namespace Corrade;
|
||||||
using namespace Magnum;
|
using namespace Magnum;
|
||||||
|
|
||||||
|
enum class ArmourSlot {
|
||||||
|
Face = 0,
|
||||||
|
UpperHead = 1,
|
||||||
|
LowerHead = 2,
|
||||||
|
Neck = 3,
|
||||||
|
UpperBody = 4,
|
||||||
|
MiddleBody = 5,
|
||||||
|
LowerBody = 6,
|
||||||
|
FrontWaist = 7,
|
||||||
|
LeftFrontSkirt = 8,
|
||||||
|
RightFrontSkirt = 9,
|
||||||
|
LeftSideSkirt = 10,
|
||||||
|
RightSideSkirt = 11,
|
||||||
|
LeftBackSkirt = 12,
|
||||||
|
RightBackSkirt = 13,
|
||||||
|
BackWaist = 14,
|
||||||
|
LeftShoulder = 15,
|
||||||
|
RightShoulder = 16,
|
||||||
|
LeftUpperArm = 17,
|
||||||
|
RightUpperArm = 18,
|
||||||
|
LeftElbow = 19,
|
||||||
|
RightElbow = 20,
|
||||||
|
LeftLowerArm = 21,
|
||||||
|
RightLowerArm = 22,
|
||||||
|
Backpack = 23,
|
||||||
|
LeftHand = 24,
|
||||||
|
RightHand = 25,
|
||||||
|
LeftUpperLeg = 26,
|
||||||
|
RightUpperLeg = 27,
|
||||||
|
LeftKnee = 28,
|
||||||
|
RightKnee = 29,
|
||||||
|
LeftLowerLeg = 30,
|
||||||
|
RightLowerLeg = 31,
|
||||||
|
LeftAnkle = 32,
|
||||||
|
RightAnkle = 33,
|
||||||
|
LeftHeel = 34,
|
||||||
|
RightHeel = 35,
|
||||||
|
LeftFoot = 36,
|
||||||
|
RightFoot = 37,
|
||||||
|
};
|
||||||
|
|
||||||
struct ArmourPart {
|
struct ArmourPart {
|
||||||
std::string slot;
|
ArmourSlot slot = ArmourSlot::Face;
|
||||||
Int id = 0;
|
Int id = 0;
|
||||||
Containers::StaticArray<4, Int> styles{ValueInit};
|
Containers::StaticArray<4, Int> styles{ValueInit};
|
||||||
UnsignedInt demoDecals = 8;
|
UnsignedInt demoDecals = 8;
|
||||||
|
|
|
@ -583,7 +583,15 @@ void Mass::getArmourParts() {
|
||||||
auto part_prop = armour_array->at<GenericStructProperty>(i);
|
auto part_prop = armour_array->at<GenericStructProperty>(i);
|
||||||
auto& part = _armour.parts[i];
|
auto& part = _armour.parts[i];
|
||||||
|
|
||||||
part.slot = part_prop->at<ByteProperty>("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue;
|
auto& armour_slot = part_prop->at<ByteProperty>("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue;
|
||||||
|
#define c(enumerator, strenum, name) if(armour_slot == (strenum)) { part.slot = ArmourSlot::enumerator; } else
|
||||||
|
#include "../Maps/ArmourSlots.hpp"
|
||||||
|
#undef c
|
||||||
|
{
|
||||||
|
_state = State::Invalid;
|
||||||
|
Utility::Warning{} << "Invalid armour slot enum value in getArmourParts().";
|
||||||
|
}
|
||||||
|
|
||||||
part.id = part_prop->at<IntProperty>("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value;
|
part.id = part_prop->at<IntProperty>("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value;
|
||||||
|
|
||||||
auto part_styles = part_prop->at<ArrayProperty>("Styles_47_3E31870441DFD7DB8BEE5C85C26B365B");
|
auto part_styles = part_prop->at<ArrayProperty>("Styles_47_3E31870441DFD7DB8BEE5C85C26B365B");
|
||||||
|
@ -644,8 +652,16 @@ auto Mass::writeArmourPart(UnsignedLong index) -> bool {
|
||||||
|
|
||||||
auto& part = _armour.parts[index];
|
auto& part = _armour.parts[index];
|
||||||
|
|
||||||
if(part_prop->at<ByteProperty>("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue != part.slot) {
|
auto& armour_slot = part_prop->at<ByteProperty>("Slot_3_408BA56F4C9605C7E805CF91B642249C")->enumValue;
|
||||||
return false;
|
switch(part.slot) {
|
||||||
|
#define c(enumerator, strenum, name) case ArmourSlot::enumerator: \
|
||||||
|
if((strenum) != armour_slot) { \
|
||||||
|
_lastError = "Armour part slot doesn't match save file."; \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
break;
|
||||||
|
#include "../Maps/ArmourSlots.hpp"
|
||||||
|
#undef c
|
||||||
}
|
}
|
||||||
|
|
||||||
part_prop->at<IntProperty>("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value = part.id;
|
part_prop->at<IntProperty>("ID_5_ACD101864D3481DE96EDACACC09BDD25")->value = part.id;
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
|
|
||||||
#include "../Maps/Accessories.h"
|
#include "../Maps/Accessories.h"
|
||||||
#include "../Maps/ArmourSets.h"
|
#include "../Maps/ArmourSets.h"
|
||||||
#include "../Maps/ArmourSlots.h"
|
|
||||||
#include "../Maps/StyleNames.h"
|
#include "../Maps/StyleNames.h"
|
||||||
|
|
||||||
#include "../FontAwesome/IconsFontAwesome5.h"
|
#include "../FontAwesome/IconsFontAwesome5.h"
|
||||||
|
@ -458,6 +457,12 @@ void SaveTool::drawArmour() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* slot_labels[] = {
|
||||||
|
#define c(enumerator, strenum, name) name,
|
||||||
|
#include "../Maps/ArmourSlots.hpp"
|
||||||
|
#undef c
|
||||||
|
};
|
||||||
|
|
||||||
for(UnsignedInt i = 0; i < _currentMass->armourParts().size(); i++) {
|
for(UnsignedInt i = 0; i < _currentMass->armourParts().size(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(i);
|
||||||
|
|
||||||
|
@ -468,10 +473,10 @@ void SaveTool::drawArmour() {
|
||||||
std::memset(header, '\0', 129);
|
std::memset(header, '\0', 129);
|
||||||
|
|
||||||
if(armour_sets.find(part.id) != armour_sets.cend()) {
|
if(armour_sets.find(part.id) != armour_sets.cend()) {
|
||||||
std::snprintf(header, 128, "%s: %s###%s", armour_slots.at(part.slot), armour_sets.at(part.id).name, part.slot.c_str());
|
std::snprintf(header, 128, "%s: %s###%u", slot_labels[UnsignedInt(part.slot)], armour_sets.at(part.id).name, UnsignedInt(part.slot));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::snprintf(header, 128, "%s: %i###%s", armour_slots.at(part.slot), part.id, part.slot.c_str());
|
std::snprintf(header, 128, "%s: %i###%u", slot_labels[UnsignedInt(part.slot)], part.id, UnsignedInt(part.slot));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ImGui::CollapsingHeader(header)) {
|
if(ImGui::CollapsingHeader(header)) {
|
||||||
|
@ -479,7 +484,7 @@ void SaveTool::drawArmour() {
|
||||||
|
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvailWidth() * 0.491f);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvailWidth() * 0.491f);
|
||||||
if(ImGui::BeginListBox("##ChangePart")) {
|
if(ImGui::BeginListBox("##ChangePart")) {
|
||||||
if(std::strncmp("Neck", armour_slots.at(part.slot), 4) != 0) {
|
if(std::strncmp("Neck", slot_labels[UnsignedInt(part.slot)], 4) != 0) {
|
||||||
for(auto& set : armour_sets) {
|
for(auto& set : armour_sets) {
|
||||||
if(ImGui::Selectable(set.second.name, set.first == part.id, ImGuiSelectableFlags_SpanAvailWidth)) {
|
if(ImGui::Selectable(set.second.name, set.first == part.id, ImGuiSelectableFlags_SpanAvailWidth)) {
|
||||||
part.id = set.first;
|
part.id = set.first;
|
||||||
|
@ -862,7 +867,7 @@ void SaveTool::drawWeaponEditor(Weapon& weapon) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
const char* labels[] {
|
static const char* labels[] {
|
||||||
#define c(enumerator, strenum, name) name,
|
#define c(enumerator, strenum, name) name,
|
||||||
#include "../Maps/WeaponTypes.hpp"
|
#include "../Maps/WeaponTypes.hpp"
|
||||||
#undef c
|
#undef c
|
||||||
|
|
Loading…
Reference in a new issue