Feature: adding matériel to Billy.
No conformity is done when adding things (dagger or bow for example)
This commit is contained in:
		
					parent
					
						
							
								6ad47b12bf
							
						
					
				
			
			
				commit
				
					
						75f8db9f5a
					
				
			
		
					 6 changed files with 124 additions and 37 deletions
				
			
		| 
						 | 
				
			
			@ -17,9 +17,10 @@ constexpr std::uint32_t toolsHash = const_hash("tools");
 | 
			
		|||
namespace character {
 | 
			
		||||
    using characteristic::Characteristic;
 | 
			
		||||
 | 
			
		||||
    void BillyObjects::push_object(const billyObject &object, CharacterSheet &sheet) noexcept {
 | 
			
		||||
    bool BillyObjects::push_object(const billyObject &object, CharacterSheet &sheet) noexcept {
 | 
			
		||||
        if (sheet.objects.size() < 3) {
 | 
			
		||||
            sheet.objects.emplace_back(object);
 | 
			
		||||
            sheet.available_objects.erase(object);
 | 
			
		||||
 | 
			
		||||
            auto &local_habilete = static_cast<Characteristic &>(sheet.habilete);
 | 
			
		||||
            auto &local_adresse = static_cast<Characteristic &>(sheet.adresse);
 | 
			
		||||
| 
						 | 
				
			
			@ -53,13 +54,16 @@ namespace character {
 | 
			
		|||
                                plus);
 | 
			
		||||
                    },
 | 
			
		||||
            }, object);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void BillyObjects::pop_object(CharacterSheet &sheet) noexcept {
 | 
			
		||||
        if (!sheet.objects.empty()) {
 | 
			
		||||
            const billyObject obj = sheet.objects.back();
 | 
			
		||||
            sheet.objects.pop_back();
 | 
			
		||||
            sheet.available_objects.insert(obj);
 | 
			
		||||
 | 
			
		||||
            auto &local_habilete = static_cast<Characteristic &>(sheet.habilete);
 | 
			
		||||
            auto &local_adresse = static_cast<Characteristic &>(sheet.adresse);
 | 
			
		||||
| 
						 | 
				
			
			@ -109,6 +113,7 @@ namespace character {
 | 
			
		|||
                localEndurance.materiel = operation(localEndurance.materiel, 3);
 | 
			
		||||
                break;
 | 
			
		||||
            case tools::Dagger:
 | 
			
		||||
                sheet.critique = operation(sheet.critique, 6);
 | 
			
		||||
                break;
 | 
			
		||||
            case tools::RockClimbingKit:
 | 
			
		||||
                localAdresse.materiel = operation(localAdresse.materiel, 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										102
									
								
								src/gui/gui.cpp
									
										
									
									
									
								
							
							
						
						
									
										102
									
								
								src/gui/gui.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -174,32 +174,96 @@ void gui::Gui::stat_second_menu() noexcept {
 | 
			
		|||
    ImGui::EndChild();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename MaterielEnum>
 | 
			
		||||
constexpr std::string_view combo_label() {
 | 
			
		||||
    using character::weapons;
 | 
			
		||||
    using character::equipments;
 | 
			
		||||
    using character::tools;
 | 
			
		||||
    if constexpr (std::is_same_v<MaterielEnum, weapons>) {
 | 
			
		||||
        return "Weapons";
 | 
			
		||||
    } else if constexpr (std::is_same_v<MaterielEnum, equipments>) {
 | 
			
		||||
        return "Equipments";
 | 
			
		||||
    } else {
 | 
			
		||||
        return "Tools";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename MaterielEnum>
 | 
			
		||||
constexpr std::string_view material_child_win_id() {
 | 
			
		||||
    using character::weapons;
 | 
			
		||||
    using character::equipments;
 | 
			
		||||
    using character::tools;
 | 
			
		||||
    if constexpr (std::is_same_v<MaterielEnum, weapons>) {
 | 
			
		||||
        return "weapons";
 | 
			
		||||
    } else if constexpr (std::is_same_v<MaterielEnum, equipments>) {
 | 
			
		||||
        return "equipments";
 | 
			
		||||
    } else {
 | 
			
		||||
        return "tools";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename MaterielEnum>
 | 
			
		||||
void generic_combo_menu(character::CharacterSheet &billy,
 | 
			
		||||
        std::unordered_set<character::BillyObjects::billyObject> &availableObjects,
 | 
			
		||||
        character::BillyObjects &dealObjects) noexcept {
 | 
			
		||||
    using character::BillyObjects;
 | 
			
		||||
 | 
			
		||||
    static auto selected = std::find_if(availableObjects.cbegin(), availableObjects.cend(), [](const auto &billyObj) {
 | 
			
		||||
        return std::holds_alternative<MaterielEnum>(billyObj);
 | 
			
		||||
    });
 | 
			
		||||
    ImGui::BeginChild(material_child_win_id<MaterielEnum>().data(),
 | 
			
		||||
            ImVec2(ImGui::GetWindowWidth(), 0),
 | 
			
		||||
            ImGuiChildFlags_AutoResizeY);
 | 
			
		||||
    if (ImGui::BeginCombo(combo_label<MaterielEnum>().data(),
 | 
			
		||||
            BillyObjects::billy_object_to_string(*selected).data(),
 | 
			
		||||
            ImGuiComboFlags_WidthFitPreview | ImGuiComboFlags_PopupAlignLeft)) {
 | 
			
		||||
        for (auto iterator = availableObjects.cbegin();
 | 
			
		||||
             iterator != availableObjects.cend(); ++iterator) {
 | 
			
		||||
            if (!std::holds_alternative<MaterielEnum>(*iterator)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            const bool is_selected = selected == iterator;
 | 
			
		||||
 | 
			
		||||
            if (ImGui::Selectable(BillyObjects::billy_object_to_string(*iterator).data(), is_selected)) {
 | 
			
		||||
                selected = iterator;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (is_selected) {
 | 
			
		||||
                ImGui::SetItemDefaultFocus();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        ImGui::EndCombo();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImGui::SameLine();
 | 
			
		||||
    if (ImGui::Button("+")) {
 | 
			
		||||
        if (dealObjects.push_object(*selected, billy)) {
 | 
			
		||||
            selected = std::find_if(availableObjects.cbegin(),
 | 
			
		||||
                    availableObjects.cend(),
 | 
			
		||||
                    [](const auto &billyObj) { return std::holds_alternative<MaterielEnum>(billyObj); });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    ImGui::EndChild();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gui::Gui::materiel_menu() noexcept {
 | 
			
		||||
    using character::BillyObjects;
 | 
			
		||||
 | 
			
		||||
    ImGui::BeginChild("materiel",
 | 
			
		||||
            ImVec2(ImGui::GetWindowWidth() / 3, 0),
 | 
			
		||||
            ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY);
 | 
			
		||||
    ImGui::Text("Matériel");
 | 
			
		||||
 | 
			
		||||
    ImGui::BeginChild("weapons", ImVec2(0, 0), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY);
 | 
			
		||||
    ImGui::Text(character::BillyObjects::sword.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::lance.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::morgenstern.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::bow.data());
 | 
			
		||||
    ImGui::EndChild();
 | 
			
		||||
    generic_combo_menu<character::weapons>(data.billy, data.billy.available_objects, deal_objects);
 | 
			
		||||
    generic_combo_menu<character::equipments>(data.billy, data.billy.available_objects, deal_objects);
 | 
			
		||||
    generic_combo_menu<character::tools>(data.billy, data.billy.available_objects, deal_objects);
 | 
			
		||||
 | 
			
		||||
    ImGui::BeginChild("equipments", ImVec2(0, 0), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY);
 | 
			
		||||
    ImGui::Text(character::BillyObjects::chainmail.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::cooking_pot.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::pamphlet_tourist.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::medic_kit.data());
 | 
			
		||||
    ImGui::EndChild();
 | 
			
		||||
 | 
			
		||||
    ImGui::BeginChild("tools", ImVec2(0, 0), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY);
 | 
			
		||||
    ImGui::Text(character::BillyObjects::fourche.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::dagger.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::rock_climbing_kit.data());
 | 
			
		||||
    ImGui::Text(character::BillyObjects::sack_of_grain.data());
 | 
			
		||||
    ImGui::EndChild();
 | 
			
		||||
    for (const auto &object: data.billy.get_objects()) {
 | 
			
		||||
        ImGui::Text("%s", BillyObjects::billy_object_to_string(object).data());
 | 
			
		||||
    }
 | 
			
		||||
    if (ImGui::Button("Remove last object")) {
 | 
			
		||||
        deal_objects.pop_object(data.billy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImGui::EndChild();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue