show total time in balancing target arenas

This commit is contained in:
2026-07-04 08:07:52 +02:00
parent fcaee000fa
commit 24e0999d8a
8 changed files with 32 additions and 4 deletions

View File

@@ -515,6 +515,7 @@ void ArenaSimulation::updateStatus()
ArenaStatus newStatus;
newStatus.finished = m_finished;
newStatus.winnerTeam = m_winnerTeam;
newStatus.durationSeconds = ticksToSeconds(m_currentTick);
// Live remaining HP of each team's ships and defence stations (HQ excluded);
// the EHP-percentage numerator (denominator is the fixed m_teamMaxEhp).

View File

@@ -59,6 +59,9 @@ struct ArenaStatus
TeamStatus teams[2];
bool finished = false;
int winnerTeam = -1; // 0 or 1 when finished; -1 while running
// Game time the fight has lasted (simulated ticks * fixed tick duration).
// Meaningful once finished; the battle duration shown for completed runs.
double durationSeconds = 0.0;
};
class ArenaSimulation

View File

@@ -33,6 +33,9 @@ void ArenaWidget::buildLayout(const std::string& arenaName)
m_titleLabel->setFont(titleFont);
titleRow->addWidget(m_titleLabel);
m_durationLabel = new QLabel(this);
titleRow->addWidget(m_durationLabel);
titleRow->addStretch();
m_inspectButton = new QPushButton(tr("Inspect"), this);
@@ -159,6 +162,10 @@ void ArenaWidget::updateStatus(const ArenaStatus& status)
content->setText(lines);
}
m_durationLabel->setText(status.finished
? tr("Duration: %1 s").arg(QString::number(status.durationSeconds, 'f', 1))
: QString());
if (status.finished && !m_wasFinished)
{
m_wasFinished = true;

View File

@@ -36,6 +36,7 @@ private:
int m_arenaIndex;
ArenaStatus m_lastStatus;
QLabel* m_titleLabel;
QLabel* m_durationLabel;
QLabel* m_team1Header;
QLabel* m_team2Header;
QLabel* m_team1Threat;

View File

@@ -373,9 +373,17 @@ void BalancingWindow::writeLog()
for (const ArenaEntry& entry : m_arenas)
{
const ArenaStatus& status = entry.widget->getLastStatus();
const ArenaWidget::State state = entry.widget->getState();
QString stateSuffix = stateText(state);
if (state == ArenaWidget::State::Ended)
{
stateSuffix += QStringLiteral(", %1 s")
.arg(QString::number(status.durationSeconds, 'f', 1));
}
out << "\n## Arena: " << QString::fromStdString(entry.config.name)
<< " (" << stateText(entry.widget->getState()) << ")\n\n";
<< " (" << stateSuffix << ")\n\n";
out << "| " << teamHeaderCell(status, 0) << " | "
<< teamHeaderCell(status, 1) << " |\n";

View File

@@ -52,6 +52,9 @@ InspectWindow::InspectWindow(ArenaSimulation* sim, const GameConfig* config,
nameLabel->setFont(nameFont);
headerLayout->addWidget(nameLabel);
m_durationLabel = new QLabel(header);
headerLayout->addWidget(m_durationLabel);
headerLayout->addStretch();
const char* labels[] = { "0x", "0.5x", "1x", "2x", "10x" };
@@ -202,6 +205,10 @@ void InspectWindow::pollStatus()
void InspectWindow::updateInfoPanel(const ArenaStatus& status)
{
m_durationLabel->setText(status.finished
? tr("Duration: %1 s").arg(QString::number(status.durationSeconds, 'f', 1))
: QString());
for (int ti = 0; ti < 2; ++ti)
{
const ArenaStatus::TeamStatus& team = status.teams[ti];

View File

@@ -54,6 +54,7 @@ private:
ArenaView* m_arenaView;
std::vector<QPushButton*> m_speedButtons;
QLabel* m_durationLabel;
QLabel* m_team1Header;
QLabel* m_team2Header;
QLabel* m_team1Threat;