From 61f6c3aae876d5f3f6ff006ac30f69e6301ed071 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Mon, 24 Apr 2023 23:48:02 -0700 Subject: [PATCH] Implements CGSpendVirtuePoints. --- sbf-cpp/Character.cpp | 6 ++++++ sbf-cpp/Character.h | 1 + sbf-cpp/Virtues.cpp | 13 +++++++++++-- sbf-cpp/Virtues.h | 2 ++ sbf-cpp/sbf.cpp | 17 +++++++++++++---- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/sbf-cpp/Character.cpp b/sbf-cpp/Character.cpp index 7f1f4f6..ecd4989 100644 --- a/sbf-cpp/Character.cpp +++ b/sbf-cpp/Character.cpp @@ -257,6 +257,12 @@ void CharacterType::FillVirtueValues(std::vector& values) const { } } +vector CharacterType::GetVirtueValues() const { + vector values; + FillVirtueValues(values); + return values; +} + void CharacterType::FillAttributeValues(std::vector& values, int group_id) const { // TODO: This method sucks, but was needed in QBasic. const int numAttributes = GetNumAttributesInGroup(group_id); diff --git a/sbf-cpp/Character.h b/sbf-cpp/Character.h index 40a2c5a..37596e7 100644 --- a/sbf-cpp/Character.h +++ b/sbf-cpp/Character.h @@ -54,6 +54,7 @@ class CharacterType { int GetSocialAttributeValue(int id) const; int GetTalentValue(int id) const; int GetVirtueValue(int id) const; + std::vector GetVirtueValues() const; void SetAbilityValue(int group_id, int id, int value); void SetAttributeValue(int group_id, int id, int value); void SetBackgroundValue(int id, int value); diff --git a/sbf-cpp/Virtues.cpp b/sbf-cpp/Virtues.cpp index ae4d622..ea819b9 100644 --- a/sbf-cpp/Virtues.cpp +++ b/sbf-cpp/Virtues.cpp @@ -4,19 +4,28 @@ #include namespace SBF { +namespace { +using std::string; +using std::vector; +} // End namespace -const std::string GetVirtueLabel(int id) { +const string GetVirtueLabel(int id) { if (id > 0 && id <= kVirtuesCount) { return kVirtueLabels[id]; } return ""; } -void FillVirtueLabels(std::vector& labels) { +void FillVirtueLabels(vector& labels) { labels.clear(); for (int id = 1; id <= kVirtuesCount; id++) { labels.push_back(GetVirtueLabel(id)); } } +vector GetVirtueLabels() { + vector labels; + FillVirtueLabels(labels); + return labels; +} } // End namespace SBF diff --git a/sbf-cpp/Virtues.h b/sbf-cpp/Virtues.h index 4ed5de1..4138377 100644 --- a/sbf-cpp/Virtues.h +++ b/sbf-cpp/Virtues.h @@ -39,6 +39,8 @@ const std::string GetVirtueLabel(int virtue_id); /// @brief Fills the vector with all of the valid virtue labels. /// @param virtue_labels The vector to fill. It will be cleared first. void FillVirtueLabels(std::vector& virtue_labels); + +std::vector GetVirtueLabels(); } // End namespace SBF /** @}*/ diff --git a/sbf-cpp/sbf.cpp b/sbf-cpp/sbf.cpp index 9aa437c..861f7a5 100644 --- a/sbf-cpp/sbf.cpp +++ b/sbf-cpp/sbf.cpp @@ -1,6 +1,5 @@ +#include "sbf-cpp/Virtues.h" #define _XOPEN_SOURCE_EXTENDED -#include "sbf.h" - #include #include #include @@ -17,6 +16,7 @@ #include "Menus.h" #include "Random.h" #include "Utils.h" +#include "sbf.h" #define KEY_ESCAPE 0033 @@ -319,8 +319,17 @@ void CGGetRoad(CharacterType& ch) { } void CGSpendVirtuePoints(CharacterType& ch) { - // TODO: Fill this in. - cout << "// TODO: CGSpendVirtuePoints(CharacterType&)" << endl; + // Spend virtue points + MenuStyle ms; + int virtue_points = GetVirtuePoints(); + vector labels = GetVirtueLabels(); + while (virtue_points > 0) { + vector values = ch.GetVirtueValues(); + int virtue_id = ChooseStringIdWithValues( + labels, values, ms, "Which virtue do you want to spend 1 of your " + to_string(virtue_points) + " points on?"); + ch.SetVirtueValue(virtue_id, ch.GetVirtueValue(virtue_id) + 1); + virtue_points--; + } } void CGGetDerangement(CharacterType& ch) {