Skip to content

Commit 48b6906

Browse files
committed
Uniformize power display with rates input text style
1 parent 55eb11b commit 48b6906

File tree

3 files changed

+29
-20
lines changed

3 files changed

+29
-20
lines changed

ficsit-companion/include/node.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,12 @@ struct CraftNode : public Node
5757
FractionalNumber current_rate;
5858
/// @brief Technically it could be just an int, but FractionalNumber already has all string operations
5959
FractionalNumber num_somersloop;
60-
double same_clock_power;
61-
double last_underclock_power;
60+
/// @brief Power requirement if all machines are at the same clock.
61+
/// It could be a double, but FractionalNumber already has all string operations
62+
FractionalNumber same_clock_power;
63+
/// @brief Power requirements if all machines are at 100% except the last one.
64+
/// It could be a double, but FractionalNumber already has all string operations
65+
FractionalNumber last_underclock_power;
6266
};
6367

6468
struct OrganizerNode : public Node

ficsit-companion/src/app.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,8 +1157,8 @@ void App::RenderLeftPanel()
11571157
std::map<const Item*, FractionalNumber, ItemPtrCompare> intermediates;
11581158
std::map<std::string, FractionalNumber> total_machines;
11591159
std::map<std::string, std::map<const Recipe*, FractionalNumber, RecipePtrCompare>> detailed_machines;
1160-
double total_power = 0.0;
1161-
std::map<const Recipe*, double> detailed_power;
1160+
FractionalNumber total_power;
1161+
std::map<const Recipe*, FractionalNumber> detailed_power;
11621162
bool has_variable_power = false;
11631163

11641164
// Gather all inputs/outputs/machines
@@ -1203,11 +1203,13 @@ void App::RenderLeftPanel()
12031203
}
12041204
}
12051205

1206+
const float power_width = ImGui::CalcTextSize("000000.00").x + ImGui::GetStyle().FramePadding.x * 2.0f;
12061207
ImGui::SeparatorText(has_variable_power ? "Average Power" : "Power");
1208+
if (total_power.GetNumerator() > 0)
12071209
{
1208-
std::vector<std::pair<const Recipe*, double>> sorted_detailed_power(detailed_power.begin(), detailed_power.end());
1210+
std::vector<std::pair<const Recipe*, FractionalNumber>> sorted_detailed_power(detailed_power.begin(), detailed_power.end());
12091211
std::stable_sort(sorted_detailed_power.begin(), sorted_detailed_power.end(), [](const auto& a, const auto& b) {
1210-
return a.second > b.second;
1212+
return a.second.GetValue() > b.second.GetValue();
12111213
});
12121214

12131215
// No visible color change when hovered/click
@@ -1219,14 +1221,18 @@ void App::RenderLeftPanel()
12191221

12201222
// Displayed over the TreeNodeEx element (same line)
12211223
ImGui::SameLine();
1222-
ImGui::Text("%s%.8g MW", has_variable_power ? "~" : "", total_power);
1224+
total_power.RenderInputText("##power", true, false, power_width);
1225+
ImGui::SameLine();
1226+
ImGui::Text("%sMW", has_variable_power ? "~" : "");
12231227
// Detailed list of recipes if the tree node is open
12241228
if (display_power_details)
12251229
{
12261230
ImGui::Indent();
12271231
for (auto& [recipe, p] : sorted_detailed_power)
12281232
{
1229-
ImGui::Text("%s%.6g MW", recipe->building->variable_power ? "~" : "", p);
1233+
p.RenderInputText("##power", true, false, power_width);
1234+
ImGui::SameLine();
1235+
ImGui::Text("%sMW", recipe->building->variable_power ? "~" : "");
12301236
ImGui::SameLine();
12311237
recipe->Render();
12321238
}
@@ -1598,7 +1604,9 @@ void App::RenderNodes()
15981604
{
15991605
ImGui::Spring(0.0f);
16001606
CraftNode* craft_node = static_cast<CraftNode*>(node.get());
1601-
ImGui::Text("%s%.6g MW", craft_node->recipe->building->variable_power ? "~" : "", settings.power_equal_clocks ? craft_node->same_clock_power : craft_node->last_underclock_power);
1607+
(settings.power_equal_clocks ? craft_node->same_clock_power : craft_node->last_underclock_power).RenderInputText("##power", true, false);
1608+
ImGui::Spring(0.0f);
1609+
ImGui::Text("%sMW", craft_node->recipe->building->variable_power ? "~" : "");
16021610
if (craft_node->recipe->building->variable_power && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
16031611
{
16041612
frame_tooltips.push_back("Average power");

ficsit-companion/src/node.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,31 +121,28 @@ bool CraftNode::Deserialize(const Json::Value& v)
121121

122122
void CraftNode::ComputePowerUsage()
123123
{
124-
same_clock_power = 0.0;
125-
last_underclock_power = 0.0;
126-
127124
const Building* building = recipe->building;
128125
// All machines are underclocked at current_rate/num_machines
129126
const int num_machines = static_cast<int>(std::ceil(current_rate.GetValue()));
130127
const double power = recipe->power;
131-
same_clock_power =
128+
double same_clock_power_double =
132129
num_machines *
133130
power *
134131
std::pow(1.0 + num_somersloop.GetValue() * building->somersloop_mult.GetValue(), building->somersloop_power_exponent) *
135-
std::pow(current_rate.GetValue() / static_cast<double>(num_machines), building->power_exponent);
136-
// num_full_machines have 100% rate + extra underclocked machine
132+
std::pow(current_rate.GetValue() / static_cast<double>(std::max(1, num_machines)), building->power_exponent);
133+
// num_full_machines at 100% rate + one extra underclocked machine
137134
const int num_full_machines = static_cast<int>(std::floor(current_rate.GetValue()));
138-
last_underclock_power =
135+
double last_underclock_power_double =
139136
num_full_machines *
140137
power *
141138
std::pow(1.0 + num_somersloop.GetValue() * building->somersloop_mult.GetValue(), building->somersloop_power_exponent);
142-
last_underclock_power +=
139+
last_underclock_power_double +=
143140
power *
144141
std::pow(1.0 + num_somersloop.GetValue() * building->somersloop_mult.GetValue(), building->somersloop_power_exponent) *
145142
std::pow(current_rate.GetValue() - num_full_machines, building->power_exponent);
146-
// Truncate power to max 2 figures after the decimal point
147-
same_clock_power = std::floor(same_clock_power * 100.0) / 100.0;
148-
last_underclock_power = std::floor(last_underclock_power * 100.0) / 100.0;
143+
// Round values at 0.001 precision for the power, as we don't have exact fractional values with the exponents anyway
144+
same_clock_power = FractionalNumber(static_cast<long long int>(std::round(same_clock_power_double * 1000.0)), 1000);
145+
last_underclock_power = FractionalNumber(static_cast<long long int>(std::round(last_underclock_power_double * 1000.0)), 1000);
149146

150147
}
151148

0 commit comments

Comments
 (0)