#include "StationContent.h" #include #include "BarRow.h" #include "EntityAdmin.h" #include "FactionComponent.h" #include "HealthComponent.h" #include "ModuleOwnerComponent.h" #include "Simulation.h" #include "StatRow.h" #include "WeaponComponent.h" StationContent::StationContent(const SelectionContext& context, const SelectionRequest& request, QWidget* parent) : SelectionContent(context, std::nullopt, parent) , m_entity(request.actors.front()) { m_hpBar = new BarRow(tr("HP"), this); m_damageRow = new StatRow(tr("Damage"), this); m_rangeRow = new StatRow(tr("Range"), this); m_fireRateRow = new StatRow(tr("Fire rate"), this); getRuntimeLayout()->addWidget(m_hpBar); getRuntimeLayout()->addWidget(m_damageRow); getRuntimeLayout()->addWidget(m_rangeRow); getRuntimeLayout()->addWidget(m_fireRateRow); EntityAdmin& admin = context.sim->getAdmin(); const bool isEnemy = admin.isValid(m_entity) && admin.hasAll(m_entity) && admin.get(m_entity).isEnemy; setIdentity(QPixmap(), isEnemy ? tr("Enemy Defence Station") : tr("Player Defence Station")); } void StationContent::refreshRuntime() { EntityAdmin& admin = getContext().sim->getAdmin(); if (!admin.isValid(m_entity) || !admin.hasAll(m_entity)) { return; } const HealthComponent& health = admin.get(m_entity); const double hpFraction = (health.maxHp > 0.0f) ? static_cast(health.hp) / health.maxHp : 0.0; m_hpBar->setValue(hpFraction, tr("%1 / %2") .arg(static_cast(health.hp + 0.5f)) .arg(static_cast(health.maxHp + 0.5f))); // A station's weapons are child module entities pointing back at it, so its damage, // range and fire rate are read off those rather than off the station itself. float totalDamage = 0.0f; float maxRange = 0.0f; float maxFireRateHz = 0.0f; bool hasWeapon = false; const entt::entity station = m_entity; admin.forEach( [&](entt::entity /*child*/, const ModuleOwnerComponent& owner, const WeaponComponent& weapon) { if (owner.owner != station) { return; } hasWeapon = true; totalDamage += weapon.damage; if (weapon.range_tiles > maxRange) { maxRange = weapon.range_tiles; } if (weapon.fireRateHz > maxFireRateHz) { maxFireRateHz = weapon.fireRateHz; } }); m_damageRow->setVisible(hasWeapon); m_rangeRow->setVisible(hasWeapon); m_fireRateRow->setVisible(hasWeapon); if (hasWeapon) { m_damageRow->setValue( QString::number(static_cast(totalDamage), 'f', 1)); m_rangeRow->setValue(tr("%1 tiles") .arg(QString::number(static_cast(maxRange), 'f', 1))); m_fireRateRow->setValue(tr("%1 /s") .arg(QString::number(static_cast(maxFireRateHz), 'f', 1))); } }